udword Havok::BatchRaycasts(PintSQThreadContext context, udword nb, PintRaycastHit* dest, const PintRaycastData* raycasts) { ASSERT(mPhysicsWorld); hkpWorldRayCastOutput output; udword NbHits = 0; while(nb--) { hkpWorldRayCastInput input; input.m_from = ToHkVector4(raycasts->mOrigin); input.m_to = ToHkVector4(raycasts->mOrigin + raycasts->mDir*raycasts->mMaxDist); output.reset(); mPhysicsWorld->castRay(input, output); if(output.m_rootCollidable) { NbHits++; FillResultStruct(*dest, output, raycasts->mOrigin, raycasts->mDir, raycasts->mMaxDist); } else { dest->mObject = null; } raycasts++; dest++; } return NbHits; }
udword Havok::BatchRaycastsPhantom(udword nb, PintRaycastHit* dest, const PintRaycastData* raycasts, void** phantoms) { ASSERT(phantoms); hkpAabbPhantom** ph = (hkpAabbPhantom**)phantoms; udword NbHits = 0; while(nb--) { hkpWorldRayCastInput input; input.m_from = ToHkVector4(raycasts->mOrigin); input.m_to = ToHkVector4(raycasts->mOrigin + raycasts->mDir*raycasts->mMaxDist); hkpAabbPhantom* phantom = *ph++; hkpWorldRayCastOutput output; phantom->castRay(input, output); if(output.m_rootCollidable) { NbHits++; FillResultStruct(*dest, output, raycasts->mOrigin, raycasts->mDir, raycasts->mMaxDist); } else { dest->mObject = null; } raycasts++; dest++; } return NbHits; }
udword Havok::BatchSphereSweeps(PintSQThreadContext context, udword nb, PintRaycastHit* dest, const PintSphereSweepData* sweeps) { ASSERT(mPhysicsWorld); hkpClosestCdPointCollector castCollector; udword NbHits = 0; while(nb--) { hkpLinearCastInput input; input.m_to = ToHkVector4(sweeps->mSphere.mCenter + sweeps->mDir*sweeps->mMaxDist); HAVOK_COLLIDABLE_FROM_SPHERE(sweeps->mSphere) castCollector.reset(); mPhysicsWorld->linearCast(&Collidable, input, castCollector); if(castCollector.hasHit()) { NbHits++; FillResultStruct(*dest, castCollector, sweeps->mMaxDist); } else { dest->mObject = null; } sweeps++; dest++; } return NbHits; }
udword Havok::BatchConvexSweeps(PintSQThreadContext context, udword nb, PintRaycastHit* dest, const PintConvexSweepData* sweeps) { ASSERT(mPhysicsWorld); hkpClosestCdPointCollector castCollector; udword NbHits = 0; while(nb--) { hkpConvexVerticesShape* ConvexShape = mConvexObjects[sweeps->mConvexObjectIndex]; const Point& center = sweeps->mTransform.mPos; const Quat& q = sweeps->mTransform.mRot; // const Point Center = (sweeps->mCapsule.mP0 + sweeps->mCapsule.mP1)*0.5f; hkpLinearCastInput input; input.m_to = ToHkVector4(center + sweeps->mDir*sweeps->mMaxDist); // HAVOK_COLLIDABLE_FROM_CAPSULE(sweeps->mCapsule, Center) // const hkpConvexShape CapsuleShape(ToHkVector4(capsule.mP0 - center), ToHkVector4(capsule.mP1 - center), capsule.mRadius); const hkTransform Pose(ToHkQuaternion(q), ToHkVector4(center)); const hkpCollidable Collidable(ConvexShape, &Pose); castCollector.reset(); mPhysicsWorld->linearCast(&Collidable, input, castCollector); if(castCollector.hasHit()) { NbHits++; FillResultStruct(*dest, castCollector, sweeps->mMaxDist); } else { dest->mObject = null; } sweeps++; dest++; } return NbHits; }
udword Havok::BatchBoxSweeps(PintSQThreadContext context, udword nb, PintRaycastHit* dest, const PintBoxSweepData* sweeps) { ASSERT(mPhysicsWorld); // Since we're not too concerned with perfect accuracy, we can set the early out // distance to give the algorithm a chance to exit more quickly: // mPhysicsWorld->getCollisionInput()->m_config->m_iterativeLinearCastEarlyOutDistance = 0.1f; hkpClosestCdPointCollector castCollector; udword NbHits = 0; while(nb--) { hkpLinearCastInput input; input.m_to = ToHkVector4(sweeps->mBox.mCenter + sweeps->mDir*sweeps->mMaxDist); const hkpBoxShape BoxShape(ToHkVector4(sweeps->mBox.mExtents), 0.0f); const hkTransform Pose(ToHkQuaternion(Quat(sweeps->mBox.mRot)), ToHkVector4(sweeps->mBox.mCenter)); hkpCollidable Collidable(&BoxShape, &Pose); castCollector.reset(); mPhysicsWorld->linearCast(&Collidable, input, castCollector); if(castCollector.hasHit()) { NbHits++; FillResultStruct(*dest, castCollector, sweeps->mMaxDist); } else { dest->mObject = null; } sweeps++; dest++; } return NbHits; }