fix: unused/hidden subparameters are retained and break builds (#914)

This commit is contained in:
bd_ 2024-07-06 21:34:15 -07:00 committed by GitHub
parent f3168253f6
commit 746a72f60b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 1148 additions and 8 deletions

View File

@ -1,5 +1,6 @@
#if MA_VRCSDK3_AVATARS
using System.Linq;
using nadena.dev.modular_avatar.core.menu;
using UnityEngine;
using VRC.SDK3.Avatars.ScriptableObjects;
@ -56,6 +57,8 @@ namespace nadena.dev.modular_avatar.core
cloned.subMenu = null;
cloned.name = gameObject.name;
FilterSubParameters(cloned);
if (cloned.type == VRCExpressionsMenu.Control.ControlType.SubMenu)
{
switch (this.MenuSource)
@ -77,6 +80,32 @@ namespace nadena.dev.modular_avatar.core
context.PushControl(cloned);
}
private void FilterSubParameters(VirtualControl control)
{
var maxSubParams = 0;
switch (control.type)
{
case VRCExpressionsMenu.Control.ControlType.Toggle:
case VRCExpressionsMenu.Control.ControlType.Button:
case VRCExpressionsMenu.Control.ControlType.SubMenu:
default:
maxSubParams = 0;
break;
case VRCExpressionsMenu.Control.ControlType.RadialPuppet:
maxSubParams = 1;
break;
case VRCExpressionsMenu.Control.ControlType.TwoAxisPuppet:
maxSubParams = 2;
break;
case VRCExpressionsMenu.Control.ControlType.FourAxisPuppet:
maxSubParams = 4;
break;
}
if (control.subParameters.Length > maxSubParams)
control.subParameters = control.subParameters.Take(maxSubParams).ToArray();
}
}
}

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -0,0 +1,15 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -1506855854, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name: VRCExpressionParameters
m_EditorClassIdentifier:
parameters: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ed707d3612602d44db77511dae4096d6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,15 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -340790334, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name: VRCExpressionsMenu
m_EditorClassIdentifier:
controls: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 233f883cffa916b4aa2bf329f41e65ac
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -670,6 +670,34 @@ namespace modular_avatar_tests.VirtualMenuTests
.SubmenuNode.Controls[0].parameter.name);
}
[Test]
public void UnusedSubParametersAreStripped()
{
var root = CreatePrefab("UnusedSubParametersAreStripped.prefab");
BuildContext buildContext = new BuildContext(root.GetComponent<VRCAvatarDescriptor>());
new RenameParametersHook().OnPreprocessAvatar(root, buildContext);
var virtualMenu = VirtualMenu.ForAvatar(root.GetComponent<VRCAvatarDescriptor>(), buildContext);
// Button
Assert.AreEqual(0, virtualMenu.RootMenuNode.Controls[0].SubmenuNode.Controls[0].subParameters.Length);
// Toggle
Assert.AreEqual(0, virtualMenu.RootMenuNode.Controls[0].SubmenuNode.Controls[1].subParameters.Length);
// SubMenu
Assert.AreEqual(0, virtualMenu.RootMenuNode.Controls[0].SubmenuNode.Controls[2].subParameters.Length);
// Two Axis
Assert.AreEqual(2, virtualMenu.RootMenuNode.Controls[0].SubmenuNode.Controls[3].subParameters.Length);
// Radial
Assert.AreEqual(1, virtualMenu.RootMenuNode.Controls[0].SubmenuNode.Controls[4].subParameters.Length);
// Four Axis
Assert.AreEqual(4, virtualMenu.RootMenuNode.Controls[0].SubmenuNode.Controls[5].subParameters.Length);
}
ModularAvatarMenuInstaller CreateInstaller(string name)
{
GameObject obj = new GameObject();
@ -688,6 +716,7 @@ namespace modular_avatar_tests.VirtualMenuTests
var control = GenerateTestControl();
control.type = VRCExpressionsMenu.Control.ControlType.SubMenu;
control.subMenu = menu;
control.subParameters = Array.Empty<VRCExpressionsMenu.Control.Parameter>();
return control;
}
@ -719,13 +748,23 @@ namespace modular_avatar_tests.VirtualMenuTests
icon = testTex
}
};
control.subParameters = new[]
if (control.type == VRCExpressionsMenu.Control.ControlType.RadialPuppet
|| control.type == VRCExpressionsMenu.Control.ControlType.FourAxisPuppet
|| control.type == VRCExpressionsMenu.Control.ControlType.TwoAxisPuppet)
{
new VRCExpressionsMenu.Control.Parameter()
control.subParameters = new[]
{
name = "Test Sub Parameter " + GUID.Generate()
}
};
new VRCExpressionsMenu.Control.Parameter()
{
name = "Test Sub Parameter " + GUID.Generate()
}
};
} else
{
control.subParameters = Array.Empty<VRCExpressionsMenu.Control.Parameter>();
}
control.value = 0.42f;
control.style = VRCExpressionsMenu.Control.Style.Style3;
@ -742,9 +781,22 @@ namespace modular_avatar_tests.VirtualMenuTests
Assert.AreEqual(expected.labels.Length, actual.labels.Length);
Assert.AreEqual(expected.labels[0].name, actual.labels[0].name);
Assert.AreEqual(expected.labels[0].icon, actual.labels[0].icon);
Assert.AreEqual(expected.subParameters.Length, actual.subParameters.Length);
Assert.AreEqual(expected.subParameters[0].name, actual.subParameters[0].name);
Assert.AreNotSame(expected.subParameters[0], actual.subParameters[0]);
switch (expected.type)
{
case VRCExpressionsMenu.Control.ControlType.Button:
case VRCExpressionsMenu.Control.ControlType.Toggle:
case VRCExpressionsMenu.Control.ControlType.SubMenu:
Assert.AreEqual(0, actual.subParameters.Length);
break;
default:
{
Assert.AreEqual(expected.subParameters.Length, actual.subParameters.Length);
Assert.AreEqual(expected.subParameters[0].name, actual.subParameters[0].name);
Assert.AreNotSame(expected.subParameters[0], actual.subParameters[0]);
break;
}
}
Assert.AreEqual(expected.value, actual.value);
Assert.AreEqual(expected.style, actual.style);
}