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

glmeshbuilder.cpp

Go to the documentation of this file.
00001 /*
00002     Sheep - A Rigid Body Dynamics Engine
00003     Copyright (C) 2001-2004 Francois Beaune
00004     Contact: http://toxicengine.sourceforge.net/
00005 
00006     This file is part of Sheep.
00007 
00008     Sheep is free software; you can redistribute it and/or modify
00009     it under the terms of the GNU General Public License as published by
00010     the Free Software Foundation; either version 2 of the License, or
00011     (at your option) any later version.
00012 
00013     Sheep is distributed in the hope that it will be useful,
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016     GNU General Public License for more details.
00017 
00018     You should have received a copy of the GNU General Public License
00019     along with Sheep; if not, write to the Free Software
00020     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021 */
00022 
00023 #include "glmeshbuilder.h"  // include first
00024 #include "material.h"
00025 #include "texture.h"
00026 
00027 #include <cassert>
00028 #include <iostream>
00029 #include <string>
00030 
00031 using namespace sheep;
00032 using namespace std;
00033 
00034 GLMeshBuilder::GLMeshBuilder() :
00035     m_mesh(new GLMesh()),
00036     m_submesh(0),
00037     m_material(0)
00038 {
00039 }
00040 
00041 GLMeshBuilder::~GLMeshBuilder() {
00042     assert(m_submesh == 0);
00043     assert(m_material == 0);
00044 
00045     // Do not delete the materials now!
00046     //!\todo Delete the materials somewhere.
00047 }
00048 
00049 // IMeshBuilder interface.
00050 
00051 IMeshBuilder::IGeometryBuilder *GLMeshBuilder::GeometryBuilder() {
00052     return this;
00053 }
00054 
00055 IMeshBuilder::IMaterialBuilder *GLMeshBuilder::MaterialBuilder() {
00056     return this;
00057 }
00058 
00059 auto_ptr<GLMesh> GLMeshBuilder::GetMesh() {
00060     return m_mesh;
00061 }
00062 
00063 // IGeometryBuilder interface.
00064 
00065 void GLMeshBuilder::BeginSubMesh(const string &name) {
00066     assert(m_submesh == 0);
00067     m_submesh = new GLMesh::SubMesh();
00068 }
00069 
00070 void GLMeshBuilder::EndSubMesh() {
00071     assert(m_submesh);
00072 
00073     if(m_submesh->GetMaterial() == 0) {
00074         Material *material = new Material();
00075 
00076         // Set material defaults.
00077         material->SetAmbientColor(Color3(0.2));
00078         material->SetDiffuseColor(Color3(1.0));
00079         material->SetSpecularColor(Color3(0.0));
00080 
00081         m_submesh->SetMaterial(material);
00082     }
00083 
00084     m_mesh->Insert(m_submesh);
00085 
00086     m_submesh = 0;
00087 }
00088 
00089 IMeshBuilder::FeatureId GLMeshBuilder::AppendVertex(const Vector3 &v) {
00090     assert(m_submesh);
00091     m_submesh->m_vertices.push_back(v);
00092 
00093     return static_cast<FeatureId>(m_submesh->m_vertices.size() - 1);
00094 }
00095 
00096 IMeshBuilder::FeatureId GLMeshBuilder::AppendNormal(const Vector3 &vn) {
00097     assert(m_submesh);
00098     m_submesh->m_normals.push_back(vn);
00099 
00100     return static_cast<FeatureId>(m_submesh->m_normals.size() - 1);
00101 }
00102 
00103 IMeshBuilder::FeatureId GLMeshBuilder::AppendTexCoord(const Vector2 &vt) {
00104     assert(m_submesh);
00105     m_submesh->m_texcoords.push_back(vt);
00106 
00107     return static_cast<FeatureId>(m_submesh->m_texcoords.size() - 1);
00108 }
00109 
00110 IMeshBuilder::FeatureId GLMeshBuilder::AppendFace(int n, const FeatureId *v) {
00111     assert(m_submesh);
00112     assert(n == 3);
00113     assert(v);
00114 
00115     GLMesh::SubMesh::Face f;
00116 
00117     f.m_v0 = v[0];
00118     f.m_v1 = v[1];
00119     f.m_v2 = v[2];
00120 
00121     f.m_n0 = f.m_n1 = f.m_n2 = -1;  // no normals yet
00122     f.m_t0 = f.m_t1 = f.m_t2 = -1;  // no texture coordinates yet
00123 
00124     m_submesh->m_faces.push_back(f);
00125 
00126     return static_cast<FeatureId>(m_submesh->m_faces.size() - 1);
00127 }
00128 
00129 void GLMeshBuilder::SetFaceNormals(FeatureId face, int n, const FeatureId *vn) {
00130     assert(m_submesh);
00131     assert(face >= 0 && face < m_submesh->m_faces.size());
00132     assert(n == 3);
00133     assert(vn);
00134 
00135     GLMesh::SubMesh::Face &f = m_submesh->m_faces[face];
00136 
00137     f.m_n0 = vn[0];
00138     f.m_n1 = vn[1];
00139     f.m_n2 = vn[2];
00140 }
00141 
00142 void GLMeshBuilder::SetFaceTexCoords(FeatureId face, int n, const FeatureId *vt) {
00143     assert(m_submesh);
00144     assert(face >= 0 && face < m_submesh->m_faces.size());
00145     assert(n == 3);
00146     assert(vt);
00147 
00148     GLMesh::SubMesh::Face &f = m_submesh->m_faces[face];
00149 
00150     f.m_t0 = vt[0];
00151     f.m_t1 = vt[1];
00152     f.m_t2 = vt[2];
00153 }
00154 
00155 void GLMeshBuilder::SetMaterial(FeatureId material_id) {
00156     assert(m_submesh);
00157     assert(material_id >= 0 && material_id < m_materials.size());
00158 
00159     m_submesh->SetMaterial(m_materials[material_id]);
00160 }
00161 
00162 // IMaterialBuilder interface.
00163 
00164 IMeshBuilder::FeatureId GLMeshBuilder::BeginMaterial(const string &name) {
00165     assert(m_material == 0);
00166 
00167     m_material = new Material();
00168 
00169     // Set material defaults.
00170     m_material->SetAmbientColor(Color3(0.2));
00171     m_material->SetDiffuseColor(Color3(1.0));
00172     m_material->SetSpecularColor(Color3(0.0));
00173 
00174     m_materials.push_back(m_material);
00175 
00176     return static_cast<FeatureId>(m_materials.size() - 1);
00177 }
00178 
00179 void GLMeshBuilder::EndMaterial() {
00180     assert(m_material);
00181     m_material = 0;
00182 }
00183 
00184 void GLMeshBuilder::SetAmbientColor(Real r, Real g, Real b) {
00185     assert(m_material);
00186     m_material->SetAmbientColor(Color3(r, g, b));
00187 }
00188 
00189 void GLMeshBuilder::SetDiffuseColor(Real r, Real g, Real b) {
00190     assert(m_material);
00191     m_material->SetDiffuseColor(Color3(r, g, b));
00192 }
00193 
00194 void GLMeshBuilder::SetSpecularColor(Real r, Real g, Real b) {
00195     assert(m_material);
00196     m_material->SetSpecularColor(Color3(r, g, b));
00197 }
00198 
00199 void GLMeshBuilder::SetTexture(int w, int h, const unsigned char *texels) { //!< 24-bit RGB format.
00200     assert(m_material);
00201 
00202     //!\todo Delete the texture somewhere.
00203     m_material->SetTexture(new Texture(w, h, texels));
00204 }

Generated on Tue May 11 01:31:50 2004 for toxic by doxygen 1.3.6