forked from mirror/openmw-tes3mp
Use a separate collision type for doors (Fixes #1962)
This commit is contained in:
parent
604b5d24e9
commit
2c51e7345f
6 changed files with 15 additions and 14 deletions
|
@ -58,7 +58,7 @@ namespace MWClass
|
|||
void Door::insertObject(const MWWorld::Ptr& ptr, const std::string& model, MWPhysics::PhysicsSystem& physics) const
|
||||
{
|
||||
if(!model.empty())
|
||||
physics.addObject(ptr, model);
|
||||
physics.addObject(ptr, model, MWPhysics::CollisionType_Door);
|
||||
|
||||
// Resume the door's opening/closing animation if it wasn't finished
|
||||
if (ptr.getRefData().getCustomData())
|
||||
|
|
|
@ -76,7 +76,7 @@ void Actor::updateCollisionMask()
|
|||
mCollisionWorld->removeCollisionObject(mCollisionObject.get());
|
||||
int collisionMask = CollisionType_World | CollisionType_HeightMap;
|
||||
if (mExternalCollisionMode)
|
||||
collisionMask |= CollisionType_Actor | CollisionType_Projectile;
|
||||
collisionMask |= CollisionType_Actor | CollisionType_Projectile | CollisionType_Door;
|
||||
if (mCanWaterWalk)
|
||||
collisionMask |= CollisionType_Water;
|
||||
mCollisionWorld->addCollisionObject(mCollisionObject.get(), CollisionType_Actor, collisionMask);
|
||||
|
|
|
@ -6,8 +6,9 @@ namespace MWPhysics
|
|||
|
||||
enum CollisionType {
|
||||
CollisionType_World = 1<<0,
|
||||
CollisionType_Actor = 1<<1,
|
||||
CollisionType_HeightMap = 1<<2,
|
||||
CollisionType_Door = 1<<1,
|
||||
CollisionType_Actor = 1<<2,
|
||||
CollisionType_HeightMap = 1<<3,
|
||||
CollisionType_Projectile = 1<<4,
|
||||
CollisionType_Water = 1<<5
|
||||
};
|
||||
|
|
|
@ -857,7 +857,7 @@ namespace MWPhysics
|
|||
const btCollisionObject* mMe;
|
||||
};
|
||||
|
||||
PhysicsSystem::RayResult PhysicsSystem::castRay(const osg::Vec3f &from, const osg::Vec3f &to, MWWorld::Ptr ignore, int mask, int group) const
|
||||
PhysicsSystem::RayResult PhysicsSystem::castRay(const osg::Vec3f &from, const osg::Vec3f &to, MWWorld::ConstPtr ignore, int mask, int group) const
|
||||
{
|
||||
btVector3 btFrom = toBullet(from);
|
||||
btVector3 btTo = toBullet(to);
|
||||
|
@ -923,7 +923,7 @@ namespace MWPhysics
|
|||
osg::Vec3f pos1 (physactor1->getPosition() + osg::Vec3f(0,0,physactor1->getHalfExtents().z() * 0.8)); // eye level
|
||||
osg::Vec3f pos2 (physactor2->getPosition() + osg::Vec3f(0,0,physactor2->getHalfExtents().z() * 0.8));
|
||||
|
||||
RayResult result = castRay(pos1, pos2, MWWorld::Ptr(), CollisionType_World|CollisionType_HeightMap);
|
||||
RayResult result = castRay(pos1, pos2, MWWorld::Ptr(), CollisionType_World|CollisionType_HeightMap|CollisionType_Door);
|
||||
|
||||
return !result.mHit;
|
||||
}
|
||||
|
@ -1073,7 +1073,7 @@ namespace MWPhysics
|
|||
}
|
||||
}
|
||||
|
||||
void PhysicsSystem::addObject (const MWWorld::Ptr& ptr, const std::string& mesh)
|
||||
void PhysicsSystem::addObject (const MWWorld::Ptr& ptr, const std::string& mesh, int collisionType)
|
||||
{
|
||||
osg::ref_ptr<Resource::BulletShapeInstance> shapeInstance = mShapeManager->createInstance(mesh);
|
||||
if (!shapeInstance || !shapeInstance->getCollisionShape())
|
||||
|
@ -1085,7 +1085,7 @@ namespace MWPhysics
|
|||
if (obj->isAnimated())
|
||||
mAnimatedObjects.insert(obj);
|
||||
|
||||
mCollisionWorld->addCollisionObject(obj->getCollisionObject(), CollisionType_World,
|
||||
mCollisionWorld->addCollisionObject(obj->getCollisionObject(), collisionType,
|
||||
CollisionType_Actor|CollisionType_HeightMap|CollisionType_Projectile);
|
||||
}
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace MWPhysics
|
|||
void setWaterHeight(float height);
|
||||
void disableWater();
|
||||
|
||||
void addObject (const MWWorld::Ptr& ptr, const std::string& mesh);
|
||||
void addObject (const MWWorld::Ptr& ptr, const std::string& mesh, int collisionType = CollisionType_World);
|
||||
void addActor (const MWWorld::Ptr& ptr, const std::string& mesh);
|
||||
|
||||
void updatePtr (const MWWorld::Ptr& old, const MWWorld::Ptr& updated);
|
||||
|
@ -106,8 +106,8 @@ namespace MWPhysics
|
|||
};
|
||||
|
||||
/// @param me Optional, a Ptr to ignore in the list of results
|
||||
RayResult castRay(const osg::Vec3f &from, const osg::Vec3f &to, MWWorld::Ptr ignore = MWWorld::Ptr(), int mask =
|
||||
CollisionType_World|CollisionType_HeightMap|CollisionType_Actor, int group=0xff) const;
|
||||
RayResult castRay(const osg::Vec3f &from, const osg::Vec3f &to, MWWorld::ConstPtr ignore = MWWorld::ConstPtr(), int mask =
|
||||
CollisionType_World|CollisionType_HeightMap|CollisionType_Actor|CollisionType_Door, int group=0xff) const;
|
||||
|
||||
RayResult castSphere(const osg::Vec3f& from, const osg::Vec3f& to, float radius);
|
||||
|
||||
|
|
|
@ -1380,7 +1380,7 @@ namespace MWWorld
|
|||
{
|
||||
osg::Vec3f a(x1,y1,z1);
|
||||
osg::Vec3f b(x2,y2,z2);
|
||||
MWPhysics::PhysicsSystem::RayResult result = mPhysics->castRay(a, b, MWWorld::Ptr(), MWPhysics::CollisionType_World);
|
||||
MWPhysics::PhysicsSystem::RayResult result = mPhysics->castRay(a, b, MWWorld::Ptr(), MWPhysics::CollisionType_World|MWPhysics::CollisionType_Door);
|
||||
return result.mHit;
|
||||
}
|
||||
|
||||
|
@ -1413,7 +1413,7 @@ namespace MWWorld
|
|||
bool reached = (targetRot == maxRot && it->second) || targetRot == minRot;
|
||||
|
||||
/// \todo should use convexSweepTest here
|
||||
std::vector<MWWorld::Ptr> collisions = mPhysics->getCollisions(it->first, MWPhysics::CollisionType_Actor, MWPhysics::CollisionType_Actor);
|
||||
std::vector<MWWorld::Ptr> collisions = mPhysics->getCollisions(it->first, MWPhysics::CollisionType_Door, MWPhysics::CollisionType_Actor);
|
||||
for (std::vector<MWWorld::Ptr>::iterator cit = collisions.begin(); cit != collisions.end(); ++cit)
|
||||
{
|
||||
MWWorld::Ptr ptr = *cit;
|
||||
|
@ -2334,7 +2334,7 @@ namespace MWWorld
|
|||
to = from + (to * maxDist);
|
||||
|
||||
MWPhysics::PhysicsSystem::RayResult result = mPhysics->castRay(from, to, MWWorld::Ptr(),
|
||||
MWPhysics::CollisionType_World|MWPhysics::CollisionType_HeightMap);
|
||||
MWPhysics::CollisionType_World|MWPhysics::CollisionType_HeightMap|MWPhysics::CollisionType_Door);
|
||||
|
||||
if (!result.mHit)
|
||||
return maxDist;
|
||||
|
|
Loading…
Reference in a new issue