mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-22 12:39:59 +00:00
Merge branch 'filter_physics_actors' into 'master'
Do not perform physics simulation for actors outside processing range See merge request OpenMW/openmw!1934
This commit is contained in:
commit
af82140dda
@ -669,6 +669,8 @@ namespace MWBase
|
|||||||
virtual MWRender::RenderingManager* getRenderingManager() = 0;
|
virtual MWRender::RenderingManager* getRenderingManager() = 0;
|
||||||
|
|
||||||
virtual MWRender::PostProcessor* getPostProcessor() = 0;
|
virtual MWRender::PostProcessor* getPostProcessor() = 0;
|
||||||
|
|
||||||
|
virtual void setActorActive(const MWWorld::Ptr& ptr, bool value) = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1593,10 +1593,12 @@ namespace MWMechanics
|
|||||||
if (!inRange)
|
if (!inRange)
|
||||||
{
|
{
|
||||||
actor.getPtr().getRefData().getBaseNode()->setNodeMask(0);
|
actor.getPtr().getRefData().getBaseNode()->setNodeMask(0);
|
||||||
world->setActorCollisionMode(actor.getPtr(), false, false);
|
world->setActorActive(actor.getPtr(), false);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
world->setActorActive(actor.getPtr(), true);
|
||||||
|
|
||||||
const bool isDead = actor.getPtr().getClass().getCreatureStats(actor.getPtr()).isDead();
|
const bool isDead = actor.getPtr().getClass().getCreatureStats(actor.getPtr()).isDead();
|
||||||
if (!isDead && (!godmode || !isPlayer) && actor.getPtr().getClass().getCreatureStats(actor.getPtr()).isParalyzed())
|
if (!isDead && (!godmode || !isPlayer) && actor.getPtr().getClass().getCreatureStats(actor.getPtr()).isParalyzed())
|
||||||
ctrl.skipAnim();
|
ctrl.skipAnim();
|
||||||
|
@ -27,6 +27,7 @@ Actor::Actor(const MWWorld::Ptr& ptr, const Resource::BulletShape* shape, Physic
|
|||||||
, mForce(0.f, 0.f, 0.f), mOnGround(true), mOnSlope(false)
|
, mForce(0.f, 0.f, 0.f), mOnGround(true), mOnSlope(false)
|
||||||
, mInternalCollisionMode(true)
|
, mInternalCollisionMode(true)
|
||||||
, mExternalCollisionMode(true)
|
, mExternalCollisionMode(true)
|
||||||
|
, mActive(false)
|
||||||
, mTaskScheduler(scheduler)
|
, mTaskScheduler(scheduler)
|
||||||
{
|
{
|
||||||
mPtr = ptr;
|
mPtr = ptr;
|
||||||
|
@ -152,6 +152,10 @@ namespace MWPhysics
|
|||||||
|
|
||||||
bool canMoveToWaterSurface(float waterlevel, const btCollisionWorld* world) const;
|
bool canMoveToWaterSurface(float waterlevel, const btCollisionWorld* world) const;
|
||||||
|
|
||||||
|
bool isActive() const { return mActive; }
|
||||||
|
|
||||||
|
void setActive(bool value) { mActive = value; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MWWorld::Ptr mStandingOnPtr;
|
MWWorld::Ptr mStandingOnPtr;
|
||||||
/// Removes then re-adds the collision object to the dynamics world
|
/// Removes then re-adds the collision object to the dynamics world
|
||||||
@ -190,6 +194,7 @@ namespace MWPhysics
|
|||||||
bool mOnSlope;
|
bool mOnSlope;
|
||||||
bool mInternalCollisionMode;
|
bool mInternalCollisionMode;
|
||||||
bool mExternalCollisionMode;
|
bool mExternalCollisionMode;
|
||||||
|
bool mActive;
|
||||||
|
|
||||||
PhysicsTaskScheduler* mTaskScheduler;
|
PhysicsTaskScheduler* mTaskScheduler;
|
||||||
|
|
||||||
|
@ -712,6 +712,9 @@ namespace MWPhysics
|
|||||||
const MWBase::World *world = MWBase::Environment::get().getWorld();
|
const MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||||
for (const auto& [ref, physicActor] : mActors)
|
for (const auto& [ref, physicActor] : mActors)
|
||||||
{
|
{
|
||||||
|
if (!physicActor->isActive())
|
||||||
|
continue;
|
||||||
|
|
||||||
auto ptr = physicActor->getPtr();
|
auto ptr = physicActor->getPtr();
|
||||||
if (!ptr.getClass().isMobile(ptr))
|
if (!ptr.getClass().isMobile(ptr))
|
||||||
continue;
|
continue;
|
||||||
|
@ -3997,4 +3997,10 @@ namespace MWWorld
|
|||||||
{
|
{
|
||||||
return mRendering->getPostProcessor();
|
return mRendering->getPostProcessor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void World::setActorActive(const MWWorld::Ptr& ptr, bool value)
|
||||||
|
{
|
||||||
|
if (MWPhysics::Actor* const actor = mPhysics->getActor(ptr))
|
||||||
|
actor->setActive(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -751,6 +751,8 @@ namespace MWWorld
|
|||||||
MWRender::RenderingManager* getRenderingManager() override { return mRendering.get(); }
|
MWRender::RenderingManager* getRenderingManager() override { return mRendering.get(); }
|
||||||
|
|
||||||
MWRender::PostProcessor* getPostProcessor() override;
|
MWRender::PostProcessor* getPostProcessor() override;
|
||||||
|
|
||||||
|
void setActorActive(const MWWorld::Ptr& ptr, bool value) override;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user