Changeset 3358

Show
Ignore:
Timestamp:
02/02/10 12:29:21 (7 months ago)
Author:
Azaezel
Message:

crosscheck likely needed: implements raycasts

Location:
plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsZone.cpp

    r3347 r3358  
    249249 
    250250//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
    251 //see http://www.newtondynamics.com/wiki/index.php5?title=btDiscreteDynamicsWorldRayCast 
     251//see http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=4152&hilit=raytest 
    252252//for reference 
    253253void  
     
    259259    Math::Point3 endpoint = _ray.getOrigin() + offset; 
    260260 
    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//-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ 
     272float 
     273PhysicsZone::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; 
    300306} 
    301307 
  • plugins/branches/0185_GEN_PHYSICS_REFACTOR_2/ZBullet/src/PhysicsZone.hpp

    r3342 r3358  
    144144    /// @{ 
    145145public: 
    146 private: 
    147     static Zen::Math::Real rayCastFilter(const btRigidBody* _pBody, const Zen::Math::Real* _pNormal, int _collisionId, void* _pUserData, Zen::Math::Real _intersectDistance); 
    148     static unsigned int rayCastPrefilter(const btRigidBody* _pBody, const btCollisionShape* _pCollision, void* _pUserData); 
    149146    /// @} 
    150147 
     
    155152    virtual ~PhysicsZone(); 
    156153    /// @} 
     154        struct  RayResultCallback : public btCollisionWorld::RayResultCallback 
     155        { 
     156                RayResultCallback(const btVector3&      _rayFromWorld,const btVector3&  _rayToWorld) 
     157                :m_rayFromWorld(_rayFromWorld), 
     158                m_rayToWorld(_rayToWorld) 
     159                { 
     160                } 
     161 
     162                btVector3       m_rayFromWorld;//used to calculate hitPointWorld from hitFraction 
     163                btVector3       m_rayToWorld; 
     164 
     165                btVector3       m_hitNormalWorld; 
     166                btVector3       m_hitPointWorld; 
     167         
     168                virtual btScalar        addSingleResult(btCollisionWorld::LocalRayResult& _rayResult,bool _normalInWorldSpace); 
     169        }; 
     170 
    157171 
    158172    /// @name Member Variables