1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-23 15:40:42 +00:00

Don't re-enable collision object for dead actors

This commit is contained in:
Capostrophic 2018-12-31 18:39:20 +03:00
parent 9f716b9ed8
commit a584aa25ab
6 changed files with 13 additions and 36 deletions

View File

@ -310,7 +310,7 @@ namespace MWBase
virtual bool castRay (float x1, float y1, float z1, float x2, float y2, float z2) = 0; virtual bool castRay (float x1, float y1, float z1, float x2, float y2, float z2) = 0;
virtual void setActorCollisionMode(const MWWorld::Ptr& ptr, bool enabled) = 0; virtual void setActorCollisionMode(const MWWorld::Ptr& ptr, bool internal, bool external) = 0;
virtual bool isActorCollisionEnabled(const MWWorld::Ptr& ptr) = 0; virtual bool isActorCollisionEnabled(const MWWorld::Ptr& ptr) = 0;
virtual bool toggleCollisionMode() = 0; virtual bool toggleCollisionMode() = 0;

View File

@ -1454,7 +1454,7 @@ namespace MWMechanics
if (!inRange) if (!inRange)
{ {
iter->first.getRefData().getBaseNode()->setNodeMask(0); iter->first.getRefData().getBaseNode()->setNodeMask(0);
world->setActorCollisionMode(iter->first, false); world->setActorCollisionMode(iter->first, false, false);
continue; continue;
} }
else if (!isPlayer) else if (!isPlayer)
@ -1471,7 +1471,7 @@ namespace MWMechanics
continue; continue;
} }
world->setActorCollisionMode(iter->first, true); world->setActorCollisionMode(iter->first, true, !iter->first.getClass().getCreatureStats(iter->first).isDeathAnimationFinished());
ctrl->update(duration); ctrl->update(duration);
// Fade away actors on large distance (>90% of actor's processing distance) // Fade away actors on large distance (>90% of actor's processing distance)

View File

@ -1216,33 +1216,6 @@ namespace MWPhysics
return false; return false;
} }
void PhysicsSystem::setActorCollisionMode(const MWWorld::Ptr& ptr, bool enabled)
{
ActorMap::iterator found = mActors.find(ptr);
if (found != mActors.end())
{
bool cmode = found->second->getCollisionMode();
if (cmode == enabled)
return;
cmode = enabled;
found->second->enableCollisionMode(cmode);
found->second->enableCollisionBody(cmode);
}
}
bool PhysicsSystem::isActorCollisionEnabled(const MWWorld::Ptr& ptr)
{
ActorMap::iterator found = mActors.find(ptr);
if (found != mActors.end())
{
bool cmode = found->second->getCollisionMode();
return cmode;
}
return false;
}
void PhysicsSystem::queueObjectMovement(const MWWorld::Ptr &ptr, const osg::Vec3f &movement) void PhysicsSystem::queueObjectMovement(const MWWorld::Ptr &ptr, const osg::Vec3f &movement)
{ {
PtrVelocityList::iterator iter = mMovementQueue.begin(); PtrVelocityList::iterator iter = mMovementQueue.begin();

View File

@ -92,8 +92,6 @@ namespace MWPhysics
const HeightField* getHeightField(int x, int y) const; const HeightField* getHeightField(int x, int y) const;
bool toggleCollisionMode(); bool toggleCollisionMode();
bool isActorCollisionEnabled(const MWWorld::Ptr& ptr);
void setActorCollisionMode(const MWWorld::Ptr& ptr, bool enabled);
void stepSimulation(float dt); void stepSimulation(float dt);
void debugDraw(); void debugDraw();

View File

@ -1684,14 +1684,20 @@ namespace MWWorld
} }
} }
void World::setActorCollisionMode(const MWWorld::Ptr& ptr, bool enabled) void World::setActorCollisionMode(const MWWorld::Ptr& ptr, bool internal, bool external)
{ {
mPhysics->setActorCollisionMode(ptr, enabled); MWPhysics::Actor *physicActor = mPhysics->getActor(ptr);
if (physicActor && physicActor->getCollisionMode() != internal)
{
physicActor->enableCollisionMode(internal);
physicActor->enableCollisionBody(external);
}
} }
bool World::isActorCollisionEnabled(const MWWorld::Ptr& ptr) bool World::isActorCollisionEnabled(const MWWorld::Ptr& ptr)
{ {
return mPhysics->isActorCollisionEnabled(ptr); MWPhysics::Actor *physicActor = mPhysics->getActor(ptr);
return physicActor && physicActor->getCollisionMode();
} }
bool World::toggleCollisionMode() bool World::toggleCollisionMode()

View File

@ -419,7 +419,7 @@ namespace MWWorld
bool castRay (float x1, float y1, float z1, float x2, float y2, float z2) override; bool castRay (float x1, float y1, float z1, float x2, float y2, float z2) override;
void setActorCollisionMode(const Ptr& ptr, bool enabled) override; void setActorCollisionMode(const Ptr& ptr, bool internal, bool external) override;
bool isActorCollisionEnabled(const Ptr& ptr) override; bool isActorCollisionEnabled(const Ptr& ptr) override;
bool toggleCollisionMode() override; bool toggleCollisionMode() override;