Files
2025-11-30 08:35:03 +02:00

80 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using JetBrains.Annotations;
using Needle.Engine.Gltf.Experimental;
using Needle.Engine.Gltf.Experimental.progressive;
using Needle.Engine.Utils;
using Newtonsoft.Json.Linq;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Needle.Engine.Gltf
{
[UsedImplicitly]
public class MeshCompressionHandler : GltfExtensionHandlerBase
{
public override void OnBeforeExport(GltfExportContext context)
{
base.OnBeforeExport(context);
// Try find mesh compression component first in children of the current root
// then search on the ExportInfo component
// and fallback anywhere in the current scene (perhaps the root scene)
var meshCompression = context.Root?.GetComponentInChildren<NeedleCompressionSettings>();
if (!meshCompression)
{
var exportInfo = ExportInfo.Get();
exportInfo?.TryGetComponent(out meshCompression);
}
if (!meshCompression) meshCompression = Object.FindAnyObjectByType<NeedleCompressionSettings>();
if (meshCompression)
{
var ext = new NEEDLE_mesh_compression_root();
switch (meshCompression.MeshCompression)
{
case MeshCompressionType.None:
ext.compression = "none";
break;
case MeshCompressionType.Draco:
ext.compression = "draco";
break;
case MeshCompressionType.Meshopt:
ext.compression = "meshopt";
break;
}
context.Bridge.AddExtension("NEEDLE_mesh_compression", ext);
}
}
public override void OnAfterPrimitiveExport(GltfExportContext context, Mesh mesh, List<object> extensions)
{
base.OnAfterPrimitiveExport(context, mesh, extensions);
if (NeedleAssetSettingsProvider.TryGetMeshSettings(mesh, out var settings))
{
if (settings.@override)
{
var ext = new NEEDLE_mesh_compression();
ext.useSimplifier = settings.useSimplifier;
ext.error = settings.error;
ext.ratio = settings.ratio;
ext.lockBorder = settings.lockBorder;
extensions.Add(ext);
return;
}
}
var labels = AssetDatabase.GetLabels(mesh);
foreach (var label in labels)
{
if (label.Equals("simplify", StringComparison.OrdinalIgnoreCase))
{
var ext = new NEEDLE_mesh_compression();
ext.useSimplifier = true;
extensions.Add(ext);
}
}
}
}
}