public static SimplifyPath3 ( IRaycastableGraph rcg, List |
||
rcg | IRaycastableGraph | |
nodes | List |
|
start | int | |
end | int | |
result | List |
|
startPoint | ||
endPoint | ||
depth | int | |
return | void |
public static void SimplifyPath3(IRaycastableGraph rcg, List <GraphNode> nodes, int start, int end, List <GraphNode> result, Vector3 startPoint, Vector3 endPoint, int depth = 0) { if (start == end) { result.Add(nodes[start]); return; } if (start + 1 == end) { result.Add(nodes[start]); result.Add(nodes[end]); return; } int count = result.Count; GraphHitInfo graphHitInfo; if (rcg.Linecast(startPoint, endPoint, nodes[start], out graphHitInfo, result) || result[result.Count - 1] != nodes[end]) { result.RemoveRange(count, result.Count - count); int num = 0; float num2 = 0f; for (int i = start + 1; i < end - 1; i++) { float num3 = AstarMath.DistancePointSegmentStrict(startPoint, endPoint, (Vector3)nodes[i].position); if (num3 > num2) { num = i; num2 = num3; } } int num4 = (num + start) / 2; int num5 = (num + end) / 2; if (num4 == num5) { RichFunnel.SimplifyPath3(rcg, nodes, start, num4, result, startPoint, (Vector3)nodes[num4].position, 0); result.RemoveAt(result.Count - 1); RichFunnel.SimplifyPath3(rcg, nodes, num4, end, result, (Vector3)nodes[num4].position, endPoint, depth + 1); } else { RichFunnel.SimplifyPath3(rcg, nodes, start, num4, result, startPoint, (Vector3)nodes[num4].position, depth + 1); result.RemoveAt(result.Count - 1); RichFunnel.SimplifyPath3(rcg, nodes, num4, num5, result, (Vector3)nodes[num4].position, (Vector3)nodes[num5].position, depth + 1); result.RemoveAt(result.Count - 1); RichFunnel.SimplifyPath3(rcg, nodes, num5, end, result, (Vector3)nodes[num5].position, endPoint, depth + 1); } } }
public void BuildFunnelCorridor(List <GraphNode> nodes, int start, int end) { this.exactStart = (nodes[start] as MeshNode).ClosestPointOnNode(this.exactStart); this.exactEnd = (nodes[end] as MeshNode).ClosestPointOnNode(this.exactEnd); this.left.Clear(); this.right.Clear(); this.left.Add(this.exactStart); this.right.Add(this.exactStart); this.nodes.Clear(); IRaycastableGraph raycastableGraph = this.graph as IRaycastableGraph; if (raycastableGraph != null && this.funnelSimplificationMode != RichFunnel.FunnelSimplification.None) { List <GraphNode> list = ListPool <GraphNode> .Claim(end - start); switch (this.funnelSimplificationMode) { case RichFunnel.FunnelSimplification.Iterative: this.SimplifyPath(raycastableGraph, nodes, start, end, list, this.exactStart, this.exactEnd); break; case RichFunnel.FunnelSimplification.RecursiveBinary: RichFunnel.SimplifyPath2(raycastableGraph, nodes, start, end, list, this.exactStart, this.exactEnd); break; case RichFunnel.FunnelSimplification.RecursiveTrinary: RichFunnel.SimplifyPath3(raycastableGraph, nodes, start, end, list, this.exactStart, this.exactEnd, 0); break; } if (this.nodes.Capacity < list.Count) { this.nodes.Capacity = list.Count; } for (int i = 0; i < list.Count; i++) { TriangleMeshNode triangleMeshNode = list[i] as TriangleMeshNode; if (triangleMeshNode != null) { this.nodes.Add(triangleMeshNode); } } ListPool <GraphNode> .Release(list); } else { if (this.nodes.Capacity < end - start) { this.nodes.Capacity = end - start; } for (int j = start; j <= end; j++) { TriangleMeshNode triangleMeshNode2 = nodes[j] as TriangleMeshNode; if (triangleMeshNode2 != null) { this.nodes.Add(triangleMeshNode2); } } } for (int k = 0; k < this.nodes.Count - 1; k++) { this.nodes[k].GetPortal(this.nodes[k + 1], this.left, this.right, false); } this.left.Add(this.exactEnd); this.right.Add(this.exactEnd); }