SceneGraph.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. // Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Scene/Common.h>
  7. #include <AnKi/Scene/SceneNode.h>
  8. #include <AnKi/Scene/DebugDrawer.h>
  9. #include <AnKi/Math.h>
  10. #include <AnKi/Util/HashMap.h>
  11. #include <AnKi/Core/App.h>
  12. #include <AnKi/Scene/Events/EventManager.h>
  13. #include <AnKi/Resource/Common.h>
  14. namespace anki {
  15. // Forward
  16. class ResourceManager;
  17. class CameraNode;
  18. class Input;
  19. class ConfigSet;
  20. class PerspectiveCameraNode;
  21. class Octree;
  22. class UiManager;
  23. /// @addtogroup scene
  24. /// @{
  25. /// SceneGraph statistics.
  26. class SceneGraphStats
  27. {
  28. public:
  29. Second m_updateTime ANKI_DEBUG_CODE(= 0.0);
  30. Second m_visibilityTestsTime ANKI_DEBUG_CODE(= 0.0);
  31. Second m_physicsUpdate ANKI_DEBUG_CODE(= 0.0);
  32. };
  33. /// The scene graph that all the scene entities
  34. class SceneGraph
  35. {
  36. friend class SceneNode;
  37. friend class UpdateSceneNodesTask;
  38. public:
  39. SceneGraph();
  40. ~SceneGraph();
  41. Error init(AllocAlignedCallback allocCb, void* allocCbData, ThreadHive* threadHive, ResourceManager* resources,
  42. Input* input, ScriptManager* scriptManager, UiManager* uiManager, ConfigSet* config,
  43. const Timestamp* globalTimestamp);
  44. Timestamp getGlobalTimestamp() const
  45. {
  46. return m_timestamp;
  47. }
  48. /// @note Return a copy
  49. SceneAllocator<U8> getAllocator() const
  50. {
  51. return m_alloc;
  52. }
  53. /// @note Return a copy
  54. SceneFrameAllocator<U8> getFrameAllocator() const
  55. {
  56. return m_frameAlloc;
  57. }
  58. SceneNode& getActiveCameraNode()
  59. {
  60. ANKI_ASSERT(m_mainCam != nullptr);
  61. return *m_mainCam;
  62. }
  63. const SceneNode& getActiveCameraNode() const
  64. {
  65. return *m_mainCam;
  66. }
  67. void setActiveCameraNode(SceneNode* cam)
  68. {
  69. m_mainCam = cam;
  70. m_activeCameraChangeTimestamp = getGlobalTimestamp();
  71. }
  72. Timestamp getActiveCameraNodeChangeTimestamp() const
  73. {
  74. return m_activeCameraChangeTimestamp;
  75. }
  76. U32 getSceneNodesCount() const
  77. {
  78. return m_nodesCount;
  79. }
  80. EventManager& getEventManager()
  81. {
  82. return m_events;
  83. }
  84. const EventManager& getEventManager() const
  85. {
  86. return m_events;
  87. }
  88. ThreadHive& getThreadHive()
  89. {
  90. return *m_threadHive;
  91. }
  92. Error update(Second prevUpdateTime, Second crntTime);
  93. void doVisibilityTests(RenderQueue& rqueue);
  94. SceneNode& findSceneNode(const CString& name);
  95. SceneNode* tryFindSceneNode(const CString& name);
  96. /// Iterate the scene nodes using a lambda
  97. template<typename Func>
  98. Error iterateSceneNodes(Func func)
  99. {
  100. for(SceneNode& psn : m_nodes)
  101. {
  102. Error err = func(psn);
  103. if(err)
  104. {
  105. return err;
  106. }
  107. }
  108. return Error::NONE;
  109. }
  110. /// Iterate a range of scene nodes using a lambda
  111. template<typename Func>
  112. Error iterateSceneNodes(PtrSize begin, PtrSize end, Func func);
  113. /// Create a new SceneNode
  114. template<typename Node, typename... Args>
  115. Error newSceneNode(const CString& name, Node*& node, Args&&... args);
  116. /// Delete a scene node. It actualy marks it for deletion
  117. void deleteSceneNode(SceneNode* node)
  118. {
  119. node->setMarkedForDeletion();
  120. }
  121. void increaseObjectsMarkedForDeletion()
  122. {
  123. m_objectsMarkedForDeletionCount.fetchAdd(1);
  124. }
  125. const SceneGraphStats& getStats() const
  126. {
  127. return m_stats;
  128. }
  129. const Vec3& getSceneMin() const
  130. {
  131. return m_sceneMin;
  132. }
  133. const Vec3& getSceneMax() const
  134. {
  135. return m_sceneMax;
  136. }
  137. ResourceManager& getResourceManager()
  138. {
  139. return *m_resources;
  140. }
  141. GrManager& getGrManager()
  142. {
  143. return *m_gr;
  144. }
  145. PhysicsWorld& getPhysicsWorld()
  146. {
  147. return *m_physics;
  148. }
  149. ScriptManager& getScriptManager()
  150. {
  151. ANKI_ASSERT(m_scriptManager);
  152. return *m_scriptManager;
  153. }
  154. const PhysicsWorld& getPhysicsWorld() const
  155. {
  156. return *m_physics;
  157. }
  158. const Input& getInput() const
  159. {
  160. ANKI_ASSERT(m_input);
  161. return *m_input;
  162. }
  163. UiManager& getUiManager()
  164. {
  165. return *m_uiManager;
  166. }
  167. U64 getNewUuid()
  168. {
  169. return m_nodesUuid.fetchAdd(1);
  170. }
  171. Octree& getOctree()
  172. {
  173. ANKI_ASSERT(m_octree);
  174. return *m_octree;
  175. }
  176. const DebugDrawer2& getDebugDrawer() const
  177. {
  178. return m_debugDrawer;
  179. }
  180. ANKI_INTERNAL const ConfigSet& getConfig()
  181. {
  182. ANKI_ASSERT(m_config);
  183. return *m_config;
  184. }
  185. private:
  186. class UpdateSceneNodesCtx;
  187. const Timestamp* m_globalTimestamp = nullptr;
  188. Timestamp m_timestamp = 0; ///< Cached timestamp
  189. // Sub-systems
  190. ThreadHive* m_threadHive = nullptr;
  191. ResourceManager* m_resources = nullptr;
  192. GrManager* m_gr = nullptr;
  193. PhysicsWorld* m_physics = nullptr;
  194. Input* m_input = nullptr;
  195. ScriptManager* m_scriptManager = nullptr;
  196. UiManager* m_uiManager = nullptr;
  197. ConfigSet* m_config = nullptr;
  198. SceneAllocator<U8> m_alloc;
  199. SceneFrameAllocator<U8> m_frameAlloc;
  200. IntrusiveList<SceneNode> m_nodes;
  201. U32 m_nodesCount = 0;
  202. HashMap<CString, SceneNode*> m_nodesDict;
  203. SceneNode* m_mainCam = nullptr;
  204. Timestamp m_activeCameraChangeTimestamp = 0;
  205. PerspectiveCameraNode* m_defaultMainCam = nullptr;
  206. EventManager m_events;
  207. Octree* m_octree = nullptr;
  208. Vec3 m_sceneMin = Vec3(-1000.0f, -200.0f, -1000.0f);
  209. Vec3 m_sceneMax = Vec3(1000.0f, 200.0f, 1000.0f);
  210. Atomic<U32> m_objectsMarkedForDeletionCount = {0};
  211. Atomic<U64> m_nodesUuid = {1};
  212. SceneGraphStats m_stats;
  213. DebugDrawer2 m_debugDrawer;
  214. /// Put a node in the appropriate containers
  215. Error registerNode(SceneNode* node);
  216. void unregisterNode(SceneNode* node);
  217. /// Delete the nodes that are marked for deletion
  218. void deleteNodesMarkedForDeletion();
  219. Error updateNodes(UpdateSceneNodesCtx& ctx) const;
  220. [[nodiscard]] static Error updateNode(Second prevTime, Second crntTime, SceneNode& node);
  221. /// Do visibility tests.
  222. static void doVisibilityTests(SceneNode& frustumable, SceneGraph& scene, RenderQueue& rqueue);
  223. };
  224. template<typename Node, typename... Args>
  225. inline Error SceneGraph::newSceneNode(const CString& name, Node*& node, Args&&... args)
  226. {
  227. Error err = Error::NONE;
  228. SceneAllocator<Node> al = m_alloc;
  229. node = al.template newInstance<Node>(this, name);
  230. if(node)
  231. {
  232. err = node->init(std::forward<Args>(args)...);
  233. }
  234. else
  235. {
  236. err = Error::OUT_OF_MEMORY;
  237. }
  238. if(!err)
  239. {
  240. err = registerNode(node);
  241. }
  242. if(err)
  243. {
  244. ANKI_SCENE_LOGE("Failed to create scene node: %s", (name.isEmpty()) ? "unnamed" : &name[0]);
  245. if(node)
  246. {
  247. al.deleteInstance(node);
  248. node = nullptr;
  249. }
  250. }
  251. return err;
  252. }
  253. template<typename Func>
  254. Error SceneGraph::iterateSceneNodes(PtrSize begin, PtrSize end, Func func)
  255. {
  256. ANKI_ASSERT(begin < m_nodesCount && end <= m_nodesCount);
  257. auto it = m_nodes.getBegin() + begin;
  258. PtrSize count = end - begin;
  259. Error err = Error::NONE;
  260. while(count-- != 0 && !err)
  261. {
  262. ANKI_ASSERT(it != m_nodes.getEnd());
  263. err = func(*it);
  264. ++it;
  265. }
  266. return Error::NONE;
  267. }
  268. /// @}
  269. } // end namespace anki