1 #ifndef GIM_MATH_H_INCLUDED 2 #define GIM_MATH_H_INCLUDED 3 /*! \file gim_math.h 4 \author Francisco Leon Najera 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 (at) 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) btFabs(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 158