81 lines
2.7 KiB
C#
81 lines
2.7 KiB
C#
using System;
|
|
using System.Collections;
|
|
using Unity.Collections;
|
|
using Unity.HLODSystem.Utils;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace Unity.HLODSystem.Simplifier
|
|
{
|
|
public class UnityMeshSimplifier : SimplifierBase
|
|
{
|
|
|
|
[InitializeOnLoadMethod]
|
|
static void RegisterType()
|
|
{
|
|
SimplifierTypes.RegisterType(typeof(UnityMeshSimplifier));
|
|
}
|
|
|
|
public UnityMeshSimplifier(SerializableDynamicObject simplifierOptions): base(simplifierOptions)
|
|
{
|
|
}
|
|
|
|
protected override IEnumerator GetSimplifiedMesh(Utils.WorkingMesh origin, float quality, Action<Utils.WorkingMesh> resultCallback)
|
|
{
|
|
var meshSimplifier = new global::UnityMeshSimplifier.MeshSimplifier();
|
|
meshSimplifier.Vertices = origin.vertices;
|
|
meshSimplifier.Normals = origin.normals;
|
|
meshSimplifier.Tangents = origin.tangents;
|
|
meshSimplifier.UV1 = origin.uv;
|
|
meshSimplifier.UV2 = origin.uv2;
|
|
meshSimplifier.UV3 = origin.uv3;
|
|
meshSimplifier.UV4 = origin.uv4;
|
|
meshSimplifier.Colors = origin.colors;
|
|
|
|
var triangles = new int[origin.subMeshCount][];
|
|
for (var submesh = 0; submesh < origin.subMeshCount; submesh++)
|
|
{
|
|
triangles[submesh] = origin.GetTriangles(submesh);
|
|
}
|
|
|
|
meshSimplifier.AddSubMeshTriangles(triangles);
|
|
|
|
meshSimplifier.SimplifyMesh(quality);
|
|
|
|
int triCount = 0;
|
|
for (int i = 0; i < meshSimplifier.SubMeshCount; ++i)
|
|
{
|
|
triCount += meshSimplifier.GetSubMeshTriangles(i).Length;
|
|
}
|
|
|
|
Utils.WorkingMesh nwm = new WorkingMesh(Allocator.Persistent, meshSimplifier.Vertices.Length, triCount, meshSimplifier.SubMeshCount, 0);
|
|
nwm.name = origin.name;
|
|
nwm.vertices = meshSimplifier.Vertices;
|
|
nwm.normals = meshSimplifier.Normals;
|
|
nwm.tangents = meshSimplifier.Tangents;
|
|
nwm.uv = meshSimplifier.UV1;
|
|
nwm.uv2 = meshSimplifier.UV2;
|
|
nwm.uv3 = meshSimplifier.UV3;
|
|
nwm.uv4 = meshSimplifier.UV4;
|
|
nwm.colors = meshSimplifier.Colors;
|
|
nwm.subMeshCount = meshSimplifier.SubMeshCount;
|
|
for (var submesh = 0; submesh < nwm.subMeshCount; submesh++)
|
|
{
|
|
nwm.SetTriangles(meshSimplifier.GetSubMeshTriangles(submesh), submesh);
|
|
}
|
|
|
|
if (resultCallback != null)
|
|
{
|
|
resultCallback(nwm);
|
|
}
|
|
yield break;
|
|
}
|
|
|
|
|
|
|
|
public static void OnGUI(SerializableDynamicObject simplifierOptions)
|
|
{
|
|
OnGUIBase(simplifierOptions);
|
|
}
|
|
}
|
|
} |