pipeline_script/plugin/
math.rs

1use crate::core::engine::Engine;
2use crate::core::math::{
3    abs_f32, abs_f64, abs_i32, abs_i64, acos, asin, atan, atan2, cbrt, ceil, clamp_f64, clamp_i64,
4    cos, cosh, exp, exp2, factorial, floor, fmod, gcd, get_e, get_frac_1_sqrt2, get_ln10, get_ln2,
5    get_log10_e, get_log2_e, get_phi, get_pi, get_sqrt2, is_finite, is_infinite, is_nan, lcm, ln,
6    log10, log2, max_f64, max_i64, min_f64, min_i64, pow, random, random_range_f64,
7    random_range_i64, round, sin, sinh, sqrt, tan, tanh, to_degrees, to_radians, trunc,
8};
9use crate::plugin::Plugin;
10use crate::register_external_fn;
11
12/// 数学函数插件
13///
14/// 提供各种数学运算函数,包括:
15/// - 三角函数:sin, cos, tan, asin, acos, atan, atan2
16/// - 双曲函数:sinh, cosh, tanh
17/// - 指数对数函数:exp, exp2, ln, log10, log2, pow
18/// - 取整函数:floor, ceil, round, trunc
19/// - 绝对值函数:abs (支持多种类型)
20/// - 最值函数:min, max, clamp
21/// - 开方函数:sqrt, cbrt
22/// - 随机数函数:random, randomRange
23/// - 数学常量:PI, E, PHI等
24/// - 其他:factorial, gcd, lcm等
25pub struct MathPlugin;
26
27impl Plugin for MathPlugin {
28    fn apply(self, e: &mut Engine) {
29        // 三角函数
30        register_external_fn!(e, "sin", sin);
31        register_external_fn!(e, "cos", cos);
32        register_external_fn!(e, "tan", tan);
33        register_external_fn!(e, "asin", asin);
34        register_external_fn!(e, "acos", acos);
35        register_external_fn!(e, "atan", atan);
36        register_external_fn!(e, "atan2", atan2);
37
38        // 双曲函数
39        register_external_fn!(e, "sinh", sinh);
40        register_external_fn!(e, "cosh", cosh);
41        register_external_fn!(e, "tanh", tanh);
42
43        // 指数对数函数
44        register_external_fn!(e, "exp", exp);
45        register_external_fn!(e, "exp2", exp2);
46        register_external_fn!(e, "ln", ln);
47        register_external_fn!(e, "log10", log10);
48        register_external_fn!(e, "log2", log2);
49        register_external_fn!(e, "pow", pow);
50
51        // 开方函数
52        register_external_fn!(e, "sqrt", sqrt);
53        register_external_fn!(e, "cbrt", cbrt);
54
55        // 取整函数
56        register_external_fn!(e, "floor", floor);
57        register_external_fn!(e, "ceil", ceil);
58        register_external_fn!(e, "round", round);
59        register_external_fn!(e, "trunc", trunc);
60
61        // 绝对值函数(多重载)
62        register_external_fn!(e, "absF64", abs_f64);
63        register_external_fn!(e, "absF32", abs_f32);
64        register_external_fn!(e, "absI64", abs_i64);
65        register_external_fn!(e, "absI32", abs_i32);
66
67        // 最值和限制函数
68        register_external_fn!(e, "maxF64", max_f64);
69        register_external_fn!(e, "minF64", min_f64);
70        register_external_fn!(e, "maxI64", max_i64);
71        register_external_fn!(e, "minI64", min_i64);
72        register_external_fn!(e, "clampF64", clamp_f64);
73        register_external_fn!(e, "clampI64", clamp_i64);
74
75        // 其他数学函数
76        register_external_fn!(e, "fmod", fmod);
77        register_external_fn!(e, "factorial", factorial);
78        register_external_fn!(e, "gcd", gcd);
79        register_external_fn!(e, "lcm", lcm);
80
81        // 角度弧度转换
82        register_external_fn!(e, "toRadians", to_radians);
83        register_external_fn!(e, "toDegrees", to_degrees);
84
85        // 浮点数状态检查
86        register_external_fn!(e, "isNaN", is_nan);
87        register_external_fn!(e, "isInfinite", is_infinite);
88        register_external_fn!(e, "isFinite", is_finite);
89
90        // 随机数函数
91        register_external_fn!(e, "random", random);
92        register_external_fn!(e, "randomRangeI64", random_range_i64);
93        register_external_fn!(e, "randomRangeF64", random_range_f64);
94
95        // 数学常量函数
96        register_external_fn!(e, "PI", get_pi);
97        register_external_fn!(e, "E", get_e);
98        register_external_fn!(e, "PHI", get_phi);
99        register_external_fn!(e, "LN2", get_ln2);
100        register_external_fn!(e, "LN10", get_ln10);
101        register_external_fn!(e, "LOG10_E", get_log10_e);
102        register_external_fn!(e, "LOG2_E", get_log2_e);
103        register_external_fn!(e, "SQRT2", get_sqrt2);
104        register_external_fn!(e, "FRAC_1_SQRT2", get_frac_1_sqrt2);
105
106        // 注册函数声明到预处理脚本中
107        e.register_precluded_scripts(&["// ===== 三角函数 =====
108            extern fn sin(x: Double) -> Double
109            extern fn cos(x: Double) -> Double
110            extern fn tan(x: Double) -> Double
111            extern fn asin(x: Double) -> Double
112            extern fn acos(x: Double) -> Double
113            extern fn atan(x: Double) -> Double
114            extern fn atan2(y: Double, x: Double) -> Double
115
116            // ===== 双曲函数 =====
117            extern fn sinh(x: Double) -> Double
118            extern fn cosh(x: Double) -> Double
119            extern fn tanh(x: Double) -> Double
120
121            // ===== 指数对数函数 =====
122            extern fn exp(x: Double) -> Double
123            extern fn exp2(x: Double) -> Double
124            extern fn ln(x: Double) -> Double
125            extern fn log10(x: Double) -> Double
126            extern fn log2(x: Double) -> Double
127            extern fn pow(base: Double, exponent: Double) -> Double
128
129            // ===== 开方函数 =====
130            extern fn sqrt(x: Double) -> Double
131            extern fn cbrt(x: Double) -> Double
132
133            // ===== 取整函数 =====
134            extern fn floor(x: Double) -> Double
135            extern fn ceil(x: Double) -> Double
136            extern fn round(x: Double) -> Double
137            extern fn trunc(x: Double) -> Double
138
139            // ===== 绝对值函数 =====
140            extern fn absF64(x: Double) -> Double
141            extern fn absF32(x: Float) -> Float
142            extern fn absI64(x: Int64) -> Int64
143            extern fn absI32(x: Int32) -> Int32
144
145            // ===== 最值和限制函数 =====
146            extern fn maxF64(a: Double, b: Double) -> Double
147            extern fn minF64(a: Double, b: Double) -> Double
148            extern fn maxI64(a: Int64, b: Int64) -> Int64
149            extern fn minI64(a: Int64, b: Int64) -> Int64
150            extern fn clampF64(value: Double, min: Double, max: Double) -> Double
151            extern fn clampI64(value: Int64, min: Int64, max: Int64) -> Int64
152
153            // ===== 其他数学函数 =====
154            extern fn fmod(dividend: Double, divisor: Double) -> Double
155            extern fn factorial(n: Int64) -> Int64
156            extern fn gcd(a: Int64, b: Int64) -> Int64
157            extern fn lcm(a: Int64, b: Int64) -> Int64
158
159            // ===== 角度弧度转换 =====
160            extern fn toRadians(degrees: Double) -> Double
161            extern fn toDegrees(radians: Double) -> Double
162
163            // ===== 浮点数状态检查 =====
164            extern fn isNaN(x: Double) -> Bool
165            extern fn isInfinite(x: Double) -> Bool
166            extern fn isFinite(x: Double) -> Bool
167
168            // ===== 随机数函数 =====
169            extern fn random() -> Double
170            extern fn randomRangeI64(min: Int64, max: Int64) -> Int64
171            extern fn randomRangeF64(min: Double, max: Double) -> Double
172
173            // ===== 数学常量 =====
174            extern fn PI() -> Double
175            extern fn E() -> Double
176            extern fn PHI() -> Double
177            extern fn LN2() -> Double
178            extern fn LN10() -> Double
179            extern fn LOG10_E() -> Double
180            extern fn LOG2_E() -> Double
181            extern fn SQRT2() -> Double
182            extern fn FRAC_1_SQRT2() -> Double"]);
183    }
184}