Implement new transition.

This commit is contained in:
2023-04-20 00:18:49 +08:00
parent d2b71e41c9
commit 8670482c04
8 changed files with 175 additions and 28 deletions

View File

@@ -506,20 +506,23 @@ namespace Cryville.Crtr {
var dim1 = GetDimension(op1);
var dim2 = GetDimension(op2);
var dim0 = Math.Min(dim1, dim2);
float time;
Vector4 trans;
switch (LoadedOperandCount) {
case 2: time = oputil.AsNumber(_ctxcb()); break;
case 3: time = GetOperand(2).AsNumber(); break;
case 2:
var num = oputil.AsNumber(_ctxcb());
trans = new Vector4(num, num, num, num);
break;
case 3: trans = GetTransition(GetOperand(2)); break;
default: throw new ArgumentException("Argument count not 2 or 3");
}
if (dim0 == 1) {
GetReturnFrame(PdtInternalType.Number, sizeof(float))
.SetNumber(op1.AsNumber() * (1 - time) + op2.AsNumber() * time);
.SetNumber(op1.AsNumber() * (1 - trans.x) + op2.AsNumber() * trans.x);
}
else {
var ret = GetReturnFrame(PdtInternalType.Vector, dim0 * sizeof(float) + sizeof(int));
for (int i = 0; i < dim0 * sizeof(float); i += sizeof(float)) {
ret.SetNumber(op1.AsNumber(i) * (1 - time) + op2.AsNumber(i) * time, i);
ret.SetNumber(op1.AsNumber(i) * (1 - trans[i]) + op2.AsNumber(i) * trans[i], i);
}
ret.SetArraySuffix(PdtInternalType.Number);
}
@@ -536,6 +539,28 @@ namespace Cryville.Crtr {
default: throw new ArgumentException("Not animatable");
}
}
static Vector4 GetTransition(PdtVariableMemory op) {
switch (op.Type) {
case PdtInternalType.Number:
var num = op.AsNumber();
return new Vector4(num, num, num, num);
case PdtInternalType.Vector:
int arrtype, _;
op.GetArraySuffix(out arrtype, out _);
if (arrtype != PdtInternalType.Number)
throw new ArgumentException("Not animatable");
switch ((op.Length - sizeof(int)) / sizeof(float)) {
case 0: throw new ArgumentException("Empty vector");
case 1:
num = op.AsNumber();
return new Vector4(num, num, num, num);
case 2: return op.As<Vector2>();
case 3: return op.As<Vector3>();
default: return op.As<Vector4>();
}
default: throw new ArgumentException("Not animatable");
}
}
}
class func_cubic_bezier : PdtOperator {
readonly Func<PropSrc> _ctxcb;
@@ -552,7 +577,7 @@ namespace Cryville.Crtr {
default: throw new ArgumentException("Argument count not 4 or 5");
}
GetReturnFrame(PdtInternalType.Number, sizeof(float))
.SetNumber(CubicBezier.Evaluate(time, x1, y1, x2, y2, 1e-5f));
.SetNumber(CubicBezier.Evaluate(time, x1, y1, x2, y2, 1e-3f));
}
}
class func_cubic_bezier_fixed : PdtOperator {
@@ -571,17 +596,17 @@ namespace Cryville.Crtr {
default: throw new ArgumentException("Argument count not 0 or 1");
}
GetReturnFrame(PdtInternalType.Number, sizeof(float))
.SetNumber(CubicBezier.Evaluate(time, x1, y1, x2, y2, 1e-5f));
.SetNumber(CubicBezier.Evaluate(time, x1, y1, x2, y2, 1e-3f));
}
}
#endregion
#region Judge Functions
static readonly int _var_fn = IdentifierManager.SharedInstance.Request("fn");
static readonly int _var_tn = IdentifierManager.SharedInstance.Request("tn");
static readonly int _var_ft = IdentifierManager.SharedInstance.Request("ft");
static readonly int _var_tt = IdentifierManager.SharedInstance.Request("tt");
static readonly int _var_fv = IdentifierManager.SharedInstance.Request("fv");
static readonly int _var_tv = IdentifierManager.SharedInstance.Request("tv");
static readonly int _var_fn = IdentifierManager.SharedInstance.Request("judge_clip_from");
static readonly int _var_tn = IdentifierManager.SharedInstance.Request("judge_clip_to");
static readonly int _var_ft = IdentifierManager.SharedInstance.Request("input_time_from");
static readonly int _var_tt = IdentifierManager.SharedInstance.Request("input_time_to");
static readonly int _var_fv = IdentifierManager.SharedInstance.Request("input_vec_from");
static readonly int _var_tv = IdentifierManager.SharedInstance.Request("input_vec_to");
abstract class JudgeFunction : PdtOperator {
readonly Func<int, PropSrc> _ctxcb;
protected JudgeFunction(int pc, Func<int, PropSrc> ctxcb) : base(pc) {