forked from mirror/openmw-tes3mp
Fix projectiles colliding with dead actors (Fixes #1971)
This commit is contained in:
parent
c4fa671381
commit
d790506525
3 changed files with 12 additions and 10 deletions
|
@ -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<std::pair<float, std::string> > collisions = mPhysEngine.rayTest2(from, to);
|
||||
|
||||
std::vector<std::pair<float, std::string> > collisions = mPhysEngine.rayTest2(from, to, OEngine::Physic::CollisionType_Projectile);
|
||||
bool hit=false;
|
||||
|
||||
for (std::vector<std::pair<float, std::string> >::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<std::pair<float, std::string> > collisions = mPhysEngine.rayTest2(from, to);
|
||||
std::vector<std::pair<float, std::string> > collisions = mPhysEngine.rayTest2(from, to, OEngine::Physic::CollisionType_Projectile);
|
||||
bool hit=false;
|
||||
|
||||
for (std::vector<std::pair<float, std::string> >::iterator cIt = collisions.begin(); cIt != collisions.end() && !hit; ++cIt)
|
||||
|
|
|
@ -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<float, std::string> > PhysicEngine::rayTest2(const btVector3& from, const btVector3& to)
|
||||
std::vector< std::pair<float, std::string> > 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<float, const btCollisionObject*> > results = resultCallback1.results;
|
||||
|
|
|
@ -46,7 +46,8 @@ namespace Physic
|
|||
CollisionType_World = 1<<0, //<Collide with world objects
|
||||
CollisionType_Actor = 1<<1, //<Collide sith actors
|
||||
CollisionType_HeightMap = 1<<2, //<collide with heightmap
|
||||
CollisionType_Raycasting = 1<<3 //Still used?
|
||||
CollisionType_Raycasting = 1<<3,
|
||||
CollisionType_Projectile = 1<<4
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -288,7 +289,7 @@ namespace Physic
|
|||
/**
|
||||
* Return all objects hit by a ray.
|
||||
*/
|
||||
std::vector< std::pair<float, std::string> > rayTest2(const btVector3 &from, const btVector3 &to);
|
||||
std::vector< std::pair<float, std::string> > rayTest2(const btVector3 &from, const btVector3 &to, int filterGroup=0xff);
|
||||
|
||||
std::pair<bool, float> sphereCast (float radius, btVector3& from, btVector3& to);
|
||||
///< @return (hit, relative distance)
|
||||
|
|
Loading…
Reference in a new issue