Added the Solid 3.5 sources to the blender source tree.
[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         static float sqrt(float x) { return ::sqrtf(x); } 
49         static float abs(float x) { return ::fabsf(x); } 
50
51         static float cos(float x) { return ::cosf(x); } 
52         static float sin(float x) { return ::sinf(x); } 
53         static float tan(float x) { return ::tanf(x); } 
54
55         static float acos(float x) { return ::acosf(x); } 
56         static float asin(float x) { return ::asinf(x); } 
57         static float atan(float x) { return ::atanf(x); } 
58         static float atan2(float x, float y) { return ::atan2f(x, y); } 
59
60         static float exp(float x) { return ::expf(x); } 
61         static float log(float x) { return ::logf(x); } 
62         static float pow(float x, float y) { return ::powf(x, y); } 
63 };
64
65 template<>
66 struct Scalar_traits<double> {
67         static double TwoTimesPi() { return 6.283185307179586232; }
68         static double epsilon() { return DBL_EPSILON; }
69         static double max() { return DBL_MAX; }
70         
71         static double random() { return double(GEN_rand()) / double(GEN_RAND_MAX); }
72         static double sqrt(double x) { return ::sqrt(x); } 
73         static double abs(double x) { return ::fabs(x); } 
74
75         static double cos(double x) { return ::cos(x); } 
76         static double sin(double x) { return ::sin(x); } 
77         static double tan(double x) { return ::tan(x); } 
78
79         static double acos(double x) { return ::acos(x); } 
80         static double asin(double x) { return ::asin(x); } 
81         static double atan(double x) { return ::atan(x); } 
82         static double atan2(double x, double y) { return ::atan2(x, y); } 
83
84         static double exp(double x) { return ::exp(x); } 
85         static double log(double x) { return ::log(x); } 
86         static double pow(double x, double y) { return ::pow(x, y); } 
87 };
88
89 #ifdef USE_TRACER
90 #include "MT_ScalarTracer.h"
91
92 #ifdef USE_DOUBLES
93 typedef MT_ScalarTracer<double>   MT_Scalar;
94 #else
95 typedef MT_ScalarTracer<float>    MT_Scalar;
96 #endif
97
98 #else
99
100 #ifdef USE_DOUBLES
101 typedef double   MT_Scalar;
102 #else
103 typedef float    MT_Scalar;
104 #endif
105
106 #endif
107
108
109 const MT_Scalar  MT_2_PI         = Scalar_traits<MT_Scalar>::TwoTimesPi();
110 const MT_Scalar  MT_PI           = MT_2_PI * MT_Scalar(0.5);
111 const MT_Scalar  MT_HALF_PI              = MT_2_PI * MT_Scalar(0.25);
112 const MT_Scalar  MT_RADS_PER_DEG = MT_2_PI / MT_Scalar(360.0);
113 const MT_Scalar  MT_DEGS_PER_RAD = MT_Scalar(360.0) / MT_2_PI;
114
115 const MT_Scalar  MT_EPSILON      = Scalar_traits<MT_Scalar>::epsilon();
116 const MT_Scalar  MT_INFINITY     = Scalar_traits<MT_Scalar>::max();
117
118 inline MT_Scalar MT_random() { return  Scalar_traits<MT_Scalar>::random(); }
119 inline MT_Scalar MT_abs(MT_Scalar x) { return Scalar_traits<MT_Scalar>::abs(x); }
120 inline MT_Scalar MT_sqrt(MT_Scalar x) { return Scalar_traits<MT_Scalar>::sqrt(x); }
121
122 inline MT_Scalar MT_cos(MT_Scalar x) { return Scalar_traits<MT_Scalar>::cos(x); }
123 inline MT_Scalar MT_sin(MT_Scalar x) { return Scalar_traits<MT_Scalar>::sin(x); }
124 inline MT_Scalar MT_tan(MT_Scalar x) { return Scalar_traits<MT_Scalar>::tan(x); }
125
126 inline MT_Scalar MT_acos(MT_Scalar x) { return Scalar_traits<MT_Scalar>::acos(x); }
127 inline MT_Scalar MT_asin(MT_Scalar x) { return Scalar_traits<MT_Scalar>::asin(x); }
128 inline MT_Scalar MT_atan(MT_Scalar x) { return Scalar_traits<MT_Scalar>::atan(x); }
129 inline MT_Scalar MT_atan2(MT_Scalar x, MT_Scalar y) { return Scalar_traits<MT_Scalar>::atan2(x, y); }
130
131 inline MT_Scalar MT_radians(MT_Scalar x) { return x * MT_RADS_PER_DEG; }
132 inline MT_Scalar MT_degrees(MT_Scalar x) { return x * MT_DEGS_PER_RAD; }
133
134 #endif