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