Add contextual function precision.

This commit is contained in:
2023-07-31 15:14:06 +08:00
parent b78e99c59c
commit 440581261e

View File

@@ -213,6 +213,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("precision"), new func_precision(() => ContextSelfValue));
_ctxops.Add(IdentifierManager.Shared.Request("interval"), new func_interval(() => ContextSelfValue));
_ctxops.Add(IdentifierManager.Shared.Request("circle"), new func_sphere(() => ContextSelfValue));
_ctxops.Add(IdentifierManager.Shared.Request("sphere"), new func_sphere(() => ContextSelfValue));
@@ -643,6 +645,28 @@ namespace Cryville.Crtr {
.SetNumber(CubicBezier.Evaluate(time, x1, y1, x2, y2, 1e-3f));
}
}
class func_precision : PdtOperator {
readonly Func<PropSrc> _ctxcb;
public func_precision(Func<PropSrc> ctxcb) : base(2) {
_ctxcb = ctxcb;
}
protected override unsafe void Execute() {
var ret = GetReturnFrame(PdtInternalType.Number, sizeof(float));
float v, p;
switch (LoadedOperandCount) {
case 1:
v = oputil.AsNumber(_ctxcb());
p = GetOperand(0).AsNumber(); break;
case 2:
v = GetOperand(0).AsNumber();
p = GetOperand(1).AsNumber(); break;
default: throw new ArgumentException("Argument count not 1 or 2");
}
double pp = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(p))) + 1);
double dp = pp * Math.Round(p / pp, 7);
ret.SetNumber((float)(Math.Round((double)v / dp) * dp));
}
}
#endregion
#region Area Functions
class func_interval : PdtOperator {