@@ -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+ }
0 commit comments