From 4fcea85c0193aabbf2b52e61f3bc05bd0e68a851 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Sat, 30 Jan 2010 10:44:16 +0000 Subject: [PATCH] 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 --- Demos/InternalEdgeDemo/InternalEdgeDemo.cpp | 2 ++ .../CollisionDispatch/btInternalEdgeUtility.cpp | 17 ++++++++--------- .../CollisionDispatch/btInternalEdgeUtility.h | 3 ++- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Demos/InternalEdgeDemo/InternalEdgeDemo.cpp b/Demos/InternalEdgeDemo/InternalEdgeDemo.cpp index 35be32718..312af71e0 100644 --- a/Demos/InternalEdgeDemo/InternalEdgeDemo.cpp +++ b/Demos/InternalEdgeDemo/InternalEdgeDemo.cpp @@ -78,6 +78,8 @@ static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisio if (enable) { 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(); diff --git a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp index e1db4c444..2487e6476 100644 --- a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp +++ b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp @@ -538,7 +538,7 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject* bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV0V1Angle,clampedLocalNormal); 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; // 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); 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; // 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); 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; // 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 ((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 + if ((normalAdjustFlags & BT_TRIANGLE_CONCAVE_DOUBLE_SIDED)!=0) { //fix tri_normal so it pointing the same direction as the current local contact normal if (tri_normal.dot(localContactNormalOnB) < 0) @@ -744,6 +739,10 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject* tri_normal *= -1; } 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); } diff --git a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h index c6219417c..11621865d 100644 --- a/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h +++ b/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h @@ -66,7 +66,8 @@ struct btTriangleInfoMap : public btInternalTriangleInfoMap enum btInternalEdgeAdjustFlags { 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 };