diff options
| author | chai <215380520@qq.com> | 2024-05-19 16:05:58 +0800 |
|---|---|---|
| committer | chai <215380520@qq.com> | 2024-05-19 16:05:58 +0800 |
| commit | 8e13e7e2874adc8982e16d1d2ed2e28d7480b45f (patch) | |
| tree | 63ef85c460288891f5a593d69afeca16cba050b3 /Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshSeparatorSimple.cs | |
| parent | c5f145786f4c6d2fe4bea831dfc16e52228920a5 (diff) | |
+1.57
Diffstat (limited to 'Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshSeparatorSimple.cs')
| -rw-r--r-- | Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshSeparatorSimple.cs | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshSeparatorSimple.cs b/Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshSeparatorSimple.cs new file mode 100644 index 0000000..6c79a16 --- /dev/null +++ b/Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshSeparatorSimple.cs @@ -0,0 +1,130 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +namespace NGS.MeshFusionPro; + +public class MeshSeparatorSimple +{ + private const int MAX_UV_CHANNELS = 4; + + private static Dictionary<Mesh, Mesh[]> _meshToSubmeshes; + + private static List<Vector3> _srcVertices; + + private static List<Vector3> _srcNormals; + + private static List<Vector4> _srcTangents; + + private static List<Vector2> _srcUV; + + private static List<int> _triangles; + + private static List<Vector3> _vertices; + + private static List<Vector3> _normals; + + private static List<Vector4> _tangents; + + private static List<Vector2> _uv; + + static MeshSeparatorSimple() + { + _meshToSubmeshes = new Dictionary<Mesh, Mesh[]>(); + _srcVertices = new List<Vector3>(); + _srcNormals = new List<Vector3>(); + _srcTangents = new List<Vector4>(); + _srcUV = new List<Vector2>(); + _triangles = new List<int>(); + _vertices = new List<Vector3>(); + _normals = new List<Vector3>(); + _tangents = new List<Vector4>(); + _uv = new List<Vector2>(); + } + + public Mesh GetSubmesh(Mesh source, int submesh) + { + if (!_meshToSubmeshes.TryGetValue(source, out var value)) + { + value = Separate(source); + _meshToSubmeshes.Add(source, value); + } + return value[submesh]; + } + + private Mesh[] Separate(Mesh mesh) + { + int subMeshCount = mesh.subMeshCount; + Mesh[] array = new Mesh[subMeshCount]; + CollectMeshData(mesh); + for (int i = 0; i < subMeshCount; i++) + { + array[i] = CreateFromSubmesh(mesh, i); + } + ClearData(); + return array; + } + + private void CollectMeshData(Mesh mesh) + { + mesh.GetVertices(_srcVertices); + mesh.GetNormals(_srcNormals); + mesh.GetTangents(_srcTangents); + } + + private Mesh CreateFromSubmesh(Mesh mesh, int submesh) + { + SubMeshDescriptor subMesh = mesh.GetSubMesh(submesh); + Mesh mesh2 = new Mesh(); + int indexCount = subMesh.indexCount; + int vertexCount = subMesh.vertexCount; + int firstVertex = subMesh.firstVertex; + int num = firstVertex + vertexCount; + _vertices.Clear(); + _normals.Clear(); + _tangents.Clear(); + mesh.GetIndices(_triangles, submesh); + for (int i = firstVertex; i < num; i++) + { + _vertices.Add(_srcVertices[i]); + _normals.Add(_srcNormals[i]); + _tangents.Add(_srcTangents[i]); + } + for (int j = 0; j < indexCount; j++) + { + _triangles[j] -= firstVertex; + } + mesh2.SetVertices(_vertices); + mesh2.SetNormals(_normals); + mesh2.SetTangents(_tangents); + mesh2.SetTriangles(_triangles, 0, calculateBounds: false); + mesh2.bounds = subMesh.bounds; + for (int k = 0; k < 4; k++) + { + mesh.GetUVs(k, _srcUV); + if (_srcUV.Count != 0) + { + _uv.Clear(); + for (int l = firstVertex; l < num; l++) + { + _uv.Add(_srcUV[l]); + } + mesh2.SetUVs(k, _uv); + } + } + return mesh2; + } + + private void ClearData() + { + _srcVertices.Clear(); + _srcNormals.Clear(); + _srcTangents.Clear(); + _srcUV.Clear(); + _triangles.Clear(); + _vertices.Clear(); + _normals.Clear(); + _tangents.Clear(); + _uv.Clear(); + } +} |
