Code: Select all
bool BphysicsManager::rayHasHit(glm::vec3& rayFromWorld, glm::vec3& rayToWorld, btVector3* hitPointWorld, btRigidBody** body)
{
mMutex->lock();
bool ret;
rayFrom.setX(rayFromWorld.x);
rayFrom.setY(rayFromWorld.y);
rayFrom.setZ(rayFromWorld.z);
rayTo.setX(rayToWorld.x);
rayTo.setY(rayToWorld.y);
rayTo.setZ(rayToWorld.z);
btCollisionWorld::ClosestRayResultCallback rayCallback(rayFrom, rayTo);
mpDynamicsWorld->rayTest(rayFrom, rayTo, rayCallback);
if (rayCallback.m_collisionObject)
{
*body = (btRigidBody*)btRigidBody::upcast(rayCallback.m_collisionObject);
*hitPointWorld = rayCallback.m_hitPointWorld;
auto colShape = (*body)->getCollisionShape();
if (dynamic_cast<btConcaveShape*>(colShape) != nullptr)
{
*body = nullptr;
}
}
ret = rayCallback.hasHit();
mMutex->unlock();
return ret;
}