/*!**************************************************************************** @file PVRTFixedPoint.h @copyright Copyright (c) Imagination Technologies Limited. @brief Set of macros and functions to make fixed-point easier to program. ******************************************************************************/ #ifndef _PVRTFIXEDPOINT_H_ #define _PVRTFIXEDPOINT_H_ #include "PVRTGlobal.h" #if defined(BUILD_OGLES) #include "PVRTFixedPointAPI.h" #else #define VERTTYPE PVRTfloat32 #ifdef PVRT_FIXED_POINT_ENABLE #error Build option not supported: PVRT_FIXED_POINT_ENABLE #endif #endif /* Fixed-point macros */ #define PVRTF2X(f) ( (int) ( (f)*(65536) ) ) #define PVRTX2F(x) ((float)(x)/65536.0f) #define PVRTXMUL(a,b) ( (int)( ((PVRTint64)(a)*(b)) / 65536 ) ) #define PVRTXDIV(a,b) ( (int)( (((PVRTint64)(a))<<16)/(b) ) ) #define PVRTABS(a) ((a) <= 0 ? -(a) : (a) ) /* Define trig table macros */ #include "PVRTMathTable.h" /* Useful values */ #define PVRT_PI_OVER_TWOf (3.1415926535f / 2.0f) #define PVRT_PIf (3.1415926535f) #define PVRT_TWO_PIf (3.1415926535f * 2.0f) #define PVRT_ONEf (1.0f) #define PVRT_PI_OVER_TWOx PVRTF2X(PVRT_PI_OVER_TWOf) #define PVRT_PIx PVRTF2X(PVRT_PIf) #define PVRT_TWO_PIx PVRTF2X(PVRT_TWO_PIf) #define PVRT_ONEx PVRTF2X(PVRT_ONEf) /* Fixed-point trig function lookups */ #define PVRTXCOS(x) (cos_val[(PVRTXMUL(((PVRTXDIV((x)<0? -(x):(x), PVRT_TWO_PIx)) & 0x0000FFFF), (NUM_ENTRIES-1)))]) #define PVRTXSIN(x) (sin_val[(PVRTXMUL(((PVRTXDIV((x)<0 ? PVRT_PIx-(x):(x), PVRT_TWO_PIx)) & 0x0000FFFF), (NUM_ENTRIES-1)))]) #define PVRTXTAN(x) ( (x)<0 ? -tan_val[(PVRTXMUL(((PVRTXDIV(-(x), PVRT_TWO_PIx)) & 0x0000FFFF), (NUM_ENTRIES-1)))] : tan_val[(PVRTXMUL(((PVRTXDIV(x, PVRT_TWO_PIx)) & 0x0000FFFF), (NUM_ENTRIES-1)))] ) #define PVRTXACOS(x) (acos_val[PVRTXMUL(((((x) + PVRTF2X(1.0f))>>1) & 0x0000FFFF), (NUM_ENTRIES-1))]) /* Floating-point trig functions lookups (needed by some tools chains that have problems with real math functions) */ #ifdef USE_TRIGONOMETRIC_LOOKUP_TABLES /* If trig tables are forced ON in non-fixed-point builds then convert fixed-point trig tables results to float */ #define PVRTFCOS(x) PVRTX2F(PVRTXCOS(PVRTF2X(x))) #define PVRTFSIN(x) PVRTX2F(PVRTXSIN(PVRTF2X(x))) #define PVRTFTAN(x) PVRTX2F(PVRTXTAN(PVRTF2X(x))) #define PVRTFACOS(x) PVRTX2F(PVRTXACOS(PVRTF2X(x))) #else /* Trig abstraction macros default to normal math trig functions for full float mode */ #define PVRTFCOS(x) ((float)cos(x)) #define PVRTFSIN(x) ((float)sin(x)) #define PVRTFTAN(x) ((float)tan(x)) #define PVRTFACOS(x) ((float)acos(x)) #endif /* Fixed/float macro abstraction */ #ifdef PVRT_FIXED_POINT_ENABLE /* Fixed-point operations, including trig tables */ #define VERTTYPEMUL(a,b) PVRTXMUL(a,b) #define VERTTYPEDIV(a,b) PVRTXDIV(a,b) #define VERTTYPEABS(a) PVRTABS(a) #define f2vt(f) PVRTF2X(f) #define vt2f(x) PVRTX2F(x) #define PVRT_PI_OVER_TWO PVRT_PI_OVER_TWOx #define PVRT_PI PVRT_PIx #define PVRT_TWO_PI PVRT_TWO_PIx #define PVRT_ONE PVRT_ONEx #define PVRTCOS(x) PVRTXCOS(x) #define PVRTSIN(x) PVRTXSIN(x) #define PVRTTAN(x) PVRTXTAN(x) #define PVRTACOS(x) PVRTXACOS(x) #else /* Floating-point operations */ #define VERTTYPEMUL(a,b) ( (VERTTYPE)((a)*(b)) ) #define VERTTYPEDIV(a,b) ( (VERTTYPE)((a)/(b)) ) #define VERTTYPEABS(a) ( (VERTTYPE)(fabs(a)) ) #define f2vt(x) (x) #define vt2f(x) (x) #define PVRT_PI_OVER_TWO PVRT_PI_OVER_TWOf #define PVRT_PI PVRT_PIf #define PVRT_TWO_PI PVRT_TWO_PIf #define PVRT_ONE PVRT_ONEf /* If trig tables are forced ON in non-fixed-point builds then convert fixed-point trig tables results to float */ #define PVRTCOS(x) PVRTFCOS(x) #define PVRTSIN(x) PVRTFSIN(x) #define PVRTTAN(x) PVRTFTAN(x) #define PVRTACOS(x) PVRTFACOS(x) #endif // Structure Definitions /*!*************************************************************************** @struct HeaderStruct_Mesh @brief Defines the format of a header-object as exported by the MAX plugin. *****************************************************************************/ typedef struct { unsigned int nNumVertex; unsigned int nNumFaces; unsigned int nNumStrips; unsigned int nFlags; unsigned int nMaterial; float fCenter[3]; float *pVertex; float *pUV; float *pNormals; float *pPackedVertex; unsigned int *pVertexColor; unsigned int *pVertexMaterial; unsigned short *pFaces; unsigned short *pStrips; unsigned short *pStripLength; struct { unsigned int nType; unsigned int nNumPatches; unsigned int nNumVertices; unsigned int nNumSubdivisions; float *pControlPoints; float *pUVs; } Patch; } HeaderStruct_Mesh; #ifdef PVRT_FIXED_POINT_ENABLE /*!*************************************************************************** @struct HeaderStruct_Fixed_Mesh @brief Defines the format of a header-object as when converted to fixed point. *****************************************************************************/ typedef struct { unsigned int nNumVertex; unsigned int nNumFaces; unsigned int nNumStrips; unsigned int nFlags; unsigned int nMaterial; VERTTYPE fCenter[3]; VERTTYPE *pVertex; VERTTYPE *pUV; VERTTYPE *pNormals; VERTTYPE *pPackedVertex; unsigned int *pVertexColor; unsigned int *pVertexMaterial; unsigned short *pFaces; unsigned short *pStrips; unsigned short *pStripLength; struct { unsigned int nType; // for the moment, these are left as floats unsigned int nNumPatches; unsigned int nNumVertices; unsigned int nNumSubdivisions; float *pControlPoints; float *pUVs; } Patch; } HeaderStruct_Fixed_Mesh; typedef HeaderStruct_Fixed_Mesh HeaderStruct_Mesh_Type; #else typedef HeaderStruct_Mesh HeaderStruct_Mesh_Type; #endif // Function prototypes /*!*************************************************************************** @brief Converts the data exported by MAX to fixed point when used in OpenGL ES common-lite profile. @param[in] headerObj Pointer to object structure in the header file @return directly usable geometry in fixed or float format as appropriate *****************************************************************************/ HeaderStruct_Mesh_Type* PVRTLoadHeaderObject(const void *headerObj); /*!*************************************************************************** @brief Releases memory allocated by LoadHeaderObject when geometry no longer needed. @param[in] headerObj Pointer returned by LoadHeaderObject *****************************************************************************/ void PVRTUnloadHeaderObject(HeaderStruct_Mesh_Type* headerObj); #endif /* _PVRTFIXEDPOINT_H_ */ /***************************************************************************** End of file (PVRTFixedPoint.h) *****************************************************************************/