Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/core/variant/variant_utility.cpp
9903 views
1
/**************************************************************************/
2
/* variant_utility.cpp */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#include "variant_utility.h"
32
33
#include "core/io/marshalls.h"
34
#include "core/object/ref_counted.h"
35
#include "core/object/script_language.h"
36
#include "core/os/os.h"
37
#include "core/templates/a_hash_map.h"
38
#include "core/templates/rid.h"
39
#include "core/templates/rid_owner.h"
40
#include "core/variant/binder_common.h"
41
#include "core/variant/variant_parser.h"
42
43
// Math
44
double VariantUtilityFunctions::sin(double arg) {
45
return Math::sin(arg);
46
}
47
48
double VariantUtilityFunctions::cos(double arg) {
49
return Math::cos(arg);
50
}
51
52
double VariantUtilityFunctions::tan(double arg) {
53
return Math::tan(arg);
54
}
55
56
double VariantUtilityFunctions::sinh(double arg) {
57
return Math::sinh(arg);
58
}
59
60
double VariantUtilityFunctions::cosh(double arg) {
61
return Math::cosh(arg);
62
}
63
64
double VariantUtilityFunctions::tanh(double arg) {
65
return Math::tanh(arg);
66
}
67
68
double VariantUtilityFunctions::asin(double arg) {
69
return Math::asin(arg);
70
}
71
72
double VariantUtilityFunctions::acos(double arg) {
73
return Math::acos(arg);
74
}
75
76
double VariantUtilityFunctions::atan(double arg) {
77
return Math::atan(arg);
78
}
79
80
double VariantUtilityFunctions::atan2(double y, double x) {
81
return Math::atan2(y, x);
82
}
83
84
double VariantUtilityFunctions::asinh(double arg) {
85
return Math::asinh(arg);
86
}
87
88
double VariantUtilityFunctions::acosh(double arg) {
89
return Math::acosh(arg);
90
}
91
92
double VariantUtilityFunctions::atanh(double arg) {
93
return Math::atanh(arg);
94
}
95
96
double VariantUtilityFunctions::sqrt(double x) {
97
return Math::sqrt(x);
98
}
99
100
double VariantUtilityFunctions::fmod(double b, double r) {
101
return Math::fmod(b, r);
102
}
103
104
double VariantUtilityFunctions::fposmod(double b, double r) {
105
return Math::fposmod(b, r);
106
}
107
108
int64_t VariantUtilityFunctions::posmod(int64_t b, int64_t r) {
109
return Math::posmod(b, r);
110
}
111
112
Variant VariantUtilityFunctions::floor(const Variant &x, Callable::CallError &r_error) {
113
r_error.error = Callable::CallError::CALL_OK;
114
switch (x.get_type()) {
115
case Variant::INT: {
116
return VariantInternalAccessor<int64_t>::get(&x);
117
} break;
118
case Variant::FLOAT: {
119
return Math::floor(VariantInternalAccessor<double>::get(&x));
120
} break;
121
case Variant::VECTOR2: {
122
return VariantInternalAccessor<Vector2>::get(&x).floor();
123
} break;
124
case Variant::VECTOR2I: {
125
return VariantInternalAccessor<Vector2i>::get(&x);
126
} break;
127
case Variant::VECTOR3: {
128
return VariantInternalAccessor<Vector3>::get(&x).floor();
129
} break;
130
case Variant::VECTOR3I: {
131
return VariantInternalAccessor<Vector3i>::get(&x);
132
} break;
133
case Variant::VECTOR4: {
134
return VariantInternalAccessor<Vector4>::get(&x).floor();
135
} break;
136
case Variant::VECTOR4I: {
137
return VariantInternalAccessor<Vector4i>::get(&x);
138
} break;
139
default: {
140
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
141
r_error.argument = 0;
142
r_error.expected = Variant::NIL;
143
return R"(Argument "x" must be "int", "float", "Vector2", "Vector2i", "Vector3", "Vector3i", "Vector4", or "Vector4i".)";
144
} break;
145
}
146
}
147
148
double VariantUtilityFunctions::floorf(double x) {
149
return Math::floor(x);
150
}
151
152
int64_t VariantUtilityFunctions::floori(double x) {
153
return int64_t(Math::floor(x));
154
}
155
156
Variant VariantUtilityFunctions::ceil(const Variant &x, Callable::CallError &r_error) {
157
r_error.error = Callable::CallError::CALL_OK;
158
switch (x.get_type()) {
159
case Variant::INT: {
160
return VariantInternalAccessor<int64_t>::get(&x);
161
} break;
162
case Variant::FLOAT: {
163
return Math::ceil(VariantInternalAccessor<double>::get(&x));
164
} break;
165
case Variant::VECTOR2: {
166
return VariantInternalAccessor<Vector2>::get(&x).ceil();
167
} break;
168
case Variant::VECTOR2I: {
169
return VariantInternalAccessor<Vector2i>::get(&x);
170
} break;
171
case Variant::VECTOR3: {
172
return VariantInternalAccessor<Vector3>::get(&x).ceil();
173
} break;
174
case Variant::VECTOR3I: {
175
return VariantInternalAccessor<Vector3i>::get(&x);
176
} break;
177
case Variant::VECTOR4: {
178
return VariantInternalAccessor<Vector4>::get(&x).ceil();
179
} break;
180
case Variant::VECTOR4I: {
181
return VariantInternalAccessor<Vector4i>::get(&x);
182
} break;
183
default: {
184
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
185
r_error.argument = 0;
186
r_error.expected = Variant::NIL;
187
return R"(Argument "x" must be "int", "float", "Vector2", "Vector2i", "Vector3", "Vector3i", "Vector4", or "Vector4i".)";
188
} break;
189
}
190
}
191
192
double VariantUtilityFunctions::ceilf(double x) {
193
return Math::ceil(x);
194
}
195
196
int64_t VariantUtilityFunctions::ceili(double x) {
197
return int64_t(Math::ceil(x));
198
}
199
200
Variant VariantUtilityFunctions::round(const Variant &x, Callable::CallError &r_error) {
201
r_error.error = Callable::CallError::CALL_OK;
202
switch (x.get_type()) {
203
case Variant::INT: {
204
return VariantInternalAccessor<int64_t>::get(&x);
205
} break;
206
case Variant::FLOAT: {
207
return Math::round(VariantInternalAccessor<double>::get(&x));
208
} break;
209
case Variant::VECTOR2: {
210
return VariantInternalAccessor<Vector2>::get(&x).round();
211
} break;
212
case Variant::VECTOR2I: {
213
return VariantInternalAccessor<Vector2i>::get(&x);
214
} break;
215
case Variant::VECTOR3: {
216
return VariantInternalAccessor<Vector3>::get(&x).round();
217
} break;
218
case Variant::VECTOR3I: {
219
return VariantInternalAccessor<Vector3i>::get(&x);
220
} break;
221
case Variant::VECTOR4: {
222
return VariantInternalAccessor<Vector4>::get(&x).round();
223
} break;
224
case Variant::VECTOR4I: {
225
return VariantInternalAccessor<Vector4i>::get(&x);
226
} break;
227
default: {
228
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
229
r_error.argument = 0;
230
r_error.expected = Variant::NIL;
231
return R"(Argument "x" must be "int", "float", "Vector2", "Vector2i", "Vector3", "Vector3i", "Vector4", or "Vector4i".)";
232
} break;
233
}
234
}
235
236
double VariantUtilityFunctions::roundf(double x) {
237
return Math::round(x);
238
}
239
240
int64_t VariantUtilityFunctions::roundi(double x) {
241
return int64_t(Math::round(x));
242
}
243
244
Variant VariantUtilityFunctions::abs(const Variant &x, Callable::CallError &r_error) {
245
r_error.error = Callable::CallError::CALL_OK;
246
switch (x.get_type()) {
247
case Variant::INT: {
248
return Math::abs(VariantInternalAccessor<int64_t>::get(&x));
249
} break;
250
case Variant::FLOAT: {
251
return Math::abs(VariantInternalAccessor<double>::get(&x));
252
} break;
253
case Variant::VECTOR2: {
254
return VariantInternalAccessor<Vector2>::get(&x).abs();
255
} break;
256
case Variant::VECTOR2I: {
257
return VariantInternalAccessor<Vector2i>::get(&x).abs();
258
} break;
259
case Variant::VECTOR3: {
260
return VariantInternalAccessor<Vector3>::get(&x).abs();
261
} break;
262
case Variant::VECTOR3I: {
263
return VariantInternalAccessor<Vector3i>::get(&x).abs();
264
} break;
265
case Variant::VECTOR4: {
266
return VariantInternalAccessor<Vector4>::get(&x).abs();
267
} break;
268
case Variant::VECTOR4I: {
269
return VariantInternalAccessor<Vector4i>::get(&x).abs();
270
} break;
271
default: {
272
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
273
r_error.argument = 0;
274
r_error.expected = Variant::NIL;
275
return R"(Argument "x" must be "int", "float", "Vector2", "Vector2i", "Vector3", "Vector3i", "Vector4", or "Vector4i".)";
276
} break;
277
}
278
}
279
280
double VariantUtilityFunctions::absf(double x) {
281
return Math::abs(x);
282
}
283
284
int64_t VariantUtilityFunctions::absi(int64_t x) {
285
return Math::abs(x);
286
}
287
288
Variant VariantUtilityFunctions::sign(const Variant &x, Callable::CallError &r_error) {
289
r_error.error = Callable::CallError::CALL_OK;
290
switch (x.get_type()) {
291
case Variant::INT: {
292
return SIGN(VariantInternalAccessor<int64_t>::get(&x));
293
} break;
294
case Variant::FLOAT: {
295
return SIGN(VariantInternalAccessor<double>::get(&x));
296
} break;
297
case Variant::VECTOR2: {
298
return VariantInternalAccessor<Vector2>::get(&x).sign();
299
} break;
300
case Variant::VECTOR2I: {
301
return VariantInternalAccessor<Vector2i>::get(&x).sign();
302
} break;
303
case Variant::VECTOR3: {
304
return VariantInternalAccessor<Vector3>::get(&x).sign();
305
} break;
306
case Variant::VECTOR3I: {
307
return VariantInternalAccessor<Vector3i>::get(&x).sign();
308
} break;
309
case Variant::VECTOR4: {
310
return VariantInternalAccessor<Vector4>::get(&x).sign();
311
} break;
312
case Variant::VECTOR4I: {
313
return VariantInternalAccessor<Vector4i>::get(&x).sign();
314
} break;
315
default: {
316
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
317
r_error.argument = 0;
318
r_error.expected = Variant::NIL;
319
return R"(Argument "x" must be "int", "float", "Vector2", "Vector2i", "Vector3", "Vector3i", "Vector4", or "Vector4i".)";
320
} break;
321
}
322
}
323
324
double VariantUtilityFunctions::signf(double x) {
325
return SIGN(x);
326
}
327
328
int64_t VariantUtilityFunctions::signi(int64_t x) {
329
return SIGN(x);
330
}
331
332
double VariantUtilityFunctions::pow(double x, double y) {
333
return Math::pow(x, y);
334
}
335
336
double VariantUtilityFunctions::log(double x) {
337
return Math::log(x);
338
}
339
340
double VariantUtilityFunctions::exp(double x) {
341
return Math::exp(x);
342
}
343
344
bool VariantUtilityFunctions::is_nan(double x) {
345
return Math::is_nan(x);
346
}
347
348
bool VariantUtilityFunctions::is_inf(double x) {
349
return Math::is_inf(x);
350
}
351
352
bool VariantUtilityFunctions::is_equal_approx(double x, double y) {
353
return Math::is_equal_approx(x, y);
354
}
355
356
bool VariantUtilityFunctions::is_zero_approx(double x) {
357
return Math::is_zero_approx(x);
358
}
359
360
bool VariantUtilityFunctions::is_finite(double x) {
361
return Math::is_finite(x);
362
}
363
364
double VariantUtilityFunctions::ease(float x, float curve) {
365
return Math::ease(x, curve);
366
}
367
368
int VariantUtilityFunctions::step_decimals(float step) {
369
return Math::step_decimals(step);
370
}
371
372
Variant VariantUtilityFunctions::snapped(const Variant &x, const Variant &step, Callable::CallError &r_error) {
373
switch (x.get_type()) {
374
case Variant::INT:
375
case Variant::FLOAT:
376
case Variant::VECTOR2:
377
case Variant::VECTOR2I:
378
case Variant::VECTOR3:
379
case Variant::VECTOR3I:
380
case Variant::VECTOR4:
381
case Variant::VECTOR4I:
382
break;
383
default:
384
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
385
r_error.argument = 0;
386
r_error.expected = Variant::NIL;
387
return R"(Argument "x" must be "int", "float", "Vector2", "Vector2i", "Vector3", "Vector3i", "Vector4", or "Vector4i".)";
388
}
389
390
if (x.get_type() != step.get_type()) {
391
if (x.get_type() == Variant::INT || x.get_type() == Variant::FLOAT) {
392
if (step.get_type() != Variant::INT && step.get_type() != Variant::FLOAT) {
393
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
394
r_error.argument = 1;
395
r_error.expected = Variant::NIL;
396
return R"(Argument "step" must be "int" or "float".)";
397
}
398
} else {
399
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
400
r_error.argument = 1;
401
r_error.expected = x.get_type();
402
return Variant();
403
}
404
}
405
406
r_error.error = Callable::CallError::CALL_OK;
407
switch (step.get_type()) {
408
case Variant::INT: {
409
return snappedi(x, VariantInternalAccessor<int64_t>::get(&step));
410
} break;
411
case Variant::FLOAT: {
412
return snappedf(x, VariantInternalAccessor<double>::get(&step));
413
} break;
414
case Variant::VECTOR2: {
415
return VariantInternalAccessor<Vector2>::get(&x).snapped(VariantInternalAccessor<Vector2>::get(&step));
416
} break;
417
case Variant::VECTOR2I: {
418
return VariantInternalAccessor<Vector2i>::get(&x).snapped(VariantInternalAccessor<Vector2i>::get(&step));
419
} break;
420
case Variant::VECTOR3: {
421
return VariantInternalAccessor<Vector3>::get(&x).snapped(VariantInternalAccessor<Vector3>::get(&step));
422
} break;
423
case Variant::VECTOR3I: {
424
return VariantInternalAccessor<Vector3i>::get(&x).snapped(VariantInternalAccessor<Vector3i>::get(&step));
425
} break;
426
case Variant::VECTOR4: {
427
return VariantInternalAccessor<Vector4>::get(&x).snapped(VariantInternalAccessor<Vector4>::get(&step));
428
} break;
429
case Variant::VECTOR4I: {
430
return VariantInternalAccessor<Vector4i>::get(&x).snapped(VariantInternalAccessor<Vector4i>::get(&step));
431
} break;
432
default: {
433
return Variant(); // Already handled.
434
} break;
435
}
436
}
437
438
double VariantUtilityFunctions::snappedf(double x, double step) {
439
return Math::snapped(x, step);
440
}
441
442
int64_t VariantUtilityFunctions::snappedi(double x, int64_t step) {
443
return Math::snapped(x, step);
444
}
445
446
Variant VariantUtilityFunctions::lerp(const Variant &from, const Variant &to, double weight, Callable::CallError &r_error) {
447
switch (from.get_type()) {
448
case Variant::INT:
449
case Variant::FLOAT:
450
case Variant::VECTOR2:
451
case Variant::VECTOR3:
452
case Variant::VECTOR4:
453
case Variant::QUATERNION:
454
case Variant::BASIS:
455
case Variant::COLOR:
456
case Variant::TRANSFORM2D:
457
case Variant::TRANSFORM3D:
458
break;
459
default:
460
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
461
r_error.argument = 0;
462
r_error.expected = Variant::NIL;
463
return R"(Argument "from" must be "int", "float", "Vector2", "Vector3", "Vector4", "Color", "Quaternion", "Basis", "Transform2D", or "Transform3D".)";
464
}
465
466
if (from.get_type() != to.get_type()) {
467
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
468
r_error.argument = 1;
469
r_error.expected = from.get_type();
470
return Variant();
471
}
472
473
r_error.error = Callable::CallError::CALL_OK;
474
switch (from.get_type()) {
475
case Variant::INT: {
476
return lerpf(VariantInternalAccessor<int64_t>::get(&from), to, weight);
477
} break;
478
case Variant::FLOAT: {
479
return lerpf(VariantInternalAccessor<double>::get(&from), to, weight);
480
} break;
481
case Variant::VECTOR2: {
482
return VariantInternalAccessor<Vector2>::get(&from).lerp(VariantInternalAccessor<Vector2>::get(&to), weight);
483
} break;
484
case Variant::VECTOR3: {
485
return VariantInternalAccessor<Vector3>::get(&from).lerp(VariantInternalAccessor<Vector3>::get(&to), weight);
486
} break;
487
case Variant::VECTOR4: {
488
return VariantInternalAccessor<Vector4>::get(&from).lerp(VariantInternalAccessor<Vector4>::get(&to), weight);
489
} break;
490
case Variant::QUATERNION: {
491
return VariantInternalAccessor<Quaternion>::get(&from).slerp(VariantInternalAccessor<Quaternion>::get(&to), weight);
492
} break;
493
case Variant::BASIS: {
494
return VariantInternalAccessor<Basis>::get(&from).slerp(VariantInternalAccessor<Basis>::get(&to), weight);
495
} break;
496
case Variant::TRANSFORM2D: {
497
return VariantInternalAccessor<Transform2D>::get(&from).interpolate_with(VariantInternalAccessor<Transform2D>::get(&to), weight);
498
} break;
499
case Variant::TRANSFORM3D: {
500
return VariantInternalAccessor<Transform3D>::get(&from).interpolate_with(VariantInternalAccessor<Transform3D>::get(&to), weight);
501
} break;
502
case Variant::COLOR: {
503
return VariantInternalAccessor<Color>::get(&from).lerp(VariantInternalAccessor<Color>::get(&to), weight);
504
} break;
505
default: {
506
return Variant(); // Already handled.
507
} break;
508
}
509
}
510
511
double VariantUtilityFunctions::lerpf(double from, double to, double weight) {
512
return Math::lerp(from, to, weight);
513
}
514
515
double VariantUtilityFunctions::cubic_interpolate(double from, double to, double pre, double post, double weight) {
516
return Math::cubic_interpolate(from, to, pre, post, weight);
517
}
518
519
double VariantUtilityFunctions::cubic_interpolate_angle(double from, double to, double pre, double post, double weight) {
520
return Math::cubic_interpolate_angle(from, to, pre, post, weight);
521
}
522
523
double VariantUtilityFunctions::cubic_interpolate_in_time(double from, double to, double pre, double post, double weight,
524
double to_t, double pre_t, double post_t) {
525
return Math::cubic_interpolate_in_time(from, to, pre, post, weight, to_t, pre_t, post_t);
526
}
527
528
double VariantUtilityFunctions::cubic_interpolate_angle_in_time(double from, double to, double pre, double post, double weight,
529
double to_t, double pre_t, double post_t) {
530
return Math::cubic_interpolate_angle_in_time(from, to, pre, post, weight, to_t, pre_t, post_t);
531
}
532
533
double VariantUtilityFunctions::bezier_interpolate(double p_start, double p_control_1, double p_control_2, double p_end, double p_t) {
534
return Math::bezier_interpolate(p_start, p_control_1, p_control_2, p_end, p_t);
535
}
536
537
double VariantUtilityFunctions::bezier_derivative(double p_start, double p_control_1, double p_control_2, double p_end, double p_t) {
538
return Math::bezier_derivative(p_start, p_control_1, p_control_2, p_end, p_t);
539
}
540
541
double VariantUtilityFunctions::angle_difference(double from, double to) {
542
return Math::angle_difference(from, to);
543
}
544
545
double VariantUtilityFunctions::lerp_angle(double from, double to, double weight) {
546
return Math::lerp_angle(from, to, weight);
547
}
548
549
double VariantUtilityFunctions::inverse_lerp(double from, double to, double weight) {
550
return Math::inverse_lerp(from, to, weight);
551
}
552
553
double VariantUtilityFunctions::remap(double value, double istart, double istop, double ostart, double ostop) {
554
return Math::remap(value, istart, istop, ostart, ostop);
555
}
556
557
double VariantUtilityFunctions::smoothstep(double from, double to, double val) {
558
return Math::smoothstep(from, to, val);
559
}
560
561
double VariantUtilityFunctions::move_toward(double from, double to, double delta) {
562
return Math::move_toward(from, to, delta);
563
}
564
565
double VariantUtilityFunctions::rotate_toward(double from, double to, double delta) {
566
return Math::rotate_toward(from, to, delta);
567
}
568
569
double VariantUtilityFunctions::deg_to_rad(double angle_deg) {
570
return Math::deg_to_rad(angle_deg);
571
}
572
573
double VariantUtilityFunctions::rad_to_deg(double angle_rad) {
574
return Math::rad_to_deg(angle_rad);
575
}
576
577
double VariantUtilityFunctions::linear_to_db(double linear) {
578
return Math::linear_to_db(linear);
579
}
580
581
double VariantUtilityFunctions::db_to_linear(double db) {
582
return Math::db_to_linear(db);
583
}
584
585
Variant VariantUtilityFunctions::wrap(const Variant &p_x, const Variant &p_min, const Variant &p_max, Callable::CallError &r_error) {
586
Variant::Type x_type = p_x.get_type();
587
if (x_type != Variant::INT && x_type != Variant::FLOAT) {
588
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
589
r_error.argument = 0;
590
r_error.expected = Variant::FLOAT;
591
return Variant();
592
}
593
594
Variant::Type min_type = p_min.get_type();
595
if (min_type != Variant::INT && min_type != Variant::FLOAT) {
596
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
597
r_error.argument = 1;
598
r_error.expected = x_type;
599
return Variant();
600
}
601
602
Variant::Type max_type = p_max.get_type();
603
if (max_type != Variant::INT && max_type != Variant::FLOAT) {
604
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
605
r_error.argument = 2;
606
r_error.expected = x_type;
607
return Variant();
608
}
609
610
Variant value;
611
612
switch (x_type) {
613
case Variant::INT: {
614
if (x_type != min_type || x_type != max_type) {
615
value = wrapf((double)p_x, (double)p_min, (double)p_max);
616
} else {
617
value = wrapi((int)p_x, (int)p_min, (int)p_max);
618
}
619
} break;
620
case Variant::FLOAT: {
621
value = wrapf((double)p_x, (double)p_min, (double)p_max);
622
} break;
623
default:
624
break;
625
}
626
627
r_error.error = Callable::CallError::CALL_OK;
628
return value;
629
}
630
631
int64_t VariantUtilityFunctions::wrapi(int64_t value, int64_t min, int64_t max) {
632
return Math::wrapi(value, min, max);
633
}
634
635
double VariantUtilityFunctions::wrapf(double value, double min, double max) {
636
return Math::wrapf(value, min, max);
637
}
638
639
double VariantUtilityFunctions::pingpong(double value, double length) {
640
return Math::pingpong(value, length);
641
}
642
643
Variant VariantUtilityFunctions::max(const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
644
if (p_argcount < 2) {
645
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
646
r_error.expected = 2;
647
return Variant();
648
}
649
Variant base = *p_args[0];
650
Variant ret;
651
652
for (int i = 0; i < p_argcount; i++) {
653
Variant::Type arg_type = p_args[i]->get_type();
654
if (arg_type != Variant::INT && arg_type != Variant::FLOAT) {
655
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
656
r_error.argument = i;
657
r_error.expected = Variant::FLOAT;
658
return Variant();
659
}
660
if (i == 0) {
661
continue;
662
}
663
bool valid;
664
Variant::evaluate(Variant::OP_LESS, base, *p_args[i], ret, valid);
665
if (!valid) {
666
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
667
r_error.argument = i;
668
r_error.expected = base.get_type();
669
return Variant();
670
}
671
if (ret.booleanize()) {
672
base = *p_args[i];
673
}
674
}
675
r_error.error = Callable::CallError::CALL_OK;
676
return base;
677
}
678
679
double VariantUtilityFunctions::maxf(double x, double y) {
680
return MAX(x, y);
681
}
682
683
int64_t VariantUtilityFunctions::maxi(int64_t x, int64_t y) {
684
return MAX(x, y);
685
}
686
687
Variant VariantUtilityFunctions::min(const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
688
if (p_argcount < 2) {
689
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
690
r_error.expected = 2;
691
return Variant();
692
}
693
Variant base = *p_args[0];
694
Variant ret;
695
696
for (int i = 0; i < p_argcount; i++) {
697
Variant::Type arg_type = p_args[i]->get_type();
698
if (arg_type != Variant::INT && arg_type != Variant::FLOAT) {
699
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
700
r_error.argument = i;
701
r_error.expected = Variant::FLOAT;
702
return Variant();
703
}
704
if (i == 0) {
705
continue;
706
}
707
bool valid;
708
Variant::evaluate(Variant::OP_GREATER, base, *p_args[i], ret, valid);
709
if (!valid) {
710
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
711
r_error.argument = i;
712
r_error.expected = base.get_type();
713
return Variant();
714
}
715
if (ret.booleanize()) {
716
base = *p_args[i];
717
}
718
}
719
r_error.error = Callable::CallError::CALL_OK;
720
return base;
721
}
722
723
double VariantUtilityFunctions::minf(double x, double y) {
724
return MIN(x, y);
725
}
726
727
int64_t VariantUtilityFunctions::mini(int64_t x, int64_t y) {
728
return MIN(x, y);
729
}
730
731
Variant VariantUtilityFunctions::clamp(const Variant &x, const Variant &min, const Variant &max, Callable::CallError &r_error) {
732
Variant value = x;
733
734
Variant ret;
735
736
bool valid;
737
Variant::evaluate(Variant::OP_LESS, value, min, ret, valid);
738
if (!valid) {
739
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
740
r_error.argument = 1;
741
r_error.expected = value.get_type();
742
return Variant();
743
}
744
if (ret.booleanize()) {
745
value = min;
746
}
747
Variant::evaluate(Variant::OP_GREATER, value, max, ret, valid);
748
if (!valid) {
749
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
750
r_error.argument = 2;
751
r_error.expected = value.get_type();
752
return Variant();
753
}
754
if (ret.booleanize()) {
755
value = max;
756
}
757
758
r_error.error = Callable::CallError::CALL_OK;
759
760
return value;
761
}
762
763
double VariantUtilityFunctions::clampf(double x, double min, double max) {
764
return CLAMP(x, min, max);
765
}
766
767
int64_t VariantUtilityFunctions::clampi(int64_t x, int64_t min, int64_t max) {
768
return CLAMP(x, min, max);
769
}
770
771
int64_t VariantUtilityFunctions::nearest_po2(int64_t x) {
772
return nearest_power_of_2_templated(uint64_t(x));
773
}
774
775
// Random
776
777
void VariantUtilityFunctions::randomize() {
778
Math::randomize();
779
}
780
781
int64_t VariantUtilityFunctions::randi() {
782
return Math::rand();
783
}
784
785
double VariantUtilityFunctions::randf() {
786
return Math::randf();
787
}
788
789
double VariantUtilityFunctions::randfn(double mean, double deviation) {
790
return Math::randfn(mean, deviation);
791
}
792
793
int64_t VariantUtilityFunctions::randi_range(int64_t from, int64_t to) {
794
return Math::random((int32_t)from, (int32_t)to);
795
}
796
797
double VariantUtilityFunctions::randf_range(double from, double to) {
798
return Math::random(from, to);
799
}
800
801
void VariantUtilityFunctions::seed(int64_t s) {
802
return Math::seed(s);
803
}
804
805
PackedInt64Array VariantUtilityFunctions::rand_from_seed(int64_t seed) {
806
uint64_t s = seed;
807
PackedInt64Array arr;
808
arr.resize(2);
809
arr.write[0] = Math::rand_from_seed(&s);
810
arr.write[1] = s;
811
return arr;
812
}
813
814
// Utility
815
816
Variant VariantUtilityFunctions::weakref(const Variant &obj, Callable::CallError &r_error) {
817
if (obj.get_type() == Variant::OBJECT) {
818
r_error.error = Callable::CallError::CALL_OK;
819
if (obj.is_ref_counted()) {
820
Ref<WeakRef> wref = memnew(WeakRef);
821
Ref<RefCounted> r = obj;
822
if (r.is_valid()) {
823
wref->set_ref(r);
824
}
825
return wref;
826
} else {
827
Ref<WeakRef> wref = memnew(WeakRef);
828
Object *o = obj.get_validated_object();
829
if (o) {
830
wref->set_obj(o);
831
}
832
return wref;
833
}
834
} else if (obj.get_type() == Variant::NIL) {
835
r_error.error = Callable::CallError::CALL_OK;
836
Ref<WeakRef> wref = memnew(WeakRef);
837
return wref;
838
} else {
839
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
840
r_error.argument = 0;
841
r_error.expected = Variant::OBJECT;
842
return Variant();
843
}
844
}
845
846
int64_t VariantUtilityFunctions::_typeof(const Variant &obj) {
847
return obj.get_type();
848
}
849
850
Variant VariantUtilityFunctions::type_convert(const Variant &p_variant, const Variant::Type p_type) {
851
switch (p_type) {
852
case Variant::Type::NIL:
853
return Variant();
854
case Variant::Type::BOOL:
855
return p_variant.operator bool();
856
case Variant::Type::INT:
857
return p_variant.operator int64_t();
858
case Variant::Type::FLOAT:
859
return p_variant.operator double();
860
case Variant::Type::STRING:
861
return p_variant.operator String();
862
case Variant::Type::VECTOR2:
863
return p_variant.operator Vector2();
864
case Variant::Type::VECTOR2I:
865
return p_variant.operator Vector2i();
866
case Variant::Type::RECT2:
867
return p_variant.operator Rect2();
868
case Variant::Type::RECT2I:
869
return p_variant.operator Rect2i();
870
case Variant::Type::VECTOR3:
871
return p_variant.operator Vector3();
872
case Variant::Type::VECTOR3I:
873
return p_variant.operator Vector3i();
874
case Variant::Type::TRANSFORM2D:
875
return p_variant.operator Transform2D();
876
case Variant::Type::VECTOR4:
877
return p_variant.operator Vector4();
878
case Variant::Type::VECTOR4I:
879
return p_variant.operator Vector4i();
880
case Variant::Type::PLANE:
881
return p_variant.operator Plane();
882
case Variant::Type::QUATERNION:
883
return p_variant.operator Quaternion();
884
case Variant::Type::AABB:
885
return p_variant.operator ::AABB();
886
case Variant::Type::BASIS:
887
return p_variant.operator Basis();
888
case Variant::Type::TRANSFORM3D:
889
return p_variant.operator Transform3D();
890
case Variant::Type::PROJECTION:
891
return p_variant.operator Projection();
892
case Variant::Type::COLOR:
893
return p_variant.operator Color();
894
case Variant::Type::STRING_NAME:
895
return p_variant.operator StringName();
896
case Variant::Type::NODE_PATH:
897
return p_variant.operator NodePath();
898
case Variant::Type::RID:
899
return p_variant.operator ::RID();
900
case Variant::Type::OBJECT:
901
return p_variant.operator Object *();
902
case Variant::Type::CALLABLE:
903
return p_variant.operator Callable();
904
case Variant::Type::SIGNAL:
905
return p_variant.operator Signal();
906
case Variant::Type::DICTIONARY:
907
return p_variant.operator Dictionary();
908
case Variant::Type::ARRAY:
909
return p_variant.operator Array();
910
case Variant::Type::PACKED_BYTE_ARRAY:
911
return p_variant.operator PackedByteArray();
912
case Variant::Type::PACKED_INT32_ARRAY:
913
return p_variant.operator PackedInt32Array();
914
case Variant::Type::PACKED_INT64_ARRAY:
915
return p_variant.operator PackedInt64Array();
916
case Variant::Type::PACKED_FLOAT32_ARRAY:
917
return p_variant.operator PackedFloat32Array();
918
case Variant::Type::PACKED_FLOAT64_ARRAY:
919
return p_variant.operator PackedFloat64Array();
920
case Variant::Type::PACKED_STRING_ARRAY:
921
return p_variant.operator PackedStringArray();
922
case Variant::Type::PACKED_VECTOR2_ARRAY:
923
return p_variant.operator PackedVector2Array();
924
case Variant::Type::PACKED_VECTOR3_ARRAY:
925
return p_variant.operator PackedVector3Array();
926
case Variant::Type::PACKED_COLOR_ARRAY:
927
return p_variant.operator PackedColorArray();
928
case Variant::Type::PACKED_VECTOR4_ARRAY:
929
return p_variant.operator PackedVector4Array();
930
case Variant::Type::VARIANT_MAX:
931
ERR_PRINT("Invalid type argument to type_convert(), use the TYPE_* constants. Returning the unconverted Variant.");
932
}
933
return p_variant;
934
}
935
936
String VariantUtilityFunctions::str(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
937
if (p_arg_count < 1) {
938
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
939
r_error.expected = 1;
940
return String();
941
}
942
943
r_error.error = Callable::CallError::CALL_OK;
944
945
return join_string(p_args, p_arg_count);
946
}
947
948
String VariantUtilityFunctions::error_string(Error error) {
949
if (error < 0 || error >= ERR_MAX) {
950
return String("(invalid error code)");
951
}
952
953
return String(error_names[error]);
954
}
955
956
String VariantUtilityFunctions::type_string(Variant::Type p_type) {
957
ERR_FAIL_INDEX_V_MSG((int)p_type, (int)Variant::VARIANT_MAX, "<invalid type>", "Invalid type argument to type_string(), use the TYPE_* constants.");
958
return Variant::get_type_name(p_type);
959
}
960
961
void VariantUtilityFunctions::print(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
962
print_line(join_string(p_args, p_arg_count));
963
r_error.error = Callable::CallError::CALL_OK;
964
}
965
966
void VariantUtilityFunctions::print_rich(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
967
print_line_rich(join_string(p_args, p_arg_count));
968
r_error.error = Callable::CallError::CALL_OK;
969
}
970
971
void VariantUtilityFunctions::_print_verbose(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
972
if (OS::get_singleton()->is_stdout_verbose()) {
973
// No need to use `print_verbose()` as this call already only happens
974
// when verbose mode is enabled. This avoids performing string argument concatenation
975
// when not needed.
976
print_line(join_string(p_args, p_arg_count));
977
}
978
979
r_error.error = Callable::CallError::CALL_OK;
980
}
981
982
void VariantUtilityFunctions::printerr(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
983
print_error(join_string(p_args, p_arg_count));
984
r_error.error = Callable::CallError::CALL_OK;
985
}
986
987
void VariantUtilityFunctions::printt(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
988
String s;
989
for (int i = 0; i < p_arg_count; i++) {
990
if (i) {
991
s += "\t";
992
}
993
s += p_args[i]->operator String();
994
}
995
996
print_line(s);
997
r_error.error = Callable::CallError::CALL_OK;
998
}
999
1000
void VariantUtilityFunctions::prints(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
1001
String s;
1002
for (int i = 0; i < p_arg_count; i++) {
1003
if (i) {
1004
s += " ";
1005
}
1006
s += p_args[i]->operator String();
1007
}
1008
1009
print_line(s);
1010
r_error.error = Callable::CallError::CALL_OK;
1011
}
1012
1013
void VariantUtilityFunctions::printraw(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
1014
print_raw(join_string(p_args, p_arg_count));
1015
r_error.error = Callable::CallError::CALL_OK;
1016
}
1017
1018
void VariantUtilityFunctions::push_error(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
1019
if (p_arg_count < 1) {
1020
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
1021
r_error.expected = 1;
1022
}
1023
1024
ERR_PRINT(join_string(p_args, p_arg_count));
1025
r_error.error = Callable::CallError::CALL_OK;
1026
}
1027
1028
void VariantUtilityFunctions::push_warning(const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
1029
if (p_arg_count < 1) {
1030
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
1031
r_error.expected = 1;
1032
}
1033
1034
WARN_PRINT(join_string(p_args, p_arg_count));
1035
r_error.error = Callable::CallError::CALL_OK;
1036
}
1037
1038
String VariantUtilityFunctions::var_to_str(const Variant &p_var) {
1039
String vars;
1040
VariantWriter::write_to_string(p_var, vars);
1041
return vars;
1042
}
1043
1044
Variant VariantUtilityFunctions::str_to_var(const String &p_var) {
1045
VariantParser::StreamString ss;
1046
ss.s = p_var;
1047
1048
String errs;
1049
int line;
1050
Variant ret;
1051
(void)VariantParser::parse(&ss, ret, errs, line);
1052
1053
return ret;
1054
}
1055
1056
PackedByteArray VariantUtilityFunctions::var_to_bytes(const Variant &p_var) {
1057
int len;
1058
Error err = encode_variant(p_var, nullptr, len, false);
1059
if (err != OK) {
1060
return PackedByteArray();
1061
}
1062
1063
PackedByteArray barr;
1064
barr.resize(len);
1065
{
1066
uint8_t *w = barr.ptrw();
1067
err = encode_variant(p_var, w, len, false);
1068
if (err != OK) {
1069
return PackedByteArray();
1070
}
1071
}
1072
1073
return barr;
1074
}
1075
1076
PackedByteArray VariantUtilityFunctions::var_to_bytes_with_objects(const Variant &p_var) {
1077
int len;
1078
Error err = encode_variant(p_var, nullptr, len, true);
1079
if (err != OK) {
1080
return PackedByteArray();
1081
}
1082
1083
PackedByteArray barr;
1084
barr.resize(len);
1085
{
1086
uint8_t *w = barr.ptrw();
1087
err = encode_variant(p_var, w, len, true);
1088
if (err != OK) {
1089
return PackedByteArray();
1090
}
1091
}
1092
1093
return barr;
1094
}
1095
1096
Variant VariantUtilityFunctions::bytes_to_var(const PackedByteArray &p_arr) {
1097
Variant ret;
1098
{
1099
const uint8_t *r = p_arr.ptr();
1100
Error err = decode_variant(ret, r, p_arr.size(), nullptr, false);
1101
if (err != OK) {
1102
return Variant();
1103
}
1104
}
1105
return ret;
1106
}
1107
1108
Variant VariantUtilityFunctions::bytes_to_var_with_objects(const PackedByteArray &p_arr) {
1109
Variant ret;
1110
{
1111
const uint8_t *r = p_arr.ptr();
1112
Error err = decode_variant(ret, r, p_arr.size(), nullptr, true);
1113
if (err != OK) {
1114
return Variant();
1115
}
1116
}
1117
return ret;
1118
}
1119
1120
int64_t VariantUtilityFunctions::hash(const Variant &p_arr) {
1121
return p_arr.hash();
1122
}
1123
1124
Object *VariantUtilityFunctions::instance_from_id(int64_t p_id) {
1125
ObjectID id = ObjectID((uint64_t)p_id);
1126
Object *ret = ObjectDB::get_instance(id);
1127
return ret;
1128
}
1129
1130
bool VariantUtilityFunctions::is_instance_id_valid(int64_t p_id) {
1131
return ObjectDB::get_instance(ObjectID((uint64_t)p_id)) != nullptr;
1132
}
1133
1134
bool VariantUtilityFunctions::is_instance_valid(const Variant &p_instance) {
1135
if (p_instance.get_type() != Variant::OBJECT) {
1136
return false;
1137
}
1138
return p_instance.get_validated_object() != nullptr;
1139
}
1140
1141
uint64_t VariantUtilityFunctions::rid_allocate_id() {
1142
return RID_AllocBase::_gen_id();
1143
}
1144
1145
RID VariantUtilityFunctions::rid_from_int64(uint64_t p_base) {
1146
return RID::from_uint64(p_base);
1147
}
1148
1149
bool VariantUtilityFunctions::is_same(const Variant &p_a, const Variant &p_b) {
1150
return p_a.identity_compare(p_b);
1151
}
1152
1153
String VariantUtilityFunctions::join_string(const Variant **p_args, int p_arg_count) {
1154
String s;
1155
for (int i = 0; i < p_arg_count; i++) {
1156
String os = p_args[i]->operator String();
1157
s += os;
1158
}
1159
return s;
1160
}
1161
1162
#ifdef DEBUG_ENABLED
1163
#define VCALLR *ret = p_func(VariantCasterAndValidate<P>::cast(p_args, Is, r_error)...)
1164
#define VCALL p_func(VariantCasterAndValidate<P>::cast(p_args, Is, r_error)...)
1165
#else
1166
#define VCALLR *ret = p_func(VariantCaster<P>::cast(*p_args[Is])...)
1167
#define VCALL p_func(VariantCaster<P>::cast(*p_args[Is])...)
1168
#endif // DEBUG_ENABLED
1169
1170
template <typename R, typename... P, size_t... Is>
1171
static _FORCE_INLINE_ void call_helperpr(R (*p_func)(P...), Variant *ret, const Variant **p_args, Callable::CallError &r_error, IndexSequence<Is...>) {
1172
r_error.error = Callable::CallError::CALL_OK;
1173
VCALLR;
1174
(void)p_args; // avoid gcc warning
1175
(void)r_error;
1176
}
1177
1178
template <typename R, typename... P, size_t... Is>
1179
static _FORCE_INLINE_ void validated_call_helperpr(R (*p_func)(P...), Variant *ret, const Variant **p_args, IndexSequence<Is...>) {
1180
*ret = p_func(VariantCaster<P>::cast(*p_args[Is])...);
1181
(void)p_args;
1182
}
1183
1184
template <typename R, typename... P, size_t... Is>
1185
static _FORCE_INLINE_ void ptr_call_helperpr(R (*p_func)(P...), void *ret, const void **p_args, IndexSequence<Is...>) {
1186
PtrToArg<R>::encode(p_func(PtrToArg<P>::convert(p_args[Is])...), ret);
1187
(void)p_args;
1188
}
1189
1190
template <typename R, typename... P>
1191
static _FORCE_INLINE_ void call_helperr(R (*p_func)(P...), Variant *ret, const Variant **p_args, Callable::CallError &r_error) {
1192
call_helperpr(p_func, ret, p_args, r_error, BuildIndexSequence<sizeof...(P)>{});
1193
}
1194
1195
template <typename R, typename... P>
1196
static _FORCE_INLINE_ void validated_call_helperr(R (*p_func)(P...), Variant *ret, const Variant **p_args) {
1197
validated_call_helperpr(p_func, ret, p_args, BuildIndexSequence<sizeof...(P)>{});
1198
}
1199
1200
template <typename R, typename... P>
1201
static _FORCE_INLINE_ void ptr_call_helperr(R (*p_func)(P...), void *ret, const void **p_args) {
1202
ptr_call_helperpr(p_func, ret, p_args, BuildIndexSequence<sizeof...(P)>{});
1203
}
1204
1205
template <typename R, typename... P>
1206
static _FORCE_INLINE_ int get_arg_count_helperr(R (*p_func)(P...)) {
1207
return sizeof...(P);
1208
}
1209
1210
template <typename R, typename... P>
1211
static _FORCE_INLINE_ Variant::Type get_arg_type_helperr(R (*p_func)(P...), int p_arg) {
1212
return call_get_argument_type<P...>(p_arg);
1213
}
1214
1215
template <typename R, typename... P>
1216
static _FORCE_INLINE_ Variant::Type get_ret_type_helperr(R (*p_func)(P...)) {
1217
return GetTypeInfo<R>::VARIANT_TYPE;
1218
}
1219
1220
// WITHOUT RET
1221
1222
template <typename... P, size_t... Is>
1223
static _FORCE_INLINE_ void call_helperp(void (*p_func)(P...), const Variant **p_args, Callable::CallError &r_error, IndexSequence<Is...>) {
1224
r_error.error = Callable::CallError::CALL_OK;
1225
VCALL;
1226
(void)p_args;
1227
(void)r_error;
1228
}
1229
1230
template <typename... P, size_t... Is>
1231
static _FORCE_INLINE_ void validated_call_helperp(void (*p_func)(P...), const Variant **p_args, IndexSequence<Is...>) {
1232
p_func(VariantCaster<P>::cast(*p_args[Is])...);
1233
(void)p_args;
1234
}
1235
1236
template <typename... P, size_t... Is>
1237
static _FORCE_INLINE_ void ptr_call_helperp(void (*p_func)(P...), const void **p_args, IndexSequence<Is...>) {
1238
p_func(PtrToArg<P>::convert(p_args[Is])...);
1239
(void)p_args;
1240
}
1241
1242
template <typename... P>
1243
static _FORCE_INLINE_ void call_helper(void (*p_func)(P...), const Variant **p_args, Callable::CallError &r_error) {
1244
call_helperp(p_func, p_args, r_error, BuildIndexSequence<sizeof...(P)>{});
1245
}
1246
1247
template <typename... P>
1248
static _FORCE_INLINE_ void validated_call_helper(void (*p_func)(P...), const Variant **p_args) {
1249
validated_call_helperp(p_func, p_args, BuildIndexSequence<sizeof...(P)>{});
1250
}
1251
1252
template <typename... P>
1253
static _FORCE_INLINE_ void ptr_call_helper(void (*p_func)(P...), const void **p_args) {
1254
ptr_call_helperp(p_func, p_args, BuildIndexSequence<sizeof...(P)>{});
1255
}
1256
1257
template <typename... P>
1258
static _FORCE_INLINE_ int get_arg_count_helper(void (*p_func)(P...)) {
1259
return sizeof...(P);
1260
}
1261
1262
template <typename... P>
1263
static _FORCE_INLINE_ Variant::Type get_arg_type_helper(void (*p_func)(P...), int p_arg) {
1264
return call_get_argument_type<P...>(p_arg);
1265
}
1266
1267
template <typename... P>
1268
static _FORCE_INLINE_ Variant::Type get_ret_type_helper(void (*p_func)(P...)) {
1269
return Variant::NIL;
1270
}
1271
1272
#define FUNCBINDR(m_func, m_args, m_category) \
1273
class Func_##m_func { \
1274
public: \
1275
static void call(Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { \
1276
call_helperr(VariantUtilityFunctions::m_func, r_ret, p_args, r_error); \
1277
} \
1278
static void validated_call(Variant *r_ret, const Variant **p_args, int p_argcount) { \
1279
validated_call_helperr(VariantUtilityFunctions::m_func, r_ret, p_args); \
1280
} \
1281
static void ptrcall(void *ret, const void **p_args, int p_argcount) { \
1282
ptr_call_helperr(VariantUtilityFunctions::m_func, ret, p_args); \
1283
} \
1284
static int get_argument_count() { \
1285
return get_arg_count_helperr(VariantUtilityFunctions::m_func); \
1286
} \
1287
static Variant::Type get_argument_type(int p_arg) { \
1288
return get_arg_type_helperr(VariantUtilityFunctions::m_func, p_arg); \
1289
} \
1290
static Variant::Type get_return_type() { \
1291
return get_ret_type_helperr(VariantUtilityFunctions::m_func); \
1292
} \
1293
static bool has_return_type() { \
1294
return true; \
1295
} \
1296
static bool is_vararg() { \
1297
return false; \
1298
} \
1299
static Variant::UtilityFunctionType get_type() { \
1300
return m_category; \
1301
} \
1302
}; \
1303
register_utility_function<Func_##m_func>(#m_func, m_args)
1304
1305
#define FUNCBINDVR(m_func, m_args, m_category) \
1306
class Func_##m_func { \
1307
public: \
1308
static void call(Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { \
1309
r_error.error = Callable::CallError::CALL_OK; \
1310
*r_ret = VariantUtilityFunctions::m_func(*p_args[0], r_error); \
1311
} \
1312
static void validated_call(Variant *r_ret, const Variant **p_args, int p_argcount) { \
1313
Callable::CallError ce; \
1314
*r_ret = VariantUtilityFunctions::m_func(*p_args[0], ce); \
1315
} \
1316
static void ptrcall(void *ret, const void **p_args, int p_argcount) { \
1317
Callable::CallError ce; \
1318
PtrToArg<Variant>::encode(VariantUtilityFunctions::m_func(PtrToArg<Variant>::convert(p_args[0]), ce), ret); \
1319
} \
1320
static int get_argument_count() { \
1321
return 1; \
1322
} \
1323
static Variant::Type get_argument_type(int p_arg) { \
1324
return Variant::NIL; \
1325
} \
1326
static Variant::Type get_return_type() { \
1327
return Variant::NIL; \
1328
} \
1329
static bool has_return_type() { \
1330
return true; \
1331
} \
1332
static bool is_vararg() { \
1333
return false; \
1334
} \
1335
static Variant::UtilityFunctionType get_type() { \
1336
return m_category; \
1337
} \
1338
}; \
1339
register_utility_function<Func_##m_func>(#m_func, m_args)
1340
1341
#define FUNCBINDVR2(m_func, m_args, m_category) \
1342
class Func_##m_func { \
1343
public: \
1344
static void call(Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { \
1345
r_error.error = Callable::CallError::CALL_OK; \
1346
*r_ret = VariantUtilityFunctions::m_func(*p_args[0], *p_args[1], r_error); \
1347
} \
1348
static void validated_call(Variant *r_ret, const Variant **p_args, int p_argcount) { \
1349
Callable::CallError ce; \
1350
*r_ret = VariantUtilityFunctions::m_func(*p_args[0], *p_args[1], ce); \
1351
} \
1352
static void ptrcall(void *ret, const void **p_args, int p_argcount) { \
1353
Callable::CallError ce; \
1354
Variant r; \
1355
r = VariantUtilityFunctions::m_func(PtrToArg<Variant>::convert(p_args[0]), PtrToArg<Variant>::convert(p_args[1]), ce); \
1356
PtrToArg<Variant>::encode(r, ret); \
1357
} \
1358
static int get_argument_count() { \
1359
return 2; \
1360
} \
1361
static Variant::Type get_argument_type(int p_arg) { \
1362
return Variant::NIL; \
1363
} \
1364
static Variant::Type get_return_type() { \
1365
return Variant::NIL; \
1366
} \
1367
static bool has_return_type() { \
1368
return true; \
1369
} \
1370
static bool is_vararg() { \
1371
return false; \
1372
} \
1373
static Variant::UtilityFunctionType get_type() { \
1374
return m_category; \
1375
} \
1376
}; \
1377
register_utility_function<Func_##m_func>(#m_func, m_args)
1378
1379
#define FUNCBINDVR3(m_func, m_args, m_category) \
1380
class Func_##m_func { \
1381
public: \
1382
static void call(Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { \
1383
r_error.error = Callable::CallError::CALL_OK; \
1384
*r_ret = VariantUtilityFunctions::m_func(*p_args[0], *p_args[1], *p_args[2], r_error); \
1385
} \
1386
static void validated_call(Variant *r_ret, const Variant **p_args, int p_argcount) { \
1387
Callable::CallError ce; \
1388
*r_ret = VariantUtilityFunctions::m_func(*p_args[0], *p_args[1], *p_args[2], ce); \
1389
} \
1390
static void ptrcall(void *ret, const void **p_args, int p_argcount) { \
1391
Callable::CallError ce; \
1392
Variant r; \
1393
r = VariantUtilityFunctions::m_func(PtrToArg<Variant>::convert(p_args[0]), PtrToArg<Variant>::convert(p_args[1]), PtrToArg<Variant>::convert(p_args[2]), ce); \
1394
PtrToArg<Variant>::encode(r, ret); \
1395
} \
1396
static int get_argument_count() { \
1397
return 3; \
1398
} \
1399
static Variant::Type get_argument_type(int p_arg) { \
1400
return Variant::NIL; \
1401
} \
1402
static Variant::Type get_return_type() { \
1403
return Variant::NIL; \
1404
} \
1405
static bool has_return_type() { \
1406
return true; \
1407
} \
1408
static bool is_vararg() { \
1409
return false; \
1410
} \
1411
static Variant::UtilityFunctionType get_type() { \
1412
return m_category; \
1413
} \
1414
}; \
1415
register_utility_function<Func_##m_func>(#m_func, m_args)
1416
1417
#define FUNCBINDVARARG(m_func, m_args, m_category) \
1418
class Func_##m_func { \
1419
public: \
1420
static void call(Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { \
1421
r_error.error = Callable::CallError::CALL_OK; \
1422
*r_ret = VariantUtilityFunctions::m_func(p_args, p_argcount, r_error); \
1423
} \
1424
static void validated_call(Variant *r_ret, const Variant **p_args, int p_argcount) { \
1425
Callable::CallError c; \
1426
*r_ret = VariantUtilityFunctions::m_func(p_args, p_argcount, c); \
1427
} \
1428
static void ptrcall(void *ret, const void **p_args, int p_argcount) { \
1429
Vector<Variant> args; \
1430
for (int i = 0; i < p_argcount; i++) { \
1431
args.push_back(PtrToArg<Variant>::convert(p_args[i])); \
1432
} \
1433
Vector<const Variant *> argsp; \
1434
for (int i = 0; i < p_argcount; i++) { \
1435
argsp.push_back(&args[i]); \
1436
} \
1437
Variant r; \
1438
validated_call(&r, (const Variant **)argsp.ptr(), p_argcount); \
1439
PtrToArg<Variant>::encode(r, ret); \
1440
} \
1441
static int get_argument_count() { \
1442
return 2; \
1443
} \
1444
static Variant::Type get_argument_type(int p_arg) { \
1445
return Variant::NIL; \
1446
} \
1447
static Variant::Type get_return_type() { \
1448
return Variant::NIL; \
1449
} \
1450
static bool has_return_type() { \
1451
return true; \
1452
} \
1453
static bool is_vararg() { \
1454
return true; \
1455
} \
1456
static Variant::UtilityFunctionType get_type() { \
1457
return m_category; \
1458
} \
1459
}; \
1460
register_utility_function<Func_##m_func>(#m_func, m_args)
1461
1462
#define FUNCBINDVARARGS(m_func, m_args, m_category) \
1463
class Func_##m_func { \
1464
public: \
1465
static void call(Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { \
1466
r_error.error = Callable::CallError::CALL_OK; \
1467
*r_ret = VariantUtilityFunctions::m_func(p_args, p_argcount, r_error); \
1468
} \
1469
static void validated_call(Variant *r_ret, const Variant **p_args, int p_argcount) { \
1470
Callable::CallError c; \
1471
*r_ret = VariantUtilityFunctions::m_func(p_args, p_argcount, c); \
1472
} \
1473
static void ptrcall(void *ret, const void **p_args, int p_argcount) { \
1474
Vector<Variant> args; \
1475
for (int i = 0; i < p_argcount; i++) { \
1476
args.push_back(PtrToArg<Variant>::convert(p_args[i])); \
1477
} \
1478
Vector<const Variant *> argsp; \
1479
for (int i = 0; i < p_argcount; i++) { \
1480
argsp.push_back(&args[i]); \
1481
} \
1482
Variant r; \
1483
validated_call(&r, (const Variant **)argsp.ptr(), p_argcount); \
1484
PtrToArg<String>::encode(r.operator String(), ret); \
1485
} \
1486
static int get_argument_count() { \
1487
return 1; \
1488
} \
1489
static Variant::Type get_argument_type(int p_arg) { \
1490
return Variant::NIL; \
1491
} \
1492
static Variant::Type get_return_type() { \
1493
return Variant::STRING; \
1494
} \
1495
static bool has_return_type() { \
1496
return true; \
1497
} \
1498
static bool is_vararg() { \
1499
return true; \
1500
} \
1501
static Variant::UtilityFunctionType get_type() { \
1502
return m_category; \
1503
} \
1504
}; \
1505
register_utility_function<Func_##m_func>(#m_func, m_args)
1506
1507
#define FUNCBINDVARARGV_CNAME(m_func, m_func_cname, m_args, m_category) \
1508
class Func_##m_func { \
1509
public: \
1510
static void call(Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { \
1511
r_error.error = Callable::CallError::CALL_OK; \
1512
VariantUtilityFunctions::m_func_cname(p_args, p_argcount, r_error); \
1513
} \
1514
static void validated_call(Variant *r_ret, const Variant **p_args, int p_argcount) { \
1515
Callable::CallError c; \
1516
VariantUtilityFunctions::m_func_cname(p_args, p_argcount, c); \
1517
} \
1518
static void ptrcall(void *ret, const void **p_args, int p_argcount) { \
1519
Vector<Variant> args; \
1520
for (int i = 0; i < p_argcount; i++) { \
1521
args.push_back(PtrToArg<Variant>::convert(p_args[i])); \
1522
} \
1523
Vector<const Variant *> argsp; \
1524
for (int i = 0; i < p_argcount; i++) { \
1525
argsp.push_back(&args[i]); \
1526
} \
1527
Variant r; \
1528
validated_call(&r, (const Variant **)argsp.ptr(), p_argcount); \
1529
} \
1530
static int get_argument_count() { \
1531
return 1; \
1532
} \
1533
static Variant::Type get_argument_type(int p_arg) { \
1534
return Variant::NIL; \
1535
} \
1536
static Variant::Type get_return_type() { \
1537
return Variant::NIL; \
1538
} \
1539
static bool has_return_type() { \
1540
return false; \
1541
} \
1542
static bool is_vararg() { \
1543
return true; \
1544
} \
1545
static Variant::UtilityFunctionType get_type() { \
1546
return m_category; \
1547
} \
1548
}; \
1549
register_utility_function<Func_##m_func>(#m_func, m_args)
1550
1551
#define FUNCBINDVARARGV(m_func, m_args, m_category) FUNCBINDVARARGV_CNAME(m_func, m_func, m_args, m_category)
1552
1553
#define FUNCBIND(m_func, m_args, m_category) \
1554
class Func_##m_func { \
1555
public: \
1556
static void call(Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { \
1557
call_helper(VariantUtilityFunctions::m_func, p_args, r_error); \
1558
} \
1559
static void validated_call(Variant *r_ret, const Variant **p_args, int p_argcount) { \
1560
validated_call_helper(VariantUtilityFunctions::m_func, p_args); \
1561
} \
1562
static void ptrcall(void *ret, const void **p_args, int p_argcount) { \
1563
ptr_call_helper(VariantUtilityFunctions::m_func, p_args); \
1564
} \
1565
static int get_argument_count() { \
1566
return get_arg_count_helper(VariantUtilityFunctions::m_func); \
1567
} \
1568
static Variant::Type get_argument_type(int p_arg) { \
1569
return get_arg_type_helper(VariantUtilityFunctions::m_func, p_arg); \
1570
} \
1571
static Variant::Type get_return_type() { \
1572
return get_ret_type_helper(VariantUtilityFunctions::m_func); \
1573
} \
1574
static bool has_return_type() { \
1575
return false; \
1576
} \
1577
static bool is_vararg() { \
1578
return false; \
1579
} \
1580
static Variant::UtilityFunctionType get_type() { \
1581
return m_category; \
1582
} \
1583
}; \
1584
register_utility_function<Func_##m_func>(#m_func, m_args)
1585
1586
struct VariantUtilityFunctionInfo {
1587
void (*call_utility)(Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) = nullptr;
1588
Variant::ValidatedUtilityFunction validated_call_utility = nullptr;
1589
Variant::PTRUtilityFunction ptr_call_utility = nullptr;
1590
Vector<String> argnames;
1591
bool is_vararg = false;
1592
bool returns_value = false;
1593
int argcount = 0;
1594
Variant::Type (*get_arg_type)(int) = nullptr;
1595
Variant::Type return_type;
1596
Variant::UtilityFunctionType type;
1597
};
1598
1599
static AHashMap<StringName, VariantUtilityFunctionInfo> utility_function_table;
1600
static List<StringName> utility_function_name_table;
1601
1602
template <typename T>
1603
static void register_utility_function(const String &p_name, const Vector<String> &argnames) {
1604
String name = p_name;
1605
if (name.begins_with("_")) {
1606
name = name.substr(1);
1607
}
1608
StringName sname = name;
1609
ERR_FAIL_COND(utility_function_table.has(sname));
1610
1611
VariantUtilityFunctionInfo bfi;
1612
bfi.call_utility = T::call;
1613
bfi.validated_call_utility = T::validated_call;
1614
bfi.ptr_call_utility = T::ptrcall;
1615
bfi.is_vararg = T::is_vararg();
1616
bfi.argnames = argnames;
1617
bfi.argcount = T::get_argument_count();
1618
if (!bfi.is_vararg) {
1619
ERR_FAIL_COND_MSG(argnames.size() != bfi.argcount, vformat("Wrong number of arguments binding utility function: '%s'.", name));
1620
}
1621
bfi.get_arg_type = T::get_argument_type;
1622
bfi.return_type = T::get_return_type();
1623
bfi.type = T::get_type();
1624
bfi.returns_value = T::has_return_type();
1625
1626
utility_function_table.insert(sname, bfi);
1627
utility_function_name_table.push_back(sname);
1628
}
1629
1630
void Variant::_register_variant_utility_functions() {
1631
// Math
1632
1633
FUNCBINDR(sin, sarray("angle_rad"), Variant::UTILITY_FUNC_TYPE_MATH);
1634
FUNCBINDR(cos, sarray("angle_rad"), Variant::UTILITY_FUNC_TYPE_MATH);
1635
FUNCBINDR(tan, sarray("angle_rad"), Variant::UTILITY_FUNC_TYPE_MATH);
1636
1637
FUNCBINDR(sinh, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1638
FUNCBINDR(cosh, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1639
FUNCBINDR(tanh, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1640
1641
FUNCBINDR(asin, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1642
FUNCBINDR(acos, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1643
FUNCBINDR(atan, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1644
1645
FUNCBINDR(atan2, sarray("y", "x"), Variant::UTILITY_FUNC_TYPE_MATH);
1646
1647
FUNCBINDR(asinh, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1648
FUNCBINDR(acosh, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1649
FUNCBINDR(atanh, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1650
1651
FUNCBINDR(sqrt, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1652
FUNCBINDR(fmod, sarray("x", "y"), Variant::UTILITY_FUNC_TYPE_MATH);
1653
FUNCBINDR(fposmod, sarray("x", "y"), Variant::UTILITY_FUNC_TYPE_MATH);
1654
FUNCBINDR(posmod, sarray("x", "y"), Variant::UTILITY_FUNC_TYPE_MATH);
1655
1656
FUNCBINDVR(floor, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1657
FUNCBINDR(floorf, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1658
FUNCBINDR(floori, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1659
1660
FUNCBINDVR(ceil, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1661
FUNCBINDR(ceilf, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1662
FUNCBINDR(ceili, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1663
1664
FUNCBINDVR(round, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1665
FUNCBINDR(roundf, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1666
FUNCBINDR(roundi, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1667
1668
FUNCBINDVR(abs, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1669
FUNCBINDR(absf, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1670
FUNCBINDR(absi, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1671
1672
FUNCBINDVR(sign, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1673
FUNCBINDR(signf, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1674
FUNCBINDR(signi, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1675
1676
FUNCBINDVR2(snapped, sarray("x", "step"), Variant::UTILITY_FUNC_TYPE_MATH);
1677
FUNCBINDR(snappedf, sarray("x", "step"), Variant::UTILITY_FUNC_TYPE_MATH);
1678
FUNCBINDR(snappedi, sarray("x", "step"), Variant::UTILITY_FUNC_TYPE_MATH);
1679
1680
FUNCBINDR(pow, sarray("base", "exp"), Variant::UTILITY_FUNC_TYPE_MATH);
1681
FUNCBINDR(log, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1682
FUNCBINDR(exp, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1683
1684
FUNCBINDR(is_nan, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1685
FUNCBINDR(is_inf, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1686
1687
FUNCBINDR(is_equal_approx, sarray("a", "b"), Variant::UTILITY_FUNC_TYPE_MATH);
1688
FUNCBINDR(is_zero_approx, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1689
FUNCBINDR(is_finite, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1690
1691
FUNCBINDR(ease, sarray("x", "curve"), Variant::UTILITY_FUNC_TYPE_MATH);
1692
FUNCBINDR(step_decimals, sarray("x"), Variant::UTILITY_FUNC_TYPE_MATH);
1693
1694
FUNCBINDVR3(lerp, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
1695
FUNCBINDR(lerpf, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
1696
FUNCBINDR(cubic_interpolate, sarray("from", "to", "pre", "post", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
1697
FUNCBINDR(cubic_interpolate_angle, sarray("from", "to", "pre", "post", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
1698
FUNCBINDR(cubic_interpolate_in_time, sarray("from", "to", "pre", "post", "weight", "to_t", "pre_t", "post_t"), Variant::UTILITY_FUNC_TYPE_MATH);
1699
FUNCBINDR(cubic_interpolate_angle_in_time, sarray("from", "to", "pre", "post", "weight", "to_t", "pre_t", "post_t"), Variant::UTILITY_FUNC_TYPE_MATH);
1700
FUNCBINDR(bezier_interpolate, sarray("start", "control_1", "control_2", "end", "t"), Variant::UTILITY_FUNC_TYPE_MATH);
1701
FUNCBINDR(bezier_derivative, sarray("start", "control_1", "control_2", "end", "t"), Variant::UTILITY_FUNC_TYPE_MATH);
1702
FUNCBINDR(angle_difference, sarray("from", "to"), Variant::UTILITY_FUNC_TYPE_MATH);
1703
FUNCBINDR(lerp_angle, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
1704
FUNCBINDR(inverse_lerp, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH);
1705
FUNCBINDR(remap, sarray("value", "istart", "istop", "ostart", "ostop"), Variant::UTILITY_FUNC_TYPE_MATH);
1706
1707
FUNCBINDR(smoothstep, sarray("from", "to", "x"), Variant::UTILITY_FUNC_TYPE_MATH);
1708
FUNCBINDR(move_toward, sarray("from", "to", "delta"), Variant::UTILITY_FUNC_TYPE_MATH);
1709
FUNCBINDR(rotate_toward, sarray("from", "to", "delta"), Variant::UTILITY_FUNC_TYPE_MATH);
1710
1711
FUNCBINDR(deg_to_rad, sarray("deg"), Variant::UTILITY_FUNC_TYPE_MATH);
1712
FUNCBINDR(rad_to_deg, sarray("rad"), Variant::UTILITY_FUNC_TYPE_MATH);
1713
FUNCBINDR(linear_to_db, sarray("lin"), Variant::UTILITY_FUNC_TYPE_MATH);
1714
FUNCBINDR(db_to_linear, sarray("db"), Variant::UTILITY_FUNC_TYPE_MATH);
1715
1716
FUNCBINDVR3(wrap, sarray("value", "min", "max"), Variant::UTILITY_FUNC_TYPE_MATH);
1717
FUNCBINDR(wrapi, sarray("value", "min", "max"), Variant::UTILITY_FUNC_TYPE_MATH);
1718
FUNCBINDR(wrapf, sarray("value", "min", "max"), Variant::UTILITY_FUNC_TYPE_MATH);
1719
1720
FUNCBINDVARARG(max, sarray(), Variant::UTILITY_FUNC_TYPE_MATH);
1721
FUNCBINDR(maxi, sarray("a", "b"), Variant::UTILITY_FUNC_TYPE_MATH);
1722
FUNCBINDR(maxf, sarray("a", "b"), Variant::UTILITY_FUNC_TYPE_MATH);
1723
1724
FUNCBINDVARARG(min, sarray(), Variant::UTILITY_FUNC_TYPE_MATH);
1725
FUNCBINDR(mini, sarray("a", "b"), Variant::UTILITY_FUNC_TYPE_MATH);
1726
FUNCBINDR(minf, sarray("a", "b"), Variant::UTILITY_FUNC_TYPE_MATH);
1727
1728
FUNCBINDVR3(clamp, sarray("value", "min", "max"), Variant::UTILITY_FUNC_TYPE_MATH);
1729
FUNCBINDR(clampi, sarray("value", "min", "max"), Variant::UTILITY_FUNC_TYPE_MATH);
1730
FUNCBINDR(clampf, sarray("value", "min", "max"), Variant::UTILITY_FUNC_TYPE_MATH);
1731
1732
FUNCBINDR(nearest_po2, sarray("value"), Variant::UTILITY_FUNC_TYPE_MATH);
1733
FUNCBINDR(pingpong, sarray("value", "length"), Variant::UTILITY_FUNC_TYPE_MATH);
1734
1735
// Random
1736
1737
FUNCBIND(randomize, sarray(), Variant::UTILITY_FUNC_TYPE_RANDOM);
1738
FUNCBINDR(randi, sarray(), Variant::UTILITY_FUNC_TYPE_RANDOM);
1739
FUNCBINDR(randf, sarray(), Variant::UTILITY_FUNC_TYPE_RANDOM);
1740
FUNCBINDR(randi_range, sarray("from", "to"), Variant::UTILITY_FUNC_TYPE_RANDOM);
1741
FUNCBINDR(randf_range, sarray("from", "to"), Variant::UTILITY_FUNC_TYPE_RANDOM);
1742
FUNCBINDR(randfn, sarray("mean", "deviation"), Variant::UTILITY_FUNC_TYPE_RANDOM);
1743
FUNCBIND(seed, sarray("base"), Variant::UTILITY_FUNC_TYPE_RANDOM);
1744
FUNCBINDR(rand_from_seed, sarray("seed"), Variant::UTILITY_FUNC_TYPE_RANDOM);
1745
1746
// Utility
1747
1748
FUNCBINDVR(weakref, sarray("obj"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1749
FUNCBINDR(_typeof, sarray("variable"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1750
FUNCBINDR(type_convert, sarray("variant", "type"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1751
FUNCBINDVARARGS(str, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1752
FUNCBINDR(error_string, sarray("error"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1753
FUNCBINDR(type_string, sarray("type"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1754
FUNCBINDVARARGV(print, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1755
FUNCBINDVARARGV(print_rich, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1756
FUNCBINDVARARGV(printerr, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1757
FUNCBINDVARARGV(printt, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1758
FUNCBINDVARARGV(prints, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1759
FUNCBINDVARARGV(printraw, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1760
FUNCBINDVARARGV_CNAME(print_verbose, _print_verbose, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1761
FUNCBINDVARARGV(push_error, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1762
FUNCBINDVARARGV(push_warning, sarray(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1763
1764
FUNCBINDR(var_to_str, sarray("variable"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1765
FUNCBINDR(str_to_var, sarray("string"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1766
1767
FUNCBINDR(var_to_bytes, sarray("variable"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1768
FUNCBINDR(bytes_to_var, sarray("bytes"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1769
1770
FUNCBINDR(var_to_bytes_with_objects, sarray("variable"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1771
FUNCBINDR(bytes_to_var_with_objects, sarray("bytes"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1772
1773
FUNCBINDR(hash, sarray("variable"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1774
1775
FUNCBINDR(instance_from_id, sarray("instance_id"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1776
FUNCBINDR(is_instance_id_valid, sarray("id"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1777
FUNCBINDR(is_instance_valid, sarray("instance"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1778
1779
FUNCBINDR(rid_allocate_id, Vector<String>(), Variant::UTILITY_FUNC_TYPE_GENERAL);
1780
FUNCBINDR(rid_from_int64, sarray("base"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1781
1782
FUNCBINDR(is_same, sarray("a", "b"), Variant::UTILITY_FUNC_TYPE_GENERAL);
1783
}
1784
1785
void Variant::_unregister_variant_utility_functions() {
1786
utility_function_table.clear();
1787
utility_function_name_table.clear();
1788
}
1789
1790
void Variant::call_utility_function(const StringName &p_name, Variant *r_ret, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
1791
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1792
if (!bfi) {
1793
r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
1794
r_error.argument = 0;
1795
r_error.expected = 0;
1796
return;
1797
}
1798
1799
if (unlikely(!bfi->is_vararg && p_argcount < bfi->argcount)) {
1800
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
1801
r_error.expected = bfi->argcount;
1802
return;
1803
}
1804
1805
if (unlikely(!bfi->is_vararg && p_argcount > bfi->argcount)) {
1806
r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
1807
r_error.expected = bfi->argcount;
1808
return;
1809
}
1810
1811
bfi->call_utility(r_ret, p_args, p_argcount, r_error);
1812
}
1813
1814
bool Variant::has_utility_function(const StringName &p_name) {
1815
return utility_function_table.has(p_name);
1816
}
1817
1818
Variant::ValidatedUtilityFunction Variant::get_validated_utility_function(const StringName &p_name) {
1819
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1820
if (!bfi) {
1821
return nullptr;
1822
}
1823
1824
return bfi->validated_call_utility;
1825
}
1826
1827
Variant::PTRUtilityFunction Variant::get_ptr_utility_function(const StringName &p_name) {
1828
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1829
if (!bfi) {
1830
return nullptr;
1831
}
1832
1833
return bfi->ptr_call_utility;
1834
}
1835
1836
Variant::UtilityFunctionType Variant::get_utility_function_type(const StringName &p_name) {
1837
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1838
if (!bfi) {
1839
return Variant::UTILITY_FUNC_TYPE_MATH;
1840
}
1841
1842
return bfi->type;
1843
}
1844
1845
MethodInfo Variant::get_utility_function_info(const StringName &p_name) {
1846
MethodInfo info;
1847
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1848
if (bfi) {
1849
info.name = p_name;
1850
if (bfi->returns_value && bfi->return_type == Variant::NIL) {
1851
info.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
1852
}
1853
info.return_val.type = bfi->return_type;
1854
if (bfi->is_vararg) {
1855
info.flags |= METHOD_FLAG_VARARG;
1856
}
1857
for (int i = 0; i < bfi->argnames.size(); ++i) {
1858
PropertyInfo arg;
1859
arg.type = bfi->get_arg_type(i);
1860
arg.name = bfi->argnames[i];
1861
info.arguments.push_back(arg);
1862
}
1863
}
1864
return info;
1865
}
1866
1867
int Variant::get_utility_function_argument_count(const StringName &p_name) {
1868
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1869
if (!bfi) {
1870
return 0;
1871
}
1872
1873
return bfi->argcount;
1874
}
1875
1876
Variant::Type Variant::get_utility_function_argument_type(const StringName &p_name, int p_arg) {
1877
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1878
if (!bfi) {
1879
return Variant::NIL;
1880
}
1881
1882
return bfi->get_arg_type(p_arg);
1883
}
1884
1885
String Variant::get_utility_function_argument_name(const StringName &p_name, int p_arg) {
1886
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1887
if (!bfi) {
1888
return String();
1889
}
1890
ERR_FAIL_INDEX_V(p_arg, bfi->argnames.size(), String());
1891
ERR_FAIL_COND_V(bfi->is_vararg, String());
1892
return bfi->argnames[p_arg];
1893
}
1894
1895
bool Variant::has_utility_function_return_value(const StringName &p_name) {
1896
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1897
if (!bfi) {
1898
return false;
1899
}
1900
return bfi->returns_value;
1901
}
1902
1903
Variant::Type Variant::get_utility_function_return_type(const StringName &p_name) {
1904
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1905
if (!bfi) {
1906
return Variant::NIL;
1907
}
1908
1909
return bfi->return_type;
1910
}
1911
1912
bool Variant::is_utility_function_vararg(const StringName &p_name) {
1913
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1914
if (!bfi) {
1915
return false;
1916
}
1917
1918
return bfi->is_vararg;
1919
}
1920
1921
uint32_t Variant::get_utility_function_hash(const StringName &p_name) {
1922
const VariantUtilityFunctionInfo *bfi = utility_function_table.getptr(p_name);
1923
ERR_FAIL_NULL_V(bfi, 0);
1924
1925
uint32_t hash = hash_murmur3_one_32(bfi->is_vararg);
1926
hash = hash_murmur3_one_32(bfi->returns_value, hash);
1927
if (bfi->returns_value) {
1928
hash = hash_murmur3_one_32(bfi->return_type, hash);
1929
}
1930
hash = hash_murmur3_one_32(bfi->argcount, hash);
1931
for (int i = 0; i < bfi->argcount; i++) {
1932
hash = hash_murmur3_one_32(bfi->get_arg_type(i), hash);
1933
}
1934
1935
return hash_fmix32(hash);
1936
}
1937
1938
void Variant::get_utility_function_list(List<StringName> *r_functions) {
1939
for (const StringName &E : utility_function_name_table) {
1940
r_functions->push_back(E);
1941
}
1942
}
1943
1944
int Variant::get_utility_function_count() {
1945
return utility_function_name_table.size();
1946
}
1947
1948