fix: incorrect auto parameter assignment when a non-auto item is set to 0

This commit is contained in:
bd_ 2024-09-22 17:51:58 -07:00
parent 54288ebd44
commit 1e15fc2a6f
2 changed files with 27 additions and 8 deletions

View File

@ -87,14 +87,15 @@ namespace nadena.dev.modular_avatar.core.editor
foreach (var (paramName, list) in _mamiByParam) foreach (var (paramName, list) in _mamiByParam)
{ {
// Assign automatic values first // Assign automatic values first
float defaultValue; int? defaultValue = null;
if (declaredParams.TryGetValue(paramName, out var p)) if (declaredParams.TryGetValue(paramName, out var p))
{ {
defaultValue = p.defaultValue; defaultValue = (int) p.defaultValue;
} }
else else
{ {
defaultValue = list.FirstOrDefault(m => m.isDefault && !m.automaticValue)?.Control?.value ?? 0; var floatDefault = list.FirstOrDefault(m => m.isDefault && !m.automaticValue)?.Control?.value;
if (floatDefault.HasValue) defaultValue = (int) floatDefault.Value;
if (list.Count == 1 && list[0].isDefault && list[0].automaticValue) if (list.Count == 1 && list[0].isDefault && list[0].automaticValue)
// If we have only a single entry, it's probably an on-off toggle, so we'll implicitly let 1 // If we have only a single entry, it's probably an on-off toggle, so we'll implicitly let 1
@ -103,7 +104,7 @@ namespace nadena.dev.modular_avatar.core.editor
} }
HashSet<int> usedValues = new(); HashSet<int> usedValues = new();
usedValues.Add((int)defaultValue); if (defaultValue.HasValue) usedValues.Add(defaultValue.Value);
foreach (var item in list) foreach (var item in list)
{ {
@ -113,6 +114,19 @@ namespace nadena.dev.modular_avatar.core.editor
} }
} }
if (!defaultValue.HasValue)
{
for (int i = 0; i < 256; i++)
{
if (!usedValues.Contains(i))
{
defaultValue = i;
usedValues.Add(i);
break;
}
}
}
var nextValue = 1; var nextValue = 1;
var valueType = VRCExpressionParameters.ValueType.Bool; var valueType = VRCExpressionParameters.ValueType.Bool;
@ -125,7 +139,7 @@ namespace nadena.dev.modular_avatar.core.editor
{ {
if (mami.isDefault) if (mami.isDefault)
{ {
mami.Control.value = defaultValue; mami.Control.value = defaultValue.GetValueOrDefault();
} }
else else
{ {
@ -153,7 +167,7 @@ namespace nadena.dev.modular_avatar.core.editor
name = paramName, name = paramName,
valueType = valueType, valueType = valueType,
saved = isSaved, saved = isSaved,
defaultValue = defaultValue, defaultValue = defaultValue.GetValueOrDefault(),
networkSynced = isSynced networkSynced = isSynced
}; };
newParameters[paramName] = newParam; newParameters[paramName] = newParam;

View File

@ -48,13 +48,18 @@ namespace UnitTests.ReactiveComponent.ParameterAssignment
{ {
TestAssignments(new[] { (false, 2.0f), (true, 0.0f), (true, 0.0f) }, new[] { 2.0f, 1.0f, 3.0f }, null); TestAssignments(new[] { (false, 2.0f), (true, 0.0f), (true, 0.0f) }, new[] { 2.0f, 1.0f, 3.0f }, null);
TestAssignments(new[] { (false, 2.7f), (true, 0.0f), (true, 0.0f) }, new[] { 2.7f, 1.0f, 3.0f }, null); TestAssignments(new[] { (false, 2.7f), (true, 0.0f), (true, 0.0f) }, new[] { 2.7f, 1.0f, 3.0f }, null);
TestAssignments(new[] { (true, 1.0f), (false, 0.0f) }, new[] { 2.0f, 0.0f }, null, overrideExpectedDefaultValue: 1.0f);
TestAssignments(new[] { (true, 1.0f), (false, 0.0f) }, new[] { 1.0f, 0.0f }, 0);
TestAssignments(new[] { (true, 1.0f), (false, 0.0f) }, new[] { 1.0f, 0.0f }, 1);
} }
void TestAssignments( void TestAssignments(
(bool, float)[] assignments, (bool, float)[] assignments,
float[] expectedAssignments, float[] expectedAssignments,
int? defaultIndex = null, int? defaultIndex = null,
Action<List<ModularAvatarMenuItem>> customize = null Action<List<ModularAvatarMenuItem>> customize = null,
float? overrideExpectedDefaultValue = null
) )
{ {
var root = CreateRoot("root"); var root = CreateRoot("root");
@ -103,7 +108,7 @@ namespace UnitTests.ReactiveComponent.ParameterAssignment
Assert.AreEqual(expected, mami.Control.value); Assert.AreEqual(expected, mami.Control.value);
} }
var expectedDefaultValue = defaultIndex.HasValue ? expectedAssignments[defaultIndex.Value] : 0; var expectedDefaultValue = overrideExpectedDefaultValue ?? (defaultIndex.HasValue ? expectedAssignments[defaultIndex.Value] : 0);
Assert.AreEqual(expectedDefaultValue, avDesc.expressionParameters.parameters.Single().defaultValue); Assert.AreEqual(expectedDefaultValue, avDesc.expressionParameters.parameters.Single().defaultValue);
} }
} }