Scene.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "anki/scene/Scene.h"
  2. #include "anki/scene/Camera.h"
  3. #include "anki/util/Exception.h"
  4. #include "anki/scene/VisibilityTester.h"
  5. #include "anki/core/ThreadPool.h"
  6. namespace anki {
  7. //==============================================================================
  8. // Misc =
  9. //==============================================================================
  10. //==============================================================================
  11. struct UpdateMovablesJob: ThreadJob
  12. {
  13. Scene::Types<SceneNode>::Iterator movablesBegin;
  14. U32 movablesCount;
  15. void operator()(U threadId, U threadsCount)
  16. {
  17. U64 start, end;
  18. choseStartEnd(threadId, threadsCount, movablesCount, start, end);
  19. for(U64 i = start; i < end; i++)
  20. {
  21. SceneNode* sn = *(movablesBegin + i);
  22. Movable* m = sn->getMovable();
  23. if(m)
  24. {
  25. m->update();
  26. }
  27. }
  28. }
  29. };
  30. //==============================================================================
  31. // Scene =
  32. //==============================================================================
  33. //==============================================================================
  34. Scene::Scene()
  35. : alloc(ALLOCATOR_SIZE), frameAlloc(ALLOCATOR_SIZE), nodes(alloc)
  36. {
  37. ambientCol = Vec3(0.1, 0.05, 0.05) * 2;
  38. }
  39. //==============================================================================
  40. Scene::~Scene()
  41. {}
  42. //==============================================================================
  43. void Scene::registerNode(SceneNode* node)
  44. {
  45. addC(nodes, node);
  46. addDict(nameToNode, node);
  47. }
  48. //==============================================================================
  49. void Scene::unregisterNode(SceneNode* node)
  50. {
  51. removeC(nodes, node);
  52. removeDict(nameToNode, node);
  53. }
  54. //==============================================================================
  55. void Scene::update(F32 prevUpdateTime, F32 crntTime, Renderer& r)
  56. {
  57. physics.update(prevUpdateTime, crntTime);
  58. #if 0
  59. // First do the movable updates
  60. for(SceneNode* n : nodes)
  61. {
  62. Movable* m = n->getMovable();
  63. if(m)
  64. {
  65. m->update();
  66. }
  67. }
  68. #else
  69. ThreadPool& threadPool = ThreadPoolSingleton::get();
  70. UpdateMovablesJob jobs[ThreadPool::MAX_THREADS];
  71. for(U i = 0; i < threadPool.getThreadsCount(); i++)
  72. {
  73. jobs[i].movablesBegin = nodes.begin();
  74. jobs[i].movablesCount = nodes.size();
  75. threadPool.assignNewJob(i, &jobs[i]);
  76. }
  77. threadPool.waitForAllJobsToFinish();
  78. #endif
  79. // Then the rest
  80. for(SceneNode* n : nodes)
  81. {
  82. n->frameUpdate(prevUpdateTime, crntTime, Timestamp::getTimestamp());
  83. Spatial* sp = n->getSpatial();
  84. if(sp && sp->getSpatialTimestamp() == Timestamp::getTimestamp())
  85. {
  86. for(Sector* sector : sectors)
  87. {
  88. if(sector->placeSceneNode(n))
  89. {
  90. //ANKI_LOGI("Placing: " << n->getName());
  91. continue;
  92. }
  93. }
  94. }
  95. }
  96. doVisibilityTests(*mainCam, r);
  97. #if 0
  98. for(SceneNode* n : nodes)
  99. {
  100. if(n->getSpatial()
  101. && n->getSpatial()->getSpatialLastUpdateFrame() == frame)
  102. {
  103. std::cout << "Spatial updated on: " << n->getName()
  104. << std::endl;
  105. }
  106. if(n->getMovable()
  107. && n->getMovable()->getMovableLastUpdateFrame() == frame)
  108. {
  109. std::cout << "Movable updated on: " << n->getName()
  110. << std::endl;
  111. }
  112. if(n->getFrustumable()
  113. && n->getFrustumable()->getFrustumableLastUpdateFrame() == frame)
  114. {
  115. std::cout << "Frustumable updated on: " << n->getName()
  116. << std::endl;
  117. }
  118. }
  119. #endif
  120. }
  121. //==============================================================================
  122. void Scene::doVisibilityTests(Camera& cam, Renderer& r)
  123. {
  124. Frustumable* f = cam.getFrustumable();
  125. ANKI_ASSERT(f != nullptr);
  126. vtester.test(*f, *this, r);
  127. }
  128. //==============================================================================
  129. SceneNode& Scene::findSceneNode(const char* name)
  130. {
  131. ANKI_ASSERT(nameToNode.find(name) != nameToNode.end());
  132. return *(nameToNode.find(name)->second);
  133. }
  134. //==============================================================================
  135. SceneNode* Scene::tryFindSceneNode(const char* name)
  136. {
  137. Types<SceneNode>::NameToItemMap::iterator it = nameToNode.find(name);
  138. return (it == nameToNode.end()) ? nullptr : it->second;
  139. }
  140. } // end namespace anki