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