better param merger

This commit is contained in:
Lillith Rose 2026-01-07 18:52:55 -05:00
parent b475edd583
commit 54c79328f6
13 changed files with 233 additions and 0 deletions

8
BetterParamMerger.meta Normal file
View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 917617695c0f94e469af3fcfb5755f3d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: add4c1d2bfc13434eb90de2d72e1b0a4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -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();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2164453d75bb637449b08caccd62991e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -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
}

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ad9a12eb44c834641a47b41e7bd0d17d
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -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<BetterParamMergerPlugin>
{
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<BetterParamMergerConfig>(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<VRCExpressionParameters>();
var paramList = new List<VRCExpressionParameters.Parameter>();
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;
});
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1520255993057634180ba08b172d3547
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ba35c9429c286124185d3bcad6d24ec7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -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<VRCExpressionParameters> parameterAssets = new List<VRCExpressionParameters>();
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 592d18cd1923357478b77252c450ded9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,4 @@
{
"name": "BetterParamMergerRuntimeAsmdef"
}

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 901acb251964b054b93b9c13e801eabd
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: