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:
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user