00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "meshbuilder.h"
00024 #include "basicsurfaceshader.h"
00025 #include "constanttexture.h"
00026 #include "imagetexture.h"
00027 #include "isurfaceshader.h"
00028 #include "lambertianbrdf.h"
00029 #include "map2.h"
00030
00031 #include <cassert>
00032
00033 using namespace sheep;
00034 using namespace std;
00035 using namespace toxic;
00036
00037 MeshBuilder::MeshBuilder(const Matrix4 &m,
00038 const ISurfaceShader *surface_shader,
00039 IObject::IntersectionMask intersection_mask
00040 ) :
00041 m_m(m),
00042 m_surface_shader(surface_shader),
00043 m_intersection_mask(intersection_mask)
00044 {
00045 }
00046
00047 MeshBuilder::~MeshBuilder() {}
00048
00049
00050
00051 IMeshBuilder::IGeometryBuilder *MeshBuilder::GeometryBuilder() {
00052 return this;
00053 }
00054
00055 IMeshBuilder::IMaterialBuilder *MeshBuilder::MaterialBuilder() {
00056 if(m_surface_shader)
00057 return 0;
00058 else return this;
00059 }
00060
00061 MeshBuilder::MeshVector MeshBuilder::GetMeshes() const {
00062 return m_meshes;
00063 }
00064
00065
00066
00067 void MeshBuilder::BeginSubMesh(const string &name) {
00068 m_meshes.push_back(new Mesh(m_m, m_surface_shader, m_intersection_mask));
00069 }
00070
00071 void MeshBuilder::EndSubMesh() {}
00072
00073 IMeshBuilder::FeatureId MeshBuilder::AppendVertex(const Vector3 &v) {
00074 return m_meshes.back()->AppendVertex(v);
00075 }
00076
00077 IMeshBuilder::FeatureId MeshBuilder::AppendNormal(const Vector3 &vn) {
00078 assert(vn.IsUnitLength());
00079
00080 return m_meshes.back()->AppendNormal(vn);
00081 }
00082
00083 IMeshBuilder::FeatureId MeshBuilder::AppendTexCoord(const Vector2 &vt) {
00084 return m_meshes.back()->AppendTexCoord(vt);
00085 }
00086
00087 IMeshBuilder::FeatureId MeshBuilder::AppendFace(int n, const FeatureId *v) {
00088 assert(n == 3);
00089 assert(v);
00090
00091 return m_meshes.back()->AppendTriangle(v[0], v[1], v[2]);
00092 }
00093
00094 void MeshBuilder::SetFaceNormals(FeatureId face, int n, const FeatureId *vn) {
00095 assert(n == 3);
00096 assert(vn);
00097
00098 m_meshes.back()->SetTriangleNormals(face, vn[0], vn[1], vn[2]);
00099 }
00100
00101 void MeshBuilder::SetFaceTexCoords(FeatureId face, int n, const FeatureId *vt) {
00102 assert(n == 3);
00103 assert(vt);
00104
00105 m_meshes.back()->SetTriangleTexCoords(face, vt[0], vt[1], vt[2]);
00106 }
00107
00108 void MeshBuilder::SetMaterial(FeatureId material_id) {
00109 if(m_surface_shader == 0) {
00110 assert(material_id >= 0 && material_id < m_surface_shaders.size());
00111 m_meshes.back()->SetSurfaceShader(m_surface_shaders[material_id]);
00112 }
00113 }
00114
00115
00116
00117 IMeshBuilder::FeatureId MeshBuilder::BeginMaterial(const string &name) {
00118 m_texture_map = 0;
00119 return static_cast<FeatureId>(m_surface_shaders.size());
00120 }
00121
00122 void MeshBuilder::EndMaterial() {
00123 ISurfaceShader *surface_shader;
00124
00125 if(m_texture_map) {
00126 surface_shader = new BasicSurfaceShader(
00127 0,
00128 Color3(0.0),
00129 new LambertianBRDF(),
00130 new ImageTexture(m_texture_map));
00131 } else {
00132 surface_shader = new BasicSurfaceShader(
00133 0,
00134 Color3(0.0),
00135 new LambertianBRDF(),
00136 new ConstantTexture(m_diffuse_color));
00137 }
00138
00139 m_surface_shaders.push_back(surface_shader);
00140
00141
00142
00143 m_texture_map = 0;
00144 }
00145
00146 void MeshBuilder::SetAmbientColor(Real r, Real g, Real b) {
00147
00148 }
00149
00150 void MeshBuilder::SetDiffuseColor(Real r, Real g, Real b) {
00151 m_diffuse_color.m_r = r;
00152 m_diffuse_color.m_g = g;
00153 m_diffuse_color.m_b = b;
00154 }
00155
00156 void MeshBuilder::SetSpecularColor(Real r, Real g, Real b) {
00157
00158 }
00159
00160 void MeshBuilder::SetTexture(int w, int h, const unsigned char *texels) {
00161 delete m_texture_map;
00162 m_texture_map = new Map2(w, h, texels);
00163 }