00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "glmeshbuilder.h"
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
00046
00047 }
00048
00049
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
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
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;
00122 f.m_t0 = f.m_t1 = f.m_t2 = -1;
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
00163
00164 IMeshBuilder::FeatureId GLMeshBuilder::BeginMaterial(const string &name) {
00165 assert(m_material == 0);
00166
00167 m_material = new Material();
00168
00169
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) {
00200 assert(m_material);
00201
00202
00203 m_material->SetTexture(new Texture(w, h, texels));
00204 }