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
12pub struct MathPlugin;
26
27impl Plugin for MathPlugin {
28 fn apply(self, e: &mut Engine) {
29 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 register_external_fn!(e, "sinh", sinh);
40 register_external_fn!(e, "cosh", cosh);
41 register_external_fn!(e, "tanh", tanh);
42
43 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 register_external_fn!(e, "sqrt", sqrt);
53 register_external_fn!(e, "cbrt", cbrt);
54
55 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 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 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 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 register_external_fn!(e, "toRadians", to_radians);
83 register_external_fn!(e, "toDegrees", to_degrees);
84
85 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 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 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 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}