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