QuadtreeNode.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #pragma once
  2. #include "QuadtreeOccupant.h"
  3. #include <memory>
  4. #include <array>
  5. #include <unordered_set>
  6. namespace ltbl {
  7. class QuadtreeNode : public sf::NonCopyable {
  8. friend class QuadtreeOccupant;
  9. friend class Quadtree;
  10. friend class DynamicQuadtree;
  11. private:
  12. QuadtreeNode* _pParent;
  13. class Quadtree* _pQuadtree;
  14. bool _hasChildren = false;
  15. std::array<std::unique_ptr<QuadtreeNode>, 4> _children;
  16. std::unordered_set<QuadtreeOccupant*> _occupants;
  17. sf::FloatRect _region;
  18. int _level;
  19. int _numOccupantsBelow = 0;
  20. void getPossibleOccupantPosition(QuadtreeOccupant* oc, sf::Vector2i &point);
  21. void addToThisLevel(QuadtreeOccupant* oc);
  22. // Returns true if occupant was added to children
  23. bool addToChildren(QuadtreeOccupant* oc);
  24. void destroyChildren() {
  25. for (int i = 0; i < 4; i++)
  26. _children[i].reset();
  27. _hasChildren = false;
  28. }
  29. void getOccupants(std::unordered_set<QuadtreeOccupant*> &occupants);
  30. void partition();
  31. void merge();
  32. void update(QuadtreeOccupant* oc);
  33. void remove(QuadtreeOccupant* oc);
  34. void removeForDeletion(std::unordered_set<QuadtreeOccupant*> &occupants);
  35. public:
  36. QuadtreeNode()
  37. : _hasChildren(false), _numOccupantsBelow(0)
  38. {}
  39. QuadtreeNode(const sf::FloatRect &region, int level, QuadtreeNode* pParent, class Quadtree* pQuadtree);
  40. // For use after using default constructor
  41. void create(const sf::FloatRect &region, int level, QuadtreeNode* pParent, class Quadtree* pQuadtree);
  42. class Quadtree* getTree() const {
  43. return _pQuadtree;
  44. }
  45. void add(QuadtreeOccupant* oc);
  46. const sf::FloatRect &getRegion() const {
  47. return _region;
  48. }
  49. void getAllOccupantsBelow(std::vector<QuadtreeOccupant*> &occupants);
  50. void getAllOccupantsBelow(std::unordered_set<QuadtreeOccupant*> &occupants);
  51. int getNumOccupantsBelow() const {
  52. return _numOccupantsBelow;
  53. }
  54. };
  55. }