diff --git a/apps/openmw/mwphysics/closestnotmeconvexresultcallback.cpp b/apps/openmw/mwphysics/closestnotmeconvexresultcallback.cpp index 3ec09d00d..18c196e44 100644 --- a/apps/openmw/mwphysics/closestnotmeconvexresultcallback.cpp +++ b/apps/openmw/mwphysics/closestnotmeconvexresultcallback.cpp @@ -2,11 +2,6 @@ #include -#include - -#include "../mwbase/world.hpp" -#include "../mwbase/environment.hpp" - #include "collisiontype.hpp" #include "projectile.hpp" diff --git a/apps/openmw/mwphysics/closestnotmerayresultcallback.cpp b/apps/openmw/mwphysics/closestnotmerayresultcallback.cpp index f9dc3bdd5..c3104f860 100644 --- a/apps/openmw/mwphysics/closestnotmerayresultcallback.cpp +++ b/apps/openmw/mwphysics/closestnotmerayresultcallback.cpp @@ -41,15 +41,21 @@ namespace MWPhysics btCollisionWorld::ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace); if (mProjectile) { - auto* holder = static_cast(rayResult.m_collisionObject->getUserPointer()); - if (auto* target = dynamic_cast(holder)) + switch (rayResult.m_collisionObject->getBroadphaseHandle()->m_collisionFilterGroup) { - mProjectile->hit(target->getPtr(), m_hitPointWorld, m_hitNormalWorld); - } - else if (auto* target = dynamic_cast(holder)) - { - target->hit(mProjectile->getPtr(), m_hitPointWorld, m_hitNormalWorld); - mProjectile->hit(target->getPtr(), m_hitPointWorld, m_hitNormalWorld); + case CollisionType_Actor: + { + auto* target = static_cast(rayResult.m_collisionObject->getUserPointer()); + mProjectile->hit(target->getPtr(), m_hitPointWorld, m_hitNormalWorld); + break; + } + case CollisionType_Projectile: + { + auto* target = static_cast(rayResult.m_collisionObject->getUserPointer()); + target->hit(mProjectile->getPtr(), m_hitPointWorld, m_hitNormalWorld); + mProjectile->hit(target->getPtr(), m_hitPointWorld, m_hitNormalWorld); + break; + } } } diff --git a/apps/openmw/mwphysics/mtphysics.cpp b/apps/openmw/mwphysics/mtphysics.cpp index bedcaba6a..a4f13b351 100644 --- a/apps/openmw/mwphysics/mtphysics.cpp +++ b/apps/openmw/mwphysics/mtphysics.cpp @@ -236,16 +236,7 @@ namespace MWPhysics mMovedActors.emplace_back(data.mActorRaw->getPtr()); } } - - if (mFrameNumber == frameNumber - 1) - { - stats.setAttribute(mFrameNumber, "physicsworker_time_begin", mTimer->delta_s(mFrameStart, mTimeBegin)); - stats.setAttribute(mFrameNumber, "physicsworker_time_taken", mTimer->delta_s(mTimeBegin, mTimeEnd)); - stats.setAttribute(mFrameNumber, "physicsworker_time_end", mTimer->delta_s(mFrameStart, mTimeEnd)); - } - mFrameStart = frameStart; - mTimeBegin = mTimer->tick(); - mFrameNumber = frameNumber; + updateStats(frameStart, frameNumber, stats); } // init @@ -529,4 +520,17 @@ namespace MWPhysics actorData.mActorRaw->setStandingOnPtr(actorData.mStandingOn); } } + + void PhysicsTaskScheduler::updateStats(osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats) + { + if (mFrameNumber == frameNumber - 1) + { + stats.setAttribute(mFrameNumber, "physicsworker_time_begin", mTimer->delta_s(mFrameStart, mTimeBegin)); + stats.setAttribute(mFrameNumber, "physicsworker_time_taken", mTimer->delta_s(mTimeBegin, mTimeEnd)); + stats.setAttribute(mFrameNumber, "physicsworker_time_end", mTimer->delta_s(mFrameStart, mTimeEnd)); + } + mFrameStart = frameStart; + mTimeBegin = mTimer->tick(); + mFrameNumber = frameNumber; + } } diff --git a/apps/openmw/mwphysics/mtphysics.hpp b/apps/openmw/mwphysics/mtphysics.hpp index 90e1007b8..b35ebd5ee 100644 --- a/apps/openmw/mwphysics/mtphysics.hpp +++ b/apps/openmw/mwphysics/mtphysics.hpp @@ -57,6 +57,7 @@ namespace MWPhysics void refreshLOSCache(); void updateAabbs(); void updatePtrAabb(const std::weak_ptr& ptr); + void updateStats(osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats); std::unique_ptr mWorldFrameData; std::vector mActorsFrameData; diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index 9c239200b..1c04bc2bc 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -694,8 +694,6 @@ namespace MWPhysics if (found != mActors.end()) { bool cmode = found->second->getCollisionMode(); - if (cmode) - resetPosition(found->first); cmode = !cmode; found->second->enableCollisionMode(cmode); // NB: Collision body isn't disabled for vanilla TCL compatibility diff --git a/apps/openmw/mwphysics/trace.cpp b/apps/openmw/mwphysics/trace.cpp index 4d2fccdb7..58082f4db 100644 --- a/apps/openmw/mwphysics/trace.cpp +++ b/apps/openmw/mwphysics/trace.cpp @@ -5,9 +5,6 @@ #include #include -#include "../mwbase/world.hpp" -#include "../mwbase/environment.hpp" - #include "collisiontype.hpp" #include "actor.hpp" #include "closestnotmeconvexresultcallback.hpp"