selective raycasting

Jacky_J
Posts: 16
Joined: Fri May 11, 2007 7:06 am

selective raycasting

Post by Jacky_J »

In my game, i need to raycast only on certain objects. Since there was no easy way to do this, i decided to add a collisiongroupmask to the rayTest function.

Code: Select all

void	rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback, short int collisionFilterMask=-1);

void	btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback, short int collisionFilterMask)
{

	
	btTransform	rayFromTrans,rayToTrans;
	rayFromTrans.setIdentity();
	rayFromTrans.setOrigin(rayFromWorld);
	rayToTrans.setIdentity();
	
	rayToTrans.setOrigin(rayToWorld);

	/// go over all objects, and if the ray intersects their aabb, do a ray-shape query using convexCaster (CCD)
	
	int i;
	for (i=0;i<m_collisionObjects.size();i++)
	{
		btCollisionObject*	collisionObject= m_collisionObjects[i];
		if(collisionObject->getBroadphaseHandle()->m_collisionFilterGroup & collisionFilterMask) {

			//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
			btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
			collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax);

			btScalar hitLambda = btScalar(1.); //could use resultCallback.m_closestHitFraction, but needs testing
			btVector3 hitNormal;
			if (btRayAabb(rayFromWorld,rayToWorld,collisionObjectAabbMin,collisionObjectAabbMax,hitLambda,hitNormal))
			{
				rayTestSingle(rayFromTrans,rayToTrans,
					collisionObject,
						 collisionObject->getCollisionShape(),
						  collisionObject->getWorldTransform(),
						  resultCallback);
				
			}
		}
	}

}
This works wonderfully for me, so hopefully this can get put into the library at some point (in some form or another).
Jacky_J
Posts: 16
Joined: Fri May 11, 2007 7:06 am

Post by Jacky_J »

cool thanks for adding this to 2.54 Erwin