Reverted incorrect merge (missing files)
[blender.git] / extern / solid / include / MT_Scalar.h
1 /*
2  * SOLID - Software Library for Interference Detection
3  * 
4  * Copyright (C) 2001-2003  Dtecta.  All rights reserved.
5  *
6  * This library may be distributed under the terms of the Q Public License
7  * (QPL) as defined by Trolltech AS of Norway and appearing in the file
8  * LICENSE.QPL included in the packaging of this file.
9  *
10  * This library may be distributed and/or modified under the terms of the
11  * GNU General Public License (GPL) version 2 as published by the Free Software
12  * Foundation and appearing in the file LICENSE.GPL included in the
13  * packaging of this file.
14  *
15  * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17  *
18  * Commercial use or any other use of this library not covered by either 
19  * the QPL or the GPL requires an additional license from Dtecta. 
20  * Please contact info@dtecta.com for enquiries about the terms of commercial
21  * use of this library.
22  */
23
24 #ifndef MT_SCALAR_H
25 #define MT_SCALAR_H
26
27 #if defined (__sun__) || defined ( __sun ) || defined (__sparc) || defined (__sparc__) || defined (__sgi)
28 #include <math.h>
29 #include <float.h>
30 #else
31 #include <cmath>
32 #include <cstdlib>
33 #include <cfloat>
34 #endif
35
36 #undef max
37
38 #include "SOLID_types.h"
39
40 #include "GEN_MinMax.h"
41 #include "GEN_random.h"
42
43 template <typename Scalar>
44 struct Scalar_traits {};
45
46 template<>
47 struct Scalar_traits<float> {
48         static float TwoTimesPi() { return 6.283185307179586232f; }
49         static float epsilon() { return FLT_EPSILON; }
50         static float max() { return FLT_MAX; }
51         
52         static float random() { return float(GEN_rand()) / float(GEN_RAND_MAX); }
53 #if defined (__sun) || defined (__sun__) || defined (__sparc) || defined (__APPLE__)
54         static float sqrt(float x) { return ::sqrt(x); } 
55         static float abs(float x) { return ::fabs(x); } 
56
57         static float cos(float x) { return ::cos(x); } 
58         static float sin(float x) { return ::sin(x); } 
59         static float tan(float x) { return ::tan(x); } 
60
61         static float acos(float x) { return ::acos(x); } 
62         static float asin(float x) { return ::asin(x); } 
63         static float atan(float x) { return ::atan(x); } 
64         static float atan2(float x, float y) { return ::atan2(x, y); } 
65
66         static float exp(float x) { return ::exp(x); } 
67         static float log(float x) { return ::log(x); } 
68         static float pow(float x, float y) { return ::pow(x, y); } 
69
70 #else
71         static float sqrt(float x) { return ::sqrtf(x); } 
72         static float abs(float x) { return ::fabsf(x); } 
73
74         static float cos(float x) { return ::cosf(x); } 
75         static float sin(float x) { return ::sinf(x); } 
76         static float tan(float x) { return ::tanf(x); } 
77
78         static float acos(float x) { return ::acosf(x); } 
79         static float asin(float x) { return ::asinf(x); } 
80         static float atan(float x) { return ::atanf(x); } 
81         static float atan2(float x, float y) { return ::atan2f(x, y); } 
82
83         static float exp(float x) { return ::expf(x); } 
84         static float log(float x) { return ::logf(x); } 
85         static float pow(float x, float y) { return ::powf(x, y); } 
86 #endif
87 };
88
89 template<>
90 struct Scalar_traits<double> {
91         static double TwoTimesPi() { return 6.283185307179586232; }
92         static double epsilon() { return DBL_EPSILON; }
93         static double max() { return DBL_MAX; }
94         
95         static double random() { return double(GEN_rand()) / double(GEN_RAND_MAX); }
96         static double sqrt(double x) { return ::sqrt(x); } 
97         static double abs(double x) { return ::fabs(x); } 
98
99         static double cos(double x) { return ::cos(x); } 
100         static double sin(double x) { return ::sin(x); } 
101         static double tan(double x) { return ::tan(x); } 
102
103         static double acos(double x) { return ::acos(x); } 
104         static double asin(double x) { return ::asin(x); } 
105         static double atan(double x) { return ::atan(x); } 
106         static double atan2(double x, double y) { return ::atan2(x, y); } 
107
108         static double exp(double x) { return ::exp(x); } 
109         static double log(double x) { return ::log(x); } 
110         static double pow(double x, double y) { return ::pow(x, y); } 
111 };
112
113 #ifdef USE_TRACER
114 #include "MT_ScalarTracer.h"
115
116 #ifdef USE_DOUBLES
117 typedef MT_ScalarTracer<double>   MT_Scalar;
118 #else
119 typedef MT_ScalarTracer<float>    MT_Scalar;
120 #endif
121
122 #else
123
124 #ifdef USE_DOUBLES
125 typedef double   MT_Scalar;
126 #else
127 typedef float    MT_Scalar;
128 #endif
129
130 #endif
131
132
133 const MT_Scalar  MT_2_PI         = Scalar_traits<MT_Scalar>::TwoTimesPi();
134 const MT_Scalar  MT_PI           = MT_2_PI * MT_Scalar(0.5);
135 const MT_Scalar  MT_HALF_PI              = MT_2_PI * MT_Scalar(0.25);
136 const MT_Scalar  MT_RADS_PER_DEG = MT_2_PI / MT_Scalar(360.0);
137 const MT_Scalar  MT_DEGS_PER_RAD = MT_Scalar(360.0) / MT_2_PI;
138
139 const MT_Scalar  MT_EPSILON      = Scalar_traits<MT_Scalar>::epsilon();
140 const MT_Scalar  MT_INFINITY     = Scalar_traits<MT_Scalar>::max();
141
142 inline MT_Scalar MT_random() { return  Scalar_traits<MT_Scalar>::random(); }
143 inline MT_Scalar MT_abs(MT_Scalar x) { return Scalar_traits<MT_Scalar>::abs(x); }
144 inline MT_Scalar MT_sqrt(MT_Scalar x) { return Scalar_traits<MT_Scalar>::sqrt(x); }
145
146 inline MT_Scalar MT_cos(MT_Scalar x) { return Scalar_traits<MT_Scalar>::cos(x); }
147 inline MT_Scalar MT_sin(MT_Scalar x) { return Scalar_traits<MT_Scalar>::sin(x); }
148 inline MT_Scalar MT_tan(MT_Scalar x) { return Scalar_traits<MT_Scalar>::tan(x); }
149
150 inline MT_Scalar MT_acos(MT_Scalar x) { return Scalar_traits<MT_Scalar>::acos(x); }
151 inline MT_Scalar MT_asin(MT_Scalar x) { return Scalar_traits<MT_Scalar>::asin(x); }
152 inline MT_Scalar MT_atan(MT_Scalar x) { return Scalar_traits<MT_Scalar>::atan(x); }
153 inline MT_Scalar MT_atan2(MT_Scalar x, MT_Scalar y) { return Scalar_traits<MT_Scalar>::atan2(x, y); }
154
155 inline MT_Scalar MT_radians(MT_Scalar x) { return x * MT_RADS_PER_DEG; }
156 inline MT_Scalar MT_degrees(MT_Scalar x) { return x * MT_DEGS_PER_RAD; }
157
158 #endif