Add contextual function anim.

This commit is contained in:
2023-02-27 00:11:37 +08:00
parent 28d46dbabe
commit 2ac7f05316

View File

@@ -151,6 +151,7 @@ namespace Cryville.Crtr {
_ctxops.Add(IdentifierManager.SharedInstance.Request("min"), new func_min(() => ContextSelfValue));
_ctxops.Add(IdentifierManager.SharedInstance.Request("max"), new func_max(() => ContextSelfValue));
_ctxops.Add(IdentifierManager.SharedInstance.Request("abs"), new func_abs(() => ContextSelfValue));
_ctxops.Add(IdentifierManager.SharedInstance.Request("anim"), new func_anim(() => ContextSelfValue));
Func<int, PropSrc> cccb = k => ContextCascadeLookup(k);
_ctxops.Add(IdentifierManager.SharedInstance.Request("attack_timing"), new func_attack_timing(cccb));
@@ -490,6 +491,43 @@ namespace Cryville.Crtr {
ret.SetNumber(Mathf.Abs(arg));
}
}
class func_anim : PdtOperator {
readonly Func<PropSrc> _ctxcb;
public func_anim(Func<PropSrc> ctxcb) : base(2) {
_ctxcb = ctxcb;
}
protected override unsafe void Execute() {
var op1 = GetOperand(0);
var op2 = GetOperand(1);
var dim1 = GetDimension(op1);
var dim2 = GetDimension(op2);
var dim0 = Math.Min(dim1, dim2);
var time = oputil.AsNumber(_ctxcb());
if (dim0 == 1) {
GetReturnFrame(PdtInternalType.Number, sizeof(float))
.SetNumber(op1.AsNumber() * (1 - time) + op2.AsNumber() * time);
}
else {
var ret = GetReturnFrame(PdtInternalType.Vector, dim0 * sizeof(float) + sizeof(int));
for (int i = 0; i < dim0; i++) {
ret.SetNumber(op1.AsNumber(i) * (1 - time) + op2.AsNumber(i) * time, i);
}
ret.SetArraySuffix(PdtInternalType.Number);
}
}
static int GetDimension(PdtVariableMemory op) {
switch (op.Type) {
case PdtInternalType.Number: return 1;
case PdtInternalType.Vector:
int arrtype, pc;
op.GetArraySuffix(out arrtype, out pc);
if (arrtype != PdtInternalType.Number)
throw new ArgumentException("Not animatable");
return pc;
default: throw new ArgumentException("Not animatable");
}
}
}
#endregion
#region Judge Functions
static readonly int _var_fn = IdentifierManager.SharedInstance.Request("fn");