BsBansheeSceneManager.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "BsBansheeSceneManager.h"
  2. #include "BsComponent.h"
  3. #include "BsException.h"
  4. #include "BsSceneObject.h"
  5. #include "BsRenderable.h"
  6. #include "BsCamera.h"
  7. namespace BansheeEngine
  8. {
  9. void BansheeSceneManager::updateRenderableTransforms()
  10. {
  11. // TODO - Consider a way to make the update faster. Either do it concurrently or
  12. // consider organizing renderable matrices in an array for quicker updates
  13. // - I could keep everything in a sequential array but deal with dynamic elements
  14. // but putting them in a slow, normal array. Once the number of dynamic elements
  15. // goes over some number the hierarchy is re-optimized.
  16. for(auto& iter : mRenderables)
  17. {
  18. iter->SO()->updateTransformsIfDirty();
  19. }
  20. }
  21. void BansheeSceneManager::notifyComponentAdded(const HComponent& component)
  22. {
  23. if(component->getTypeId() == TID_Camera)
  24. {
  25. HCamera camera = static_object_cast<Camera>(component);
  26. auto findIter = std::find(mCachedCameras.begin(), mCachedCameras.end(), camera);
  27. if(findIter != mCachedCameras.end())
  28. {
  29. BS_EXCEPT(InternalErrorException, "Trying to add an already existing camera!");
  30. }
  31. mCachedCameras.push_back(camera);
  32. }
  33. else if(component->getTypeId() == TID_Renderable)
  34. {
  35. HRenderable renderable = static_object_cast<Renderable>(component);
  36. mRenderables.push_back(renderable);
  37. }
  38. }
  39. void BansheeSceneManager::notifyComponentRemoved(const HComponent& component)
  40. {
  41. if(component->getTypeId() == TID_Camera)
  42. {
  43. HCamera camera = static_object_cast<Camera>(component);
  44. auto findIter = std::find(mCachedCameras.begin(), mCachedCameras.end(), camera);
  45. if(findIter == mCachedCameras.end())
  46. {
  47. BS_EXCEPT(InternalErrorException, "Cannot find specified camera!");
  48. }
  49. mCachedCameras.erase(findIter);
  50. }
  51. else if(component->getTypeId() == TID_Renderable)
  52. {
  53. HRenderable renderable = static_object_cast<Renderable>(component);
  54. // TODO - I should probably use some for of a hash set because searching through possibly thousands of renderables will be slow
  55. auto findIter = std::find(mRenderables.begin(), mRenderables.end(), renderable);
  56. if(findIter != mRenderables.end())
  57. mRenderables.erase(findIter);
  58. onRenderableRemoved(renderable);
  59. }
  60. }
  61. }