diff --git a/Assets/VRM10/Editor/Vrm10ExportDialog.cs b/Assets/VRM10/Editor/Vrm10ExportDialog.cs index eb805d358..091662f6f 100644 --- a/Assets/VRM10/Editor/Vrm10ExportDialog.cs +++ b/Assets/VRM10/Editor/Vrm10ExportDialog.cs @@ -296,19 +296,19 @@ namespace UniVRM10 using (var backup = new Vrm10GeometryBackup(root)) { - // Transform の回転とスケールを Mesh に適用します。 - // - BlendShape は現状がbakeされます - // - 回転とスケールが反映された新しい Mesh が作成されます - // - Transform の回転とスケールはクリアされます。world position を維持します - var newMeshMap = BoneNormalizer.NormalizeHierarchyFreezeMesh(root, m_settings.FreezeMeshUseCurrentBlendShapeWeight); + // Transform の回転とスケールを Mesh に適用します。 + // - BlendShape は現状がbakeされます + // - 回転とスケールが反映された新しい Mesh が作成されます + // - Transform の回転とスケールはクリアされます。world position を維持します + var newMeshMap = BoneNormalizer.NormalizeHierarchyFreezeMesh(root, m_settings.FreezeMeshUseCurrentBlendShapeWeight); - // SkinnedMeshRenderer.sharedMesh と MeshFilter.sharedMesh を新しいMeshで置き換える - BoneNormalizer.Replace(root, newMeshMap, m_settings.FreezeMeshKeepRotation); - } - } + // SkinnedMeshRenderer.sharedMesh と MeshFilter.sharedMesh を新しいMeshで置き換える + BoneNormalizer.Replace(root, newMeshMap, m_settings.FreezeMeshKeepRotation); + } + } var converter = new UniVRM10.ModelExporter(); - var model = converter.Export(arrayManager, root); + var model = converter.Export(m_settings.MeshExportSettings, arrayManager, root); // 右手系に変換 m_logLabel += $"convert to right handed coordinate...\n"; diff --git a/Assets/VRM10/Runtime/IO/Model/ModelExporter.cs b/Assets/VRM10/Runtime/IO/Model/ModelExporter.cs index ea7632a19..971656ec3 100644 --- a/Assets/VRM10/Runtime/IO/Model/ModelExporter.cs +++ b/Assets/VRM10/Runtime/IO/Model/ModelExporter.cs @@ -24,11 +24,11 @@ namespace UniVRM10 /// /// /// - public VrmLib.Model Export(INativeArrayManager arrayManager, GameObject root) + public VrmLib.Model Export(GltfExportSettings settings, INativeArrayManager arrayManager, GameObject root) { Model = new VrmLib.Model(VrmLib.Coordinates.Unity); - _Export(arrayManager, root); + _Export(settings, arrayManager, root); // humanoid { @@ -88,7 +88,7 @@ namespace UniVRM10 return true; } - VrmLib.Model _Export(INativeArrayManager arrayManager, GameObject root) + VrmLib.Model _Export(GltfExportSettings settings, INativeArrayManager arrayManager, GameObject root) { if (Model == null) { @@ -135,7 +135,7 @@ namespace UniVRM10 { if (MeshCanExport(skinnedMeshRenderer.sharedMesh)) { - var mesh = CreateMesh(arrayManager, skinnedMeshRenderer.sharedMesh, skinnedMeshRenderer, Materials); + var mesh = CreateMesh(settings, arrayManager, skinnedMeshRenderer.sharedMesh, skinnedMeshRenderer, Materials); var skin = CreateSkin(arrayManager, skinnedMeshRenderer, Nodes, root); if (skin != null) { @@ -152,7 +152,7 @@ namespace UniVRM10 { if (meshRenderer.gameObject.TryGetComponent(out var filter) && MeshCanExport(filter.sharedMesh)) { - var mesh = CreateMesh(arrayManager, filter.sharedMesh, meshRenderer, Materials); + var mesh = CreateMesh(settings, arrayManager, filter.sharedMesh, meshRenderer, Materials); Model.MeshGroups.Add(mesh); Nodes[renderer.gameObject].MeshGroup = mesh; if (!Meshes.ContainsKey(filter.sharedMesh)) @@ -207,7 +207,12 @@ namespace UniVRM10 return null; } - private static VrmLib.MeshGroup CreateMesh(INativeArrayManager arrayManager, UnityEngine.Mesh mesh, Renderer renderer, List materials) + private static VrmLib.MeshGroup CreateMesh( + GltfExportSettings settings, + INativeArrayManager arrayManager, + Mesh mesh, Renderer renderer, + List materials + ) { var meshGroup = new VrmLib.MeshGroup(mesh.name); var vrmMesh = new VrmLib.Mesh(); @@ -266,8 +271,7 @@ namespace UniVRM10 var usePosition = blendShapeVertices != null && blendShapeVertices.Length > 0; var blendShapeNormals = mesh.normals; - var useNormal = usePosition && blendShapeNormals != null && blendShapeNormals.Length == blendShapeVertices.Length; - // var useNormal = usePosition && blendShapeNormals != null && blendShapeNormals.Length == blendShapeVertices.Length && !exportOnlyBlendShapePosition; + var useNormal = usePosition && blendShapeNormals != null && blendShapeNormals.Length == blendShapeVertices.Length && !settings.ExportOnlyBlendShapePosition; var blendShapeTangents = mesh.tangents.Select(y => (Vector3)y).ToArray(); //var useTangent = usePosition && blendShapeTangents != null && blendShapeTangents.Length == blendShapeVertices.Length; diff --git a/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs b/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs index 6634b8b39..7cc83c11a 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs @@ -940,6 +940,7 @@ namespace UniVRM10 /// /// public static byte[] Export( + GltfExportSettings settings, GameObject go, IMaterialExporter materialExporter = null, ITextureSerializer textureSerializer = null, @@ -948,14 +949,14 @@ namespace UniVRM10 using (var arrayManager = new NativeArrayManager()) { // ヒエラルキーからジオメトリーを収集 - var converter = new UniVRM10.ModelExporter(); - var model = converter.Export(arrayManager, go); + var converter = new ModelExporter(); + var model = converter.Export(settings, arrayManager, go); // 右手系に変換 model.ConvertCoordinate(VrmLib.Coordinates.Vrm1); // Model と go から VRM-1.0 にExport - var exporter10 = new Vrm10Exporter(new GltfExportSettings(), materialExporter, textureSerializer); + var exporter10 = new Vrm10Exporter(settings, materialExporter, textureSerializer); var option = new VrmLib.ExportArgs { }; diff --git a/Assets/VRM10/Runtime/Scenes/Sample.cs b/Assets/VRM10/Runtime/Scenes/Sample.cs index 1d52d4629..cf751cae4 100644 --- a/Assets/VRM10/Runtime/Scenes/Sample.cs +++ b/Assets/VRM10/Runtime/Scenes/Sample.cs @@ -10,6 +10,9 @@ namespace UniVRM10.Sample [SerializeField] string m_vrmPath = "Tests/Models/Alicia_vrm-0.51/AliciaSolid_vrm-0.51.vrm"; + [SerializeField] + UniGLTF.GltfExportSettings m_settings = new(); + // Start is called before the first frame update void OnEnable() { @@ -21,7 +24,7 @@ namespace UniVRM10.Sample var src = new FileInfo(m_vrmPath); var instance = await Vrm10.LoadPathAsync(m_vrmPath, true); - var exportedBytes = Vrm10Exporter.Export(instance.gameObject); + var exportedBytes = Vrm10Exporter.Export(m_settings, instance.gameObject); // Import 1.0 var vrm10 = await Vrm10.LoadBytesAsync(exportedBytes, false); diff --git a/Assets/VRM10/Tests/LoadTests.cs b/Assets/VRM10/Tests/LoadTests.cs index 18caa14f7..34f9a9d4a 100644 --- a/Assets/VRM10/Tests/LoadTests.cs +++ b/Assets/VRM10/Tests/LoadTests.cs @@ -95,18 +95,20 @@ namespace UniVRM10.Test r.sharedMaterials = r.sharedMaterials.Select(x => m).ToArray(); } + var settings = new GltfExportSettings(); + // export as vrm1 using (var arrayManager = new NativeArrayManager()) { var converter = new UniVRM10.ModelExporter(); - var model = converter.Export(arrayManager, instance.gameObject); + var model = converter.Export(settings, arrayManager, instance.gameObject); // 右手系に変換 Debug.Log($"convert to right handed coordinate..."); model.ConvertCoordinate(VrmLib.Coordinates.Vrm1, ignoreVrm: false); // export vrm-1.0 - var exporter = new Vrm10Exporter(new GltfExportSettings()); + var exporter = new Vrm10Exporter(settings); exporter.Export(instance.gameObject, model, converter, new VrmLib.ExportArgs { sparse = false, diff --git a/Assets/VRM10/Tests/TestVrm10.cs b/Assets/VRM10/Tests/TestVrm10.cs index 108c6d321..c38b04062 100644 --- a/Assets/VRM10/Tests/TestVrm10.cs +++ b/Assets/VRM10/Tests/TestVrm10.cs @@ -28,6 +28,7 @@ namespace UniVRM10 public static byte[] ExportAsBuiltInRP(GameObject gameObject) { return Vrm10Exporter.Export( + new(), gameObject, materialExporter: new BuiltInVrm10MaterialExporter(), textureSerializer: new EditorTextureSerializer() diff --git a/Assets/VRM10_Samples/VRM10RuntimeExporterSample/VRM10RuntimeExporter.cs b/Assets/VRM10_Samples/VRM10RuntimeExporterSample/VRM10RuntimeExporter.cs index f76da8c6b..c1beea3e3 100644 --- a/Assets/VRM10_Samples/VRM10RuntimeExporterSample/VRM10RuntimeExporter.cs +++ b/Assets/VRM10_Samples/VRM10RuntimeExporterSample/VRM10RuntimeExporter.cs @@ -9,6 +9,9 @@ namespace UniVRM10.RuntimeExporterSample [SerializeField] VRM10ObjectMeta m_meta = new VRM10ObjectMeta(); + [SerializeField] + GltfExportSettings m_settings = new(); + GameObject m_model; void OnGUI() @@ -124,25 +127,25 @@ namespace UniVRM10.RuntimeExporterSample return; } - var bytes = ExportSimple(model, m_meta); + var bytes = ExportSimple(m_settings, model, m_meta); File.WriteAllBytes(path, bytes); Debug.LogFormat("export to {0}", path); } - static byte[] ExportSimple(GameObject root, VRM10ObjectMeta meta) + static byte[] ExportSimple(GltfExportSettings settings, GameObject root, VRM10ObjectMeta meta) { using (var arrayManager = new NativeArrayManager()) { var converter = new UniVRM10.ModelExporter(); - var model = converter.Export(arrayManager, root); + var model = converter.Export(settings, arrayManager, root); // 右手系に変換 Debug.Log($"convert to right handed coordinate..."); model.ConvertCoordinate(VrmLib.Coordinates.Vrm1, ignoreVrm: false); // export vrm-1.0 - var exporter = new Vrm10Exporter(new GltfExportSettings()); + var exporter = new Vrm10Exporter(settings); exporter.Export(root, model, converter, new VrmLib.ExportArgs { }, meta); diff --git a/Assets/VRM10_Samples/VRM10Viewer/VRM10VisualPrimitive.cs b/Assets/VRM10_Samples/VRM10Viewer/VRM10VisualPrimitive.cs index bcbb9f5f2..8d5a01ef3 100644 --- a/Assets/VRM10_Samples/VRM10Viewer/VRM10VisualPrimitive.cs +++ b/Assets/VRM10_Samples/VRM10Viewer/VRM10VisualPrimitive.cs @@ -36,7 +36,7 @@ namespace UniVRM10.VRM10Viewer break; case PrimitiveType.Plane: - Gizmos.DrawCube(Vector3.zero, new Vector3(10, 0.001f, 10)); + Gizmos.DrawWireCube(Vector3.zero, new Vector3(10, 0.001f, 10)); break; default: