metaforce/Runtime/Collision/COBBTree.hpp

81 lines
2.1 KiB
C++

#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<u32> x0_materials;
std::vector<u8> x10_vertMaterials;
std::vector<u8> x20_edgeMaterials;
std::vector<u8> x30_surfaceMaterials;
std::vector<CCollisionEdge> x40_edges;
std::vector<u16> x50_surfaceIndices;
std::vector<zeus::CVector3f> x60_vertices;
SIndexData()=default;
SIndexData(CInputStream&);
};
class CLeafData
{
std::vector<u16> x0_surface;
public:
CLeafData()=default;
CLeafData(const std::vector<u16>&);
CLeafData(CInputStream&);
const std::vector<u16>& GetSurfaceVector() const;
size_t GetMemoryUsage() const;
};
class CNode
{
zeus::COBBox x0_obb;
bool x3c_isLeaf = false;
std::unique_ptr<CNode> x40_left;
std::unique_ptr<CNode> x44_right;
std::unique_ptr<CLeafData> 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<CNode> 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__