summaryrefslogtreecommitdiff
path: root/Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshCutterSimpleLW.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshCutterSimpleLW.cs')
-rw-r--r--Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshCutterSimpleLW.cs66
1 files changed, 66 insertions, 0 deletions
diff --git a/Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshCutterSimpleLW.cs b/Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshCutterSimpleLW.cs
new file mode 100644
index 0000000..4a70c56
--- /dev/null
+++ b/Thronefall_1_57/Decompile/NGS.MeshFusionPro/MeshCutterSimpleLW.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Unity.Collections;
+using UnityEngine;
+
+namespace NGS.MeshFusionPro;
+
+public class MeshCutterSimpleLW : IMeshCutter
+{
+ private static List<int> _triangles;
+
+ static MeshCutterSimpleLW()
+ {
+ _triangles = new List<int>();
+ }
+
+ public void Cut(Mesh mesh, MeshCuttingInfo info)
+ {
+ Cut(mesh, new MeshCuttingInfo[1] { info });
+ }
+
+ public void Cut(Mesh mesh, IList<MeshCuttingInfo> infos)
+ {
+ ValidateMeshOrThrowException(mesh);
+ mesh.GetTriangles(_triangles, 0);
+ using (Mesh.MeshDataArray meshDataArray = Mesh.AcquireReadOnlyMeshData(mesh))
+ {
+ NativeArray<LightweightVertex> other = meshDataArray[0].GetVertexData<LightweightVertex>();
+ NativeList<LightweightVertex> nativeList = new NativeList<LightweightVertex>(Allocator.Temp);
+ nativeList.CopyFrom(in other);
+ foreach (MeshCuttingInfo item in infos.OrderByDescending((MeshCuttingInfo i) => i.triangleStart))
+ {
+ nativeList.RemoveRange(item.vertexStart, item.vertexCount);
+ _triangles.RemoveRange(item.triangleStart, item.triangleCount);
+ OffsetTriangles(item);
+ }
+ mesh.SetTriangles(_triangles, 0);
+ mesh.SetVertexBufferData<LightweightVertex>(nativeList, 0, 0, nativeList.Length);
+ }
+ _triangles.Clear();
+ }
+
+ private void ValidateMeshOrThrowException(Mesh mesh)
+ {
+ if (mesh == null)
+ {
+ throw new ArgumentNullException("mesh");
+ }
+ if (mesh.subMeshCount > 1)
+ {
+ throw new ArgumentException("SimpleMeshCutter::'mesh' should has only 1 submesh");
+ }
+ }
+
+ private void OffsetTriangles(MeshCuttingInfo info)
+ {
+ int vertexCount = info.vertexCount;
+ int triangleStart = info.triangleStart;
+ int count = _triangles.Count;
+ for (int i = triangleStart; i < count; i++)
+ {
+ _triangles[i] -= vertexCount;
+ }
+ }
+}