From c41d41c8812cc88e1d2137660027c03a4fcf29fb Mon Sep 17 00:00:00 2001 From: PopSlime Date: Fri, 12 May 2023 11:37:14 +0800 Subject: [PATCH] Make the function `interval` contextual and linear. --- Assets/Cryville/Crtr/PdtEvaluator.cs | 39 ++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/Assets/Cryville/Crtr/PdtEvaluator.cs b/Assets/Cryville/Crtr/PdtEvaluator.cs index a221f0d..a86ca71 100644 --- a/Assets/Cryville/Crtr/PdtEvaluator.cs +++ b/Assets/Cryville/Crtr/PdtEvaluator.cs @@ -176,7 +176,6 @@ namespace Cryville.Crtr { _shortops.Add(new PdtOperatorSignature("frame_seq", 3), new func_frame_seq()); _shortops.Add(new PdtOperatorSignature("in_area", 1), new func_in_area()); - _shortops.Add(new PdtOperatorSignature("interval", 3), new func_interval()); _shortops.Add(new PdtOperatorSignature("is", 2), new func_is()); _ctxops.Add(IdentifierManager.Shared.Request("screen_edge"), new func_screen_edge(() => ContextTransform)); @@ -192,6 +191,8 @@ namespace Cryville.Crtr { _ctxops.Add(IdentifierManager.Shared.Request("ease_out"), new func_cubic_bezier_fixed(0f, 0f, 0.58f, 1f, () => ContextSelfValue)); _ctxops.Add(IdentifierManager.Shared.Request("ease_in_out"), new func_cubic_bezier_fixed(0.42f, 0f, 0.58f, 1f, () => ContextSelfValue)); + _ctxops.Add(IdentifierManager.Shared.Request("interval"), new func_interval(() => ContextSelfValue)); + Func cccb = k => ContextCascadeLookup(k); _ctxops.Add(IdentifierManager.Shared.Request("attack_timing"), new func_attack_timing(cccb)); _ctxops.Add(IdentifierManager.Shared.Request("enter_timing"), new func_enter_timing(cccb)); @@ -377,16 +378,6 @@ namespace Cryville.Crtr { hit.CopyTo(ret); } } - class func_interval : PdtOperator { - public func_interval() : base(3) { } - protected override unsafe void Execute() { - var value = GetOperand(0).AsNumber(); - var min = GetOperand(1).AsNumber(); - var max = GetOperand(2).AsNumber(); - var ret = GetReturnFrame(PdtInternalType.Number, sizeof(float)); - ret.SetNumber((value - min) * (max - value)); - } - } class func_is : PdtOperator { public func_is() : base(2) { } protected override unsafe void Execute() { @@ -619,6 +610,32 @@ namespace Cryville.Crtr { } } #endregion + #region Area Functions + class func_interval : PdtOperator { + readonly Func _ctxcb; + public func_interval(Func ctxcb) : base(3) { _ctxcb = ctxcb; } + protected override unsafe void Execute() { + float min, value, max; + switch (LoadedOperandCount) { + case 2: + value = oputil.AsNumber(_ctxcb()); + min = GetOperand(0).AsNumber(); + max = GetOperand(1).AsNumber(); + break; + case 3: + value = GetOperand(0).AsNumber(); + min = GetOperand(1).AsNumber(); + max = GetOperand(2).AsNumber(); + break; + default: throw new ArgumentException("Argument count not 2 or 3"); + } + float center = (max + min) / 2; + float extent = (max - min) / 2; + var ret = GetReturnFrame(PdtInternalType.Number, sizeof(float)); + ret.SetNumber(1 - Math.Abs(value - center) / extent); + } + } + #endregion #region Judge Functions static readonly int _var_fn = IdentifierManager.Shared.Request("judge_clip_from"); static readonly int _var_tn = IdentifierManager.Shared.Request("judge_clip_to");