mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-08-04 07:46:40 -04:00
Remove int conversions from pathfinding
This commit is contained in:
parent
3b7b97c58c
commit
931555c7ff
@ -393,13 +393,13 @@ namespace MWMechanics
|
|||||||
osg::Vec3f localPos = actor.getRefData().getPosition().asVec3();
|
osg::Vec3f localPos = actor.getRefData().getPosition().asVec3();
|
||||||
coords.toLocal(localPos);
|
coords.toLocal(localPos);
|
||||||
|
|
||||||
int closestPointIndex = PathFinder::getClosestPoint(pathgrid, localPos);
|
size_t closestPointIndex = PathFinder::getClosestPoint(pathgrid, localPos);
|
||||||
for (int i = 0; i < static_cast<int>(pathgrid->mPoints.size()); i++)
|
for (size_t i = 0; i < pathgrid->mPoints.size(); i++)
|
||||||
{
|
{
|
||||||
if (i != closestPointIndex
|
if (i != closestPointIndex
|
||||||
&& getPathGridGraph(pathgrid).isPointConnected(closestPointIndex, i))
|
&& getPathGridGraph(pathgrid).isPointConnected(closestPointIndex, i))
|
||||||
{
|
{
|
||||||
points.push_back(pathgrid->mPoints[static_cast<size_t>(i)]);
|
points.push_back(pathgrid->mPoints[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -827,7 +827,7 @@ namespace MWMechanics
|
|||||||
if (pathgrid == nullptr || pathgrid->mPoints.empty())
|
if (pathgrid == nullptr || pathgrid->mPoints.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int index = PathFinder::getClosestPoint(pathgrid, PathFinder::makeOsgVec3(dest));
|
size_t index = PathFinder::getClosestPoint(pathgrid, PathFinder::makeOsgVec3(dest));
|
||||||
|
|
||||||
getPathGridGraph(pathgrid).getNeighbouringPoints(index, points);
|
getPathGridGraph(pathgrid).getNeighbouringPoints(index, points);
|
||||||
}
|
}
|
||||||
@ -860,7 +860,7 @@ namespace MWMechanics
|
|||||||
const osg::Vec3f npcPos = converter.toLocalVec3(mInitialActorPosition);
|
const osg::Vec3f npcPos = converter.toLocalVec3(mInitialActorPosition);
|
||||||
|
|
||||||
// Find closest pathgrid point
|
// Find closest pathgrid point
|
||||||
int closestPointIndex = PathFinder::getClosestPoint(pathgrid, npcPos);
|
size_t closestPointIndex = PathFinder::getClosestPoint(pathgrid, npcPos);
|
||||||
|
|
||||||
// mAllowedNodes for this actor with pathgrid point indexes based on mDistance
|
// mAllowedNodes for this actor with pathgrid point indexes based on mDistance
|
||||||
// and if the point is connected to the closest current point
|
// and if the point is connected to the closest current point
|
||||||
|
@ -25,15 +25,15 @@
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
// Chooses a reachable end pathgrid point. start is assumed reachable.
|
// Chooses a reachable end pathgrid point. start is assumed reachable.
|
||||||
std::pair<int, bool> getClosestReachablePoint(
|
std::pair<size_t, bool> getClosestReachablePoint(
|
||||||
const ESM::Pathgrid* grid, const MWMechanics::PathgridGraph* graph, const osg::Vec3f& pos, int start)
|
const ESM::Pathgrid* grid, const MWMechanics::PathgridGraph* graph, const osg::Vec3f& pos, size_t start)
|
||||||
{
|
{
|
||||||
assert(grid && !grid->mPoints.empty());
|
assert(grid && !grid->mPoints.empty());
|
||||||
|
|
||||||
float closestDistanceBetween = std::numeric_limits<float>::max();
|
float closestDistanceBetween = std::numeric_limits<float>::max();
|
||||||
float closestDistanceReachable = std::numeric_limits<float>::max();
|
float closestDistanceReachable = std::numeric_limits<float>::max();
|
||||||
int closestIndex = 0;
|
size_t closestIndex = 0;
|
||||||
int closestReachableIndex = 0;
|
size_t closestReachableIndex = 0;
|
||||||
// TODO: if this full scan causes performance problems mapping pathgrid
|
// TODO: if this full scan causes performance problems mapping pathgrid
|
||||||
// points to a quadtree may help
|
// points to a quadtree may help
|
||||||
for (size_t counter = 0; counter < grid->mPoints.size(); counter++)
|
for (size_t counter = 0; counter < grid->mPoints.size(); counter++)
|
||||||
@ -62,7 +62,7 @@ namespace
|
|||||||
// allowed nodes if not. Hence a path needs to be created even if the start
|
// allowed nodes if not. Hence a path needs to be created even if the start
|
||||||
// and the end points are the same.
|
// and the end points are the same.
|
||||||
|
|
||||||
return std::pair<int, bool>(closestReachableIndex, closestReachableIndex == closestIndex);
|
return { closestReachableIndex, closestReachableIndex == closestIndex };
|
||||||
}
|
}
|
||||||
|
|
||||||
float sqrDistance(const osg::Vec2f& lhs, const osg::Vec2f& rhs)
|
float sqrDistance(const osg::Vec2f& lhs, const osg::Vec2f& rhs)
|
||||||
@ -197,10 +197,10 @@ namespace MWMechanics
|
|||||||
// point right behind the wall that is closer than any pathgrid
|
// point right behind the wall that is closer than any pathgrid
|
||||||
// point outside the wall
|
// point outside the wall
|
||||||
osg::Vec3f startPointInLocalCoords(converter.toLocalVec3(startPoint));
|
osg::Vec3f startPointInLocalCoords(converter.toLocalVec3(startPoint));
|
||||||
int startNode = getClosestPoint(pathgrid, startPointInLocalCoords);
|
size_t startNode = getClosestPoint(pathgrid, startPointInLocalCoords);
|
||||||
|
|
||||||
osg::Vec3f endPointInLocalCoords(converter.toLocalVec3(endPoint));
|
osg::Vec3f endPointInLocalCoords(converter.toLocalVec3(endPoint));
|
||||||
std::pair<int, bool> endNode
|
std::pair<size_t, bool> endNode
|
||||||
= getClosestReachablePoint(pathgrid, &pathgridGraph, endPointInLocalCoords, startNode);
|
= getClosestReachablePoint(pathgrid, &pathgridGraph, endPointInLocalCoords, startNode);
|
||||||
|
|
||||||
// if it's shorter for actor to travel from start to end, than to travel from either
|
// if it's shorter for actor to travel from start to end, than to travel from either
|
||||||
|
@ -178,16 +178,16 @@ namespace MWMechanics
|
|||||||
//
|
//
|
||||||
// NOTE: pos is expected to be in local coordinates, as is grid->mPoints
|
// NOTE: pos is expected to be in local coordinates, as is grid->mPoints
|
||||||
//
|
//
|
||||||
static int getClosestPoint(const ESM::Pathgrid* grid, const osg::Vec3f& pos)
|
static size_t getClosestPoint(const ESM::Pathgrid* grid, const osg::Vec3f& pos)
|
||||||
{
|
{
|
||||||
assert(grid && !grid->mPoints.empty());
|
assert(grid && !grid->mPoints.empty());
|
||||||
|
|
||||||
float distanceBetween = distanceSquared(grid->mPoints[0], pos);
|
float distanceBetween = distanceSquared(grid->mPoints[0], pos);
|
||||||
int closestIndex = 0;
|
size_t closestIndex = 0;
|
||||||
|
|
||||||
// TODO: if this full scan causes performance problems mapping pathgrid
|
// TODO: if this full scan causes performance problems mapping pathgrid
|
||||||
// points to a quadtree may help
|
// points to a quadtree may help
|
||||||
for (unsigned int counter = 1; counter < grid->mPoints.size(); counter++)
|
for (size_t counter = 1; counter < grid->mPoints.size(); counter++)
|
||||||
{
|
{
|
||||||
float potentialDistBetween = distanceSquared(grid->mPoints[counter], pos);
|
float potentialDistBetween = distanceSquared(grid->mPoints[counter], pos);
|
||||||
if (potentialDistBetween < distanceBetween)
|
if (potentialDistBetween < distanceBetween)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user