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