mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-06 03:15:36 +00:00
Restore collision tracker
This commit is contained in:
parent
b2fe21dd3b
commit
cc3bfe2bb2
3 changed files with 58 additions and 76 deletions
|
@ -231,8 +231,8 @@ namespace MWPhysics
|
||||||
|
|
||||||
static osg::Vec3f move(const MWWorld::Ptr &ptr, Actor* physicActor, const osg::Vec3f &movement, float time,
|
static osg::Vec3f move(const MWWorld::Ptr &ptr, Actor* physicActor, const osg::Vec3f &movement, float time,
|
||||||
bool isFlying, float waterlevel, float slowFall, btCollisionWorld* collisionWorld
|
bool isFlying, float waterlevel, float slowFall, btCollisionWorld* collisionWorld
|
||||||
, std::map<std::string, std::string>& collisionTracker
|
, std::map<MWWorld::Ptr, MWWorld::Ptr>& collisionTracker
|
||||||
, std::map<std::string, std::string>& standingCollisionTracker)
|
, std::map<MWWorld::Ptr, MWWorld::Ptr>& standingCollisionTracker)
|
||||||
{
|
{
|
||||||
const ESM::Position& refpos = ptr.getRefData().getPosition();
|
const ESM::Position& refpos = ptr.getRefData().getPosition();
|
||||||
osg::Vec3f position(refpos.asVec3());
|
osg::Vec3f position(refpos.asVec3());
|
||||||
|
@ -333,13 +333,10 @@ namespace MWPhysics
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
const btCollisionObject* standingOn = tracer.mHitObject;
|
const btCollisionObject* standingOn = tracer.mHitObject;
|
||||||
if (const OEngine::Physic::RigidBody* body = dynamic_cast<const OEngine::Physic::RigidBody*>(standingOn))
|
const PtrHolder* ptrHolder = static_cast<const PtrHolder*>(standingOn->getUserPointer());
|
||||||
{
|
if (ptrHolder)
|
||||||
collisionTracker[ptr.getRefData().getHandle()] = body->mName;
|
collisionTracker[ptr] = ptrHolder->getPtr();
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -406,12 +403,9 @@ namespace MWPhysics
|
||||||
&& tracer.mHitObject->getBroadphaseHandle()->m_collisionFilterGroup != CollisionType_Actor)
|
&& tracer.mHitObject->getBroadphaseHandle()->m_collisionFilterGroup != CollisionType_Actor)
|
||||||
{
|
{
|
||||||
const btCollisionObject* standingOn = tracer.mHitObject;
|
const btCollisionObject* standingOn = tracer.mHitObject;
|
||||||
/*
|
const PtrHolder* ptrHolder = static_cast<PtrHolder*>(standingOn->getUserPointer());
|
||||||
if (const OEngine::Physic::RigidBody* body = dynamic_cast<const OEngine::Physic::RigidBody*>(standingOn))
|
if (ptrHolder)
|
||||||
{
|
standingCollisionTracker[ptr] = ptrHolder->getPtr();
|
||||||
standingCollisionTracker[ptr.getRefData().getHandle()] = body->mName;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (standingOn->getBroadphaseHandle()->m_collisionFilterGroup == CollisionType_Water)
|
if (standingOn->getBroadphaseHandle()->m_collisionFilterGroup == CollisionType_Water)
|
||||||
physicActor->setWalkingOnWater(true);
|
physicActor->setWalkingOnWater(true);
|
||||||
|
@ -857,6 +851,22 @@ namespace MWPhysics
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PhysicsSystem::updateCollisionMapPtr(CollisionMap& map, const MWWorld::Ptr &old, const MWWorld::Ptr &updated)
|
||||||
|
{
|
||||||
|
CollisionMap::iterator found = map.find(old);
|
||||||
|
if (found != map.end())
|
||||||
|
{
|
||||||
|
map[updated] = found->second;
|
||||||
|
map.erase(found);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (CollisionMap::iterator it = map.begin(); it != map.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->second == old)
|
||||||
|
it->second = updated;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PhysicsSystem::updatePtr(const MWWorld::Ptr &old, const MWWorld::Ptr &updated)
|
void PhysicsSystem::updatePtr(const MWWorld::Ptr &old, const MWWorld::Ptr &updated)
|
||||||
{
|
{
|
||||||
ObjectMap::iterator found = mObjects.find(old);
|
ObjectMap::iterator found = mObjects.find(old);
|
||||||
|
@ -876,6 +886,9 @@ namespace MWPhysics
|
||||||
mActors.erase(foundActor);
|
mActors.erase(foundActor);
|
||||||
mActors.insert(std::make_pair(updated, actor));
|
mActors.insert(std::make_pair(updated, actor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateCollisionMapPtr(mCollisions, old, updated);
|
||||||
|
updateCollisionMapPtr(mStandingCollisions, old, updated);
|
||||||
}
|
}
|
||||||
|
|
||||||
Actor *PhysicsSystem::getActor(const MWWorld::Ptr &ptr)
|
Actor *PhysicsSystem::getActor(const MWWorld::Ptr &ptr)
|
||||||
|
@ -1058,62 +1071,40 @@ namespace MWPhysics
|
||||||
|
|
||||||
bool PhysicsSystem::isActorStandingOn(const MWWorld::Ptr &actor, const MWWorld::Ptr &object) const
|
bool PhysicsSystem::isActorStandingOn(const MWWorld::Ptr &actor, const MWWorld::Ptr &object) const
|
||||||
{
|
{
|
||||||
/*
|
for (CollisionMap::const_iterator it = mStandingCollisions.begin(); it != mStandingCollisions.end(); ++it)
|
||||||
const std::string& actorHandle = actor.getRefData().getHandle();
|
|
||||||
const std::string& objectHandle = object.getRefData().getHandle();
|
|
||||||
|
|
||||||
for (std::map<std::string, std::string>::const_iterator it = mStandingCollisions.begin();
|
|
||||||
it != mStandingCollisions.end(); ++it)
|
|
||||||
{
|
{
|
||||||
if (it->first == actorHandle && it->second == objectHandle)
|
if (it->first == actor && it->second == object)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsSystem::getActorsStandingOn(const MWWorld::Ptr &object, std::vector<std::string> &out) const
|
void PhysicsSystem::getActorsStandingOn(const MWWorld::Ptr &object, std::vector<MWWorld::Ptr> &out) const
|
||||||
{
|
{
|
||||||
/*
|
for (CollisionMap::const_iterator it = mStandingCollisions.begin(); it != mStandingCollisions.end(); ++it)
|
||||||
const std::string& objectHandle = object.getRefData().getHandle();
|
|
||||||
|
|
||||||
for (std::map<std::string, std::string>::const_iterator it = mStandingCollisions.begin();
|
|
||||||
it != mStandingCollisions.end(); ++it)
|
|
||||||
{
|
{
|
||||||
if (it->second == objectHandle)
|
if (it->second == object)
|
||||||
out.push_back(it->first);
|
out.push_back(it->first);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PhysicsSystem::isActorCollidingWith(const MWWorld::Ptr &actor, const MWWorld::Ptr &object) const
|
bool PhysicsSystem::isActorCollidingWith(const MWWorld::Ptr &actor, const MWWorld::Ptr &object) const
|
||||||
{
|
{
|
||||||
/*
|
for (CollisionMap::const_iterator it = mCollisions.begin(); it != mCollisions.end(); ++it)
|
||||||
const std::string& actorHandle = actor.getRefData().getHandle();
|
|
||||||
const std::string& objectHandle = object.getRefData().getHandle();
|
|
||||||
|
|
||||||
for (std::map<std::string, std::string>::const_iterator it = mCollisions.begin();
|
|
||||||
it != mCollisions.end(); ++it)
|
|
||||||
{
|
{
|
||||||
if (it->first == actorHandle && it->second == objectHandle)
|
if (it->first == actor && it->second == object)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsSystem::getActorsCollidingWith(const MWWorld::Ptr &object, std::vector<std::string> &out) const
|
void PhysicsSystem::getActorsCollidingWith(const MWWorld::Ptr &object, std::vector<MWWorld::Ptr> &out) const
|
||||||
{
|
{
|
||||||
/*
|
for (CollisionMap::const_iterator it = mCollisions.begin(); it != mCollisions.end(); ++it)
|
||||||
const std::string& objectHandle = object.getRefData().getHandle();
|
|
||||||
|
|
||||||
for (std::map<std::string, std::string>::const_iterator it = mCollisions.begin();
|
|
||||||
it != mCollisions.end(); ++it)
|
|
||||||
{
|
{
|
||||||
if (it->second == objectHandle)
|
if (it->second == object)
|
||||||
out.push_back(it->first);
|
out.push_back(it->first);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicsSystem::disableWater()
|
void PhysicsSystem::disableWater()
|
||||||
|
|
|
@ -109,14 +109,14 @@ namespace MWPhysics
|
||||||
bool isActorStandingOn(const MWWorld::Ptr& actor, const MWWorld::Ptr& object) const;
|
bool isActorStandingOn(const MWWorld::Ptr& actor, const MWWorld::Ptr& object) const;
|
||||||
|
|
||||||
/// Get the handle of all actors standing on \a object in this frame.
|
/// Get the handle of all actors standing on \a object in this frame.
|
||||||
void getActorsStandingOn(const MWWorld::Ptr& object, std::vector<std::string>& out) const;
|
void getActorsStandingOn(const MWWorld::Ptr& object, std::vector<MWWorld::Ptr>& out) const;
|
||||||
|
|
||||||
/// Return true if \a actor has collided with \a object in this frame.
|
/// Return true if \a actor has collided with \a object in this frame.
|
||||||
/// This will detect running into objects, but will not detect climbing stairs, stepping up a small object, etc.
|
/// This will detect running into objects, but will not detect climbing stairs, stepping up a small object, etc.
|
||||||
bool isActorCollidingWith(const MWWorld::Ptr& actor, const MWWorld::Ptr& object) const;
|
bool isActorCollidingWith(const MWWorld::Ptr& actor, const MWWorld::Ptr& object) const;
|
||||||
|
|
||||||
/// Get the handle of all actors colliding with \a object in this frame.
|
/// Get the handle of all actors colliding with \a object in this frame.
|
||||||
void getActorsCollidingWith(const MWWorld::Ptr& object, std::vector<std::string>& out) const;
|
void getActorsCollidingWith(const MWWorld::Ptr& object, std::vector<MWWorld::Ptr>& out) const;
|
||||||
|
|
||||||
bool toggleDebugRendering();
|
bool toggleDebugRendering();
|
||||||
|
|
||||||
|
@ -142,14 +142,15 @@ namespace MWPhysics
|
||||||
|
|
||||||
bool mDebugDrawEnabled;
|
bool mDebugDrawEnabled;
|
||||||
|
|
||||||
std::map<std::string, std::string> handleToMesh;
|
|
||||||
|
|
||||||
// Tracks all movement collisions happening during a single frame. <actor handle, collided handle>
|
// Tracks all movement collisions happening during a single frame. <actor handle, collided handle>
|
||||||
// This will detect e.g. running against a vertical wall. It will not detect climbing up stairs,
|
// This will detect e.g. running against a vertical wall. It will not detect climbing up stairs,
|
||||||
// stepping up small objects, etc.
|
// stepping up small objects, etc.
|
||||||
std::map<std::string, std::string> mCollisions; // FIXME: reimplement
|
typedef std::map<MWWorld::Ptr, MWWorld::Ptr> CollisionMap;
|
||||||
|
CollisionMap mCollisions;
|
||||||
|
CollisionMap mStandingCollisions;
|
||||||
|
|
||||||
std::map<std::string, std::string> mStandingCollisions; // FIXME: reimplement
|
// replaces all occurences of 'old' in the map by 'updated', no matter if its a key or value
|
||||||
|
void updateCollisionMapPtr(CollisionMap& map, const MWWorld::Ptr &old, const MWWorld::Ptr &updated);
|
||||||
|
|
||||||
PtrVelocityList mMovementQueue;
|
PtrVelocityList mMovementQueue;
|
||||||
PtrVelocityList mMovementResults;
|
PtrVelocityList mMovementResults;
|
||||||
|
|
|
@ -2200,27 +2200,27 @@ namespace MWWorld
|
||||||
|
|
||||||
bool World::getPlayerStandingOn (const MWWorld::Ptr& object)
|
bool World::getPlayerStandingOn (const MWWorld::Ptr& object)
|
||||||
{
|
{
|
||||||
//MWWorld::Ptr player = getPlayerPtr();
|
MWWorld::Ptr player = getPlayerPtr();
|
||||||
return 0;//mPhysics->isActorStandingOn(player, object);
|
return mPhysics->isActorStandingOn(player, object);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool World::getActorStandingOn (const MWWorld::Ptr& object)
|
bool World::getActorStandingOn (const MWWorld::Ptr& object)
|
||||||
{
|
{
|
||||||
std::vector<std::string> actors;
|
std::vector<MWWorld::Ptr> actors;
|
||||||
//mPhysics->getActorsStandingOn(object, actors);
|
mPhysics->getActorsStandingOn(object, actors);
|
||||||
return !actors.empty();
|
return !actors.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool World::getPlayerCollidingWith (const MWWorld::Ptr& object)
|
bool World::getPlayerCollidingWith (const MWWorld::Ptr& object)
|
||||||
{
|
{
|
||||||
//MWWorld::Ptr player = getPlayerPtr();
|
MWWorld::Ptr player = getPlayerPtr();
|
||||||
return 0;//mPhysics->isActorCollidingWith(player, object);
|
return mPhysics->isActorCollidingWith(player, object);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool World::getActorCollidingWith (const MWWorld::Ptr& object)
|
bool World::getActorCollidingWith (const MWWorld::Ptr& object)
|
||||||
{
|
{
|
||||||
std::vector<std::string> actors;
|
std::vector<MWWorld::Ptr> actors;
|
||||||
//mPhysics->getActorsCollidingWith(object, actors);
|
mPhysics->getActorsCollidingWith(object, actors);
|
||||||
return !actors.empty();
|
return !actors.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2229,15 +2229,11 @@ namespace MWWorld
|
||||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode())
|
if (MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
std::vector<MWWorld::Ptr> actors;
|
||||||
std::vector<std::string> actors;
|
|
||||||
mPhysics->getActorsStandingOn(object, actors);
|
mPhysics->getActorsStandingOn(object, actors);
|
||||||
for (std::vector<std::string>::iterator it = actors.begin(); it != actors.end(); ++it)
|
for (std::vector<MWWorld::Ptr>::iterator it = actors.begin(); it != actors.end(); ++it)
|
||||||
{
|
{
|
||||||
MWWorld::Ptr actor = searchPtrViaHandle(*it); // Collision events are from the last frame, actor might no longer exist
|
MWWorld::Ptr actor = *it;
|
||||||
if (actor.isEmpty())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
MWMechanics::CreatureStats& stats = actor.getClass().getCreatureStats(actor);
|
MWMechanics::CreatureStats& stats = actor.getClass().getCreatureStats(actor);
|
||||||
if (stats.isDead())
|
if (stats.isDead())
|
||||||
continue;
|
continue;
|
||||||
|
@ -2254,7 +2250,6 @@ namespace MWWorld
|
||||||
MWBase::Environment::get().getSoundManager()->playSound3D(actor, "Health Damage", 1.0f, 1.0f);
|
MWBase::Environment::get().getSoundManager()->playSound3D(actor, "Health Damage", 1.0f, 1.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::hurtCollidingActors(const Ptr &object, float healthPerSecond)
|
void World::hurtCollidingActors(const Ptr &object, float healthPerSecond)
|
||||||
|
@ -2262,15 +2257,11 @@ namespace MWWorld
|
||||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode())
|
if (MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
std::vector<MWWorld::Ptr> actors;
|
||||||
std::vector<std::string> actors;
|
|
||||||
mPhysics->getActorsCollidingWith(object, actors);
|
mPhysics->getActorsCollidingWith(object, actors);
|
||||||
for (std::vector<std::string>::iterator it = actors.begin(); it != actors.end(); ++it)
|
for (std::vector<MWWorld::Ptr>::iterator it = actors.begin(); it != actors.end(); ++it)
|
||||||
{
|
{
|
||||||
MWWorld::Ptr actor = searchPtrViaHandle(*it); // Collision events are from the last frame, actor might no longer exist
|
MWWorld::Ptr actor = *it;
|
||||||
if (actor.isEmpty())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
MWMechanics::CreatureStats& stats = actor.getClass().getCreatureStats(actor);
|
MWMechanics::CreatureStats& stats = actor.getClass().getCreatureStats(actor);
|
||||||
if (stats.isDead())
|
if (stats.isDead())
|
||||||
continue;
|
continue;
|
||||||
|
@ -2287,7 +2278,6 @@ namespace MWWorld
|
||||||
MWBase::Environment::get().getSoundManager()->playSound3D(actor, "Health Damage", 1.0f, 1.0f);
|
MWBase::Environment::get().getSoundManager()->playSound3D(actor, "Health Damage", 1.0f, 1.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float World::getWindSpeed()
|
float World::getWindSpeed()
|
||||||
|
|
Loading…
Reference in a new issue