From 3b75adc9fc6c38848fb609d6718eb9b21a8c2a85 Mon Sep 17 00:00:00 2001 From: kaikoga Date: Fri, 20 Oct 2023 04:12:56 +0900 Subject: [PATCH 1/7] add VRM defines --- Editor/nadena.dev.modular-avatar.core.editor.asmdef | 10 ++++++++++ Runtime/nadena.dev.modular-avatar.core.asmdef | 10 ++++++++++ UnitTests~/Tests.asmdef | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/Editor/nadena.dev.modular-avatar.core.editor.asmdef b/Editor/nadena.dev.modular-avatar.core.editor.asmdef index 70e69df1..104568b8 100644 --- a/Editor/nadena.dev.modular-avatar.core.editor.asmdef +++ b/Editor/nadena.dev.modular-avatar.core.editor.asmdef @@ -41,6 +41,16 @@ "name": "com.vrchat.avatars", "expression": "", "define": "MA_VRCSDK3_AVATARS" + }, + { + "name": "com.vrmc.univrm", + "expression": "", + "define": "MA_VRM0" + }, + { + "name": "com.vrmc.vrm", + "expression": "", + "define": "MA_VRM1" } ], "noEngineReferences": false diff --git a/Runtime/nadena.dev.modular-avatar.core.asmdef b/Runtime/nadena.dev.modular-avatar.core.asmdef index 6e529bce..2cee7277 100644 --- a/Runtime/nadena.dev.modular-avatar.core.asmdef +++ b/Runtime/nadena.dev.modular-avatar.core.asmdef @@ -24,6 +24,16 @@ "name": "com.vrchat.avatars", "expression": "", "define": "MA_VRCSDK3_AVATARS" + }, + { + "name": "com.vrmc.univrm", + "expression": "", + "define": "MA_VRM0" + }, + { + "name": "com.vrmc.vrm", + "expression": "", + "define": "MA_VRM1" } ], "noEngineReferences": false diff --git a/UnitTests~/Tests.asmdef b/UnitTests~/Tests.asmdef index 1816b9a8..c38abd05 100644 --- a/UnitTests~/Tests.asmdef +++ b/UnitTests~/Tests.asmdef @@ -30,6 +30,16 @@ "name": "com.vrchat.avatars", "expression": "", "define": "MA_VRCSDK3_AVATARS" + }, + { + "name": "com.vrmc.univrm", + "expression": "", + "define": "MA_VRM0" + }, + { + "name": "com.vrmc.vrm", + "expression": "", + "define": "MA_VRM1" } ], "noEngineReferences": false From 4fe0d14044d1635d81cd1ed7c2d5bb356565a732 Mon Sep 17 00:00:00 2001 From: kaikoga Date: Fri, 20 Oct 2023 04:42:32 +0900 Subject: [PATCH 2/7] add VRM asmdef references --- Editor/nadena.dev.modular-avatar.core.editor.asmdef | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Editor/nadena.dev.modular-avatar.core.editor.asmdef b/Editor/nadena.dev.modular-avatar.core.editor.asmdef index 104568b8..a3226d7a 100644 --- a/Editor/nadena.dev.modular-avatar.core.editor.asmdef +++ b/Editor/nadena.dev.modular-avatar.core.editor.asmdef @@ -6,7 +6,9 @@ "VRC.SDK3A", "VRC.SDKBase", "nadena.dev.ndmf", - "nadena.dev.ndmf.vrchat" + "nadena.dev.ndmf.vrchat", + "VRM", + "VRM10" ], "includePlatforms": [ "Editor" From 5af7c58febddd5df6e42fa639731d10f5a8a2b6a Mon Sep 17 00:00:00 2001 From: kaikoga Date: Sun, 22 Oct 2023 07:21:17 +0900 Subject: [PATCH 3/7] support VRM0 SpringBone --- .../OptimizationPasses/GCGameObjectsPass.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Editor/OptimizationPasses/GCGameObjectsPass.cs b/Editor/OptimizationPasses/GCGameObjectsPass.cs index 33e0689f..d08761bb 100644 --- a/Editor/OptimizationPasses/GCGameObjectsPass.cs +++ b/Editor/OptimizationPasses/GCGameObjectsPass.cs @@ -7,6 +7,10 @@ using VRC.SDK3.Dynamics.PhysBone.Components; #endif +#if MA_VRM0 +using VRM; +#endif + namespace nadena.dev.modular_avatar.core.editor { /// @@ -66,6 +70,13 @@ private void MarkAll() break; #endif +#if MA_VRM0 + case VRMSpringBone sb: + MarkObject(obj); + MarkSpringBone(sb); + break; +#endif + case AvatarTagComponent _: // Tag components will not be retained at runtime, so pretend they're not there. break; @@ -147,6 +158,22 @@ private void MarkPhysBone(VRCPhysBone pb) } #endif +#if MA_VRM0 + private void MarkSpringBone(VRMSpringBone sb) + { + foreach (var rootBone in sb.RootBones) + { + foreach (var obj in GameObjects(rootBone.gameObject)) + { + MarkObject(obj); + } + } + + // Mark etc + MarkAllReferencedObjects(sb); + } +#endif + private void MarkAllReferencedObjects(Component component) { var so = new SerializedObject(component); From 480563d8ced2bf59cfaa60c87304f7edeb6ededc Mon Sep 17 00:00:00 2001 From: kaikoga Date: Sun, 22 Oct 2023 22:41:22 +0900 Subject: [PATCH 4/7] support VRM0/VRM1 SpringBone --- Editor/MergeArmatureHook.cs | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Editor/MergeArmatureHook.cs b/Editor/MergeArmatureHook.cs index e5be6ec1..d5742227 100644 --- a/Editor/MergeArmatureHook.cs +++ b/Editor/MergeArmatureHook.cs @@ -36,6 +36,15 @@ using UnityEditor; using UnityEngine; using UnityEngine.Animations; + +#if MA_VRM0 +using VRM; +#endif + +#if MA_VRM1 +using UniVRM10; +#endif + using Object = UnityEngine.Object; #endregion @@ -109,6 +118,35 @@ internal void OnPreprocessAvatar(ndmf.BuildContext context, GameObject avatarGam } #endif +#if MA_VRM0 + foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) + { + RetainBoneReferences(c); + } + + foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) + { + RetainBoneReferences(c); + } +#endif + +#if MA_VRM1 + foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) + { + RetainBoneReferences(c); + } + + foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) + { + RetainBoneReferences(c); + } + + foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) + { + RetainBoneReferences(c); + } +#endif + foreach (var c in avatarGameObject.transform.GetComponentsInChildren(true)) { RetainBoneReferences(c as Component); @@ -477,5 +515,7 @@ private void PruneDuplicatePhysBones() } } #endif + + // TODO - deduplicate VRM0/1 SpringBone components... doesn't break avatars either } } \ No newline at end of file From c52dbbe3cb57b302cd7a2d6724fb7c1a0be1c0d4 Mon Sep 17 00:00:00 2001 From: kaikoga Date: Sat, 4 Nov 2023 14:45:47 +0900 Subject: [PATCH 5/7] hack: null check AvatarDescriptors before ndmf is aware of environments --- Editor/Animation/AnimationDatabase.cs | 2 ++ Editor/Animation/AnimationUtil.cs | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Editor/Animation/AnimationDatabase.cs b/Editor/Animation/AnimationDatabase.cs index 728d1afe..5033d395 100644 --- a/Editor/Animation/AnimationDatabase.cs +++ b/Editor/Animation/AnimationDatabase.cs @@ -128,6 +128,8 @@ internal void OnActivate(ndmf.BuildContext context) #if MA_VRCSDK3_AVATARS var avatarDescriptor = context.AvatarDescriptor; + if (!avatarDescriptor) return; + foreach (var layer in avatarDescriptor.baseAnimationLayers) { BootstrapLayer(layer); diff --git a/Editor/Animation/AnimationUtil.cs b/Editor/Animation/AnimationUtil.cs index 61e09659..976e6122 100644 --- a/Editor/Animation/AnimationUtil.cs +++ b/Editor/Animation/AnimationUtil.cs @@ -51,9 +51,12 @@ internal static void CloneAllControllers(BuildContext context) // This helps reduce the risk that we'll accidentally modify the original assets. #if MA_VRCSDK3_AVATARS - context.AvatarDescriptor.baseAnimationLayers = + var avatarDescriptor = context.AvatarDescriptor; + if (!avatarDescriptor) return; + + avatarDescriptor.baseAnimationLayers = CloneLayers(context, context.AvatarDescriptor.baseAnimationLayers); - context.AvatarDescriptor.specialAnimationLayers = + avatarDescriptor.specialAnimationLayers = CloneLayers(context, context.AvatarDescriptor.specialAnimationLayers); #endif } From ce098d64c88ce5a5d36046e4ff48b1da6398d4a7 Mon Sep 17 00:00:00 2001 From: kaikoga Date: Sat, 30 Dec 2023 12:08:51 +0900 Subject: [PATCH 6/7] hack: more null check AvatarDescriptors --- Editor/FixupPasses/FixupExpressionsMenuPass.cs | 2 ++ Editor/MergeAnimatorProcessor.cs | 1 + Editor/OptimizationPasses/PruneParametersPass.cs | 2 ++ Editor/RenameParametersHook.cs | 2 ++ 4 files changed, 7 insertions(+) diff --git a/Editor/FixupPasses/FixupExpressionsMenuPass.cs b/Editor/FixupPasses/FixupExpressionsMenuPass.cs index f4b549ee..4f36ec2b 100644 --- a/Editor/FixupPasses/FixupExpressionsMenuPass.cs +++ b/Editor/FixupPasses/FixupExpressionsMenuPass.cs @@ -19,6 +19,8 @@ internal class FixupExpressionsMenuPass internal static void FixupExpressionsMenu(BuildContext context) { + if (!context.AvatarDescriptor) return; + context.AvatarDescriptor.customExpressions = true; var expressionsMenu = context.AvatarDescriptor.expressionsMenu; diff --git a/Editor/MergeAnimatorProcessor.cs b/Editor/MergeAnimatorProcessor.cs index 69fb0e28..5b25649c 100644 --- a/Editor/MergeAnimatorProcessor.cs +++ b/Editor/MergeAnimatorProcessor.cs @@ -65,6 +65,7 @@ internal void OnPreprocessAvatar(GameObject avatarGameObject, BuildContext conte mergeSessions.Clear(); var descriptor = avatarGameObject.GetComponent(); + if (!descriptor) return; if (descriptor.baseAnimationLayers != null) InitSessions(descriptor.baseAnimationLayers); if (descriptor.specialAnimationLayers != null) InitSessions(descriptor.specialAnimationLayers); diff --git a/Editor/OptimizationPasses/PruneParametersPass.cs b/Editor/OptimizationPasses/PruneParametersPass.cs index a38b3655..801fb3e9 100644 --- a/Editor/OptimizationPasses/PruneParametersPass.cs +++ b/Editor/OptimizationPasses/PruneParametersPass.cs @@ -9,6 +9,8 @@ internal class PruneParametersPass : Pass { protected override void Execute(ndmf.BuildContext context) { + if (!context.AvatarDescriptor) return; + var expParams = context.AvatarDescriptor.expressionParameters; if (expParams != null && context.IsTemporaryAsset(expParams)) { diff --git a/Editor/RenameParametersHook.cs b/Editor/RenameParametersHook.cs index 697633b7..c4ae0b75 100644 --- a/Editor/RenameParametersHook.cs +++ b/Editor/RenameParametersHook.cs @@ -183,6 +183,8 @@ private void SetExpressionParameters(GameObject avatarRoot, ImmutableDictionary< .ToImmutableDictionary(); var avatar = avatarRoot.GetComponent(); + if (!avatar) return; + var expParams = avatar.expressionParameters; if (expParams == null) From 588271cbd28c5200a491e67b317a9aa284f16094 Mon Sep 17 00:00:00 2001 From: kaikoga Date: Sun, 29 Sep 2024 18:22:52 +0900 Subject: [PATCH 7/7] fix JSON syntax --- Editor/nadena.dev.modular-avatar.core.editor.asmdef | 1 + 1 file changed, 1 insertion(+) diff --git a/Editor/nadena.dev.modular-avatar.core.editor.asmdef b/Editor/nadena.dev.modular-avatar.core.editor.asmdef index d87f0c4c..2f9da2ef 100644 --- a/Editor/nadena.dev.modular-avatar.core.editor.asmdef +++ b/Editor/nadena.dev.modular-avatar.core.editor.asmdef @@ -56,6 +56,7 @@ "expression": "", "define": "MA_VRM1" }, + { "name": "com.vrchat.avatars", "expression": "3.5.2", "define": "MA_VRCSDK3_AVATARS_3_5_2_OR_NEWER"