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

ASELoader.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 "ASELoader.h" 00013 #include <OpenCAL/TriangleMesh.h> 00014 #include <OpenCAL/Vertex.h> 00015 #include <OpenCAL/Triangle.h> 00016 using namespace OpenCAL; 00017 00018 #include <OpenCAL/Vector3.h> 00019 using namespace Utils; 00020 00021 #include <fstream> 00022 using namespace std; 00023 00024 00025 00026 static void readStar(ifstream &file) 00027 { 00028 char c; 00029 do 00030 { 00031 file >> c; 00032 if(c == '*') 00033 break; 00034 } while(!file.eof()); 00035 } 00036 00037 static void findString(ifstream &file, const string &s) 00038 { 00039 char c; 00040 unsigned int i; 00041 00042 while(!file.eof()) 00043 { 00044 readStar(file); 00045 00046 for(i = 0; i < s.length(); ++i) 00047 { 00048 file >> c; 00049 if(c != s[i]) 00050 break; 00051 } 00052 00053 if(i == s.length()) 00054 break; 00055 } 00056 } 00057 00058 00059 00060 /****************************** 00061 * Constructors and destructor * 00062 ******************************/ 00063 00064 ASELoader::ASELoader() 00065 { 00066 } 00067 00068 ASELoader::~ASELoader() 00069 { 00070 } 00071 00072 00073 /************************ 00074 * Get and set functions * 00075 ************************/ 00076 00077 00078 /****************** 00079 * Other functions * 00080 ******************/ 00081 00082 void ASELoader::loadMesh(TriangleMesh *mesh, const string &filename) 00083 { 00084 const float scale = 0.03f; 00085 //const float scale = 1.0f; 00086 00087 cout << "Let's parse this ASE file (" << filename << ")" << endl; 00088 00089 // Open the file 00090 ifstream file(filename.c_str()); 00091 if(!file) 00092 { 00094 cerr << "The file couldn't be opened" << endl; 00095 return; 00096 } 00097 00098 // Clear the triangle mesh 00099 mesh->clear(); 00100 00101 00102 char c; 00103 int i, nmaterial, nvertex, nface, j, A, B, C; 00104 float x, y, z; 00105 float r, g, b; 00106 00107 // Number of vertices 00108 findString(file, "MESH_NUMVERTEX"); 00109 file >> nvertex; 00110 00111 // Number of triangles 00112 findString(file, "MESH_NUMFACES"); 00113 file >> nface; 00114 00115 00116 /* 00117 // Materials 00118 findString(file, "MATERIAL_LIST"); 00119 00120 // Number of materials 00121 findString(file, "MATERIAL_COUNT"); 00122 file >> nmaterial; 00123 mesh->reserveMaterials(nmaterial); 00124 00125 for(i = 0; i < nmaterial; ++i) 00126 { 00127 Material *mat = mesh->addMaterial(); 00128 00129 findString(file, "MATERIAL_AMBIENT"); 00130 file >> r >> g >> b; 00131 mat->setAmbient(Color(r, g, b)); 00132 00133 findString(file, "MATERIAL_DIFFUSE"); 00134 file >> r >> g >> b; 00135 mat->setDiffuse(Color(r, g, b)); 00136 00137 findString(file, "MATERIAL_SPECULAR"); 00138 file >> r >> g >> b; 00139 mat->setSpecular(Color(r, g, b)); 00140 00141 findString(file, "MATERIAL_SHINE"); 00142 file >> r; 00143 mat->setShininess(r); 00144 } 00145 */ 00146 00147 Material *green = mesh->addMaterial(); 00148 green->setAmbient(Color(0.1f, 0.6f, 0.08f)); 00149 green->setDiffuse(Color(0.08f, 0.65f, 0.1f)); 00150 green->setSpecular(Color(0.04f, 0.3f, 0.05f)); 00151 green->setShininess(30.0f); 00152 00153 00154 // Vertices 00155 mesh->reserveVertices(nvertex); 00156 findString(file, "MESH_VERTEX_LIST"); 00157 for(i = 0; i < nvertex; ++i) 00158 { 00159 findString(file, "MESH_VERTEX"); 00160 file >> j >> x >> y >> z; 00161 mesh->addVertex(Vertex(Vector3(x, y, z) * scale)); 00162 } 00163 00164 // Triangles 00165 mesh->reserveTriangles(nface); 00166 findString(file, "MESH_FACE_LIST"); 00167 for(i = 0; i < nface; ++i) 00168 { 00169 findString(file, "MESH_FACE"); 00170 unsigned smoothGroup = 0; 00171 file >> j >> c >> c >> c >> A >> c >> c >> B >> c >> c >> C; 00172 findString(file, "MESH_SMOOTHING"); 00173 file >> smoothGroup; 00174 00175 Vertex *v1 = mesh->getVertex(A); 00176 Vertex *v2 = mesh->getVertex(B); 00177 Vertex *v3 = mesh->getVertex(C); 00178 Triangle *triangle = mesh->addTriangle(Triangle(v1, v2, v3)); 00179 triangle->calculateNormal(); 00180 00181 triangle->setMaterial(green); 00182 00183 //triangles[i]->smoothGroup = smoothGroup; 00184 } 00185 00186 // Close the file 00187 file.close(); 00188 00189 // Calculate the vertex normals 00190 mesh->calculateVertexNormals(); 00191 00192 cout << "Done parsing " << nvertex << " vertices and " << nface << " triangles." << endl; 00193 } 00194 00195 00196 /********************** 00197 * Protected functions * 00198 **********************/

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