aboutsummaryrefslogtreecommitdiff
path: root/core/math/math_funcs.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/math/math_funcs.h')
-rw-r--r--core/math/math_funcs.h180
1 files changed, 180 insertions, 0 deletions
diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h
new file mode 100644
index 000000000..6a60a7f79
--- /dev/null
+++ b/core/math/math_funcs.h
@@ -0,0 +1,180 @@
+/*************************************************************************/
+/* math_funcs.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+#ifndef MATH_FUNCS_H
+#define MATH_FUNCS_H
+
+#include "typedefs.h"
+#include "math_defs.h"
+
+#ifndef NO_MATH_H
+#include "math.h"
+#endif
+
+class Math {
+
+
+ static uint32_t default_seed;
+public:
+ Math() {}; // useless to instance
+
+ enum {
+ RANDOM_MAX=2147483647L
+ };
+
+ static double sin(double p_x);
+ static double cos(double p_x);
+ static double tan(double p_x);
+ static double sinh(double p_x);
+ static double cosh(double p_x);
+ static double tanh(double p_x);
+ static double asin(double p_x);
+ static double acos(double p_x);
+ static double atan(double p_x);
+ static double atan2(double p_y, double p_x);
+ static double deg2rad(double p_y);
+ static double rad2deg(double p_y);
+ static double sqrt(double p_x);
+ static double fmod(double p_x,double p_y);
+ static double fposmod(double p_x,double p_y);
+ static uint32_t rand_from_seed(uint32_t *seed);
+ static double floor(double p_x);
+ static double ceil(double p_x);
+ static double ease(double p_x, double p_c);
+ static int decimals(double p_step);
+ static double stepify(double p_value,double p_step);
+ static void seed(uint32_t x=0);
+ static void randomize();
+ static uint32_t larger_prime(uint32_t p_val);
+ static double dectime(double p_value,double p_amount, double p_step);
+
+
+ static inline double linear2db(double p_linear) {
+
+ return Math::log( p_linear ) * 8.6858896380650365530225783783321;
+ }
+
+ static inline double db2linear(double p_linear) {
+
+ return Math::exp( p_linear * 0.11512925464970228420089957273422 );
+ }
+
+ static bool is_nan(double p_val);
+ static bool is_inf(double p_val);
+
+
+
+ static uint32_t rand();
+ static double randf();
+
+ static double round(double p_val);
+
+ static double random(double from, double to);
+
+
+ static _FORCE_INLINE_ real_t abs(real_t g) {
+
+#ifdef REAL_T_IS_DOUBLE
+
+ return absd(g);
+#else
+
+ return absf(g);
+#endif
+ }
+
+ static _FORCE_INLINE_ float absf(float g) {
+
+ union {
+ float f;
+ uint32_t i;
+ } u;
+
+ u.f=g;
+ u.i&=2147483647u;
+ return u.f;
+ }
+
+ static _FORCE_INLINE_ double absd(double g) {
+
+ union {
+ double d;
+ uint64_t i;
+ } u;
+ u.d=g;
+ u.i&=(uint64_t)9223372036854775807ll;
+ return u.d;
+ }
+
+ //this function should be as fast as possible and rounding mode should not matter
+ static _FORCE_INLINE_ int fast_ftoi(float a) {
+
+ static int b;
+
+#if defined(_MSC_VER)
+ __asm fld a
+ __asm fistp b
+/*#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) )
+ // use AT&T inline assembly style, document that
+ // we use memory as output (=m) and input (m)
+ __asm__ __volatile__ (
+ "flds %1 \n\t"
+ "fistpl %0 \n\t"
+ : "=m" (b)
+ : "m" (a));*/
+#else
+ b=lrintf(a); //assuming everything but msvc has lrint
+#endif
+ return b;
+ }
+
+
+#if defined(__GNUC__)
+
+ static _FORCE_INLINE_ int64_t dtoll(double p_double) { return (int64_t)p_double; } ///@TODO OPTIMIZE
+#else
+
+ static _FORCE_INLINE_ int64_t dtoll(double p_double) { return (int64_t)p_double; } ///@TODO OPTIMIZE
+#endif
+
+ static _FORCE_INLINE_ float lerp(float a, float b, float c) {
+
+ return a+(b-a)*c;
+ }
+
+ static double pow(double x, double y);
+ static double log(double x);
+ static double exp(double x);
+
+};
+
+
+#define Math_PI 3.14159265358979323846
+#define Math_SQRT12 0.7071067811865475244008443621048490
+
+#endif // MATH_FUNCS_H