fixed Bullet raycasting filtering issue

This commit is contained in:
Erwin Coumans 2006-05-09 01:15:12 +00:00
parent 5f6a5f1b17
commit e19fcdc670
2 changed files with 72 additions and 58 deletions

@ -348,7 +348,7 @@ m_enableSatCollisionDetection(false)
} }
setSolverType(1); setSolverType(1);//issues with quickstep and memory allocations
m_collisionWorld = new CollisionWorld(dispatcher,broadphase); m_collisionWorld = new CollisionWorld(dispatcher,broadphase);
@ -1222,6 +1222,37 @@ void CcdPhysicsEnvironment::removeConstraint(int constraintId)
} }
} }
struct FilterClosestRayResultCallback : public CollisionWorld::ClosestRayResultCallback
{
PHY_IPhysicsController* m_ignoreClient;
FilterClosestRayResultCallback (PHY_IPhysicsController* ignoreClient,const SimdVector3& rayFrom,const SimdVector3& rayTo)
: CollisionWorld::ClosestRayResultCallback(rayFrom,rayTo),
m_ignoreClient(ignoreClient)
{
}
virtual ~FilterClosestRayResultCallback()
{
}
virtual float AddSingleResult(const CollisionWorld::LocalRayResult& rayResult)
{
CcdPhysicsController* curHit = static_cast<CcdPhysicsController*>(rayResult.m_collisionObject->m_userPointer);
//ignore client...
if (curHit != m_ignoreClient)
{
//if valid
return ClosestRayResultCallback::AddSingleResult(rayResult);
}
return m_closestHitFraction;
}
};
PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ, PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ,
float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ) float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ)
{ {
@ -1234,32 +1265,10 @@ PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* i
SimdVector3 hitPointWorld,normalWorld; SimdVector3 hitPointWorld,normalWorld;
CollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); //Either Ray Cast with or without filtering
//CollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo);
struct FilterClosestRayResultCallback : CollisionWorld::ClosestRayResultCallback FilterClosestRayResultCallback rayCallback(ignoreClient,rayFrom,rayTo);
{
PHY_IPhysicsController* m_ignoreClient;
FilterClosestRayResultCallback (PHY_IPhysicsController* ignoreClient,const SimdVector3& rayFrom,const SimdVector3& rayTo)
: CollisionWorld::ClosestRayResultCallback(rayFrom,rayTo),
m_ignoreClient(ignoreClient)
{
}
virtual float AddSingleResult(const CollisionWorld::LocalRayResult& rayResult)
{
CcdPhysicsController* curHit = static_cast<CcdPhysicsController*>(rayResult.m_collisionObject->m_userPointer);
//ignore client...
if (curHit != m_ignoreClient)
{
//if valid
return CollisionWorld::ClosestRayResultCallback::AddSingleResult(rayResult);
}
}
};
PHY_IPhysicsController* nearestHit = 0; PHY_IPhysicsController* nearestHit = 0;
@ -1520,7 +1529,6 @@ void CcdPhysicsEnvironment::UpdateAabbs(float timeStep)
if (bp) if (bp)
{ {
#ifdef WIN32
SimdVector3 color (1,1,0); SimdVector3 color (1,1,0);
if (m_debugDrawer) if (m_debugDrawer)
@ -1554,7 +1562,6 @@ void CcdPhysicsEnvironment::UpdateAabbs(float timeStep)
DrawAabb(m_debugDrawer,minAabb,maxAabb,color); DrawAabb(m_debugDrawer,minAabb,maxAabb,color);
} }
} }
#endif
scene->SetAabb(bp,minAabb,maxAabb); scene->SetAabb(bp,minAabb,maxAabb);

@ -348,7 +348,7 @@ m_enableSatCollisionDetection(false)
} }
setSolverType(1); setSolverType(1);//issues with quickstep and memory allocations
m_collisionWorld = new CollisionWorld(dispatcher,broadphase); m_collisionWorld = new CollisionWorld(dispatcher,broadphase);
@ -1222,6 +1222,37 @@ void CcdPhysicsEnvironment::removeConstraint(int constraintId)
} }
} }
struct FilterClosestRayResultCallback : public CollisionWorld::ClosestRayResultCallback
{
PHY_IPhysicsController* m_ignoreClient;
FilterClosestRayResultCallback (PHY_IPhysicsController* ignoreClient,const SimdVector3& rayFrom,const SimdVector3& rayTo)
: CollisionWorld::ClosestRayResultCallback(rayFrom,rayTo),
m_ignoreClient(ignoreClient)
{
}
virtual ~FilterClosestRayResultCallback()
{
}
virtual float AddSingleResult(const CollisionWorld::LocalRayResult& rayResult)
{
CcdPhysicsController* curHit = static_cast<CcdPhysicsController*>(rayResult.m_collisionObject->m_userPointer);
//ignore client...
if (curHit != m_ignoreClient)
{
//if valid
return ClosestRayResultCallback::AddSingleResult(rayResult);
}
return m_closestHitFraction;
}
};
PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ, PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* ignoreClient, float fromX,float fromY,float fromZ, float toX,float toY,float toZ,
float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ) float& hitX,float& hitY,float& hitZ,float& normalX,float& normalY,float& normalZ)
{ {
@ -1234,32 +1265,10 @@ PHY_IPhysicsController* CcdPhysicsEnvironment::rayTest(PHY_IPhysicsController* i
SimdVector3 hitPointWorld,normalWorld; SimdVector3 hitPointWorld,normalWorld;
CollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo); //Either Ray Cast with or without filtering
//CollisionWorld::ClosestRayResultCallback rayCallback(rayFrom,rayTo);
struct FilterClosestRayResultCallback : CollisionWorld::ClosestRayResultCallback FilterClosestRayResultCallback rayCallback(ignoreClient,rayFrom,rayTo);
{
PHY_IPhysicsController* m_ignoreClient;
FilterClosestRayResultCallback (PHY_IPhysicsController* ignoreClient,const SimdVector3& rayFrom,const SimdVector3& rayTo)
: CollisionWorld::ClosestRayResultCallback(rayFrom,rayTo),
m_ignoreClient(ignoreClient)
{
}
virtual float AddSingleResult(const CollisionWorld::LocalRayResult& rayResult)
{
CcdPhysicsController* curHit = static_cast<CcdPhysicsController*>(rayResult.m_collisionObject->m_userPointer);
//ignore client...
if (curHit != m_ignoreClient)
{
//if valid
return CollisionWorld::ClosestRayResultCallback::AddSingleResult(rayResult);
}
}
};
PHY_IPhysicsController* nearestHit = 0; PHY_IPhysicsController* nearestHit = 0;
@ -1520,7 +1529,6 @@ void CcdPhysicsEnvironment::UpdateAabbs(float timeStep)
if (bp) if (bp)
{ {
#ifdef WIN32
SimdVector3 color (1,1,0); SimdVector3 color (1,1,0);
if (m_debugDrawer) if (m_debugDrawer)
@ -1554,7 +1562,6 @@ void CcdPhysicsEnvironment::UpdateAabbs(float timeStep)
DrawAabb(m_debugDrawer,minAabb,maxAabb,color); DrawAabb(m_debugDrawer,minAabb,maxAabb,color);
} }
} }
#endif
scene->SetAabb(bp,minAabb,maxAabb); scene->SetAabb(bp,minAabb,maxAabb);