blob: 56e1cab5c226135dd72a69d61e3b75fc0644f900 [file] [log] [blame]
Nicolas Capens7b21f272014-06-04 22:51:10 -04001/*!****************************************************************************
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