home *** CD-ROM | disk | FTP | other *** search
- #include "ModelLoader.h"
-
- #include "File.h"
- #include "ShaderHandler.h"
- #include "TextureHandler.h"
- #include "log.h"
- #include "collision.h"
-
- Material** ModelLoader::materialList;
- int ModelLoader::numMaterials;
- char* ModelLoader::path;
-
- Material* ModelLoader::readMaterial(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"|", "\"");
-
- Material* mat=new Material();
-
- while(f->readLine(256, buff, true) != -1){
-
- //printf("Model: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
-
- if(streq(t.tokv[0], "NAME")){
- // ignore name
- }else if(streq(t.tokv[0], "SURFACE_TYPE")){
- if( streq(t.tokv[1], "METAL") ){
- mat->surfaceType = MATERIAL_SURFACE_TYPE_METAL;
- }else if( streq(t.tokv[1], "STONE") ){
- mat->surfaceType = MATERIAL_SURFACE_TYPE_STONE;
- }else if( streq(t.tokv[1], "WOOD") ){
- mat->surfaceType = MATERIAL_SURFACE_TYPE_WOOD;
- }else if( streq(t.tokv[1], "DIRT") ){
- mat->surfaceType = MATERIAL_SURFACE_TYPE_DIRT;
- }else{
- warn("(in ModelLoader::readMaterial() (%s, line %i)): Unknown surface type '%s'.\n\n", f->filename, f->line, t.tokv[1]);
- }
- }else if(streq(t.tokv[0], "COLLISION_FLAGS")){
- for(int i=1;i<t.tokc;i++){
- if(streq(t.tokv[i], "WALK_THROUGH")){
- mat->collisionFlags |= COLLISION_FLAG_WALK_THROUGH;
- }else if(streq(t.tokv[i], "SHOOT_THROUGH")){
- mat->collisionFlags |= COLLISION_FLAG_SHOOT_THROUGH;
- }else if(streq(t.tokv[i], "NONE")){
- mat->collisionFlags = COLLISION_FLAG_NONE;
- }else{
- warn("(in ModelLoader::readMaterial() (%s, line %i)): Unknown collisionFlag '%s'.\n\n", f->filename, f->line, t.tokv[i]);
- }
- }
-
- }else if(streq(t.tokv[0], "COLOR")){
- sscanf(t.tokv[1], "%f %f %f %f", &mat->color[0], &mat->color[1], &mat->color[2], &mat->color[3]);
- }else if(streq(t.tokv[0], "TEXTURE")){
- char p[256];
- strcpy(p, path);
- strcat(p, t.tokv[1]);
- if(ShaderHandler::hasShaderForImageFile(p))
- mat->addShader(ShaderHandler::getShader(p));
- else
- mat->addTexture(TextureHandler::getTexture(p));
- }else if(streq(t.tokv[0], "LIGHTMAP")){
- char p[256];
- strcpy(p, path);
- strcat(p, t.tokv[1]);
- mat->addLightmap(TextureHandler::getTexture(p));
-
-
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in ModelLoader::readMaterial() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
- mat->setAttribs();
-
- return mat;
- }
-
- bool ModelLoader::readMaterialList(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"", "\"");
-
- int matCount=0;
-
- while(f->readLine(256, buff, true) != -1){
-
- //printf("Model: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
-
- if(streq(t.tokv[0], "NUM_MATERIALS")){
- numMaterials=atoi(t.tokv[1]);
- materialList=new Material*[numMaterials];
- }else if(streq(t.tokv[0], "MATERIAL")){
- materialList[matCount]=readMaterial(f);
- matCount++;
-
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in ModelLoader::readMaterialList() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
- return true;
- }
- /*
- bool ModelLoader::readKeyframeList(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"", "\"");
-
-
- while(f->readLine(256, buff, true) != -1){
-
- //printf("Model: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
-
- if(streq(t.tokv[0], "NUM_KEYFRAMES")){
- numKeyframes = atoi(t.tokv[1]);
- materialList = new Material*[numMaterials];
- }else if(streq(t.tokv[0], "KEYFRAME")){
- int kfNumber = atoi(t.tokv[1]);
- readKeyframe(f, kfNumber);
-
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in ModelLoader::readMaterialList() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
- return true;
- }
- */
- Mesh* ModelLoader::readMesh(File* f){
- Mesh* m=new Mesh();
-
- char buff[256];
- Tokenizer t(" =\t\n\r\"", "\"");
-
- // int matCount=0;
-
- while(f->readLine(256, buff, true) != -1){
-
- //printf("Model: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
-
- if(streq(t.tokv[0], "TRANSFORMATION_MATRIX")){
- // sscanf(t.tokv[1], "%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f"
- // , &m->transformationMatrix[0], &m->transformationMatrix[1], &m->transformationMatrix[2], &m->transformationMatrix[3]
- // , &m->transformationMatrix[4], &m->transformationMatrix[5], &m->transformationMatrix[6], &m->transformationMatrix[7]
- // , &m->transformationMatrix[8], &m->transformationMatrix[9], &m->transformationMatrix[10], &m->transformationMatrix[11]
- // , &m->transformationMatrix[12], &m->transformationMatrix[13], &m->transformationMatrix[14], &m->transformationMatrix[15]
- // );
- //printf("N: %i\n", n);
- }else if(streq(t.tokv[0], "MATERIAL")){
- m->numMaterials=1;
- m->materials=new Material*[1];
- m->materials[0]=materialList[atoi(t.tokv[1])];
-
- // printf("MAT: %i, hasTex %i, hasLM %i\n", atoi(t.tokv[1]), m->materials[0]->hasTexture, m->materials[0]->hasLightmap);
- }else if(streq(t.tokv[0], "NUM_VERTICES")){
- m->numVertices=m->numColors=m->numNormals=m->numTexCoords=atoi(t.tokv[1]);
- m->vertices=new float[m->numVertices*3];
- m->colors=new float[m->numColors*3];
- m->normals=new float[m->numNormals*3];
- m->texCoords1=new float[m->numTexCoords*2];
- m->texCoords2=new float[m->numTexCoords*2];
- }else if(streq(t.tokv[0], "VERTEX_LIST")){
- f->readLine(256, buff, true);
-
- //int n;
- for(int i=0;i<m->numVertices;i++){
- f->readLine(256, buff, true);
- /*
- sscanf(buff, "VERTEX %i: %f %f %f %f %f %f %f %f %f %f"
- , &n
- , &m->vertices[i*3+0], &m->vertices[i*3+1], &m->vertices[i*3+2]
- , &m->colors[i*3+0], &m->colors[i*3+1], &m->colors[i*3+2]
- , &m->texCoords1[i*2+0], &m->texCoords1[i*2+1]
- , &m->texCoords2[i*2+0], &m->texCoords2[i*2+1]);
- */
- Tokenizer t2(buff, " ", "");
- vectorInit3d((float)atof(t2.tokv[2]), (float)atof(t2.tokv[3]), (float)atof(t2.tokv[4]), &m->vertices[i*3]);
- vectorInit3d((float)atof(t2.tokv[5]), (float)atof(t2.tokv[6]), (float)atof(t2.tokv[7]), &m->colors[i*3]);
- vectorInit2d((float)atof(t2.tokv[8]), (float)atof(t2.tokv[9]), &m->texCoords1[i*2]);
- vectorInit2d((float)atof(t2.tokv[10]), (float)atof(t2.tokv[11]), &m->texCoords2[i*2]);
-
- vectorInit3d(0.0f, 0.0f, 0.0f, &m->normals[i*3]);
- }
-
- f->readLine(256, buff, true);
-
- }else if(streq(t.tokv[0], "NUM_FACES")){
- m->numFaces=atoi(t.tokv[1]);
- m->faces=new Face*[m->numFaces];
- }else if(streq(t.tokv[0], "FACE_LIST")){
- f->readLine(256, buff, true);
-
- int ind1, ind2, ind3;
- for(int i=0;i<m->numFaces;i++){
- Face* fa=new Face();
-
- f->readLine(256, buff, true);
- /*
- sscanf(buff, "FACE %i: %i %i %i %f %f %f"
- , &n
- , &ind1, &ind2, &ind3
- , &fa->normal[0], &fa->normal[1], &fa->normal[2]);
- */
- Tokenizer t2(buff, " ", "");
- ind1=atoi(t2.tokv[2]);
- ind2=atoi(t2.tokv[3]);
- ind3=atoi(t2.tokv[4]);
- //vectorInit3d((float)atof(t2.tokv[5]), (float)atof(t2.tokv[6]), (float)atof(t2.tokv[7]), fa->normal);
-
- fa->numIndices=3;
- fa->indices=new unsigned int[3];
- fa->indices[0]=ind1;
- fa->indices[1]=ind2;
- fa->indices[2]=ind3;
-
- fa->numVertices=3;
- fa->vertices=new float[9];
- vectorCopy3d(&m->vertices[ind1*3], &fa->vertices[0]);
- vectorCopy3d(&m->vertices[ind2*3], &fa->vertices[3]);
- vectorCopy3d(&m->vertices[ind3*3], &fa->vertices[6]);
-
- fa->numColors=3;
- fa->colors=new float[9];
- vectorCopy3d(&m->colors[ind1*3], &fa->colors[0]);
- vectorCopy3d(&m->colors[ind2*3], &fa->colors[3]);
- vectorCopy3d(&m->colors[ind3*3], &fa->colors[6]);
- /*
- fa->numNormals=3;
- fa->normals=new float[9];
- vectorCopy3d(&m->normals[ind1*3], &fa->normals[0]);
- vectorCopy3d(&m->normals[ind2*3], &fa->normals[3]);
- vectorCopy3d(&m->normals[ind3*3], &fa->normals[6]);
- */
- fa->numTexCoords=3;
- fa->texCoords1=new float[6];
- vectorCopy2d(&m->texCoords1[ind1*2], &fa->texCoords1[0]);
- vectorCopy2d(&m->texCoords1[ind2*2], &fa->texCoords1[2]);
- vectorCopy2d(&m->texCoords1[ind3*2], &fa->texCoords1[4]);
- fa->texCoords2=new float[6];
- vectorCopy2d(&m->texCoords2[ind1*2], &fa->texCoords2[0]);
- vectorCopy2d(&m->texCoords2[ind2*2], &fa->texCoords2[2]);
- vectorCopy2d(&m->texCoords2[ind3*2], &fa->texCoords2[4]);
-
- fa->material=m->materials[0];
-
- fa->calcNormal();
-
- // correct vertex normals!
- fa->numNormals=3;
- fa->normals=new float[9];
- vectorCopy3d(fa->normal, &fa->normals[0]);
- vectorCopy3d(fa->normal, &fa->normals[3]);
- vectorCopy3d(fa->normal, &fa->normals[6]);
- vectorCopy3d(fa->normal, &m->normals[ind1*3]);
- vectorCopy3d(fa->normal, &m->normals[ind2*3]);
- vectorCopy3d(fa->normal, &m->normals[ind3*3]);
-
-
- m->faces[i]=fa;
-
- }
-
- f->readLine(256, buff, true);
-
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in ModelLoader::readMesh() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
- m->setRenderMode();
-
- return m;
- }
-
-
- bool ModelLoader::loadModel(const char* filename, Model* model){
- path=File::extractPath(filename);
-
- File* f=new File(filename, "rt");
- if(!f->isOpen()){
-
- return false;
- }
-
-
-
-
- char buff[256];
- Tokenizer t(" =\t\n\r\"", "\"");
-
- while(f->readLine(256, buff, true) != -1){
-
- //printf("Model: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
-
- if(streq(t.tokv[0], "MATERIAL_LIST")){
- readMaterialList(f);
- // }else if(streq(t.tokv[0], "KEYFRAME_LIST")){
- // readKeyframeList(f);
- }else if(streq(t.tokv[0], "MESH")){
- Mesh* m=readMesh(f);
- model->addMesh(m);
-
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in ModelLoader::loadModel() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
-
-
- f->close();
-
- delete[] materialList;
- delete[] path;
-
- // model->dump();
-
- return true;
- }
-