158 lines
3.9 KiB
C++
158 lines
3.9 KiB
C++
|
#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
|