Polyphase Game Engine
Loading...
Searching...
No Matches
World.h
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <vector>
5#include <unordered_map>
6#include <unordered_set>
7
8#include "Assets/StaticMesh.h"
9#include "Assets/Material.h"
10#include "Assets/Texture.h"
11#include "Nodes/Node.h"
13#include "Clock.h"
14#include "Line.h"
15#include "EngineTypes.h"
16#include "Nodes/3D/Camera3d.h"
18
19class Node;
20class Audio3D;
21class Particle3D;
22
24{
25public:
26
27 World();
28 ~World();
29
30 void Destroy();
31
32 void Update(float deltaTime);
33
34 Camera3D* GetMainCamera();
35
36 Camera3D* GetActiveCamera();
37 Node3D* GetAudioReceiver();
38
39 void SetActiveCamera(Camera3D* activeCamera);
40 void SetCameraOverride(Camera3D* camera) { mCameraOverride = camera; }
41 void SetAudioReceiver(Node3D* newReceiver);
42
43 Node* SpawnNode(TypeId actorType, glm::vec3 position = {});
44 Node* SpawnNode(const char* typeName, glm::vec3 position = {});
45 Node* SpawnScene(const char* sceneName, glm::vec3 position = {});
46 Node* SpawnScene(Scene* scene, glm::vec3 position = {});
47 void DespawnScene(Node* sceneRoot);
48 Particle3D* SpawnParticle(ParticleSystem* sys, glm::vec3 position);
49 Particle3D* SpawnParticle(ParticleSystem* sys, glm::vec3 position, glm::vec3 velocity);
50
51 template<class NodeClass>
52 NodeClass* SpawnNode(glm::vec3 position = {})
53 {
54 return (NodeClass*)SpawnNode(NodeClass::GetStaticType(), position);
55 }
56
57 Node* GetRootNode();
58 void SetRootNode(Node* node);
59 NodePtr GetRootNodePtr();
60 void DestroyRootNode();
61 Node* FindNode(const std::string& name);
62 Node* GetNetNode(NetId netId);
63 std::vector<Node*> FindNodesWithTag(const char* tag);
64 std::vector<Node*> FindNodesWithName(const char* name);
65 std::vector<Node*> GatherNodes();
66 void GatherNodes(std::vector<Node*>& outNodes);
67
68
69
70 Node* FindNodeByUuid(uint64_t uuid);
71 void RegisterNodeUuid(Node* node);
72 void UnregisterNodeUuid(Node* node);
73
74 bool FindNavPath(glm::vec3 start, glm::vec3 end, std::vector<glm::vec3>& outPath);
75 bool FindRandomNavPoint(glm::vec3& outPoint);
76 bool FindClosestNavPoint(glm::vec3 inPoint, glm::vec3& outPoint);
77 void BuildNavigationData();
78 void EnableAutoNavRebuild(bool enable);
79 bool IsAutoNavRebuildEnabled() const;
80 void InvalidateNavMesh();
81 void Clear();
82
83 int32_t GetIndex() const;
84
85 void AddLine(const Line& line);
86 void RemoveLine(const Line& line);
87 void RemoveAllLines();
88 const std::vector<Line>& GetLines() const;
89
90 const std::vector<class Light3D*>& GetLights();
91 std::vector<FadingLight>& GetFadingLights();
92
93 void SetAmbientLightColor(glm::vec4 color);
94 glm::vec4 GetAmbientLightColor() const;
95
96 void SetShadowColor(glm::vec4 shadowColor);
97 glm::vec4 GetShadowColor() const;
98
99 void SetFogSettings(const FogSettings& settings);
100 const FogSettings& GetFogSettings() const;
101
102 void SetGravity(glm::vec3 gravity);
103 glm::vec3 GetGravity() const;
104
105 btDynamicsWorld* GetDynamicsWorld();
106 btDbvtBroadphase* GetBroadphase();
107 void PurgeOverlaps(Primitive3D* prim);
108
109 void RayTest(
110 glm::vec3 start,
111 glm::vec3 end,
112 uint8_t collisionMask,
113 RayTestResult& outResult,
114 uint32_t numIgnoredObjects = 0,
115 btCollisionObject** ignoreObjects = nullptr,
116 bool ignorePureOverlap = true);
117
118 void RayTestMulti(
119 glm::vec3 start,
120 glm::vec3 end,
121 uint8_t collisionMask,
122 bool ignorePureOverlap,
123 RayTestMultiResult& outResult);
124
125 void SweepTest(
126 Primitive3D* primComp,
127 glm::vec3 start,
128 glm::vec3 end,
129 uint8_t collisionMask,
130 SweepTestResult& outResult);
131
132 void SweepTest(
133 btConvexShape* convexShape,
134 glm::vec3 start,
135 glm::vec3 end,
136 glm::quat rotation,
137 uint8_t collisionMask,
138 SweepTestResult& outResult,
139 uint32_t numIgnoreObjects = 0,
140 btCollisionObject** ignoreObjects = nullptr);
141
142 void RegisterNode(Node* node, bool subRoot);
143 void UnregisterNode(Node* node, bool subRoot);
144 const std::vector<Audio3D*>& GetAudios() const;
145
146 void LoadScene(const char* name, bool instant);
147 void QueueRootScene(const char* name);
148 void QueueRootNode(Node* node);
149
150 void EnableInternalEdgeSmoothing(bool enable);
151 bool IsInternalEdgeSmoothingEnabled() const;
152
153 void DirtyAllWidgets();
154
155 void UpdateRenderSettings();
156 void AddNewlyRegisteredNode(Node* node);
157
158 Camera3D* SpawnDefaultCamera();
159 Node* SpawnDefaultRoot();
160 void PlaceNewlySpawnedNode(NodePtr node, glm::vec3 position);
161
162 void OverrideDynamicsWorld(btDiscreteDynamicsWorld* world);
163 void RestoreDynamicsWorld();
164
165 template<typename T>
167 {
168 T* ret = nullptr;
169
170 auto typedNodeFind = [&](Node* node) -> bool
171 {
172 if (node->Is(T::ClassRuntimeId()))
173 {
174 ret = static_cast<T*>(node);
175 return false;
176 }
177
178 return true;
179 };
180
181 if (mRootNode != nullptr)
182 {
183 mRootNode->ForEach(typedNodeFind);
184 }
185
186 return ret;
187 }
188
189 template<typename T>
190 void FindNodes(std::vector<T*>& outNodes)
191 {
192 auto typedNodeGather = [&](Node* node) -> bool
193 {
194 if (node->Is(T::ClassRuntimeId()))
195 {
196 outNodes.push_back(static_cast<T*>(node));
197 }
198
199 return true;
200 };
201
202 if (mRootNode != nullptr)
203 {
204 mRootNode->Traverse(typedNodeGather);
205 }
206 }
207
208private:
209
210 void UpdateLines(float deltaTime);
211 void ExtractPersistingNodes();
212
213private:
214
215 static std::unordered_set<NodePtrWeak> sNewlyRegisteredNodes;
216
217 NodePtr mRootNode;
218 std::vector<NodePtr> mPersistingNodes;
219 std::vector<Line> mLines;
220 std::vector<class Light3D*> mLights;
221 std::vector<class Audio3D*> mAudios;
222 std::vector<FadingLight> mFadingLights;
223 NodePtr mQueuedRootNode;
224 glm::vec4 mAmbientLightColor;
225 glm::vec4 mShadowColor;
226 FogSettings mFogSettings;
227 Camera3D* mActiveCamera;
228 Camera3D* mCameraOverride = nullptr;
229 Node3D* mAudioReceiver;
230 bool mPendingClear = false;
231 bool mAutoNavRebuild = false;
232
233 // Physics
234 btDefaultCollisionConfiguration* mCollisionConfig = nullptr;
235 btCollisionDispatcher* mCollisionDispatcher = nullptr;
236 btDbvtBroadphase* mBroadphase = nullptr;
237 btSequentialImpulseConstraintSolver* mSolver = nullptr;
238 btDiscreteDynamicsWorld* mDynamicsWorld = nullptr;
239 btDiscreteDynamicsWorld* mDefaultDynamicsWorld = nullptr;;
240 std::vector<PrimitivePair> mCurrentOverlaps;
241 std::vector<PrimitivePair> mPreviousOverlaps;
242
243 // Node UUID lookup
244 std::unordered_map<uint64_t, Node*> mUuidMap;
245};
246
uint32_t NetId
Definition EngineTypes.h:65
uint32_t TypeId
Definition EngineTypes.h:64
bool Update()
Definition Engine.cpp:710
#define POLYPHASE_API
Definition PolyphaseAPI.h:31
Definition Audio3d.h:8
Definition Camera3d.h:12
Definition Node3d.h:14
Definition Node.h:67
Definition Particle3d.h:34
Definition ParticleSystem.h:66
Definition Primitive3d.h:46
Definition Scene.h:36
Definition World.h:24
NodeClass * SpawnNode(glm::vec3 position={})
Definition World.h:52
void SetCameraOverride(Camera3D *camera)
Definition World.h:40
T * FindNode()
Definition World.h:166
void FindNodes(std::vector< T * > &outNodes)
Definition World.h:190
Definition EngineTypes.h:446
Definition Line.h:6
Definition EngineTypes.h:396
Definition EngineTypes.h:386
Definition EngineTypes.h:407