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
 |