diff --git a/Assets/VRM10.Samples/Runtime/AIUEO.cs b/Assets/VRM10.Samples/Runtime/AIUEO.cs index f59bd3dcf..35f026206 100644 --- a/Assets/VRM10.Samples/Runtime/AIUEO.cs +++ b/Assets/VRM10.Samples/Runtime/AIUEO.cs @@ -7,10 +7,10 @@ namespace UniVRM10.Samples public class AIUEO : MonoBehaviour { [SerializeField] - public VRM10Controller VRM; + public VRM10Controller Controller; private void Reset() { - VRM = GetComponent(); + Controller = GetComponent(); } Coroutine m_coroutine; @@ -20,9 +20,9 @@ namespace UniVRM10.Samples private void Awake() { - if (VRM == null) + if (Controller == null) { - VRM = GetComponent(); + Controller = GetComponent(); } } @@ -30,17 +30,17 @@ namespace UniVRM10.Samples { for (var value = 0.0f; value <= 1.0f; value += velocity) { - VRM.Expression.SetWeight(ExpressionKey.CreateFromPreset(preset), value); + Controller.Vrm.Expression.SetWeight(ExpressionKey.CreateFromPreset(preset), value); yield return null; } - VRM.Expression.SetWeight(ExpressionKey.CreateFromPreset(preset), 1.0f); + Controller.Vrm.Expression.SetWeight(ExpressionKey.CreateFromPreset(preset), 1.0f); yield return new WaitForSeconds(wait); for (var value = 1.0f; value >= 0; value -= velocity) { - VRM.Expression.SetWeight(ExpressionKey.CreateFromPreset(preset), value); + Controller.Vrm.Expression.SetWeight(ExpressionKey.CreateFromPreset(preset), value); yield return null; } - VRM.Expression.SetWeight(ExpressionKey.CreateFromPreset(preset), 0); + Controller.Vrm.Expression.SetWeight(ExpressionKey.CreateFromPreset(preset), 0); yield return new WaitForSeconds(wait * 2); } diff --git a/Assets/VRM10.Samples/Runtime/Blinker.cs b/Assets/VRM10.Samples/Runtime/Blinker.cs index e6517000c..5c8249919 100644 --- a/Assets/VRM10.Samples/Runtime/Blinker.cs +++ b/Assets/VRM10.Samples/Runtime/Blinker.cs @@ -72,10 +72,10 @@ namespace UniVRM10.Samples break; } - m_controller.Expression.SetWeight(ExpressionKey.CreateFromPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.blink), value); + m_controller.Vrm.Expression.SetWeight(ExpressionKey.CreateFromPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.blink), value); yield return null; } - m_controller.Expression.SetWeight(ExpressionKey.CreateFromPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.blink), 1.0f); + m_controller.Vrm.Expression.SetWeight(ExpressionKey.CreateFromPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.blink), 1.0f); // wait... yield return new WaitForSeconds(ClosingTime); @@ -91,10 +91,10 @@ namespace UniVRM10.Samples break; } - m_controller.Expression.SetWeight(ExpressionKey.CreateFromPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.blink), value); + m_controller.Vrm.Expression.SetWeight(ExpressionKey.CreateFromPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.blink), value); yield return null; } - m_controller.Expression.SetWeight(ExpressionKey.CreateFromPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.blink), 0); + m_controller.Vrm.Expression.SetWeight(ExpressionKey.CreateFromPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.blink), 0); } } diff --git a/Assets/VRM10.Samples/Runtime/ViewerUI.cs b/Assets/VRM10.Samples/Runtime/ViewerUI.cs index d64d08f00..dcf6add24 100644 --- a/Assets/VRM10.Samples/Runtime/ViewerUI.cs +++ b/Assets/VRM10.Samples/Runtime/ViewerUI.cs @@ -84,7 +84,7 @@ namespace UniVRM10.Samples m_textDistributionOther.text = ""; } - public void UpdateMeta(VRM10MetaObject meta) + public void UpdateMeta(VRM10ObjectMeta meta) { if (meta == null) { @@ -379,9 +379,9 @@ namespace UniVRM10.Samples if (m_controller != null) { - m_texts.UpdateMeta(m_controller.Meta.Meta); + m_texts.UpdateMeta(m_controller.Vrm.Meta); - m_controller.Controller.UpdateType = VRM10Controller.VRM10ControllerImpl.UpdateTypes.LateUpdate; // after HumanPoseTransfer's setPose + m_controller.UpdateType = VRM10Controller.UpdateTypes.LateUpdate; // after HumanPoseTransfer's setPose { m_loaded = go.AddComponent(); m_loaded.Source = m_src; @@ -390,7 +390,7 @@ namespace UniVRM10.Samples m_lipSync = go.AddComponent(); m_blink = go.AddComponent(); - m_controller.LookAt.Gaze = m_target.transform; + m_controller.Vrm.LookAt.Gaze = m_target.transform; } } diff --git a/Assets/VRM10/Editor/Components/Expression/ExpressionEditorBase.cs b/Assets/VRM10/Editor/Components/Expression/ExpressionEditorBase.cs index bd1f34bb9..9bc93ce57 100644 --- a/Assets/VRM10/Editor/Components/Expression/ExpressionEditorBase.cs +++ b/Assets/VRM10/Editor/Components/Expression/ExpressionEditorBase.cs @@ -1,4 +1,5 @@ -using UnityEditor; +using System.IO; +using UnityEditor; using UnityEngine; namespace UniVRM10 @@ -254,5 +255,18 @@ namespace UniVRM10 } } } + + public static VRM10Expression CreateExpression(string path) + { + //Debug.LogFormat("{0}", path); + var clip = ScriptableObject.CreateInstance(); + clip.ExpressionName = Path.GetFileNameWithoutExtension(path); + AssetDatabase.CreateAsset(clip, path); + AssetDatabase.ImportAsset(path); + return clip; + //Clips.Add(clip); + //EditorUtility.SetDirty(this); + //AssetDatabase.SaveAssets(); + } } } diff --git a/Assets/VRM10/Editor/Components/Expression/ExpressionSelector.cs b/Assets/VRM10/Editor/Components/Expression/ExpressionSelector.cs index 446331e47..89d5769d2 100644 --- a/Assets/VRM10/Editor/Components/Expression/ExpressionSelector.cs +++ b/Assets/VRM10/Editor/Components/Expression/ExpressionSelector.cs @@ -11,7 +11,7 @@ namespace UniVRM10 /// class ExpressionClipSelector { - VRM10ExpressionAvatar m_avatar; + VRM10ObjectExpression m_avatar; int m_mode; static readonly string[] MODES = new string[]{ @@ -60,21 +60,21 @@ namespace UniVRM10 } } - public ExpressionClipSelector(VRM10ExpressionAvatar avatar, SerializedObject serializedObject) + public ExpressionClipSelector(VRM10ObjectExpression avatar, string dir, SerializedObject serializedObject) { avatar.RemoveNullClip(); m_avatar = avatar; var prop = serializedObject.FindProperty("Clips"); - m_clipList = new ReorderableExpressionList(serializedObject, prop, avatar); + m_clipList = new ReorderableExpressionList(serializedObject, prop, dir); m_clipList.Selected += (selected) => { SelectedIndex = avatar.Clips.IndexOf(selected); }; } - public void DrawGUI() + public void DrawGUI(string dir) { var backup = GUI.enabled; try @@ -87,7 +87,7 @@ namespace UniVRM10 switch (m_mode) { case 0: - SelectGUI(); + SelectGUI(dir); break; case 1: @@ -104,7 +104,7 @@ namespace UniVRM10 } } - void SelectGUI() + void SelectGUI(string dir) { if (m_avatar != null && m_avatar.Clips != null) { @@ -118,7 +118,6 @@ namespace UniVRM10 if (GUILayout.Button("Add Expression")) { - var dir = Path.GetDirectoryName(AssetDatabase.GetAssetPath(m_avatar)); var path = EditorUtility.SaveFilePanel( "Create Expression", dir, @@ -126,7 +125,7 @@ namespace UniVRM10 "asset"); if (!string.IsNullOrEmpty(path)) { - var clip = VRM10ExpressionAvatar.CreateExpression(path.ToUnityRelativePath()); + var clip = ExpressionEditorBase.CreateExpression(path.ToUnityRelativePath()); //clip.Prefab = AssetDatabase.LoadAssetAtPath(AssetDatabase.GetAssetPath(target)); m_avatar.Clips.Add(clip); diff --git a/Assets/VRM10/Editor/Components/Expression/ReorderableExpressionList.cs b/Assets/VRM10/Editor/Components/Expression/ReorderableExpressionList.cs index fc6143be5..cd69a46c3 100644 --- a/Assets/VRM10/Editor/Components/Expression/ReorderableExpressionList.cs +++ b/Assets/VRM10/Editor/Components/Expression/ReorderableExpressionList.cs @@ -2,6 +2,7 @@ using System; using System.IO; using UnityEditor; using UnityEditorInternal; +using UnityEngine; namespace UniVRM10 { @@ -25,7 +26,7 @@ namespace UniVRM10 m_list.index = index; } - public ReorderableExpressionList(SerializedObject serializedObject, SerializedProperty prop, UnityEngine.Object target) + public ReorderableExpressionList(SerializedObject serializedObject, SerializedProperty prop, string dir) { m_list = new ReorderableList(serializedObject, prop); @@ -50,7 +51,7 @@ namespace UniVRM10 var element = prop.GetArrayElementAtIndex(list.index); element.objectReferenceValue = null; - var dir = Path.GetDirectoryName(AssetDatabase.GetAssetPath(target)); + // var dir = Path.GetDirectoryName(AssetDatabase.GetAssetPath(target)); var path = EditorUtility.SaveFilePanel( "Create Expression", dir, @@ -58,7 +59,7 @@ namespace UniVRM10 "asset"); if (!string.IsNullOrEmpty(path)) { - var clip = VRM10ExpressionAvatar.CreateExpression(path.ToUnityRelativePath()); + var clip = ExpressionEditorBase.CreateExpression(path.ToUnityRelativePath()); //clip.Prefab = AssetDatabase.LoadAssetAtPath(AssetDatabase.GetAssetPath(target)); element.objectReferenceValue = clip; diff --git a/Assets/VRM10/Editor/Components/Expression/VRM10ControllerEditorExpression.cs b/Assets/VRM10/Editor/Components/Expression/VRM10ControllerEditorExpression.cs index 7f0c05630..569c89831 100644 --- a/Assets/VRM10/Editor/Components/Expression/VRM10ControllerEditorExpression.cs +++ b/Assets/VRM10/Editor/Components/Expression/VRM10ControllerEditorExpression.cs @@ -20,8 +20,8 @@ namespace UniVRM10 { m_target = target; - m_expressionKeyWeights = m_target.Expression.Clips.ToDictionary(x => ExpressionKey.CreateFromClip(x), x => 0.0f); - m_sliders = m_target.Expression.Clips + m_expressionKeyWeights = m_target.Vrm.Expression.Clips.ToDictionary(x => ExpressionKey.CreateFromClip(x), x => 0.0f); + m_sliders = m_target.Vrm.Expression.Clips .Where(x => x != null) .Select(x => new ExpressionSlider(m_expressionKeyWeights, ExpressionKey.CreateFromClip(x))) .ToList() @@ -48,16 +48,16 @@ namespace UniVRM10 { m_expressionKeyWeights[slider.Key] = slider.Value; } - m_target.Expression.SetWeights(m_expressionKeyWeights); + m_target.Vrm.Expression.SetWeights(m_expressionKeyWeights); } EditorGUILayout.Space(); EditorGUILayout.LabelField("Override rates", EditorStyles.boldLabel); EditorGUI.BeginDisabledGroup(true); { - EditorGUILayout.Slider("Blink override rate", m_target.Expression.BlinkOverrideRate, 0f, 1f); - EditorGUILayout.Slider("LookAt override rate", m_target.Expression.LookAtOverrideRate, 0f, 1f); - EditorGUILayout.Slider("Mouth override rate", m_target.Expression.MouthOverrideRate, 0f, 1f); + EditorGUILayout.Slider("Blink override rate", m_target.Vrm.Expression.BlinkOverrideRate, 0f, 1f); + EditorGUILayout.Slider("LookAt override rate", m_target.Vrm.Expression.LookAtOverrideRate, 0f, 1f); + EditorGUILayout.Slider("Mouth override rate", m_target.Vrm.Expression.MouthOverrideRate, 0f, 1f); } EditorGUI.EndDisabledGroup(); } diff --git a/Assets/VRM10/Editor/Components/Expression/VRM10ExpressionAvatarEditor.cs b/Assets/VRM10/Editor/Components/Expression/VRM10ExpressionAvatarEditor.cs deleted file mode 100644 index 6f9fadc1e..000000000 --- a/Assets/VRM10/Editor/Components/Expression/VRM10ExpressionAvatarEditor.cs +++ /dev/null @@ -1,84 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace UniVRM10 -{ - [CustomEditor(typeof(VRM10ExpressionAvatar))] - public class ExpressionAvatarEditor : ExpressionEditorBase - { - /// - /// ExpressionAvatar から 編集対象の Expression を選択する - /// - ExpressionClipSelector m_selector; - ExpressionClipSelector Selector - { - get - { - if (m_selector == null) - { - m_selector = new ExpressionClipSelector((VRM10ExpressionAvatar)target, serializedObject); - m_selector.Selected += OnSelected; - OnSelected(m_selector.GetSelected()); - } - return m_selector; - } - } - - protected override GameObject GetPrefab() - { - return PrefabUtility.GetCorrespondingObjectFromSource(target as VRM10ExpressionAvatar)?.gameObject; - } - - /// - /// 選択中の Expression のエディタ - /// - SerializedExpressionEditor m_serializedEditor; - - protected override VRM10Expression CurrentExpression() - { - return Selector.GetSelected(); - } - - void OnSelected(VRM10Expression clip) - { - if (PreviewSceneManager == null) - { - m_serializedEditor = null; - return; - } - - if (clip != null) - { - // select clip - var status = SerializedExpressionEditor.EditorStatus.Default; - if (m_serializedEditor != null) - { - status = m_serializedEditor.Status; - } - m_serializedEditor = new SerializedExpressionEditor(clip, PreviewSceneManager, status); - } - else - { - // clear selection - m_serializedEditor = null; - PreviewSceneManager.Bake(default, 1.0f); - } - } - - public override void OnInspectorGUI() - { - base.OnInspectorGUI(); - - // selector - Selector.DrawGUI(); - - // editor - if (m_serializedEditor != null) - { - Separator(); - m_serializedEditor.Draw(out VRM10Expression bakeValue); - PreviewSceneManager.Bake(bakeValue, 1.0f); - } - } - } -} diff --git a/Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs b/Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs index c23794e1a..9a8be3e8a 100644 --- a/Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs +++ b/Assets/VRM10/Editor/Components/LookAt/LookAtEditor.cs @@ -25,25 +25,25 @@ namespace UniVRM10 if (!Application.isPlaying) { // offset - var p = target.LookAt.OffsetFromHead; + var p = target.Vrm.LookAt.OffsetFromHead; Handles.Label(head.position, $"fromHead: [{p.x:0.00}, {p.y:0.00}, {p.z:0.00}]"); } else { - target.LookAt.OnSceneGUILookAt(head); + target.Vrm.LookAt.OnSceneGUILookAt(head); } } static void OnSceneGUIOffset(VRM10Controller m_target, Transform head) { - if (!m_target.LookAt.DrawGizmo) + if (!m_target.Vrm.LookAt.DrawGizmo) { return; } EditorGUI.BeginChangeCheck(); - var worldOffset = head.localToWorldMatrix.MultiplyPoint(m_target.LookAt.OffsetFromHead); + var worldOffset = head.localToWorldMatrix.MultiplyPoint(m_target.Vrm.LookAt.OffsetFromHead); worldOffset = Handles.PositionHandle(worldOffset, head.rotation); Handles.DrawDottedLine(head.position, worldOffset, 5); @@ -54,7 +54,7 @@ namespace UniVRM10 { Undo.RecordObject(m_target, "Changed FirstPerson"); - m_target.LookAt.OffsetFromHead = head.worldToLocalMatrix.MultiplyPoint(worldOffset); + m_target.Vrm.LookAt.OffsetFromHead = head.worldToLocalMatrix.MultiplyPoint(worldOffset); } } } diff --git a/Assets/VRM10/Editor/Components/SpringBone/SelectedGUI.cs b/Assets/VRM10/Editor/Components/SpringBone/SelectedGUI.cs index 720185c77..801672c6a 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/SelectedGUI.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/SelectedGUI.cs @@ -211,9 +211,9 @@ namespace UniVRM10 rect.y += 2; SerializedProperty element = prop.GetArrayElementAtIndex(index); - var elements = target.SpringBone.ColliderGroups; + var elements = target.Vrm.SpringBone.ColliderGroups; var element_index = elements.IndexOf(element.objectReferenceValue as VRM10SpringBoneColliderGroup); - var colliderGroups = target.SpringBone.ColliderGroups.Select((x, y) => x.GUIName(y)).ToArray(); + var colliderGroups = target.Vrm.SpringBone.ColliderGroups.Select((x, y) => x.GUIName(y)).ToArray(); var new_index = EditorGUI.Popup(rect, element_index, colliderGroups); if (new_index != element_index) { diff --git a/Assets/VRM10/Editor/Components/SpringBone/SpringBoneTreeView.cs b/Assets/VRM10/Editor/Components/SpringBone/SpringBoneTreeView.cs index 662c61493..2ceaeee43 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/SpringBoneTreeView.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/SpringBoneTreeView.cs @@ -37,9 +37,9 @@ namespace UniVRM10 // load _map = new Dictionary(); - for (var i = 0; i < target.SpringBone.ColliderGroups.Count; ++i) + for (var i = 0; i < target.Vrm.SpringBone.ColliderGroups.Count; ++i) { - var colliderGroup = target.SpringBone.ColliderGroups[i]; + var colliderGroup = target.Vrm.SpringBone.ColliderGroups[i]; var name = colliderGroup.GUIName(i); var id = _nextNodeID++; var item = new TreeViewItem(id, 2, name); @@ -47,9 +47,9 @@ namespace UniVRM10 _colliderGroups.AddChild(item); } - for (var i = 0; i < target.SpringBone.Springs.Count; ++i) + for (var i = 0; i < target.Vrm.SpringBone.Springs.Count; ++i) { - var spring = target.SpringBone.Springs[i]; + var spring = target.Vrm.SpringBone.Springs[i]; var name = spring.GUIName(i); var id = _nextNodeID++; var item = new TreeViewItem(id, 2, name); @@ -72,12 +72,12 @@ namespace UniVRM10 { if (value is VRM10SpringBoneColliderGroup colliderGroup) { - var i = Target.SpringBone.ColliderGroups.IndexOf(colliderGroup); + var i = Target.Vrm.SpringBone.ColliderGroups.IndexOf(colliderGroup); _selected = new SelectedColliderGroupGUI(_so, i); } else if (value is VRM10ControllerSpringBone.Spring spring) { - var i = Target.SpringBone.Springs.IndexOf(spring); + var i = Target.Vrm.SpringBone.Springs.IndexOf(spring); _selected = new SelectedSpringGUI(Target, _so, i); } } diff --git a/Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs b/Assets/VRM10/Editor/Components/VRM10ObjectEditor.cs similarity index 58% rename from Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs rename to Assets/VRM10/Editor/Components/VRM10ObjectEditor.cs index 9e7681c6c..4f5e72ac2 100644 --- a/Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs +++ b/Assets/VRM10/Editor/Components/VRM10ObjectEditor.cs @@ -1,27 +1,18 @@ -using UniGLTF; +using System; +using System.IO; +using UniGLTF; using UnityEditor; using UnityEngine; namespace UniVRM10 { - /// - /// VRM10Controller CustomEditor - /// - /// * Controller - /// * Meta - /// * Expression - /// * LookAt - /// * ForstPerson - /// - /// - [CustomEditor(typeof(VRM10Controller))] - public class VRM10ControllerEditor : Editor + [CustomEditor(typeof(VRM10Object))] + public class VRM10ObjectEditor : Editor { - VRM10Controller m_target; + VRM10Object m_target; enum Tabs { - Controller, Meta, Expression, LookAt, @@ -30,14 +21,8 @@ namespace UniVRM10 } Tabs _tab = Tabs.Meta; - // for ScriptedObject - Editor m_metaEditor; - - // expression - VRM10ControllerEditorExpression m_expression; - // for SerializedProperty - PropGui m_controller; + PropGui m_expression; PropGui m_meta; PropGui m_lookAt; PropGui m_springBone; @@ -46,28 +31,15 @@ namespace UniVRM10 void OnEnable() { - m_target = (VRM10Controller)target; - m_expression = new VRM10ControllerEditorExpression(m_target); - if (m_target?.Meta.Meta != null) - { - m_metaEditor = Editor.CreateEditor(m_target.Meta.Meta); - } - m_controller = new PropGui(serializedObject.FindProperty(nameof(m_target.Controller))); + m_target = (VRM10Object)target; + + m_expression = new PropGui(serializedObject.FindProperty(nameof(m_target.Expression))); m_meta = new PropGui(serializedObject.FindProperty(nameof(m_target.Meta))); m_lookAt = new PropGui(serializedObject.FindProperty(nameof(m_target.LookAt))); m_springBone = new PropGui(serializedObject.FindProperty(nameof(m_target.SpringBone))); m_firstPerson = new PropGui(serializedObject.FindProperty(nameof(m_target.FirstPerson))); } - void OnDisable() - { - if (m_metaEditor) - { - UnityEditor.Editor.DestroyImmediate(m_metaEditor); - m_metaEditor = null; - } - } - public override void OnInspectorGUI() { // select sub editor @@ -82,15 +54,10 @@ namespace UniVRM10 { case Tabs.Meta: m_meta.RecursiveProperty(); - m_metaEditor?.OnInspectorGUI(); - break; - - case Tabs.Controller: - m_controller.RecursiveProperty(); break; case Tabs.Expression: - m_expression.OnGUI(); + m_expression.RecursiveProperty(); break; case Tabs.LookAt: diff --git a/Assets/VRM10/Runtime/Components/Expression/VRM10ExpressionAvatar.cs.meta b/Assets/VRM10/Editor/Components/VRM10ObjectEditor.cs.meta similarity index 83% rename from Assets/VRM10/Runtime/Components/Expression/VRM10ExpressionAvatar.cs.meta rename to Assets/VRM10/Editor/Components/VRM10ObjectEditor.cs.meta index 54bf8e2cf..902657937 100644 --- a/Assets/VRM10/Runtime/Components/Expression/VRM10ExpressionAvatar.cs.meta +++ b/Assets/VRM10/Editor/Components/VRM10ObjectEditor.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d985854d00eb11241b09522432e2d057 +guid: 545fc17b99797d442a476622ba04f8dd MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs b/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs index bf6e3e7b2..d447cc28b 100644 --- a/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs +++ b/Assets/VRM10/Editor/ScriptedImporter/EditorVrm.cs @@ -17,7 +17,7 @@ namespace UniVRM10 { public static void OnGUI(ScriptedImporter importer, GltfParser parser, UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm) { - var hasExternal = importer.GetExternalObjectMap().Any(x => x.Value is VRM10MetaObject || x.Value is VRM10ExpressionAvatar || x.Value is VRM10Expression); + var hasExternal = importer.GetExternalObjectMap().Any(x => x.Value is VRM10Object || x.Value is VRM10Expression); using (new EditorGUI.DisabledScope(hasExternal)) { if (GUILayout.Button("Extract Meta And Expressions ...")) @@ -27,7 +27,7 @@ namespace UniVRM10 } // meta - importer.DrawRemapGUI(new SubAssetKey[] { VRM10MetaObject.SubAssetKey }); + importer.DrawRemapGUI(new SubAssetKey[] { VRM10Object.SubAssetKey }); // expressions importer.DrawRemapGUI(vrm.Expressions.Select(x => ExpressionKey.CreateFromVrm10(x).SubAssetKey)); @@ -35,7 +35,7 @@ namespace UniVRM10 if (GUILayout.Button("Clear")) { importer.ClearExternalObjects( - typeof(VRM10MetaObject), + typeof(VRM10ObjectMeta), typeof(VRM10Expression)); } } @@ -57,7 +57,12 @@ namespace UniVRM10 } /// - /// SubAssetを外部ファイルに展開する + /// + /// * VRM10Object + /// * VRM10Expression[] + /// + /// が Extract 対象となる + /// /// public static void Extract(ScriptedImporter importer, GltfParser parser) { @@ -66,23 +71,16 @@ namespace UniVRM10 return; } - // meta + var path = GetAndCreateFolder(importer.assetPath, ".Vrm1Object"); { - var path = GetAndCreateFolder(importer.assetPath, ".vrm1.MetaObject"); - foreach (var (key, asset) in importer.GetSubAssets(importer.assetPath)) + foreach (var (key, asset) in importer.GetSubAssets(importer.assetPath)) { asset.ExtractSubAsset($"{path}/{asset.name}.asset", false); } - } - - { - // expressions - var path = GetAndCreateFolder(importer.assetPath, ".vrm1.Expressions"); foreach (var (key, asset) in importer.GetSubAssets(importer.assetPath)) { asset.ExtractSubAsset($"{path}/{asset.name}.asset", false); } - } AssetDatabase.ImportAsset(importer.assetPath, ImportAssetOptions.ForceUpdate); diff --git a/Assets/VRM10/Editor/VRM10MetaObjectEditor.cs b/Assets/VRM10/Editor/VRM10MetaObjectEditor.cs index 62a8c6398..dcaa3dbcb 100644 --- a/Assets/VRM10/Editor/VRM10MetaObjectEditor.cs +++ b/Assets/VRM10/Editor/VRM10MetaObjectEditor.cs @@ -1,291 +1,291 @@ -using UnityEditor; -using UnityEngine; -using UniGLTF; -using UniGLTF.M17N; +// using UnityEditor; +// using UnityEngine; +// using UniGLTF; +// using UniGLTF.M17N; -namespace UniVRM10 -{ - [CustomEditor(typeof(VRM10MetaObject))] - public class VRMM10etaObjectEditor : Editor - { - class ValidateProperty - { - public SerializedProperty m_prop; +// namespace UniVRM10 +// { +// [CustomEditor(typeof(VRM10ObjectMeta))] +// public class VRMM10etaObjectEditor : Editor +// { +// class ValidateProperty +// { +// public SerializedProperty m_prop; - public delegate (string, MessageType) Validator(SerializedProperty prop); - Validator m_validator; +// public delegate (string, MessageType) Validator(SerializedProperty prop); +// Validator m_validator; - public ValidateProperty(SerializedProperty prop, Validator validator) - { - m_prop = prop; - m_validator = validator; - } +// public ValidateProperty(SerializedProperty prop, Validator validator) +// { +// m_prop = prop; +// m_validator = validator; +// } - public void OnGUI() - { - // var old = m_prop.stringValue; - if (m_prop.propertyType == SerializedPropertyType.Generic) - { - if (m_prop.arrayElementType != null) - { - EditorGUILayout.LabelField(m_prop.name); +// public void OnGUI() +// { +// // var old = m_prop.stringValue; +// if (m_prop.propertyType == SerializedPropertyType.Generic) +// { +// if (m_prop.arrayElementType != null) +// { +// EditorGUILayout.LabelField(m_prop.name); - var depth = m_prop.depth; - var iterator = m_prop.Copy(); - for (var enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false) - { - if (iterator.depth < depth) - break; +// var depth = m_prop.depth; +// var iterator = m_prop.Copy(); +// for (var enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false) +// { +// if (iterator.depth < depth) +// break; - depth = iterator.depth; +// depth = iterator.depth; - // using (new EditorGUI.DisabledScope("m_Script" == iterator.propertyPath)) - EditorGUILayout.PropertyField(iterator, true); - } - } - else - { - throw new System.NotImplementedException(); - } - } - else - { - EditorGUILayout.PropertyField(m_prop); - } - var (msg, msgType) = m_validator(m_prop); - if (!string.IsNullOrEmpty(msg)) - { - EditorGUILayout.HelpBox(msg, msgType); - } - // return old != m_prop.stringValue; - } - } +// // using (new EditorGUI.DisabledScope("m_Script" == iterator.propertyPath)) +// EditorGUILayout.PropertyField(iterator, true); +// } +// } +// else +// { +// throw new System.NotImplementedException(); +// } +// } +// else +// { +// EditorGUILayout.PropertyField(m_prop); +// } +// var (msg, msgType) = m_validator(m_prop); +// if (!string.IsNullOrEmpty(msg)) +// { +// EditorGUILayout.HelpBox(msg, msgType); +// } +// // return old != m_prop.stringValue; +// } +// } - VRM10MetaObject m_target; - SerializedProperty m_Script; - SerializedProperty m_exporterVersion; - SerializedProperty m_thumbnail; - ValidateProperty m_title; - ValidateProperty m_version; - ValidateProperty m_author; - ValidateProperty m_contact; - ValidateProperty m_reference; +// VRM10ObjectMeta m_target; +// SerializedProperty m_Script; +// SerializedProperty m_exporterVersion; +// SerializedProperty m_thumbnail; +// ValidateProperty m_title; +// ValidateProperty m_version; +// ValidateProperty m_author; +// ValidateProperty m_contact; +// ValidateProperty m_reference; - SerializedProperty m_AllowedUser; - SerializedProperty m_ViolentUssage; - SerializedProperty m_SexualUssage; - SerializedProperty m_CommercialUssage; - SerializedProperty m_PoliticalOrReligiousUsage; - SerializedProperty m_OtherPermissionUrl; +// SerializedProperty m_AllowedUser; +// SerializedProperty m_ViolentUssage; +// SerializedProperty m_SexualUssage; +// SerializedProperty m_CommercialUssage; +// SerializedProperty m_PoliticalOrReligiousUsage; +// SerializedProperty m_OtherPermissionUrl; - SerializedProperty m_LicenseType; - SerializedProperty m_OtherLicenseUrl; +// SerializedProperty m_LicenseType; +// SerializedProperty m_OtherLicenseUrl; - static string RequiredMessage(string name) - { - switch (LanguageGetter.Lang) - { - case Languages.ja: - return $"必須項目。{name} を入力してください"; +// static string RequiredMessage(string name) +// { +// switch (LanguageGetter.Lang) +// { +// case Languages.ja: +// return $"必須項目。{name} を入力してください"; - case Languages.en: - return $"{name} is required"; +// case Languages.en: +// return $"{name} is required"; - default: - throw new System.NotImplementedException(); - } - } +// default: +// throw new System.NotImplementedException(); +// } +// } - private void OnEnable() - { - if (target == null) - { - return; - } - m_target = (VRM10MetaObject)target; +// private void OnEnable() +// { +// if (target == null) +// { +// return; +// } +// m_target = (VRM10ObjectMeta)target; - m_Script = serializedObject.FindProperty("m_Script"); - m_exporterVersion = serializedObject.FindProperty(nameof(m_target.ExporterVersion)); - m_thumbnail = serializedObject.FindProperty(nameof(m_target.Thumbnail)); +// m_Script = serializedObject.FindProperty("m_Script"); +// m_exporterVersion = serializedObject.FindProperty(nameof(m_target.ExporterVersion)); +// m_thumbnail = serializedObject.FindProperty(nameof(m_target.Thumbnail)); - m_title = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.Name)), prop => - { - if (string.IsNullOrEmpty(prop.stringValue)) - { - return (RequiredMessage(prop.name), MessageType.Error); - } - return ("", MessageType.None); - }); - m_version = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.Version)), prop => - { - // if (string.IsNullOrEmpty(prop.stringValue)) - // { - // return (RequiredMessage(prop.name), MessageType.Error); - // } - return ("", MessageType.None); - }); - m_author = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.Authors)), prop => - { - if (prop.arraySize == 0) - { - return (RequiredMessage(prop.name), MessageType.Error); - } - return ("", MessageType.None); - }); - m_contact = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.ContactInformation)), prop => - { - return ("", MessageType.None); - }); - m_reference = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.References)), prop => - { - return ("", MessageType.None); - }); +// m_title = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.Name)), prop => +// { +// if (string.IsNullOrEmpty(prop.stringValue)) +// { +// return (RequiredMessage(prop.name), MessageType.Error); +// } +// return ("", MessageType.None); +// }); +// m_version = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.Version)), prop => +// { +// // if (string.IsNullOrEmpty(prop.stringValue)) +// // { +// // return (RequiredMessage(prop.name), MessageType.Error); +// // } +// return ("", MessageType.None); +// }); +// m_author = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.Authors)), prop => +// { +// if (prop.arraySize == 0) +// { +// return (RequiredMessage(prop.name), MessageType.Error); +// } +// return ("", MessageType.None); +// }); +// m_contact = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.ContactInformation)), prop => +// { +// return ("", MessageType.None); +// }); +// m_reference = new ValidateProperty(serializedObject.FindProperty(nameof(m_target.References)), prop => +// { +// return ("", MessageType.None); +// }); - m_AllowedUser = serializedObject.FindProperty(nameof(m_target.AllowedUser)); - m_ViolentUssage = serializedObject.FindProperty(nameof(m_target.ViolentUsage)); - m_SexualUssage = serializedObject.FindProperty(nameof(m_target.SexualUsage)); - m_CommercialUssage = serializedObject.FindProperty(nameof(m_target.CommercialUsage)); - m_PoliticalOrReligiousUsage = serializedObject.FindProperty(nameof(m_target.PoliticalOrReligiousUsage)); - m_OtherPermissionUrl = serializedObject.FindProperty(nameof(m_target.OtherLicenseUrl)); +// m_AllowedUser = serializedObject.FindProperty(nameof(m_target.AllowedUser)); +// m_ViolentUssage = serializedObject.FindProperty(nameof(m_target.ViolentUsage)); +// m_SexualUssage = serializedObject.FindProperty(nameof(m_target.SexualUsage)); +// m_CommercialUssage = serializedObject.FindProperty(nameof(m_target.CommercialUsage)); +// m_PoliticalOrReligiousUsage = serializedObject.FindProperty(nameof(m_target.PoliticalOrReligiousUsage)); +// m_OtherPermissionUrl = serializedObject.FindProperty(nameof(m_target.OtherLicenseUrl)); - // m_LicenseType = serializedObject.FindProperty(nameof(m_target.)); +// // m_LicenseType = serializedObject.FindProperty(nameof(m_target.)); - m_OtherLicenseUrl = serializedObject.FindProperty(nameof(m_target.OtherLicenseUrl)); - } +// m_OtherLicenseUrl = serializedObject.FindProperty(nameof(m_target.OtherLicenseUrl)); +// } - enum MessageKeys - { - [LangMsg(Languages.ja, "アバターの人格に関する許諾範囲")] - [LangMsg(Languages.en, "Personation / Characterization Permission")] - PERSONATION, +// enum MessageKeys +// { +// [LangMsg(Languages.ja, "アバターの人格に関する許諾範囲")] +// [LangMsg(Languages.en, "Personation / Characterization Permission")] +// PERSONATION, - [LangMsg(Languages.ja, "アバターに人格を与えることの許諾範囲")] - [LangMsg(Languages.en, "A person who can perform with this avatar")] - ALLOWED_USER, +// [LangMsg(Languages.ja, "アバターに人格を与えることの許諾範囲")] +// [LangMsg(Languages.en, "A person who can perform with this avatar")] +// ALLOWED_USER, - [LangMsg(Languages.ja, "このアバターを用いて暴力表現を演じることの許可")] - [LangMsg(Languages.en, "Violent acts using this avatar")] - VIOLENT_USAGE, +// [LangMsg(Languages.ja, "このアバターを用いて暴力表現を演じることの許可")] +// [LangMsg(Languages.en, "Violent acts using this avatar")] +// VIOLENT_USAGE, - [LangMsg(Languages.ja, "このアバターを用いて性的表現を演じることの許可")] - [LangMsg(Languages.en, "Sexuality acts using this avatar")] - SEXUAL_USAGE, +// [LangMsg(Languages.ja, "このアバターを用いて性的表現を演じることの許可")] +// [LangMsg(Languages.en, "Sexuality acts using this avatar")] +// SEXUAL_USAGE, - [LangMsg(Languages.ja, "商用利用の許可")] - [LangMsg(Languages.en, "For commercial use")] - COMMERCIAL_USAGE, +// [LangMsg(Languages.ja, "商用利用の許可")] +// [LangMsg(Languages.en, "For commercial use")] +// COMMERCIAL_USAGE, - [LangMsg(Languages.ja, "再配布・改変に関する許諾範囲")] - [LangMsg(Languages.en, "Redistribution / Modifications License")] - REDISTRIBUTION_MODIFICATIONS, +// [LangMsg(Languages.ja, "再配布・改変に関する許諾範囲")] +// [LangMsg(Languages.en, "Redistribution / Modifications License")] +// REDISTRIBUTION_MODIFICATIONS, - // [LangMsg(Languages.ja, "")] - // [LangMsg(Languages.en, "")] - } +// // [LangMsg(Languages.ja, "")] +// // [LangMsg(Languages.en, "")] +// } - static string Msg(MessageKeys key) - { - return LanguageGetter.Msg(key); - } +// static string Msg(MessageKeys key) +// { +// return LanguageGetter.Msg(key); +// } - bool m_foldoutInfo = true; - bool m_foldoutPermission = true; - bool m_foldoutDistribution = true; +// bool m_foldoutInfo = true; +// bool m_foldoutPermission = true; +// bool m_foldoutDistribution = true; - public override void OnInspectorGUI() - { - if (target == null) - { - return; - } +// public override void OnInspectorGUI() +// { +// if (target == null) +// { +// return; +// } - serializedObject.Update(); +// serializedObject.Update(); - if (VRMVersion.IsNewer(m_exporterVersion.stringValue)) - { - EditorGUILayout.HelpBox("Check UniVRM new version. https://github.com/dwango/UniVRM/releases", MessageType.Warning); - } +// if (VRMVersion.IsNewer(m_exporterVersion.stringValue)) +// { +// EditorGUILayout.HelpBox("Check UniVRM new version. https://github.com/dwango/UniVRM/releases", MessageType.Warning); +// } - // texture - EditorGUILayout.BeginHorizontal(); - { - EditorGUILayout.BeginVertical(); - GUI.enabled = false; - EditorGUILayout.PropertyField(m_exporterVersion); - GUI.enabled = true; - EditorGUILayout.PropertyField(m_thumbnail); - EditorGUILayout.EndVertical(); - m_thumbnail.objectReferenceValue = TextureField("", (Texture2D)m_thumbnail.objectReferenceValue, 100); - } - EditorGUILayout.EndHorizontal(); +// // texture +// EditorGUILayout.BeginHorizontal(); +// { +// EditorGUILayout.BeginVertical(); +// GUI.enabled = false; +// EditorGUILayout.PropertyField(m_exporterVersion); +// GUI.enabled = true; +// EditorGUILayout.PropertyField(m_thumbnail); +// EditorGUILayout.EndVertical(); +// m_thumbnail.objectReferenceValue = TextureField("", (Texture2D)m_thumbnail.objectReferenceValue, 100); +// } +// EditorGUILayout.EndHorizontal(); - m_foldoutInfo = EditorGUILayout.Foldout(m_foldoutInfo, "Information"); - if (m_foldoutInfo) - { - m_title.OnGUI(); - m_version.OnGUI(); - m_author.OnGUI(); - m_contact.OnGUI(); - m_reference.OnGUI(); - } - // EditorGUILayout.LabelField("License ", EditorStyles.boldLabel); - m_foldoutPermission = EditorGUILayout.Foldout(m_foldoutPermission, Msg(MessageKeys.PERSONATION)); - if (m_foldoutPermission) - { - var backup = EditorGUIUtility.labelWidth; - RightFixedPropField(m_AllowedUser, Msg(MessageKeys.ALLOWED_USER)); - RightFixedPropField(m_ViolentUssage, Msg(MessageKeys.VIOLENT_USAGE)); - RightFixedPropField(m_SexualUssage, Msg(MessageKeys.SEXUAL_USAGE)); - RightFixedPropField(m_CommercialUssage, Msg(MessageKeys.COMMERCIAL_USAGE)); - EditorGUILayout.PropertyField(m_OtherPermissionUrl, new GUIContent("Other License Url")); - EditorGUIUtility.labelWidth = backup; - } +// m_foldoutInfo = EditorGUILayout.Foldout(m_foldoutInfo, "Information"); +// if (m_foldoutInfo) +// { +// m_title.OnGUI(); +// m_version.OnGUI(); +// m_author.OnGUI(); +// m_contact.OnGUI(); +// m_reference.OnGUI(); +// } +// // EditorGUILayout.LabelField("License ", EditorStyles.boldLabel); +// m_foldoutPermission = EditorGUILayout.Foldout(m_foldoutPermission, Msg(MessageKeys.PERSONATION)); +// if (m_foldoutPermission) +// { +// var backup = EditorGUIUtility.labelWidth; +// RightFixedPropField(m_AllowedUser, Msg(MessageKeys.ALLOWED_USER)); +// RightFixedPropField(m_ViolentUssage, Msg(MessageKeys.VIOLENT_USAGE)); +// RightFixedPropField(m_SexualUssage, Msg(MessageKeys.SEXUAL_USAGE)); +// RightFixedPropField(m_CommercialUssage, Msg(MessageKeys.COMMERCIAL_USAGE)); +// EditorGUILayout.PropertyField(m_OtherPermissionUrl, new GUIContent("Other License Url")); +// EditorGUIUtility.labelWidth = backup; +// } - m_foldoutDistribution = EditorGUILayout.Foldout(m_foldoutDistribution, Msg(MessageKeys.REDISTRIBUTION_MODIFICATIONS)); - if (m_foldoutDistribution) - { - // var licenseType = m_LicenseType; - // EditorGUILayout.PropertyField(licenseType); - // if ((LicenseType)licenseType.intValue == LicenseType.Other) - // { - // EditorGUILayout.PropertyField(m_OtherLicenseUrl); - // } - } +// m_foldoutDistribution = EditorGUILayout.Foldout(m_foldoutDistribution, Msg(MessageKeys.REDISTRIBUTION_MODIFICATIONS)); +// if (m_foldoutDistribution) +// { +// // var licenseType = m_LicenseType; +// // EditorGUILayout.PropertyField(licenseType); +// // if ((LicenseType)licenseType.intValue == LicenseType.Other) +// // { +// // EditorGUILayout.PropertyField(m_OtherLicenseUrl); +// // } +// } - serializedObject.ApplyModifiedProperties(); - } +// serializedObject.ApplyModifiedProperties(); +// } - static (Rect, Rect) FixedRight(Rect r, int width) - { - if (width > r.width) - { - width = (int)r.width; - } - return ( - new Rect(r.x, r.y, r.width - width, r.height), - new Rect(r.x + r.width - width, r.y, width, r.height) - ); - } +// static (Rect, Rect) FixedRight(Rect r, int width) +// { +// if (width > r.width) +// { +// width = (int)r.width; +// } +// return ( +// new Rect(r.x, r.y, r.width - width, r.height), +// new Rect(r.x + r.width - width, r.y, width, r.height) +// ); +// } - static void RightFixedPropField(SerializedProperty prop, string label) - { - var r = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.Height(EditorGUIUtility.singleLineHeight)); - var (left, right) = FixedRight(r, 64); - // Debug.Log($"{left}, {right}"); - EditorGUI.LabelField(left, label); - EditorGUI.PropertyField(right, prop, new GUIContent(""), false); - } +// static void RightFixedPropField(SerializedProperty prop, string label) +// { +// var r = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.Height(EditorGUIUtility.singleLineHeight)); +// var (left, right) = FixedRight(r, 64); +// // Debug.Log($"{left}, {right}"); +// EditorGUI.LabelField(left, label); +// EditorGUI.PropertyField(right, prop, new GUIContent(""), false); +// } - private static Texture2D TextureField(string name, Texture2D texture, int size) - { - GUILayout.BeginHorizontal(); - var style = new GUIStyle(GUI.skin.label); - style.alignment = TextAnchor.UpperCenter; - //style.fixedWidth = size; - GUILayout.Label(name, style); - var result = (Texture2D)EditorGUILayout.ObjectField(texture, typeof(Texture2D), false, GUILayout.Width(size), GUILayout.Height(size)); - GUILayout.EndVertical(); - return result; - } - } -} +// private static Texture2D TextureField(string name, Texture2D texture, int size) +// { +// GUILayout.BeginHorizontal(); +// var style = new GUIStyle(GUI.skin.label); +// style.alignment = TextAnchor.UpperCenter; +// //style.fixedWidth = size; +// GUILayout.Label(name, style); +// var result = (Texture2D)EditorGUILayout.ObjectField(texture, typeof(Texture2D), false, GUILayout.Width(size), GUILayout.Height(size)); +// GUILayout.EndVertical(); +// return result; +// } +// } +// } diff --git a/Assets/VRM10/Editor/Vrm10ExportDialog.cs b/Assets/VRM10/Editor/Vrm10ExportDialog.cs index 37d18b337..a8a1cae73 100644 --- a/Assets/VRM10/Editor/Vrm10ExportDialog.cs +++ b/Assets/VRM10/Editor/Vrm10ExportDialog.cs @@ -40,17 +40,17 @@ namespace UniVRM10 MeshExportValidator m_meshes; Editor m_meshesInspector; - - VRM10MetaObject m_meta; - VRM10MetaObject Meta + VRM10Object m_meta; + VRM10Object Vrm { get { return m_meta; } set { if (value != null && AssetDatabase.IsSubAsset(value)) { - Debug.Log("copy VRM10MetaObject"); - value.CopyTo(m_tmpMeta); + // SubAsset is readonly. copy + Debug.Log("copy VRM10ObjectMeta"); + value.CopyTo(m_tmpObject); return; } @@ -66,15 +66,16 @@ namespace UniVRM10 m_meta = value; } } - VRM10MetaObject m_tmpMeta; + VRM10Object m_tmpObject; Editor m_metaEditor; protected override void Initialize() { - m_tmpMeta = ScriptableObject.CreateInstance(); - m_tmpMeta.Authors = new List { "" }; + m_tmpObject = ScriptableObject.CreateInstance(); + m_tmpObject.name = "_vrm1_"; + m_tmpObject.Meta.Authors = new List { "" }; m_settings = ScriptableObject.CreateInstance(); m_settingsInspector = Editor.CreateEditor(m_settings); @@ -87,18 +88,18 @@ namespace UniVRM10 // update meta if (root == null) { - Meta = null; + Vrm = null; } else { var controller = root.GetComponent(); if (controller != null) { - Meta = controller.Meta.Meta; + Vrm = controller.Vrm; } else { - Meta = null; + Vrm = null; } // default setting @@ -119,9 +120,9 @@ namespace UniVRM10 UnityEditor.Editor.DestroyImmediate(m_meshesInspector); m_meshesInspector = null; // Meta - Meta = null; - ScriptableObject.DestroyImmediate(m_tmpMeta); - m_tmpMeta = null; + Vrm = null; + ScriptableObject.DestroyImmediate(m_tmpObject); + m_tmpObject = null; // m_settings ScriptableObject.DestroyImmediate(m_settings); m_settings = null; @@ -161,8 +162,8 @@ namespace UniVRM10 // yield return proxy.Validate; // } - var meta = Meta ? Meta : m_tmpMeta; - yield return meta.Validate; + var vrm = Vrm ? Vrm : m_tmpObject; + yield return vrm.Validate; } protected override void OnLayout() @@ -229,7 +230,7 @@ namespace UniVRM10 return false; } - if (m_tmpMeta == null) + if (m_tmpObject == null) { // disabled return false; @@ -244,11 +245,11 @@ namespace UniVRM10 { if (m_meta != null) { - m_metaEditor = Editor.CreateEditor(Meta); + m_metaEditor = Editor.CreateEditor(Vrm); } else { - m_metaEditor = Editor.CreateEditor(m_tmpMeta); + m_metaEditor = Editor.CreateEditor(m_tmpObject); } } m_metaEditor.OnInspectorGUI(); @@ -300,7 +301,7 @@ namespace UniVRM10 // export vrm-1.0 var exporter = new UniVRM10.Vrm10Exporter(new EditorTextureSerializer()); var option = new VrmLib.ExportArgs(); - exporter.Export(root, model, converter, option, Meta ? Meta : m_tmpMeta); + exporter.Export(root, model, converter, option, Vrm ? Vrm : m_tmpObject); var exportedBytes = exporter.Storage.ToBytes(); diff --git a/Assets/VRM10/Runtime/Components/Expression/DefaultExpressionValidator.cs b/Assets/VRM10/Runtime/Components/Expression/DefaultExpressionValidator.cs index aa57be80d..561825049 100644 --- a/Assets/VRM10/Runtime/Components/Expression/DefaultExpressionValidator.cs +++ b/Assets/VRM10/Runtime/Components/Expression/DefaultExpressionValidator.cs @@ -11,13 +11,13 @@ namespace UniVRM10 { private readonly ExpressionKey[] _keys; private readonly Dictionary _expressions; - - private DefaultExpressionValidator(VRM10ExpressionAvatar expressionAvatar) + + private DefaultExpressionValidator(VRM10ObjectExpression expressionAvatar) { _keys = expressionAvatar.Clips.Select(ExpressionKey.CreateFromClip).ToArray(); _expressions = expressionAvatar.Clips.ToDictionary(ExpressionKey.CreateFromClip, x => x); } - + public void Validate(IReadOnlyDictionary inputWeights, IDictionary actualWeights, LookAtEyeDirection inputEyeDirection, out LookAtEyeDirection actualEyeDirection, out float blinkOverrideRate, out float lookAtOverrideRate, out float mouthOverrideRate) @@ -26,7 +26,7 @@ namespace UniVRM10 blinkOverrideRate = 0f; lookAtOverrideRate = 0f; mouthOverrideRate = 0f; - + // 1. Set weights and Accumulate override rates. foreach (var key in _keys) { @@ -36,10 +36,10 @@ namespace UniVRM10 // Get weight with evaluation binary flag. var weight = expression.IsBinary ? Mathf.Round(inputWeights[key]) : inputWeights[key]; - + // Set weight. actualWeights[key] = weight; - + // Override rate without targeting myself. if (!key.IsBlink) { @@ -54,7 +54,7 @@ namespace UniVRM10 mouthOverrideRate += GetOverrideRate(expression.OverrideMouth, weight); } } - + // 2. Saturate rate. blinkOverrideRate = Mathf.Clamp01(blinkOverrideRate); lookAtOverrideRate = Mathf.Clamp01(lookAtOverrideRate); @@ -63,7 +63,7 @@ namespace UniVRM10 var blinkMultiplier = 1f - blinkOverrideRate; var lookAtMultiplier = 1f - lookAtOverrideRate; var mouthMultiplier = 1f - mouthOverrideRate; - + // 3. Set procedural key's weights. foreach (var key in _keys) { @@ -80,7 +80,7 @@ namespace UniVRM10 actualWeights[key] = inputWeights[key] * mouthMultiplier; } } - + // 4. eye direction actualEyeDirection = LookAtEyeDirection.Multiply(inputEyeDirection, 1f - lookAtOverrideRate); } @@ -102,7 +102,7 @@ namespace UniVRM10 public sealed class Factory : IExpressionValidatorFactory { - public IExpressionValidator Create(VRM10ExpressionAvatar expressionAvatar) + public IExpressionValidator Create(VRM10ObjectExpression expressionAvatar) { return new DefaultExpressionValidator(expressionAvatar); } diff --git a/Assets/VRM10/Runtime/Components/Expression/IExpressionValidatorFactory.cs b/Assets/VRM10/Runtime/Components/Expression/IExpressionValidatorFactory.cs index 2f4a523cc..c4d402206 100644 --- a/Assets/VRM10/Runtime/Components/Expression/IExpressionValidatorFactory.cs +++ b/Assets/VRM10/Runtime/Components/Expression/IExpressionValidatorFactory.cs @@ -2,6 +2,6 @@ { public interface IExpressionValidatorFactory { - IExpressionValidator Create(VRM10ExpressionAvatar expressionAvatar); + IExpressionValidator Create(VRM10ObjectExpression expressionAvatar); } } \ No newline at end of file diff --git a/Assets/VRM10/Runtime/Components/Expression/VRM10ExpressionAvatar.cs b/Assets/VRM10/Runtime/Components/Expression/VRM10ExpressionAvatar.cs deleted file mode 100644 index 0a79a1c91..000000000 --- a/Assets/VRM10/Runtime/Components/Expression/VRM10ExpressionAvatar.cs +++ /dev/null @@ -1,127 +0,0 @@ -using UnityEngine; -using System.Linq; -using System; -using System.Collections.Generic; -using System.IO; -using UniGLTF; -#if UNITY_EDITOR -using UnityEditor; -#endif - -namespace UniVRM10 -{ - public sealed class VRM10ExpressionAvatar : MonoBehaviour - { - [SerializeField] - public List Clips = new List(); - - /// - /// NullのClipを削除して詰める - /// - public void RemoveNullClip() - { - if (Clips == null) - { - return; - } - for (int i = Clips.Count - 1; i >= 0; --i) - { - if (Clips[i] == null) - { - Clips.RemoveAt(i); - } - } - } - -#if UNITY_EDITOR - [ContextMenu("Restore")] - void Restore() - { - var assetPath = UnityPath.FromAsset(this); - if (assetPath.IsNull) - { - return; - } - - - foreach (var x in assetPath.Parent.ChildFiles) - { - var clip = UnityEditor.AssetDatabase.LoadAssetAtPath(x.Value); - if (clip == null) continue; - - if (!Clips.Contains(clip)) - { - Clips.Add(clip); - } - - Debug.LogFormat("{0}", clip.name); - } - Clips = Clips.OrderBy(x => ExpressionKey.CreateFromClip(x)).ToList(); - } - - static public VRM10Expression CreateExpression(string path) - { - //Debug.LogFormat("{0}", path); - var clip = ScriptableObject.CreateInstance(); - clip.ExpressionName = Path.GetFileNameWithoutExtension(path); - AssetDatabase.CreateAsset(clip, path); - AssetDatabase.ImportAsset(path); - return clip; - //Clips.Add(clip); - //EditorUtility.SetDirty(this); - //AssetDatabase.SaveAssets(); - } -#endif - - /// - /// Unknown以外で存在しないものを全て作る - /// - public void CreateDefaultPreset() - { - foreach (var preset in ((UniGLTF.Extensions.VRMC_vrm.ExpressionPreset[])Enum.GetValues(typeof(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset))) - .Where(x => x != UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.custom) - ) - { - CreateDefaultPreset(preset); - } - } - - void CreateDefaultPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset preset) - { - var clip = GetClip(new ExpressionKey(preset)); - if (clip != null) return; - clip = ScriptableObject.CreateInstance(); - clip.name = preset.ToString(); - clip.ExpressionName = preset.ToString(); - clip.Preset = preset; - Clips.Add(clip); - } - - public void SetClip(ExpressionKey key, VRM10Expression clip) - { - int index = -1; - try - { - index = Clips.FindIndex(x => key.Match(x)); - } - catch (Exception) - { - - } - if (index == -1) - { - Clips.Add(clip); - } - else - { - Clips[index] = clip; - } - } - - public VRM10Expression GetClip(ExpressionKey key) - { - if (Clips == null) return null; - return Clips.FirstOrDefault(x => key.Match(x)); - } - } -} diff --git a/Assets/VRM10/Runtime/Components/VRM10Controller.cs b/Assets/VRM10/Runtime/Components/VRM10Controller.cs index 9d3c3064d..bc0e03bf8 100644 --- a/Assets/VRM10/Runtime/Components/VRM10Controller.cs +++ b/Assets/VRM10/Runtime/Components/VRM10Controller.cs @@ -15,62 +15,28 @@ namespace UniVRM10 [DisallowMultipleComponent] public class VRM10Controller : MonoBehaviour { - [Serializable] - public class VRM10ControllerImpl + public enum UpdateTypes { - public enum UpdateTypes - { - None, - Update, - LateUpdate, - } - - [SerializeField, Header("UpdateSetting")] - public UpdateTypes UpdateType = UpdateTypes.LateUpdate; - - [SerializeField, Header("SpringBone")] - public Transform SpringBoneCenter; + None, + Update, + LateUpdate, } - [SerializeField] - public VRM10ControllerImpl Controller = new VRM10ControllerImpl(); + [SerializeField, Header("Runtime")] + public UpdateTypes UpdateType = UpdateTypes.LateUpdate; [SerializeField] - public VRM10ControllerMeta Meta = new VRM10ControllerMeta(); + public Transform SpringBoneCenter; - [SerializeField] - public VRM10ControllerExpression Expression = new VRM10ControllerExpression(); - - [SerializeField] - public VRM10ControllerLookAt LookAt = new VRM10ControllerLookAt(); - - [SerializeField] - public VRM10ControllerFirstPerson FirstPerson = new VRM10ControllerFirstPerson(); - - [SerializeField] - public VRM10ControllerSpringBone SpringBone = new VRM10ControllerSpringBone(); - - void OnDestroy() - { - if (Expression != null) - { - Expression.Restore(); - } - } - - private void OnValidate() - { - if (LookAt != null) - { - LookAt.HorizontalInner.OnValidate(); - LookAt.HorizontalOuter.OnValidate(); - LookAt.VerticalUp.OnValidate(); - LookAt.VerticalDown.OnValidate(); - } - } + [SerializeField, Header("VRM1")] + public VRM10Object Vrm; VRM10ControllerRuntime m_runtime; + /// + /// delay new VRM10ControllerRuntime + /// + /// VRM10ControllerRuntime GetOrCreate() { if (m_runtime == null) @@ -82,7 +48,7 @@ namespace UniVRM10 private void Update() { - if (Controller.UpdateType == VRM10ControllerImpl.UpdateTypes.Update) + if (UpdateType == UpdateTypes.Update) { GetOrCreate().Process(); } @@ -90,7 +56,7 @@ namespace UniVRM10 private void LateUpdate() { - if (Controller.UpdateType == VRM10ControllerImpl.UpdateTypes.LateUpdate) + if (UpdateType == UpdateTypes.LateUpdate) { GetOrCreate().Process(); } diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerExpression.cs.meta b/Assets/VRM10/Runtime/Components/VRM10ControllerExpression.cs.meta deleted file mode 100644 index 902dacd1d..000000000 --- a/Assets/VRM10/Runtime/Components/VRM10ControllerExpression.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 49cc95eade43a804fa7a5b8bfd6875d5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerFirstPerson.cs.meta b/Assets/VRM10/Runtime/Components/VRM10ControllerFirstPerson.cs.meta deleted file mode 100644 index 6fee5a6b0..000000000 --- a/Assets/VRM10/Runtime/Components/VRM10ControllerFirstPerson.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3139d59f7bb86b24c933ece483addae3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerMeta.cs b/Assets/VRM10/Runtime/Components/VRM10ControllerMeta.cs deleted file mode 100644 index cab23291b..000000000 --- a/Assets/VRM10/Runtime/Components/VRM10ControllerMeta.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using UnityEngine; - -namespace UniVRM10 -{ - [Serializable] - public sealed class VRM10ControllerMeta - { - [SerializeField] - public VRM10MetaObject Meta; - } -} diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerMeta.cs.meta b/Assets/VRM10/Runtime/Components/VRM10ControllerMeta.cs.meta deleted file mode 100644 index 58cfbdc17..000000000 --- a/Assets/VRM10/Runtime/Components/VRM10ControllerMeta.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 77efcd2e8b041404fafc8909d38daaef -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerRuntime.cs b/Assets/VRM10/Runtime/Components/VRM10ControllerRuntime.cs index ed5a26e75..1519d5524 100644 --- a/Assets/VRM10/Runtime/Components/VRM10ControllerRuntime.cs +++ b/Assets/VRM10/Runtime/Components/VRM10ControllerRuntime.cs @@ -21,8 +21,8 @@ namespace UniVRM10 throw new Exception(); } m_head = animator.GetBoneTransform(HumanBodyBones.Head); - target.LookAt.Setup(animator, m_head); - target.Expression.Setup(target, target.LookAt, target.LookAt.EyeDirectionApplicable); + target.Vrm.LookAt.Setup(animator, m_head); + target.Vrm.Expression.Setup(target, target.Vrm.LookAt, target.Vrm.LookAt.EyeDirectionApplicable); if (m_constraints == null) { @@ -52,17 +52,17 @@ namespace UniVRM10 // // spring // - m_target.SpringBone.Process(m_target.Controller.SpringBoneCenter); + m_target.Vrm.SpringBone.Process(m_target.SpringBoneCenter); // // gaze control // - m_target.LookAt.Process(); + m_target.Vrm.LookAt.Process(); // // expression // - m_target.Expression.Process(); + m_target.Vrm.Expression.Process(); } } } diff --git a/Assets/VRM10/Runtime/Components/Meta.meta b/Assets/VRM10/Runtime/Components/VRM10Object.meta similarity index 77% rename from Assets/VRM10/Runtime/Components/Meta.meta rename to Assets/VRM10/Runtime/Components/VRM10Object.meta index e7767d235..625e01bd9 100644 --- a/Assets/VRM10/Runtime/Components/Meta.meta +++ b/Assets/VRM10/Runtime/Components/VRM10Object.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9134e2692fe37db46b99691e26390bd9 +guid: 8c3df50f202d51e43a56b80a698a3870 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerLookAt.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerLookAt.cs similarity index 100% rename from Assets/VRM10/Runtime/Components/VRM10ControllerLookAt.cs rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerLookAt.cs diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerLookAt.cs.meta b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerLookAt.cs.meta similarity index 83% rename from Assets/VRM10/Runtime/Components/VRM10ControllerLookAt.cs.meta rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerLookAt.cs.meta index 36e7cd8cc..4da8dd984 100644 --- a/Assets/VRM10/Runtime/Components/VRM10ControllerLookAt.cs.meta +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerLookAt.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cec6491afc9329e418272980aed747f0 +guid: 9ad6ed008a4d416468f3eb04b83b1bb0 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerSpringBone.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerSpringBone.cs similarity index 100% rename from Assets/VRM10/Runtime/Components/VRM10ControllerSpringBone.cs rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerSpringBone.cs diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerSpringBone.cs.meta b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerSpringBone.cs.meta similarity index 83% rename from Assets/VRM10/Runtime/Components/VRM10ControllerSpringBone.cs.meta rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerSpringBone.cs.meta index 4e72b34cc..f4bf593ea 100644 --- a/Assets/VRM10/Runtime/Components/VRM10ControllerSpringBone.cs.meta +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ControllerSpringBone.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 99c0f25b461a78e4099b81021d029663 +guid: c7800be16a75f1542aa302a471b19524 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10Object.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10Object.cs new file mode 100644 index 000000000..54ad36732 --- /dev/null +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10Object.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using UniGLTF; +using UnityEngine; +using VRMShaders; + +namespace UniVRM10 +{ + /// + /// VRM関連の情報を集約したオブジェクト。 + /// + /// ScriptedImporter から Extract して Edit 可能な項目なるべく増やすべく導入。 + /// + /// * Meta(VRM必須) + /// * Humanoid(VRM必須) + /// * Expressions(enum + custom list) + /// * LookAt + /// * FirstPerson + /// * SpringBone の MonoBehaviour でない部分 + /// * ColliderGroup + /// * Springs + /// + /// Serialize 可能な形で保持し、Editor経由で Edit可能にするのが目的。 + /// + /// + public class VRM10Object : ScriptableObject + { + public static SubAssetKey SubAssetKey => new SubAssetKey(typeof(VRM10Object), "_vrm1_"); + + [SerializeField] + public VRM10ObjectMeta Meta = new VRM10ObjectMeta(); + + [SerializeField] + public VRM10ObjectExpression Expression = new VRM10ObjectExpression(); + + [SerializeField] + public VRM10ControllerLookAt LookAt = new VRM10ControllerLookAt(); + + [SerializeField] + public VRM10ObjectFirstPerson FirstPerson = new VRM10ObjectFirstPerson(); + + [SerializeField] + public VRM10ControllerSpringBone SpringBone = new VRM10ControllerSpringBone(); + + void OnValidate() + { + Debug.Log($"VRM10Object.OnValidate"); + if (LookAt != null) + { + LookAt.HorizontalInner.OnValidate(); + LookAt.HorizontalOuter.OnValidate(); + LookAt.VerticalUp.OnValidate(); + LookAt.VerticalDown.OnValidate(); + } + } + + public void CopyTo(VRM10Object dst) + { + throw new NotImplementedException(); + } + + public IEnumerable Validate(GameObject ExportRoot) + { + throw new NotImplementedException(); + } + } +} diff --git a/Assets/VRM10/Editor/Components/Expression/VRM10ExpressionAvatarEditor.cs.meta b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10Object.cs.meta similarity index 83% rename from Assets/VRM10/Editor/Components/Expression/VRM10ExpressionAvatarEditor.cs.meta rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10Object.cs.meta index 552c7e0e6..135924fd1 100644 --- a/Assets/VRM10/Editor/Components/Expression/VRM10ExpressionAvatarEditor.cs.meta +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10Object.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 821786654431c304187c2c85ebea264f +guid: 88684271e27adb843b6570957c9e7637 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerExpression.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs similarity index 67% rename from Assets/VRM10/Runtime/Components/VRM10ControllerExpression.cs rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs index ab3c74627..bd35d4e77 100644 --- a/Assets/VRM10/Runtime/Components/VRM10ControllerExpression.cs +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs @@ -7,23 +7,81 @@ using VrmLib; namespace UniVRM10 { [Serializable] - public sealed class VRM10ControllerExpression + public sealed class VRM10ObjectExpression { - public static IExpressionValidatorFactory ExpressionValidatorFactory = new DefaultExpressionValidator.Factory(); - - VRM10ExpressionAvatar m_expressionAvatar; - public IEnumerable Clips + [SerializeField] + public List Clips = new List(); + /// + /// NullのClipを削除して詰める + /// + public void RemoveNullClip() { - get + if (Clips == null) { - if (m_expressionAvatar == null || m_expressionAvatar.Clips == null) + return; + } + for (int i = Clips.Count - 1; i >= 0; --i) + { + if (Clips[i] == null) { - return Enumerable.Empty(); + Clips.RemoveAt(i); } - return m_expressionAvatar.Clips; } } + /// + /// Unknown以外で存在しないものを全て作る + /// + public void CreateDefaultPreset() + { + foreach (var preset in ((UniGLTF.Extensions.VRMC_vrm.ExpressionPreset[])Enum.GetValues(typeof(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset))) + .Where(x => x != UniGLTF.Extensions.VRMC_vrm.ExpressionPreset.custom) + ) + { + CreateDefaultPreset(preset); + } + } + + void CreateDefaultPreset(UniGLTF.Extensions.VRMC_vrm.ExpressionPreset preset) + { + var clip = GetClip(new ExpressionKey(preset)); + if (clip != null) return; + clip = ScriptableObject.CreateInstance(); + clip.name = preset.ToString(); + clip.ExpressionName = preset.ToString(); + clip.Preset = preset; + Clips.Add(clip); + } + + public void SetClip(ExpressionKey key, VRM10Expression clip) + { + int index = -1; + try + { + index = Clips.FindIndex(x => key.Match(x)); + } + catch (Exception) + { + + } + if (index == -1) + { + Clips.Add(clip); + } + else + { + Clips[index] = clip; + } + } + + public VRM10Expression GetClip(ExpressionKey key) + { + if (Clips == null) return null; + return Clips.FirstOrDefault(x => key.Match(x)); + } + + public static IExpressionValidatorFactory ExpressionValidatorFactory = new DefaultExpressionValidator.Factory(); + private List _keys = new List(); private Dictionary _inputWeights = new Dictionary(); private Dictionary _actualWeights = new Dictionary(); @@ -45,16 +103,10 @@ namespace UniVRM10 internal void Setup(VRM10Controller target, ILookAtEyeDirectionProvider eyeDirectionProvider, ILookAtEyeDirectionApplicable eyeDirectionApplicable) { - m_expressionAvatar = target.GetComponent(); - if (m_expressionAvatar == null) - { - throw new ArgumentNullException(); - } - Restore(); - _merger = new ExpressionMerger(m_expressionAvatar.Clips, target.transform); - _keys = m_expressionAvatar.Clips.Select(ExpressionKey.CreateFromClip).ToList(); + _merger = new ExpressionMerger(Clips, target.transform); + _keys = Clips.Select(ExpressionKey.CreateFromClip).ToList(); var oldInputWeights = _inputWeights; _inputWeights = _keys.ToDictionary(x => x, x => 0f); foreach (var key in _keys) @@ -63,7 +115,7 @@ namespace UniVRM10 if (oldInputWeights.ContainsKey(key)) _inputWeights[key] = oldInputWeights[key]; } _actualWeights = _keys.ToDictionary(x => x, x => 0f); - _validator = ExpressionValidatorFactory.Create(m_expressionAvatar); + _validator = ExpressionValidatorFactory.Create(this); _eyeDirectionProvider = eyeDirectionProvider; _eyeDirectionApplicable = eyeDirectionApplicable; } diff --git a/Assets/VRM10/Runtime/Components/Meta/VRM10MetaObject.cs.meta b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs.meta similarity index 83% rename from Assets/VRM10/Runtime/Components/Meta/VRM10MetaObject.cs.meta rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs.meta index 2e015ab33..2b7fe5401 100644 --- a/Assets/VRM10/Runtime/Components/Meta/VRM10MetaObject.cs.meta +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectExpression.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 848b62e18138b724dbaec592fbf31a1c +guid: dcf99f5cc866e6b42b05c6f6a7ea630c MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM10/Runtime/Components/VRM10ControllerFirstPerson.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs similarity index 98% rename from Assets/VRM10/Runtime/Components/VRM10ControllerFirstPerson.cs rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs index c6f5e8c18..805b235e3 100644 --- a/Assets/VRM10/Runtime/Components/VRM10ControllerFirstPerson.cs +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs @@ -7,7 +7,7 @@ using UnityEngine; namespace UniVRM10 { [Serializable] - public class VRM10ControllerFirstPerson + public class VRM10ObjectFirstPerson { [SerializeField] public List Renderers = new List(); @@ -15,7 +15,7 @@ namespace UniVRM10 public void CopyTo(GameObject _dst, Dictionary map) { var dst = _dst.GetOrAddComponent(); - dst.FirstPerson.Renderers = Renderers.Select(x => + dst.Vrm.FirstPerson.Renderers = Renderers.Select(x => { var renderer = map[x.Renderer.transform].GetComponent(); return new RendererFirstPersonFlags diff --git a/Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs.meta b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs.meta similarity index 83% rename from Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs.meta rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs.meta index 56180f5f3..47176cdca 100644 --- a/Assets/VRM10/Editor/Components/VRM10ControllerEditor.cs.meta +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectFirstPerson.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1aa2c8486d14a1f4cbe81ff2fb5d0438 +guid: a54f419e664839f43a56ffffcbdf72db MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM10/Runtime/Components/Meta/VRM10MetaObject.cs b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectMeta.cs similarity index 91% rename from Assets/VRM10/Runtime/Components/Meta/VRM10MetaObject.cs rename to Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectMeta.cs index d83987185..4922aac93 100644 --- a/Assets/VRM10/Runtime/Components/Meta/VRM10MetaObject.cs +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectMeta.cs @@ -1,17 +1,15 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using UniGLTF; using UnityEngine; -using VRMShaders; namespace UniVRM10 { - [CreateAssetMenu(menuName = "VRM10/MetaObject")] - public class VRM10MetaObject : ScriptableObject + [Serializable] + public class VRM10ObjectMeta { - public static SubAssetKey SubAssetKey => new SubAssetKey(typeof(VRM10MetaObject), "Meta"); - [SerializeField] public string ExporterVersion; @@ -93,7 +91,7 @@ namespace UniVRM10 } } - public void CopyTo(VRM10MetaObject dst) + public void CopyTo(VRM10ObjectMeta dst) { dst.ExporterVersion = ExporterVersion; dst.Name = Name; diff --git a/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectMeta.cs.meta b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectMeta.cs.meta new file mode 100644 index 000000000..8ba5d3847 --- /dev/null +++ b/Assets/VRM10/Runtime/Components/VRM10Object/VRM10ObjectMeta.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1327f6acc7d07744ab3908816a800a6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs b/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs index 5abdc14d9..8a928a376 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Exporter.cs @@ -134,7 +134,7 @@ namespace UniVRM10 return new float[] { -v.x, v.y, v.z }; } - public void Export(GameObject root, Model model, ModelExporter converter, ExportArgs option, VRM10MetaObject metaObject = null) + public void Export(GameObject root, Model model, ModelExporter converter, ExportArgs option, VRM10Object vrmObject = null) { ExportAsset(model); @@ -182,7 +182,7 @@ namespace UniVRM10 // node ExportNodes(model.Root, model.Nodes, model.MeshGroups, option); - var (vrm, vrmSpringBone, thumbnailTextureIndex) = ExportVrm(root, model, converter, metaObject); + var (vrm, vrmSpringBone, thumbnailTextureIndex) = ExportVrm(root, model, converter, vrmObject); // Extension で Texture が増える場合があるので最後に呼ぶ for (int i = 0; i < m_textureExporter.Exported.Count; ++i) @@ -213,21 +213,21 @@ namespace UniVRM10 /// /// /// - /// + /// /// (UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm, UniGLTF.Extensions.VRMC_springBone.VRMC_springBone springBone, - int? thumbnailIndex) ExportVrm(GameObject root, Model model, ModelExporter converter, VRM10MetaObject meta) + int? thumbnailIndex) ExportVrm(GameObject root, Model model, ModelExporter converter, VRM10Object vrmObject) { var vrmController = root?.GetComponent(); - if (meta == null) + if (vrmObject == null) { - if (vrmController == null || vrmController.Meta == null) + if (vrmController?.Vrm?.Meta == null) { throw new NullReferenceException("metaObject is null"); } - meta = vrmController.Meta.Meta; + vrmObject = vrmController.Vrm; } var vrm = new UniGLTF.Extensions.VRMC_vrm.VRMC_vrm @@ -251,7 +251,7 @@ namespace UniVRM10 // required // ExportHumanoid(vrm, model); - var thumbnailTextureIndex = ExportMeta(vrm, meta); + var thumbnailTextureIndex = ExportMeta(vrm, vrmObject.Meta); // // optional @@ -340,7 +340,7 @@ namespace UniVRM10 } // colliderGroups - foreach (var x in controller.SpringBone.ColliderGroups) + foreach (var x in controller.Vrm.SpringBone.ColliderGroups) { springBone.ColliderGroups.Add(new UniGLTF.Extensions.VRMC_springBone.ColliderGroup { @@ -349,13 +349,13 @@ namespace UniVRM10 } // springs - foreach (var x in controller.SpringBone.Springs) + foreach (var x in controller.Vrm.SpringBone.Springs) { var spring = new UniGLTF.Extensions.VRMC_springBone.Spring { Name = x.Name, Joints = x.Joints.Select(y => ExportJoint(y, getNodeIndexFromTransform)).ToList(), - ColliderGroups = x.ColliderGroups.Select(y => controller.SpringBone.ColliderGroups.IndexOf(y)).ToArray(), + ColliderGroups = x.ColliderGroups.Select(y => controller.Vrm.SpringBone.ColliderGroups.IndexOf(y)).ToArray(), }; springBone.Springs.Add(spring); } @@ -469,7 +469,7 @@ namespace UniVRM10 void ExportFirstPerson(UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm, VRM10Controller vrmController, Model model, ModelExporter converter) { - if (vrmController?.FirstPerson == null) + if (!(vrmController?.Vrm?.FirstPerson is VRM10ObjectFirstPerson firstPerson)) { return; } @@ -483,7 +483,7 @@ namespace UniVRM10 var node = converter.Nodes[r.gameObject]; return model.Nodes.IndexOf(node); }; - foreach (var f in vrmController.FirstPerson.Renderers) + foreach (var f in firstPerson.Renderers) { vrm.FirstPerson.MeshAnnotations.Add(ExportMeshAnnotation(f, getIndex)); } @@ -500,23 +500,23 @@ namespace UniVRM10 void ExportLookAt(UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm, VRM10Controller vrmController) { - if (vrmController?.LookAt == null) + if (!(vrmController?.Vrm?.LookAt is VRM10ControllerLookAt lookAt)) { return; } vrm.LookAt = new UniGLTF.Extensions.VRMC_vrm.LookAt { - Type = vrmController.LookAt.LookAtType, + Type = lookAt.LookAtType, OffsetFromHeadBone = new float[]{ - vrmController.LookAt.OffsetFromHead.x , - vrmController.LookAt.OffsetFromHead.y , - vrmController.LookAt.OffsetFromHead.z , + lookAt.OffsetFromHead.x , + lookAt.OffsetFromHead.y , + lookAt.OffsetFromHead.z , }, - RangeMapHorizontalInner = ExportLookAtRangeMap(vrmController.LookAt.HorizontalInner), - RangeMapHorizontalOuter = ExportLookAtRangeMap(vrmController.LookAt.HorizontalOuter), - RangeMapVerticalDown = ExportLookAtRangeMap(vrmController.LookAt.VerticalDown), - RangeMapVerticalUp = ExportLookAtRangeMap(vrmController.LookAt.VerticalUp), + RangeMapHorizontalInner = ExportLookAtRangeMap(lookAt.HorizontalInner), + RangeMapHorizontalOuter = ExportLookAtRangeMap(lookAt.HorizontalOuter), + RangeMapVerticalDown = ExportLookAtRangeMap(lookAt.VerticalDown), + RangeMapVerticalUp = ExportLookAtRangeMap(lookAt.VerticalUp), }; } @@ -552,8 +552,7 @@ namespace UniVRM10 void ExportExpression(UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm, VRM10Controller vrmController, Model model, ModelExporter converter) { - var expressionAvatar = vrmController.GetComponent(); - if (expressionAvatar?.Clips == null) + if (vrmController?.Vrm?.Expression?.Clips == null) { return; } @@ -578,7 +577,7 @@ namespace UniVRM10 }; vrm.Expressions = new List(); - foreach (var e in expressionAvatar.Clips) + foreach (var e in vrmController.Vrm.Expression.Clips) { var vrmExpression = new UniGLTF.Extensions.VRMC_vrm.Expression { @@ -629,7 +628,7 @@ namespace UniVRM10 } } - int? ExportMeta(UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm, VRM10MetaObject meta) + int? ExportMeta(UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm, VRM10ObjectMeta meta) { vrm.Meta.Name = meta.Name; vrm.Meta.Version = meta.Version; diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index 5d8e812e1..dae9ae24b 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -214,7 +214,7 @@ namespace UniVRM10 } UnityEngine.Avatar m_humanoid; - VRM10MetaObject m_meta; + VRM10Object m_vrmObject; List m_expressions = new List(); protected override async Task OnLoadHierarchy(IAwaitCaller awaitCaller, Func MeasureTime) @@ -233,7 +233,8 @@ namespace UniVRM10 var controller = Root.AddComponent(); // vrm - await LoadVrmAsync(awaitCaller, controller, m_vrm); + m_vrmObject = controller.Vrm = await LoadVrmAsync(awaitCaller, m_vrm); + // springBone if (UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.TryGet(Parser.GLTF.extensions, out UniGLTF.Extensions.VRMC_springBone.VRMC_springBone springBone)) { @@ -255,58 +256,61 @@ namespace UniVRM10 } } - async Task LoadVrmAsync(IAwaitCaller awaitCaller, VRM10Controller controller, UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrm) + async Task LoadVrmAsync(IAwaitCaller awaitCaller, UniGLTF.Extensions.VRMC_vrm.VRMC_vrm vrmExtension) { - // meta - if (m_externalMap.TryGetValue(VRM10MetaObject.SubAssetKey, out UnityEngine.Object meta)) + if (m_externalMap.TryGetValue(VRM10Object.SubAssetKey, out UnityEngine.Object obj) && obj is VRM10Object vrm) { - controller.Meta.Meta = meta as VRM10MetaObject; + // use external object map + return vrm; } - else if (vrm.Meta != null) + + // create new object + vrm = ScriptableObject.CreateInstance(); + vrm.name = VRM10Object.SubAssetKey.Name; + + // meta + if (vrmExtension.Meta != null) { - var src = vrm.Meta; - m_meta = ScriptableObject.CreateInstance(); - m_meta.name = VRM10MetaObject.SubAssetKey.Name; - controller.Meta.Meta = m_meta; - m_meta.Name = src.Name; - m_meta.Version = src.Version; - m_meta.ContactInformation = src.ContactInformation; + var src = vrmExtension.Meta; + var meta = new VRM10ObjectMeta(); + vrm.Meta = meta; + meta.Name = src.Name; + meta.Version = src.Version; + meta.ContactInformation = src.ContactInformation; // avatar - m_meta.AllowedUser = src.AvatarPermission; - m_meta.ViolentUsage = src.AllowExcessivelyViolentUsage.Value; - m_meta.SexualUsage = src.AllowExcessivelySexualUsage.Value; - m_meta.CommercialUsage = src.CommercialUsage; - m_meta.PoliticalOrReligiousUsage = src.AllowPoliticalOrReligiousUsage.Value; + meta.AllowedUser = src.AvatarPermission; + meta.ViolentUsage = src.AllowExcessivelyViolentUsage.Value; + meta.SexualUsage = src.AllowExcessivelySexualUsage.Value; + meta.CommercialUsage = src.CommercialUsage; + meta.PoliticalOrReligiousUsage = src.AllowPoliticalOrReligiousUsage.Value; // redistribution - m_meta.CreditNotation = src.CreditNotation; - m_meta.Redistribution = src.AllowRedistribution.Value; - m_meta.ModificationLicense = src.Modification; - m_meta.OtherLicenseUrl = src.OtherLicenseUrl; + meta.CreditNotation = src.CreditNotation; + meta.Redistribution = src.AllowRedistribution.Value; + meta.ModificationLicense = src.Modification; + meta.OtherLicenseUrl = src.OtherLicenseUrl; // if (src.References != null) { - m_meta.References.AddRange(src.References); + meta.References.AddRange(src.References); } if (src.Authors != null) { - m_meta.Authors.AddRange(src.Authors); + meta.Authors.AddRange(src.Authors); } - if (Vrm10TextureDescriptorGenerator.TryGetMetaThumbnailTextureImportParam(Parser, vrm, out (SubAssetKey, VRMShaders.TextureDescriptor Param) kv)) + if (Vrm10TextureDescriptorGenerator.TryGetMetaThumbnailTextureImportParam(Parser, vrmExtension, out (SubAssetKey, VRMShaders.TextureDescriptor Param) kv)) { var texture = await TextureFactory.GetTextureAsync(kv.Param); if (texture is Texture2D tex2D) { - m_meta.Thumbnail = tex2D; + meta.Thumbnail = tex2D; } } } // expression - if (vrm.Expressions != null) + if (vrmExtension.Expressions != null) { - var expressionAvatar = Root.AddComponent(); - - foreach (var expression in vrm.Expressions) + foreach (var expression in vrmExtension.Expressions) { VRM10Expression clip = default; if (m_externalMap.TryGetValue(Key(expression).SubAssetKey, out UnityEngine.Object expressionObj)) @@ -337,48 +341,50 @@ namespace UniVRM10 m_expressions.Add(clip); } - expressionAvatar.Clips.Add(clip); + vrm.Expression.Clips.Add(clip); } } // lookat - if (vrm.LookAt != null) + if (vrmExtension.LookAt != null) { - var src = vrm.LookAt; - controller.LookAt.LookAtType = src.Type; - controller.LookAt.OffsetFromHead = new Vector3(src.OffsetFromHeadBone[0], src.OffsetFromHeadBone[1], src.OffsetFromHeadBone[2]); + var src = vrmExtension.LookAt; + vrm.LookAt.LookAtType = src.Type; + vrm.LookAt.OffsetFromHead = new Vector3(src.OffsetFromHeadBone[0], src.OffsetFromHeadBone[1], src.OffsetFromHeadBone[2]); if (src.RangeMapHorizontalInner != null) { - controller.LookAt.HorizontalInner = new CurveMapper(src.RangeMapHorizontalInner.InputMaxValue.Value, src.RangeMapHorizontalInner.OutputScale.Value); + vrm.LookAt.HorizontalInner = new CurveMapper(src.RangeMapHorizontalInner.InputMaxValue.Value, src.RangeMapHorizontalInner.OutputScale.Value); } if (src.RangeMapHorizontalOuter != null) { - controller.LookAt.HorizontalOuter = new CurveMapper(src.RangeMapHorizontalOuter.InputMaxValue.Value, src.RangeMapHorizontalOuter.OutputScale.Value); + vrm.LookAt.HorizontalOuter = new CurveMapper(src.RangeMapHorizontalOuter.InputMaxValue.Value, src.RangeMapHorizontalOuter.OutputScale.Value); } if (src.RangeMapVerticalUp != null) { - controller.LookAt.VerticalUp = new CurveMapper(src.RangeMapVerticalUp.InputMaxValue.Value, src.RangeMapVerticalUp.OutputScale.Value); + vrm.LookAt.VerticalUp = new CurveMapper(src.RangeMapVerticalUp.InputMaxValue.Value, src.RangeMapVerticalUp.OutputScale.Value); } if (src.RangeMapVerticalDown != null) { - controller.LookAt.VerticalDown = new CurveMapper(src.RangeMapVerticalDown.InputMaxValue.Value, src.RangeMapVerticalDown.OutputScale.Value); + vrm.LookAt.VerticalDown = new CurveMapper(src.RangeMapVerticalDown.InputMaxValue.Value, src.RangeMapVerticalDown.OutputScale.Value); } } // firstPerson - if (vrm.FirstPerson != null && vrm.FirstPerson.MeshAnnotations != null) + if (vrmExtension.FirstPerson != null && vrmExtension.FirstPerson.MeshAnnotations != null) { - var fp = vrm.FirstPerson; + var fp = vrmExtension.FirstPerson; foreach (var x in fp.MeshAnnotations) { var node = Nodes[x.Node.Value]; - controller.FirstPerson.Renderers.Add(new RendererFirstPersonFlags + vrm.FirstPerson.Renderers.Add(new RendererFirstPersonFlags { FirstPersonFlag = x.Type, Renderer = node.GetComponent() }); } } + + return vrm; } async Task LoadSpringBoneAsync(IAwaitCaller awaitCaller, VRM10Controller controller, UniGLTF.Extensions.VRMC_springBone.VRMC_springBone gltfVrmSpringBone) @@ -425,7 +431,7 @@ namespace UniVRM10 foreach (var g in gltfVrmSpringBone.ColliderGroups) { var colliderGroup = secondary.gameObject.AddComponent(); - controller.SpringBone.ColliderGroups.Add(colliderGroup); + controller.Vrm.SpringBone.ColliderGroups.Add(colliderGroup); foreach (var c in g.Colliders) { @@ -447,11 +453,11 @@ namespace UniVRM10 continue; } var spring = new VRM10ControllerSpringBone.Spring(gltfSpring.Name); - controller.SpringBone.Springs.Add(spring); + controller.Vrm.SpringBone.Springs.Add(spring); if (gltfSpring.ColliderGroups != null) { - spring.ColliderGroups = gltfSpring.ColliderGroups.Select(x => controller.SpringBone.ColliderGroups[x]).ToList(); + spring.ColliderGroups = gltfSpring.ColliderGroups.Select(x => controller.Vrm.SpringBone.ColliderGroups[x]).ToList(); } // joint foreach (var gltfJoint in gltfSpring.Joints) @@ -630,10 +636,10 @@ namespace UniVRM10 take(SubAssetKey.Create(m_humanoid), m_humanoid); m_humanoid = null; - if (m_meta != null) + if (m_vrmObject != null) { - take(VRM10MetaObject.SubAssetKey, m_meta); - m_meta = null; + take(VRM10Object.SubAssetKey, m_vrmObject); + m_vrmObject = null; } foreach (var x in m_expressions) @@ -653,16 +659,20 @@ namespace UniVRM10 if (m_humanoid != null) { UnityObjectDestoyer.DestroyRuntimeOrEditor(m_humanoid); + m_humanoid = null; } - if (m_meta != null) + + if (m_vrmObject != null) { - UnityObjectDestoyer.DestroyRuntimeOrEditor(m_meta); + UnityObjectDestoyer.DestroyRuntimeOrEditor(m_vrmObject); + m_vrmObject = null; } foreach (var clip in m_expressions) { UnityObjectDestoyer.DestroyRuntimeOrEditor(clip); } + m_expressions.Clear(); base.Dispose(); }