Skip to content

Commit 91370fc

Browse files
committed
WIP CCollidableOBBTree
1 parent 4f7763c commit 91370fc

File tree

6 files changed

+962
-14
lines changed

6 files changed

+962
-14
lines changed

config/GM8E01_00/symbols.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11704,7 +11704,7 @@ LineIntersectsLeaf__18CCollidableOBBTreeCFRCQ28COBBTree9CLeafDataR12CRayCastInfo
1170411704
LineIntersectsOBBTree__18CCollidableOBBTreeCFPCQ28COBBTree5CNodePCQ28COBBTree5CNodeR12CRayCastInfo = .text:0x802A9A88; // type:function size:0x2E8 scope:global
1170511705
LineIntersectsOBBTree__18CCollidableOBBTreeCFPCQ28COBBTree5CNodeR12CRayCastInfo = .text:0x802A9D70; // type:function size:0xF0 scope:global
1170611706
LineIntersectsTree__18CCollidableOBBTreeCFRC5CMRayRC15CMaterialFilterfRC12CTransform4f = .text:0x802A9E60; // type:function size:0x26C scope:global
11707-
TransformPlane__FRC6CPlaneRC12CTransform4f = .text:0x802AA0CC; // type:function size:0xEC scope:global
11707+
TransformPlane__FRC6CPlaneRC12CTransform4f = .text:0x802AA0CC; // type:function size:0xEC scope:local
1170811708
CastRayInternal__18CCollidableOBBTreeCFRC25CInternalRayCastStructure = .text:0x802AA1B8; // type:function size:0x38 scope:global
1170911709
SphereCollideWithLeafMoving__18CCollidableOBBTreeCFRCQ28COBBTree9CLeafDataRC12CTransform4fRC7CSphereRC13CMaterialListRC15CMaterialFilterRC9CVector3fRdR14CCollisionInfo = .text:0x802AA1F0; // type:function size:0xF54 scope:global
1171011710
SphereCollisionMoving__18CCollidableOBBTreeCFRCQ28COBBTree5CNodeRC12CTransform4fRC7CSphereRC6COBBoxRC13CMaterialListRC15CMaterialFilterRC9CVector3fRdR14CCollisionInfo = .text:0x802AB144; // type:function size:0x13C scope:global
@@ -18746,8 +18746,8 @@ __vt__22CSustainedPlayerDamage = .data:0x803EC370; // type:object size:0x20
1874618746
__vt__17CPoisonProjectile = .data:0x803EC390; // type:object size:0x74 scope:global
1874718747
jumptable_803EC408 = .data:0x803EC408; // type:object size:0x20 scope:local
1874818748
lbl_803EC428 = .data:0x803EC428; // type:object size:0x10
18749-
lbl_803EC438 = .data:0x803EC438; // type:object size:0x10
18750-
lbl_803EC448 = .data:0x803EC448; // type:object size:0x28
18749+
mod3 = .data:0x803EC438; // type:object size:0x10 scope:local
18750+
__vt__18CCollidableOBBTree = .data:0x803EC448; // type:object size:0x28 scope:global
1875118751
__vt__23CCollidableOBBTreeGroup = .data:0x803EC470; // type:object size:0x28 scope:global
1875218752
__vt__60TObjOwnerDerivedFromIObj<32CCollidableOBBTreeGroupContainer> = .data:0x803EC498; // type:object size:0x10
1875318753
jumptable_803EC4A8 = .data:0x803EC4A8; // type:object size:0x20 scope:local
@@ -21282,7 +21282,7 @@ lbl_805A8620 = .sdata:0x805A8620; // type:object size:0x4 data:4byte
2128221282
lbl_805A8624 = .sdata:0x805A8624; // type:object size:0x4 data:4byte
2128321283
lbl_805A8628 = .sdata:0x805A8628; // type:object size:0x4 data:4byte
2128421284
lbl_805A862C = .sdata:0x805A862C; // type:object size:0x1 data:byte
21285-
lbl_805A8630 = .sdata:0x805A8630; // type:object size:0x8 data:4byte
21285+
sTableIndex__18CCollidableOBBTree = .sdata:0x805A8630; // type:object size:0x4 scope:global data:4byte
2128621286
lbl_805A8638 = .sdata:0x805A8638; // type:object size:0x8 data:4byte
2128721287
lbl_805A8640 = .sdata:0x805A8640; // type:object size:0x8
2128821288
skGlobalSeed__17CProjectileWeapon = .sdata:0x805A8648; // type:object size:0x4 data:4byte
Lines changed: 102 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,115 @@
11
#ifndef _CCOLLIDABLEOBBTREE
22
#define _CCOLLIDABLEOBBTREE
33

