From f9d105d67da991bb23dcb76054ec1d0083d1f64c Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 8 Mar 2024 18:09:11 +0900 Subject: [PATCH] impl bake for vrm-1.0. fixed #2119 --- Assets/VRM10/Editor/VRM10ExportSettings.cs | 14 ++++++-- Assets/VRM10/Editor/Vrm10ExportDialog.cs | 42 ++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/Assets/VRM10/Editor/VRM10ExportSettings.cs b/Assets/VRM10/Editor/VRM10ExportSettings.cs index 9b328e5a2..f191598d5 100644 --- a/Assets/VRM10/Editor/VRM10ExportSettings.cs +++ b/Assets/VRM10/Editor/VRM10ExportSettings.cs @@ -10,23 +10,31 @@ namespace UniVRM10 /// /// エクスポート時にBlendShapeClipから参照されないBlendShapeを削除する /// - [Tooltip("not implemented yet. Remove blendshape that is not used from BlendShapeClip")][ReadOnly] + [Tooltip("not implemented yet. Remove blendshape that is not used from BlendShapeClip")] + [ReadOnly] public bool ReduceBlendshape = false; /// /// skip if BlendShapeClip.Preset == Unknown /// - [Tooltip("not implemented yet. Remove blendShapeClip that preset is Unknown")][ReadOnly] + [Tooltip("not implemented yet. Remove blendShapeClip that preset is Unknown")] + [ReadOnly] public bool ReduceBlendshapeClip = false; [Tooltip("Use sparse accessor for morph target")] public bool MorphTargetUseSparse = true; + /// + /// FreezeBlendShape + /// + [Tooltip("freeze rotation and scale and blendshape")] + public bool FreezeMesh = false; + public GltfExportSettings MeshExportSettings => new GltfExportSettings { UseSparseAccessorForMorphTarget = MorphTargetUseSparse, ExportOnlyBlendShapePosition = true, - DivideVertexBuffer = true, + DivideVertexBuffer = true, }; public GameObject Root { get; set; } diff --git a/Assets/VRM10/Editor/Vrm10ExportDialog.cs b/Assets/VRM10/Editor/Vrm10ExportDialog.cs index 51b2e4d3f..729e8d848 100644 --- a/Assets/VRM10/Editor/Vrm10ExportDialog.cs +++ b/Assets/VRM10/Editor/Vrm10ExportDialog.cs @@ -258,6 +258,24 @@ namespace UniVRM10 string m_logLabel; + class TmpDisposer : IDisposable + { + List _disposables = new(); + public void Push(UnityEngine.Object o) + { + _disposables.Add(o); + } + + public void Dispose() + { + foreach (var o in _disposables) + { + GameObject.DestroyImmediate(o); + } + _disposables.Clear(); + } + } + protected override void ExportPath(string path) { m_logLabel = ""; @@ -268,11 +286,35 @@ namespace UniVRM10 try { + using (var disposer = new TmpDisposer()) using (var arrayManager = new NativeArrayManager()) { + if (m_settings.FreezeMesh) + { + Debug.Log("vrm-1.0 FreezeMesh"); + var copy = GameObject.Instantiate(root); + disposer.Push(copy); + root = copy; + + // Transform の回転とスケールを Mesh に適用します。 + // - BlendShape は現状がbakeされます + // - 回転とスケールが反映された新しい Mesh が作成されます + // - Transform の回転とスケールはクリアされます。world position を維持します + var newMeshMap = BoneNormalizer.NormalizeHierarchyFreezeMesh(root); + + // SkinnedMeshRenderer.sharedMesh と MeshFilter.sharedMesh を新しいMeshで置き換える + BoneNormalizer.Replace(root, newMeshMap, true, true); + } + var converter = new UniVRM10.ModelExporter(); var model = converter.Export(arrayManager, root); + // /// + // /// freezeblendshape + // /// + // [tooltip("freeze rotation and scale and blendshape")] + // public bool FreezeMesh = false; + // 右手系に変換 m_logLabel += $"convert to right handed coordinate...\n"; model.ConvertCoordinate(VrmLib.Coordinates.Vrm1, ignoreVrm: false);