Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

TriangleMesh.cpp

00001 /*************************************************************************** 00002 * This file is part of OpenCAL: Open Computer Animation Library * 00003 * I created OpenCAL as my master's thesis Computer Science (multimedia) * 00004 * at the tUL university in Diepenbeek, Belgium * 00005 * * 00006 * Copyright (C) 2003-2004 by Jeroen Dierckx * 00007 * jeroen.dierckx@student.luc.ac.be * 00008 * * 00009 ***************************************************************************/ 00010 00011 // Includes 00012 #include "TriangleMesh.h" 00013 #include <OpenCAL/Vertex.h> 00014 #include <OpenCAL/Triangle.h> 00015 #include <OpenCAL/MeshLoader.h> 00016 using namespace OpenCAL; 00017 00018 #include <OpenCAL/Material.h> 00019 #include <OpenCAL/Texture.h> 00020 using namespace OpenCAL::Utils; 00021 00022 using namespace std; 00023 00024 00025 /****************************** 00026 * Constructors and destructor * 00027 ******************************/ 00028 00029 TriangleMesh::TriangleMesh(bool rigid) 00030 : m_texture(0), m_rigid(rigid), m_drawNormals(false) 00031 { 00032 } 00033 00034 TriangleMesh::TriangleMesh(const string &filename, bool rigid) 00035 : m_texture(0), m_rigid(rigid), m_drawNormals(false) 00036 { 00037 MeshLoader::loadMesh(this, filename); 00038 } 00039 00040 TriangleMesh::~TriangleMesh() 00041 { 00042 clear(); 00043 } 00044 00045 00046 /************************ 00047 * Get and set functions * 00048 ************************/ 00049 00050 00051 /**************** 00052 * Add functions * 00053 ****************/ 00054 00055 Vertex *TriangleMesh::addVertex(const Vertex &vertex) 00056 { 00057 m_vertices.push_back(new Vertex(vertex)); 00058 return m_vertices.back(); 00059 } 00060 00061 Triangle *TriangleMesh::addTriangle(const Triangle &triangle) 00062 { 00063 m_triangles.push_back(new Triangle(triangle)); 00064 return m_triangles.back(); 00065 } 00066 00067 Material *TriangleMesh::addMaterial() 00068 { 00069 m_materials.push_back(new Material()); 00070 return m_materials.back(); 00071 } 00072 00073 Material *TriangleMesh::addMaterial(const Material &material) 00074 { 00075 m_materials.push_back(new Material(material)); 00076 return m_materials.back(); 00077 } 00078 00079 /* 00080 Texture *TriangleMesh::addTexture() 00081 { 00082 m_textures.push_back(new Texture()); 00083 return m_textures.back(); 00084 } 00085 00086 Texture *TriangleMesh::addTexture(const Texture &texture) 00087 { 00088 m_textures.push_back(new Texture(texture)); 00089 return m_textures.back(); 00090 } 00091 */ 00092 00093 00094 /****************** 00095 * Other functions * 00096 ******************/ 00097 00098 void TriangleMesh::clear() 00099 { 00100 TriangleList::iterator triangle; 00101 for(triangle = m_triangles.begin(); triangle != m_triangles.end(); ++triangle) 00102 delete *triangle; 00103 m_triangles.clear(); 00104 00105 VertexList::iterator vertex; 00106 for(vertex = m_vertices.begin(); vertex != m_vertices.end(); ++vertex) 00107 delete *vertex; 00108 m_vertices.clear(); 00109 00110 MaterialList::iterator material; 00111 for(material = m_materials.begin(); material != m_materials.end(); ++material) 00112 delete *material; 00113 m_materials.clear(); 00114 00115 /* 00116 TextureList::iterator texture; 00117 for(texture = m_textures.begin(); texture != m_textures.end(); ++texture) 00118 delete *texture; 00119 m_textures.clear(); 00120 */ 00121 } 00122 00123 void TriangleMesh::invalidateTriangleNormals() 00124 { 00125 TriangleList::iterator triangle; 00126 for(triangle = m_triangles.begin(); triangle != m_triangles.end(); ++triangle) 00127 (*triangle)->invalidateNormal(); 00128 } 00129 00130 void TriangleMesh::calculateVertexNormals() 00131 { 00132 TriangleList::iterator triangle; 00133 for(triangle = m_triangles.begin(); triangle != m_triangles.end(); ++triangle) 00134 { 00135 (*triangle)->getVertex(0)->addNormal((*triangle)->getNormal()); 00136 (*triangle)->getVertex(1)->addNormal((*triangle)->getNormal()); 00137 (*triangle)->getVertex(2)->addNormal((*triangle)->getNormal()); 00138 } 00139 00140 VertexList::iterator vertex; 00141 for(vertex = m_vertices.begin(); vertex != m_vertices.end(); ++vertex) 00142 (*vertex)->getNormalP()->normalize(); 00143 } 00144 00145 void TriangleMesh::loadFromFile(const string &filename) 00146 { 00147 MeshLoader::loadMesh(this, filename); 00148 } 00149 00150 //void TriangleMesh::initialize() 00151 //{ 00152 //if(m_texture) 00153 // m_texture->initialize(); 00154 /* 00155 TextureList::iterator texture; 00156 for(texture = m_textures.begin(); texture != m_textures.end(); ++texture) 00157 (*texture)->initialize(); 00158 */ 00159 //} 00160 00161 /* 00162 #ifdef USE_OPENGL 00163 void TriangleMesh::drawGL() 00164 { 00165 invalidateTriangleNormals(); 00166 calculateVertexNormals(); 00167 00168 glLineWidth(1.0f); 00169 00170 if(m_texture) 00171 { 00172 glEnable(GL_TEXTURE_2D); 00173 m_texture->bindGL(); 00174 } 00175 else 00176 glDisable(GL_TEXTURE_2D); 00177 00178 glBegin(GL_TRIANGLES); 00179 00180 TriangleList::iterator it; 00181 for(it = m_triangles.begin(); it != m_triangles.end(); ++it) 00182 { 00183 Triangle *t = *it; 00184 00185 // Material 00186 if(t->hasMaterial()) 00187 t->getMaterial()->applyGL(); 00188 00189 // Vertices 00190 if(m_texture) 00191 glTexCoord2f(t->getVertex(0)->getTextureU(), t->getVertex(0)->getTextureV()); 00192 if(m_useNormals) 00193 glNormal3fv(t->getVertex(0)->getNormal()); 00194 glVertex3fv(t->getVertex(0)->getPosition()); 00195 00196 if(m_texture) 00197 glTexCoord2f(t->getVertex(1)->getTextureU(), t->getVertex(1)->getTextureV()); 00198 if(m_useNormals) 00199 glNormal3fv(t->getVertex(1)->getNormal()); 00200 glVertex3fv(t->getVertex(1)->getPosition()); 00201 00202 if(m_texture) 00203 glTexCoord2f(t->getVertex(2)->getTextureU(), t->getVertex(2)->getTextureV()); 00204 if(m_useNormals) 00205 glNormal3fv(t->getVertex(2)->getNormal()); 00206 glVertex3fv(t->getVertex(2)->getPosition()); 00207 } 00208 00209 glEnd(); 00210 00211 if(m_texture) 00212 m_texture->unbindGL(); 00213 00214 00215 if(m_drawNormals) 00216 { 00217 glBegin(GL_LINES); 00218 00219 VertexList::iterator it2; 00220 for(it2 = m_vertices.begin(); it2 != m_vertices.end(); ++it2) 00221 { 00222 glVertex3fv((*it2)->getPosition()); 00223 glVertex3fv((*it2)->getPosition() + (*it2)->getNormal()); 00224 } 00225 00226 glEnd(); 00227 } 00228 } 00229 #endif // USE_OPENGL 00230 */ 00231 00232 00233 /********************** 00234 * Protected functions * 00235 **********************/

Generated on Sun Aug 15 19:19:23 2004 for OpenCAL: Open Computer Animation Library by doxygen 1.3.8