diff --git a/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/gltf_mesh_extras_targetNames.cs b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/gltf_mesh_extras_targetNames.cs index f1036bb61..4a276480a 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/gltf_mesh_extras_targetNames.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/gltf_mesh_extras_targetNames.cs @@ -91,7 +91,7 @@ namespace UniGLTF return new glTFExtensionExport().Add(ExtraName, f.GetStore().Bytes); } - public static void Serialize(glTFMesh gltfMesh, IEnumerable targetNames) + public static void Serialize(glTFMesh gltfMesh, IEnumerable targetNames, BlendShapeTargetNameLocationFlags blendShapeTargetNameLocation) { // targetNames var f = new JsonFormatter(); @@ -103,13 +103,21 @@ namespace UniGLTF f.EndList(); var targetNamesJson = f.GetStore().Bytes; - var meshExtras = glTFExtensionExport.GetOrCreate(ref gltfMesh.extras); - meshExtras.Add(ExtraName, targetNamesJson); - - foreach (var prim in gltfMesh.primitives) + // mesh + if (blendShapeTargetNameLocation.HasFlag(BlendShapeTargetNameLocationFlags.Mesh)) { - var primExtras = glTFExtensionExport.GetOrCreate(ref prim.extras); - primExtras.Add(ExtraName, targetNamesJson); + var meshExtras = glTFExtensionExport.GetOrCreate(ref gltfMesh.extras); + meshExtras.Add(ExtraName, targetNamesJson); + } + + // primitive + if (blendShapeTargetNameLocation.HasFlag(BlendShapeTargetNameLocationFlags.Primitives)) + { + foreach (var prim in gltfMesh.primitives) + { + var primExtras = glTFExtensionExport.GetOrCreate(ref prim.extras); + primExtras.Add(ExtraName, targetNamesJson); + } } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/BlendShapeTargetNameLocationFlags.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/BlendShapeTargetNameLocationFlags.cs new file mode 100644 index 000000000..ef71a92a7 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/BlendShapeTargetNameLocationFlags.cs @@ -0,0 +1,19 @@ +using System; + +namespace UniGLTF +{ + /// + /// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#meshes + /// + /// See Implementation Note about `mesh.extras.targetNames` + /// + [Flags] + public enum BlendShapeTargetNameLocationFlags + { + None = 0, + Mesh = 1, + Primitives = 2, + + Both = Mesh | Primitives, + } +} diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/BlendShapeTargetNameLocationFlags.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/BlendShapeTargetNameLocationFlags.cs.meta new file mode 100644 index 000000000..80e72f45c --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/BlendShapeTargetNameLocationFlags.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 050edaae24c5b4e45b702dd150deee8a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_DividedVertexBuffer.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_DividedVertexBuffer.cs index fac86a104..67327c87b 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_DividedVertexBuffer.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_DividedVertexBuffer.cs @@ -129,7 +129,7 @@ namespace UniGLTF } var targetNames = Enumerable.Range(0, mesh.blendShapeCount).Select(x => mesh.GetBlendShapeName(x)).ToArray(); - gltf_mesh_extras_targetNames.Serialize(gltfMesh, targetNames); + gltf_mesh_extras_targetNames.Serialize(gltfMesh, targetNames, BlendShapeTargetNameLocationFlags.Both); return (gltfMesh, Enumerable.Range(0, mesh.blendShapeCount).ToDictionary(x => x, x => x)); } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_SharedVertexBuffer.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_SharedVertexBuffer.cs index 6da415fcd..aae9f9c9b 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_SharedVertexBuffer.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshExporter_SharedVertexBuffer.cs @@ -188,7 +188,7 @@ namespace UniGLTF } } - gltf_mesh_extras_targetNames.Serialize(gltfMesh, targetNames); + gltf_mesh_extras_targetNames.Serialize(gltfMesh, targetNames, BlendShapeTargetNameLocationFlags.Both); } return (gltfMesh, blendShapeIndexMap); diff --git a/Assets/VRM10/Runtime/IO/Model/MeshWriter.cs b/Assets/VRM10/Runtime/IO/Model/MeshWriter.cs index 7a7ef16f7..063607b67 100644 --- a/Assets/VRM10/Runtime/IO/Model/MeshWriter.cs +++ b/Assets/VRM10/Runtime/IO/Model/MeshWriter.cs @@ -136,7 +136,7 @@ namespace UniVRM10 } var targetNames = src.Meshes[0].MorphTargets.Select(x => x.Name).ToArray(); - gltf_mesh_extras_targetNames.Serialize(gltfMesh, targetNames); + gltf_mesh_extras_targetNames.Serialize(gltfMesh, targetNames, BlendShapeTargetNameLocationFlags.Mesh); return gltfMesh; }