www.pudn.com > coolMEMORY.rar > AS_Math.h


//----------------------------------------------------------------------------- 
// File: AS_Math.h 
//----------------------------------------------------------------------------- 
 
#ifndef __AS_MATH_H__ 
#define __AS_MATH_H__ 
 
 
// Definitions: *************************************************************** 
#define PLANE_BACKSIDE 0x000001 
#define PLANE_FRONT    0x000010 
#define ON_PLANE       0x000100 
#define PI            3.14159265358979 
#define PId2          1.5707963279489 
#define DEG_TO_RAD 0.0174532925199432957692369076848861 
#define RAD_TO_DEG 57.29577951 
 
typedef float MATRIX[4][4]; 
#define M_4x4_TO_16(Row, Col) fM[Row*4+Col] 
 
#define LIMIT_RANGE(low, value, high)	{	if (value < low)	value = low;	else if(value > high)	value = high;	} 
 
#define SubtVer(AB, a, b)\ 
	((AB)[X] = (b)[X]-(a)[X],\ 
     (AB)[Y] = (b)[Y]-(a)[Y],\ 
     (AB)[Z] = (b)[Z]-(a)[Z]) 
#define CrossProductVer(AB, a, b)\ 
	((AB)[X] = (a)[Y]*(b)[Z]-(a)[Z]*(b)[Y],\ 
     (AB)[Y] = (a)[Z]*(b)[X]-(a)[X]*(b)[Z],\ 
     (AB)[Z] = (a)[X]*(b)[Y]-(a)[Y]*(b)[X]) 
 
 
typedef union FastSqrtUnion 
{ 
  float f; 
  unsigned int i; 
} FastSqrtUnion; 
 
 
#define FP_BITS(fp) (*(DWORD *)&(fp)) 
#define FP_ABS_BITS(fp) (FP_BITS(fp)&0x7FFFFFFF) 
#define FP_SIGN_BIT(fp) (FP_BITS(fp)&0x80000000) 
#define FP_ONE_BITS 0x3F800000 
 
 
// r = 1/p 
#define FP_INV(r,p)                                                          \ 
{                                                                            \ 
    int _i = 2 * FP_ONE_BITS - *(int *)&(p);                                 \ 
    r = *(float *)&_i;                                                       \ 
    r = r * (2.0f - (p) * r);                                                \ 
} 
 
extern float   two; 
 
#define FP_INV2(r,p)                     \ 
{                                        \ 
    __asm { mov     eax,0x7F000000    }; \ 
    __asm { sub     eax,dword ptr [p] }; \ 
    __asm { mov     dword ptr [r],eax }; \ 
    __asm { fld     dword ptr [p]     }; \ 
    __asm { fmul    dword ptr [r]     }; \ 
    __asm { fsubr   [two]             }; \ 
    __asm { fmul    dword ptr [r]     }; \ 
    __asm { fstp    dword ptr [r]     }; \ 
} 
 
///////////////////////////////////////////////// 
 
 
#define FP_EXP(e,p)                                                          \ 
{                                                                            \ 
    int _i;                                                                  \ 
    e = -1.44269504f * (float)0x00800000 * (p);                              \ 
    _i = (int)e + 0x3F800000;                                                \ 
    e = *(float *)&_i;                                                       \ 
} 
 
#define FP_NORM_TO_BYTE(i,p)                                                 \ 
{                                                                            \ 
    float _n = (p) + 1.0f;                                                   \ 
    i = *(int *)&_n;                                                         \ 
    if (i >= 0x40000000)     i = 0xFF;                                       \ 
    else if (i <=0x3F800000) i = 0;                                          \ 
    else i = ((i) >> 15) & 0xFF;                                             \ 
} 
 
/////////////////////////////////////////////////////////////////////////////// 
 
// Variables: ***************************************************************** 
extern unsigned int ASFastSqrtTable[0x10000]; // Declare table of square roots 
/////////////////////////////////////////////////////////////////////////////// 
 
// Functions: ***************************************************************** 
extern void ASBuildSqrtTable(void); 
extern void NormalizeFace(FLOAT3 *, FLOAT3, FLOAT3, FLOAT3); 
extern void ASAddVec(FLOAT3, FLOAT3, FLOAT3 *); 
extern void ASSubVec(FLOAT3, FLOAT3, FLOAT3 *); 
extern void ASMulVec(FLOAT3, FLOAT3, FLOAT3 *); 
extern void ASScaleVec(FLOAT3, float, FLOAT3 *); 
extern void ASInvertVec(FLOAT3, FLOAT3 *); 
extern void ASRotateVectorX(FLOAT3, float, FLOAT3 *); 
extern void ASRotateVectorY(FLOAT3, float, FLOAT3 *); 
extern void ASRotateVectorZ(FLOAT3, float, FLOAT3 *); 
extern void ASNormalize(FLOAT3 *); 
extern void ASVectMult(FLOAT3, FLOAT3, FLOAT3 *); 
extern void ASCatmullRom(FLOAT3 [4], float, FLOAT3 *); 
extern void ASRotateAroundLine(FLOAT3, FLOAT3, FLOAT3, float, FLOAT3 *); 
extern void ASMultVecMatrix(FLOAT3, float [16], FLOAT3 *); 
 
 
inline unsigned long FP_NORM_TO_BYTE2(float p)                                                  
{                                                                             
  float fpTmp = p + 1.0f;                                                       
  return ((*(unsigned *)&fpTmp) >> 15) & 0xFF;   
} 
 
 
inline unsigned long FP_NORM_TO_BYTE3(float p)      
{ 
  float ftmp = p + 12582912.0f;                                                       
  return ((*(unsigned long *)&ftmp) & 0xFF); 
} 
 
inline float ASFastSqrt(float n) 
{ // begin ASFastSqrt() 
	if(!FP_BITS(n)) 
		return 0.0; // Check for square root of 0 
 
	FP_BITS(n) = ASFastSqrtTable[(FP_BITS(n) >> 8) & 0xFFFF] | ((((FP_BITS(n) - 0x3F800000) >> 1) + 0x3F800000) & 0x7F800000); 
 
	return n; 
} // end ASFastSqrt() 
/////////////////////////////////////////////////////////////////////////////// 
 
 
#endif // __AS_MATH_H__