From 18f16eac4c6d8706b0d1224b14bfa3340d3fd96b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Tue, 17 May 2022 18:04:11 +0300 Subject: [PATCH] Refactor DetourNavigator to pass prng along, use world prng for AiWander --- apps/openmw/mwmechanics/aiwander.cpp | 5 ++++- apps/openmw_test_suite/detournavigator/navigator.cpp | 3 ++- components/detournavigator/findrandompointaroundcircle.cpp | 5 +++-- components/detournavigator/findrandompointaroundcircle.hpp | 2 +- components/detournavigator/navigatorutils.cpp | 4 ++-- components/detournavigator/navigatorutils.hpp | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwmechanics/aiwander.cpp b/apps/openmw/mwmechanics/aiwander.cpp index 378e5a6351..a4da1ebd68 100644 --- a/apps/openmw/mwmechanics/aiwander.cpp +++ b/apps/openmw/mwmechanics/aiwander.cpp @@ -359,7 +359,10 @@ namespace MWMechanics { // findRandomPointAroundCircle uses wanderDistance as limit for random and not as exact distance if (const auto destination = DetourNavigator::findRandomPointAroundCircle(*navigator, halfExtents, - mInitialActorPosition, wanderDistance, navigatorFlags)) + mInitialActorPosition, wanderDistance, navigatorFlags, []() { + auto& prng = MWBase::Environment::get().getWorld()->getPrng(); + return Misc::Rng::rollProbability(prng); + })) mDestination = *destination; else mDestination = getRandomPointAround(mInitialActorPosition, wanderRadius); diff --git a/apps/openmw_test_suite/detournavigator/navigator.cpp b/apps/openmw_test_suite/detournavigator/navigator.cpp index 0e9c20fb9a..c98a5b7a90 100644 --- a/apps/openmw_test_suite/detournavigator/navigator.cpp +++ b/apps/openmw_test_suite/detournavigator/navigator.cpp @@ -819,7 +819,8 @@ namespace Misc::Rng::init(42); - const auto result = findRandomPointAroundCircle(*mNavigator, mAgentHalfExtents, mStart, 100.0, Flag_walk); + const auto result = findRandomPointAroundCircle(*mNavigator, mAgentHalfExtents, mStart, 100.0, Flag_walk, + []() { return Misc::Rng::rollClosedProbability(); }); ASSERT_THAT(result, Optional(Vec3fEq(70.35845947265625, 335.592041015625, -2.6667339801788330078125))) << (result ? *result : osg::Vec3f()); diff --git a/components/detournavigator/findrandompointaroundcircle.cpp b/components/detournavigator/findrandompointaroundcircle.cpp index 1e1e2401c5..6bd761c817 100644 --- a/components/detournavigator/findrandompointaroundcircle.cpp +++ b/components/detournavigator/findrandompointaroundcircle.cpp @@ -10,7 +10,7 @@ namespace DetourNavigator { std::optional findRandomPointAroundCircle(const dtNavMesh& navMesh, const osg::Vec3f& halfExtents, - const osg::Vec3f& start, const float maxRadius, const Flags includeFlags, const DetourSettings& settings) + const osg::Vec3f& start, const float maxRadius, const Flags includeFlags, const DetourSettings& settings, float(*prng)()) { dtNavMeshQuery navMeshQuery; if (!initNavMeshQuery(navMeshQuery, navMesh, settings.mMaxNavMeshQueryNodes)) @@ -25,8 +25,9 @@ namespace DetourNavigator dtPolyRef resultRef = 0; osg::Vec3f resultPosition; + navMeshQuery.findRandomPointAroundCircle(startRef, start.ptr(), maxRadius, &queryFilter, - []() { return Misc::Rng::rollProbability(); }, &resultRef, resultPosition.ptr()); + prng, &resultRef, resultPosition.ptr()); if (resultRef == 0) return std::optional(); diff --git a/components/detournavigator/findrandompointaroundcircle.hpp b/components/detournavigator/findrandompointaroundcircle.hpp index 89a3c0964c..346ad36e4e 100644 --- a/components/detournavigator/findrandompointaroundcircle.hpp +++ b/components/detournavigator/findrandompointaroundcircle.hpp @@ -13,7 +13,7 @@ namespace DetourNavigator struct DetourSettings; std::optional findRandomPointAroundCircle(const dtNavMesh& navMesh, const osg::Vec3f& halfExtents, - const osg::Vec3f& start, const float maxRadius, const Flags includeFlags, const DetourSettings& settings); + const osg::Vec3f& start, const float maxRadius, const Flags includeFlags, const DetourSettings& settings, float(*prng)()); } #endif diff --git a/components/detournavigator/navigatorutils.cpp b/components/detournavigator/navigatorutils.cpp index bfb0946b9e..a64343905d 100644 --- a/components/detournavigator/navigatorutils.cpp +++ b/components/detournavigator/navigatorutils.cpp @@ -6,7 +6,7 @@ namespace DetourNavigator { std::optional findRandomPointAroundCircle(const Navigator& navigator, const osg::Vec3f& agentHalfExtents, - const osg::Vec3f& start, const float maxRadius, const Flags includeFlags) + const osg::Vec3f& start, const float maxRadius, const Flags includeFlags, float(*prng)()) { const auto navMesh = navigator.getNavMesh(agentHalfExtents); if (!navMesh) @@ -14,7 +14,7 @@ namespace DetourNavigator const auto& settings = navigator.getSettings(); const auto result = DetourNavigator::findRandomPointAroundCircle(navMesh->lockConst()->getImpl(), toNavMeshCoordinates(settings.mRecast, agentHalfExtents), toNavMeshCoordinates(settings.mRecast, start), - toNavMeshCoordinates(settings.mRecast, maxRadius), includeFlags, settings.mDetour); + toNavMeshCoordinates(settings.mRecast, maxRadius), includeFlags, settings.mDetour, prng); if (!result) return std::nullopt; return std::optional(fromNavMeshCoordinates(settings.mRecast, *result)); diff --git a/components/detournavigator/navigatorutils.hpp b/components/detournavigator/navigatorutils.hpp index 8f3b6161f9..8bd1499897 100644 --- a/components/detournavigator/navigatorutils.hpp +++ b/components/detournavigator/navigatorutils.hpp @@ -51,7 +51,7 @@ namespace DetourNavigator * @return not empty optional with position if point is found and empty optional if point is not found. */ std::optional findRandomPointAroundCircle(const Navigator& navigator, const osg::Vec3f& agentHalfExtents, - const osg::Vec3f& start, const float maxRadius, const Flags includeFlags); + const osg::Vec3f& start, const float maxRadius, const Flags includeFlags, float(*prng)()); /** * @brief raycast finds farest navmesh point from start on a line from start to end that has path from start.