From 67811f720bf4469ab883caeb1e253b5522beea09 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 26 Apr 2021 18:45:58 +0900 Subject: [PATCH] fix flip --- .../Runtime/UniGLTF/IO/MeshExporterDivided.cs | 14 +-- .../UniGLTF/Tests/UniGLTF/DividedMeshTests.cs | 45 ---------- Assets/VRM/Tests/VrmDividedMeshTests.cs | 86 +++++++++++++++++++ .../Tests/VrmDividedMeshTests.cs.meta} | 2 +- 4 files changed, 95 insertions(+), 52 deletions(-) delete mode 100644 Assets/UniGLTF/Tests/UniGLTF/DividedMeshTests.cs create mode 100644 Assets/VRM/Tests/VrmDividedMeshTests.cs rename Assets/{UniGLTF/Tests/UniGLTF/DividedMeshTests.cs.meta => VRM/Tests/VrmDividedMeshTests.cs.meta} (83%) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs index 2a9a77277..2ca17055f 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs @@ -197,20 +197,22 @@ namespace UniGLTF { materialIndex = unityMaterials.IndexOf(material); } - var indexMap = usedIndices.Select((used, index) => (used, index)).ToDictionary(x => x.used, x => x.index); var flipped = new List(); for (int j = 0; j < indices.Length; j += 3) { - if (buffer.ContainsTriangle(j, j + 1, j + 2)) + var t0 = indices[j]; + var t1 = indices[j + 1]; + var t2 = indices[j + 2]; + if (buffer.ContainsTriangle(t0, t1, t2)) { - flipped.Add(indexMap[indices[j + 2]]); - flipped.Add(indexMap[indices[j + 1]]); - flipped.Add(indexMap[indices[j]]); + flipped.Add(t2); + flipped.Add(t1); + flipped.Add(t0); } else { - Debug.LogWarning($"triangle not contains [{j}, {j + 1}, {j + 2}]"); + Debug.LogWarning($"triangle not contains [{t0}, {t1}, {t2}]"); } } var gltfPrimitive = buffer.ToGltfPrimitive(gltf, bufferIndex, materialIndex, flipped); diff --git a/Assets/UniGLTF/Tests/UniGLTF/DividedMeshTests.cs b/Assets/UniGLTF/Tests/UniGLTF/DividedMeshTests.cs deleted file mode 100644 index cf4945556..000000000 --- a/Assets/UniGLTF/Tests/UniGLTF/DividedMeshTests.cs +++ /dev/null @@ -1,45 +0,0 @@ -using NUnit.Framework; -using UnityEngine; - -namespace UniGLTF -{ - public class DividedMeshTests - { - /// - /// positions: [ - /// {1, 1, 0} - /// {1, 1, 1} - /// {1, 1, 2} - /// {1, 1, 3} - /// {1, 1, 4} - /// {1, 1, 5} - /// ] - /// submesh - /// 0 1 2 - /// submesh - /// 3 4 5 - /// - [Test] - public void ExportDividedMeshTest() - { - var gltf = new glTF(); - gltf.AddBuffer(new UniGLTF.ArrayByteBuffer()); - - { - var buffer = new UniGLTF.MeshExporterDivided.VertexBuffer(6, null); - buffer.Push(0, new Vector3(1, 1, 0), Vector3.up, Vector2.zero); - buffer.Push(1, new Vector3(1, 1, 1), Vector3.up, Vector2.zero); - buffer.Push(2, new Vector3(1, 1, 2), Vector3.up, Vector2.zero); - var prim = buffer.ToGltfPrimitive(gltf, 0, 0, new[] { 0, 1, 2 }); - } - - { - var buffer = new UniGLTF.MeshExporterDivided.VertexBuffer(6, null); - buffer.Push(3, new Vector3(1, 1, 3), Vector3.up, Vector2.zero); - buffer.Push(4, new Vector3(1, 1, 4), Vector3.up, Vector2.zero); - buffer.Push(5, new Vector3(1, 1, 5), Vector3.up, Vector2.zero); - var prim = buffer.ToGltfPrimitive(gltf, 0, 0, new[] { 3, 4, 5 }); - } - } - } -} diff --git a/Assets/VRM/Tests/VrmDividedMeshTests.cs b/Assets/VRM/Tests/VrmDividedMeshTests.cs new file mode 100644 index 000000000..aa7eb86a4 --- /dev/null +++ b/Assets/VRM/Tests/VrmDividedMeshTests.cs @@ -0,0 +1,86 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using NUnit.Framework; +using UniGLTF; +using UnityEngine; +using VRMShaders; + +namespace VRM +{ + public class DividedMeshTests + { + static string AliciaPath + { + get + { + return Path.GetFullPath(Application.dataPath + "/../Tests/Models/Alicia_vrm-0.51/AliciaSolid_vrm-0.51.vrm") + .Replace("\\", "/"); + } + } + + static GameObject Load(byte[] bytes, string path) + { + var parser = new GltfParser(); + parser.Parse(path, bytes); + + using (var loader = new VRMImporterContext(parser)) + { + loader.Load(); + loader.ShowMeshes(); + return loader.DisposeOnGameObjectDestroyed().gameObject; + } + } + + static IEnumerable GetMeshes(GameObject gameObject) + { + foreach (var r in gameObject.GetComponentsInChildren()) + { + if (r is SkinnedMeshRenderer smr) + { + yield return smr.sharedMesh; + } + else if (r is MeshRenderer mr) + { + yield return r.GetComponent().sharedMesh; + } + } + } + + /// + /// positions: [ + /// {1, 1, 0} + /// {1, 1, 1} + /// {1, 1, 2} + /// {1, 1, 3} + /// {1, 1, 4} + /// {1, 1, 5} + /// ] + /// submesh + /// 0 1 2 + /// submesh + /// 3 4 5 + /// + [Test] + public void ExportDividedMeshTest() + { + var path = AliciaPath; + var loaded = Load(File.ReadAllBytes(path), path); + + var exported = VRMExporter.Export(new UniGLTF.MeshExportSettings + { + DivideVertexBuffer = true, // test this + ExportOnlyBlendShapePosition = true, + ExportTangents = false, + UseSparseAccessorForMorphTarget = true, + }, loaded, AssetTextureUtil.IsTextureEditorAsset, AssetTextureUtil.GetTextureBytesWithMime); + var bytes = exported.ToGlbBytes(); + var divided = Load(bytes, path); + + var src = GetMeshes(loaded).ToArray(); + var div = GetMeshes(divided).ToArray(); + + Assert.AreEqual(src[0].triangles.Length, div[0].triangles.Length); + } + } +} diff --git a/Assets/UniGLTF/Tests/UniGLTF/DividedMeshTests.cs.meta b/Assets/VRM/Tests/VrmDividedMeshTests.cs.meta similarity index 83% rename from Assets/UniGLTF/Tests/UniGLTF/DividedMeshTests.cs.meta rename to Assets/VRM/Tests/VrmDividedMeshTests.cs.meta index c56c41760..44b379e26 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/DividedMeshTests.cs.meta +++ b/Assets/VRM/Tests/VrmDividedMeshTests.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1e859e08abedf9346bdadedd79eb3e67 +guid: 5739a74d19763bb498ed1a035e25daf7 MonoImporter: externalObjects: {} serializedVersion: 2