From 9086c15e490635b54ae3045dfa3879760c82c48b Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Wed, 25 Aug 2010 19:23:09 +0000 Subject: [PATCH] Applied patch to avoid "Assert in ClosestConvexResultCallback::addSingleResult", Thanks to Paul Dubois for the report and patch, see Issue 396 Also Issue 415 --- .../CollisionDispatch/btCollisionWorld.cpp | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp index 3613b8dc9..653ed96f8 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp @@ -434,11 +434,13 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra btCollisionShape* saveCollisionShape = collisionObject->getCollisionShape(); collisionObject->internalSetTemporaryCollisionShape((btCollisionShape*)childCollisionShape); struct LocalInfoAdder2 : public RayResultCallback { - int m_i; RayResultCallback* m_userCallback; + int m_i; LocalInfoAdder2 (int i, RayResultCallback *user) - : m_i(i), m_userCallback(user) + : m_userCallback(user), + m_i(i) { + m_closestHitFraction = m_userCallback->m_closestHitFraction; } virtual btScalar addSingleResult (btCollisionWorld::LocalRayResult &r, bool b) { @@ -447,13 +449,14 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra shapeInfo.m_triangleIndex = m_i; if (r.m_localShapeInfo == NULL) r.m_localShapeInfo = &shapeInfo; - return m_userCallback->addSingleResult(r, b); + + const btScalar result = m_userCallback->addSingleResult(r, b); + m_closestHitFraction = m_userCallback->m_closestHitFraction; + return result; } }; LocalInfoAdder2 my_cb(i, &resultCallback); - my_cb.m_closestHitFraction = resultCallback.m_closestHitFraction; - rayTestSingle(rayFromTrans,rayToTrans, collisionObject, @@ -660,7 +663,10 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt int m_i; LocalInfoAdder (int i, ConvexResultCallback *user) - : m_userCallback(user),m_i(i) { } + : m_userCallback(user), m_i(i) + { + m_closestHitFraction = m_userCallback->m_closestHitFraction; + } virtual btScalar addSingleResult (btCollisionWorld::LocalConvexResult& r, bool b) { btCollisionWorld::LocalShapeInfo shapeInfo; @@ -668,12 +674,15 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt shapeInfo.m_triangleIndex = m_i; if (r.m_localShapeInfo == NULL) r.m_localShapeInfo = &shapeInfo; - return m_userCallback->addSingleResult(r, b); + const btScalar result = m_userCallback->addSingleResult(r, b); + m_closestHitFraction = m_userCallback->m_closestHitFraction; + return result; + } }; LocalInfoAdder my_cb(i, &resultCallback); - my_cb.m_closestHitFraction = resultCallback.m_closestHitFraction; + objectQuerySingle(castShape, convexFromTrans,convexToTrans, collisionObject,