From 1479f987934240075ba76ddf0836857c3d209edf Mon Sep 17 00:00:00 2001 From: Bret Curtis Date: Sun, 14 Mar 2021 01:02:44 +0100 Subject: [PATCH] hacky solution with debug; seems that player is added before cell so tracing down will not find anything --- apps/openmw/mwphysics/actor.cpp | 1 - apps/openmw/mwphysics/physicssystem.cpp | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwphysics/actor.cpp b/apps/openmw/mwphysics/actor.cpp index 87698ef37c..06abe72403 100644 --- a/apps/openmw/mwphysics/actor.cpp +++ b/apps/openmw/mwphysics/actor.cpp @@ -72,7 +72,6 @@ Actor::Actor(const MWWorld::Ptr& ptr, const Resource::BulletShape* shape, Physic updatePosition(); addCollisionMask(getCollisionMask()); updateCollisionObjectPosition(); - mOnGround.store(false, std::memory_order_release); } Actor::~Actor() diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index dc9ab629a1..e24aa3500c 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -680,7 +681,24 @@ namespace MWPhysics return; auto actor = std::make_shared(ptr, shape, mTaskScheduler.get()); + + if (ptr == MWMechanics::getPlayer()) + { + osg::Vec3f offset = actor->getCollisionObjectPosition() - ptr.getRefData().getPosition().asVec3(); + std::cout << "DEBUG Player position: " << actor->getPosition() << std::endl; + auto terrainHeight = std::max(0.f, MWBase::Environment::get().getWorld()->getTerrainHeightAt(actor->getPosition())); + std::cout << "DEBUG terrain height " << terrainHeight << std::endl; + ActorTracer tracer; + tracer.findGround(actor.get(), actor->getPosition() + offset, actor->getPosition() + offset - osg::Vec3f(0, 0, 100.f), mCollisionWorld.get()); + std::cout << "DEBUG mFraction " << tracer.mFraction << std::endl; // it seems that player is loaded before the cell so we can't find the ground. + + std::cout << "DEBUG calculation :: " << actor->getPosition().z() - terrainHeight << std::endl; + if (actor->getPosition().z() - terrainHeight > 300.f) + actor->setOnGround(false); + } + mActors.emplace(ptr, std::move(actor)); + } int PhysicsSystem::addProjectile (const MWWorld::Ptr& caster, const osg::Vec3f& position, const std::string& mesh, bool computeRadius, bool canTraverseWater)