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