From 178835a02d5af06ccaa49fab4373f3025bafeb7e Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 2 Jun 2021 13:41:53 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E6=95=B4?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/UniGLTF/IO/MeshExporter.cs | 110 ++++++------------ .../Runtime/UniGLTF/IO/MeshExporterDivided.cs | 4 +- .../Runtime/UniGLTF/IO/gltfExporter.cs | 13 ++- Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs | 16 ++- 4 files changed, 60 insertions(+), 83 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs index 7b0cd7cfbf..56d6d91fe4 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs @@ -8,11 +8,12 @@ namespace UniGLTF { public static class MeshExporter { - /// /// primitive 間で vertex を共有する形で Export する。 /// /// UniVRM-0.71.0 までの挙動 + /// + /// UniVRM-0.71.0 以降は、MeshExporterDivided.Export もある /// /// /// /// @@ -22,7 +23,7 @@ public static class MeshExporter /// /// /// - static glTFMesh ExportSharedVertexBuffer(glTF gltf, int bufferIndex, + public static (glTFMesh, Dictionary blendShapeIndexMap) ExportSharedVertexBuffer(glTF gltf, int bufferIndex, MeshWithRenderer unityMesh, List unityMaterials, IAxisInverter axisInverter, MeshExportSettings settings) { @@ -146,7 +147,41 @@ static glTFMesh ExportSharedVertexBuffer(glTF gltf, int bufferIndex, material = unityMaterials.IndexOf(materials[j]) }); } - return gltfMesh; + + var blendShapeIndexMap = new Dictionary(); + { + var targetNames = new List(); + + int exportBlendShapes = 0; + for (int j = 0; j < unityMesh.Mesh.blendShapeCount; ++j) + { + var morphTarget = ExportMorphTarget(gltf, bufferIndex, + unityMesh.Mesh, j, + settings.UseSparseAccessorForMorphTarget, + settings.ExportOnlyBlendShapePosition, axisInverter); + if (morphTarget.POSITION < 0 && morphTarget.NORMAL < 0 && morphTarget.TANGENT < 0) + { + continue; + } + + // maybe skip + var blendShapeName = unityMesh.Mesh.GetBlendShapeName(j); + blendShapeIndexMap.Add(j, exportBlendShapes++); + targetNames.Add(blendShapeName); + + // + // all primitive has same blendShape + // + for (int k = 0; k < gltfMesh.primitives.Count; ++k) + { + gltfMesh.primitives[k].targets.Add(morphTarget); + } + } + + gltf_mesh_extras_targetNames.Serialize(gltfMesh, targetNames); + } + + return (gltfMesh, blendShapeIndexMap); } static bool UseSparse( @@ -207,16 +242,6 @@ static gltfMorphTarget ExportMorphTarget(glTF gltf, int bufferIndex, { Debug.LogFormat("Sparse {0}/{1}", sparseIndices.Length, mesh.vertexCount); } - /* - var vertexSize = 12; - if (useNormal) vertexSize += 12; - if (useTangent) vertexSize += 24; - var sparseBytes = (4 + vertexSize) * sparseIndices.Length; - var fullBytes = (vertexSize) * blendShapeVertices.Length; - Debug.LogFormat("Export sparse: {0}/{1}bytes({2}%)", - sparseBytes, fullBytes, (int)((float)sparseBytes / fullBytes) - ); - */ var sparseIndicesViewIndex = -1; if (usePosition) @@ -287,64 +312,5 @@ static gltfMorphTarget ExportMorphTarget(glTF gltf, int bufferIndex, TANGENT = blendShapeTangentAccessorIndex, }; } - - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public static (glTFMesh mesh, Dictionary blendShapeIndexMap) ExportMesh(glTF gltf, int bufferIndex, - MeshWithRenderer unityMesh, List unityMaterials, - MeshExportSettings settings, IAxisInverter axisInverter) - { - glTFMesh gltfMesh = default; - var blendShapeIndexMap = new Dictionary(); - if (settings.DivideVertexBuffer) - { - gltfMesh = MeshExporterDivided.Export(gltf, bufferIndex, unityMesh, unityMaterials, axisInverter, settings); - } - else - { - gltfMesh = ExportSharedVertexBuffer(gltf, bufferIndex, unityMesh, unityMaterials, axisInverter, settings); - - var targetNames = new List(); - - int exportBlendShapes = 0; - for (int j = 0; j < unityMesh.Mesh.blendShapeCount; ++j) - { - var morphTarget = ExportMorphTarget(gltf, bufferIndex, - unityMesh.Mesh, j, - settings.UseSparseAccessorForMorphTarget, - settings.ExportOnlyBlendShapePosition, axisInverter); - if (morphTarget.POSITION < 0 && morphTarget.NORMAL < 0 && morphTarget.TANGENT < 0) - { - continue; - } - - // maybe skip - var blendShapeName = unityMesh.Mesh.GetBlendShapeName(j); - blendShapeIndexMap.Add(j, exportBlendShapes++); - targetNames.Add(blendShapeName); - - // - // all primitive has same blendShape - // - for (int k = 0; k < gltfMesh.primitives.Count; ++k) - { - gltfMesh.primitives[k].targets.Add(morphTarget); - } - } - - gltf_mesh_extras_targetNames.Serialize(gltfMesh, targetNames); - } - - return (gltfMesh, blendShapeIndexMap); - } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs index 93286beb88..2658a2b35e 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs @@ -7,7 +7,7 @@ namespace UniGLTF { public static class MeshExporterDivided { - public static glTFMesh Export(glTF gltf, int bufferIndex, + public static (glTFMesh, Dictionary) Export(glTF gltf, int bufferIndex, MeshWithRenderer unityMesh, List unityMaterials, IAxisInverter axisInverter, MeshExportSettings settings) { @@ -100,7 +100,7 @@ public static glTFMesh Export(glTF gltf, int bufferIndex, var targetNames = Enumerable.Range(0, mesh.blendShapeCount).Select(x => mesh.GetBlendShapeName(x)).ToArray(); gltf_mesh_extras_targetNames.Serialize(gltfMesh, targetNames); - return gltfMesh; + return (gltfMesh, Enumerable.Range(0, mesh.blendShapeCount).ToDictionary(x => x, x => x)); } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs index 3fabfb4384..d34008efe3 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs @@ -156,7 +156,7 @@ static glTFNode ExportNode(Transform x, List nodes, List(); - if(meshFilter != null) + if (meshFilter != null) { var mesh = meshFilter.sharedMesh; var materials = meshRenderer.sharedMaterials; @@ -164,7 +164,7 @@ static glTFNode ExportNode(Transform x, List nodes, List nodes, List>(); foreach (var unityMesh in uniqueUnityMeshes) { - var (gltfMesh, blendShapeIndexMap) = MeshExporter.ExportMesh(glTF, bufferIndex, unityMesh, Materials, meshExportSettings, m_axisInverter); + var (gltfMesh, blendShapeIndexMap) = meshExportSettings.DivideVertexBuffer + ? MeshExporterDivided.Export(glTF, bufferIndex, unityMesh, Materials, m_axisInverter, meshExportSettings) + : MeshExporter.ExportSharedVertexBuffer(glTF, bufferIndex, unityMesh, Materials, m_axisInverter, meshExportSettings) + ; glTF.meshes.Add(gltfMesh); Meshes.Add(unityMesh.Mesh); if (!MeshBlendShapeIndexMap.ContainsKey(unityMesh.Mesh)) { - // 同じmeshが複数回現れた + // 重複防止 MeshBlendShapeIndexMap.Add(unityMesh.Mesh, blendShapeIndexMap); } } diff --git a/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs b/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs index 53b3747668..e5dc10c7ca 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs @@ -127,14 +127,18 @@ public void SharedVertexBufferTest() new Material(Shader.Find("Standard")), // B }; - var (go, unityMesh) = CreateMesh(Materials.ToArray()); + var (go, mesh) = CreateMesh(Materials.ToArray()); var meshExportSettings = new MeshExportSettings { DivideVertexBuffer = false }; var axisInverter = Axes.X.Create(); - var (gltfMesh, blendShapeIndexMap) = MeshExporter.ExportMesh(glTF, bufferIndex, new MeshWithRenderer(go.transform), Materials, meshExportSettings, axisInverter); + var unityMesh = new MeshWithRenderer(go.transform); + var (gltfMesh, blendShapeIndexMap) = meshExportSettings.DivideVertexBuffer + ? MeshExporterDivided.Export(glTF, bufferIndex, unityMesh, Materials, axisInverter, meshExportSettings) + : MeshExporter.ExportSharedVertexBuffer(glTF, bufferIndex, unityMesh, Materials,axisInverter, meshExportSettings) + ; { var indices = glTF.GetIndices(gltfMesh.primitives[0].indices); @@ -171,14 +175,18 @@ public void DividedVertexBufferTest() new Material(Shader.Find("Standard")), // B }; - var (go, unityMesh) = CreateMesh(Materials.ToArray()); + var (go, mesh) = CreateMesh(Materials.ToArray()); var meshExportSettings = new MeshExportSettings { DivideVertexBuffer = true }; var axisInverter = Axes.X.Create(); - var (gltfMesh, blendShapeIndexMap) = MeshExporter.ExportMesh(glTF, bufferIndex, new MeshWithRenderer(go.transform), Materials, meshExportSettings, axisInverter); + var unityMesh = new MeshWithRenderer(go.transform); + var (gltfMesh, blendShapeIndexMap) = meshExportSettings.DivideVertexBuffer + ? MeshExporterDivided.Export(glTF, bufferIndex, unityMesh, Materials, axisInverter, meshExportSettings) + : MeshExporter.ExportSharedVertexBuffer(glTF, bufferIndex, unityMesh, Materials,axisInverter, meshExportSettings) + ; { var indices = glTF.GetIndices(gltfMesh.primitives[0].indices); From a5cbb05046782dff226baf4add3ea6970a2af1f3 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 2 Jun 2021 13:53:54 +0900 Subject: [PATCH 2/2] rename --- ...rterDivided.cs => MeshExporter_DividedVertexBuffer.cs} | 2 +- ...d.cs.meta => MeshExporter_DividedVertexBuffer.cs.meta} | 2 +- ...MeshExporter.cs => MeshExporter_SharedVertexBuffer.cs} | 4 ++-- ...er.cs.meta => MeshExporter_SharedVertexBuffer.cs.meta} | 5 ++--- Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs | 4 ++-- Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs | 8 ++++---- 6 files changed, 12 insertions(+), 13 deletions(-) rename Assets/UniGLTF/Runtime/UniGLTF/IO/{MeshExporterDivided.cs => MeshExporter_DividedVertexBuffer.cs} (98%) rename Assets/UniGLTF/Runtime/UniGLTF/IO/{MeshExporterDivided.cs.meta => MeshExporter_DividedVertexBuffer.cs.meta} (83%) rename Assets/UniGLTF/Runtime/UniGLTF/IO/{MeshExporter.cs => MeshExporter_SharedVertexBuffer.cs} (99%) rename Assets/UniGLTF/Runtime/UniGLTF/IO/{MeshExporter.cs.meta => MeshExporter_SharedVertexBuffer.cs.meta} (69%) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_DividedVertexBuffer.cs similarity index 98% rename from Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs rename to Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_DividedVertexBuffer.cs index 2658a2b35e..22b72471d8 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_DividedVertexBuffer.cs @@ -5,7 +5,7 @@ namespace UniGLTF { - public static class MeshExporterDivided + public static class MeshExporter_DividedVertexBuffer { public static (glTFMesh, Dictionary) Export(glTF gltf, int bufferIndex, MeshWithRenderer unityMesh, List unityMaterials, diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_DividedVertexBuffer.cs.meta similarity index 83% rename from Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs.meta rename to Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_DividedVertexBuffer.cs.meta index 6a31e5d50b..47854c705e 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporterDivided.cs.meta +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_DividedVertexBuffer.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 92bc82be5ead84a429346379590f6d7d +guid: c21bb25d00e03bc49be4ed15201fb705 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_SharedVertexBuffer.cs similarity index 99% rename from Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs rename to Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_SharedVertexBuffer.cs index 56d6d91fe4..68c1360573 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_SharedVertexBuffer.cs @@ -6,7 +6,7 @@ namespace UniGLTF { - public static class MeshExporter + public static class MeshExporter_SharedVertexBuffer { /// /// primitive 間で vertex を共有する形で Export する。 @@ -23,7 +23,7 @@ public static class MeshExporter /// /// /// - public static (glTFMesh, Dictionary blendShapeIndexMap) ExportSharedVertexBuffer(glTF gltf, int bufferIndex, + public static (glTFMesh, Dictionary blendShapeIndexMap) Export(glTF gltf, int bufferIndex, MeshWithRenderer unityMesh, List unityMaterials, IAxisInverter axisInverter, MeshExportSettings settings) { diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_SharedVertexBuffer.cs.meta similarity index 69% rename from Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs.meta rename to Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_SharedVertexBuffer.cs.meta index 7ca52c723c..2144f29ce9 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter.cs.meta +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshExporter_SharedVertexBuffer.cs.meta @@ -1,8 +1,7 @@ fileFormatVersion: 2 -guid: 9b5d31a97e5221e43b16cfb4213a4a79 -timeCreated: 1545139997 -licenseType: Free +guid: d8bea9b98938e8c489ebad8641a76900 MonoImporter: + externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs index d34008efe3..54a9a27077 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/gltfExporter.cs @@ -253,8 +253,8 @@ public virtual void Export(MeshExportSettings meshExportSettings, ITextureSerial foreach (var unityMesh in uniqueUnityMeshes) { var (gltfMesh, blendShapeIndexMap) = meshExportSettings.DivideVertexBuffer - ? MeshExporterDivided.Export(glTF, bufferIndex, unityMesh, Materials, m_axisInverter, meshExportSettings) - : MeshExporter.ExportSharedVertexBuffer(glTF, bufferIndex, unityMesh, Materials, m_axisInverter, meshExportSettings) + ? MeshExporter_DividedVertexBuffer.Export(glTF, bufferIndex, unityMesh, Materials, m_axisInverter, meshExportSettings) + : MeshExporter_SharedVertexBuffer.Export(glTF, bufferIndex, unityMesh, Materials, m_axisInverter, meshExportSettings) ; glTF.meshes.Add(gltfMesh); Meshes.Add(unityMesh.Mesh); diff --git a/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs b/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs index e5dc10c7ca..c9a4aa3ea4 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/MeshTests.cs @@ -136,8 +136,8 @@ public void SharedVertexBufferTest() var unityMesh = new MeshWithRenderer(go.transform); var (gltfMesh, blendShapeIndexMap) = meshExportSettings.DivideVertexBuffer - ? MeshExporterDivided.Export(glTF, bufferIndex, unityMesh, Materials, axisInverter, meshExportSettings) - : MeshExporter.ExportSharedVertexBuffer(glTF, bufferIndex, unityMesh, Materials,axisInverter, meshExportSettings) + ? MeshExporter_DividedVertexBuffer.Export(glTF, bufferIndex, unityMesh, Materials, axisInverter, meshExportSettings) + : MeshExporter_SharedVertexBuffer.Export(glTF, bufferIndex, unityMesh, Materials,axisInverter, meshExportSettings) ; { @@ -184,8 +184,8 @@ public void DividedVertexBufferTest() var unityMesh = new MeshWithRenderer(go.transform); var (gltfMesh, blendShapeIndexMap) = meshExportSettings.DivideVertexBuffer - ? MeshExporterDivided.Export(glTF, bufferIndex, unityMesh, Materials, axisInverter, meshExportSettings) - : MeshExporter.ExportSharedVertexBuffer(glTF, bufferIndex, unityMesh, Materials,axisInverter, meshExportSettings) + ? MeshExporter_DividedVertexBuffer.Export(glTF, bufferIndex, unityMesh, Materials, axisInverter, meshExportSettings) + : MeshExporter_SharedVertexBuffer.Export(glTF, bufferIndex, unityMesh, Materials,axisInverter, meshExportSettings) ; {