Grid.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "anki/scene/Grid.h"
  2. #include "anki/scene/Spatial.h"
  3. #include "anki/scene/SceneNode.h"
  4. namespace anki {
  5. //==============================================================================
  6. Grid::Grid(const SceneAllocator<U8> &alloc, F32 cubeSize_, const Aabb& aabb_)
  7. : cubeSize(cubeSize_), sceneNodes(alloc)
  8. {
  9. // Set the aabb by snaping it
  10. for(U i = 0; i < 3; i++)
  11. {
  12. F32 d = aabb_.getMax()[i] - aabb_.getMin()[i];
  13. ANKI_ASSERT(d > cubeSize);
  14. F32 snap = ceil(d / cubeSize);
  15. cubesCount[i] = snap;
  16. snap *= cubeSize;
  17. snap -= d;
  18. snap *= 0.5;
  19. aabb.getMin()[i] = aabb_.getMin()[i] - snap;
  20. aabb.getMax()[i] = aabb_.getMax()[i] + snap;
  21. }
  22. }
  23. //==============================================================================
  24. void Grid::removeSceneNode(SceneNode* sn)
  25. {
  26. SceneVector<SceneNode*>::iterator it;
  27. it = std::find(sceneNodes.begin(), sceneNodes.end(), sn);
  28. ANKI_ASSERT(it != sceneNodes.end());
  29. sceneNodes.erase(it);
  30. (*it)->getSpatial()->grid = nullptr;
  31. }
  32. //==============================================================================
  33. Bool Grid::placeSceneNode(SceneNode* sn)
  34. {
  35. Spatial* sp = sn->getSpatial();
  36. ANKI_ASSERT(sp);
  37. if(sp->grid == this)
  38. {
  39. // do nothing
  40. }
  41. else
  42. {
  43. sp->grid->removeSceneNode(sn);
  44. sp->grid = this;
  45. sceneNodes.push_back(sn);
  46. }
  47. return true;
  48. }
  49. //==============================================================================
  50. void Grid::getVisible(const Frustumable& cam,
  51. SceneVector<SceneNode*>& nodes)
  52. {
  53. nodes.insert(nodes.end(), sceneNodes.begin(), sceneNodes.end());
  54. }
  55. } // end namespace anki