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