diff --git a/libraries/physics/src/CharacterController.cpp b/libraries/physics/src/CharacterController.cpp index 15f9e88aff..8e96d256b7 100755 --- a/libraries/physics/src/CharacterController.cpp +++ b/libraries/physics/src/CharacterController.cpp @@ -65,129 +65,6 @@ bool applyPairwiseFilter(btManifoldPoint& cp, return false; } -// Note: flipBackfaceTriangleNormals is registered as a sub-callback to Bullet's gContactAddedCallback feature -// when we detect MyAvatar is "stuck". It will reverse the triangles on the backface of mesh shapes, unless it thinks -// the old normal would be better at extracting MyAvatar out along its UP direction. -// -// KEEP THIS: flipBackfaceTriangleNormals is NOT USED, but KEEP THIS implemenation in case we want to use it. -bool flipBackfaceTriangleNormals(btManifoldPoint& cp, - const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, - const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1) { - static int32_t numCalls = 0; - ++numCalls; - // This callback is ONLY called on objects with btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK flag - // and the flagged object will always be sorted to Obj0. Hence the "other" is always Obj1. - const btCollisionObject* other = colObj1Wrap->m_collisionObject; - - if (other->getCollisionShape()->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) { - // access the meshInterface - auto meshShape = static_cast(other->getCollisionShape()); - const btStridingMeshInterface* meshInterface = meshShape->getMeshInterface(); - - // figure out about how to navigate meshInterface - const uint8_t* vertexBase; - int32_t numverts; - PHY_ScalarType vertexType; - int32_t vertexStride; - const uint8_t* indexBase; - int32_t indexStride; - int32_t numFaces; - PHY_ScalarType indicesType; - int32_t subPart = colObj1Wrap->m_partId; - // NOTE: all arguments are being passed by reference except the bases (passed by pointer) and subPart (true input) - meshInterface->getLockedReadOnlyVertexIndexBase(&vertexBase, numverts, vertexType, vertexStride, &indexBase, indexStride, numFaces, indicesType, subPart); - - // fetch the triangle vertices - int32_t triangleIndex = colObj1Wrap->m_index; - assert(vertexType == PHY_FLOAT); // all mesh vertex data is float... - // ...but indicesType can vary - btVector3 triangleVertex[3]; - switch (indicesType) { - case PHY_INTEGER: { - uint32_t* triangleIndices = (uint32_t*)(indexBase + triangleIndex * indexStride); - float* triangleBase; - triangleBase = (float*)(vertexBase + triangleIndices[0] * vertexStride); - triangleVertex[0].setValue(triangleBase[0], triangleBase[1], triangleBase[2]); - triangleBase = (float*)(vertexBase + triangleIndices[1] * vertexStride); - triangleVertex[1].setValue(triangleBase[0], triangleBase[1], triangleBase[2]); - triangleBase = (float*)(vertexBase + triangleIndices[2] * vertexStride); - triangleVertex[2].setValue(triangleBase[0], triangleBase[1], triangleBase[2]); - } - break; - case PHY_SHORT: { - uint16_t* triangleIndices = (uint16_t*)(indexBase + triangleIndex * indexStride); - float* triangleBase; - triangleBase = (float*)(vertexBase + triangleIndices[0] * vertexStride); - triangleVertex[0].setValue(triangleBase[0], triangleBase[1], triangleBase[2]); - triangleBase = (float*)(vertexBase + triangleIndices[1] * vertexStride); - triangleVertex[1].setValue(triangleBase[0], triangleBase[1], triangleBase[2]); - triangleBase = (float*)(vertexBase + triangleIndices[2] * vertexStride); - triangleVertex[2].setValue(triangleBase[0], triangleBase[1], triangleBase[2]); - } - break; - case PHY_UCHAR: { - uint8_t* triangleIndices = (uint8_t*)(indexBase + triangleIndex * indexStride); - float* triangleBase; - triangleBase = (float*)(vertexBase + triangleIndices[0] * vertexStride); - triangleVertex[0].setValue(triangleBase[0], triangleBase[1], triangleBase[2]); - triangleBase = (float*)(vertexBase + triangleIndices[1] * vertexStride); - triangleVertex[1].setValue(triangleBase[0], triangleBase[1], triangleBase[2]); - triangleBase = (float*)(vertexBase + triangleIndices[2] * vertexStride); - triangleVertex[2].setValue(triangleBase[0], triangleBase[1], triangleBase[2]); - } - break; - default: - return false; - } - - // compute faceNormal - btVector3 meshScaling = meshInterface->getScaling(); - triangleVertex[0] *= meshScaling; - triangleVertex[1] *= meshScaling; - triangleVertex[2] *= meshScaling; - btVector3 faceNormal = other->getWorldTransform().getBasis() * btCross(triangleVertex[1] - triangleVertex[0], triangleVertex[2] - triangleVertex[0]); - float nDotF = btDot(faceNormal, cp.m_normalWorldOnB); - if (nDotF <= 0.0f && faceNormal.length2() > EPSILON) { - faceNormal.normalize(); - // flip the contact normal to be aligned with the face normal... - // ...but only if old normal does NOT point along obj0's UP - // (because we're "stuck" and UP is the likely path out) - btVector3 up = colObj0Wrap->m_collisionObject->getWorldTransform().getBasis() * LOCAL_UP_AXIS; - if (cp.m_normalWorldOnB.dot(up) <= 0.0f) { - nDotF = btDot(faceNormal, cp.m_normalWorldOnB); - cp.m_normalWorldOnB -= 2.0f * nDotF * faceNormal; - _appliedStuckRecoveryStrategy = true; - } - // Note: if we're flipping normals it means the "Are we stuck?" logic is concluding "Yes, we are". - // But when we flip the normals it typically causes the ContactManifold to discard the modified ManifoldPoint - // which in turn causes the "Are we stuck?" logic to incorrectly conclude "No, we are not". - // So we set '_appliedStuckRecoveryStrategy = true' here and use it later to stay in "stuck" state - // until flipping stops - } - } - - // KEEP THIS: in case we add support for concave shapes which delegate to temporary btTriangleShapes (such as btHeightfieldTerrainShape) - //else if (other->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE) { - // auto triShape = static_cast(other->getCollisionShape()); - // const btVector3* v = triShape->m_vertices1; - // btVector3 faceNormal = other->getWorldTransform().getBasis() * btCross(v[1] - v[0], v[2] - v[0]); - // float nDotF = btDot(faceNormal, cp.m_normalWorldOnB); - // if (nDotF <= 0.0f && faceNormal.length2() > EPSILON) { - // faceNormal.normalize(); - // // flip the contact normal to be aligned with the face normal - // cp.m_normalWorldOnB += -2.0f * nDotF * faceNormal; - // } - //} - // KEEP THIS - - // NOTE: this ManifoldPoint is a candidate and hasn't been accepted yet into the final ContactManifold yet. - // So when we modify its parameters we can convince Bullet to discard it. - // - // by our own convention: - // return true when this ManifoldPoint has been modified in a way that would disable it - return false; -} - #ifdef DEBUG_STATE_CHANGE #define SET_STATE(desiredState, reason) setState(desiredState, reason) #else