Changed options to BT_TRIANGLE_CONVEX_BACKFACE_MODE ,BT_TRIANGLE_CONCAVE_DOUBLE_SIDED and BT_TRIANGLE_CONVEX_DOUBLE_SIDED.

Note that double sided options are experimental, single sided is recommended, and backfacing is default
This commit is contained in:
erwin.coumans
2010-01-30 10:44:16 +00:00
parent fbc4089e3f
commit 4fcea85c01
3 changed files with 12 additions and 10 deletions

View File

@@ -78,6 +78,8 @@ static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisio
if (enable) if (enable)
{ {
btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1); btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1);
//btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE);
//btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED);
} }
float friction0 = colObj0->getFriction(); float friction0 = colObj0->getFriction();

View File

@@ -538,7 +538,7 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV0V1Angle,clampedLocalNormal); bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV0V1Angle,clampedLocalNormal);
if (isClamped) if (isClamped)
{ {
if (clampedLocalNormal.dot(frontFacing*tri_normal)>0) if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0))
{ {
btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal; btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal;
// cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB); // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
@@ -621,7 +621,7 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV1V2Angle,clampedLocalNormal); bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV1V2Angle,clampedLocalNormal);
if (isClamped) if (isClamped)
{ {
if (clampedLocalNormal.dot(frontFacing*tri_normal)>0) if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0))
{ {
btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal; btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal;
// cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB); // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
@@ -702,7 +702,7 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB,info->m_edgeV2V0Angle,clampedLocalNormal); bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB,info->m_edgeV2V0Angle,clampedLocalNormal);
if (isClamped) if (isClamped)
{ {
if (clampedLocalNormal.dot(frontFacing*tri_normal)>0) if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0))
{ {
btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal; btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal;
// cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB); // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
@@ -731,12 +731,7 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
if (numConcaveEdgeHits>0) if (numConcaveEdgeHits>0)
{ {
if ((normalAdjustFlags & BT_TRIANGLE_CONCAVE_DOUBLE_SIDED)!=0)
if ((normalAdjustFlags & BT_TRIANGLE_CONCAVE_SINGLE_SIDED)!=0)
{
//modify the normal to be the triangle normal (or backfacing normal)
cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis() *(tri_normal *frontFacing);
} else
{ {
//fix tri_normal so it pointing the same direction as the current local contact normal //fix tri_normal so it pointing the same direction as the current local contact normal
if (tri_normal.dot(localContactNormalOnB) < 0) if (tri_normal.dot(localContactNormalOnB) < 0)
@@ -744,6 +739,10 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
tri_normal *= -1; tri_normal *= -1;
} }
cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis()*tri_normal; cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis()*tri_normal;
} else
{
//modify the normal to be the triangle normal (or backfacing normal)
cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis() *(tri_normal *frontFacing);
} }

View File

@@ -66,7 +66,8 @@ struct btTriangleInfoMap : public btInternalTriangleInfoMap
enum btInternalEdgeAdjustFlags enum btInternalEdgeAdjustFlags
{ {
BT_TRIANGLE_CONVEX_BACKFACE_MODE = 1, BT_TRIANGLE_CONVEX_BACKFACE_MODE = 1,
BT_TRIANGLE_CONCAVE_SINGLE_SIDED = 2 BT_TRIANGLE_CONCAVE_DOUBLE_SIDED = 2, //double sided options are experimental, single sided is recommended
BT_TRIANGLE_CONVEX_DOUBLE_SIDED = 4
}; };