#ifndef _OCTREE_H_ #define _OCTREE_H_ #include #include #include #include "axis_aligned_bounding_region.h" #include "bounding_region.h" #include "collidable_entity.h" #include "collision.h" class Octree { public: Octree( const glm::vec3& min_bound, const glm::vec3& max_bound, unsigned int max_depth = DFLT_MAX_DEPTH, unsigned int max_entities = DFLT_MAX_ENTITIES ); Octree( const std::set& entities, const glm::vec3& min_bound, const glm::vec3& max_bound, unsigned int max_depth = DFLT_MAX_DEPTH, unsigned int max_entities = DFLT_MAX_ENTITIES ); virtual ~Octree(); virtual void Add(CollidableEntity* entity); virtual void Add(const std::set& entities); virtual void Remove(CollidableEntity* entity); virtual void Remove(const std::set& entities); virtual std::set CollideEntity(CollidableEntity* subject); private: static const unsigned int DFLT_MAX_DEPTH; static const unsigned int DFLT_MAX_ENTITIES; void Subdivide(); int EntityCount(); bool IsLeaf(); bool IsDeep(); bool IsFull(); bool ContainsEntity(CollidableEntity* entity); void DeleteNodes(); AxisAlignedBoundingRegion _aabr; const unsigned int _max_depth; const unsigned int _max_entities; std::vector _nodes; std::set _entities; }; #endif