diff --git a/panda/src/bullet/bulletAllHitsRayResult.cxx b/panda/src/bullet/bulletAllHitsRayResult.cxx index 2a1bf63b94..953390820e 100644 --- a/panda/src/bullet/bulletAllHitsRayResult.cxx +++ b/panda/src/bullet/bulletAllHitsRayResult.cxx @@ -33,11 +33,6 @@ BulletAllHitsRayResult(const btVector3 &from_pos, const btVector3 &to_pos, const bool BulletAllHitsRayResult:: needsCollision(btBroadphaseProxy* proxy0) const { - // Original implementation: - //bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0; - //collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask); - //return collides; - btCollisionObject *obj0 = (btCollisionObject *) proxy0->m_clientObject; PandaNode *node0 = (PandaNode *) obj0->getUserPointer(); CollideMask mask0 = node0->get_into_collide_mask(); @@ -45,6 +40,28 @@ needsCollision(btBroadphaseProxy* proxy0) const { return (_mask & mask0) != 0; } +//////////////////////////////////////////////////////////////////// +// Function: BulletAllHitsRayResult::addSingleResult +// Access: Protected +// Description: Override default implementation. +//////////////////////////////////////////////////////////////////// +btScalar BulletAllHitsRayResult:: +addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace) { + + // Store part/index information + if (rayResult.m_localShapeInfo) { + _shapePart.push_back(rayResult.m_localShapeInfo->m_shapePart); + _triangleIndex.push_back(rayResult.m_localShapeInfo->m_triangleIndex); + } + else { + _shapePart.push_back(-1); + _triangleIndex.push_back(-1); + } + + // Call the default implementation + return btCollisionWorld::AllHitsRayResultCallback::addSingleResult(rayResult, normalInWorldSpace); +}; + //////////////////////////////////////////////////////////////////// // Function: BulletAllHitsRayResult::get_from_pos // Access: Published @@ -117,6 +134,9 @@ get_hit(int idx) const { hit._pos = m_hitPointWorld[idx]; hit._fraction = m_hitFractions[idx]; + hit._shapePart = _shapePart[idx]; + hit._triangleIndex = _triangleIndex[idx]; + return hit; } @@ -164,3 +184,25 @@ get_hit_normal() const { return btVector3_to_LVector3(_normal); } +//////////////////////////////////////////////////////////////////// +// Function: BulletRayHit::get_shape_part +// Access: Published +// Description: +//////////////////////////////////////////////////////////////////// +int BulletRayHit:: +get_shape_part() const { + + return _shapePart; +} + +//////////////////////////////////////////////////////////////////// +// Function: BulletRayHit::get_triangle_index +// Access: Published +// Description: +//////////////////////////////////////////////////////////////////// +int BulletRayHit:: +get_triangle_index() const { + + return _triangleIndex; +} + diff --git a/panda/src/bullet/bulletAllHitsRayResult.h b/panda/src/bullet/bulletAllHitsRayResult.h index 5a3701f7b9..6825e0ff68 100644 --- a/panda/src/bullet/bulletAllHitsRayResult.h +++ b/panda/src/bullet/bulletAllHitsRayResult.h @@ -38,12 +38,18 @@ PUBLISHED: LVector3 get_hit_normal() const; PN_stdfloat get_hit_fraction() const; + int get_shape_part() const; + int get_triangle_index() const; + private: const btCollisionObject *_object; btVector3 _normal; btVector3 _pos; btScalar _fraction; + int _shapePart; + int _triangleIndex; + friend struct BulletAllHitsRayResult; }; @@ -68,12 +74,16 @@ PUBLISHED: public: virtual bool needsCollision(btBroadphaseProxy* proxy0) const; + virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace); private: BulletAllHitsRayResult(const btVector3 &from_pos, const btVector3 &to_pos, const CollideMask &mask); CollideMask _mask; + btAlignedObjectArray _shapePart; + btAlignedObjectArray _triangleIndex; + friend class BulletWorld; }; diff --git a/panda/src/bullet/bulletClosestHitRayResult.cxx b/panda/src/bullet/bulletClosestHitRayResult.cxx index 4b6d920e79..a1b2910b65 100644 --- a/panda/src/bullet/bulletClosestHitRayResult.cxx +++ b/panda/src/bullet/bulletClosestHitRayResult.cxx @@ -23,6 +23,8 @@ BulletClosestHitRayResult:: BulletClosestHitRayResult(const btVector3 &from_pos, const btVector3 &to_pos, const CollideMask &mask) : btCollisionWorld::ClosestRayResultCallback(from_pos, to_pos), _mask(mask) { + _shapePart = -1; + _triangleIndex = -1; } //////////////////////////////////////////////////////////////////// @@ -33,11 +35,6 @@ BulletClosestHitRayResult(const btVector3 &from_pos, const btVector3 &to_pos, co bool BulletClosestHitRayResult:: needsCollision(btBroadphaseProxy* proxy0) const { - // Original implementation: - //bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0; - //collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask); - //return collides; - btCollisionObject *obj0 = (btCollisionObject *) proxy0->m_clientObject; PandaNode *node0 = (PandaNode *) obj0->getUserPointer(); CollideMask mask0 = node0->get_into_collide_mask(); @@ -45,6 +42,24 @@ needsCollision(btBroadphaseProxy* proxy0) const { return (_mask & mask0) != 0; } +//////////////////////////////////////////////////////////////////// +// Function: BulletAllHitsRayResult::addSingleResult +// Access: Protected +// Description: Override default implementation. +//////////////////////////////////////////////////////////////////// +btScalar BulletClosestHitRayResult:: +addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace) { + + // Store part/index information + if (rayResult.m_localShapeInfo) { + _shapePart = rayResult.m_localShapeInfo->m_shapePart; + _triangleIndex = rayResult.m_localShapeInfo->m_triangleIndex; + } + + // Call the default implementation + return btCollisionWorld::ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace); +}; + //////////////////////////////////////////////////////////////////// // Function: BulletClosestHitRayResult::has_hit // Access: Published @@ -123,3 +138,25 @@ get_to_pos() const { return btVector3_to_LPoint3(m_rayToWorld); } +//////////////////////////////////////////////////////////////////// +// Function: BulletClosestHitRayResult::get_shape_part +// Access: Published +// Description: +//////////////////////////////////////////////////////////////////// +int BulletClosestHitRayResult:: +get_shape_part() const { + + return _shapePart; +} + +//////////////////////////////////////////////////////////////////// +// Function: BulletClosestHitRayResult::get_triangle_index +// Access: Published +// Description: +//////////////////////////////////////////////////////////////////// +int BulletClosestHitRayResult:: +get_triangle_index() const { + + return _triangleIndex; +} + diff --git a/panda/src/bullet/bulletClosestHitRayResult.h b/panda/src/bullet/bulletClosestHitRayResult.h index a6c3f71af9..1a3846ab89 100644 --- a/panda/src/bullet/bulletClosestHitRayResult.h +++ b/panda/src/bullet/bulletClosestHitRayResult.h @@ -43,14 +43,21 @@ PUBLISHED: LVector3 get_hit_normal() const; PN_stdfloat get_hit_fraction() const; + int get_shape_part() const; + int get_triangle_index() const; + public: virtual bool needsCollision(btBroadphaseProxy* proxy0) const; + virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace); private: BulletClosestHitRayResult(const btVector3 &from_pos, const btVector3 &to_pos, const CollideMask &mask); CollideMask _mask; + int _shapePart; + int _triangleIndex; + friend class BulletWorld; };