All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
MathFunc.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "EegeoPlatformMacros.h"
6 
7 #if defined (EEGEO_WIN)
8 #define _USE_MATH_DEFINES
9 #endif
10 
11 #include <math.h>
12 #include <float.h>
13 
14 
15 #define ARC4RANDOM_MAX 0x100000000
16 #define ARC4RANDOM_INVMAX (1.0f/(float)ARC4RANDOM_MAX)
17 
18 namespace Eegeo
19 {
20  template <typename T>
21  T Min(const T in1, const T in2)
22  {
23  if(in1 < in2)
24  {
25  return in1;
26  }
27  else
28  {
29  return in2;
30  }
31  }
32 
33  template <typename T>
34  T Max(const T in1, const T in2)
35  {
36  if(in1 > in2)
37  {
38  return in1;
39  }
40  else
41  {
42  return in2;
43  }
44  }
45 
46  template <typename T>
47  T Clamp(const T in, const T min, const T max)
48  {
49  if(in < min)
50  {
51  return min;
52  }
53  else if(in > max)
54  {
55  return max;
56  }
57  else
58  {
59  return in;
60  }
61  }
62 
63  namespace Math
64  {
65  // pi as float - use M_PI for double precision
66  const float kPI = static_cast<float>(M_PI);
67  const float kFloatMax = FLT_MAX;
68  const float kEpsilon = 0.0001f;
69 
70  inline double Deg2Rad ( double deg ) { return (deg * M_PI) / 180.0;}
71  inline double Rad2Deg ( double rad ) { return (rad * 180.0) / M_PI;}
72 
73  inline float Deg2Rad ( float deg ) { return (deg * kPI) / 180.0f;}
74  inline float Rad2Deg ( float rad ) { return (rad * 180.0f) / kPI;}
75  inline float Abs ( float x ) { return fabsf(x); }
76  inline float Sin ( float theta ) { return sinf(theta); }
77  inline float Cos ( float theta ) { return cosf(theta); }
78  inline float Tan ( float theta ) { return tanf(theta); }
79  inline float ASin ( float theta ) { return asinf(theta); }
80  inline float ACos ( float theta ) { return acosf(theta); }
81  inline float ATan ( float theta ) { return atanf(theta); }
82  inline float ATan2 ( float y, float x ) { return atan2f(y, x); }
83 
84  inline float Pow ( float x, float y ) { return powf(x, y); }
85 
86  inline float Log ( float x ) { return logf(x); }
87  inline float Exp ( float x ) { return expf(x); }
88 
89  inline float Sqrtf ( float x ) { return sqrtf(x); }
90  inline double Sqrtd ( double x ) { return sqrt(x); }
91 
92  inline float Modf ( float x, float* pI ) { return modff(x, pI); }
93 
94  float SmoothStep ( float in );
95  float SmoothStep ( float min, float max, float in );
96 
97  float SmootherStep( float in );
98  float SmootherStep( float min, float max, float in );
99 
100  inline float Clamp01(float x);
101  inline double Clamp01(double x);
102 
103  inline float SinEaseInOut(float t);
104 
105  template <typename T>
106  T Clamp(const T in, const T min, const T max)
107  {
108  return Eegeo::Clamp(in, min, max);
109  }
110 
111  template <typename T>
112  T Lerp(const T x, const T y, const T t);
113 
114  template <>
115  inline float Lerp(const float x, const float y, const float t)
116  {
117  return x * (1.0f - t) + y * t;
118  }
119 
120  template <>
121  inline double Lerp(const double x, const double y, const double t)
122  {
123  return x * (1.0 - t) + y * t;
124  }
125  }
126 
127  inline float Math::SmoothStep(float in)
128  {
129  return in * in * (3.0f - 2.0f * in);
130  }
131 
132  inline float Math::SmoothStep(float min, float max, float in)
133  {
134  in = ((in - min)/(max - min));
135 
136  if (in < 0.0f)
137  {
138  in = 0.0f;
139  }
140  else if (in > 1.0f)
141  {
142  in = 1.0f;
143  }
144 
145  return in * in * (3.0f - 2.0f * in);
146  }
147 
148  inline float Math::SmootherStep(float in)
149  {
150  return in * in * in * (in * (in * 6 - 15) + 10);
151  }
152 
153  inline float Math::SmootherStep(float min, float max, float in)
154  {
155  in = ((in - min)/(max - min));
156 
157  if (in < 0.0f)
158  {
159  in = 0.0f;
160  }
161  else if (in > 1.0f)
162  {
163  in = 1.0f;
164  }
165 
166  return in * in * in * (in * (in * 6 - 15) + 10);
167  }
168 
169  inline float Math::Clamp01(float x)
170  {
171  return Clamp(x, 0.f, 1.f);
172  }
173 
174  inline double Math::Clamp01(double x)
175  {
176  return Clamp(x, 0.0, 1.0);
177  }
178 
179  inline float Math::SinEaseInOut(float t)
180  {
181  return 1.0f - 0.5f * (1.0f + Cos(t * kPI));
182  }
183 }