From 8b41ec953ef96d7193d05c70274f2ac9cb9287b3 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Fri, 16 Dec 2022 22:38:56 +0100 Subject: [PATCH] add AacFlParameter and AacFlNumericParameter in order to simplify the maintenance of extension methods --- Framework/Editor/V0/AacFlConditions.cs | 37 +++++- .../V0/Extensions/VRChat/VRChatExtensions.cs | 122 ++++++++++-------- ...sions.cs.meta => VRChatExtensions.cs.meta} | 2 +- 3 files changed, 100 insertions(+), 61 deletions(-) rename Framework/Editor/V0/Extensions/VRChat/{VrcStateExtensions.cs.meta => VRChatExtensions.cs.meta} (83%) diff --git a/Framework/Editor/V0/AacFlConditions.cs b/Framework/Editor/V0/AacFlConditions.cs index 9142514..c328fa8 100644 --- a/Framework/Editor/V0/AacFlConditions.cs +++ b/Framework/Editor/V0/AacFlConditions.cs @@ -49,15 +49,36 @@ namespace AnimatorAsCode.V0 } } - public class AacFlFloatParameter : AacFlParameter + public abstract class AacFlParameter : AacFlParameter + { + protected AacFlParameter(string name) : base(name) + { + } + + protected internal abstract float ValueToFloat(TParam value); + } + + public abstract class AacFlNumericParameter : AacFlParameter + { + protected AacFlNumericParameter(string name) : base(name) + { + } + } + + public class AacFlFloatParameter : AacFlNumericParameter { internal static AacFlFloatParameter Internally(string name) => new AacFlFloatParameter(name); protected AacFlFloatParameter(string name) : base(name) { } public IAacFlCondition IsGreaterThan(float other) => Just(condition => condition.Add(Name, Greater, other)); public IAacFlCondition IsLessThan(float other) => Just(condition => condition.Add(Name, Less, other)); + + protected internal override float ValueToFloat(float value) + { + return value; + } } - public class AacFlIntParameter : AacFlParameter + public class AacFlIntParameter : AacFlNumericParameter { internal static AacFlIntParameter Internally(string name) => new AacFlIntParameter(name); protected AacFlIntParameter(string name) : base(name) { } @@ -65,6 +86,11 @@ namespace AnimatorAsCode.V0 public IAacFlCondition IsLessThan(int other) => Just(condition => condition.Add(Name, Less, other)); public IAacFlCondition IsEqualTo(int other) => Just(condition => condition.Add(Name, AnimatorConditionMode.Equals, other)); public IAacFlCondition IsNotEqualTo(int other) => Just(condition => condition.Add(Name, NotEqual, other)); + + protected internal override float ValueToFloat(int value) + { + return value; + } } public class AacFlEnumIntParameter : AacFlIntParameter where TEnum : Enum @@ -78,7 +104,7 @@ namespace AnimatorAsCode.V0 public IAacFlCondition IsNotEqualTo(TEnum other) => IsNotEqualTo((int)(object)other); } - public class AacFlBoolParameter : AacFlParameter + public class AacFlBoolParameter : AacFlParameter { internal static AacFlBoolParameter Internally(string name) => new AacFlBoolParameter(name); protected AacFlBoolParameter(string name) : base(name) { } @@ -86,6 +112,11 @@ namespace AnimatorAsCode.V0 public IAacFlCondition IsFalse() => Just(condition => condition.Add(Name, IfNot, 0)); public IAacFlCondition IsEqualTo(bool other) => Just(condition => condition.Add(Name, other ? If : IfNot, 0)); public IAacFlCondition IsNotEqualTo(bool other) => Just(condition => condition.Add(Name, other ? IfNot : If, 0)); + + protected internal override float ValueToFloat(bool value) + { + return value ? 1f : 0f; + } } public class AacFlFloatParameterGroup diff --git a/Framework/Editor/V0/Extensions/VRChat/VRChatExtensions.cs b/Framework/Editor/V0/Extensions/VRChat/VRChatExtensions.cs index 3e9b018..ebda418 100644 --- a/Framework/Editor/V0/Extensions/VRChat/VRChatExtensions.cs +++ b/Framework/Editor/V0/Extensions/VRChat/VRChatExtensions.cs @@ -6,73 +6,54 @@ namespace AnimatorAsCode.V0.Extensions.VRChat { public static class VRChatExtensions { - public static TNode Drives(this TNode node,AacFlIntParameter parameter, int value) where TNode : AacAnimatorNode + /// + /// Set parameter to a given value. For unsynced parameters, also see DrivingLocally. + /// + public static TNode Drives(this TNode node, AacFlParameter parameter, TParam value) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter { type = VRC_AvatarParameterDriver.ChangeType.Set, - name = parameter.Name, value = value + name = parameter.Name, value = parameter.ValueToFloat(value) }); return node; } - public static TNode Drives(this TNode node,AacFlFloatParameter parameter, float value) where TNode : AacAnimatorNode - { - var driver = node.EnsureBehaviour(); - driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter - { - type = VRC_AvatarParameterDriver.ChangeType.Set, - name = parameter.Name, value = value - }); - return node; - } - - public static TNode DrivingIncreases(this TNode node,AacFlFloatParameter parameter, float additiveValue) where TNode : AacAnimatorNode + /// + /// Set parameter by increasing its current value by additiveValue. + /// + public static TNode DrivingIncreases(this TNode node, AacFlParameter parameter, TParam additiveValue) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter { type = VRC_AvatarParameterDriver.ChangeType.Add, - name = parameter.Name, value = additiveValue + name = parameter.Name, value = parameter.ValueToFloat(additiveValue) }); return node; } - public static TNode DrivingDecreases(this TNode node,AacFlFloatParameter parameter, float positiveValueToDecreaseBy) where TNode : AacAnimatorNode + /// + /// Set parameter by decreasing its current value by positiveValueToDecreaseBy. + /// + public static TNode DrivingDecreases(this TNode node, AacFlParameter parameter, TParam positiveValueToDecreaseBy) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter { type = VRC_AvatarParameterDriver.ChangeType.Add, - name = parameter.Name, value = -positiveValueToDecreaseBy - }); - return node; - } - - public static TNode DrivingIncreases(this TNode node,AacFlIntParameter parameter, int additiveValue) where TNode : AacAnimatorNode - { - var driver = node.EnsureBehaviour(); - driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter - { - type = VRC_AvatarParameterDriver.ChangeType.Add, - name = parameter.Name, value = additiveValue - }); - return node; - } - - public static TNode DrivingDecreases(this TNode node,AacFlIntParameter parameter, int positiveValueToDecreaseBy) where TNode : AacAnimatorNode - { - var driver = node.EnsureBehaviour(); - driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter - { - type = VRC_AvatarParameterDriver.ChangeType.Add, - name = parameter.Name, value = -positiveValueToDecreaseBy + name = parameter.Name, + value = parameter.ValueToFloat(positiveValueToDecreaseBy) * -1 }); return node; } - public static TNode DrivingRemaps(this TNode node, AacFlParameter sourceParameter, float sourceMin, float sourceMax, AacFlParameter destParameter, float destMin, float destMax) where TNode : AacAnimatorNode + /// + /// Copies sourceParameter to destParameter with the given custom ranges. + /// https://docs.vrchat.com/docs/state-behaviors#copy + /// + public static TNode DrivingRemaps(this TNode node, AacFlParameter sourceParameter, TSource sourceMin, TSource sourceMax, AacFlParameter destParameter, TDest destMin, TDest destMax) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); driver.EnsureParameter(new VRC_AvatarParameterDriver.Parameter @@ -81,15 +62,19 @@ namespace AnimatorAsCode.V0.Extensions.VRChat type = VRC_AvatarParameterDriver.ChangeType.Copy, source = sourceParameter.Name, convertRange = true, - sourceMin = sourceMin, - sourceMax = sourceMax, - destMin = destMin, - destMax = destMax + sourceMin = sourceParameter.ValueToFloat(sourceMin), + sourceMax = sourceParameter.ValueToFloat(sourceMax), + destMin = destParameter.ValueToFloat(destMin), + destMax = destParameter.ValueToFloat(destMax) }); return node; } - public static TNode DrivingCopies(this TNode node, AacFlParameter sourceParameter, AacFlParameter destParameter) where TNode : AacAnimatorNode + /// + /// Copies sourceParameter to destParameter with no custom ranges. + /// https://docs.vrchat.com/docs/state-behaviors#copy + /// + public static TNode DrivingCopies(this TNode node, AacFlParameter sourceParameter, AacFlParameter destParameter) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); driver.EnsureParameter(new VRC_AvatarParameterDriver.Parameter @@ -101,19 +86,29 @@ namespace AnimatorAsCode.V0.Extensions.VRChat return node; } - public static TNode DrivingRandomizesLocally(this TNode node,AacFlFloatParameter parameter, float min, float max) where TNode : AacAnimatorNode + /// + /// Sets parameter to a random value between min and max. + /// This is only ran for the person wearing the avatar, and usually needs to be backed by a synced variable. + /// https://docs.vrchat.com/docs/state-behaviors#random + /// + public static TNode DrivingRandomizesLocally(this TNode node, AacFlNumericParameter parameter, TParam min, TParam max) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter { type = VRC_AvatarParameterDriver.ChangeType.Random, - name = parameter.Name, valueMin = min, valueMax = max + name = parameter.Name, valueMin = parameter.ValueToFloat(min), valueMax = parameter.ValueToFloat(max) }); driver.localOnly = true; return node; } - public static TNode DrivingRandomizesLocally(this TNode node,AacFlBoolParameter parameter, float chance) where TNode : AacAnimatorNode + /// + /// Sets parameter to either true or false, with the given chance. + /// This is only ran for the person wearing the avatar, and usually needs to be backed by a synced variable. + /// https://docs.vrchat.com/docs/state-behaviors#random + /// + public static TNode DrivingRandomizesLocally(this TNode node, AacFlBoolParameter parameter, float chance) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter @@ -124,25 +119,35 @@ namespace AnimatorAsCode.V0.Extensions.VRChat driver.localOnly = true; return node; } - - public static TNode DrivingRandomizesLocally(this TNode node,AacFlIntParameter parameter, int min, int max) where TNode : AacAnimatorNode + + /// + /// Sets parameter to a random value between min and max. + /// For use with unsynced parameters. Warning: The resulting value will be different for everyone seeing your avatar. + /// https://docs.vrchat.com/docs/state-behaviors#random + /// + public static TNode DrivingRandomizesUnsynced(this TNode node, AacFlNumericParameter parameter, TParam min, TParam max) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter { type = VRC_AvatarParameterDriver.ChangeType.Random, - name = parameter.Name, valueMin = min, valueMax = max + name = parameter.Name, valueMin = parameter.ValueToFloat(min), valueMax = parameter.ValueToFloat(max) }); - driver.localOnly = true; return node; } - public static TNode Drives(this TNode node,AacFlBoolParameter parameter, bool value) where TNode : AacAnimatorNode + /// + /// Sets parameter to either true or false, with the given chance. + /// For use with unsynced parameters. Warning: The resulting value will be different for everyone seeing your avatar. + /// https://docs.vrchat.com/docs/state-behaviors#random + /// + public static TNode DrivingRandomizesUnsynced(this TNode node, AacFlBoolParameter parameter, float chance) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); driver.parameters.Add(new VRC_AvatarParameterDriver.Parameter { - name = parameter.Name, value = value ? 1 : 0 + type = VRC_AvatarParameterDriver.ChangeType.Random, + name = parameter.Name, chance = chance }); return node; } @@ -159,11 +164,14 @@ namespace AnimatorAsCode.V0.Extensions.VRChat } return node; } - - public static TNode DrivingLocally(this TNode node, bool wantLocal = true) where TNode : AacAnimatorNode + + /// + /// Only set this parameter for the person wearing the avatar (recommended for synced parameters). + /// + public static TNode DrivingLocally(this TNode node) where TNode : AacAnimatorNode { var driver = node.EnsureBehaviour(); - driver.localOnly = wantLocal; + driver.localOnly = true; return node; } diff --git a/Framework/Editor/V0/Extensions/VRChat/VrcStateExtensions.cs.meta b/Framework/Editor/V0/Extensions/VRChat/VRChatExtensions.cs.meta similarity index 83% rename from Framework/Editor/V0/Extensions/VRChat/VrcStateExtensions.cs.meta rename to Framework/Editor/V0/Extensions/VRChat/VRChatExtensions.cs.meta index 9d37e82..f04db29 100644 --- a/Framework/Editor/V0/Extensions/VRChat/VrcStateExtensions.cs.meta +++ b/Framework/Editor/V0/Extensions/VRChat/VRChatExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 15c8f3e3d106998769a5066411470ac1 +guid: bf8bc1a5fededc2d9a9ced46f1eb94f9 MonoImporter: externalObjects: {} serializedVersion: 2