• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
211