118 using namespace Opcode;
123 #define SET_CONTACT(prim_index, flag) \
124 mNbIntersections++; \
128 mStabbedFace.mFaceID = prim_index;
130 #ifdef OPC_RAYHIT_CALLBACK
132 #define HANDLE_CONTACT(prim_index, flag) \
133 SET_CONTACT(prim_index, flag) \
135 if(mHitCallback) (mHitCallback)(mStabbedFace, mUserData);else{}
137 #define UPDATE_CACHE \
138 if(cache && GetContactStatus()) \
140 *cache = mStabbedFace.mFaceID; \
144 #define HANDLE_CONTACT(prim_index, flag) \
145 SET_CONTACT(prim_index, flag) \
151 if(!mClosestHit || !mStabbedFaces->GetNbFaces()) \
153 mStabbedFaces->AddFace(mStabbedFace); \
158 CollisionFace* Current = const_cast<CollisionFace*>(mStabbedFaces->GetFaces()); \
159 if(Current && mStabbedFace.mDistance<Current->mDistance) \
161 *Current = mStabbedFace; \
166 #define UPDATE_CACHE \
167 if(cache && GetContactStatus() && mStabbedFaces) \
169 const CollisionFace* Current = mStabbedFaces->GetFaces(); \
170 if(Current) *cache = Current->mFaceID; \
171 else *cache = INVALID_ID; \
175 #define SEGMENT_PRIM(prim_index, flag) \
177 VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \
180 if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \
184 if(IR(mStabbedFace.mDistance)<IR(mMaxDist)) \
186 HANDLE_CONTACT(prim_index, flag) \
190 #define RAY_PRIM(prim_index, flag) \
192 VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \
195 if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \
197 HANDLE_CONTACT(prim_index, flag) \
211 mStabbedFaces (
null),
215 mNbIntersections (0),
241 if(
mMaxDist<0.0f)
return "Higher distance bound must be positive!";
243 #ifndef OPC_RAYHIT_CALLBACK
244 if(mClosestHit &&
FirstContactEnabled())
return "Closest hit doesn't work with ""First contact"" mode!";
247 if(
SkipPrimitiveTests())
return "SkipPrimitiveTests not possible for RayCollider ! (not implemented)";
268 if(!
Setup(&model))
return false;
271 if(
InitQuery(world_ray, world, cache))
return true;
347 #ifndef OPC_RAYHIT_CALLBACK
348 if(mStabbedFaces) mStabbedFaces->Reset();
388 #ifndef OPC_RAYHIT_CALLBACK
409 #ifndef OPC_RAYHIT_CALLBACK
476 if(!tree)
return false;
556 if(node->HasPosLeaf())
564 if(node->HasNegLeaf())
587 if(node->HasPosLeaf())
595 if(node->HasNegLeaf())
612 Point Center, Extents;
613 node->GetAABB()->GetCenter(Center);
614 node->GetAABB()->GetExtents(Extents);
637 if(!
RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents))
return;
692 if(!
RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents))
return;
694 if(node->HasPosLeaf())
702 if(node->HasNegLeaf())
725 if(node->HasPosLeaf())
733 if(node->HasNegLeaf())
750 Point Center, Extents;
751 node->GetAABB()->GetCenter(Center);
752 node->GetAABB()->GetExtents(Extents);
761 _RayStab(node->GetPos(), box_indices);
762 _RayStab(node->GetNeg(), box_indices);