63090d06fc0bb87f2dc16bb0fab9531f9bbedda9
[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 #include <cmath>
28
29 #undef max
30
31 #include <cstdlib>
32 #include <cfloat>
33 #include "SOLID_types.h"
34
35 #include "GEN_MinMax.h"
36 #include "GEN_random.h"
37
38 template <typename Scalar>
39 struct Scalar_traits {};
40
41 template<>
42 struct Scalar_traits<float> {
43         static float TwoTimesPi() { return 6.283185307179586232f; }
44         static float epsilon() { return FLT_EPSILON; }
45         static float max() { return FLT_MAX; }
46         
47         static float random() { return float(GEN_rand()) / float(GEN_RAND_MAX); }
48 #if defined (__sun) || defined (__sun__) || defined (__sparc) || defined (__APPLE__)
49         static float sqrt(float x) { return ::sqrt(x); } 
50         static float abs(float x) { return ::fabs(x); } 
51
52         static float cos(float x) { return ::cos(x); } 
53         static float sin(float x) { return ::sin(x); } 
54         static float tan(float x) { return ::tan(x); } 
55
56         static float acos(float x) { return ::acos(x); } 
57         static float asin(float x) { return ::asin(x); } 
58         static float atan(float x) { return ::atan(x); } 
59         static float atan2(float x, float y) { return ::atan2(x, y); } 
60
61         static float exp(float x) { return ::exp(x); } 
62         static float log(float x) { return ::log(x); } 
63         static float pow(float x, float y) { return ::pow(x, y); } 
64
65 #else
66         static float sqrt(float x) { return ::sqrtf(x); } 
67         static float abs(float x) { return ::fabsf(x); } 
68
69         static float cos(float x) { return ::cosf(x); } 
70         static float sin(float x) { return ::sinf(x); } 
71         static float tan(float x) { return ::tanf(x); } 
72
73         static float acos(float x) { return ::acosf(x); } 
74         static float asin(float x) { return ::asinf(x); } 
75         static float atan(float x) { return ::atanf(x); } 
76         static float atan2(float x, float y) { return ::atan2f(x, y); } 
77
78         static float exp(float x) { return ::expf(x); } 
79         static float log(float x) { return ::logf(x); } 
80         static float pow(float x, float y) { return ::powf(x, y); } 
81 #endif
82 };
83
84 template<>
85 struct Scalar_traits<double> {
86         static double TwoTimesPi() { return 6.283185307179586232; }
87         static double epsilon() { return DBL_EPSILON; }
88         static double max() { return DBL_MAX; }
89         
90         static double random() { return double(GEN_rand()) / double(GEN_RAND_MAX); }
91         static double sqrt(double x) { return ::sqrt(x); } 
92         static double abs(double x) { return ::fabs(x); } 
93
94         static double cos(double x) { return ::cos(x); } 
95         static double sin(double x) { return ::sin(x); } 
96         static double tan(double x) { return ::tan(x); } 
97
98         static double acos(double x) { return ::acos(x); } 
99         static double asin(double x) { return ::asin(x); } 
100         static double atan(double x) { return ::atan(x); } 
101         static double atan2(double x, double y) { return ::atan2(x, y); } 
102
103         static double exp(double x) { return ::exp(x); } 
104         static double log(double x) { return ::log(x); } 
105         static double pow(double x, double y) { return ::pow(x, y); } 
106 };
107
108 #ifdef USE_TRACER
109 #include "MT_ScalarTracer.h"
110
111 #ifdef USE_DOUBLES
112 typedef MT_ScalarTracer<double>   MT_Scalar;
113 #else
114 typedef MT_ScalarTracer<float>    MT_Scalar;
115 #endif
116
117 #else
118
119 #ifdef USE_DOUBLES
120 typedef double   MT_Scalar;
121 #else
122 typedef float    MT_Scalar;
123 #endif
124
125 #endif
126
127
128 const MT_Scalar  MT_2_PI         = Scalar_traits<MT_Scalar>::TwoTimesPi();
129 const MT_Scalar  MT_PI           = MT_2_PI * MT_Scalar(0.5);
130 const MT_Scalar  MT_HALF_PI              = MT_2_PI * MT_Scalar(0.25);
131 const MT_Scalar  MT_RADS_PER_DEG = MT_2_PI / MT_Scalar(360.0);
132 const MT_Scalar  MT_DEGS_PER_RAD = MT_Scalar(360.0) / MT_2_PI;
133
134 const MT_Scalar  MT_EPSILON      = Scalar_traits<MT_Scalar>::epsilon();
135 const MT_Scalar  MT_INFINITY     = Scalar_traits<MT_Scalar>::max();
136
137 inline MT_Scalar MT_random() { return  Scalar_traits<MT_Scalar>::random(); }
138 inline MT_Scalar MT_abs(MT_Scalar x) { return Scalar_traits<MT_Scalar>::abs(x); }
139 inline MT_Scalar MT_sqrt(MT_Scalar x) { return Scalar_traits<MT_Scalar>::sqrt(x); }
140
141 inline MT_Scalar MT_cos(MT_Scalar x) { return Scalar_traits<MT_Scalar>::cos(x); }
142 inline MT_Scalar MT_sin(MT_Scalar x) { return Scalar_traits<MT_Scalar>::sin(x); }
143 inline MT_Scalar MT_tan(MT_Scalar x) { return Scalar_traits<MT_Scalar>::tan(x); }
144
145 inline MT_Scalar MT_acos(MT_Scalar x) { return Scalar_traits<MT_Scalar>::acos(x); }
146 inline MT_Scalar MT_asin(MT_Scalar x) { return Scalar_traits<MT_Scalar>::asin(x); }
147 inline MT_Scalar MT_atan(MT_Scalar x) { return Scalar_traits<MT_Scalar>::atan(x); }
148 inline MT_Scalar MT_atan2(MT_Scalar x, MT_Scalar y) { return Scalar_traits<MT_Scalar>::atan2(x, y); }
149
150 inline MT_Scalar MT_radians(MT_Scalar x) { return x * MT_RADS_PER_DEG; }
151 inline MT_Scalar MT_degrees(MT_Scalar x) { return x * MT_DEGS_PER_RAD; }
152
153 #endif