SceneGraph.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. // Copyright (C) 2009-2021, 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. /// SceneGraph limits.
  34. class SceneGraphConfig
  35. {
  36. public:
  37. F32 m_earlyZDistance = -1.0f; ///< Objects with distance lower than that will be used in early Z.
  38. F32 m_reflectionProbeEffectiveDistance = -1.0f; ///< How far reflection probes can look.
  39. F32 m_reflectionProbeShadowEffectiveDistance = -1.0f; ///< How far to render shadows for reflection probes.
  40. Bool m_rayTracedShadows = false;
  41. F32 m_rayTracingExtendedFrustumDistance = 100.0f; ///< The frustum distance from the eye to every direction.
  42. Array<F32, MAX_LOD_COUNT - 1> m_maxLodDistances = {};
  43. };
  44. /// The scene graph that all the scene entities
  45. class SceneGraph
  46. {
  47. friend class SceneNode;
  48. friend class UpdateSceneNodesTask;
  49. public:
  50. SceneGraph();
  51. ~SceneGraph();
  52. ANKI_USE_RESULT Error init(AllocAlignedCallback allocCb, void* allocCbData, ThreadHive* threadHive,
  53. ResourceManager* resources, Input* input, ScriptManager* scriptManager,
  54. UiManager* uiManager, const Timestamp* globalTimestamp, const ConfigSet& config);
  55. Timestamp getGlobalTimestamp() const
  56. {
  57. return m_timestamp;
  58. }
  59. /// @note Return a copy
  60. SceneAllocator<U8> getAllocator() const
  61. {
  62. return m_alloc;
  63. }
  64. /// @note Return a copy
  65. SceneFrameAllocator<U8> getFrameAllocator() const
  66. {
  67. return m_frameAlloc;
  68. }
  69. SceneNode& getActiveCameraNode()
  70. {
  71. ANKI_ASSERT(m_mainCam != nullptr);
  72. return *m_mainCam;
  73. }
  74. const SceneNode& getActiveCameraNode() const
  75. {
  76. return *m_mainCam;
  77. }
  78. void setActiveCameraNode(SceneNode* cam)
  79. {
  80. m_mainCam = cam;
  81. m_activeCameraChangeTimestamp = getGlobalTimestamp();
  82. }
  83. Timestamp getActiveCameraNodeChangeTimestamp() const
  84. {
  85. return m_activeCameraChangeTimestamp;
  86. }
  87. U32 getSceneNodesCount() const
  88. {
  89. return m_nodesCount;
  90. }
  91. EventManager& getEventManager()
  92. {
  93. return m_events;
  94. }
  95. const EventManager& getEventManager() const
  96. {
  97. return m_events;
  98. }
  99. ThreadHive& getThreadHive()
  100. {
  101. return *m_threadHive;
  102. }
  103. ANKI_USE_RESULT Error update(Second prevUpdateTime, Second crntTime);
  104. void doVisibilityTests(RenderQueue& rqueue);
  105. SceneNode& findSceneNode(const CString& name);
  106. SceneNode* tryFindSceneNode(const CString& name);
  107. /// Iterate the scene nodes using a lambda
  108. template<typename Func>
  109. ANKI_USE_RESULT Error iterateSceneNodes(Func func)
  110. {
  111. for(SceneNode& psn : m_nodes)
  112. {
  113. Error err = func(psn);
  114. if(err)
  115. {
  116. return err;
  117. }
  118. }
  119. return Error::NONE;
  120. }
  121. /// Iterate a range of scene nodes using a lambda
  122. template<typename Func>
  123. ANKI_USE_RESULT Error iterateSceneNodes(PtrSize begin, PtrSize end, Func func);
  124. /// Create a new SceneNode
  125. template<typename Node, typename... Args>
  126. ANKI_USE_RESULT Error newSceneNode(const CString& name, Node*& node, Args&&... args);
  127. /// Delete a scene node. It actualy marks it for deletion
  128. void deleteSceneNode(SceneNode* node)
  129. {
  130. node->setMarkedForDeletion();
  131. }
  132. void increaseObjectsMarkedForDeletion()
  133. {
  134. m_objectsMarkedForDeletionCount.fetchAdd(1);
  135. }
  136. const SceneGraphStats& getStats() const
  137. {
  138. return m_stats;
  139. }
  140. const SceneGraphConfig& getConfig() const
  141. {
  142. return m_config;
  143. }
  144. const Vec3& getSceneMin() const
  145. {
  146. return m_sceneMin;
  147. }
  148. const Vec3& getSceneMax() const
  149. {
  150. return m_sceneMax;
  151. }
  152. ResourceManager& getResourceManager()
  153. {
  154. return *m_resources;
  155. }
  156. GrManager& getGrManager()
  157. {
  158. return *m_gr;
  159. }
  160. PhysicsWorld& getPhysicsWorld()
  161. {
  162. return *m_physics;
  163. }
  164. ScriptManager& getScriptManager()
  165. {
  166. ANKI_ASSERT(m_scriptManager);
  167. return *m_scriptManager;
  168. }
  169. const PhysicsWorld& getPhysicsWorld() const
  170. {
  171. return *m_physics;
  172. }
  173. const Input& getInput() const
  174. {
  175. ANKI_ASSERT(m_input);
  176. return *m_input;
  177. }
  178. UiManager& getUiManager()
  179. {
  180. return *m_uiManager;
  181. }
  182. U64 getNewUuid()
  183. {
  184. return m_nodesUuid.fetchAdd(1);
  185. }
  186. Octree& getOctree()
  187. {
  188. ANKI_ASSERT(m_octree);
  189. return *m_octree;
  190. }
  191. const DebugDrawer2& getDebugDrawer() const
  192. {
  193. return m_debugDrawer;
  194. }
  195. private:
  196. class UpdateSceneNodesCtx;
  197. const Timestamp* m_globalTimestamp = nullptr;
  198. Timestamp m_timestamp = 0; ///< Cached timestamp
  199. // Sub-systems
  200. ThreadHive* m_threadHive = nullptr;
  201. ResourceManager* m_resources = nullptr;
  202. GrManager* m_gr = nullptr;
  203. PhysicsWorld* m_physics = nullptr;
  204. Input* m_input = nullptr;
  205. ScriptManager* m_scriptManager = nullptr;
  206. UiManager* m_uiManager = nullptr;
  207. SceneAllocator<U8> m_alloc;
  208. SceneFrameAllocator<U8> m_frameAlloc;
  209. IntrusiveList<SceneNode> m_nodes;
  210. U32 m_nodesCount = 0;
  211. HashMap<CString, SceneNode*> m_nodesDict;
  212. SceneNode* m_mainCam = nullptr;
  213. Timestamp m_activeCameraChangeTimestamp = 0;
  214. PerspectiveCameraNode* m_defaultMainCam = nullptr;
  215. EventManager m_events;
  216. Octree* m_octree = nullptr;
  217. Vec3 m_sceneMin = Vec3(-1000.0f, -200.0f, -1000.0f);
  218. Vec3 m_sceneMax = Vec3(1000.0f, 200.0f, 1000.0f);
  219. Atomic<U32> m_objectsMarkedForDeletionCount = {0};
  220. Atomic<U64> m_nodesUuid = {1};
  221. SceneGraphConfig m_config;
  222. SceneGraphStats m_stats;
  223. DebugDrawer2 m_debugDrawer;
  224. /// Put a node in the appropriate containers
  225. ANKI_USE_RESULT Error registerNode(SceneNode* node);
  226. void unregisterNode(SceneNode* node);
  227. /// Delete the nodes that are marked for deletion
  228. void deleteNodesMarkedForDeletion();
  229. ANKI_USE_RESULT Error updateNodes(UpdateSceneNodesCtx& ctx) const;
  230. ANKI_USE_RESULT static Error updateNode(Second prevTime, Second crntTime, SceneNode& node);
  231. /// Do visibility tests.
  232. static void doVisibilityTests(SceneNode& frustumable, SceneGraph& scene, RenderQueue& rqueue);
  233. };
  234. template<typename Node, typename... Args>
  235. inline Error SceneGraph::newSceneNode(const CString& name, Node*& node, Args&&... args)
  236. {
  237. Error err = Error::NONE;
  238. SceneAllocator<Node> al = m_alloc;
  239. node = al.template newInstance<Node>(this, name);
  240. if(node)
  241. {
  242. err = node->init(std::forward<Args>(args)...);
  243. }
  244. else
  245. {
  246. err = Error::OUT_OF_MEMORY;
  247. }
  248. if(!err)
  249. {
  250. err = registerNode(node);
  251. }
  252. if(err)
  253. {
  254. ANKI_SCENE_LOGE("Failed to create scene node: %s", (name.isEmpty()) ? "unnamed" : &name[0]);
  255. if(node)
  256. {
  257. al.deleteInstance(node);
  258. node = nullptr;
  259. }
  260. }
  261. return err;
  262. }
  263. template<typename Func>
  264. Error SceneGraph::iterateSceneNodes(PtrSize begin, PtrSize end, Func func)
  265. {
  266. ANKI_ASSERT(begin < m_nodesCount && end <= m_nodesCount);
  267. auto it = m_nodes.getBegin() + begin;
  268. PtrSize count = end - begin;
  269. Error err = Error::NONE;
  270. while(count-- != 0 && !err)
  271. {
  272. ANKI_ASSERT(it != m_nodes.getEnd());
  273. err = func(*it);
  274. ++it;
  275. }
  276. return Error::NONE;
  277. }
  278. /// @}
  279. } // end namespace anki