// Token: 0x0600229B RID: 8859 RVA: 0x00190E64 File Offset: 0x0018F064 public static void GetContours(INavmesh navmesh, Action <List <Int3>, bool> results) { bool[] uses = new bool[3]; Dictionary <int, int> outline = new Dictionary <int, int>(); Dictionary <int, Int3> vertexPositions = new Dictionary <int, Int3>(); HashSet <int> hasInEdge = new HashSet <int>(); navmesh.GetNodes(delegate(GraphNode _node) { TriangleMeshNode triangleMeshNode = _node as TriangleMeshNode; uses[0] = (uses[1] = (uses[2] = false)); if (triangleMeshNode != null) { for (int i = 0; i < triangleMeshNode.connections.Length; i++) { TriangleMeshNode triangleMeshNode2 = triangleMeshNode.connections[i].node as TriangleMeshNode; if (triangleMeshNode2 != null) { int num = triangleMeshNode.SharedEdge(triangleMeshNode2); if (num != -1) { uses[num] = true; } } } for (int j = 0; j < 3; j++) { if (!uses[j]) { int i2 = j; int i3 = (j + 1) % triangleMeshNode.GetVertexCount(); outline[triangleMeshNode.GetVertexIndex(i2)] = triangleMeshNode.GetVertexIndex(i3); hasInEdge.Add(triangleMeshNode.GetVertexIndex(i3)); vertexPositions[triangleMeshNode.GetVertexIndex(i2)] = triangleMeshNode.GetVertex(i2); vertexPositions[triangleMeshNode.GetVertexIndex(i3)] = triangleMeshNode.GetVertex(i3); } } } }); Polygon.TraceContours(outline, hasInEdge, delegate(List <int> chain, bool cycle) { List <Int3> list = ListPool <Int3> .Claim(); for (int i = 0; i < chain.Count; i++) { list.Add(vertexPositions[chain[i]]); } results(list, cycle); }); }
// Token: 0x060025FE RID: 9726 RVA: 0x001A6C10 File Offset: 0x001A4E10 public bool GetPortal(GraphNode toNode, List <Vector3> left, List <Vector3> right, bool backwards, out int aIndex, out int bIndex) { aIndex = -1; bIndex = -1; if (backwards || toNode.GraphIndex != base.GraphIndex) { return(false); } TriangleMeshNode triangleMeshNode = toNode as TriangleMeshNode; int num = this.SharedEdge(triangleMeshNode); if (num == 255) { return(false); } if (num == -1) { for (int i = 0; i < this.connections.Length; i++) { if (this.connections[i].node.GraphIndex != base.GraphIndex) { NodeLink3Node nodeLink3Node = this.connections[i].node as NodeLink3Node; if (nodeLink3Node != null && nodeLink3Node.GetOther(this) == triangleMeshNode) { nodeLink3Node.GetPortal(triangleMeshNode, left, right, false); return(true); } } } return(false); } aIndex = num; bIndex = (num + 1) % this.GetVertexCount(); Int3 vertex = this.GetVertex(num); Int3 vertex2 = this.GetVertex((num + 1) % this.GetVertexCount()); int num2 = this.GetVertexIndex(0) >> 12 & 524287; int num3 = triangleMeshNode.GetVertexIndex(0) >> 12 & 524287; if (num2 != num3) { INavmeshHolder navmeshHolder = TriangleMeshNode.GetNavmeshHolder(base.GraphIndex); int num4; int num5; navmeshHolder.GetTileCoordinates(num2, out num4, out num5); int num6; int num7; navmeshHolder.GetTileCoordinates(num3, out num6, out num7); int i2; if (Math.Abs(num4 - num6) == 1) { i2 = 2; } else { if (Math.Abs(num5 - num7) != 1) { return(false); } i2 = 0; } int num8 = triangleMeshNode.SharedEdge(this); if (num8 == 255) { throw new Exception("Connection used edge in one direction, but not in the other direction. Has the wrong overload of AddConnection been used?"); } if (num8 != -1) { int num9 = Math.Min(vertex[i2], vertex2[i2]); int num10 = Math.Max(vertex[i2], vertex2[i2]); Int3 vertex3 = triangleMeshNode.GetVertex(num8); Int3 vertex4 = triangleMeshNode.GetVertex((num8 + 1) % triangleMeshNode.GetVertexCount()); num9 = Math.Max(num9, Math.Min(vertex3[i2], vertex4[i2])); num10 = Math.Min(num10, Math.Max(vertex3[i2], vertex4[i2])); if (vertex[i2] < vertex2[i2]) { vertex[i2] = num9; vertex2[i2] = num10; } else { vertex[i2] = num10; vertex2[i2] = num9; } } } if (left != null) { left.Add((Vector3)vertex); right.Add((Vector3)vertex2); } return(true); }