Add OpenMW commits up to 4 Feb 2020
# Conflicts: # .travis.yml # CI/before_script.linux.shpull/556/head
commit
f0f76516d8
@ -0,0 +1,45 @@
|
|||||||
|
#include "findrandompointaroundcircle.hpp"
|
||||||
|
#include "settings.hpp"
|
||||||
|
#include "findsmoothpath.hpp"
|
||||||
|
|
||||||
|
#include <components/misc/rng.hpp>
|
||||||
|
|
||||||
|
#include <DetourCommon.h>
|
||||||
|
#include <DetourNavMesh.h>
|
||||||
|
#include <DetourNavMeshQuery.h>
|
||||||
|
|
||||||
|
namespace DetourNavigator
|
||||||
|
{
|
||||||
|
boost::optional<osg::Vec3f> findRandomPointAroundCircle(const dtNavMesh& navMesh, const osg::Vec3f& halfExtents,
|
||||||
|
const osg::Vec3f& start, const float maxRadius, const Flags includeFlags, const Settings& settings)
|
||||||
|
{
|
||||||
|
dtNavMeshQuery navMeshQuery;
|
||||||
|
initNavMeshQuery(navMeshQuery, navMesh, settings.mMaxNavMeshQueryNodes);
|
||||||
|
|
||||||
|
dtQueryFilter queryFilter;
|
||||||
|
queryFilter.setIncludeFlags(includeFlags);
|
||||||
|
|
||||||
|
dtPolyRef startRef = 0;
|
||||||
|
osg::Vec3f startPolygonPosition;
|
||||||
|
for (int i = 0; i < 3; ++i)
|
||||||
|
{
|
||||||
|
const auto status = navMeshQuery.findNearestPoly(start.ptr(), (halfExtents * (1 << i)).ptr(), &queryFilter,
|
||||||
|
&startRef, startPolygonPosition.ptr());
|
||||||
|
if (!dtStatusFailed(status) && startRef != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startRef == 0)
|
||||||
|
return boost::optional<osg::Vec3f>();
|
||||||
|
|
||||||
|
dtPolyRef resultRef = 0;
|
||||||
|
osg::Vec3f resultPosition;
|
||||||
|
navMeshQuery.findRandomPointAroundCircle(startRef, start.ptr(), maxRadius, &queryFilter,
|
||||||
|
&Misc::Rng::rollProbability, &resultRef, resultPosition.ptr());
|
||||||
|
|
||||||
|
if (resultRef == 0)
|
||||||
|
return boost::optional<osg::Vec3f>();
|
||||||
|
|
||||||
|
return boost::optional<osg::Vec3f>(resultPosition);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef OPENMW_COMPONENTS_DETOURNAVIGATOR_FINDRANDOMPOINTAROUNDCIRCLE_H
|
||||||
|
#define OPENMW_COMPONENTS_DETOURNAVIGATOR_FINDRANDOMPOINTAROUNDCIRCLE_H
|
||||||
|
|
||||||
|
#include "flags.hpp"
|
||||||
|
|
||||||
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
|
#include <osg/Vec3f>
|
||||||
|
|
||||||
|
class dtNavMesh;
|
||||||
|
|
||||||
|
namespace DetourNavigator
|
||||||
|
{
|
||||||
|
struct Settings;
|
||||||
|
|
||||||
|
boost::optional<osg::Vec3f> findRandomPointAroundCircle(const dtNavMesh& navMesh, const osg::Vec3f& halfExtents,
|
||||||
|
const osg::Vec3f& start, const float maxRadius, const Flags includeFlags, const Settings& settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,20 @@
|
|||||||
|
#include "findrandompointaroundcircle.hpp"
|
||||||
|
#include "navigator.hpp"
|
||||||
|
|
||||||
|
namespace DetourNavigator
|
||||||
|
{
|
||||||
|
boost::optional<osg::Vec3f> Navigator::findRandomPointAroundCircle(const osg::Vec3f& agentHalfExtents,
|
||||||
|
const osg::Vec3f& start, const float maxRadius, const Flags includeFlags) const
|
||||||
|
{
|
||||||
|
const auto navMesh = getNavMesh(agentHalfExtents);
|
||||||
|
if (!navMesh)
|
||||||
|
return boost::optional<osg::Vec3f>();
|
||||||
|
const auto settings = getSettings();
|
||||||
|
const auto result = DetourNavigator::findRandomPointAroundCircle(navMesh->lockConst()->getImpl(),
|
||||||
|
toNavMeshCoordinates(settings, agentHalfExtents), toNavMeshCoordinates(settings, start),
|
||||||
|
toNavMeshCoordinates(settings, maxRadius), includeFlags, settings);
|
||||||
|
if (!result)
|
||||||
|
return boost::optional<osg::Vec3f>();
|
||||||
|
return boost::optional<osg::Vec3f>(fromNavMeshCoordinates(settings, *result));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue