static bool btAdjustInternalEdgeContactsCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int 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); return true; }
static bool CustomMaterialCombinerCallback( btManifoldPoint& cp, const btCollisionObject* colObj0, int /* partId0 */, int /* index0 */, const btCollisionObject* colObj1, int partId1, int index1) { btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1); return false; }
bool contactAdded(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1) { btAdjustInternalEdgeContacts(cp,colObj1Wrap,colObj0Wrap, partId1,index1); return true; }
static bool CustomMaterialCallback(btManifoldPoint &ManifoldPoint, const btCollisionObjectWrapper *Object0, int PartID0, int Index0, const btCollisionObjectWrapper *Object1, int PartID1, int Index1) { //if(Object0->getCollisionShape()->getShapeType()TRIANGLE_SHAPE_PROXYTYPE //printf("before %f\n", ManifoldPoint.m_normalWorldOnB[1]); float Before = ManifoldPoint.m_normalWorldOnB[1]; if(1) { //printf("%d %d %d %d %d %d\n", Object0->getCollisionShape()->getShapeType(), Object1->getCollisionShape()->getShapeType(), PartID0, PartID1, Index0, Index1); btAdjustInternalEdgeContacts(ManifoldPoint, Object1, Object0, PartID1, Index1); } float After = ManifoldPoint.m_normalWorldOnB[1]; //if(Before != After) printf("before %f after %f\n", Before, After); return false; }
static bool CustomMaterialCallback(btManifoldPoint &ManifoldPoint, const btCollisionObjectWrapper *Object0, int PartID0, int Index0, const btCollisionObjectWrapper *Object1, int PartID1, int Index1) { if(Object1->getCollisionShape()->getShapeType() != TRIANGLE_SHAPE_PROXYTYPE) return false; btScalar Before = ManifoldPoint.m_normalWorldOnB.getY(); if(USE_INTERNAL_EDGE_UTILITY) { HitOnce = true; btAdjustInternalEdgeContacts(ManifoldPoint, Object1, Object0, PartID1, Index1); } btScalar After = ManifoldPoint.m_normalWorldOnB.getY(); if(Before != After) printf("contact callback: before y=%f after y=%f\n", Before, After); return false; }
static bool CustomMaterialCombinerCallback( btManifoldPoint& cp, const btCollisionObject* colObj0, int partId0, int index0, const btCollisionObject* colObj1, int partId1, int index1) { ///make sure colObj0 is the triangle mesh //if (enable) { btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1); } return false; }
static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) { if (enable) { btAdjustInternalEdgeContacts(cp,colObj1Wrap,colObj0Wrap, 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 = colObj0Wrap->getCollisionObject()->getFriction(); float friction1 = colObj1Wrap->getCollisionObject()->getFriction(); float restitution0 = colObj0Wrap->getCollisionObject()->getRestitution(); float restitution1 = colObj1Wrap->getCollisionObject()->getRestitution(); if (colObj0Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) { friction0 = 1.0;//partId0,index0 restitution0 = 0.f; } if (colObj1Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) { if (index1&1) { friction1 = 1.0f;//partId1,index1 } else { friction1 = 0.f; } restitution1 = 0.f; } cp.m_combinedFriction = calculateCombinedFriction(friction0,friction1); cp.m_combinedRestitution = calculateCombinedRestitution(restitution0,restitution1); //this return value is currently ignored, but to be on the safe side: return false if you don't calculate friction return true; }
void btConvexTriangleCallback::processTriangle(btVector3* triangle, int partId, int triangleIndex) { if (!TestTriangleAgainstAabb2(triangle, m_aabbMin, m_aabbMax)) { return; } //just for debugging purposes //printf("triangle %d", m_triangleCount++); const btCollisionObject* ob = const_cast<btCollisionObject*>(m_triBodyWrap->getCollisionObject()); btCollisionAlgorithmConstructionInfo ci; ci.m_dispatcher1 = m_dispatcher; //const btCollisionObject* ob = static_cast<btCollisionObject*>(m_triBodyWrap->getCollisionObject()); #if 1 ///debug drawing of the overlapping triangles if (m_dispatchInfoPtr && m_dispatchInfoPtr->m_debugDraw && (m_dispatchInfoPtr->m_debugDraw->getDebugMode() &btIDebugDraw::DBG_DrawWireframe )) { btVector3 color(1,1,0); const btTransform& tr = ob->getWorldTransform(); m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]), tr(triangle[1]), color); m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]), tr(triangle[2]), color); m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]), tr(triangle[0]), color); } #endif if (m_convexBodyWrap->getCollisionShape()->isConvex()) { btTriangleShape tm(triangle[0], triangle[1], triangle[2]); tm.setMargin(m_collisionMarginTriangle); btCollisionObjectWrapper triObWrap(m_triBodyWrap, &tm, m_triBodyWrap->getCollisionObject(), m_triBodyWrap->getWorldTransform(), partId, triangleIndex);//correct transform? btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(m_convexBodyWrap, &triObWrap, m_manifoldPtr); const btCollisionObjectWrapper* tmpWrap = 0; if (m_resultOut->getBody0Internal() == m_triBodyWrap->getCollisionObject()) { tmpWrap = m_resultOut->getBody0Wrap(); m_resultOut->setBody0Wrap(&triObWrap); m_resultOut->setShapeIdentifiersA(partId, triangleIndex); } else { tmpWrap = m_resultOut->getBody1Wrap(); m_resultOut->setBody1Wrap(&triObWrap); m_resultOut->setShapeIdentifiersB(partId, triangleIndex); } colAlgo->processCollision(m_convexBodyWrap, &triObWrap, *m_dispatchInfoPtr, m_resultOut); btIDebugDraw *drawer = NULL; if (m_dispatchInfoPtr) { drawer = m_dispatchInfoPtr->m_debugDraw; } // Compensate for any internal edge contact points btPersistentManifold *manifold = m_resultOut->getPersistentManifold(); for (int i = 0; i < manifold->getNumContacts(); i++) { btManifoldPoint &pt = manifold->getContactPoint(i); btAdjustInternalEdgeContacts(pt, &triObWrap, m_convexBodyWrap, partId, triangleIndex, BT_TRIANGLE_CONVEX_DOUBLE_SIDED | BT_TRIANGLE_CONCAVE_DOUBLE_SIDED, drawer); } if (m_resultOut->getBody0Internal() == m_triBodyWrap->getCollisionObject()) { m_resultOut->setBody0Wrap(tmpWrap); } else { m_resultOut->setBody1Wrap(tmpWrap); } colAlgo->~btCollisionAlgorithm(); ci.m_dispatcher1->freeCollisionAlgorithm(colAlgo); } }