#ifndef OCTREE_H #define OCTREE_H #include #include #include "Sphere.h" #include "BoxAxisAligned.h" #include "Utilities.h" #include "../PhysicsAPI.h" namespace Oyster { namespace Physics { class Octree { public: static const unsigned int invalid_ref; typedef void(*VisitorAction)(Octree&, unsigned int, unsigned int); typedef void(*VisitorActionCollideable)(Octree&, unsigned int); struct Data { Data* prev; Data* next; Collision3D::Sphere container; ::Utility::DynamicMemory::UniquePointer< ICustomBody > customBodyRef; unsigned int queueRef; }; struct OctreeNode { OctreeNode* children[8]; Data* dataPtr; Collision3D::BoxAxisAligned container; }; Octree(unsigned int bufferSize = 0, unsigned char numLayers = 0, Math::Float3 worldSize = Math::Float3::null); virtual ~Octree(); Octree& operator=(const Octree& orig); void AddObject(::Utility::DynamicMemory::UniquePointer< ICustomBody > customBodyRef); void MoveToUpdateQueue(::Utility::DynamicMemory::UniquePointer< ICustomBody > customBodyRef); void DestroyObject(::Utility::DynamicMemory::UniquePointer< ICustomBody > customBodyRef); std::vector& Sample(ICustomBody* customBodyRef, std::vector& updateList); std::vector& Sample(const Oyster::Collision3D::ICollideable& collideable, std::vector& updateList); void Visit(ICustomBody* customBodyRef, VisitorAction hitAction ); void Visit(const Oyster::Collision3D::ICollideable& collideable, VisitorActionCollideable hitAction ); ICustomBody* GetCustomBody(const unsigned int tempRef); ::Utility::DynamicMemory::UniquePointer Extract( const ICustomBody* objRef ); ::Utility::DynamicMemory::UniquePointer Extract( unsigned int tempRef ); // Dan vill ha unsigned int GetTemporaryReferenceOf( const ICustomBody* objRef ) const; // Dan vill ha void SetAsAltered( unsigned int tempRef ); // Dan vill ha void EvaluatePosition( unsigned int tempRef ); // Dan vill ha private: std::vector < Data > leafData; std::vector < Data* > updateQueue; std::map< const ICustomBody*, unsigned int > mapReferences; OctreeNode worldNode; }; } } #endif