| 261 | | RayCastResult rayCastQuery(_maxDistance, _visitor); |
| 262 | | btDiscreteDynamicsWorldRayCast(m_pZone, _ray.getOrigin().m_array, endpoint.m_array, rayCastFilter, &rayCastQuery, rayCastPrefilter); |
| 263 | | } |
| 264 | | |
| 265 | | //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ |
| 266 | | //implement a ray cast filter |
| 267 | | Zen::Math::Real |
| 268 | | PhysicsZone::rayCastFilter(const btRigidBody* _pBody, const Zen::Math::Real* _pNormal, int _collisionID, void* _pUserData, Zen::Math::Real _intersectDistance) |
| 269 | | { |
| 270 | | PhysicsZone::RayCastResult* pCastquery = static_cast<PhysicsZone::RayCastResult*>(_pUserData); |
| 271 | | PhysicsActor* pRawPhysicsActor = static_cast<PhysicsActor*>(_pBody->getUserPointer()); |
| 272 | | assert(pCastquery != NULL); |
| 273 | | assert(pRawPhysicsActor != NULL); |
| 274 | | |
| 275 | | Math::Vector3 normal( |
| 276 | | static_cast<const Math::Real*>(_pNormal) |
| 277 | | ); |
| 278 | | |
| 279 | | return (pCastquery->m_visitor.visit( |
| 280 | | pRawPhysicsActor->getSelfReference().lock(), |
| 281 | | normal, |
| 282 | | (Math::Real)_intersectDistance * pCastquery->m_distance |
| 283 | | )) ? 1.0f : 0.0f; |
| 284 | | } |
| 285 | | //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ |
| 286 | | //newton 1.53 Tutorial_06_UtilityFuntionality says: |
| 287 | | // implement a ray cast pre-filter |
| 288 | | unsigned int |
| 289 | | PhysicsZone::rayCastPrefilter(const btRigidBody* _pBody, const btCollisionShape* _pCollision, void* _pUserData) |
| 290 | | { |
| 291 | | PhysicsZone::RayCastResult* pCastquery = static_cast<PhysicsZone::RayCastResult*>(_pUserData); |
| 292 | | PhysicsActor* pRawPhysicsActor = static_cast<PhysicsActor*>(_pBody->getUserPointer()); |
| 293 | | assert(pCastquery != NULL); |
| 294 | | assert(pRawPhysicsActor != NULL); |
| 295 | | |
| 296 | | Math::Point3 position; |
| 297 | | position = pRawPhysicsActor->getPosition(); |
| 298 | | |
| 299 | | return (pCastquery->m_visitor.filter(pRawPhysicsActor->getSelfReference().lock())) ? 1 : 0; |
| | 261 | //(m_pZone, _ray.getOrigin().m_array, endpoint.m_array, rayCastFilter, &rayCastQuery, rayCastPrefilter); |
| | 262 | |
| | 263 | btVector3 tquatFrom = btVector3(_ray.getOrigin().m_x,_ray.getOrigin().m_y,_ray.getOrigin().m_z); |
| | 264 | btVector3 tquatTo = btVector3(_ray.getOrigin().m_x,_ray.getOrigin().m_y,_ray.getOrigin().m_z); |
| | 265 | |
| | 266 | RayResultCallback resultCallback(tquatFrom,tquatTo); |
| | 267 | |
| | 268 | m_pZone->rayTest(tquatFrom,tquatTo,resultCallback); |
| | 269 | } |
| | 270 | |
| | 271 | //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ |
| | 272 | float |
| | 273 | PhysicsZone::RayResultCallback::addSingleResult(btCollisionWorld::LocalRayResult& _rayResult,bool _normalInWorldSpace) |
| | 274 | { |
| | 275 | //caller already does the filter on the m_closestHitFraction |
| | 276 | btAssert(_rayResult.m_hitFraction <= m_closestHitFraction); |
| | 277 | |
| | 278 | m_closestHitFraction = _rayResult.m_hitFraction; |
| | 279 | m_collisionObject = _rayResult.m_collisionObject; |
| | 280 | if (_normalInWorldSpace) |
| | 281 | { |
| | 282 | m_hitNormalWorld = _rayResult.m_hitNormalLocal; |
| | 283 | } else |
| | 284 | { |
| | 285 | ///need to transform normal into worldspace |
| | 286 | m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*_rayResult.m_hitNormalLocal; |
| | 287 | } |
| | 288 | m_hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,_rayResult.m_hitFraction); |
| | 289 | |
| | 290 | PhysicsZone::RayCastResult* pCastquery; |
| | 291 | PhysicsActor* pRawPhysicsActor = static_cast<PhysicsActor*>(m_collisionObject->getUserPointer()); |
| | 292 | |
| | 293 | pCastquery->m_distance = m_closestHitFraction; |
| | 294 | |
| | 295 | Math::Vector3 normal = Math::Vector3(m_hitNormalWorld.getX(),m_hitNormalWorld.getY(),m_hitNormalWorld.getZ()); |
| | 296 | if (pCastquery->m_visitor.filter(pRawPhysicsActor->getSelfReference().lock())) |
| | 297 | { |
| | 298 | return (pCastquery->m_visitor.visit( |
| | 299 | pRawPhysicsActor->getSelfReference().lock(), |
| | 300 | normal, |
| | 301 | pCastquery->m_distance |
| | 302 | )) ? 1.0f : 0.0f; |
| | 303 | } |
| | 304 | |
| | 305 | return 1.f; |