From d2af3e557592779d2ae6c2204161aee4033452be Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 8 Dec 2021 19:03:54 +0900 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E4=B8=80=E3=81=AE=E3=83=90=E3=82=A4?= =?UTF-8?q?=E3=83=88=E5=88=97=E3=82=92=E5=8F=82=E7=85=A7=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=80=81BufferAccessor=20=E3=81=8C=E8=A4=87=E6=95=B0=E5=9B=9E?= =?UTF-8?q?=E3=80=81=E5=BA=A7=E6=A8=99=E5=A4=89=E6=8F=9B(=E5=8F=B3?= =?UTF-8?q?=E6=89=8B=E3=83=BB=E5=B7=A6=E6=89=8B=E5=A4=89=E6=8F=9B)?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=82=8B=E3=81=AE=E3=82=92=E5=9B=9E=E9=81=BF?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/ModelExtensionsForCoordinates.cs | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/Assets/VRM10/vrmlib/Runtime/ModelExtensionsForCoordinates.cs b/Assets/VRM10/vrmlib/Runtime/ModelExtensionsForCoordinates.cs index 648ded8a1..e2e52283f 100644 --- a/Assets/VRM10/vrmlib/Runtime/ModelExtensionsForCoordinates.cs +++ b/Assets/VRM10/vrmlib/Runtime/ModelExtensionsForCoordinates.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Numerics; using UniGLTF; @@ -153,6 +154,10 @@ namespace VrmLib /// static void ReverseAxisAndFlipTriangle(this Model model, Reverser reverser, bool ignoreVrm) { + // 複数の gltf.accessor が別の要素間で共有されている場合に、2回処理されることを防ぐ + // edgecase: InverseBindMatrices で遭遇 + var unique = new HashSet>(); + foreach (var g in model.MeshGroups) { foreach (var m in g.Meshes) @@ -161,7 +166,10 @@ namespace VrmLib { if (k == VertexBuffer.PositionKey || k == VertexBuffer.NormalKey) { - reverser.ReverseBuffer(v); + if (unique.Add(v.Bytes)) + { + reverser.ReverseBuffer(v); + } } else if (k == VertexBuffer.TangentKey) { @@ -169,19 +177,22 @@ namespace VrmLib } } - switch (m.IndexBuffer.ComponentType) + if (unique.Add(m.IndexBuffer.Bytes)) { - case AccessorValueType.UNSIGNED_BYTE: - FlipTriangle(SpanLike.Wrap(m.IndexBuffer.Bytes)); - break; - case AccessorValueType.UNSIGNED_SHORT: - FlipTriangle(SpanLike.Wrap(m.IndexBuffer.Bytes)); - break; - case AccessorValueType.UNSIGNED_INT: - FlipTriangle(SpanLike.Wrap(m.IndexBuffer.Bytes)); - break; - default: - throw new NotImplementedException(); + switch (m.IndexBuffer.ComponentType) + { + case AccessorValueType.UNSIGNED_BYTE: + FlipTriangle(SpanLike.Wrap(m.IndexBuffer.Bytes)); + break; + case AccessorValueType.UNSIGNED_SHORT: + FlipTriangle(SpanLike.Wrap(m.IndexBuffer.Bytes)); + break; + case AccessorValueType.UNSIGNED_INT: + FlipTriangle(SpanLike.Wrap(m.IndexBuffer.Bytes)); + break; + default: + throw new NotImplementedException(); + } } foreach (var mt in m.MorphTargets) @@ -190,7 +201,10 @@ namespace VrmLib { if (k == VertexBuffer.PositionKey || k == VertexBuffer.NormalKey) { - reverser.ReverseBuffer(v); + if (unique.Add(v.Bytes)) + { + reverser.ReverseBuffer(v); + } } if (k == VertexBuffer.TangentKey) { @@ -214,7 +228,10 @@ namespace VrmLib { if (s.InverseMatrices != null) { - reverser.ReverseBuffer(s.InverseMatrices); + if (unique.Add(s.InverseMatrices.Bytes)) + { + reverser.ReverseBuffer(s.InverseMatrices); + } } }