|
|
|
|
@@ -4,8 +4,8 @@ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
|
|
|
|
|
|
|
|
|
|
This software is provided 'as-is', without any express or implied warranty.
|
|
|
|
|
In no event will the authors be held liable for any damages arising from the use of this software.
|
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
|
including commercial applications, and to alter it and redistribute it freely,
|
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
|
including commercial applications, and to alter it and redistribute it freely,
|
|
|
|
|
subject to the following restrictions:
|
|
|
|
|
|
|
|
|
|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
|
|
|
|
@@ -57,7 +57,7 @@ btCollisionWorld::~btCollisionWorld()
|
|
|
|
|
for (i=0;i<m_collisionObjects.size();i++)
|
|
|
|
|
{
|
|
|
|
|
btCollisionObject* collisionObject= m_collisionObjects[i];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btBroadphaseProxy* bp = collisionObject->getBroadphaseHandle();
|
|
|
|
|
if (bp)
|
|
|
|
|
{
|
|
|
|
|
@@ -107,7 +107,7 @@ void btCollisionWorld::addCollisionObject(btCollisionObject* collisionObject,sho
|
|
|
|
|
m_dispatcher1,0
|
|
|
|
|
)) ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -116,12 +116,12 @@ void btCollisionWorld::addCollisionObject(btCollisionObject* collisionObject,sho
|
|
|
|
|
void btCollisionWorld::updateAabbs()
|
|
|
|
|
{
|
|
|
|
|
BT_PROFILE("updateAabbs");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btTransform predictedTrans;
|
|
|
|
|
for ( int i=0;i<m_collisionObjects.size();i++)
|
|
|
|
|
{
|
|
|
|
|
btCollisionObject* colObj = m_collisionObjects[i];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//only update aabb of active objects
|
|
|
|
|
if (colObj->isActive())
|
|
|
|
|
{
|
|
|
|
|
@@ -138,7 +138,7 @@ void btCollisionWorld::updateAabbs()
|
|
|
|
|
//something went wrong, investigate
|
|
|
|
|
//this assert is unwanted in 3D modelers (danger of loosing work)
|
|
|
|
|
colObj->setActivationState(DISABLE_SIMULATION);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool reportMe = true;
|
|
|
|
|
if (reportMe && m_debugDrawer)
|
|
|
|
|
{
|
|
|
|
|
@@ -151,7 +151,7 @@ void btCollisionWorld::updateAabbs()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -183,12 +183,12 @@ void btCollisionWorld::performDiscreteCollisionDetection()
|
|
|
|
|
|
|
|
|
|
void btCollisionWorld::removeCollisionObject(btCollisionObject* collisionObject)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//bool removeFromBroadphase = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btBroadphaseProxy* bp = collisionObject->getBroadphaseHandle();
|
|
|
|
|
if (bp)
|
|
|
|
|
{
|
|
|
|
|
@@ -233,12 +233,12 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
|
|
|
|
|
//btGjkConvexCast convexCaster(castShape,convexShape,&simplexSolver);
|
|
|
|
|
//btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0);
|
|
|
|
|
#endif //#USE_SUBSIMPLEX_CONVEX_CAST
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
|
|
|
|
|
{
|
|
|
|
|
//add hit
|
|
|
|
|
if (castResult.m_normal.length2() > btScalar(0.0001))
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
if (castResult.m_fraction < resultCallback.m_closestHitFraction)
|
|
|
|
|
{
|
|
|
|
|
#ifdef USE_SUBSIMPLEX_CONVEX_CAST
|
|
|
|
|
@@ -249,7 +249,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
|
|
|
|
|
castResult.m_normal.normalize();
|
|
|
|
|
btCollisionWorld::LocalRayResult localRayResult
|
|
|
|
|
(
|
|
|
|
|
collisionObject,
|
|
|
|
|
collisionObject,
|
|
|
|
|
0,
|
|
|
|
|
castResult.m_normal,
|
|
|
|
|
castResult.m_fraction
|
|
|
|
|
@@ -273,7 +273,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
|
|
|
|
|
btVector3 rayToLocal = worldTocollisionObject * rayToTrans.getOrigin();
|
|
|
|
|
|
|
|
|
|
//ConvexCast::CastResult
|
|
|
|
|
struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback
|
|
|
|
|
struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback
|
|
|
|
|
{
|
|
|
|
|
btCollisionWorld::RayResultCallback* m_resultCallback;
|
|
|
|
|
btCollisionObject* m_collisionObject;
|
|
|
|
|
@@ -294,13 +294,13 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
|
|
|
|
|
btCollisionWorld::LocalShapeInfo shapeInfo;
|
|
|
|
|
shapeInfo.m_shapePart = partId;
|
|
|
|
|
shapeInfo.m_triangleIndex = triangleIndex;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btCollisionWorld::LocalRayResult rayResult
|
|
|
|
|
(m_collisionObject,
|
|
|
|
|
(m_collisionObject,
|
|
|
|
|
&shapeInfo,
|
|
|
|
|
hitNormalLocal,
|
|
|
|
|
hitFraction);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool normalInWorldSpace = false;
|
|
|
|
|
return m_resultCallback->AddSingleResult(rayResult,normalInWorldSpace);
|
|
|
|
|
}
|
|
|
|
|
@@ -313,7 +313,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
|
|
|
|
|
} else
|
|
|
|
|
{
|
|
|
|
|
btTriangleMeshShape* triangleMesh = (btTriangleMeshShape*)collisionShape;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btTransform worldTocollisionObject = colObjWorldTransform.inverse();
|
|
|
|
|
|
|
|
|
|
btVector3 rayFromLocal = worldTocollisionObject * rayFromTrans.getOrigin();
|
|
|
|
|
@@ -321,7 +321,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
|
|
|
|
|
|
|
|
|
|
//ConvexCast::CastResult
|
|
|
|
|
|
|
|
|
|
struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback
|
|
|
|
|
struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback
|
|
|
|
|
{
|
|
|
|
|
btCollisionWorld::RayResultCallback* m_resultCallback;
|
|
|
|
|
btCollisionObject* m_collisionObject;
|
|
|
|
|
@@ -342,17 +342,17 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
|
|
|
|
|
btCollisionWorld::LocalShapeInfo shapeInfo;
|
|
|
|
|
shapeInfo.m_shapePart = partId;
|
|
|
|
|
shapeInfo.m_triangleIndex = triangleIndex;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btCollisionWorld::LocalRayResult rayResult
|
|
|
|
|
(m_collisionObject,
|
|
|
|
|
(m_collisionObject,
|
|
|
|
|
&shapeInfo,
|
|
|
|
|
hitNormalLocal,
|
|
|
|
|
hitFraction);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool normalInWorldSpace = false;
|
|
|
|
|
return m_resultCallback->AddSingleResult(rayResult,normalInWorldSpace);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
@@ -395,29 +395,39 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
|
|
|
|
|
btCollisionObject* collisionObject,
|
|
|
|
|
const btCollisionShape* collisionShape,
|
|
|
|
|
const btTransform& colObjWorldTransform,
|
|
|
|
|
ConvexResultCallback& resultCallback,short int collisionFilterMask)
|
|
|
|
|
ConvexResultCallback& resultCallback, btScalar allowedPenetration,short int collisionFilterMask)
|
|
|
|
|
{
|
|
|
|
|
if (collisionShape->isConvex())
|
|
|
|
|
{
|
|
|
|
|
btConvexCast::CastResult castResult;
|
|
|
|
|
castResult.m_allowedPenetration = allowedPenetration;
|
|
|
|
|
castResult.m_fraction = btScalar(1.);//??
|
|
|
|
|
|
|
|
|
|
btConvexShape* convexShape = (btConvexShape*) collisionShape;
|
|
|
|
|
btVoronoiSimplexSolver simplexSolver;
|
|
|
|
|
btGjkEpaPenetrationDepthSolver gjkEpaPenetrationSolver;
|
|
|
|
|
btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,&gjkEpaPenetrationSolver);
|
|
|
|
|
|
|
|
|
|
bool result = false;
|
|
|
|
|
|
|
|
|
|
if (convexCaster.calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
|
|
|
|
|
btContinuousConvexCollision convexCaster1(castShape,convexShape,&simplexSolver,&gjkEpaPenetrationSolver);
|
|
|
|
|
//btGjkConvexCast convexCaster2(castShape,convexShape,&simplexSolver);
|
|
|
|
|
//btSubsimplexConvexCast convexCaster3(castShape,convexShape,&simplexSolver);
|
|
|
|
|
|
|
|
|
|
btConvexCast* castPtr = &convexCaster1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (castPtr->calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
|
|
|
|
|
{
|
|
|
|
|
//add hit
|
|
|
|
|
if (castResult.m_normal.length2() > btScalar(0.0001))
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
if (castResult.m_fraction < resultCallback.m_closestHitFraction)
|
|
|
|
|
{
|
|
|
|
|
castResult.m_normal.normalize();
|
|
|
|
|
btCollisionWorld::LocalConvexResult localConvexResult
|
|
|
|
|
(
|
|
|
|
|
collisionObject,
|
|
|
|
|
collisionObject,
|
|
|
|
|
0,
|
|
|
|
|
castResult.m_normal,
|
|
|
|
|
castResult.m_hitPoint,
|
|
|
|
|
@@ -443,7 +453,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
|
|
|
|
|
btTransform rotationXform = btTransform(worldTocollisionObject.getBasis() * convexToTrans.getBasis());
|
|
|
|
|
|
|
|
|
|
//ConvexCast::CastResult
|
|
|
|
|
struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
|
|
|
|
|
struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
|
|
|
|
|
{
|
|
|
|
|
btCollisionWorld::ConvexResultCallback* m_resultCallback;
|
|
|
|
|
btCollisionObject* m_collisionObject;
|
|
|
|
|
@@ -468,15 +478,15 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
btCollisionWorld::LocalConvexResult convexResult
|
|
|
|
|
(m_collisionObject,
|
|
|
|
|
(m_collisionObject,
|
|
|
|
|
&shapeInfo,
|
|
|
|
|
hitNormalLocal,
|
|
|
|
|
hitPointLocal,
|
|
|
|
|
hitFraction);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool normalInWorldSpace = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return m_resultCallback->AddSingleResult(convexResult,normalInWorldSpace);
|
|
|
|
|
}
|
|
|
|
|
return hitFraction;
|
|
|
|
|
@@ -499,7 +509,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
|
|
|
|
|
btTransform rotationXform = btTransform(worldTocollisionObject.getBasis() * convexToTrans.getBasis());
|
|
|
|
|
|
|
|
|
|
//ConvexCast::CastResult
|
|
|
|
|
struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
|
|
|
|
|
struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
|
|
|
|
|
{
|
|
|
|
|
btCollisionWorld::ConvexResultCallback* m_resultCallback;
|
|
|
|
|
btCollisionObject* m_collisionObject;
|
|
|
|
|
@@ -524,12 +534,12 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
btCollisionWorld::LocalConvexResult convexResult
|
|
|
|
|
(m_collisionObject,
|
|
|
|
|
(m_collisionObject,
|
|
|
|
|
&shapeInfo,
|
|
|
|
|
hitNormalLocal,
|
|
|
|
|
hitPointLocal,
|
|
|
|
|
hitFraction);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool normalInWorldSpace = false;
|
|
|
|
|
|
|
|
|
|
return m_resultCallback->AddSingleResult(convexResult,normalInWorldSpace);
|
|
|
|
|
@@ -543,7 +553,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
|
|
|
|
|
tccb.m_hitFraction = resultCallback.m_closestHitFraction;
|
|
|
|
|
btVector3 boxMinLocal, boxMaxLocal;
|
|
|
|
|
castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
btVector3 rayAabbMinLocal = convexFromLocal;
|
|
|
|
|
rayAabbMinLocal.setMin(convexToLocal);
|
|
|
|
|
btVector3 rayAabbMaxLocal = convexFromLocal;
|
|
|
|
|
@@ -567,26 +577,26 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
|
|
|
|
|
collisionObject,
|
|
|
|
|
childCollisionShape,
|
|
|
|
|
childWorldTrans,
|
|
|
|
|
resultCallback, collisionFilterMask);
|
|
|
|
|
resultCallback, allowedPenetration,collisionFilterMask);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback,short int collisionFilterMask)
|
|
|
|
|
void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback,short int collisionFilterMask) const
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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++)
|
|
|
|
|
{
|
|
|
|
|
@@ -596,7 +606,7 @@ void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& r
|
|
|
|
|
|
|
|
|
|
btCollisionObject* collisionObject= m_collisionObjects[i];
|
|
|
|
|
//only perform raycast if filterMask matches
|
|
|
|
|
if(collisionObject->getBroadphaseHandle()->m_collisionFilterGroup & collisionFilterMask) {
|
|
|
|
|
if(collisionObject->getBroadphaseHandle()->m_collisionFilterGroup & collisionFilterMask) {
|
|
|
|
|
//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
|
|
|
|
|
btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
|
|
|
|
|
collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax);
|
|
|
|
|
@@ -610,14 +620,14 @@ void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& r
|
|
|
|
|
collisionObject->getCollisionShape(),
|
|
|
|
|
collisionObject->getWorldTransform(),
|
|
|
|
|
resultCallback);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, ConvexResultCallback& resultCallback,short int collisionFilterMask)
|
|
|
|
|
void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, ConvexResultCallback& resultCallback,short int collisionFilterMask) const
|
|
|
|
|
{
|
|
|
|
|
btTransform convexFromTrans,convexToTrans;
|
|
|
|
|
convexFromTrans = convexFromWorld;
|
|
|
|
|
@@ -640,7 +650,7 @@ void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btT
|
|
|
|
|
{
|
|
|
|
|
btCollisionObject* collisionObject= m_collisionObjects[i];
|
|
|
|
|
//only perform raycast if filterMask matches
|
|
|
|
|
if(collisionObject->getBroadphaseHandle()->m_collisionFilterGroup & collisionFilterMask) {
|
|
|
|
|
if(collisionObject->getBroadphaseHandle()->m_collisionFilterGroup & collisionFilterMask) {
|
|
|
|
|
//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
|
|
|
|
|
btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
|
|
|
|
|
collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax);
|
|
|
|
|
@@ -653,8 +663,10 @@ void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btT
|
|
|
|
|
collisionObject,
|
|
|
|
|
collisionObject->getCollisionShape(),
|
|
|
|
|
collisionObject->getWorldTransform(),
|
|
|
|
|
resultCallback);
|
|
|
|
|
}
|
|
|
|
|
resultCallback,
|
|
|
|
|
getDispatchInfo().m_allowedCcdPenetration,
|
|
|
|
|
collisionFilterMask);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|