Nicolas Capens | 7b21f27 | 2014-06-04 22:51:10 -0400 | [diff] [blame] | 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 | *****************************************************************************/ |
| 121 | typedef 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 | *****************************************************************************/ |
| 155 | typedef 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 | *****************************************************************************/ |
| 195 | HeaderStruct_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 | *****************************************************************************/ |
| 202 | void PVRTUnloadHeaderObject(HeaderStruct_Mesh_Type* headerObj); |
| 203 | |
| 204 | |
| 205 | #endif /* _PVRTFIXEDPOINT_H_ */ |
| 206 | |
| 207 | /***************************************************************************** |
| 208 | End of file (PVRTFixedPoint.h) |
| 209 | *****************************************************************************/ |
| 210 | |