diff --git a/BetterParamMerger.meta b/BetterParamMerger.meta new file mode 100644 index 0000000..0af7fb8 --- /dev/null +++ b/BetterParamMerger.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 917617695c0f94e469af3fcfb5755f3d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BetterParamMerger/Editor.meta b/BetterParamMerger/Editor.meta new file mode 100644 index 0000000..21686ba --- /dev/null +++ b/BetterParamMerger/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: add4c1d2bfc13434eb90de2d72e1b0a4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BetterParamMerger/Editor/BetterParamMergerConfigEditor.cs b/BetterParamMerger/Editor/BetterParamMergerConfigEditor.cs new file mode 100644 index 0000000..fa77976 --- /dev/null +++ b/BetterParamMerger/Editor/BetterParamMergerConfigEditor.cs @@ -0,0 +1,19 @@ +using UnityEditor; +using UnityEngine; +using gay.lilyy.BetterParamMerger; + +namespace gay.lilyy.BetterParamMerger +{ + [CustomEditor(typeof(BetterParamMergerConfig))] + public class BetterParamMergerConfigEditor : Editor + { + public override void OnInspectorGUI() + { + EditorGUILayout.HelpBox("This merges parameters in the optimizing stage, making sure it runs after all other preprocessors", MessageType.Info); + EditorGUILayout.Space(); + + DrawDefaultInspector(); + } + } +} + diff --git a/BetterParamMerger/Editor/BetterParamMergerConfigEditor.cs.meta b/BetterParamMerger/Editor/BetterParamMergerConfigEditor.cs.meta new file mode 100644 index 0000000..ee10d2a --- /dev/null +++ b/BetterParamMerger/Editor/BetterParamMergerConfigEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2164453d75bb637449b08caccd62991e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BetterParamMerger/Editor/BetterParamMergerEditorAsmdef.asmdef b/BetterParamMerger/Editor/BetterParamMergerEditorAsmdef.asmdef new file mode 100644 index 0000000..6b3d0c1 --- /dev/null +++ b/BetterParamMerger/Editor/BetterParamMergerEditorAsmdef.asmdef @@ -0,0 +1,22 @@ +{ + "name": "BetterParamMergerEditorAsmdef", + "rootNamespace": "", + "references": [ + "GUID:62ced99b048af7f4d8dfe4bed8373d76", + "GUID:5718fb738711cd34ea54e9553040911d", + "GUID:901e56b065a857d4483a77f8cae73588", + "GUID:209cbd2a789c4f72963fdbf1f8a01909", + "GUID:901acb251964b054b93b9c13e801eabd" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/BetterParamMerger/Editor/BetterParamMergerEditorAsmdef.asmdef.meta b/BetterParamMerger/Editor/BetterParamMergerEditorAsmdef.asmdef.meta new file mode 100644 index 0000000..40f12a6 --- /dev/null +++ b/BetterParamMerger/Editor/BetterParamMergerEditorAsmdef.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ad9a12eb44c834641a47b41e7bd0d17d +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BetterParamMerger/Editor/BetterParamMergerPlugin.cs b/BetterParamMerger/Editor/BetterParamMergerPlugin.cs new file mode 100644 index 0000000..e01b3a6 --- /dev/null +++ b/BetterParamMerger/Editor/BetterParamMergerPlugin.cs @@ -0,0 +1,104 @@ +using System.Collections.Generic; +using System.Linq; +using gay.lilyy.Common; +using gay.lilyy.BetterParamMerger; +using nadena.dev.ndmf; +using nadena.dev.ndmf.vrchat; +using UnityEngine; +using VRC.SDK3.Avatars.ScriptableObjects; + +[assembly: ExportsPlugin(typeof(BetterParamMergerPlugin))] + +namespace gay.lilyy.BetterParamMerger +{ + public class BetterParamMergerPlugin : Plugin + { + public override string DisplayName => "Better Param Merger"; + public override string QualifiedName => "gay.lilyy.BetterParamMerger"; + + protected override void Configure() + { + InPhase(BuildPhase.Optimizing).Run("MergeParameters", ctx => + { + var configs = ctx.AvatarRootObject.GetComponentsInChildren(true); + if (configs == null || configs.Length == 0) + return; + + var descriptor = ctx.VRChatAvatarDescriptor(); + if (descriptor.expressionParameters == null) + { + Debug.LogWarning($"[Better Param Merger] No expression parameters found on avatar {ctx.AvatarRootObject.name}"); + return; + } + + // Duplicate the parameters asset to avoid modifying the original + var originalParams = descriptor.expressionParameters; + var newParams = ScriptableObject.CreateInstance(); + var paramList = new List(); + if (originalParams.parameters != null) + { + paramList.AddRange(originalParams.parameters); + } + newParams.parameters = paramList.ToArray(); + + // Create a dictionary for quick lookup of existing parameters by name + var paramDict = paramList.ToDictionary(p => p.name, p => p); + + // Iterate over all config components + foreach (var config in configs) + { + if (config == null || config.parameterAssets == null) + continue; + + // Iterate over all VRCExpressionParameters assets in this config + foreach (var paramAsset in config.parameterAssets) + { + if (paramAsset == null || paramAsset.parameters == null) + continue; + + // Iterate over all parameters in this asset + foreach (var param in paramAsset.parameters) + { + if (string.IsNullOrEmpty(param.name)) + continue; + + if (paramDict.ContainsKey(param.name)) + { + // Parameter exists - update its settings + var existingParam = paramDict[param.name]; + existingParam.valueType = param.valueType; + existingParam.defaultValue = param.defaultValue; + existingParam.saved = param.saved; + existingParam.networkSynced = param.networkSynced; + } + else + { + // Parameter doesn't exist - add it + var newParam = new VRCExpressionParameters.Parameter + { + name = param.name, + valueType = param.valueType, + defaultValue = param.defaultValue, + saved = param.saved, + networkSynced = param.networkSynced + }; + paramList.Add(newParam); + paramDict[param.name] = newParam; + } + } + } + + // Destroy the config component after processing + Object.DestroyImmediate(config); + } + + // Update the parameters array from the list + newParams.parameters = paramList.ToArray(); + + // Assign the new parameters asset to the descriptor + descriptor.expressionParameters = newParams; + }); + } + } +} + diff --git a/BetterParamMerger/Editor/BetterParamMergerPlugin.cs.meta b/BetterParamMerger/Editor/BetterParamMergerPlugin.cs.meta new file mode 100644 index 0000000..755c5d8 --- /dev/null +++ b/BetterParamMerger/Editor/BetterParamMergerPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1520255993057634180ba08b172d3547 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BetterParamMerger/Runtime.meta b/BetterParamMerger/Runtime.meta new file mode 100644 index 0000000..c8ed780 --- /dev/null +++ b/BetterParamMerger/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ba35c9429c286124185d3bcad6d24ec7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BetterParamMerger/Runtime/BetterParamMergerConfig.cs b/BetterParamMerger/Runtime/BetterParamMergerConfig.cs new file mode 100644 index 0000000..15c6d45 --- /dev/null +++ b/BetterParamMerger/Runtime/BetterParamMergerConfig.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using UnityEngine; +using VRC.SDK3.Avatars.ScriptableObjects; + +namespace gay.lilyy.BetterParamMerger +{ + [AddComponentMenu("LillithRosePup/VRCExpressionParameters/Better Param Merger")] + public class BetterParamMergerConfig : MonoBehaviour, VRC.SDKBase.IEditorOnly + { + public List parameterAssets = new List(); + } +} + diff --git a/BetterParamMerger/Runtime/BetterParamMergerConfig.cs.meta b/BetterParamMerger/Runtime/BetterParamMergerConfig.cs.meta new file mode 100644 index 0000000..55e691a --- /dev/null +++ b/BetterParamMerger/Runtime/BetterParamMergerConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 592d18cd1923357478b77252c450ded9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BetterParamMerger/Runtime/BetterParamMergerRuntimeAsmdef.asmdef b/BetterParamMerger/Runtime/BetterParamMergerRuntimeAsmdef.asmdef new file mode 100644 index 0000000..702f468 --- /dev/null +++ b/BetterParamMerger/Runtime/BetterParamMergerRuntimeAsmdef.asmdef @@ -0,0 +1,4 @@ +{ + "name": "BetterParamMergerRuntimeAsmdef" +} + diff --git a/BetterParamMerger/Runtime/BetterParamMergerRuntimeAsmdef.asmdef.meta b/BetterParamMerger/Runtime/BetterParamMergerRuntimeAsmdef.asmdef.meta new file mode 100644 index 0000000..ea223b9 --- /dev/null +++ b/BetterParamMerger/Runtime/BetterParamMergerRuntimeAsmdef.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 901acb251964b054b93b9c13e801eabd +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: