dgFloat32 dgCollisionInstance::ConvexRayCast (const dgCollisionInstance* const convexShape, const dgMatrix& convexShapeMatrix, const dgVector& localVeloc, dgFloat32 minT, dgContactPoint& contactOut, OnRayPrecastAction preFilter, const dgBody* const referenceBody, void* const userData, dgInt32 threadId) const { dgFloat32 t = dgFloat32 (1.2f); if ((GetCollisionPrimityType() != m_nullCollision) && (!preFilter || preFilter(referenceBody, this, userData))) { t = m_childShape->ConvexRayCast (convexShape, convexShapeMatrix, localVeloc, minT, contactOut, referenceBody, this, userData, threadId); if (t <= minT) { if (!(m_childShape->IsType(dgCollision::dgCollisionMesh_RTTI) || m_childShape->IsType(dgCollision::dgCollisionCompound_RTTI))) { contactOut.m_shapeId0 = GetUserDataID(); //contactOut.m_shapeId1 = GetUserDataID(); contactOut.m_shapeId1 = convexShape->GetUserDataID(); } contactOut.m_collision0 = this; //contactOut.m_collision1 = this; contactOut.m_collision1 = convexShape; } } return t; }
dgFloat32 dgCollisionInstance::RayCast (const dgVector& localP0, const dgVector& localP1, dgFloat32 maxT, dgContactPoint& contactOut, OnRayPrecastAction preFilter, const dgBody* const body, void* const userData) const { if (!preFilter || preFilter(body, this, userData)) { switch(m_scaleType) { case m_unit: { dgFloat32 t = m_childShape->RayCast (localP0, localP1, maxT, contactOut, body, userData, preFilter); if (t <= maxT) { if (!(m_childShape->IsType(dgCollision::dgCollisionMesh_RTTI) || m_childShape->IsType(dgCollision::dgCollisionCompound_RTTI))) { contactOut.m_shapeId0 = GetUserDataID(); contactOut.m_shapeId1 = GetUserDataID(); } if (!m_childShape->IsType(dgCollision::dgCollisionCompound_RTTI)) { contactOut.m_collision0 = this; contactOut.m_collision1 = this; } } return t; } case m_uniform: { dgVector p0 (localP0 * m_invScale); dgVector p1 (localP1 * m_invScale); dgFloat32 t = m_childShape->RayCast (p0, p1, maxT, contactOut, body, userData, preFilter); if (t <= maxT) { if (!(m_childShape->IsType(dgCollision::dgCollisionMesh_RTTI) || m_childShape->IsType(dgCollision::dgCollisionCompound_RTTI))) { contactOut.m_shapeId0 = GetUserDataID(); contactOut.m_shapeId1 = GetUserDataID(); } if (!m_childShape->IsType(dgCollision::dgCollisionCompound_RTTI)) { contactOut.m_collision0 = this; contactOut.m_collision1 = this; } } return t; } case m_nonUniform: { dgVector p0 (localP0 * m_invScale); dgVector p1 (localP1 * m_invScale); dgFloat32 t = m_childShape->RayCast (p0, p1, maxT, contactOut, body, userData, preFilter); if (t <= maxT) { if (!(m_childShape->IsType(dgCollision::dgCollisionMesh_RTTI) || m_childShape->IsType(dgCollision::dgCollisionCompound_RTTI))) { contactOut.m_shapeId0 = GetUserDataID(); contactOut.m_shapeId1 = GetUserDataID(); dgVector n (m_invScale * contactOut.m_normal); contactOut.m_normal = n.Normalize(); } if (!m_childShape->IsType(dgCollision::dgCollisionCompound_RTTI)) { contactOut.m_collision0 = this; contactOut.m_collision1 = this; } } return t; } case m_global: default: { dgVector p0 (m_aligmentMatrix.UntransformVector (localP0 * m_invScale)); dgVector p1 (m_aligmentMatrix.UntransformVector (localP1 * m_invScale)); dgFloat32 t = m_childShape->RayCast (p0, p1, maxT, contactOut, body, userData, preFilter); if (t <= maxT) { if (!(m_childShape->IsType(dgCollision::dgCollisionMesh_RTTI) || m_childShape->IsType(dgCollision::dgCollisionCompound_RTTI))) { contactOut.m_shapeId0 = GetUserDataID(); contactOut.m_shapeId1 = GetUserDataID(); dgVector n (m_aligmentMatrix.RotateVector(m_invScale * contactOut.m_normal)); contactOut.m_normal = n.Normalize(); } if (!(m_childShape->IsType(dgCollision::dgCollisionCompound_RTTI))) { contactOut.m_collision0 = this; contactOut.m_collision1 = this; } } return t; } } } return dgFloat32 (1.2f); }