2023-02-16 14:19:00 +01:00
|
|
|
|
2024-01-17 18:53:31 +01:00
|
|
|
// @:keep
|
2023-02-08 14:51:54 +01:00
|
|
|
class MathNode extends LogicNode {
|
|
|
|
|
|
2024-01-17 18:53:31 +01:00
|
|
|
operation: string;
|
|
|
|
|
use_clamp: bool;
|
2023-02-08 14:51:54 +01:00
|
|
|
|
2024-01-17 18:53:31 +01:00
|
|
|
constructor() {
|
2023-12-12 14:57:44 +01:00
|
|
|
super();
|
2023-02-08 14:51:54 +01:00
|
|
|
}
|
|
|
|
|
|
2024-01-17 18:53:31 +01:00
|
|
|
override get = (from: i32, done: (a: any)=>void) => {
|
|
|
|
|
this.inputs[0].get((v1: f32) => {
|
|
|
|
|
this.inputs[1].get((v2: f32) => {
|
|
|
|
|
let f = 0.0;
|
|
|
|
|
switch (this.operation) {
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Add":
|
|
|
|
|
f = v1 + v2;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Multiply":
|
|
|
|
|
f = v1 * v2;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Sine":
|
|
|
|
|
f = Math.sin(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Cosine":
|
|
|
|
|
f = Math.cos(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Max":
|
|
|
|
|
f = Math.max(v1, v2);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Min":
|
|
|
|
|
f = Math.min(v1, v2);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Absolute":
|
|
|
|
|
f = Math.abs(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Subtract":
|
|
|
|
|
f = v1 - v2;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Divide":
|
|
|
|
|
f = v1 / (v2 == 0.0 ? 0.000001 : v2);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Tangent":
|
|
|
|
|
f = Math.tan(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Arcsine":
|
|
|
|
|
f = Math.asin(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Arccosine":
|
|
|
|
|
f = Math.acos(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Arctangent":
|
|
|
|
|
f = Math.atan(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Arctan2":
|
|
|
|
|
f = Math.atan2(v2, v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Power":
|
|
|
|
|
f = Math.pow(v1, v2);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Logarithm":
|
|
|
|
|
f = Math.log(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Round":
|
|
|
|
|
f = Math.round(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Floor":
|
|
|
|
|
f = Math.floor(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Ceil":
|
|
|
|
|
f = Math.ceil(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Truncate":
|
2024-01-17 18:53:31 +01:00
|
|
|
f = Math.floor(v1);
|
|
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Fraction":
|
|
|
|
|
f = v1 - Math.floor(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Less Than":
|
|
|
|
|
f = v1 < v2 ? 1.0 : 0.0;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Greater Than":
|
|
|
|
|
f = v1 > v2 ? 1.0 : 0.0;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Modulo":
|
|
|
|
|
f = v1 % v2;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Snap":
|
|
|
|
|
f = Math.floor(v1 / v2) * v2;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Square Root":
|
|
|
|
|
f = Math.sqrt(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Inverse Square Root":
|
|
|
|
|
f = 1.0 / Math.sqrt(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Exponent":
|
|
|
|
|
f = Math.exp(v1);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Sign":
|
|
|
|
|
f = v1 > 0 ? 1.0 : (v1 < 0 ? -1.0 : 0);
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Ping-Pong":
|
|
|
|
|
f = (v2 != 0.0) ? v2 - Math.abs((Math.abs(v1) % (2 * v2)) - v2) : 0.0;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Hyperbolic Sine":
|
|
|
|
|
f = (Math.exp(v1) - Math.exp(-v1)) / 2.0;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Hyperbolic Cosine":
|
|
|
|
|
f = (Math.exp(v1) + Math.exp(-v1)) / 2.0;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "Hyperbolic Tangent":
|
|
|
|
|
f = 1.0 - (2.0 / (Math.exp(2 * v1) + 1));
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "To Radians":
|
|
|
|
|
f = v1 / 180.0 * Math.PI;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
case "To Degrees":
|
|
|
|
|
f = v1 / Math.PI * 180.0;
|
2024-01-17 18:53:31 +01:00
|
|
|
break;
|
2023-02-08 14:51:54 +01:00
|
|
|
}
|
|
|
|
|
|
2024-01-17 18:53:31 +01:00
|
|
|
if (this.use_clamp) f = f < 0.0 ? 0.0 : (f > 1.0 ? 1.0 : f);
|
2023-02-08 14:51:54 +01:00
|
|
|
|
|
|
|
|
done(f);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-02-22 19:52:02 +01:00
|
|
|
|
2024-01-17 18:53:31 +01:00
|
|
|
static def: TNode = {
|
2023-02-22 19:52:02 +01:00
|
|
|
id: 0,
|
|
|
|
|
name: _tr("Math"),
|
|
|
|
|
type: "MathNode",
|
|
|
|
|
x: 0,
|
|
|
|
|
y: 0,
|
|
|
|
|
color: 0xff4982a0,
|
|
|
|
|
inputs: [
|
|
|
|
|
{
|
|
|
|
|
id: 0,
|
|
|
|
|
node_id: 0,
|
|
|
|
|
name: _tr("Value"),
|
|
|
|
|
type: "VALUE",
|
|
|
|
|
color: 0xffa1a1a1,
|
|
|
|
|
default_value: 0.5
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
id: 0,
|
|
|
|
|
node_id: 0,
|
|
|
|
|
name: _tr("Value"),
|
|
|
|
|
type: "VALUE",
|
|
|
|
|
color: 0xffa1a1a1,
|
|
|
|
|
default_value: 0.5
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
outputs: [
|
|
|
|
|
{
|
|
|
|
|
id: 0,
|
|
|
|
|
node_id: 0,
|
|
|
|
|
name: _tr("Value"),
|
|
|
|
|
type: "VALUE",
|
|
|
|
|
color: 0xffa1a1a1,
|
|
|
|
|
default_value: 0.0
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
buttons: [
|
|
|
|
|
{
|
|
|
|
|
name: _tr("operation"),
|
|
|
|
|
type: "ENUM",
|
|
|
|
|
data: ["Add", "Subtract", "Multiply", "Divide", "Power", "Logarithm", "Square Root", "Inverse Square Root", "Absolute", "Exponent", "Minimum", "Maximum", "Less Than", "Greater Than", "Sign", "Round", "Floor", "Ceil", "Truncate", "Fraction", "Modulo", "Snap", "Ping-Pong", "Sine", "Cosine", "Tangent", "Arcsine", "Arccosine", "Arctangent", "Arctan2", "Hyperbolic Sine", "Hyperbolic Cosine", "Hyperbolic Tangent", "To Radians", "To Degrees"],
|
|
|
|
|
default_value: 0,
|
|
|
|
|
output: 0
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: _tr("use_clamp"),
|
|
|
|
|
type: "BOOL",
|
|
|
|
|
default_value: false,
|
|
|
|
|
output: 0
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
};
|
2023-02-08 14:51:54 +01:00
|
|
|
}
|