• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

src/util/src/MeshData.cpp

Go to the documentation of this file.
00001 #include "../pch.h"
00002 
00003 MeshData::MeshData()
00004 {
00005         vertexSize = 0;
00006         vertexCount = 0;
00007         indexCount = 0;
00008         vertices = 0;
00009         indices = 0;
00010 }
00011 
00012 MeshData::~MeshData()
00013 {
00014         free();
00015 }
00016 
00017 void MeshData::free()
00018 {
00019         vertexSize = 0;
00020         vertexCount = 0;
00021         indexCount = 0;
00022         if(vertices)
00023         {
00024 		::free(vertices);
00025                 vertices = 0;
00026         }
00027         indices = 0;
00028 }
00029 
00030 struct rvgHeader
00031 {
00032         uint headUInt;
00033         int version;
00034         int vertexSize;
00035         int vertexCount;
00036         int indexCount;
00037 };
00038 
00039 bool loadMeshData(wchar* filename, MeshData& meshData)
00040 {
00041         FILE* file;
00042         rvgHeader header;
00043         const char rvgHead[] = "RVG ";
00044 
00045         // save open file
00046         if(_wfopen_s(&file, filename, TEXT("rb")) != 0)
00047                 return false;
00048 
00049         // read file header
00050         if(fread(&header, sizeof(rvgHeader), 1, file) != 1)
00051                 return fclose(file), false;
00052 
00053         // validate file format
00054         if(header.headUInt != *(uint*)rvgHead)
00055                 return fclose(file), false;
00056         if(header.version != 1)
00057                 return fclose(file), false;
00058         if(header.vertexSize != int(sizeof(Vertex)))
00059                 return fclose(file), false;
00060         if(header.vertexCount < 3)
00061                 return fclose(file), false;
00062         if((header.indexCount < 3) || ((header.indexCount % 3) != 0))
00063                 return fclose(file), false;
00064 
00065         // allocate memory for vertices and indices
00066         void* memory = malloc(header.vertexSize*header.vertexCount + 2*header.indexCount);
00067         Vertex* vertices = (Vertex*)memory;
00068         ushort* indices = (ushort*)&vertices[header.vertexCount];
00069 
00070         // read vertices data
00071         if(fread(vertices, sizeof(Vertex), header.vertexCount, file) != header.vertexCount)
00072                 return fclose(file), false;
00073         // read indices data
00074         if(fread(indices, sizeof(ushort), header.indexCount, file) != header.indexCount)
00075                 return fclose(file), false;
00076 
00077         // done reading from file
00078         fclose(file);
00079 
00080         /*for(int i = 0; i < header.vertexCount; i++) {
00081                 for(int j = 0; j < 4; j++) {
00082                         if(vertices[i].position[j] < 0.0001f) vertices[i].position[j] = 0.0f;
00083                 }
00084         }*/
00085 
00086         // fill output structure
00087         meshData.vertexSize = header.vertexSize;
00088         meshData.vertexCount = header.vertexCount;
00089         meshData.indexCount = header.indexCount;
00090         meshData.vertices = vertices;
00091         meshData.indices = indices;
00092         return true;
00093 }

Generated on Fri Jun 18 2010 17:48:40 for Cannonball by  doxygen 1.7.0