From defbf7e675983f503eeb51296e4ba10b8cfe241c Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 1 Oct 2020 12:44:07 +0900 Subject: [PATCH] =?UTF-8?q?VRMExportMeshes=20=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO: mesh 関連の validation 処理、情報表示をこっちに移動する --- .../UniVRM/Editor/Format/VRMExportMeshes.cs | 47 +++++++++++++++++++ .../Editor/Format/VRMExportMeshes.cs.meta | 11 +++++ .../Editor/Format/VRMExporterVaildator.cs | 12 ++--- .../UniVRM/Editor/Format/VRMExporterWizard.cs | 42 +++++++++++------ 4 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs create mode 100644 Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs.meta diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs new file mode 100644 index 000000000..ddbf038d4 --- /dev/null +++ b/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs @@ -0,0 +1,47 @@ +using System; +using UnityEngine; + +namespace VRM +{ + /// + /// Export時にMeshを一覧する + /// + [Serializable] + public class VRMExportMeshes : ScriptableObject + { + [Serializable] + public struct MeshInfo + { + public Mesh Mesh; + public bool Skinned; + public bool HasVertexColor; + + public MeshInfo(Renderer renderer) + { + Mesh = null; + Skinned = false; + HasVertexColor = false; + if (renderer is SkinnedMeshRenderer smr) + { + Skinned = true; + Mesh = smr.sharedMesh; + } + else if (renderer is MeshRenderer mr) + { + var filter = mr.GetComponent(); + if (filter != null) + { + Mesh = filter.sharedMesh; + } + } + if (Mesh == null) + { + return; + } + HasVertexColor = Mesh.colors != null && Mesh.colors.Length == Mesh.vertexCount; + } + } + + public MeshInfo[] Meshes; + } +} diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs.meta b/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs.meta new file mode 100644 index 000000000..d045660f1 --- /dev/null +++ b/Assets/VRM/UniVRM/Editor/Format/VRMExportMeshes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7961eaa3060a80d43b2bcd80961bbd29 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExporterVaildator.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExporterVaildator.cs index 351c4abf9..7d016ac52 100644 --- a/Assets/VRM/UniVRM/Editor/Format/VRMExporterVaildator.cs +++ b/Assets/VRM/UniVRM/Editor/Format/VRMExporterVaildator.cs @@ -213,7 +213,7 @@ namespace VRM } ExpectedByteSize = 0; - foreach (var renderer in ExportRoot.GetComponentsInChildren()) + foreach (var renderer in ExportRoot.GetComponentsInChildren(true)) { var relativePath = UniGLTF.UnityExtensions.RelativePathFrom(renderer.transform, ExportRoot.transform); var mesh = GetMesh(renderer); @@ -330,11 +330,11 @@ namespace VRM var renderers = ExportRoot.GetComponentsInChildren(); foreach (var r in renderers) { - for(int i=0; i x.sharedMaterials).Where(x => x != null).Distinct(); diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs index eaa9cf1db..861b28872 100644 --- a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs +++ b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs @@ -1,10 +1,8 @@ -using System; -using System.IO; +using System.IO; using System.Linq; using System.Reflection; using UnityEditor; using UnityEngine; -using uei = UnityEngine.Internal; namespace VRM { @@ -41,6 +39,7 @@ namespace VRM GameObject ExportRoot; VRMExportSettings m_settings; + VRMExportMeshes m_meshes; VRMMetaObject m_meta; VRMMetaObject Meta @@ -98,6 +97,7 @@ namespace VRM Editor m_metaEditor; Editor m_settingsInspector; + Editor m_meshesInspector; VRMExporterValidator m_validator = new VRMExporterValidator(); bool m_requireValidation = true; @@ -112,14 +112,11 @@ namespace VRM m_tmpMeta = ScriptableObject.CreateInstance(); - if (m_settings == null) - { - m_settings = ScriptableObject.CreateInstance(); - } - if (m_settingsInspector == null) - { - m_settingsInspector = Editor.CreateEditor(m_settings); - } + m_settings = ScriptableObject.CreateInstance(); + m_settingsInspector = Editor.CreateEditor(m_settings); + + m_meshes = ScriptableObject.CreateInstance(); + m_meshesInspector = Editor.CreateEditor(m_meshes); } void OnDisable() @@ -136,6 +133,9 @@ namespace VRM // m_settingsInspector UnityEditor.Editor.DestroyImmediate(m_settingsInspector); m_settingsInspector = null; + // m_meshesInspector + UnityEditor.Editor.DestroyImmediate(m_meshesInspector); + m_meshesInspector = null; // Meta Meta = null; ScriptableObject.DestroyImmediate(m_tmpMeta); @@ -143,6 +143,9 @@ namespace VRM // m_settings ScriptableObject.DestroyImmediate(m_settings); m_settings = null; + // m_meshes + ScriptableObject.DestroyImmediate(m_meshes); + m_meshes = null; } private void InvokeWizardUpdate() @@ -194,18 +197,28 @@ namespace VRM UpdateRoot(root); } + // ArgumentException: Getting control 1's position in a group with only 1 controls when doing repaint Aborting + // Validation により GUI の表示項目が変わる場合があるので、 + // EventType.Layout と EventType.Repaint 間で内容が変わらないようしている。 if (Event.current.type == EventType.Layout) { - // ArgumentException: Getting control 1's position in a group with only 1 controls when doing repaint Aborting - // Validation により GUI の表示項目が変わる場合があるので、 - // EventType.Layout と EventType.Repaint 間で内容が変わらないようしている。 if (m_requireValidation) { m_validator.Validate(ExportRoot, m_settings, Meta != null ? Meta : m_tmpMeta); m_requireValidation = false; + + if (ExportRoot != null) + { + m_meshes.Meshes = ExportRoot.GetComponentsInChildren(true).Select(r => new VRMExportMeshes.MeshInfo(r)).ToArray(); + } + else + { + m_meshes.Meshes = new VRMExportMeshes.MeshInfo[] { }; + } } } + // // Humanoid として適正か? ここで失敗する場合は Export UI を表示しない // @@ -297,6 +310,7 @@ namespace VRM break; case Tabs.Mesh: + m_meshesInspector.OnInspectorGUI(); break; }