#ifndef __URDE_COBBTREE_HPP__ #define __URDE_COBBTREE_HPP__ #include "RetroTypes.hpp" #include "CCollisionEdge.hpp" #include "CCollisionSurface.hpp" #include "zeus/CVector3f.hpp" #include "zeus/COBBox.hpp" namespace urde { class COBBTree { public: struct SIndexData { std::vector x0_materials; std::vector x10_vertMaterials; std::vector x20_edgeMaterials; std::vector x30_surfaceMaterials; std::vector x40_edges; std::vector x50_surfaceIndices; std::vector x60_vertices; SIndexData()=default; SIndexData(CInputStream&); }; class CLeafData { std::vector x0_surface; public: CLeafData()=default; CLeafData(const std::vector&); CLeafData(CInputStream&); const std::vector& GetSurfaceVector() const; size_t GetMemoryUsage() const; }; class CNode { zeus::COBBox x0_obb; bool x3c_isLeaf = false; std::unique_ptr x40_left; std::unique_ptr x44_right; std::unique_ptr x48_leaf; public: CNode() = default; CNode(const CNode&)=default; CNode(const zeus::CTransform&, const zeus::CVector3f&, const CNode*, const CNode*, const CLeafData*); CNode(CInputStream&); bool WasHit() const; void SetHit(bool) const; CNode* GetLeft() const; CNode* GetRight() const; CLeafData* GetLeafData() const; const zeus::COBBox& GetOBB() const; size_t GetMemoryUsage() const; }; private: u32 x0_magic = 0; u32 x4_version = 0; u32 x8_memsize = 0; /* CSimpleAllocator xc_ We're not using this but lets keep track*/ SIndexData x18_indexData; std::unique_ptr x88_root; public: COBBTree()=default; COBBTree(const COBBTree::SIndexData&, const CNode*); COBBTree(CInputStream&); CCollisionSurface GetSurface(u16) const; zeus::CAABox CalculateLocalAABox() const; zeus::CAABox CalculateAABox(const zeus::CTransform&) const; }; } #endif // __URDE_COBBTREE_HPP__