| /*!**************************************************************************** | 
 |  | 
 |  @file         PVRTFixedPoint.h | 
 |  @copyright    Copyright (c) Imagination Technologies Limited. | 
 |  @brief        Set of macros and functions to make fixed-point easier to program. | 
 |  | 
 | ******************************************************************************/ | 
 |  | 
 | #ifndef _PVRTFIXEDPOINT_H_ | 
 | #define _PVRTFIXEDPOINT_H_ | 
 |  | 
 | #include "PVRTGlobal.h" | 
 |  | 
 | #if defined(BUILD_OGLES) | 
 | 	#include "PVRTFixedPointAPI.h" | 
 | #else | 
 | 	#define VERTTYPE PVRTfloat32 | 
 | 	#ifdef PVRT_FIXED_POINT_ENABLE | 
 | 		#error Build option not supported: PVRT_FIXED_POINT_ENABLE | 
 | 	#endif | 
 | #endif | 
 |  | 
 | /* Fixed-point macros */ | 
 | #define PVRTF2X(f)		( (int) ( (f)*(65536) ) ) | 
 | #define PVRTX2F(x)		((float)(x)/65536.0f) | 
 | #define PVRTXMUL(a,b)	( (int)( ((PVRTint64)(a)*(b)) / 65536 ) ) | 
 | #define PVRTXDIV(a,b)	( (int)( (((PVRTint64)(a))<<16)/(b) ) ) | 
 | #define PVRTABS(a)		((a) <= 0 ? -(a) : (a) ) | 
 |  | 
 | /* Define trig table macros */ | 
 | #include "PVRTMathTable.h" | 
 |  | 
 | /* Useful values */ | 
 | #define PVRT_PI_OVER_TWOf	(3.1415926535f / 2.0f) | 
 | #define PVRT_PIf			(3.1415926535f) | 
 | #define PVRT_TWO_PIf		(3.1415926535f * 2.0f) | 
 | #define PVRT_ONEf		(1.0f) | 
 |  | 
 | #define PVRT_PI_OVER_TWOx	PVRTF2X(PVRT_PI_OVER_TWOf) | 
 | #define PVRT_PIx			PVRTF2X(PVRT_PIf) | 
 | #define PVRT_TWO_PIx		PVRTF2X(PVRT_TWO_PIf) | 
 | #define PVRT_ONEx			PVRTF2X(PVRT_ONEf) | 
 |  | 
 | /* Fixed-point trig function lookups */ | 
 | #define PVRTXCOS(x)		(cos_val[(PVRTXMUL(((PVRTXDIV((x)<0? -(x):(x), PVRT_TWO_PIx)) & 0x0000FFFF), (NUM_ENTRIES-1)))]) | 
 | #define PVRTXSIN(x)		(sin_val[(PVRTXMUL(((PVRTXDIV((x)<0 ? PVRT_PIx-(x):(x), PVRT_TWO_PIx)) & 0x0000FFFF), (NUM_ENTRIES-1)))]) | 
 | #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)))] ) | 
 | #define PVRTXACOS(x)	(acos_val[PVRTXMUL(((((x) + PVRTF2X(1.0f))>>1) & 0x0000FFFF), (NUM_ENTRIES-1))]) | 
 |  | 
 | /* Floating-point trig functions lookups (needed by some tools chains that have problems with real math functions) */ | 
 | #ifdef USE_TRIGONOMETRIC_LOOKUP_TABLES | 
 |  | 
 | 	/* If trig tables are forced ON in non-fixed-point builds then convert fixed-point trig tables results to float */ | 
 | 	#define	PVRTFCOS(x)				PVRTX2F(PVRTXCOS(PVRTF2X(x))) | 
 | 	#define	PVRTFSIN(x)				PVRTX2F(PVRTXSIN(PVRTF2X(x))) | 
 | 	#define	PVRTFTAN(x)				PVRTX2F(PVRTXTAN(PVRTF2X(x))) | 
 | 	#define	PVRTFACOS(x)			PVRTX2F(PVRTXACOS(PVRTF2X(x))) | 
 |  | 
 | #else | 
 |  | 
 | 	/* Trig abstraction macros default to normal math trig functions for full float mode */ | 
 | 	#define	PVRTFCOS(x)				((float)cos(x)) | 
 | 	#define	PVRTFSIN(x)				((float)sin(x)) | 
 | 	#define	PVRTFTAN(x)				((float)tan(x)) | 
 | 	#define	PVRTFACOS(x)			((float)acos(x)) | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | /* Fixed/float macro abstraction */ | 
 | #ifdef PVRT_FIXED_POINT_ENABLE | 
 |  | 
 | 	/* Fixed-point operations, including trig tables */ | 
 | 	#define VERTTYPEMUL(a,b)			PVRTXMUL(a,b) | 
 | 	#define VERTTYPEDIV(a,b)			PVRTXDIV(a,b) | 
 | 	#define VERTTYPEABS(a)				PVRTABS(a) | 
 |  | 
 | 	#define f2vt(f) 					PVRTF2X(f) | 
 | 	#define vt2f(x) 					PVRTX2F(x) | 
 |  | 
 | 	#define PVRT_PI_OVER_TWO			PVRT_PI_OVER_TWOx | 
 | 	#define PVRT_PI						PVRT_PIx | 
 | 	#define PVRT_TWO_PI					PVRT_TWO_PIx | 
 | 	#define PVRT_ONE					PVRT_ONEx | 
 |  | 
 | 	#define	PVRTCOS(x)					PVRTXCOS(x) | 
 | 	#define	PVRTSIN(x)					PVRTXSIN(x) | 
 | 	#define	PVRTTAN(x)					PVRTXTAN(x) | 
 | 	#define	PVRTACOS(x)					PVRTXACOS(x) | 
 |  | 
 | #else | 
 |  | 
 | 	/* Floating-point operations */ | 
 | 	#define VERTTYPEMUL(a,b)			( (VERTTYPE)((a)*(b)) ) | 
 | 	#define VERTTYPEDIV(a,b)			( (VERTTYPE)((a)/(b)) ) | 
 | 	#define VERTTYPEABS(a)				( (VERTTYPE)(fabs(a)) ) | 
 |  | 
 | 	#define f2vt(x)						(x) | 
 | 	#define vt2f(x)						(x) | 
 |  | 
 | 	#define PVRT_PI_OVER_TWO			PVRT_PI_OVER_TWOf | 
 | 	#define PVRT_PI						PVRT_PIf | 
 | 	#define PVRT_TWO_PI					PVRT_TWO_PIf | 
 | 	#define PVRT_ONE					PVRT_ONEf | 
 |  | 
 | 	/* If trig tables are forced ON in non-fixed-point builds then convert fixed-point trig tables results to float */ | 
 | 	#define	PVRTCOS(x)					PVRTFCOS(x) | 
 | 	#define	PVRTSIN(x)					PVRTFSIN(x) | 
 | 	#define	PVRTTAN(x)					PVRTFTAN(x) | 
 | 	#define	PVRTACOS(x)					PVRTFACOS(x) | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | // Structure Definitions | 
 |  | 
 | /*!*************************************************************************** | 
 |  @struct HeaderStruct_Mesh | 
 |  @brief  Defines the format of a header-object as exported by the MAX plugin. | 
 | *****************************************************************************/ | 
 | typedef struct { | 
 | 	unsigned int      nNumVertex; | 
 |     unsigned int      nNumFaces; | 
 |     unsigned int      nNumStrips; | 
 |     unsigned int      nFlags; | 
 |     unsigned int      nMaterial; | 
 |     float             fCenter[3]; | 
 |     float             *pVertex; | 
 |     float             *pUV; | 
 |     float             *pNormals; | 
 |     float             *pPackedVertex; | 
 |     unsigned int      *pVertexColor; | 
 |     unsigned int      *pVertexMaterial; | 
 |     unsigned short    *pFaces; | 
 |     unsigned short    *pStrips; | 
 |     unsigned short    *pStripLength; | 
 |     struct | 
 |     { | 
 |         unsigned int  nType; | 
 |         unsigned int  nNumPatches; | 
 |         unsigned int  nNumVertices; | 
 |         unsigned int  nNumSubdivisions; | 
 |         float         *pControlPoints; | 
 |         float         *pUVs; | 
 |     } Patch; | 
 | }   HeaderStruct_Mesh; | 
 |  | 
 |  | 
 | #ifdef PVRT_FIXED_POINT_ENABLE | 
 |  | 
 | /*!*************************************************************************** | 
 |  @struct HeaderStruct_Fixed_Mesh | 
 |  @brief  Defines the format of a header-object as when converted to fixed point. | 
 | *****************************************************************************/ | 
 | typedef struct { | 
 | 	unsigned int      nNumVertex; | 
 | 	unsigned int      nNumFaces; | 
 | 	unsigned int      nNumStrips; | 
 | 	unsigned int      nFlags; | 
 | 	unsigned int      nMaterial; | 
 | 	VERTTYPE          fCenter[3]; | 
 | 	VERTTYPE          *pVertex; | 
 | 	VERTTYPE          *pUV; | 
 | 	VERTTYPE          *pNormals; | 
 | 	VERTTYPE          *pPackedVertex; | 
 | 	unsigned int      *pVertexColor; | 
 | 	unsigned int      *pVertexMaterial; | 
 | 	unsigned short    *pFaces; | 
 | 	unsigned short    *pStrips; | 
 | 	unsigned short    *pStripLength; | 
 | 	struct | 
 | 	{ | 
 | 		unsigned int  nType;				// for the moment, these are left as floats | 
 | 		unsigned int  nNumPatches; | 
 | 		unsigned int  nNumVertices; | 
 | 		unsigned int  nNumSubdivisions; | 
 | 		float       *pControlPoints; | 
 | 		float       *pUVs; | 
 | 	} Patch; | 
 | }   HeaderStruct_Fixed_Mesh; | 
 |  | 
 | 	typedef HeaderStruct_Fixed_Mesh HeaderStruct_Mesh_Type; | 
 | #else | 
 | 	typedef HeaderStruct_Mesh HeaderStruct_Mesh_Type; | 
 | #endif | 
 |  | 
 | // Function prototypes | 
 |  | 
 | /*!*************************************************************************** | 
 |  @brief         Converts the data exported by MAX to fixed point when used in OpenGL | 
 | 				ES common-lite profile. | 
 |  @param[in]		headerObj			Pointer to object structure in the header file | 
 |  @return		directly usable geometry in fixed or float format as appropriate | 
 | *****************************************************************************/ | 
 | HeaderStruct_Mesh_Type* PVRTLoadHeaderObject(const void *headerObj); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @brief     	Releases memory allocated by LoadHeaderObject when geometry no longer | 
 | 				needed. | 
 |  @param[in] 	headerObj			Pointer returned by LoadHeaderObject | 
 | *****************************************************************************/ | 
 | void PVRTUnloadHeaderObject(HeaderStruct_Mesh_Type* headerObj); | 
 |  | 
 |  | 
 | #endif /* _PVRTFIXEDPOINT_H_ */ | 
 |  | 
 | /***************************************************************************** | 
 |  End of file (PVRTFixedPoint.h) | 
 | *****************************************************************************/ | 
 |  |