From d7905065251335e1d09e936bb50d2a055e23962b Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 5 Oct 2014 17:41:56 +0200 Subject: [PATCH] Fix projectiles colliding with dead actors (Fixes #1971) --- apps/openmw/mwworld/projectilemanager.cpp | 5 +++-- libs/openengine/bullet/physic.cpp | 12 ++++++------ libs/openengine/bullet/physic.hpp | 5 +++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwworld/projectilemanager.cpp b/apps/openmw/mwworld/projectilemanager.cpp index 34bf3e05d..afda6fe60 100644 --- a/apps/openmw/mwworld/projectilemanager.cpp +++ b/apps/openmw/mwworld/projectilemanager.cpp @@ -164,7 +164,8 @@ namespace MWWorld // TODO: use a proper btRigidBody / btGhostObject? btVector3 from(pos.x, pos.y, pos.z); btVector3 to(newPos.x, newPos.y, newPos.z); - std::vector > collisions = mPhysEngine.rayTest2(from, to); + + std::vector > collisions = mPhysEngine.rayTest2(from, to, OEngine::Physic::CollisionType_Projectile); bool hit=false; for (std::vector >::iterator cIt = collisions.begin(); cIt != collisions.end() && !hit; ++cIt) @@ -240,7 +241,7 @@ namespace MWWorld // TODO: use a proper btRigidBody / btGhostObject? btVector3 from(pos.x, pos.y, pos.z); btVector3 to(newPos.x, newPos.y, newPos.z); - std::vector > collisions = mPhysEngine.rayTest2(from, to); + std::vector > collisions = mPhysEngine.rayTest2(from, to, OEngine::Physic::CollisionType_Projectile); bool hit=false; for (std::vector >::iterator cIt = collisions.begin(); cIt != collisions.end() && !hit; ++cIt) diff --git a/libs/openengine/bullet/physic.cpp b/libs/openengine/bullet/physic.cpp index b4d5e49a5..f7c18048e 100644 --- a/libs/openengine/bullet/physic.cpp +++ b/libs/openengine/bullet/physic.cpp @@ -104,7 +104,7 @@ namespace Physic setRotation(rotation); mEngine->mDynamicsWorld->addRigidBody(mBody, CollisionType_Actor, - CollisionType_Actor|CollisionType_World|CollisionType_HeightMap); + CollisionType_Actor|CollisionType_World|CollisionType_HeightMap|CollisionType_Projectile); } PhysicActor::~PhysicActor() @@ -189,7 +189,7 @@ namespace Physic { mEngine->mDynamicsWorld->removeRigidBody(mBody); mEngine->mDynamicsWorld->addRigidBody(mBody, CollisionType_Actor, - CollisionType_Actor|CollisionType_World|CollisionType_HeightMap); + CollisionType_Actor|CollisionType_World|CollisionType_HeightMap|CollisionType_Projectile); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -381,7 +381,7 @@ namespace Physic mHeightFieldMap [name] = hf; mDynamicsWorld->addRigidBody(body,CollisionType_HeightMap, - CollisionType_Actor|CollisionType_Raycasting); + CollisionType_Actor|CollisionType_Raycasting|CollisionType_Projectile); } void PhysicEngine::removeHeightField(int x, int y) @@ -494,7 +494,7 @@ namespace Physic { assert (mRaycastingObjectMap.find(name) == mRaycastingObjectMap.end()); mRaycastingObjectMap[name] = body; - mDynamicsWorld->addRigidBody(body,CollisionType_Raycasting,CollisionType_Raycasting); + mDynamicsWorld->addRigidBody(body,CollisionType_Raycasting,CollisionType_Raycasting|CollisionType_Projectile); } return body; @@ -800,10 +800,10 @@ namespace Physic return std::make_pair(false, 1); } - std::vector< std::pair > PhysicEngine::rayTest2(const btVector3& from, const btVector3& to) + std::vector< std::pair > PhysicEngine::rayTest2(const btVector3& from, const btVector3& to, int filterGroup) { MyRayResultCallback resultCallback1; - resultCallback1.m_collisionFilterGroup = 0xff; + resultCallback1.m_collisionFilterGroup = filterGroup; resultCallback1.m_collisionFilterMask = CollisionType_Raycasting|CollisionType_Actor|CollisionType_HeightMap; mDynamicsWorld->rayTest(from, to, resultCallback1); std::vector< std::pair > results = resultCallback1.results; diff --git a/libs/openengine/bullet/physic.hpp b/libs/openengine/bullet/physic.hpp index 0d280c4fe..ff799af50 100644 --- a/libs/openengine/bullet/physic.hpp +++ b/libs/openengine/bullet/physic.hpp @@ -46,7 +46,8 @@ namespace Physic CollisionType_World = 1<<0, // > rayTest2(const btVector3 &from, const btVector3 &to); + std::vector< std::pair > rayTest2(const btVector3 &from, const btVector3 &to, int filterGroup=0xff); std::pair sphereCast (float radius, btVector3& from, btVector3& to); ///< @return (hit, relative distance)