Add contextual function anim
.
This commit is contained in:
@@ -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");
|
||||
|
Reference in New Issue
Block a user