using System; using System.Collections.Generic; using System.Linq; using ProBuilder2.Common; using UnityEngine; namespace ProBuilder2.MeshOperations { // Token: 0x0200000D RID: 13 public static class pb_ConnectVertices { // Token: 0x06000084 RID: 132 RVA: 0x0000AF64 File Offset: 0x00009364 public static pb_ActionResult Connect(this pb_Object pb, IList indices, out int[] newVertices) { int num = pb.sharedIndices.Length; Dictionary lookup = pb.sharedIndices.ToDictionary(); HashSet hashSet = new HashSet(indices.Select((int x) => lookup[x])); HashSet hashSet2 = new HashSet(); foreach (int num2 in hashSet) { hashSet2.UnionWith(pb.sharedIndices[num2].array); } Dictionary> dictionary = new Dictionary>(); List list = new List(pb_Vertex.GetVertices(pb, null)); foreach (pb_Face pb_Face in pb.faces) { int[] distinctIndices = pb_Face.distinctIndices; for (int j = 0; j < distinctIndices.Length; j++) { if (hashSet2.Contains(distinctIndices[j])) { dictionary.AddOrAppend(pb_Face, distinctIndices[j]); } } } List list2 = new List(); List list3 = new List(); HashSet hashSet3 = new HashSet(pb.faces.Select((pb_Face x) => x.textureGroup)); int num3 = 1; foreach (KeyValuePair> keyValuePair in dictionary) { pb_Face key = keyValuePair.Key; List list4 = ((keyValuePair.Value.Count != 2) ? pb_ConnectVertices.ConnectIndicesInFace(key, keyValuePair.Value, list, lookup, num++) : pb_ConnectVertices.ConnectIndicesInFace(key, keyValuePair.Value[0], keyValuePair.Value[1], list, lookup)); if (list4 != null) { if (key.textureGroup < 0) { while (hashSet3.Contains(num3)) { num3++; } hashSet3.Add(num3); } foreach (ConnectFaceRebuildData connectFaceRebuildData in list4) { connectFaceRebuildData.faceRebuildData.face.textureGroup = ((key.textureGroup >= 0) ? key.textureGroup : num3); connectFaceRebuildData.faceRebuildData.face.uv = new pb_UV(key.uv); connectFaceRebuildData.faceRebuildData.face.smoothingGroup = key.smoothingGroup; connectFaceRebuildData.faceRebuildData.face.manualUV = key.manualUV; connectFaceRebuildData.faceRebuildData.face.material = key.material; } list3.Add(key); list2.AddRange(list4); } } pb_FaceRebuildData.Apply(list2.Select((ConnectFaceRebuildData x) => x.faceRebuildData), pb, list, null, lookup, null); pb.SetSharedIndices(lookup); pb.SetSharedIndicesUV(new pb_IntArray[0]); int num4 = pb.DeleteFaces(list3).Length; lookup = pb.sharedIndices.ToDictionary(); HashSet hashSet4 = new HashSet(); for (int k = 0; k < list2.Count; k++) { for (int l = 0; l < list2[k].newVertexIndices.Count; l++) { hashSet4.Add(lookup[list2[k].newVertexIndices[l] + (list2[k].faceRebuildData.Offset() - num4)]); } } newVertices = hashSet4.Select((int x) => pb.sharedIndices[x][0]).ToArray(); pb.ToMesh(); return new pb_ActionResult(Status.Success, string.Format("Connected {0} Vertices", hashSet.Count)); } // Token: 0x06000085 RID: 133 RVA: 0x0000B424 File Offset: 0x00009824 private static List ConnectIndicesInFace(pb_Face face, int a, int b, List vertices, Dictionary lookup) { List list = pb_WingedEdge.SortEdgesByAdjacency(face); List[] array = new List[] { new List(), new List() }; List[] array2 = new List[] { new List(), new List() }; List[] array3 = new List[] { new List(), new List() }; int num = 0; for (int i = 0; i < list.Count; i++) { if (list[i].Contains(a) && list[i].Contains(b)) { return null; } int x = list[i].x; array[num].Add(vertices[x]); array2[num].Add(lookup[x]); if (x == a || x == b) { num = (num + 1) % 2; array3[num].Add(array[num].Count); array[num].Add(vertices[x]); array2[num].Add(lookup[x]); } } List list2 = new List(); Vector3 vector = pb_Math.Normal(vertices, face.indices); for (int j = 0; j < array.Length; j++) { pb_FaceRebuildData pb_FaceRebuildData = pb_AppendPolygon.FaceWithVertices(array[j], false); pb_FaceRebuildData.sharedIndices = array2[j]; Vector3 vector2 = pb_Math.Normal(array[j], pb_FaceRebuildData.face.indices); if (Vector3.Dot(vector, vector2) < 0f) { pb_FaceRebuildData.face.ReverseIndices(); } list2.Add(new ConnectFaceRebuildData(pb_FaceRebuildData, array3[j])); } return list2; } // Token: 0x06000086 RID: 134 RVA: 0x0000B5D0 File Offset: 0x000099D0 private static List ConnectIndicesInFace(pb_Face face, List indices, List vertices, Dictionary lookup, int sharedIndexOffset) { if (indices.Count < 3) { return null; } List list = pb_WingedEdge.SortEdgesByAdjacency(face); int count = indices.Count; List> list2 = pbUtil.Fill>((int x) => new List(), count); List> list3 = pbUtil.Fill>((int x) => new List(), count); List> list4 = pbUtil.Fill>((int x) => new List(), count); pb_Vertex pb_Vertex = pb_Vertex.Average(vertices, indices); Vector3 vector = pb_Math.Normal(vertices, face.indices); int num = 0; for (int i = 0; i < list.Count; i++) { int x2 = list[i].x; list2[num].Add(vertices[x2]); list3[num].Add(lookup[x2]); if (indices.Contains(x2)) { list4[num].Add(list2[num].Count); list2[num].Add(pb_Vertex); list3[num].Add(sharedIndexOffset); num = (num + 1) % count; list4[num].Add(list2[num].Count); list2[num].Add(vertices[x2]); list3[num].Add(lookup[x2]); } } List list5 = new List(); for (int j = 0; j < list2.Count; j++) { if (list2[j].Count >= 3) { pb_FaceRebuildData pb_FaceRebuildData = pb_AppendPolygon.FaceWithVertices(list2[j], false); pb_FaceRebuildData.sharedIndices = list3[j]; Vector3 vector2 = pb_Math.Normal(list2[j], pb_FaceRebuildData.face.indices); if (Vector3.Dot(vector, vector2) < 0f) { pb_FaceRebuildData.face.ReverseIndices(); } list5.Add(new ConnectFaceRebuildData(pb_FaceRebuildData, list4[j])); } } return list5; } } }