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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}