void PhysicsWorld::ConvexCast(PhysicsRaycastResult& result, CollisionShape* shape, const Vector3& startPos, const Quaternion& startRot, const Vector3& endPos, const Quaternion& endRot, unsigned collisionMask) { if (!shape || !shape->GetCollisionShape()) { LOGERROR("Null collision shape for convex cast"); result.body_ = 0; result.position_ = Vector3::ZERO; result.normal_ = Vector3::ZERO; result.distance_ = M_INFINITY; return; } // If shape is attached in a rigidbody, set its collision group temporarily to 0 to make sure it is not returned in the sweep result RigidBody* bodyComp = shape->GetComponent<RigidBody>(); btRigidBody* body = bodyComp ? bodyComp->GetBody() : (btRigidBody*)0; btBroadphaseProxy* proxy = body ? body->getBroadphaseProxy() : (btBroadphaseProxy*)0; short group = 0; if (proxy) { group = proxy->m_collisionFilterGroup; proxy->m_collisionFilterGroup = 0; } ConvexCast(result, shape->GetCollisionShape(), startPos, startRot, endPos, endRot, collisionMask); // Restore the collision group if (proxy) proxy->m_collisionFilterGroup = group; }
void PhysicsWorld::ConvexCast(PhysicsRaycastResult& result, CollisionShape* shape, const Vector3& startPos, const Quaternion& startRot, const Vector3& endPos, const Quaternion& endRot, unsigned collisionMask) { if (!shape || !shape->GetCollisionShape()) { ATOMIC_LOGERROR("Null collision shape for convex cast"); result.body_ = 0; result.position_ = Vector3::ZERO; result.normal_ = Vector3::ZERO; result.distance_ = M_INFINITY; result.hitFraction_ = 0.0f; return; } // If shape is attached in a rigidbody, set its collision group temporarily to 0 to make sure it is not returned in the sweep result RigidBody* bodyComp = shape->GetComponent<RigidBody>(); btRigidBody* body = bodyComp ? bodyComp->GetBody() : (btRigidBody*)0; btBroadphaseProxy* proxy = body ? body->getBroadphaseProxy() : (btBroadphaseProxy*)0; short group = 0; if (proxy) { group = proxy->m_collisionFilterGroup; proxy->m_collisionFilterGroup = 0; } // Take the shape's offset position & rotation into account Node* shapeNode = shape->GetNode(); Matrix3x4 startTransform(startPos, startRot, shapeNode ? shapeNode->GetWorldScale() : Vector3::ONE); Matrix3x4 endTransform(endPos, endRot, shapeNode ? shapeNode->GetWorldScale() : Vector3::ONE); Vector3 effectiveStartPos = startTransform * shape->GetPosition(); Vector3 effectiveEndPos = endTransform * shape->GetPosition(); Quaternion effectiveStartRot = startRot * shape->GetRotation(); Quaternion effectiveEndRot = endRot * shape->GetRotation(); ConvexCast(result, shape->GetCollisionShape(), effectiveStartPos, effectiveStartRot, effectiveEndPos, effectiveEndRot, collisionMask); // Restore the collision group if (proxy) proxy->m_collisionFilterGroup = group; }