BsBansheeSceneManager.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. onCameraRemoved(camera);
  51. }
  52. else if(component->getTypeId() == TID_Renderable)
  53. {
  54. HRenderable renderable = static_object_cast<Renderable>(component);
  55. // TODO - I should probably use some for of a hash set because searching through possibly thousands of renderables will be slow
  56. auto findIter = std::find(mRenderables.begin(), mRenderables.end(), renderable);
  57. if(findIter != mRenderables.end())
  58. mRenderables.erase(findIter);
  59. onRenderableRemoved(renderable);
  60. }
  61. }
  62. }