|  | /****************************************************************************** | 
|  |  | 
|  | @File         PVRTFixedPoint.cpp | 
|  |  | 
|  | @Title        PVRTFixedPoint | 
|  |  | 
|  | @Version | 
|  |  | 
|  | @Copyright    Copyright (c) Imagination Technologies Limited. | 
|  |  | 
|  | @Platform     Independant | 
|  |  | 
|  | @Description  Converts MAX exported meshes to fixed point objects for use with | 
|  | opengles lite. | 
|  |  | 
|  | ******************************************************************************/ | 
|  | #include <math.h> | 
|  | #include <string.h> | 
|  | #include "PVRTContext.h" | 
|  | #include "PVRTFixedPoint.h" | 
|  |  | 
|  | /******************************************************** | 
|  | ** Most of the code only applies to CommonLite profile ** | 
|  | ********************************************************/ | 
|  | #ifdef PVRT_FIXED_POINT_ENABLE | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @Function		CreateFixedObjectMesh | 
|  | @Input			mesh	The mesh to create the fixed point version from | 
|  | @Returns		A fixed point version of mesh | 
|  | @Description	Converts model floating point data to fixed point | 
|  | *****************************************************************************/ | 
|  | HeaderStruct_Fixed_Mesh *CreateFixedObjectMesh(HeaderStruct_Mesh *mesh) | 
|  | { | 
|  | HeaderStruct_Fixed_Mesh *new_mesh = new HeaderStruct_Fixed_Mesh; | 
|  |  | 
|  | new_mesh->fCenter[0] = PVRTF2X(mesh->fCenter[0]); | 
|  | new_mesh->fCenter[1] = PVRTF2X(mesh->fCenter[1]); | 
|  | new_mesh->fCenter[2] = PVRTF2X(mesh->fCenter[2]); | 
|  |  | 
|  |  | 
|  | new_mesh->nNumVertex = mesh->nNumVertex; | 
|  | new_mesh->nNumFaces = mesh->nNumFaces; | 
|  | new_mesh->nNumStrips = mesh->nNumStrips; | 
|  | new_mesh->nMaterial = mesh->nMaterial; | 
|  |  | 
|  | if(mesh->nNumVertex) | 
|  | { | 
|  | new_mesh->pVertex = new VERTTYPE[mesh->nNumVertex*3]; | 
|  | for(unsigned int i = 0; i < mesh->nNumVertex*3; i++)		// each vertex is 3 floats | 
|  | new_mesh->pVertex[i] = PVRTF2X(mesh->pVertex[i]); | 
|  | } | 
|  | else | 
|  | { | 
|  | new_mesh->pVertex = 0; | 
|  | new_mesh->nNumVertex = 0; | 
|  | } | 
|  |  | 
|  | if(mesh->pUV) | 
|  | { | 
|  | new_mesh->pUV = new VERTTYPE[mesh->nNumVertex*2]; | 
|  | for(unsigned int i = 0; i < mesh->nNumVertex*2; i++)		// UVs come in pairs of floats | 
|  | new_mesh->pUV[i] = PVRTF2X(mesh->pUV[i]); | 
|  | } | 
|  | else | 
|  | new_mesh->pUV = 0; | 
|  |  | 
|  | if(mesh->pNormals) | 
|  | { | 
|  | new_mesh->pNormals = new VERTTYPE[mesh->nNumVertex*3]; | 
|  | for(unsigned int i = 0; i < mesh->nNumVertex*3; i++)		// each normal is 3 floats | 
|  | new_mesh->pNormals[i] = PVRTF2X(mesh->pNormals[i]); | 
|  | } | 
|  | else | 
|  | { | 
|  | new_mesh->pNormals = 0; | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Format of packedVerts is | 
|  | *		Position | 
|  | *		Normal / Colour | 
|  | *		UVs | 
|  | */ | 
|  |  | 
|  | #define MF_NORMALS 1 | 
|  | #define MF_VERTEXCOLOR 2 | 
|  | #define MF_UV 3 | 
|  |  | 
|  | if(mesh->pPackedVertex) | 
|  | { | 
|  | unsigned int nPackedVertSize = mesh->nNumVertex * 3 + | 
|  | (mesh->nFlags & MF_NORMALS		? mesh->nNumVertex * 3 : 0) + | 
|  | (mesh->nFlags & MF_VERTEXCOLOR	? mesh->nNumVertex * 3 : 0) + | 
|  | (mesh->nFlags & MF_UV			? mesh->nNumVertex * 2 : 0); | 
|  |  | 
|  | new_mesh->pPackedVertex = new VERTTYPE[nPackedVertSize]; | 
|  | for(unsigned int i = 0; i < nPackedVertSize; i++) | 
|  | new_mesh->pPackedVertex[i] = PVRTF2X(mesh->pPackedVertex[i]); | 
|  | } | 
|  | else | 
|  | new_mesh->pPackedVertex = 0; | 
|  |  | 
|  | // simply copy reference to all properties which do not need conversion (indicies) | 
|  |  | 
|  | new_mesh->pVertexColor				= mesh->pVertexColor; | 
|  | new_mesh->pVertexMaterial			= mesh->pVertexMaterial; | 
|  | new_mesh->pFaces					= mesh->pFaces; | 
|  | new_mesh->pStrips					= mesh->pStrips; | 
|  | new_mesh->pStripLength				= mesh->pStripLength; | 
|  |  | 
|  | // we're leaving the patch stuff alone | 
|  |  | 
|  | new_mesh->Patch.nType				= mesh->Patch.nType; | 
|  | new_mesh->Patch.nNumPatches			= mesh->Patch.nNumPatches; | 
|  | new_mesh->Patch.nNumVertices		= mesh->Patch.nNumVertices; | 
|  | new_mesh->Patch.nNumSubdivisions	= mesh->Patch.nNumSubdivisions; | 
|  | new_mesh->Patch.pControlPoints		= mesh->Patch.pControlPoints; | 
|  | new_mesh->Patch.pUVs				= mesh->Patch.pUVs; | 
|  |  | 
|  | return new_mesh; | 
|  | } | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @Function		FreeFixedObjectMesh | 
|  | @Input			mesh	The mesh to delete | 
|  | @Description	Release memory allocated in CreateFixedObjectMesh() | 
|  | *****************************************************************************/ | 
|  | void FreeFixedObjectMesh(HeaderStruct_Fixed_Mesh* mesh) | 
|  | { | 
|  |  | 
|  | delete[] mesh->pVertex; | 
|  | delete[] mesh->pUV; | 
|  | delete[] mesh->pNormals; | 
|  | delete[] mesh->pPackedVertex; | 
|  |  | 
|  | delete mesh; | 
|  | } | 
|  |  | 
|  | #endif | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @Function		PVRTLoadHeaderObject | 
|  | @Input			headerObj			Pointer to object structure in the header file | 
|  | @Return		directly usable geometry in fixed or float format as appropriate | 
|  | @Description	Converts the data exported by MAX to fixed point when used in OpenGL | 
|  | ES common-lite profile. | 
|  | *****************************************************************************/ | 
|  | HeaderStruct_Mesh_Type *PVRTLoadHeaderObject(const void *headerObj) | 
|  | { | 
|  | #ifdef PVRT_FIXED_POINT_ENABLE | 
|  | return (HeaderStruct_Mesh_Type*) CreateFixedObjectMesh((HeaderStruct_Mesh *) headerObj); | 
|  | #else | 
|  | HeaderStruct_Mesh_Type *new_mesh = new HeaderStruct_Mesh_Type; | 
|  | memcpy (new_mesh,headerObj,sizeof(HeaderStruct_Mesh_Type)); | 
|  | return (HeaderStruct_Mesh_Type*) new_mesh; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /*!*************************************************************************** | 
|  | @Function		PVRTUnloadHeaderObject | 
|  | @Input			headerObj			Pointer returned by LoadHeaderObject | 
|  | @Description	Releases memory allocated by LoadHeaderObject when geometry no longer | 
|  | needed. | 
|  | *****************************************************************************/ | 
|  | void PVRTUnloadHeaderObject(HeaderStruct_Mesh_Type* headerObj) | 
|  | { | 
|  | #ifdef PVRT_FIXED_POINT_ENABLE | 
|  | FreeFixedObjectMesh(headerObj); | 
|  | #else | 
|  | delete headerObj; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /***************************************************************************** | 
|  | End of file (PVRTFixedPoint.cpp) | 
|  | *****************************************************************************/ | 
|  |  |