1 | #ifndef GIM_MATH_H_INCLUDED |
---|
2 | #define GIM_MATH_H_INCLUDED |
---|
3 | /*! \file gim_math.h |
---|
4 | \author Francisco Len Nßjera |
---|
5 | */ |
---|
6 | /* |
---|
7 | ----------------------------------------------------------------------------- |
---|
8 | This source file is part of GIMPACT Library. |
---|
9 | |
---|
10 | For the latest info, see http://gimpact.sourceforge.net/ |
---|
11 | |
---|
12 | Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371. |
---|
13 | email: projectileman@yahoo.com |
---|
14 | |
---|
15 | This library is free software; you can redistribute it and/or |
---|
16 | modify it under the terms of EITHER: |
---|
17 | (1) The GNU Lesser General Public License as published by the Free |
---|
18 | Software Foundation; either version 2.1 of the License, or (at |
---|
19 | your option) any later version. The text of the GNU Lesser |
---|
20 | General Public License is included with this library in the |
---|
21 | file GIMPACT-LICENSE-LGPL.TXT. |
---|
22 | (2) The BSD-style license that is included with this library in |
---|
23 | the file GIMPACT-LICENSE-BSD.TXT. |
---|
24 | (3) The zlib/libpng license that is included with this library in |
---|
25 | the file GIMPACT-LICENSE-ZLIB.TXT. |
---|
26 | |
---|
27 | This library is distributed in the hope that it will be useful, |
---|
28 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
29 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files |
---|
30 | GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details. |
---|
31 | |
---|
32 | ----------------------------------------------------------------------------- |
---|
33 | */ |
---|
34 | |
---|
35 | #include "LinearMath/btScalar.h" |
---|
36 | |
---|
37 | |
---|
38 | |
---|
39 | #define GREAL btScalar |
---|
40 | #define GREAL2 double |
---|
41 | #define GINT int |
---|
42 | #define GUINT unsigned int |
---|
43 | #define GSHORT short |
---|
44 | #define GUSHORT unsigned short |
---|
45 | #define GINT64 long long |
---|
46 | #define GUINT64 unsigned long long |
---|
47 | |
---|
48 | |
---|
49 | |
---|
50 | #define G_PI 3.14159265358979f |
---|
51 | #define G_HALF_PI 1.5707963f |
---|
52 | //267948966 |
---|
53 | #define G_TWO_PI 6.28318530f |
---|
54 | //71795864 |
---|
55 | #define G_ROOT3 1.73205f |
---|
56 | #define G_ROOT2 1.41421f |
---|
57 | #define G_UINT_INFINITY 0xffffffff //!< A very very high value |
---|
58 | #define G_REAL_INFINITY FLT_MAX |
---|
59 | #define G_SIGN_BITMASK 0x80000000 |
---|
60 | #define G_EPSILON SIMD_EPSILON |
---|
61 | |
---|
62 | |
---|
63 | |
---|
64 | enum GIM_SCALAR_TYPES |
---|
65 | { |
---|
66 | G_STYPE_REAL =0, |
---|
67 | G_STYPE_REAL2, |
---|
68 | G_STYPE_SHORT, |
---|
69 | G_STYPE_USHORT, |
---|
70 | G_STYPE_INT, |
---|
71 | G_STYPE_UINT, |
---|
72 | G_STYPE_INT64, |
---|
73 | G_STYPE_UINT64 |
---|
74 | }; |
---|
75 | |
---|
76 | |
---|
77 | |
---|
78 | #define G_DEGTORAD(X) ((X)*3.1415926f/180.0f) |
---|
79 | #define G_RADTODEG(X) ((X)*180.0f/3.1415926f) |
---|
80 | |
---|
81 | //! Integer representation of a floating-point value. |
---|
82 | #define GIM_IR(x) ((GUINT&)(x)) |
---|
83 | |
---|
84 | //! Signed integer representation of a floating-point value. |
---|
85 | #define GIM_SIR(x) ((GINT&)(x)) |
---|
86 | |
---|
87 | //! Absolute integer representation of a floating-point value |
---|
88 | #define GIM_AIR(x) (GIM_IR(x)&0x7fffffff) |
---|
89 | |
---|
90 | //! Floating-point representation of an integer value. |
---|
91 | #define GIM_FR(x) ((GREAL&)(x)) |
---|
92 | |
---|
93 | #define GIM_MAX(a,b) (a<b?b:a) |
---|
94 | #define GIM_MIN(a,b) (a>b?b:a) |
---|
95 | |
---|
96 | #define GIM_MAX3(a,b,c) GIM_MAX(a,GIM_MAX(b,c)) |
---|
97 | #define GIM_MIN3(a,b,c) GIM_MIN(a,GIM_MIN(b,c)) |
---|
98 | |
---|
99 | #define GIM_IS_ZERO(value) (value < G_EPSILON && value > -G_EPSILON) |
---|
100 | |
---|
101 | #define GIM_IS_NEGATIVE(value) (value <= -G_EPSILON) |
---|
102 | |
---|
103 | #define GIM_IS_POSISITVE(value) (value >= G_EPSILON) |
---|
104 | |
---|
105 | #define GIM_NEAR_EQUAL(v1,v2) GIM_IS_ZERO((v1-v2)) |
---|
106 | |
---|
107 | ///returns a clamped number |
---|
108 | #define GIM_CLAMP(number,minval,maxval) (number<minval?minval:(number>maxval?maxval:number)) |
---|
109 | |
---|
110 | #define GIM_GREATER(x, y) fabsf(x) > (y) |
---|
111 | |
---|
112 | ///Swap numbers |
---|
113 | #define GIM_SWAP_NUMBERS(a,b){ \ |
---|
114 | a = a+b; \ |
---|
115 | b = a-b; \ |
---|
116 | a = a-b; \ |
---|
117 | }\ |
---|
118 | |
---|
119 | #define GIM_INV_SQRT(va,isva)\ |
---|
120 | {\ |
---|
121 | if(va<=0.0000001f)\ |
---|
122 | {\ |
---|
123 | isva = G_REAL_INFINITY;\ |
---|
124 | }\ |
---|
125 | else\ |
---|
126 | {\ |
---|
127 | GREAL _x = va * 0.5f;\ |
---|
128 | GUINT _y = 0x5f3759df - ( GIM_IR(va) >> 1);\ |
---|
129 | isva = GIM_FR(_y);\ |
---|
130 | isva = isva * ( 1.5f - ( _x * isva * isva ) );\ |
---|
131 | }\ |
---|
132 | }\ |
---|
133 | |
---|
134 | #define GIM_SQRT(va,sva)\ |
---|
135 | {\ |
---|
136 | GIM_INV_SQRT(va,sva);\ |
---|
137 | sva = 1.0f/sva;\ |
---|
138 | }\ |
---|
139 | |
---|
140 | //! Computes 1.0f / sqrtf(x). Comes from Quake3. See http://www.magic-software.com/3DGEDInvSqrt.html |
---|
141 | inline GREAL gim_inv_sqrt(GREAL f) |
---|
142 | { |
---|
143 | GREAL r; |
---|
144 | GIM_INV_SQRT(f,r); |
---|
145 | return r; |
---|
146 | } |
---|
147 | |
---|
148 | inline GREAL gim_sqrt(GREAL f) |
---|
149 | { |
---|
150 | GREAL r; |
---|
151 | GIM_SQRT(f,r); |
---|
152 | return r; |
---|
153 | } |
---|
154 | |
---|
155 | |
---|
156 | |
---|
157 | #endif // GIM_MATH_H_INCLUDED |
---|