Add function sphere.

This commit is contained in:
2023-05-30 22:13:58 +08:00
parent 6e553b9ebb
commit 44c54cd837

View File

@@ -192,6 +192,8 @@ namespace Cryville.Crtr {
_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("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));
Func<int, PropSrc> cccb = k => ContextCascadeLookup(k);
_ctxops.Add(IdentifierManager.Shared.Request("attack_timing"), new func_attack_timing(cccb));
@@ -644,6 +646,34 @@ namespace Cryville.Crtr {
ret.SetNumber(1 - Math.Abs(value - center) / extent);
}
}
class func_sphere : PdtOperator {
readonly Func<PropSrc> _ctxcb;
public func_sphere(Func<PropSrc> ctxcb) : base(3) { _ctxcb = ctxcb; }
protected override unsafe void Execute() {
Vector4? value, center;
float radius;
switch (LoadedOperandCount) {
case 2:
value = oputil.AsVector(_ctxcb());
center = oputil.AsVector(GetOperand(0));
radius = GetOperand(1).AsNumber();
break;
case 3:
value = oputil.AsVector(GetOperand(0));
center = oputil.AsVector(GetOperand(1));
radius = GetOperand(2).AsNumber();
break;
default: throw new ArgumentException("Argument count not 2 or 3");
}
if (value == null) {
GetReturnFrame(PdtInternalType.Null, 0);
return;
}
if (center == null) throw new ArgumentException("Null sphere center");
var ret = GetReturnFrame(PdtInternalType.Number, sizeof(float));
ret.SetNumber(1 - Vector4.Distance(center.Value, value.Value) / radius);
}
}
#endregion
#region Judge Functions
#region Timing
@@ -866,7 +896,25 @@ namespace Cryville.Crtr {
else if (type == PdtInternalType.Null) {
return null;
}
else throw new ArgumentException("Not a number");
else throw new ArgumentException("Not a vector");
}
public static Vector4? AsVector(PdtVariableMemory op) {
if (op.Type == PdtInternalType.Vector) {
switch ((op.Length - sizeof(int)) / sizeof(float)) {
case 0: return null;
case 1: return new Vector4(op.AsNumber(), 0, 0, 0);
case 2: return op.As<Vector2>();
case 3: return op.As<Vector3>();
default: return op.As<Vector4>();
}
}
else if (op.Type == PdtInternalType.Number) {
return new Vector4(op.AsNumber(), 0, 0, 0);
}
else if (op.Type == PdtInternalType.Null) {
return null;
}
else throw new ArgumentException("Not a vector");
}
}
#pragma warning restore IDE1006