1/*!**************************************************************************** 2 3 @file PVRTFixedPoint.h 4 @copyright Copyright (c) Imagination Technologies Limited. 5 @brief Set of macros and functions to make fixed-point easier to program. 6 7******************************************************************************/ 8 9#ifndef _PVRTFIXEDPOINT_H_ 10#define _PVRTFIXEDPOINT_H_ 11 12#include "PVRTGlobal.h" 13 14#if defined(BUILD_OGLES) 15 #include "PVRTFixedPointAPI.h" 16#else 17 #define VERTTYPE PVRTfloat32 18 #ifdef PVRT_FIXED_POINT_ENABLE 19 #error Build option not supported: PVRT_FIXED_POINT_ENABLE 20 #endif 21#endif 22 23/* Fixed-point macros */ 24#define PVRTF2X(f) ( (int) ( (f)*(65536) ) ) 25#define PVRTX2F(x) ((float)(x)/65536.0f) 26#define PVRTXMUL(a,b) ( (int)( ((PVRTint64)(a)*(b)) / 65536 ) ) 27#define PVRTXDIV(a,b) ( (int)( (((PVRTint64)(a))<<16)/(b) ) ) 28#define PVRTABS(a) ((a) <= 0 ? -(a) : (a) ) 29 30/* Define trig table macros */ 31#include "PVRTMathTable.h" 32 33/* Useful values */ 34#define PVRT_PI_OVER_TWOf (3.1415926535f / 2.0f) 35#define PVRT_PIf (3.1415926535f) 36#define PVRT_TWO_PIf (3.1415926535f * 2.0f) 37#define PVRT_ONEf (1.0f) 38 39#define PVRT_PI_OVER_TWOx PVRTF2X(PVRT_PI_OVER_TWOf) 40#define PVRT_PIx PVRTF2X(PVRT_PIf) 41#define PVRT_TWO_PIx PVRTF2X(PVRT_TWO_PIf) 42#define PVRT_ONEx PVRTF2X(PVRT_ONEf) 43 44/* Fixed-point trig function lookups */ 45#define PVRTXCOS(x) (cos_val[(PVRTXMUL(((PVRTXDIV((x)<0? -(x):(x), PVRT_TWO_PIx)) & 0x0000FFFF), (NUM_ENTRIES-1)))]) 46#define PVRTXSIN(x) (sin_val[(PVRTXMUL(((PVRTXDIV((x)<0 ? PVRT_PIx-(x):(x), PVRT_TWO_PIx)) & 0x0000FFFF), (NUM_ENTRIES-1)))]) 47#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)))] ) 48#define PVRTXACOS(x) (acos_val[PVRTXMUL(((((x) + PVRTF2X(1.0f))>>1) & 0x0000FFFF), (NUM_ENTRIES-1))]) 49 50/* Floating-point trig functions lookups (needed by some tools chains that have problems with real math functions) */ 51#ifdef USE_TRIGONOMETRIC_LOOKUP_TABLES 52 53 /* If trig tables are forced ON in non-fixed-point builds then convert fixed-point trig tables results to float */ 54 #define PVRTFCOS(x) PVRTX2F(PVRTXCOS(PVRTF2X(x))) 55 #define PVRTFSIN(x) PVRTX2F(PVRTXSIN(PVRTF2X(x))) 56 #define PVRTFTAN(x) PVRTX2F(PVRTXTAN(PVRTF2X(x))) 57 #define PVRTFACOS(x) PVRTX2F(PVRTXACOS(PVRTF2X(x))) 58 59#else 60 61 /* Trig abstraction macros default to normal math trig functions for full float mode */ 62 #define PVRTFCOS(x) ((float)cos(x)) 63 #define PVRTFSIN(x) ((float)sin(x)) 64 #define PVRTFTAN(x) ((float)tan(x)) 65 #define PVRTFACOS(x) ((float)acos(x)) 66 67#endif 68 69 70/* Fixed/float macro abstraction */ 71#ifdef PVRT_FIXED_POINT_ENABLE 72 73 /* Fixed-point operations, including trig tables */ 74 #define VERTTYPEMUL(a,b) PVRTXMUL(a,b) 75 #define VERTTYPEDIV(a,b) PVRTXDIV(a,b) 76 #define VERTTYPEABS(a) PVRTABS(a) 77 78 #define f2vt(f) PVRTF2X(f) 79 #define vt2f(x) PVRTX2F(x) 80 81 #define PVRT_PI_OVER_TWO PVRT_PI_OVER_TWOx 82 #define PVRT_PI PVRT_PIx 83 #define PVRT_TWO_PI PVRT_TWO_PIx 84 #define PVRT_ONE PVRT_ONEx 85 86 #define PVRTCOS(x) PVRTXCOS(x) 87 #define PVRTSIN(x) PVRTXSIN(x) 88 #define PVRTTAN(x) PVRTXTAN(x) 89 #define PVRTACOS(x) PVRTXACOS(x) 90 91#else 92 93 /* Floating-point operations */ 94 #define VERTTYPEMUL(a,b) ( (VERTTYPE)((a)*(b)) ) 95 #define VERTTYPEDIV(a,b) ( (VERTTYPE)((a)/(b)) ) 96 #define VERTTYPEABS(a) ( (VERTTYPE)(fabs(a)) ) 97 98 #define f2vt(x) (x) 99 #define vt2f(x) (x) 100 101 #define PVRT_PI_OVER_TWO PVRT_PI_OVER_TWOf 102 #define PVRT_PI PVRT_PIf 103 #define PVRT_TWO_PI PVRT_TWO_PIf 104 #define PVRT_ONE PVRT_ONEf 105 106 /* If trig tables are forced ON in non-fixed-point builds then convert fixed-point trig tables results to float */ 107 #define PVRTCOS(x) PVRTFCOS(x) 108 #define PVRTSIN(x) PVRTFSIN(x) 109 #define PVRTTAN(x) PVRTFTAN(x) 110 #define PVRTACOS(x) PVRTFACOS(x) 111 112#endif 113 114 115// Structure Definitions 116 117/*!*************************************************************************** 118 @struct HeaderStruct_Mesh 119 @brief Defines the format of a header-object as exported by the MAX plugin. 120*****************************************************************************/ 121typedef struct { 122 unsigned int nNumVertex; 123 unsigned int nNumFaces; 124 unsigned int nNumStrips; 125 unsigned int nFlags; 126 unsigned int nMaterial; 127 float fCenter[3]; 128 float *pVertex; 129 float *pUV; 130 float *pNormals; 131 float *pPackedVertex; 132 unsigned int *pVertexColor; 133 unsigned int *pVertexMaterial; 134 unsigned short *pFaces; 135 unsigned short *pStrips; 136 unsigned short *pStripLength; 137 struct 138 { 139 unsigned int nType; 140 unsigned int nNumPatches; 141 unsigned int nNumVertices; 142 unsigned int nNumSubdivisions; 143 float *pControlPoints; 144 float *pUVs; 145 } Patch; 146} HeaderStruct_Mesh; 147 148 149#ifdef PVRT_FIXED_POINT_ENABLE 150 151/*!*************************************************************************** 152 @struct HeaderStruct_Fixed_Mesh 153 @brief Defines the format of a header-object as when converted to fixed point. 154*****************************************************************************/ 155typedef struct { 156 unsigned int nNumVertex; 157 unsigned int nNumFaces; 158 unsigned int nNumStrips; 159 unsigned int nFlags; 160 unsigned int nMaterial; 161 VERTTYPE fCenter[3]; 162 VERTTYPE *pVertex; 163 VERTTYPE *pUV; 164 VERTTYPE *pNormals; 165 VERTTYPE *pPackedVertex; 166 unsigned int *pVertexColor; 167 unsigned int *pVertexMaterial; 168 unsigned short *pFaces; 169 unsigned short *pStrips; 170 unsigned short *pStripLength; 171 struct 172 { 173 unsigned int nType; // for the moment, these are left as floats 174 unsigned int nNumPatches; 175 unsigned int nNumVertices; 176 unsigned int nNumSubdivisions; 177 float *pControlPoints; 178 float *pUVs; 179 } Patch; 180} HeaderStruct_Fixed_Mesh; 181 182 typedef HeaderStruct_Fixed_Mesh HeaderStruct_Mesh_Type; 183#else 184 typedef HeaderStruct_Mesh HeaderStruct_Mesh_Type; 185#endif 186 187// Function prototypes 188 189/*!*************************************************************************** 190 @brief Converts the data exported by MAX to fixed point when used in OpenGL 191 ES common-lite profile. 192 @param[in] headerObj Pointer to object structure in the header file 193 @return directly usable geometry in fixed or float format as appropriate 194*****************************************************************************/ 195HeaderStruct_Mesh_Type* PVRTLoadHeaderObject(const void *headerObj); 196 197/*!*************************************************************************** 198 @brief Releases memory allocated by LoadHeaderObject when geometry no longer 199 needed. 200 @param[in] headerObj Pointer returned by LoadHeaderObject 201*****************************************************************************/ 202void PVRTUnloadHeaderObject(HeaderStruct_Mesh_Type* headerObj); 203 204 205#endif /* _PVRTFIXEDPOINT_H_ */ 206 207/***************************************************************************** 208 End of file (PVRTFixedPoint.h) 209*****************************************************************************/ 210 211