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 };