2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-09 09:47:43 +00:00

Implement CCollidableOBBTree

This commit is contained in:
Jack Andersen
2017-07-02 17:34:19 -10:00
parent 704e1b110a
commit 0cfefd22a1
12 changed files with 1067 additions and 60 deletions

View File

@@ -8,6 +8,8 @@
namespace urde
{
class CCollidableOBBTreeGroupContainer;
class COBBTree
{
public:
@@ -43,19 +45,21 @@ public:
std::unique_ptr<CNode> x40_left;
std::unique_ptr<CNode> x44_right;
std::unique_ptr<CLeafData> x48_leaf;
bool x4c_hit;
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;
bool WasHit() const { return x4c_hit; }
void SetHit(bool h) { x4c_hit = h; }
const CNode& GetLeft() const { return *x40_left; }
const CNode& GetRight() const { return *x44_right; }
const CLeafData& GetLeafData() const { return *x48_leaf; }
const zeus::COBBox& GetOBB() const { return x0_obb; }
size_t GetMemoryUsage() const;
bool IsLeaf() const { return x3c_isLeaf; }
};
private:
@@ -71,9 +75,19 @@ public:
COBBTree(const COBBTree::SIndexData&, const CNode*);
COBBTree(CInputStream&);
CCollisionSurface GetSurface(u16) const;
static std::unique_ptr<CCollidableOBBTreeGroupContainer>
BuildOrientedBoundingBoxTree(const zeus::CVector3f&, const zeus::CVector3f&);
CCollisionSurface GetSurface(u16 idx) const;
const u16* GetTriangleEdgeIndices(u16 idx) const { return &x18_indexData.x50_surfaceIndices[idx * 3]; }
void GetTriangleVertexIndices(u16 idx, u16 indicesOut[3]) const;
const CCollisionEdge& GetEdge(int idx) const { return x18_indexData.x40_edges[idx]; }
const zeus::CVector3f& GetVert(int idx) const { return x18_indexData.x60_vertices[idx]; }
u32 GetVertMaterial(u16 idx) const { return x18_indexData.x0_materials[x18_indexData.x10_vertMaterials[idx]]; }
u32 GetEdgeMaterial(u16 idx) const { return x18_indexData.x0_materials[x18_indexData.x20_edgeMaterials[idx]]; }
CCollisionSurface GetTransformedSurface(u16 idx, const zeus::CTransform& xf) const;
zeus::CAABox CalculateLocalAABox() const;
zeus::CAABox CalculateAABox(const zeus::CTransform&) const;
const CNode& GetRoot() const { return *x88_root; }
};
}