Changeset View
Changeset View
Standalone View
Standalone View
source/simulation2/helpers/VertexPathfinder.h
/* Copyright (C) 2020 Wildfire Games. | /* Copyright (C) 2021 Wildfire Games. | ||||
* This file is part of 0 A.D. | * This file is part of 0 A.D. | ||||
* | * | ||||
* 0 A.D. is free software: you can redistribute it and/or modify | * 0 A.D. is free software: you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by | ||||
* the Free Software Foundation, either version 2 of the License, or | * the Free Software Foundation, either version 2 of the License, or | ||||
* (at your option) any later version. | * (at your option) any later version. | ||||
* | * | ||||
* 0 A.D. is distributed in the hope that it will be useful, | * 0 A.D. is distributed in the hope that it will be useful, | ||||
▲ Show 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | |||||
class ICmpObstructionManager; | class ICmpObstructionManager; | ||||
class CSimContext; | class CSimContext; | ||||
class SceneCollector; | class SceneCollector; | ||||
class VertexPathfinder | class VertexPathfinder | ||||
{ | { | ||||
public: | public: | ||||
VertexPathfinder(const u16& mapSize, Grid<NavcellData>* const & terrainOnlyGrid) : m_MapSize(mapSize), m_TerrainOnlyGrid(terrainOnlyGrid), m_DebugOverlay(false) {}; | VertexPathfinder(const u16& mapSize, Grid<NavcellData>* const & terrainOnlyGrid) : m_MapSize(mapSize), m_TerrainOnlyGrid(terrainOnlyGrid) {}; | ||||
VertexPathfinder(const VertexPathfinder&) = delete; | |||||
VertexPathfinder(VertexPathfinder&& o) : m_MapSize(o.m_MapSize), m_TerrainOnlyGrid(o.m_TerrainOnlyGrid) {} | |||||
/** | /** | ||||
* Compute a precise path from the given point to the goal, and return the set of waypoints. | * Compute a precise path from the given point to the goal, and return the set of waypoints. | ||||
* The path is based on the full set of obstructions that pass the filter, such that | * The path is based on the full set of obstructions that pass the filter, such that | ||||
* a unit of clearance 'clearance' will be able to follow the path with no collisions. | * a unit of clearance 'clearance' will be able to follow the path with no collisions. | ||||
* The path is restricted to a box of radius 'range' from the starting point. | * The path is restricted to a box of radius 'range' from the starting point. | ||||
* Defined in CCmpPathfinder_Vertex.cpp | * Defined in CCmpPathfinder_Vertex.cpp | ||||
*/ | */ | ||||
WaypointPath ComputeShortPath(const ShortPathRequest& request, CmpPtr<ICmpObstructionManager> cmpObstructionManager) const; | WaypointPath ComputeShortPath(const ShortPathRequest& request, CmpPtr<ICmpObstructionManager> cmpObstructionManager) const; | ||||
void SetDebugOverlay(bool enabled) { m_DebugOverlay = enabled; } | |||||
void RenderSubmit(SceneCollector& collector); | |||||
private: | private: | ||||
void DebugRenderGoal(const CSimContext& simContext, const PathGoal& goal) const; | |||||
void DebugRenderGraph(const CSimContext& simContext, const std::vector<Vertex>& vertexes, const std::vector<Edge>& edges, const std::vector<Square>& edgeSquares) const; | |||||
void DebugRenderEdges(const CSimContext& simContext, bool visible, CFixedVector2D curr, CFixedVector2D npos) const; | |||||
// References to the Pathfinder for convenience. | // References to the Pathfinder for convenience. | ||||
const u16& m_MapSize; | const u16& m_MapSize; | ||||
Grid<NavcellData>* const & m_TerrainOnlyGrid; | Grid<NavcellData>* const & m_TerrainOnlyGrid; | ||||
std::atomic<bool> m_DebugOverlay; | |||||
mutable std::vector<SOverlayLine> m_DebugOverlayShortPathLines; | |||||
// These vectors are expensive to recreate on every call, so we cache them here. | // These vectors are expensive to recreate on every call, so we cache them here. | ||||
// They are made mutable to allow using them in the otherwise const ComputeShortPath. | // They are made mutable to allow using them in the otherwise const ComputeShortPath. | ||||
mutable std::vector<Edge> m_EdgesUnaligned; | mutable std::vector<Edge> m_EdgesUnaligned; | ||||
mutable std::vector<EdgeAA> m_EdgesLeft; | mutable std::vector<EdgeAA> m_EdgesLeft; | ||||
mutable std::vector<EdgeAA> m_EdgesRight; | mutable std::vector<EdgeAA> m_EdgesRight; | ||||
mutable std::vector<EdgeAA> m_EdgesBottom; | mutable std::vector<EdgeAA> m_EdgesBottom; | ||||
mutable std::vector<EdgeAA> m_EdgesTop; | mutable std::vector<EdgeAA> m_EdgesTop; | ||||
// List of obstruction vertexes (plus start/end points); we'll try to find paths through | // List of obstruction vertexes (plus start/end points); we'll try to find paths through | ||||
// the graph defined by these vertexes. | // the graph defined by these vertexes. | ||||
mutable std::vector<Vertex> m_Vertexes; | mutable std::vector<Vertex> m_Vertexes; | ||||
// List of collision edges - paths must never cross these. | // List of collision edges - paths must never cross these. | ||||
// (Edges are one-sided so intersections are fine in one direction, but not the other direction.) | // (Edges are one-sided so intersections are fine in one direction, but not the other direction.) | ||||
mutable std::vector<Edge> m_Edges; | mutable std::vector<Edge> m_Edges; | ||||
mutable std::vector<Square> m_EdgeSquares; // Axis-aligned squares; equivalent to 4 edges. | mutable std::vector<Square> m_EdgeSquares; // Axis-aligned squares; equivalent to 4 edges. | ||||
}; | }; | ||||
/** | |||||
* There are several vertex pathfinders running asynchronously, so their debug output | |||||
* might conflict. To remain thread-safe, this single class will handle the debug data. | |||||
* NB: though threadsafe, the way things are setup means you can have a few | |||||
* more graphs and edges than you'd expect showing up in the rendered graph. | |||||
*/ | |||||
class VertexPathfinderDebugOverlay | |||||
{ | |||||
friend class VertexPathfinder; | |||||
public: | |||||
void SetDebugOverlay(bool enabled) { m_DebugOverlay = enabled; } | |||||
void RenderSubmit(SceneCollector& collector); | |||||
protected: | |||||
void DebugRenderGoal(const CSimContext& simContext, const PathGoal& goal); | |||||
void DebugRenderGraph(const CSimContext& simContext, const std::vector<Vertex>& vertexes, const std::vector<Edge>& edges, const std::vector<Square>& edgeSquares); | |||||
void DebugRenderEdges(const CSimContext& simContext, bool visible, CFixedVector2D curr, CFixedVector2D npos); | |||||
std::atomic<bool> m_DebugOverlay = false; | |||||
// The data is double buffered: the first is the 'work-in-progress' state, the second the last RenderSubmit state. | |||||
std::vector<SOverlayLine> m_DebugOverlayShortPathLines; | |||||
std::vector<SOverlayLine> m_DebugOverlayShortPathLinesSubmitted; | |||||
}; | |||||
extern VertexPathfinderDebugOverlay g_VertexPathfinderDebugOverlay; | |||||
#endif // INCLUDED_VERTEXPATHFINDER | #endif // INCLUDED_VERTEXPATHFINDER |
Wildfire Games · Phabricator