| /*!**************************************************************************** | |
| @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) | |
| *****************************************************************************/ | |