From 658979c3acce3d8c20315acf108041887328cd32 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Tue, 2 Mar 2010 20:37:11 +0000 Subject: [PATCH] Another bugfix in the serialization (recently introduced), it is a mine field ;-) A fix for btSubSimplexConvexCast, don't add a point of the Minkowski sum if it wasn't already in the voronoi simplex (similar to GJK) --- src/BulletCollision/CollisionShapes/btCompoundShape.cpp | 2 +- .../NarrowPhaseCollision/btSubSimplexConvexCast.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/BulletCollision/CollisionShapes/btCompoundShape.cpp b/src/BulletCollision/CollisionShapes/btCompoundShape.cpp index a65f949c8..36906a75f 100644 --- a/src/BulletCollision/CollisionShapes/btCompoundShape.cpp +++ b/src/BulletCollision/CollisionShapes/btCompoundShape.cpp @@ -306,7 +306,7 @@ const char* btCompoundShape::serialize(void* dataBuffer, btSerializer* serialize memPtr->m_childMargin = float(m_children[i].m_childMargin); memPtr->m_childShape = (btCollisionShapeData*)serializer->getUniquePointer(m_children[i].m_childShape); //don't serialize shapes that already have been serialized - if (!serializer->findPointer(memPtr->m_childShape)) + if (!serializer->findPointer(m_children[i].m_childShape)) { btChunk* chunk = serializer->allocate(m_children[i].m_childShape->calculateSerializeBufferSize(),1); const char* structType = m_children[i].m_childShape->serialize(chunk->m_oldPtr,serializer); diff --git a/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp b/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp index 4c709a8c3..18eb662de 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp +++ b/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp @@ -114,7 +114,10 @@ bool btSubsimplexConvexCast::calcTimeOfImpact( hasResult = true; } } - m_simplexSolver->addVertex( w, supVertexA , supVertexB); + ///Just like regular GJK only add the vertex if it isn't already (close) to current vertex, it would lead to divisions by zero and NaN etc. + if (!m_simplexSolver->inSimplex(w)) + m_simplexSolver->addVertex( w, supVertexA , supVertexB); + if (m_simplexSolver->closest(v)) { dist2 = v.length2();