|  | /*!**************************************************************************** | 
|  |  | 
|  | @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) | 
|  | *****************************************************************************/ | 
|  |  |