4-
#include <Collision/CCollisionPrimitive.hpp>
4+
#include "Collision/CCollisionPrimitive.hpp"
5+
#include "Collision/CMaterialFilter.hpp"
6+
#include "Collision/CMaterialList.hpp"
57

6-
class COBBTree;
7-
class CCollidableOBBTree : public CCollisionPrimitive {
8+
#include "Kyoto/Math/CPlane.hpp"
9+
10+
#include "WorldFormat/CMetroidAreaCollider.hpp"
11+
#include "WorldFormat/COBBTree.hpp"
12+
13+
class CCollisionInfo;
14+
class CCollisionInfoList;
15+
class CMRay;
16+
class COBBox;
17+
class CSphere;
18+
19+
class CRayCastInfo {
20+
const CMRay& x0_ray;
21+
const CMaterialFilter& x4_filter;
22+
float x8_mag;
23+
CPlane xc_plane;
24+
CMaterialList x20_material;
825

926
public:
10-
CCollidableOBBTree(const COBBTree& tree, const CMaterialList& list);
27+
CRayCastInfo(const CMRay& ray, const CMaterialFilter& filter, float mag)
28+
: x0_ray(ray)
29+
, x4_filter(filter)
30+
, x8_mag(mag)
31+
, xc_plane(CVector3f::Zero(), CUnitVector3f(CVector3f(0.f, 0.f, 1.f), CUnitVector3f::kN_Yes))
32+
, x20_material() {}
33+
34+
const CMRay& GetRay() const { return x0_ray; }
35+
const CMaterialFilter& GetMaterialFilter() const { return x4_filter; }
36+
float GetMagnitude() const { return x8_mag; }
37+
float& Magnitude() { return x8_mag; }
38+
const CPlane& GetPlane() const { return xc_plane; }
39+
CPlane& Plane() { return xc_plane; }
40+
const CMaterialList& GetMaterial() const { return x20_material; }
41+
CMaterialList& Material() { return x20_material; }
42+
};
43+
44+
class CCollidableOBBTree : public CCollisionPrimitive {
45+
public:
46+
CCollidableOBBTree(COBBTree* tree, const CMaterialList& list);
47+
~CCollidableOBBTree() override;
1148

1249
uint GetTableIndex() const override;
1350
CAABox CalculateAABox(const CTransform4f& xf) const override;
14-
const CAABox CalculateLocalAABox() const override;
51+
CAABox CalculateLocalAABox() const override;
1552
FourCC GetPrimType() const override;
16-
CRayCastResult CastRayInternal(const CInternalRayCastStructure& intRayCast) const override;
53+
CRayCastResult CastRayInternal(const CInternalRayCastStructure& rayCast) const override;
54+
55+
const COBBTree& GetOBBTree() const { return *x10_tree; }
56+
57+
bool AABoxCollision(const COBBTree::CNode& node, const CTransform4f& xf, const CAABox& aabb,
58+
const COBBox& obb, const CMaterialList& material,
59+
const CMaterialFilter& filter, const CPlane* planes,
60+
CCollisionInfoList& infoList) const;
61+
bool AABoxCollideWithLeaf(const COBBTree::CLeafData& leaf, const CTransform4f& xf,
62+
const CAABox& aabb, const CMaterialList& material,
63+
const CMaterialFilter& filter, const CPlane* planes,
64+
CCollisionInfoList& infoList) const;
65+
bool SphereCollision(const COBBTree::CNode& node, const CTransform4f& xf,
66+
const CSphere& sphere, const COBBox& obb, const CMaterialList& material,
67+
const CMaterialFilter& filter, CCollisionInfoList& infoList) const;
68+
bool SphereCollideWithLeaf(const COBBTree::CLeafData& leaf, const CTransform4f& xf,
69+
const CSphere& sphere, const CMaterialList& material,
70+
const CMaterialFilter& filter, CCollisionInfoList& infoList) const;
71+
bool AABoxCollisionBoolean(const COBBTree::CNode& node, const CTransform4f& xf,
72+
const CAABox& aabb, const COBBox& obb,
73+
const CMaterialFilter& filter) const;
74+
bool SphereCollisionBoolean(const COBBTree::CNode& node, const CTransform4f& xf,
75+
const CSphere& sphere, const COBBox& obb,
76+
const CMaterialFilter& filter) const;
77+
bool AABoxCollisionMoving(const COBBTree::CNode& node, const CTransform4f& xf,
78+
const CAABox& aabb, const COBBox& obb,
79+
const CMaterialList& material, const CMaterialFilter& filter,
80+
const CMetroidAreaCollider::CMovingAABoxComponents& components,
81+
const CVector3f& dir, double& dOut, CCollisionInfo& info) const;
82+
bool AABoxCollideWithLeafMoving(
83+
const COBBTree::CLeafData& leaf, const CTransform4f& xf, const CAABox& aabb,
84+
const CMaterialList& material, const CMaterialFilter& filter,
85+
const CMetroidAreaCollider::CMovingAABoxComponents& components, const CVector3f& dir,
86+
double& dOut, CCollisionInfo& info) const;
87+
bool SphereCollisionMoving(const COBBTree::CNode& node, const CTransform4f& xf,
88+
const CSphere& sphere, const COBBox& obb,
89+
const CMaterialList& material, const CMaterialFilter& filter,
90+
const CVector3f& dir, double& dOut, CCollisionInfo& info) const;
91+
bool SphereCollideWithLeafMoving(const COBBTree::CLeafData& leaf, const CTransform4f& xf,
92+
const CSphere& sphere, const CMaterialList& material,
93+
const CMaterialFilter& filter, const CVector3f& dir,
94+
double& dOut, CCollisionInfo& info) const;
95+
96+
CRayCastResult LineIntersectsTree(const CMRay& ray, const CMaterialFilter& filter, float maxTime,
97+
const CTransform4f& xf) const;
98+
bool LineIntersectsOBBTree(const COBBTree::CNode* node, CRayCastInfo& info) const;
99+
bool LineIntersectsOBBTree(const COBBTree::CNode* n0, const COBBTree::CNode* n1,
100+
CRayCastInfo& info) const;
101+
bool LineIntersectsLeaf(const COBBTree::CLeafData& leaf, CRayCastInfo& info) const;
102+
103+
static void SetStaticTableIndex(uint idx) { sTableIndex = idx; }
104+
105+
private:
106+
COBBTree* x10_tree;
107+
uint x14_tries;
108+
uint x18_misses;
109+
uint x1c_hits;
110+
111+
static uint sTableIndex;
17112
};
113+
CHECK_SIZEOF(CCollidableOBBTree, 0x20)
18114

19115
#endif // _CCOLLIDABLEOBBTREE

include/WorldFormat/CMetroidAreaCollider.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,12 @@ class CMetroidAreaCollider {
171171
double& dOut);
172172

173173
static ushort GetPrimitiveCheckCount() { return sDupPrimitiveCheckCount; }
174+
static ushort& DupVertexListValue(uint idx) { return sDupVertexList[idx]; }
175+
static ushort& DupEdgeListValue(uint idx) { return sDupEdgeList[idx]; }
174176
static ushort* GetTriangleList() { return sDupTriangleList; }
175177

176178
private:
179+
friend class CCollidableOBBTree;
177180
static ushort sDupPrimitiveCheckCount;
178181
static ushort sDupVertexList[0x2800];
179182
static ushort sDupEdgeList[0x6000];

include/WorldFormat/COBBTree.hpp

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,74 @@
11
#ifndef _COBBTREE
22
#define _COBBTREE
33

4+
#include "types.h"
5+
6+
#include "Collision/COBBox.hpp"
47
#include "Kyoto/Math/CVector3f.hpp"
58

69
#include "WorldFormat/CCollisionEdge.hpp"
710

811
#include "rstl/vector.hpp"
912

13+
class CAABox;
14+
class CCollisionSurface;
15+
class CInputStream;
16+
class CTransform4f;
17+
1018
class COBBTree {
11-
class CNode {};
19+
public:
20+
class CSimpleAllocator {
21+
void* x0_buffer;
22+
uint x4_size;
23+
uint x8_offset;
24+
25+
public:
26+
CSimpleAllocator(uint size);
27+
~CSimpleAllocator();
28+
int Alloc(uint size);
29+
};
30+
31+
class CLeafData {
32+
rstl::vector< ushort > x0_surface;
33+
34+
public:
35+
CLeafData() {}
36+
CLeafData(const rstl::vector< ushort >& surface);
37+
CLeafData(CInputStream& in);
38+
39+
const rstl::vector< ushort >& GetSurfaceVector() const { return x0_surface; }
40+
uint GetMemoryUsage() const;
41+
};
42+
43+
class CNode {
44+
COBBox x0_obb;
45+
bool x3c_isLeaf;
46+
CNode* x40_left;
47+
CNode* x44_right;
48+
CLeafData* x48_leaf;
49+
mutable bool x4c_hit;
50+
51+
public:
52+
CNode(const CTransform4f& xf, const CVector3f& extents, const CNode* left,
53+
const CNode* right, const CLeafData* leaf);
54+
CNode(CInputStream& in);
55+
~CNode();
56+
57+
const COBBox& GetOBB() const { return x0_obb; }
58+
bool IsLeaf() const { return x3c_isLeaf; }
59+
const CNode& GetLeftNode() const { return *x40_left; }
60+
const CNode& GetRightNode() const { return *x44_right; }
61+
const CLeafData& GetLeafData() const { return *x48_leaf; }
62+
void SetHit(bool h) const { x4c_hit = h; }
63+
bool WasHit() const { return x4c_hit; }
64+
65+
uint GetMemoryUsage() const;
66+
67+
static void SetAllocator(CSimpleAllocator* alloc);
68+
void* operator new(size_t size, const char* file, int line);
69+
void operator delete(void* ptr, size_t size);
70+
};
71+
1272
struct SIndexData {
1373
rstl::vector< uint > x0_materials;
1474
rstl::vector< uchar > x10_vertMaterials;
@@ -17,16 +77,45 @@ class COBBTree {
1777
rstl::vector< CCollisionEdge > x40_edges;
1878
rstl::vector< ushort > x50_surfaceIndices;
1979
rstl::vector< CVector3f > x60_vertices;
80+
81+
SIndexData();
82+
SIndexData(const SIndexData& other);
2083
SIndexData(CInputStream& in);
2184
};
2285

23-
public:
2486
COBBTree(CInputStream& in);
2587
COBBTree(const SIndexData& indexData, const CNode* root);
2688
~COBBTree();
2789

90+
const CNode& GetRoot() const { return *x88_root; }
91+
92+
CCollisionSurface GetSurface(ushort idx) const;
93+
CCollisionSurface GetTransformedSurface(ushort idx, const CTransform4f& xf) const;
94+
const ushort* GetTriangleEdgeIndices(ushort idx) const;
95+
void GetTriangleVertexIndices(ushort idx, ushort* out) const;
96+
97+
const CCollisionEdge& GetEdge(int idx) const { return x18_indexData.x40_edges[idx]; }
98+
const CVector3f& GetVert(int idx) const { return x18_indexData.x60_vertices[idx]; }
99+
uint GetVertMaterial(int idx) const {
100+
return x18_indexData.x0_materials[x18_indexData.x10_vertMaterials[idx]];
101+
}
102+
uint GetEdgeMaterial(int idx) const {
103+
return x18_indexData.x0_materials[x18_indexData.x20_edgeMaterials[idx]];
104+
}
105+
106+
CAABox CalculateLocalAABox() const;
107+
108+
static COBBTree* BuildOrientedBoundingBoxTree(const CVector3f& extent, const CVector3f& center);
109+
28110
private:
29-
char data[0x8c];
111+
uint x0_magic;
112+
uint x4_version;
113+
uint x8_memsize;
114+
CSimpleAllocator xc_allocator;
115+
SIndexData x18_indexData;
116+
CNode* x88_root;
30117
};
31118

119+
CHECK_SIZEOF(COBBTree, 0x8c)
120+
32121
#endif // _COBBTREE

0 commit comments

Comments
 (0)