fixed to potential issues, reported by marshall. Thanks!

This commit is contained in:
ejcoumans
2007-06-13 20:05:02 +00:00
parent 4f9d719493
commit 68b4f60033
2 changed files with 33 additions and 26 deletions

View File

@@ -108,9 +108,15 @@ public:
clearUserCache(m_pointCache[index]); clearUserCache(m_pointCache[index]);
int lastUsedIndex = getNumContacts() - 1; int lastUsedIndex = getNumContacts() - 1;
// m_pointCache[index] = m_pointCache[lastUsedIndex];
if(index != lastUsedIndex)
{
m_pointCache[index] = m_pointCache[lastUsedIndex]; m_pointCache[index] = m_pointCache[lastUsedIndex];
//get rid of duplicated userPersistentData pointer //get rid of duplicated userPersistentData pointer
m_pointCache[lastUsedIndex].m_userPersistentData = 0; m_pointCache[lastUsedIndex].m_userPersistentData = 0;
}
btAssert(m_pointCache[lastUsedIndex].m_userPersistentData==0);
m_cachedPoints--; m_cachedPoints--;
} }
void replaceContactPoint(const btManifoldPoint& newPoint,int insertIndex) void replaceContactPoint(const btManifoldPoint& newPoint,int insertIndex)

View File

@@ -168,13 +168,11 @@ bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
closestPtPointTriangle(p,a,b,c,m_cachedBC); closestPtPointTriangle(p,a,b,c,m_cachedBC);
m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] + m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] +
m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] + m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2] + m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2];
m_simplexPointsP[3] * m_cachedBC.m_barycentricCoords[3];
m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] + m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] +
m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] + m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2] + m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2];
m_simplexPointsQ[3] * m_cachedBC.m_barycentricCoords[3];
m_cachedV = m_cachedP1-m_cachedP2; m_cachedV = m_cachedP1-m_cachedP2;
@@ -525,6 +523,7 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btPoint3& p, const
finalResult.m_closestPointOnSimplex = q; finalResult.m_closestPointOnSimplex = q;
finalResult.m_usedVertices.reset(); finalResult.m_usedVertices.reset();
finalResult.m_usedVertices.usedVertexA = tempResult.m_usedVertices.usedVertexA; finalResult.m_usedVertices.usedVertexA = tempResult.m_usedVertices.usedVertexA;
finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexB; finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexC; finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexC;
finalResult.setBarycentricCoordinates( finalResult.setBarycentricCoordinates(
@@ -552,8 +551,9 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btPoint3& p, const
finalResult.m_closestPointOnSimplex = q; finalResult.m_closestPointOnSimplex = q;
finalResult.m_usedVertices.reset(); finalResult.m_usedVertices.reset();
finalResult.m_usedVertices.usedVertexA = tempResult.m_usedVertices.usedVertexA; finalResult.m_usedVertices.usedVertexA = tempResult.m_usedVertices.usedVertexA;
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexC; finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexC;
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.setBarycentricCoordinates( finalResult.setBarycentricCoordinates(
tempResult.m_barycentricCoords[VERTA], tempResult.m_barycentricCoords[VERTA],
tempResult.m_barycentricCoords[VERTC], tempResult.m_barycentricCoords[VERTC],
@@ -577,9 +577,10 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btPoint3& p, const
bestSqDist = sqDist; bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q; finalResult.m_closestPointOnSimplex = q;
finalResult.m_usedVertices.reset(); finalResult.m_usedVertices.reset();
//
finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexA; finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexA;
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexC; finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexC;
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.setBarycentricCoordinates( finalResult.setBarycentricCoordinates(
0, 0,