Skip to content

Commit 3e5e8e6

Browse files
committed
Extend OBB intersection functionality
Теперь можно получать пересечения со статикой и OBB(направленным прямоугольным параллелепипедом) а так же получать точки контакта.
1 parent b0396a0 commit 3e5e8e6

File tree

7 files changed

+402
-4
lines changed

7 files changed

+402
-4
lines changed

src/xrCore/Collision/xrCDB.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ COLLIDER::COLLIDER()
167167
ray_mode = 0;
168168
box_mode = 0;
169169
frustum_mode = 0;
170+
obb_mode = 0;
170171
}
171172

172173
COLLIDER::~COLLIDER()

src/xrCore/Collision/xrCDB.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ namespace CDB
169169
u32 ray_mode;
170170
u32 box_mode;
171171
u32 frustum_mode;
172-
172+
u32 obb_mode;
173173
// Result management
174174
xr_vector<RESULT> rd;
175175
public:
@@ -189,13 +189,17 @@ namespace CDB
189189
ICF void frustum_options (u32 f) { frustum_mode = f; }
190190
void frustum_query (const MODEL *m_def, const CFrustum& F);
191191

192+
ICF void obb_options(u32 f) { obb_mode = f; }
193+
void obb_query(const MODEL* m_def, const Fobb& _obb);
194+
192195
ICF RESULT* r_begin () { return &*rd.begin(); };
193196
ICF RESULT* r_end () { return &*rd.end(); };
194197
RESULT& r_add () ;
195198
void r_free () ;
196199
ICF int r_count () { return (u32)rd.size(); };
197200
ICF void r_clear () { rd.resize(0); };
198201
ICF void r_clear_compact () { rd.clear(); };
202+
IC xr_vector<RESULT>& r_vec () { return rd; };
199203
};
200204

201205
//

src/xrCore/Collision/xrCDB_box.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,3 +244,68 @@ void COLLIDER::box_query(const MODEL *m_def, const Fvector& b_center, const Fvec
244244
BC._init(this, m_def->verts, m_def->tris, b_center, b_dim);
245245
BC._stab(N);
246246
}
247+
248+
struct obb_collider
249+
{
250+
COLLIDER* dest;
251+
TRI* tris;
252+
Fvector* verts;
253+
Fobb obb;
254+
255+
bool bClass3 = false;
256+
bool bFirst = false;
257+
258+
Fvector mLeafVerts[3];
259+
260+
void _prim(DWORD prim)
261+
{
262+
TRI& T = tris[prim];
263+
mLeafVerts[0] = verts[T.verts[0]];
264+
mLeafVerts[1] = verts[T.verts[1]];
265+
mLeafVerts[2] = verts[T.verts[2]];
266+
267+
if (!obb.intersectTri(mLeafVerts, bClass3))
268+
return;
269+
270+
RESULT& R = dest->r_add();
271+
R.id = prim;
272+
R.verts[0] = mLeafVerts[0];
273+
R.verts[1] = mLeafVerts[1];
274+
R.verts[2] = mLeafVerts[2];
275+
R.dummy = T.dummy;
276+
}
277+
278+
void _stab(const AABBNoLeafNode* node)
279+
{
280+
// Actual OBB-AABB test
281+
if (!obb.intersectAABB((Fvector&)node->mAABB.mCenter, (Fvector&)node->mAABB.mExtents)) return;
282+
283+
// 1st child
284+
if (node->HasPosLeaf()) _prim(node->GetPosPrimitive());
285+
else _stab(node->GetPos());
286+
287+
// Early exit for "only first"
288+
if (bFirst && dest->r_count()) return;
289+
290+
// 2nd child
291+
if (node->HasNegLeaf()) _prim(node->GetNegPrimitive());
292+
else _stab(node->GetNeg());
293+
}
294+
};
295+
296+
void COLLIDER::obb_query(const MODEL* m_def, const Fobb& obb)
297+
{
298+
PROF_EVENT("COLLIDER::obb_query");
299+
if (!m_def)
300+
return;
301+
302+
m_def->syncronize();
303+
304+
// Get nodes
305+
const AABBNoLeafTree* T = (const AABBNoLeafTree*)m_def->tree->GetTree();
306+
const AABBNoLeafNode* N = T->GetNodes();
307+
r_clear();
308+
309+
obb_collider OC{ this, m_def->tris, m_def->verts, obb, !!(box_mode & OPT_FULL_TEST), !!(box_mode & OPT_ONLYFIRST) };
310+
OC._stab(N);
311+
}

src/xrCore/Collision/xrXRC.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,29 @@ class XRCORE_API xrXRC
6262
cdb_clFRUSTUM->End ();
6363
#endif
6464
}
65+
66+
IC void obb_options(u32 f)
67+
{
68+
CL.obb_options(f);
69+
}
70+
IC void obb_query(const CDB::MODEL* m_def, const Fobb& obb)
71+
{
72+
#ifdef DEBUG
73+
cdb_clBOX->Begin();
74+
#endif
75+
CL.obb_query(m_def, obb);
76+
#ifdef DEBUG
77+
cdb_clBOX->End();
78+
#endif
79+
}
6580

6681
IC CDB::RESULT* r_begin () { return CL.r_begin(); };
6782
IC CDB::RESULT* r_end () { return CL.r_end(); };
6883
IC void r_free () { CL.r_free(); }
6984
IC int r_count () { return CL.r_count(); };
7085
IC void r_clear () { CL.r_clear(); };
7186
IC void r_clear_compact () { CL.r_clear_compact(); };
72-
87+
IC xr_vector<CDB::RESULT>& r_vec() { return CL.r_vec(); };
7388
xrXRC();
7489
~xrXRC();
7590
};

src/xrCore/_matrix33.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ struct _matrix33{
2020
Tvector j;
2121
Tvector k;
2222
};
23-
float m[3][3]; // Array
23+
Tvector row[3];
24+
float m[3][3];
25+
float mm[9];
2426
};
2527

2628
IC _matrix33()

0 commit comments

Comments
 (0)