mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-27 03:40:24 +00:00
Separate ClosestNotMeRayResultCallback
This commit is contained in:
parent
ce588fb39c
commit
c94cd775bf
3 changed files with 59 additions and 29 deletions
34
apps/openmw/mwphysics/closestnotmerayresultcallback.cpp
Normal file
34
apps/openmw/mwphysics/closestnotmerayresultcallback.cpp
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#include "closestnotmerayresultcallback.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <BulletCollision/CollisionDispatch/btCollisionObject.h>
|
||||||
|
|
||||||
|
#include "../mwworld/class.hpp"
|
||||||
|
|
||||||
|
#include "ptrholder.hpp"
|
||||||
|
|
||||||
|
namespace MWPhysics
|
||||||
|
{
|
||||||
|
ClosestNotMeRayResultCallback::ClosestNotMeRayResultCallback(const btCollisionObject* me, const std::vector<const btCollisionObject*>& targets, const btVector3& from, const btVector3& to)
|
||||||
|
: btCollisionWorld::ClosestRayResultCallback(from, to)
|
||||||
|
, mMe(me), mTargets(targets)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
btScalar ClosestNotMeRayResultCallback::addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace)
|
||||||
|
{
|
||||||
|
if (rayResult.m_collisionObject == mMe)
|
||||||
|
return 1.f;
|
||||||
|
if (!mTargets.empty())
|
||||||
|
{
|
||||||
|
if ((std::find(mTargets.begin(), mTargets.end(), rayResult.m_collisionObject) == mTargets.end()))
|
||||||
|
{
|
||||||
|
PtrHolder* holder = static_cast<PtrHolder*>(rayResult.m_collisionObject->getUserPointer());
|
||||||
|
if (holder && !holder->getPtr().isEmpty() && holder->getPtr().getClass().isActor())
|
||||||
|
return 1.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return btCollisionWorld::ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace);
|
||||||
|
}
|
||||||
|
}
|
24
apps/openmw/mwphysics/closestnotmerayresultcallback.hpp
Normal file
24
apps/openmw/mwphysics/closestnotmerayresultcallback.hpp
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#ifndef OPENMW_MWPHYSICS_CLOSESTNOTMERAYRESULTCALLBACK_H
|
||||||
|
#define OPENMW_MWPHYSICS_CLOSESTNOTMERAYRESULTCALLBACK_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
|
||||||
|
|
||||||
|
class btCollisionObject;
|
||||||
|
|
||||||
|
namespace MWPhysics
|
||||||
|
{
|
||||||
|
class ClosestNotMeRayResultCallback : public btCollisionWorld::ClosestRayResultCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ClosestNotMeRayResultCallback(const btCollisionObject* me, const std::vector<const btCollisionObject*>& targets, const btVector3& from, const btVector3& to);
|
||||||
|
|
||||||
|
virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace);
|
||||||
|
private:
|
||||||
|
const btCollisionObject* mMe;
|
||||||
|
const std::vector<const btCollisionObject*> mTargets;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -47,6 +47,7 @@
|
||||||
#include "heightfield.hpp"
|
#include "heightfield.hpp"
|
||||||
#include "hasspherecollisioncallback.hpp"
|
#include "hasspherecollisioncallback.hpp"
|
||||||
#include "deepestnotmecontacttestresultcallback.hpp"
|
#include "deepestnotmecontacttestresultcallback.hpp"
|
||||||
|
#include "closestnotmerayresultcallback.hpp"
|
||||||
|
|
||||||
namespace MWPhysics
|
namespace MWPhysics
|
||||||
{
|
{
|
||||||
|
@ -737,35 +738,6 @@ namespace MWPhysics
|
||||||
return (point - Misc::Convert::toOsg(cb.m_hitPointWorld)).length();
|
return (point - Misc::Convert::toOsg(cb.m_hitPointWorld)).length();
|
||||||
}
|
}
|
||||||
|
|
||||||
class ClosestNotMeRayResultCallback : public btCollisionWorld::ClosestRayResultCallback
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ClosestNotMeRayResultCallback(const btCollisionObject* me, const std::vector<const btCollisionObject*>& targets, const btVector3& from, const btVector3& to)
|
|
||||||
: btCollisionWorld::ClosestRayResultCallback(from, to)
|
|
||||||
, mMe(me), mTargets(targets)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace)
|
|
||||||
{
|
|
||||||
if (rayResult.m_collisionObject == mMe)
|
|
||||||
return 1.f;
|
|
||||||
if (!mTargets.empty())
|
|
||||||
{
|
|
||||||
if ((std::find(mTargets.begin(), mTargets.end(), rayResult.m_collisionObject) == mTargets.end()))
|
|
||||||
{
|
|
||||||
PtrHolder* holder = static_cast<PtrHolder*>(rayResult.m_collisionObject->getUserPointer());
|
|
||||||
if (holder && !holder->getPtr().isEmpty() && holder->getPtr().getClass().isActor())
|
|
||||||
return 1.f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return btCollisionWorld::ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace);
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
const btCollisionObject* mMe;
|
|
||||||
const std::vector<const btCollisionObject*> mTargets;
|
|
||||||
};
|
|
||||||
|
|
||||||
PhysicsSystem::RayResult PhysicsSystem::castRay(const osg::Vec3f &from, const osg::Vec3f &to, const MWWorld::ConstPtr& ignore, std::vector<MWWorld::Ptr> targets, int mask, int group) const
|
PhysicsSystem::RayResult PhysicsSystem::castRay(const osg::Vec3f &from, const osg::Vec3f &to, const MWWorld::ConstPtr& ignore, std::vector<MWWorld::Ptr> targets, int mask, int group) const
|
||||||
{
|
{
|
||||||
btVector3 btFrom = Misc::Convert::toBullet(from);
|
btVector3 btFrom = Misc::Convert::toBullet(from);
|
||||||
|
|
Loading…
Reference in a new issue