fix: untranslated warning generated when multiple parameters remap to the same name (#698)

* fix: untranslated warning generated when multiple parameters remap to the same name

Fixed by allowing this case and applying normal parameter type resolution rules.

Closes: #694

* chore: enable accidentally disabled unit test
This commit is contained in:
bd_ 2024-02-26 01:20:35 -08:00 committed by GitHub
parent 2f67b9509b
commit 8c435874ac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 84 additions and 8 deletions

View File

@ -609,7 +609,7 @@ namespace nadena.dev.modular_avatar.core.editor
ref ImmutableDictionary<string, string> prefixRemaps ref ImmutableDictionary<string, string> prefixRemaps
) )
{ {
ImmutableDictionary<string, ParameterInfo> rv = ImmutableDictionary<string, ParameterInfo>.Empty; ImmutableDictionary<string, ParameterInfo> parameterInfos = ImmutableDictionary<string, ParameterInfo>.Empty;
foreach (var param in p.parameters) foreach (var param in p.parameters)
{ {
@ -656,11 +656,6 @@ namespace nadena.dev.modular_avatar.core.editor
if (!param.isPrefix) if (!param.isPrefix)
{ {
if (rv.ContainsKey(remapTo))
{
BuildReport.Log(ErrorSeverity.NonFatal, "error.rename_params.duplicate_parameter", param.nameOrPrefix);
}
ParameterConfig parameterConfig = param; ParameterConfig parameterConfig = param;
parameterConfig.nameOrPrefix = remapTo; parameterConfig.nameOrPrefix = remapTo;
parameterConfig.remapTo = null; parameterConfig.remapTo = null;
@ -679,11 +674,18 @@ namespace nadena.dev.modular_avatar.core.editor
info.DefaultSources.Add(p); info.DefaultSources.Add(p);
} }
rv = rv.SetItem(remapTo, info); if (parameterInfos.TryGetValue(remapTo, out var existing))
{
existing.MergeSibling(info);
}
else
{
parameterInfos = parameterInfos.SetItem(remapTo, info);
}
} }
} }
return rv; return parameterInfos;
} }
// This is generic to simplify remapping parameter driver fields, some of which are 'object's. // This is generic to simplify remapping parameter driver fields, some of which are 'object's.

View File

@ -6,12 +6,14 @@ using System.Collections.Immutable;
using System.Linq; using System.Linq;
using nadena.dev.modular_avatar.core; using nadena.dev.modular_avatar.core;
using nadena.dev.modular_avatar.core.editor; using nadena.dev.modular_avatar.core.editor;
using nadena.dev.modular_avatar.editor.ErrorReporting;
using nadena.dev.ndmf; using nadena.dev.ndmf;
using NUnit.Framework; using NUnit.Framework;
using UnityEditor.Animations; using UnityEditor.Animations;
using UnityEngine; using UnityEngine;
using VRC.SDK3.Avatars.Components; using VRC.SDK3.Avatars.Components;
using VRC.SDK3.Avatars.ScriptableObjects; using VRC.SDK3.Avatars.ScriptableObjects;
using VRC.SDK3.Dynamics.Contact.Components;
using AvatarProcessor = nadena.dev.modular_avatar.core.editor.AvatarProcessor; using AvatarProcessor = nadena.dev.modular_avatar.core.editor.AvatarProcessor;
namespace modular_avatar_tests.RenameParametersTests namespace modular_avatar_tests.RenameParametersTests
@ -158,6 +160,7 @@ namespace modular_avatar_tests.RenameParametersTests
} }
} }
[Test]
public void SavedParameterResolution() public void SavedParameterResolution()
{ {
var prefab = CreatePrefab("SavedParamResolution.prefab"); var prefab = CreatePrefab("SavedParamResolution.prefab");
@ -175,6 +178,77 @@ namespace modular_avatar_tests.RenameParametersTests
Assert.IsFalse(expParams["e"].saved); Assert.IsFalse(expParams["e"].saved);
Assert.IsTrue(expParams["f"].saved); Assert.IsTrue(expParams["f"].saved);
} }
[Test]
public void TestMultipleRemappings()
{
var av = CreateRoot("avatar");
var parameters = av.AddComponent<ModularAvatarParameters>();
parameters.parameters = new List<ParameterConfig>()
{
new ParameterConfig()
{
nameOrPrefix = "a",
remapTo = "z",
syncType = ParameterSyncType.Float
},
new ParameterConfig()
{
nameOrPrefix = "b",
remapTo = "z",
syncType = ParameterSyncType.Float
},
};
var c1 = av.AddComponent<VRCContactReceiver>();
c1.parameter = "a";
var c2 = av.AddComponent<VRCContactReceiver>();
c2.parameter = "a";
var context = CreateContext(av);
var maContext = context.ActivateExtensionContext<ModularAvatarContext>().BuildContext;
var errors = ErrorReport.CaptureErrors(() => new RenameParametersHook().OnPreprocessAvatar(av, maContext));
Assert.IsEmpty(errors);
Assert.AreEqual("z", c1.parameter);
Assert.AreEqual("z", c2.parameter);
}
[Test]
public void TestMultipleRemappings_WithConflict()
{
var av = CreateRoot("avatar");
var parameters = av.AddComponent<ModularAvatarParameters>();
parameters.parameters = new List<ParameterConfig>()
{
new ParameterConfig()
{
nameOrPrefix = "a",
remapTo = "z",
syncType = ParameterSyncType.Float
},
new ParameterConfig()
{
nameOrPrefix = "b",
remapTo = "z",
syncType = ParameterSyncType.Int
},
};
var context = CreateContext(av);
var maContext = context.ActivateExtensionContext<ModularAvatarContext>().BuildContext;
var errors = ErrorReport.CaptureErrors(() => new RenameParametersHook().OnPreprocessAvatar(av, maContext));
Assert.IsNotEmpty(errors);
}
} }
} }