int MOFMesh::loadIndexChunk(MOF_CHUNK_HEADER *header, int meshNum) { //printf("MOF Load Index Chunk\n"); int byteCount=0; MOFSubmesh *mesh = this->m_meshes[meshNum]; mesh->setNumIndices(header->num); //printf("MOF num indices %i\n",header->num); char indexType = 0; byteCount += fread(&indexType,1,1,this->m_file); int *indexData = new int[header->num]; for(int i=0;i<header->num;++i) { int index; int num; //if(indexType==1) num = fread(&index,1,4,this->m_file); //else if(indexType==0) // num = fread(&index,1,2,this->m_file); byteCount +=num; if(num!=4) { SAFE_ARRAY_DELETE(indexData); return RETURN_ERROR; } indexData[i] = index; //printf("MOF index[%i] %i\n",i,index); } IBuffer *indexBuffer = GLOBALS->getRenderer()->createBuffer(); if(!indexBuffer) { SAFE_ARRAY_DELETE(indexData); return -1; } /*if(indexType==0) { printf("16!!\n"); if(indexBuffer->create(indexData,2,header->num,BT_INDEX, FORMAT_R32_UINT)!=RETURN_OK) return -1; } else if(indexType==1) { printf("32!!\n");*/ if(indexBuffer->create(indexData,4,header->num,BT_INDEX)!=RETURN_OK) { SAFE_ARRAY_DELETE(indexData); return -1; } //} mesh->setIndexBuffer(indexBuffer); SAFE_ARRAY_DELETE(indexData); return byteCount; }
int MOFMesh::loadVertexChunk(MOF_CHUNK_HEADER *header,int meshNum) { if(!this->m_file) return RETURN_ERROR; int byteCount; char numElements=0; byteCount = fread(&numElements,1,1,this->m_file); //return RETURN_ERROR; char topology=0; byteCount = fread(&topology,1,1,this->m_file); char windingOrder=0; byteCount = fread(&windingOrder,1,1,this->m_file); //if(header->num<=0) // return RETURN_ERROR; MOFSubmesh *mesh = this->m_meshes[meshNum]; if(windingOrder) mesh->setFrontOrder(true); else mesh->setFrontOrder(false); mesh->setNumVertices(header->num); mesh->setNumElementsVertex(numElements); Vertex *verts = new Vertex[header->num]; //int count=sizeof(header->id)+sizeof(header->num)+sizeof(header->size)+sizeof(numElements); //int readBytes=0; //printf("\nMOF_VERTEX_CHUNK: \n"); //printf(" numVertices: %d(hex: %x)\n numElements %d(hex: %x)\n",header->num,header->num,numElements,numElements); char typeId; for(int i=0; i<header->num; ++i) { for(int j=0; j<numElements; ++j) { byteCount += fread(&typeId,1,1,this->m_file); switch(typeId) { case MOF_VERTEX_POSITION: { float vertVals[3]; byteCount += fread(&vertVals,4,3,this->m_file); /*printf("\nMOF read %d Position: %f %f %f\n",i,vertVals[0], vertVals[1], vertVals[2]);*/ Vector3D position(vertVals); verts[i].position = position; }break; case MOF_VERTEX_NORMAL: { float normVals[3]; byteCount += fread(&normVals,4,3,this->m_file); Vector3D normal(normVals); D3DXVec3Normalize(&normal, &normal); verts[i].normal = normal; /*printf("\nMOF read %d Normals: %f %f %f\n",i,verts[i].normal.x, verts[i].normal.y, verts[i].normal.z);*/ }break; case MOF_VERTEX_TANGENT: { float tangentVals[3]; byteCount += fread(&tangentVals,4,3,this->m_file); Vector3D tangent(tangentVals); D3DXVec3Normalize(&tangent, &tangent); verts[i].tangent = tangent; //printf("\nMOF read %d Tangent: %f %f %f\n",i,verts[i].tangent.x, // verts[i].tangent.y, // verts[i].tangent.z); }break; case MOF_VERTEX_TEX: { float texVals[2]; byteCount += fread(&texVals,4,2,this->m_file); Vector2D tex(texVals); //tex.x = 1-tex.x; tex.y = 1-tex.y; verts[i].texCoord0 = tex; //printf("\nMOF read %d Texture Coords: %f %f\n",i,texVals[0],texVals[1]); }break; case MOF_VERTEX_COLOR: { float colVals[4]; byteCount += fread(&colVals,4*4,1,this->m_file); Color color(colVals); //verts[i].color = color; }break; default: { }; }//end switch }//end for numelements }//end for num //TODO: improve codepaths to avoid multiple SAFE_DELETE stuff IBuffer *vertexBuffer = GLOBALS->getRenderer()->createBuffer(); if(!vertexBuffer) { SAFE_DELETE(vertexBuffer); SAFE_ARRAY_DELETE(verts); return -1; } //mesh.setVertexBuffer(vertexBuffer); if(vertexBuffer->create(verts,sizeof(Vertex),header->num)!=RETURN_OK) { SAFE_DELETE(vertexBuffer); SAFE_ARRAY_DELETE(verts); return -1; } mesh->setVertexBuffer(vertexBuffer); //generate bounding box for the submesh AABB submeshAABB; submeshAABB.loadFromPosition(verts, header->num); mesh->setBoundingBox(submeshAABB); SAFE_ARRAY_DELETE(verts); return byteCount; }