Main Page | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals

/Users/blackie/Documents/myRepository/phobosengine-vc2005/phobosengine/phobosengine/SGFMeshModel.cpp

Go to the documentation of this file.
00001 
00002 
00003 #include "SGFMeshModel.h"
00004 
00005 #include "Mesh.h"
00006 #include "Plane.h"
00007 #include "SingleTexturedMesh.h"
00008 #include "TextureDatabase.h"
00009 #include "Triangle.h"
00010 
00011 
00012 namespace pge {
00013 
00014 
00015         //****************************************************************************
00016         //
00017         //
00018         //
00019         //****************************************************************************
00020         SGFMeshModel::SGFMeshModel(SGFFile *sgfFile, ShaderObject *shader) {
00021                 convertMeshes(sgfFile, shader);
00022 
00023                 // ConvertMeshses adds the meshs to the model, so afterwards the boundingbox can be
00024                 // created.
00025                 buildBoundingBox();
00026         }
00027 
00028 
00029 
00030         //****************************************************************************
00031         //
00032         //
00033         //
00034         //****************************************************************************
00035         SGFMeshModel::SGFMeshModel(SGFFile *sgfFile, Vector3f bottomCenter, float scaleFactor, ShaderObject *shader) {
00036                 convertMeshes(sgfFile, shader);
00037                 
00038                 // Scale the model after the meshs have been converted.
00039                 if(scaleFactor != 0.0f && scaleFactor != 1.0f) {
00040                         scale(scaleFactor);
00041                 }
00042 
00043                 buildBoundingBox();
00044                 setBottomCenter(bottomCenter);
00045         }
00046 
00047 
00048         //****************************************************************************
00049         //
00050         //
00051         //
00052         //****************************************************************************
00053         SGFMeshModel::~SGFMeshModel(void) {
00054         }
00055 
00056 
00057         //****************************************************************************
00058         //
00059         //
00060         //
00061         //****************************************************************************
00062         void SGFMeshModel::convertMeshes(SGFFile *sgfFile, ShaderObject *shader) {
00063                 std::vector<SGFFile::SGFMesh> *meshs;
00064                 std::vector<SGFFile::SGFMesh>::iterator it;
00065                 std::vector<SGFFile::SGFPrimitive>::iterator primIt;
00066                 Texture *singleTexture;
00067 
00068 
00069                 meshs = sgfFile->getMeshs();
00070 
00071                 // Add textures to the global texturedatabase.
00072                 for(it = meshs->begin(); it != meshs->end(); it++) {
00073                         SGFFile::SGFMesh mesh = *it;
00074 
00075                         for(primIt = mesh.m_triangles.begin(); primIt != mesh.m_triangles.end(); primIt++) {
00076                                 SGFFile::SGFPrimitive prim = *primIt;
00077 
00078                                 // Save texture for later use in SingleTexturedMesh.
00079                                 TextureDatabase::getInstance()->addTexture(prim.m_textureFile);
00080                         }
00081                 }
00082 
00083                 // Go through each mesh.
00084                 for(it = meshs->begin(); it != meshs->end(); it++) {
00085                         SGFFile::SGFMesh sgfMesh = *it;
00086 
00087                         // Create the new mesh.
00088                         Mesh *mesh;
00089                         if(isSingleTextured(&sgfMesh)) {
00090                                 mesh = new SingleTexturedMesh();
00091                                 if(sgfMesh.m_triangles.size() > 0) {
00092                                         singleTexture = TextureDatabase::getInstance()->getTextureByName(sgfMesh.m_triangles.at(0).m_textureFile);
00093                                 }
00094                                 ((SingleTexturedMesh*)mesh)->setTexture(singleTexture);
00095                         } else {
00096                                 mesh = new Mesh();
00097                         }
00098 
00099                         for(primIt = sgfMesh.m_triangles.begin(); primIt != sgfMesh.m_triangles.end(); primIt++) {
00100                                 SGFFile::SGFPrimitive prim = *primIt;
00101                                 Triangle triangle;
00102 
00103                                 triangle.m_vertices[0] = sgfMesh.m_vertices.at(prim.m_indices[0]);
00104                                 triangle.m_vertices[1] = sgfMesh.m_vertices.at(prim.m_indices[1]);
00105                                 triangle.m_vertices[2] = sgfMesh.m_vertices.at(prim.m_indices[2]);
00106 
00107                                 triangle.m_texCoords[0] = prim.m_texCoords[0];
00108                                 triangle.m_texCoords[1] = prim.m_texCoords[1];
00109                                 triangle.m_texCoords[2] = prim.m_texCoords[2];
00110 
00111                                 triangle.m_texture = TextureDatabase::getInstance()->getTextureByName(prim.m_textureFile);
00112 
00113                                 triangle.m_plane = new Plane(&triangle);
00114 
00115                                 mesh->addTriangle(triangle);
00116                         }
00117                         addMesh(mesh);
00118                 }
00119         }
00120 
00121 
00122         //****************************************************************************
00123         //
00124         //
00125         //
00126         //****************************************************************************
00127         bool SGFMeshModel::isSingleTextured(SGFFile::SGFMesh *mesh) {
00128                 std::string refTexName;
00129                 std::vector<SGFFile::SGFPrimitive>::iterator it;
00130 
00131 
00132                 // Get first meshs texture name.
00133                 if(mesh->m_triangles.size() > 0) {
00134                         refTexName = mesh->m_triangles.at(0).m_textureFile;
00135                 } else {
00136                         return false;
00137                 }
00138 
00139                 // Compare each texture with the reference one.
00140                 for(it = mesh->m_triangles.begin(); it != mesh->m_triangles.end(); it++) {
00141                         SGFFile::SGFPrimitive prim = *it;
00142                         if(prim.m_textureFile != refTexName) {
00143                                 return false;
00144                         }
00145                 }
00146 
00147                 return true;
00148         }
00149 };

Generated on Mon Oct 16 12:08:11 2006 for Phobosengine by doxygen 1.3.4