diff --git a/source/game/BaseTool.cpp b/source/game/BaseTool.cpp index 4bf444a1fdc43118dff3c7b616056b4af07fd12e..708d1a287278bfe445ef99366f94b422b20ca60e 100644 --- a/source/game/BaseTool.cpp +++ b/source/game/BaseTool.cpp @@ -60,6 +60,31 @@ END_PROPTABLE() REGISTER_ENTITY_NOLISTING(CBaseTool, base_tool); + +class btKinematicClosestNotMeRayResultCallback: public btCollisionWorld::ClosestRayResultCallback +{ +public: + btKinematicClosestNotMeRayResultCallback(btCollisionObject* me, const btVector3& rayFromWorld, const btVector3& rayToWorld): btCollisionWorld::ClosestRayResultCallback(rayFromWorld, rayToWorld) + { + m_me = me; + m_shapeInfo = {-1, -1}; + } + + virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace) + { + if(rayResult.m_collisionObject == m_me) + return 1.0; + if(rayResult.m_localShapeInfo) + { + m_shapeInfo = *rayResult.m_localShapeInfo; + } + return ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace); + } + btCollisionWorld::LocalShapeInfo m_shapeInfo; +protected: + btCollisionObject* m_me; +}; + CBaseTool::CBaseTool(CEntityManager * pMgr): BaseClass(pMgr), m_bInPrimaryAction(false), @@ -248,7 +273,7 @@ void CBaseTool::_update(float dt) float3 start = m_pParent->getPos(); float3 dir = m_pParent->getOrient() * float3(0.0f, 0.0f, 1.0f); float3 end = start + dir * m_fCenterLength; - btCollisionWorld::ClosestRayResultCallback cb(F3_BTVEC(start), F3_BTVEC(end)); + btKinematicClosestNotMeRayResultCallback cb(((CBaseCharacter*)m_pOwner)->getBtCollisionObject(), F3_BTVEC(start), F3_BTVEC(end)); SPhysics_GetDynWorld()->rayTest(F3_BTVEC(start), F3_BTVEC(end), cb); m_isClose = cb.hasHit();