Files
2026-06-04 11:42:34 +02:00

187 lines
6.6 KiB
C#

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<int> indices, out int[] newVertices)
{
int num = pb.sharedIndices.Length;
Dictionary<int, int> lookup = pb.sharedIndices.ToDictionary();
HashSet<int> hashSet = new HashSet<int>(indices.Select((int x) => lookup[x]));
HashSet<int> hashSet2 = new HashSet<int>();
foreach (int num2 in hashSet)
{
hashSet2.UnionWith(pb.sharedIndices[num2].array);
}
Dictionary<pb_Face, List<int>> dictionary = new Dictionary<pb_Face, List<int>>();
List<pb_Vertex> list = new List<pb_Vertex>(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<ConnectFaceRebuildData> list2 = new List<ConnectFaceRebuildData>();
List<pb_Face> list3 = new List<pb_Face>();
HashSet<int> hashSet3 = new HashSet<int>(pb.faces.Select((pb_Face x) => x.textureGroup));
int num3 = 1;
foreach (KeyValuePair<pb_Face, List<int>> keyValuePair in dictionary)
{
pb_Face key = keyValuePair.Key;
List<ConnectFaceRebuildData> 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<int> hashSet4 = new HashSet<int>();
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<int>();
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<ConnectFaceRebuildData> ConnectIndicesInFace(pb_Face face, int a, int b, List<pb_Vertex> vertices, Dictionary<int, int> lookup)
{
List<pb_Edge> list = pb_WingedEdge.SortEdgesByAdjacency(face);
List<pb_Vertex>[] array = new List<pb_Vertex>[]
{
new List<pb_Vertex>(),
new List<pb_Vertex>()
};
List<int>[] array2 = new List<int>[]
{
new List<int>(),
new List<int>()
};
List<int>[] array3 = new List<int>[]
{
new List<int>(),
new List<int>()
};
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<ConnectFaceRebuildData> list2 = new List<ConnectFaceRebuildData>();
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<ConnectFaceRebuildData> ConnectIndicesInFace(pb_Face face, List<int> indices, List<pb_Vertex> vertices, Dictionary<int, int> lookup, int sharedIndexOffset)
{
if (indices.Count < 3)
{
return null;
}
List<pb_Edge> list = pb_WingedEdge.SortEdgesByAdjacency(face);
int count = indices.Count;
List<List<pb_Vertex>> list2 = pbUtil.Fill<List<pb_Vertex>>((int x) => new List<pb_Vertex>(), count);
List<List<int>> list3 = pbUtil.Fill<List<int>>((int x) => new List<int>(), count);
List<List<int>> list4 = pbUtil.Fill<List<int>>((int x) => new List<int>(), 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<ConnectFaceRebuildData> list5 = new List<ConnectFaceRebuildData>();
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;
}
}
}