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("min"), new func_min(() => ContextSelfValue));
|
||||||
_ctxops.Add(IdentifierManager.SharedInstance.Request("max"), new func_max(() => 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("abs"), new func_abs(() => ContextSelfValue));
|
||||||
|
_ctxops.Add(IdentifierManager.SharedInstance.Request("anim"), new func_anim(() => ContextSelfValue));
|
||||||
|
|
||||||
Func<int, PropSrc> cccb = k => ContextCascadeLookup(k);
|
Func<int, PropSrc> cccb = k => ContextCascadeLookup(k);
|
||||||
_ctxops.Add(IdentifierManager.SharedInstance.Request("attack_timing"), new func_attack_timing(cccb));
|
_ctxops.Add(IdentifierManager.SharedInstance.Request("attack_timing"), new func_attack_timing(cccb));
|
||||||
@@ -490,6 +491,43 @@ namespace Cryville.Crtr {
|
|||||||
ret.SetNumber(Mathf.Abs(arg));
|
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
|
#endregion
|
||||||
#region Judge Functions
|
#region Judge Functions
|
||||||
static readonly int _var_fn = IdentifierManager.SharedInstance.Request("fn");
|
static readonly int _var_fn = IdentifierManager.SharedInstance.Request("fn");
|
||||||
|
|||||||
Reference in New Issue
Block a user