summaryrefslogtreecommitdiff
path: root/thirdparty/bullet/BulletCollision/Gimpact/gim_math.h
blob: 939079e1040a19f58b37a5125e5ed9c98365be42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#ifndef GIM_MATH_H_INCLUDED
#define GIM_MATH_H_INCLUDED
/*! \file gim_math.h
\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
This source file is part of GIMPACT Library.

For the latest info, see http://gimpact.sourceforge.net/

Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
email: projectileman@yahoo.com

 This library is free software; you can redistribute it and/or
 modify it under the terms of EITHER:
   (1) The GNU Lesser General Public License as published by the Free
       Software Foundation; either version 2.1 of the License, or (at
       your option) any later version. The text of the GNU Lesser
       General Public License is included with this library in the
       file GIMPACT-LICENSE-LGPL.TXT.
   (2) The BSD-style license that is included with this library in
       the file GIMPACT-LICENSE-BSD.TXT.
   (3) The zlib/libpng license that is included with this library in
       the file GIMPACT-LICENSE-ZLIB.TXT.

 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
 GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.

-----------------------------------------------------------------------------
*/

#include "LinearMath/btScalar.h"



#define GREAL btScalar
#define GREAL2 double
#define GINT int
#define GUINT unsigned int
#define GSHORT short
#define GUSHORT unsigned short
#define GINT64 long long
#define GUINT64 unsigned long long



#define G_PI 3.14159265358979f
#define G_HALF_PI 1.5707963f
//267948966
#define G_TWO_PI 6.28318530f
//71795864
#define G_ROOT3 1.73205f
#define G_ROOT2 1.41421f
#define G_UINT_INFINITY 0xffffffff //!< A very very high value
#define G_REAL_INFINITY FLT_MAX
#define	G_SIGN_BITMASK			0x80000000
#define G_EPSILON SIMD_EPSILON



enum GIM_SCALAR_TYPES
{
	G_STYPE_REAL =0,
	G_STYPE_REAL2,
	G_STYPE_SHORT,
	G_STYPE_USHORT,
	G_STYPE_INT,
	G_STYPE_UINT,
	G_STYPE_INT64,
	G_STYPE_UINT64
};



#define G_DEGTORAD(X) ((X)*3.1415926f/180.0f)
#define G_RADTODEG(X) ((X)*180.0f/3.1415926f)

//! Integer representation of a floating-point value.
#define GIM_IR(x)					((GUINT&)(x))

//! Signed integer representation of a floating-point value.
#define GIM_SIR(x)					((GINT&)(x))

//! Absolute integer representation of a floating-point value
#define GIM_AIR(x)					(GIM_IR(x)&0x7fffffff)

//! Floating-point representation of an integer value.
#define GIM_FR(x)					((GREAL&)(x))

#define GIM_MAX(a,b) (a<b?b:a)
#define GIM_MIN(a,b) (a>b?b:a)

#define GIM_MAX3(a,b,c) GIM_MAX(a,GIM_MAX(b,c))
#define GIM_MIN3(a,b,c) GIM_MIN(a,GIM_MIN(b,c))

#define GIM_IS_ZERO(value) (value < G_EPSILON &&  value > -G_EPSILON)

#define GIM_IS_NEGATIVE(value) (value <= -G_EPSILON)

#define GIM_IS_POSISITVE(value) (value >= G_EPSILON)

#define GIM_NEAR_EQUAL(v1,v2) GIM_IS_ZERO((v1-v2))

///returns a clamped number
#define GIM_CLAMP(number,minval,maxval) (number<minval?minval:(number>maxval?maxval:number))

#define GIM_GREATER(x, y)	btFabs(x) > (y)

///Swap numbers
#define GIM_SWAP_NUMBERS(a,b){ \
    a = a+b; \
    b = a-b; \
    a = a-b; \
}\

#define GIM_INV_SQRT(va,isva)\
{\
    if(va<=0.0000001f)\
    {\
        isva = G_REAL_INFINITY;\
    }\
    else\
    {\
        GREAL _x = va * 0.5f;\
        GUINT _y = 0x5f3759df - ( GIM_IR(va) >> 1);\
        isva = GIM_FR(_y);\
        isva  = isva * ( 1.5f - ( _x * isva * isva ) );\
    }\
}\

#define GIM_SQRT(va,sva)\
{\
    GIM_INV_SQRT(va,sva);\
    sva = 1.0f/sva;\
}\

//! Computes 1.0f / sqrtf(x). Comes from Quake3. See http://www.magic-software.com/3DGEDInvSqrt.html
inline GREAL gim_inv_sqrt(GREAL f)
{
    GREAL r;
    GIM_INV_SQRT(f,r);
    return r;
}

inline GREAL gim_sqrt(GREAL f)
{
    GREAL r;
    GIM_SQRT(f,r);
    return r;
}



#endif // GIM_MATH_H_INCLUDED