mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-11-08 10:29:00 +00:00
Precalculate abn in VertexPathfinder
Avoid calculating it in each of the 5 CheckVisibility functions.
This commit is contained in:
1 parent
36eb25de3a
commit
78ca04310e
1 file changed
+12
-20
@@ -111,10 +111,8 @@ static const entity_pos_t EDGE_EXPAND_DELTA = entity_pos_t::FromInt(1)/16;
|
||||
* Check whether a ray from 'a' to 'b' crosses any of the edges.
|
||||
* (Edges are one-sided so it's only considered a cross if going from front to back.)
|
||||
*/
|
||||
inline static bool CheckVisibility(const CFixedVector2D& a, const CFixedVector2D& b, const std::vector<Edge>& edges)
|
||||
inline static bool CheckVisibility(const CFixedVector2D& a, const CFixedVector2D& b, const CFixedVector2D& abn, const std::vector<Edge>& edges)
|
||||
{
|
||||
CFixedVector2D abn = (b - a).Perpendicular();
|
||||
|
||||
// Edges of general non-axis-aligned shapes
|
||||
for (size_t i = 0; i < edges.size(); ++i)
|
||||
{
|
||||
@@ -155,13 +153,11 @@ inline static bool CheckVisibility(const CFixedVector2D& a, const CFixedVector2D
|
||||
// They assume the caller has already excluded edges for which 'a' is
|
||||
// on the wrong side.)
|
||||
|
||||
inline static bool CheckVisibilityLeft(const CFixedVector2D& a, const CFixedVector2D& b, const std::vector<EdgeAA>& edges)
|
||||
inline static bool CheckVisibilityLeft(const CFixedVector2D& a, const CFixedVector2D& b, const CFixedVector2D& abn, const std::vector<EdgeAA>& edges)
|
||||
{
|
||||
if (a.X >= b.X)
|
||||
return true;
|
||||
|
||||
CFixedVector2D abn = (b - a).Perpendicular();
|
||||
|
||||
for (size_t i = 0; i < edges.size(); ++i)
|
||||
{
|
||||
if (b.X < edges[i].p0.X)
|
||||
@@ -183,13 +179,11 @@ inline static bool CheckVisibilityLeft(const CFixedVector2D& a, const CFixedVect
|
||||
return true;
|
||||
}
|
||||
|
||||
inline static bool CheckVisibilityRight(const CFixedVector2D& a, const CFixedVector2D& b, const std::vector<EdgeAA>& edges)
|
||||
inline static bool CheckVisibilityRight(const CFixedVector2D& a, const CFixedVector2D& b, const CFixedVector2D& abn, const std::vector<EdgeAA>& edges)
|
||||
{
|
||||
if (a.X <= b.X)
|
||||
return true;
|
||||
|
||||
CFixedVector2D abn = (b - a).Perpendicular();
|
||||
|
||||
for (size_t i = 0; i < edges.size(); ++i)
|
||||
{
|
||||
if (b.X > edges[i].p0.X)
|
||||
@@ -211,13 +205,11 @@ inline static bool CheckVisibilityRight(const CFixedVector2D& a, const CFixedVec
|
||||
return true;
|
||||
}
|
||||
|
||||
inline static bool CheckVisibilityBottom(const CFixedVector2D& a, const CFixedVector2D& b, const std::vector<EdgeAA>& edges)
|
||||
inline static bool CheckVisibilityBottom(const CFixedVector2D& a, const CFixedVector2D& b, const CFixedVector2D& abn, const std::vector<EdgeAA>& edges)
|
||||
{
|
||||
if (a.Y >= b.Y)
|
||||
return true;
|
||||
|
||||
CFixedVector2D abn = (b - a).Perpendicular();
|
||||
|
||||
for (size_t i = 0; i < edges.size(); ++i)
|
||||
{
|
||||
if (b.Y < edges[i].p0.Y)
|
||||
@@ -239,13 +231,11 @@ inline static bool CheckVisibilityBottom(const CFixedVector2D& a, const CFixedVe
|
||||
return true;
|
||||
}
|
||||
|
||||
inline static bool CheckVisibilityTop(const CFixedVector2D& a, const CFixedVector2D& b, const std::vector<EdgeAA>& edges)
|
||||
inline static bool CheckVisibilityTop(const CFixedVector2D& a, const CFixedVector2D& b, const CFixedVector2D& abn, const std::vector<EdgeAA>& edges)
|
||||
{
|
||||
if (a.Y <= b.Y)
|
||||
return true;
|
||||
|
||||
CFixedVector2D abn = (b - a).Perpendicular();
|
||||
|
||||
for (size_t i = 0; i < edges.size(); ++i)
|
||||
{
|
||||
if (b.Y > edges[i].p0.Y)
|
||||
@@ -848,12 +838,14 @@ WaypointPath VertexPathfinder::ComputeShortPath(const ShortPathRequest& request,
|
||||
continue;
|
||||
}
|
||||
|
||||
const CFixedVector2D abn = (npos - m_Vertexes[curr.id].p).Perpendicular();
|
||||
|
||||
bool visible =
|
||||
CheckVisibilityLeft(m_Vertexes[curr.id].p, npos, m_EdgesLeft) &&
|
||||
CheckVisibilityRight(m_Vertexes[curr.id].p, npos, m_EdgesRight) &&
|
||||
CheckVisibilityBottom(m_Vertexes[curr.id].p, npos, m_EdgesBottom) &&
|
||||
CheckVisibilityTop(m_Vertexes[curr.id].p, npos, m_EdgesTop) &&
|
||||
CheckVisibility(m_Vertexes[curr.id].p, npos, m_EdgesUnaligned);
|
||||
CheckVisibilityLeft(m_Vertexes[curr.id].p, npos, abn, m_EdgesLeft) &&
|
||||
CheckVisibilityRight(m_Vertexes[curr.id].p, npos, abn, m_EdgesRight) &&
|
||||
CheckVisibilityBottom(m_Vertexes[curr.id].p, npos, abn, m_EdgesBottom) &&
|
||||
CheckVisibilityTop(m_Vertexes[curr.id].p, npos, abn, m_EdgesTop) &&
|
||||
CheckVisibility(m_Vertexes[curr.id].p, npos, abn, m_EdgesUnaligned);
|
||||
|
||||
// Render the edges that we examine.
|
||||
g_VertexPathfinderDebugOverlay.DebugRenderEdges(cmpObstructionManager->GetSimContext(), visible, m_Vertexes[curr.id].p, npos);
|
||||
|
||||
Reference in new issue
Block a user