diff --git a/src/DotRecast.Detour/DtNavMeshQuery.cs b/src/DotRecast.Detour/DtNavMeshQuery.cs index 7b4052a..4bc232e 100644 --- a/src/DotRecast.Detour/DtNavMeshQuery.cs +++ b/src/DotRecast.Detour/DtNavMeshQuery.cs @@ -339,16 +339,13 @@ namespace DotRecast.Detour } // Find edge and calc distance to the edge. - Result portalpoints = GetPortalPoints(bestRef, bestPoly, bestTile, neighbourRef, - neighbourPoly, neighbourTile, 0, 0); - if (portalpoints.Failed()) + var ppStatus = GetPortalPoints(bestRef, bestPoly, bestTile, neighbourRef, + neighbourPoly, neighbourTile, out var va, out var vb); + if (ppStatus.Failed()) { continue; } - var va = portalpoints.result.left; - var vb = portalpoints.result.right; - // If the circle is not touching the next polygon, skip it. var distSqr = DetourCommon.DistancePtSegSqr2D(centerPos, va, vb, out var tesg); if (distSqr > radiusSqr) @@ -1482,15 +1479,12 @@ namespace DotRecast.Detour return DtStatus.DT_FAILURE; } - Result portals = GetPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, 0, 0); - if (portals.Failed()) + var ppStatus = GetPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, out var left, out var right); + if (ppStatus.Failed()) { break; } - var left = portals.result.left; - var right = portals.result.right; - if ((options & DT_STRAIGHTPATH_AREA_CROSSINGS) != 0) { // Skip intersection if only area crossings are requested. @@ -1994,15 +1988,18 @@ namespace DotRecast.Detour int toType = toPoly.GetPolyType(); - return GetPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, fromType, toType); + var ppStatus = GetPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, out var left, out var right); + return Results.Of(ppStatus, new PortalResult(left, right, fromType, toType)); } // Returns portal points between two polygons. - protected Result GetPortalPoints(long from, DtPoly fromPoly, DtMeshTile fromTile, long to, DtPoly toPoly, - DtMeshTile toTile, int fromType, int toType) + protected DtStatus GetPortalPoints(long from, DtPoly fromPoly, DtMeshTile fromTile, + long to, DtPoly toPoly, DtMeshTile toTile, + out RcVec3f left, out RcVec3f right) { - RcVec3f left = new RcVec3f(); - RcVec3f right = new RcVec3f(); + left = RcVec3f.Zero; + right = RcVec3f.Zero; + // Find the link that points to the 'to' polygon. DtLink link = null; for (int i = fromTile.polyLinks[fromPoly.index]; i != DtNavMesh.DT_NULL_LINK; i = fromTile.links[i].next) @@ -2016,7 +2013,7 @@ namespace DotRecast.Detour if (link == null) { - return Results.InvalidParam("No link found"); + return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM; } // Handle off-mesh connections. @@ -2035,11 +2032,12 @@ namespace DotRecast.Detour right.x = fromTile.data.verts[fromPoly.verts[v] * 3]; right.y = fromTile.data.verts[fromPoly.verts[v] * 3 + 1]; right.z = fromTile.data.verts[fromPoly.verts[v] * 3 + 2]; - return Results.Success(new PortalResult(left, right, fromType, toType)); + + return DtStatus.DT_SUCCSESS; } } - return Results.InvalidParam("Invalid offmesh from connection"); + return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM; } if (toPoly.GetPolyType() == DtPoly.DT_POLYTYPE_OFFMESH_CONNECTION) @@ -2057,11 +2055,11 @@ namespace DotRecast.Detour right.y = toTile.data.verts[toPoly.verts[v] * 3 + 1]; right.z = toTile.data.verts[toPoly.verts[v] * 3 + 2]; - return Results.Success(new PortalResult(left, right, fromType, toType)); + return DtStatus.DT_SUCCSESS; } } - return Results.InvalidParam("Invalid offmesh to connection"); + return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM; } // Find portal vertices. @@ -2090,20 +2088,18 @@ namespace DotRecast.Detour } } - return Results.Success(new PortalResult(left, right, fromType, toType)); + return DtStatus.DT_SUCCSESS; } protected Result GetEdgeMidPoint(long from, DtPoly fromPoly, DtMeshTile fromTile, long to, DtPoly toPoly, DtMeshTile toTile) { - Result ppoints = GetPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, 0, 0); - if (ppoints.Failed()) + var ppStatus = GetPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, out var left, out var right); + if (ppStatus.Failed()) { - return Results.Of(ppoints.status, ppoints.message); + return Results.Of(ppStatus, ""); } - var left = ppoints.result.left; - var right = ppoints.result.right; RcVec3f mid = new RcVec3f(); mid.x = (left.x + right.x) * 0.5f; mid.y = (left.y + right.y) * 0.5f; @@ -2114,14 +2110,12 @@ namespace DotRecast.Detour protected Result GetEdgeIntersectionPoint(RcVec3f fromPos, long from, DtPoly fromPoly, DtMeshTile fromTile, RcVec3f toPos, long to, DtPoly toPoly, DtMeshTile toTile) { - Result ppoints = GetPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, 0, 0); - if (ppoints.Failed()) + var ppStatus = GetPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, out var left, out var right); + if (ppStatus.Failed()) { - return Results.Of(ppoints.status, ppoints.message); + return Results.Of(ppStatus, ""); } - RcVec3f left = ppoints.result.left; - RcVec3f right = ppoints.result.right; float t = 0.5f; if (DetourCommon.IntersectSegSeg2D(fromPos, toPos, left, right, out var _, out var t2)) { @@ -2529,16 +2523,13 @@ namespace DotRecast.Detour } // Find edge and calc distance to the edge. - Result pp = GetPortalPoints(bestRef, bestPoly, bestTile, neighbourRef, neighbourPoly, - neighbourTile, 0, 0); - if (pp.Failed()) + var ppStatus = GetPortalPoints(bestRef, bestPoly, bestTile, neighbourRef, neighbourPoly, + neighbourTile, out var va, out var vb); + if (ppStatus.Failed()) { continue; } - var va = pp.result.left; - var vb = pp.result.right; - // If the circle is not touching the next polygon, skip it. var distSqr = DetourCommon.DistancePtSegSqr2D(centerPos, va, vb, out var _); if (distSqr > radiusSqr) @@ -2711,16 +2702,13 @@ namespace DotRecast.Detour } // Find edge and calc distance to the edge. - Result pp = GetPortalPoints(bestRef, bestPoly, bestTile, neighbourRef, neighbourPoly, - neighbourTile, 0, 0); - if (pp.Failed()) + var ppStatus = GetPortalPoints(bestRef, bestPoly, bestTile, neighbourRef, neighbourPoly, + neighbourTile, out var va, out var vb); + if (ppStatus.Failed()) { continue; } - var va = pp.result.left; - var vb = pp.result.right; - // If the poly is not touching the edge to the next polygon, skip the connection it. IntersectResult ir = DetourCommon.IntersectSegmentPoly2D(va, vb, verts, nverts); if (!ir.intersects) @@ -2883,16 +2871,13 @@ namespace DotRecast.Detour } // Find edge and calc distance to the edge. - Result pp = GetPortalPoints(curRef, curPoly, curTile, neighbourRef, neighbourPoly, - neighbourTile, 0, 0); - if (pp.Failed()) + var ppStatus = GetPortalPoints(curRef, curPoly, curTile, neighbourRef, neighbourPoly, + neighbourTile, out var va, out var vb); + if (ppStatus.Failed()) { continue; } - var va = pp.result.left; - var vb = pp.result.right; - // If the circle is not touching the next polygon, skip it. var distSqr = DetourCommon.DistancePtSegSqr2D(centerPos, va, vb, out var _); if (distSqr > radiusSqr)