diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index a1bfd10cc..7af7e4362 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -39,6 +39,8 @@ namespace UniVRM10 public Vrm10RuntimeExpression Expression { get; } public Vrm10RuntimeLookAt LookAt { get; } + public IVrm10Animation VrmAnimation { get; set; } + public Vector3 ExternalForce { get => m_externalData.ExternalForce; @@ -178,7 +180,8 @@ namespace UniVRM10 /// /// 毎フレーム関連コンポーネントを解決する /// - /// * Contraint + /// * Update from VrmAnimation + /// * Constraint /// * Spring /// * LookAt /// * Expression @@ -186,19 +189,36 @@ namespace UniVRM10 /// public void Process() { - // 1. Control Rig + // 1. Update From VrmAnimation + if (VrmAnimation != null) + { + // copy pose + { + Vrm10Retarget.Retarget(VrmAnimation.ControlRig, (ControlRig, ControlRig)); + } + + // update expressions + foreach (var (k, v) in VrmAnimation.ExpressionMap) + { + Expression.SetWeight(k, v()); + } + + // TODO: look at target + } + + // 2. Control Rig ControlRig?.Process(); - // 2. Constraints + // 3. Constraints foreach (var constraint in Constraints) { constraint.Process(); } - // 3. Gaze control + // 4. Gaze control LookAt.Process(m_target.LookAtTargetType, m_target.LookAtTarget); - // 4. Expression + // 5. Apply Expression Expression.Process(); } } diff --git a/Assets/VRM10/Runtime/Components/VrmAnimationInstance/IVrm10Animation.cs b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/IVrm10Animation.cs new file mode 100644 index 000000000..7242e5b1f --- /dev/null +++ b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/IVrm10Animation.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace UniVRM10 +{ + public interface IVrm10Animation : IDisposable + { + (INormalizedPoseProvider, ITPoseProvider) ControlRig { get; } + IReadOnlyDictionary> ExpressionMap { get; } + public void ShowBoxMan(bool enable); + } +} diff --git a/Assets/VRM10_Samples/VRM10Viewer/Motions/IMotion.cs.meta b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/IVrm10Animation.cs.meta similarity index 83% rename from Assets/VRM10_Samples/VRM10Viewer/Motions/IMotion.cs.meta rename to Assets/VRM10/Runtime/Components/VrmAnimationInstance/IVrm10Animation.cs.meta index bdc7beafd..9b2379524 100644 --- a/Assets/VRM10_Samples/VRM10Viewer/Motions/IMotion.cs.meta +++ b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/IVrm10Animation.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: bd8db8a4bdc3e7f40a0a7a1bcd554137 +guid: 1b2654d5824889e418b2f9bdc9456680 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/VRM10/Runtime/Components/VrmAnimationInstance/Vrm10AnimationInstance.cs b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/Vrm10AnimationInstance.cs new file mode 100644 index 000000000..7012be45c --- /dev/null +++ b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/Vrm10AnimationInstance.cs @@ -0,0 +1,323 @@ +using System; +using System.Collections.Generic; +using UniHumanoid; +using UnityEngine; + +namespace UniVRM10 +{ + public class Vrm10AnimationInstance : MonoBehaviour, IVrm10Animation + { + public SkinnedMeshRenderer BoxMan; + + public void Dispose() + { + if (Application.isPlaying) + { + Destroy(this); + } + else + { + DestroyImmediate(this); + } + } + + public (INormalizedPoseProvider, ITPoseProvider) ControlRig { get; set; } + Dictionary> _ExpressionMap = new(); + public IReadOnlyDictionary> ExpressionMap => _ExpressionMap; + + public void ShowBoxMan(bool enable) + { + BoxMan.enabled = enable; + } + + public float preset_happy; + public float preset_angry; + public float preset_sad; + public float preset_relaxed; + public float preset_surprised; + public float preset_aa; + public float preset_ih; + public float preset_ou; + public float preset_ee; + public float preset_oh; + public float preset_blink; + public float preset_blinkleft; + public float preset_blinkright; + // public float preset_lookup; + // public float preset_lookdown; + // public float preset_lookleft; + // public float preset_lookright; + public float preset_neutral; + + public float custom_00; + public float custom_01; + public float custom_02; + public float custom_03; + public float custom_04; + public float custom_05; + public float custom_06; + public float custom_07; + public float custom_08; + public float custom_09; + + public float custom_10; + public float custom_11; + public float custom_12; + public float custom_13; + public float custom_14; + public float custom_15; + public float custom_16; + public float custom_17; + public float custom_18; + public float custom_19; + + public float custom_20; + public float custom_21; + public float custom_22; + public float custom_23; + public float custom_24; + public float custom_25; + public float custom_26; + public float custom_27; + public float custom_28; + public float custom_29; + + public float custom_30; + public float custom_31; + public float custom_32; + public float custom_33; + public float custom_34; + public float custom_35; + public float custom_36; + public float custom_37; + public float custom_38; + public float custom_39; + + public float custom_40; + public float custom_41; + public float custom_42; + public float custom_43; + public float custom_44; + public float custom_45; + public float custom_46; + public float custom_47; + public float custom_48; + public float custom_49; + + public float custom_50; + public float custom_51; + public float custom_52; + public float custom_53; + public float custom_54; + public float custom_55; + public float custom_56; + public float custom_57; + public float custom_58; + public float custom_59; + + public float custom_60; + public float custom_61; + public float custom_62; + public float custom_63; + public float custom_64; + public float custom_65; + public float custom_66; + public float custom_67; + public float custom_68; + public float custom_69; + + public float custom_70; + public float custom_71; + public float custom_72; + public float custom_73; + public float custom_74; + public float custom_75; + public float custom_76; + public float custom_77; + public float custom_78; + public float custom_79; + + public float custom_80; + public float custom_81; + public float custom_82; + public float custom_83; + public float custom_84; + public float custom_85; + public float custom_86; + public float custom_87; + public float custom_88; + public float custom_89; + + public float custom_90; + public float custom_91; + public float custom_92; + public float custom_93; + public float custom_94; + public float custom_95; + public float custom_96; + public float custom_97; + public float custom_98; + public float custom_99; + + public void Initialize(IEnumerable keys) + { + var humanoid = gameObject.AddComponent(); + if (humanoid.AssignBonesFromAnimator()) + { + // require: transform is T-Pose + var provider = new InitRotationPoseProvider(transform, humanoid); + ControlRig = (provider, provider); + + // create SkinnedMesh for bone visualize + var animator = GetComponent(); + BoxMan = SkeletonMeshUtility.CreateRenderer(animator); + var material = new Material(Shader.Find("Standard")); + BoxMan.sharedMaterial = material; + var mesh = BoxMan.sharedMesh; + mesh.name = "box-man"; + } + + int customIndex = 0; + foreach (var key in keys) + { + switch (key.Preset) + { + case ExpressionPreset.happy: _ExpressionMap.Add(key, () => preset_happy); break; + case ExpressionPreset.angry: _ExpressionMap.Add(key, () => preset_angry); break; + case ExpressionPreset.sad: _ExpressionMap.Add(key, () => preset_sad); break; + case ExpressionPreset.relaxed: _ExpressionMap.Add(key, () => preset_relaxed); break; + case ExpressionPreset.surprised: _ExpressionMap.Add(key, () => preset_surprised); break; + case ExpressionPreset.aa: _ExpressionMap.Add(key, () => preset_aa); break; + case ExpressionPreset.ih: _ExpressionMap.Add(key, () => preset_ih); break; + case ExpressionPreset.ou: _ExpressionMap.Add(key, () => preset_ou); break; + case ExpressionPreset.ee: _ExpressionMap.Add(key, () => preset_ee); break; + case ExpressionPreset.oh: _ExpressionMap.Add(key, () => preset_oh); break; + case ExpressionPreset.blink: _ExpressionMap.Add(key, () => preset_blink); break; + case ExpressionPreset.blinkLeft: _ExpressionMap.Add(key, () => preset_blinkleft); break; + case ExpressionPreset.blinkRight: _ExpressionMap.Add(key, () => preset_blinkright); break; + // case ExpressionPreset.lookUp: _ExpressionMap.Add(key, () => preset_lookUp); break; + // case ExpressionPreset.lookDown: _ExpressionMap.Add(key, () => preset_lookDown); break; + // case ExpressionPreset.lookLeft: _ExpressionMap.Add(key, () => preset_lookLeft); break; + // case ExpressionPreset.lookRight: _ExpressionMap.Add(key, () => preset_lookRight); break; + case ExpressionPreset.neutral: _ExpressionMap.Add(key, () => preset_neutral); break; + case ExpressionPreset.custom: + { + switch (customIndex++) + { + case 00: _ExpressionMap.Add(key, () => custom_00); break; + case 01: _ExpressionMap.Add(key, () => custom_01); break; + case 02: _ExpressionMap.Add(key, () => custom_02); break; + case 03: _ExpressionMap.Add(key, () => custom_03); break; + case 04: _ExpressionMap.Add(key, () => custom_04); break; + case 05: _ExpressionMap.Add(key, () => custom_05); break; + case 06: _ExpressionMap.Add(key, () => custom_06); break; + case 07: _ExpressionMap.Add(key, () => custom_07); break; + case 08: _ExpressionMap.Add(key, () => custom_08); break; + case 09: _ExpressionMap.Add(key, () => custom_09); break; + + case 10: _ExpressionMap.Add(key, () => custom_10); break; + case 11: _ExpressionMap.Add(key, () => custom_11); break; + case 12: _ExpressionMap.Add(key, () => custom_12); break; + case 13: _ExpressionMap.Add(key, () => custom_13); break; + case 14: _ExpressionMap.Add(key, () => custom_14); break; + case 15: _ExpressionMap.Add(key, () => custom_15); break; + case 16: _ExpressionMap.Add(key, () => custom_16); break; + case 17: _ExpressionMap.Add(key, () => custom_17); break; + case 18: _ExpressionMap.Add(key, () => custom_18); break; + case 19: _ExpressionMap.Add(key, () => custom_19); break; + + case 20: _ExpressionMap.Add(key, () => custom_20); break; + case 21: _ExpressionMap.Add(key, () => custom_21); break; + case 22: _ExpressionMap.Add(key, () => custom_22); break; + case 23: _ExpressionMap.Add(key, () => custom_23); break; + case 24: _ExpressionMap.Add(key, () => custom_24); break; + case 25: _ExpressionMap.Add(key, () => custom_25); break; + case 26: _ExpressionMap.Add(key, () => custom_26); break; + case 27: _ExpressionMap.Add(key, () => custom_27); break; + case 28: _ExpressionMap.Add(key, () => custom_28); break; + case 29: _ExpressionMap.Add(key, () => custom_29); break; + + case 30: _ExpressionMap.Add(key, () => custom_30); break; + case 31: _ExpressionMap.Add(key, () => custom_31); break; + case 32: _ExpressionMap.Add(key, () => custom_32); break; + case 33: _ExpressionMap.Add(key, () => custom_33); break; + case 34: _ExpressionMap.Add(key, () => custom_34); break; + case 35: _ExpressionMap.Add(key, () => custom_35); break; + case 36: _ExpressionMap.Add(key, () => custom_36); break; + case 37: _ExpressionMap.Add(key, () => custom_37); break; + case 38: _ExpressionMap.Add(key, () => custom_38); break; + case 39: _ExpressionMap.Add(key, () => custom_39); break; + + case 40: _ExpressionMap.Add(key, () => custom_40); break; + case 41: _ExpressionMap.Add(key, () => custom_41); break; + case 42: _ExpressionMap.Add(key, () => custom_42); break; + case 43: _ExpressionMap.Add(key, () => custom_43); break; + case 44: _ExpressionMap.Add(key, () => custom_44); break; + case 45: _ExpressionMap.Add(key, () => custom_45); break; + case 46: _ExpressionMap.Add(key, () => custom_46); break; + case 47: _ExpressionMap.Add(key, () => custom_47); break; + case 48: _ExpressionMap.Add(key, () => custom_48); break; + case 49: _ExpressionMap.Add(key, () => custom_49); break; + + case 50: _ExpressionMap.Add(key, () => custom_50); break; + case 51: _ExpressionMap.Add(key, () => custom_51); break; + case 52: _ExpressionMap.Add(key, () => custom_52); break; + case 53: _ExpressionMap.Add(key, () => custom_53); break; + case 54: _ExpressionMap.Add(key, () => custom_54); break; + case 55: _ExpressionMap.Add(key, () => custom_55); break; + case 56: _ExpressionMap.Add(key, () => custom_56); break; + case 57: _ExpressionMap.Add(key, () => custom_57); break; + case 58: _ExpressionMap.Add(key, () => custom_58); break; + case 59: _ExpressionMap.Add(key, () => custom_59); break; + + case 60: _ExpressionMap.Add(key, () => custom_60); break; + case 61: _ExpressionMap.Add(key, () => custom_61); break; + case 62: _ExpressionMap.Add(key, () => custom_62); break; + case 63: _ExpressionMap.Add(key, () => custom_63); break; + case 64: _ExpressionMap.Add(key, () => custom_64); break; + case 65: _ExpressionMap.Add(key, () => custom_65); break; + case 66: _ExpressionMap.Add(key, () => custom_66); break; + case 67: _ExpressionMap.Add(key, () => custom_67); break; + case 68: _ExpressionMap.Add(key, () => custom_68); break; + case 69: _ExpressionMap.Add(key, () => custom_69); break; + + case 70: _ExpressionMap.Add(key, () => custom_70); break; + case 71: _ExpressionMap.Add(key, () => custom_71); break; + case 72: _ExpressionMap.Add(key, () => custom_72); break; + case 73: _ExpressionMap.Add(key, () => custom_73); break; + case 74: _ExpressionMap.Add(key, () => custom_74); break; + case 75: _ExpressionMap.Add(key, () => custom_75); break; + case 76: _ExpressionMap.Add(key, () => custom_76); break; + case 77: _ExpressionMap.Add(key, () => custom_77); break; + case 78: _ExpressionMap.Add(key, () => custom_78); break; + case 79: _ExpressionMap.Add(key, () => custom_79); break; + + case 80: _ExpressionMap.Add(key, () => custom_80); break; + case 81: _ExpressionMap.Add(key, () => custom_81); break; + case 82: _ExpressionMap.Add(key, () => custom_82); break; + case 83: _ExpressionMap.Add(key, () => custom_83); break; + case 84: _ExpressionMap.Add(key, () => custom_84); break; + case 85: _ExpressionMap.Add(key, () => custom_85); break; + case 86: _ExpressionMap.Add(key, () => custom_86); break; + case 87: _ExpressionMap.Add(key, () => custom_87); break; + case 88: _ExpressionMap.Add(key, () => custom_88); break; + case 89: _ExpressionMap.Add(key, () => custom_89); break; + + case 90: _ExpressionMap.Add(key, () => custom_90); break; + case 91: _ExpressionMap.Add(key, () => custom_91); break; + case 92: _ExpressionMap.Add(key, () => custom_92); break; + case 93: _ExpressionMap.Add(key, () => custom_93); break; + case 94: _ExpressionMap.Add(key, () => custom_94); break; + case 95: _ExpressionMap.Add(key, () => custom_95); break; + case 96: _ExpressionMap.Add(key, () => custom_96); break; + case 97: _ExpressionMap.Add(key, () => custom_97); break; + case 98: _ExpressionMap.Add(key, () => custom_98); break; + case 99: _ExpressionMap.Add(key, () => custom_99); break; + } + break; + } + } + } + } + } +} diff --git a/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs.meta b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/Vrm10AnimationInstance.cs.meta similarity index 100% rename from Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs.meta rename to Assets/VRM10/Runtime/Components/VrmAnimationInstance/Vrm10AnimationInstance.cs.meta diff --git a/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs deleted file mode 100644 index 0f85ab72e..000000000 --- a/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs +++ /dev/null @@ -1,304 +0,0 @@ -using System; -using System.Collections.Generic; -using UniHumanoid; -using UnityEngine; - -namespace UniVRM10 -{ - public class VrmAnimationInstance : MonoBehaviour - { - public SkinnedMeshRenderer BoxMan; - public (INormalizedPoseProvider, ITPoseProvider) ControlRig; - public Dictionary> ExpressionMap = new(); - - public float preset_happy; - public float preset_angry; - public float preset_sad; - public float preset_relaxed; - public float preset_surprised; - public float preset_aa; - public float preset_ih; - public float preset_ou; - public float preset_ee; - public float preset_oh; - public float preset_blink; - public float preset_blinkleft; - public float preset_blinkright; - // public float preset_lookup; - // public float preset_lookdown; - // public float preset_lookleft; - // public float preset_lookright; - public float preset_neutral; - - public float custom_00; - public float custom_01; - public float custom_02; - public float custom_03; - public float custom_04; - public float custom_05; - public float custom_06; - public float custom_07; - public float custom_08; - public float custom_09; - - public float custom_10; - public float custom_11; - public float custom_12; - public float custom_13; - public float custom_14; - public float custom_15; - public float custom_16; - public float custom_17; - public float custom_18; - public float custom_19; - - public float custom_20; - public float custom_21; - public float custom_22; - public float custom_23; - public float custom_24; - public float custom_25; - public float custom_26; - public float custom_27; - public float custom_28; - public float custom_29; - - public float custom_30; - public float custom_31; - public float custom_32; - public float custom_33; - public float custom_34; - public float custom_35; - public float custom_36; - public float custom_37; - public float custom_38; - public float custom_39; - - public float custom_40; - public float custom_41; - public float custom_42; - public float custom_43; - public float custom_44; - public float custom_45; - public float custom_46; - public float custom_47; - public float custom_48; - public float custom_49; - - public float custom_50; - public float custom_51; - public float custom_52; - public float custom_53; - public float custom_54; - public float custom_55; - public float custom_56; - public float custom_57; - public float custom_58; - public float custom_59; - - public float custom_60; - public float custom_61; - public float custom_62; - public float custom_63; - public float custom_64; - public float custom_65; - public float custom_66; - public float custom_67; - public float custom_68; - public float custom_69; - - public float custom_70; - public float custom_71; - public float custom_72; - public float custom_73; - public float custom_74; - public float custom_75; - public float custom_76; - public float custom_77; - public float custom_78; - public float custom_79; - - public float custom_80; - public float custom_81; - public float custom_82; - public float custom_83; - public float custom_84; - public float custom_85; - public float custom_86; - public float custom_87; - public float custom_88; - public float custom_89; - - public float custom_90; - public float custom_91; - public float custom_92; - public float custom_93; - public float custom_94; - public float custom_95; - public float custom_96; - public float custom_97; - public float custom_98; - public float custom_99; - - public void Initialize(IEnumerable keys) - { - var humanoid = gameObject.AddComponent(); - if (humanoid.AssignBonesFromAnimator()) - { - // require: transform is T-Pose - var provider = new InitRotationPoseProvider(transform, humanoid); - ControlRig = (provider, provider); - - // create SkinnedMesh for bone visualize - var animator = GetComponent(); - BoxMan = SkeletonMeshUtility.CreateRenderer(animator); - var material = new Material(Shader.Find("Standard")); - BoxMan.sharedMaterial = material; - var mesh = BoxMan.sharedMesh; - mesh.name = "box-man"; - } - - int customIndex = 0; - foreach (var key in keys) - { - switch (key.Preset) - { - case ExpressionPreset.happy: ExpressionMap.Add(key, () => preset_happy); break; - case ExpressionPreset.angry: ExpressionMap.Add(key, () => preset_angry); break; - case ExpressionPreset.sad: ExpressionMap.Add(key, () => preset_sad); break; - case ExpressionPreset.relaxed: ExpressionMap.Add(key, () => preset_relaxed); break; - case ExpressionPreset.surprised: ExpressionMap.Add(key, () => preset_surprised); break; - case ExpressionPreset.aa: ExpressionMap.Add(key, () => preset_aa); break; - case ExpressionPreset.ih: ExpressionMap.Add(key, () => preset_ih); break; - case ExpressionPreset.ou: ExpressionMap.Add(key, () => preset_ou); break; - case ExpressionPreset.ee: ExpressionMap.Add(key, () => preset_ee); break; - case ExpressionPreset.oh: ExpressionMap.Add(key, () => preset_oh); break; - case ExpressionPreset.blink: ExpressionMap.Add(key, () => preset_blink); break; - case ExpressionPreset.blinkLeft: ExpressionMap.Add(key, () => preset_blinkleft); break; - case ExpressionPreset.blinkRight: ExpressionMap.Add(key, () => preset_blinkright); break; - // case ExpressionPreset.lookUp: ExpressionMap.Add(key, () => preset_lookUp); break; - // case ExpressionPreset.lookDown: ExpressionMap.Add(key, () => preset_lookDown); break; - // case ExpressionPreset.lookLeft: ExpressionMap.Add(key, () => preset_lookLeft); break; - // case ExpressionPreset.lookRight: ExpressionMap.Add(key, () => preset_lookRight); break; - case ExpressionPreset.neutral: ExpressionMap.Add(key, () => preset_neutral); break; - case ExpressionPreset.custom: - { - switch (customIndex++) - { - case 00: ExpressionMap.Add(key, () => custom_00); break; - case 01: ExpressionMap.Add(key, () => custom_01); break; - case 02: ExpressionMap.Add(key, () => custom_02); break; - case 03: ExpressionMap.Add(key, () => custom_03); break; - case 04: ExpressionMap.Add(key, () => custom_04); break; - case 05: ExpressionMap.Add(key, () => custom_05); break; - case 06: ExpressionMap.Add(key, () => custom_06); break; - case 07: ExpressionMap.Add(key, () => custom_07); break; - case 08: ExpressionMap.Add(key, () => custom_08); break; - case 09: ExpressionMap.Add(key, () => custom_09); break; - - case 10: ExpressionMap.Add(key, () => custom_10); break; - case 11: ExpressionMap.Add(key, () => custom_11); break; - case 12: ExpressionMap.Add(key, () => custom_12); break; - case 13: ExpressionMap.Add(key, () => custom_13); break; - case 14: ExpressionMap.Add(key, () => custom_14); break; - case 15: ExpressionMap.Add(key, () => custom_15); break; - case 16: ExpressionMap.Add(key, () => custom_16); break; - case 17: ExpressionMap.Add(key, () => custom_17); break; - case 18: ExpressionMap.Add(key, () => custom_18); break; - case 19: ExpressionMap.Add(key, () => custom_19); break; - - case 20: ExpressionMap.Add(key, () => custom_20); break; - case 21: ExpressionMap.Add(key, () => custom_21); break; - case 22: ExpressionMap.Add(key, () => custom_22); break; - case 23: ExpressionMap.Add(key, () => custom_23); break; - case 24: ExpressionMap.Add(key, () => custom_24); break; - case 25: ExpressionMap.Add(key, () => custom_25); break; - case 26: ExpressionMap.Add(key, () => custom_26); break; - case 27: ExpressionMap.Add(key, () => custom_27); break; - case 28: ExpressionMap.Add(key, () => custom_28); break; - case 29: ExpressionMap.Add(key, () => custom_29); break; - - case 30: ExpressionMap.Add(key, () => custom_30); break; - case 31: ExpressionMap.Add(key, () => custom_31); break; - case 32: ExpressionMap.Add(key, () => custom_32); break; - case 33: ExpressionMap.Add(key, () => custom_33); break; - case 34: ExpressionMap.Add(key, () => custom_34); break; - case 35: ExpressionMap.Add(key, () => custom_35); break; - case 36: ExpressionMap.Add(key, () => custom_36); break; - case 37: ExpressionMap.Add(key, () => custom_37); break; - case 38: ExpressionMap.Add(key, () => custom_38); break; - case 39: ExpressionMap.Add(key, () => custom_39); break; - - case 40: ExpressionMap.Add(key, () => custom_40); break; - case 41: ExpressionMap.Add(key, () => custom_41); break; - case 42: ExpressionMap.Add(key, () => custom_42); break; - case 43: ExpressionMap.Add(key, () => custom_43); break; - case 44: ExpressionMap.Add(key, () => custom_44); break; - case 45: ExpressionMap.Add(key, () => custom_45); break; - case 46: ExpressionMap.Add(key, () => custom_46); break; - case 47: ExpressionMap.Add(key, () => custom_47); break; - case 48: ExpressionMap.Add(key, () => custom_48); break; - case 49: ExpressionMap.Add(key, () => custom_49); break; - - case 50: ExpressionMap.Add(key, () => custom_50); break; - case 51: ExpressionMap.Add(key, () => custom_51); break; - case 52: ExpressionMap.Add(key, () => custom_52); break; - case 53: ExpressionMap.Add(key, () => custom_53); break; - case 54: ExpressionMap.Add(key, () => custom_54); break; - case 55: ExpressionMap.Add(key, () => custom_55); break; - case 56: ExpressionMap.Add(key, () => custom_56); break; - case 57: ExpressionMap.Add(key, () => custom_57); break; - case 58: ExpressionMap.Add(key, () => custom_58); break; - case 59: ExpressionMap.Add(key, () => custom_59); break; - - case 60: ExpressionMap.Add(key, () => custom_60); break; - case 61: ExpressionMap.Add(key, () => custom_61); break; - case 62: ExpressionMap.Add(key, () => custom_62); break; - case 63: ExpressionMap.Add(key, () => custom_63); break; - case 64: ExpressionMap.Add(key, () => custom_64); break; - case 65: ExpressionMap.Add(key, () => custom_65); break; - case 66: ExpressionMap.Add(key, () => custom_66); break; - case 67: ExpressionMap.Add(key, () => custom_67); break; - case 68: ExpressionMap.Add(key, () => custom_68); break; - case 69: ExpressionMap.Add(key, () => custom_69); break; - - case 70: ExpressionMap.Add(key, () => custom_70); break; - case 71: ExpressionMap.Add(key, () => custom_71); break; - case 72: ExpressionMap.Add(key, () => custom_72); break; - case 73: ExpressionMap.Add(key, () => custom_73); break; - case 74: ExpressionMap.Add(key, () => custom_74); break; - case 75: ExpressionMap.Add(key, () => custom_75); break; - case 76: ExpressionMap.Add(key, () => custom_76); break; - case 77: ExpressionMap.Add(key, () => custom_77); break; - case 78: ExpressionMap.Add(key, () => custom_78); break; - case 79: ExpressionMap.Add(key, () => custom_79); break; - - case 80: ExpressionMap.Add(key, () => custom_80); break; - case 81: ExpressionMap.Add(key, () => custom_81); break; - case 82: ExpressionMap.Add(key, () => custom_82); break; - case 83: ExpressionMap.Add(key, () => custom_83); break; - case 84: ExpressionMap.Add(key, () => custom_84); break; - case 85: ExpressionMap.Add(key, () => custom_85); break; - case 86: ExpressionMap.Add(key, () => custom_86); break; - case 87: ExpressionMap.Add(key, () => custom_87); break; - case 88: ExpressionMap.Add(key, () => custom_88); break; - case 89: ExpressionMap.Add(key, () => custom_89); break; - - case 90: ExpressionMap.Add(key, () => custom_90); break; - case 91: ExpressionMap.Add(key, () => custom_91); break; - case 92: ExpressionMap.Add(key, () => custom_92); break; - case 93: ExpressionMap.Add(key, () => custom_93); break; - case 94: ExpressionMap.Add(key, () => custom_94); break; - case 95: ExpressionMap.Add(key, () => custom_95); break; - case 96: ExpressionMap.Add(key, () => custom_96); break; - case 97: ExpressionMap.Add(key, () => custom_97); break; - case 98: ExpressionMap.Add(key, () => custom_98); break; - case 99: ExpressionMap.Add(key, () => custom_99); break; - } - break; - } - } - } - } - } -} diff --git a/Assets/VRM10/Samples~/VRM10Viewer/VRM10Retarget.cs b/Assets/VRM10/Runtime/ControlRig/Vrm10Retarget.cs similarity index 95% rename from Assets/VRM10/Samples~/VRM10Viewer/VRM10Retarget.cs rename to Assets/VRM10/Runtime/ControlRig/Vrm10Retarget.cs index 2d91fb3e6..045be6766 100644 --- a/Assets/VRM10/Samples~/VRM10Viewer/VRM10Retarget.cs +++ b/Assets/VRM10/Runtime/ControlRig/Vrm10Retarget.cs @@ -1,8 +1,8 @@ using UnityEngine; -namespace UniVRM10.VRM10Viewer +namespace UniVRM10 { - public static class VRM10Retarget + public static class Vrm10Retarget { public static void Retarget((INormalizedPoseProvider Pose, ITPoseProvider TPose) source, (INormalizedPoseApplicable Pose, ITPoseProvider TPose) sink) { diff --git a/Assets/VRM10/Runtime/ControlRig/Vrm10Retarget.cs.meta b/Assets/VRM10/Runtime/ControlRig/Vrm10Retarget.cs.meta new file mode 100644 index 000000000..5ed531706 --- /dev/null +++ b/Assets/VRM10/Runtime/ControlRig/Vrm10Retarget.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e44301f13c6a1e74ba0e5322262db259 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs b/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs index 502e82beb..33b1d44c7 100644 --- a/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs +++ b/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs @@ -161,24 +161,24 @@ namespace UniVRM10 var gltfAnimation = Data.GLTF.animations[0]; if (animation.Expressions.Preset is Preset preset) { - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.happy), nameof(VrmAnimationInstance.preset_happy), preset.Happy) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.angry), nameof(VrmAnimationInstance.preset_angry), preset.Angry) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.sad), nameof(VrmAnimationInstance.preset_sad), preset.Sad) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.relaxed), nameof(VrmAnimationInstance.preset_relaxed), preset.Relaxed) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.surprised), nameof(VrmAnimationInstance.preset_surprised), preset.Surprised) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.aa), nameof(VrmAnimationInstance.preset_aa), preset.Aa) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.ih), nameof(VrmAnimationInstance.preset_ih), preset.Ih) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.ou), nameof(VrmAnimationInstance.preset_ou), preset.Ou) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.ee), nameof(VrmAnimationInstance.preset_ee), preset.Ee) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.oh), nameof(VrmAnimationInstance.preset_oh), preset.Oh) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.blink), nameof(VrmAnimationInstance.preset_blink), preset.Blink) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.blinkLeft), nameof(VrmAnimationInstance.preset_blinkleft), preset.BlinkLeft) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.blinkRight), nameof(VrmAnimationInstance.preset_blinkright), preset.BlinkRight) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.happy), nameof(Vrm10AnimationInstance.preset_happy), preset.Happy) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.angry), nameof(Vrm10AnimationInstance.preset_angry), preset.Angry) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.sad), nameof(Vrm10AnimationInstance.preset_sad), preset.Sad) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.relaxed), nameof(Vrm10AnimationInstance.preset_relaxed), preset.Relaxed) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.surprised), nameof(Vrm10AnimationInstance.preset_surprised), preset.Surprised) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.aa), nameof(Vrm10AnimationInstance.preset_aa), preset.Aa) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.ih), nameof(Vrm10AnimationInstance.preset_ih), preset.Ih) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.ou), nameof(Vrm10AnimationInstance.preset_ou), preset.Ou) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.ee), nameof(Vrm10AnimationInstance.preset_ee), preset.Ee) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.oh), nameof(Vrm10AnimationInstance.preset_oh), preset.Oh) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.blink), nameof(Vrm10AnimationInstance.preset_blink), preset.Blink) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.blinkLeft), nameof(Vrm10AnimationInstance.preset_blinkleft), preset.BlinkLeft) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.blinkRight), nameof(Vrm10AnimationInstance.preset_blinkright), preset.BlinkRight) is ExpressionInfo info) yield return info; } { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.lookUp), "preset_lookup", preset.LookUp) is ExpressionInfo info) yield return info; } { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.lookDown), "preset_lookdown", preset.LookDown) is ExpressionInfo info) yield return info; } { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.lookLeft), "preset_lookleft", preset.LookLeft) is ExpressionInfo info) yield return info; } { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.lookRight), "preset_lookright", preset.LookRight) is ExpressionInfo info) yield return info; } - { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.neutral), nameof(VrmAnimationInstance.preset_neutral), preset.Neutral) is ExpressionInfo info) yield return info; } + { if (GetExpression(gltfAnimation, ExpressionKey.CreateFromPreset(ExpressionPreset.neutral), nameof(Vrm10AnimationInstance.preset_neutral), preset.Neutral) is ExpressionInfo info) yield return info; } } if (animation.Expressions.Custom != null) { @@ -278,12 +278,12 @@ namespace UniVRM10 var curve = CreateCurve( input.ToArray(), output.ToArray()); - clip.SetCurve("", typeof(VrmAnimationInstance), expression.PropertyName, curve); + clip.SetCurve("", typeof(Vrm10AnimationInstance), expression.PropertyName, curve); } } // VRMA-animation solver - var animationInstance = instance.gameObject.AddComponent(); + var animationInstance = instance.gameObject.AddComponent(); animationInstance.Initialize(expressions.Select(x => x.Key)); return instance; diff --git a/Assets/VRM10/Samples~/VRM10Viewer/Motions/IMotion.cs b/Assets/VRM10/Samples~/VRM10Viewer/Motions/IMotion.cs deleted file mode 100644 index 656548b24..000000000 --- a/Assets/VRM10/Samples~/VRM10Viewer/Motions/IMotion.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace UniVRM10.VRM10Viewer -{ - public interface IMotion : IDisposable - { - (INormalizedPoseProvider, ITPoseProvider) ControlRig { get; } - IDictionary ExpressionMap { get; } - - void ShowBoxMan(bool enable); - } -} diff --git a/Assets/VRM10_Samples/SimpleVrma.meta b/Assets/VRM10_Samples/SimpleVrma.meta new file mode 100644 index 000000000..ba2573e96 --- /dev/null +++ b/Assets/VRM10_Samples/SimpleVrma.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 59ba601fea149ed498a9ca37af1d3c55 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.cs b/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.cs new file mode 100644 index 000000000..40f12753a --- /dev/null +++ b/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.cs @@ -0,0 +1,64 @@ +using UniGLTF; +using UnityEditor; +using UnityEngine; +using UniVRM10; +using UniVRM10.VRM10Viewer; +using VRMShaders; + +public class SimpleVrma : MonoBehaviour +{ + public Vrm10Instance Vrm; + + public Vrm10AnimationInstance Vrma; + + bool m_boxman = true; + + void OnGUI() + { + if (GUILayout.Button("open vrm")) + { + var path = EditorUtility.OpenFilePanel("open vrm", "", "vrm"); + Debug.Log(path); + LoadVrm(path); + } + + if (GUILayout.Button("open vrma")) + { + var path = EditorUtility.OpenFilePanel("open vrma", "", "vrma"); + Debug.Log(path); + LoadVrma(path); + } + + m_boxman = GUILayout.Toggle(m_boxman, "BoxMan"); + if (Vrma != null) + { + Vrma.BoxMan.enabled = m_boxman; + } + } + + async void LoadVrm(string path) + { + Vrm = await Vrm10.LoadPathAsync(path, + canLoadVrm0X: true, + showMeshes: false, + awaitCaller: new ImmediateCaller()); + + var instance = Vrm.GetComponent(); + instance.ShowMeshes(); + } + + async void LoadVrma(string path) + { + // load vrma + using GltfData data = new AutoGltfFileParser(path).Parse(); + using var loader = new VrmAnimationImporter(data); + var instance = await loader.LoadAsync(new ImmediateCaller()); + + Vrma = instance.GetComponent(); + Vrm.Runtime.VrmAnimation = Vrma; + Debug.Log(Vrma); + + var animation = Vrma.GetComponent(); + animation.Play(); + } +} diff --git a/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.cs.meta b/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.cs.meta new file mode 100644 index 000000000..b0cba8bd7 --- /dev/null +++ b/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e941e78669b3e784fa684c23441459fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.unity b/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.unity new file mode 100644 index 000000000..cd21b85b5 --- /dev/null +++ b/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.unity @@ -0,0 +1,349 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &45959732 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 45959734} + - component: {fileID: 45959733} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &45959733 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 45959732} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &45959734 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 45959732} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &231202275 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 231202278} + - component: {fileID: 231202277} + - component: {fileID: 231202276} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &231202276 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 231202275} + m_Enabled: 1 +--- !u!20 &231202277 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 231202275} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &231202278 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 231202275} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2069542080 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2069542081} + - component: {fileID: 2069542082} + m_Layer: 0 + m_Name: vrma + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2069542081 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2069542080} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2069542082 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2069542080} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e941e78669b3e784fa684c23441459fb, type: 3} + m_Name: + m_EditorClassIdentifier: + Vrm: {fileID: 0} + Vrma: {fileID: 0} diff --git a/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.unity.meta b/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.unity.meta new file mode 100644 index 000000000..df659705b --- /dev/null +++ b/Assets/VRM10_Samples/SimpleVrma/SimpleVrma.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7ceefca1729da714e8f1163c8f391445 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10_Samples/VRM10Viewer/Motions/BvhMotion.cs b/Assets/VRM10_Samples/VRM10Viewer/Motions/BvhMotion.cs index e3993d08c..ffebf9cab 100644 --- a/Assets/VRM10_Samples/VRM10Viewer/Motions/BvhMotion.cs +++ b/Assets/VRM10_Samples/VRM10Viewer/Motions/BvhMotion.cs @@ -6,15 +6,17 @@ using UnityEngine; namespace UniVRM10.VRM10Viewer { - public class BvhMotion : IMotion + public class BvhMotion : IVrm10Animation { UniHumanoid.BvhImporterContext m_context; public Transform Root => m_context?.Root.transform; public SkinnedMeshRenderer m_boxMan; public SkinnedMeshRenderer BoxMan => m_boxMan; (INormalizedPoseProvider, ITPoseProvider) m_controlRig; - (INormalizedPoseProvider, ITPoseProvider) IMotion.ControlRig => m_controlRig; - public IDictionary> ExpressionMap { get; } = new Dictionary>(); + (INormalizedPoseProvider, ITPoseProvider) IVrm10Animation.ControlRig => m_controlRig; + IDictionary> _ExpressionMap = new Dictionary>(); + public IReadOnlyDictionary> ExpressionMap => (IReadOnlyDictionary>)_ExpressionMap; + public BvhMotion(UniHumanoid.BvhImporterContext context) { m_context = context; diff --git a/Assets/VRM10_Samples/VRM10Viewer/Motions/IMotion.cs b/Assets/VRM10_Samples/VRM10Viewer/Motions/IMotion.cs deleted file mode 100644 index 5c74619ed..000000000 --- a/Assets/VRM10_Samples/VRM10Viewer/Motions/IMotion.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace UniVRM10.VRM10Viewer -{ - public interface IMotion : IDisposable - { - (INormalizedPoseProvider, ITPoseProvider) ControlRig { get; } - IDictionary> ExpressionMap { get; } - - void ShowBoxMan(bool enable); - } -} diff --git a/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs b/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs index 0d801c0a1..773149edd 100644 --- a/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs +++ b/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs @@ -8,14 +8,14 @@ using VRMShaders; namespace UniVRM10.VRM10Viewer { - public class VrmAnimation : IMotion + public class VrmAnimation : IVrm10Animation { - private readonly VrmAnimationInstance m_instance; + private readonly Vrm10AnimationInstance m_instance; - (INormalizedPoseProvider, ITPoseProvider) IMotion.ControlRig => m_instance.ControlRig; - IDictionary> IMotion.ExpressionMap => m_instance.ExpressionMap; + (INormalizedPoseProvider, ITPoseProvider) IVrm10Animation.ControlRig => m_instance.ControlRig; + IReadOnlyDictionary> IVrm10Animation.ExpressionMap => m_instance.ExpressionMap; - public VrmAnimation(VrmAnimationInstance instance, + public VrmAnimation(Vrm10AnimationInstance instance, Vector3 hips = default, Dictionary map = null) { m_instance = instance; @@ -58,13 +58,6 @@ namespace UniVRM10.VRM10Viewer } } - public static async Task LoadVrmAnimationFromPathAsync(string path) - { - using GltfData data = new AutoGltfFileParser(path).Parse(); - using var loader = new VrmAnimationImporter(data); - var instance = await loader.LoadAsync(new ImmediateCaller()); - return new VrmAnimation(instance.GetComponent()); - } static Vector3 ToVec3(JsonNode j) { @@ -178,7 +171,7 @@ namespace UniVRM10.VRM10Viewer if (pose.TryGet("humanoid", out var humanoid)) { var (root, map) = GetPose(humanoid); - return new VrmAnimation(instance.GetComponent(), root, map); + return new VrmAnimation(instance.GetComponent(), root, map); } } } diff --git a/Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs b/Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs index 2b7410322..2baeb5bc2 100644 --- a/Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs +++ b/Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs @@ -1,11 +1,14 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; +using System.Threading.Tasks; using UniGLTF; using UnityEngine; using UnityEngine.UI; using VRMShaders; +using UniJSON; namespace UniVRM10.VRM10Viewer { @@ -50,8 +53,8 @@ namespace UniVRM10.VRM10Viewer GameObject Root = default; - IMotion m_src = default; - public IMotion Motion + IVrm10Animation m_src = default; + public IVrm10Animation Motion { get { return m_src; } set @@ -431,7 +434,11 @@ namespace UniVRM10.VRM10Viewer } // gltf, glb etc... - Motion = await VrmAnimation.LoadVrmAnimationFromPathAsync(path); + using GltfData data = new AutoGltfFileParser(path).Parse(); + using var loader = new VrmAnimationImporter(data); + var instance = await loader.LoadAsync(new ImmediateCaller()); + Motion = instance.GetComponent(); + instance.GetComponent().Play(); } async void OnPastePoseClicked()