forked from teamnwah/openmw-tes3coop
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?
|
// TODO: use a proper btRigidBody / btGhostObject?
|
||||||
btVector3 from(pos.x, pos.y, pos.z);
|
btVector3 from(pos.x, pos.y, pos.z);
|
||||||
btVector3 to(newPos.x, newPos.y, newPos.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;
|
bool hit=false;
|
||||||
|
|
||||||
for (std::vector<std::pair<float, std::string> >::iterator cIt = collisions.begin(); cIt != collisions.end() && !hit; ++cIt)
|
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?
|
// TODO: use a proper btRigidBody / btGhostObject?
|
||||||
btVector3 from(pos.x, pos.y, pos.z);
|
btVector3 from(pos.x, pos.y, pos.z);
|
||||||
btVector3 to(newPos.x, newPos.y, newPos.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;
|
bool hit=false;
|
||||||
|
|
||||||
for (std::vector<std::pair<float, std::string> >::iterator cIt = collisions.begin(); cIt != collisions.end() && !hit; ++cIt)
|
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);
|
setRotation(rotation);
|
||||||
|
|
||||||
mEngine->mDynamicsWorld->addRigidBody(mBody, CollisionType_Actor,
|
mEngine->mDynamicsWorld->addRigidBody(mBody, CollisionType_Actor,
|
||||||
CollisionType_Actor|CollisionType_World|CollisionType_HeightMap);
|
CollisionType_Actor|CollisionType_World|CollisionType_HeightMap|CollisionType_Projectile);
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicActor::~PhysicActor()
|
PhysicActor::~PhysicActor()
|
||||||
|
@ -189,7 +189,7 @@ namespace Physic
|
||||||
{
|
{
|
||||||
mEngine->mDynamicsWorld->removeRigidBody(mBody);
|
mEngine->mDynamicsWorld->removeRigidBody(mBody);
|
||||||
mEngine->mDynamicsWorld->addRigidBody(mBody, CollisionType_Actor,
|
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;
|
mHeightFieldMap [name] = hf;
|
||||||
|
|
||||||
mDynamicsWorld->addRigidBody(body,CollisionType_HeightMap,
|
mDynamicsWorld->addRigidBody(body,CollisionType_HeightMap,
|
||||||
CollisionType_Actor|CollisionType_Raycasting);
|
CollisionType_Actor|CollisionType_Raycasting|CollisionType_Projectile);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicEngine::removeHeightField(int x, int y)
|
void PhysicEngine::removeHeightField(int x, int y)
|
||||||
|
@ -494,7 +494,7 @@ namespace Physic
|
||||||
{
|
{
|
||||||
assert (mRaycastingObjectMap.find(name) == mRaycastingObjectMap.end());
|
assert (mRaycastingObjectMap.find(name) == mRaycastingObjectMap.end());
|
||||||
mRaycastingObjectMap[name] = body;
|
mRaycastingObjectMap[name] = body;
|
||||||
mDynamicsWorld->addRigidBody(body,CollisionType_Raycasting,CollisionType_Raycasting);
|
mDynamicsWorld->addRigidBody(body,CollisionType_Raycasting,CollisionType_Raycasting|CollisionType_Projectile);
|
||||||
}
|
}
|
||||||
|
|
||||||
return body;
|
return body;
|
||||||
|
@ -800,10 +800,10 @@ namespace Physic
|
||||||
return std::make_pair(false, 1);
|
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;
|
MyRayResultCallback resultCallback1;
|
||||||
resultCallback1.m_collisionFilterGroup = 0xff;
|
resultCallback1.m_collisionFilterGroup = filterGroup;
|
||||||
resultCallback1.m_collisionFilterMask = CollisionType_Raycasting|CollisionType_Actor|CollisionType_HeightMap;
|
resultCallback1.m_collisionFilterMask = CollisionType_Raycasting|CollisionType_Actor|CollisionType_HeightMap;
|
||||||
mDynamicsWorld->rayTest(from, to, resultCallback1);
|
mDynamicsWorld->rayTest(from, to, resultCallback1);
|
||||||
std::vector< std::pair<float, const btCollisionObject*> > results = resultCallback1.results;
|
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_World = 1<<0, //<Collide with world objects
|
||||||
CollisionType_Actor = 1<<1, //<Collide sith actors
|
CollisionType_Actor = 1<<1, //<Collide sith actors
|
||||||
CollisionType_HeightMap = 1<<2, //<collide with heightmap
|
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.
|
* 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);
|
std::pair<bool, float> sphereCast (float radius, btVector3& from, btVector3& to);
|
||||||
///< @return (hit, relative distance)
|
///< @return (hit, relative distance)
|
||||||
|
|
Loading…
Reference in a new issue