From 735e17dd7a68b5aaffb0fde0533280cc04ac41bb Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 18 May 2022 13:45:31 +0900 Subject: [PATCH] name --- .../Runtime/MeshUtility/MeshIntegrator.cs | 28 ++++++++++++----- .../MeshUtility/MeshIntegratorUtility.cs | 13 ++------ .../VRMMeshIntegratorUtility.cs | 30 +++++++++++++++++-- 3 files changed, 51 insertions(+), 20 deletions(-) diff --git a/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegrator.cs b/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegrator.cs index f4ddfdd20..30fc53a90 100644 --- a/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegrator.cs +++ b/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegrator.cs @@ -6,8 +6,9 @@ namespace UniGLTF.MeshUtility { public class MeshIntegrator { - public const string INTEGRATED_MESH_NAME = "MeshesIntegrated"; - public const string INTEGRATED_MESH_BLENDSHAPE_NAME = "MeshesBlendShapeIntegrated"; + public const string INTEGRATED_MESH_WITHOUT_BLENDSHAPE_NAME = "Integrated(WithoutBlendShape)"; + public const string INTEGRATED_MESH_WITH_BLENDSHAPE_NAME = "Integrated(WithBlendShape)"; + public const string INTEGRATED_MESH_ALL_NAME = "Integrated(All)"; struct SubMesh { @@ -252,34 +253,47 @@ namespace UniGLTF.MeshUtility } mesh.bindposes = BindPoses.ToArray(); + // blendshape switch (onlyBlendShapeRenderers) { case MeshEnumerateOption.OnlyWithBlendShape: { AddBlendShapesToMesh(mesh); - mesh.name = INTEGRATED_MESH_BLENDSHAPE_NAME; + mesh.name = INTEGRATED_MESH_WITH_BLENDSHAPE_NAME; break; } - case MeshEnumerateOption.OnlyWithoutBlendShape: + case MeshEnumerateOption.All: { - mesh.name = INTEGRATED_MESH_NAME; + AddBlendShapesToMesh(mesh); + mesh.name = INTEGRATED_MESH_ALL_NAME; + break; + } + + case MeshEnumerateOption.OnlyWithoutBlendShape: + { + mesh.name = INTEGRATED_MESH_WITHOUT_BLENDSHAPE_NAME; break; } } + // meshName var meshNode = new GameObject(); switch (onlyBlendShapeRenderers) { case MeshEnumerateOption.OnlyWithBlendShape: { - meshNode.name = "MeshIntegrator(BlendShape)"; + meshNode.name = INTEGRATED_MESH_WITH_BLENDSHAPE_NAME; break; } case MeshEnumerateOption.OnlyWithoutBlendShape: + { + meshNode.name = INTEGRATED_MESH_WITHOUT_BLENDSHAPE_NAME; + break; + } case MeshEnumerateOption.All: { - meshNode.name = "MeshIntegrator"; + meshNode.name = INTEGRATED_MESH_ALL_NAME; break; } } diff --git a/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegratorUtility.cs b/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegratorUtility.cs index 5c914a144..49958e176 100644 --- a/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegratorUtility.cs +++ b/Assets/UniGLTF/Runtime/MeshUtility/MeshIntegratorUtility.cs @@ -9,10 +9,6 @@ namespace UniGLTF.MeshUtility { const string ASSET_SUFFIX = ".mesh.asset"; - public static string INTEGRATED_MESH_NAME => MeshIntegrator.INTEGRATED_MESH_NAME; - public static string INTEGRATED_MESH_BLENDSHAPE_NAME => MeshIntegrator.INTEGRATED_MESH_BLENDSHAPE_NAME; - - /// /// go を root としたヒエラルキーから Renderer を集めて、統合された Mesh 作成する /// @@ -174,14 +170,11 @@ namespace UniGLTF.MeshUtility } foreach (var normalMesh in copy.GetComponentsInChildren()) { - if (normalMesh.sharedMesh.name != MeshIntegratorUtility.INTEGRATED_MESH_NAME) + if (normalMesh.gameObject.GetComponent()) { - if (normalMesh.gameObject.GetComponent()) - { - GameObject.DestroyImmediate(normalMesh.gameObject.GetComponent()); - } - GameObject.DestroyImmediate(normalMesh); + GameObject.DestroyImmediate(normalMesh.gameObject.GetComponent()); } + GameObject.DestroyImmediate(normalMesh); } // Add integrated diff --git a/Assets/VRM/Editor/SkinnedMeshUtility/VRMMeshIntegratorUtility.cs b/Assets/VRM/Editor/SkinnedMeshUtility/VRMMeshIntegratorUtility.cs index ee054a596..9ae4132af 100644 --- a/Assets/VRM/Editor/SkinnedMeshUtility/VRMMeshIntegratorUtility.cs +++ b/Assets/VRM/Editor/SkinnedMeshUtility/VRMMeshIntegratorUtility.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Text; using UniGLTF; using UniGLTF.MeshUtility; using UnityEditor; @@ -32,14 +33,18 @@ namespace VRM } var dstPath = result.IntegratedRenderer.transform.RelativePathFrom(root.transform); - // copy + // copy modify and write + var clipAssetPathList = new List(); + var sb = new StringBuilder(); var clips = new List(); foreach (var src in proxy.BlendShapeAvatar.Clips) { if (src == null) continue; + // copy var clip = BlendShapeClip.Instantiate(src); - clips.Add(clip); + + // modify for (var i = 0; i < clip.Values.Length; ++i) { var val = clip.Values[i]; @@ -48,6 +53,10 @@ namespace VRM var srcRenderer = rendererDict[val.RelativePath]; var name = srcRenderer.sharedMesh.GetBlendShapeName(val.Index); var newIndex = result.IntegratedRenderer.sharedMesh.GetBlendShapeIndex(name); + if (newIndex == -1) + { + throw new KeyNotFoundException($"blendshape:{name} not found"); + } val.RelativePath = dstPath; val.Index = newIndex; @@ -56,10 +65,19 @@ namespace VRM clip.Values[i] = val; } + // write var assetPath = $"{assetFolder}/{clip.name}.asset"; - Debug.Log($"write: {assetPath}"); + sb.AppendLine($"write: {assetPath}"); AssetDatabase.CreateAsset(clip, assetPath); + + clipAssetPathList.Add(assetPath); + clips.Add(clip); } + Debug.Log(sb.ToString()); + + // reload + // AssetDatabase.Refresh(); + // var clips = clipAssetPathList.Select(x => AssetDatabase.LoadAssetAtPath(x)).ToList(); { // create blendshape avatar & replace @@ -67,6 +85,12 @@ namespace VRM blendShapeAvatar.Clips.AddRange(clips); var assetPath = $"{assetFolder}/blendshape.asset"; AssetDatabase.CreateAsset(blendShapeAvatar, assetPath); + + // reload + // AssetDatabase.Refresh(); + // blendShapeAvatar = AssetDatabase.LoadAssetAtPath(assetPath); + + // assign proxy.BlendShapeAvatar = blendShapeAvatar; } }