BsOctreeSceneManager.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "BsOctreeSceneManager.h"
  2. #include "CmComponent.h"
  3. #include "CmException.h"
  4. #include "CmSceneObject.h"
  5. #include "BsRenderable.h"
  6. #include "BsCamera.h"
  7. using namespace CamelotFramework;
  8. namespace BansheeEngine
  9. {
  10. Vector<HRenderable>::type OctreeSceneManager::getVisibleRenderables(const HCamera& camera) const
  11. {
  12. // TODO - Cull invisible objects
  13. Vector<HRenderable>::type renderables;
  14. Stack<HSceneObject>::type todo;
  15. todo.push(mRootNode);
  16. while(!todo.empty())
  17. {
  18. HSceneObject currentGO = todo.top();
  19. todo.pop();
  20. HRenderable curRenderable = currentGO->getComponent<Renderable>();
  21. if(curRenderable != nullptr)
  22. {
  23. if((curRenderable->getLayer() & camera->getLayers()) != 0)
  24. renderables.push_back(curRenderable);
  25. }
  26. for(UINT32 i = 0; i < currentGO->getNumChildren(); i++)
  27. todo.push(currentGO->getChild(i));
  28. }
  29. return renderables;
  30. }
  31. void OctreeSceneManager::updateRenderableBounds()
  32. {
  33. for(auto& iter : mRenderables)
  34. {
  35. iter->updateWorldBounds();
  36. }
  37. }
  38. void OctreeSceneManager::notifyComponentAdded(const HComponent& component)
  39. {
  40. if(component->getTypeId() == TID_Camera)
  41. {
  42. HCamera camera = static_object_cast<Camera>(component);
  43. auto findIter = std::find(mCachedCameras.begin(), mCachedCameras.end(), camera);
  44. if(findIter != mCachedCameras.end())
  45. {
  46. CM_EXCEPT(InternalErrorException, "Trying to add an already existing camera!");
  47. }
  48. mCachedCameras.push_back(camera);
  49. }
  50. else if(component->getTypeId() == TID_Renderable)
  51. {
  52. HRenderable renderable = static_object_cast<Renderable>(component);
  53. mRenderables.push_back(renderable);
  54. }
  55. }
  56. void OctreeSceneManager::notifyComponentRemoved(const HComponent& component)
  57. {
  58. if(component->getTypeId() == TID_Camera)
  59. {
  60. HCamera camera = static_object_cast<Camera>(component);
  61. auto findIter = std::find(mCachedCameras.begin(), mCachedCameras.end(), camera);
  62. if(findIter == mCachedCameras.end())
  63. {
  64. CM_EXCEPT(InternalErrorException, "Cannot find specified camera!");
  65. }
  66. mCachedCameras.erase(findIter);
  67. }
  68. else if(component->getTypeId() == TID_Renderable)
  69. {
  70. HRenderable renderable = static_object_cast<Renderable>(component);
  71. // TODO - I should probably use some for of a hash set because searching through possibly thousands of renderables will be slow
  72. auto findIter = std::find(mRenderables.begin(), mRenderables.end(), renderable);
  73. if(findIter != mRenderables.end())
  74. mRenderables.erase(findIter);
  75. }
  76. }
  77. }