From 154ed3f05829e8e719186e9f3763f0312894ed60 Mon Sep 17 00:00:00 2001 From: Youssef Assem Date: Tue, 10 Dec 2019 13:54:56 +0200 Subject: [PATCH] fixes --- OpenWindow/ColladaModel.cpp | 149 ++++++++++++------------------------ OpenWindow/ColladaModel.h | 25 +++--- OpenWindow/output.tga | Bin 20044 -> 23416 bytes OpenWindow/renderer.cpp | 42 +++++----- 4 files changed, 86 insertions(+), 130 deletions(-) diff --git a/OpenWindow/ColladaModel.cpp b/OpenWindow/ColladaModel.cpp index ee45904..51db00e 100644 --- a/OpenWindow/ColladaModel.cpp +++ b/OpenWindow/ColladaModel.cpp @@ -1,127 +1,78 @@ #include "ColladaModel.h" -ColladaModel::ColladaModel(const char* filename) : positions_(), triangles_() ,normals_() +ColladaModel::ColladaModel(const char* filename) : faces_(), vertices_(), normals_() { tinyxml2::XMLDocument doc; doc.LoadFile(filename); + /////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////faces////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////////// + face_count = 0; + tinyxml2::XMLElement* xml_face = doc.FirstChildElement("COLLADA")->FirstChildElement("library_geometries")->FirstChildElement("geometry")->FirstChildElement("mesh")->FirstChildElement("triangles"); + xml_face->QueryIntAttribute("count", &face_count); //get count + std::stringstream str_triangle(xml_face->FirstChildElement("p")->GetText()); //get values as a string - ///////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////////// - tinyxml2::XMLElement* xml_triangle_count = doc.FirstChildElement("COLLADA")->FirstChildElement("library_geometries")->FirstChildElement("geometry")->FirstChildElement("mesh")->FirstChildElement("triangles"); - triangle_count = 0; - xml_triangle_count->QueryIntAttribute("count", &triangle_count); - - tinyxml2::XMLElement* xml_triangle = doc.FirstChildElement("COLLADA")->FirstChildElement("library_geometries")->FirstChildElement("geometry")->FirstChildElement("mesh")->FirstChildElement("triangles")->FirstChildElement("p"); - const char* xml2_triangle = xml_triangle->GetText(); - std::stringstream str_triangle(xml2_triangle); - - std::vector> triangle(triangle_count, std::vector(3, Vec3i(0, 0, 0))); - for (int i = 0; i < triangle_count; i++) + for (int i = 0; i < face_count; i++) { - int x = 0; - - str_triangle >> x; - triangle[i][0].x = x; - - str_triangle >> x; - triangle[i][1].x = x; - - str_triangle >> x; - triangle[i][2].x = x; - - - - str_triangle >> x; - triangle[i][0].y = x; - - str_triangle >> x; - triangle[i][1].y = x; - - str_triangle >> x; - triangle[i][2].y = x; - - - - str_triangle >> x; - triangle[i][0].z = x; - - str_triangle >> x; - triangle[i][1].z = x; - - str_triangle >> x; - triangle[i][2].z = x; + faces_.push_back(std::vector()); + for (int j = 0; j < 3; j++) + { + Vec3i temp; + str_triangle >> temp.x; + str_triangle >> temp.y; + str_triangle >> temp.z; + faces_[i].push_back(temp); + } } + /////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////vertex///////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////////// + vertex_count = 0; + tinyxml2::XMLElement* xml_vertex = doc.FirstChildElement("COLLADA")->FirstChildElement("library_geometries")->FirstChildElement("geometry")->FirstChildElement("mesh")->FirstChildElement("source")->FirstChildElement("float_array"); + xml_vertex->QueryIntAttribute("count", &vertex_count); + std::stringstream str_vertex(xml_vertex->GetText()); - ///////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////////// - tinyxml2::XMLElement* xml_vertice = doc.FirstChildElement("COLLADA")->FirstChildElement("library_geometries")->FirstChildElement("geometry")->FirstChildElement("mesh")->FirstChildElement("source")->FirstChildElement("float_array"); - vertice_count = 0; - xml_vertice->QueryIntAttribute("count", &vertice_count); - - const char* xml2_vertice = xml_vertice->GetText(); - std::stringstream str_vertice(xml2_vertice); - - std::vector vertice(vertice_count / 3); - for (int i = 0; i < vertice_count / 3; i++) + for (int i = 0; i < vertex_count / 3; i++) { - float x = 0; - - str_vertice >> x; - vertice[i].x = x; - - str_vertice >> x; - vertice[i].y = x; - - str_vertice >> x; - vertice[i].z = x; + Vec3f temp; + str_vertex >> temp.x; + str_vertex >> temp.y; + str_vertex >> temp.z; + vertices_.push_back(temp); } - - ///////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////////// - tinyxml2::XMLElement* xml_normal_count = doc.FirstChildElement("COLLADA")->FirstChildElement("library_geometries")->FirstChildElement("geometry")->FirstChildElement("mesh")->FirstChildElement("source")->NextSiblingElement()->FirstChildElement("float_array"); - int normal_count = 0; - xml_normal_count->QueryIntAttribute("count", &normal_count); + /////////////////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////normal//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////////////////// + normal_count = 0; tinyxml2::XMLElement* xml_normal = doc.FirstChildElement("COLLADA")->FirstChildElement("library_geometries")->FirstChildElement("geometry")->FirstChildElement("mesh")->FirstChildElement("source")->NextSiblingElement()->FirstChildElement("float_array"); - const char* xml2_normal = xml_normal->GetText(); - std::stringstream str_normal(xml2_normal); + xml_normal->QueryIntAttribute("count", &normal_count); + std::stringstream str_normal(xml_normal->GetText()); - std::vector normal(normal_count / 3); for (int i = 0; i < normal_count / 3; i++) { - float x = 0; - - str_normal >> x; - normal[i].x = x; - - str_normal >> x; - normal[i].y = x; - - str_normal >> x; - normal[i].z = x; + Vec3f temp; + str_normal >> temp.x; + str_normal >> temp.y; + str_normal >> temp.z; + normals_.push_back(temp); } - ///////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////////// } ColladaModel::~ColladaModel() { } -std::vector ColladaModel::triangle(int idx) { - return triangles_[idx]; +std::vector ColladaModel::face(int idx) { + return faces_[idx]; } -Vec3f ColladaModel::position(int i) { - return positions_[i]; +Vec3f ColladaModel::vertex(int i) { + return vertices_[i]; } -int ColladaModel::nposition() { - return vertice_count; +int ColladaModel::nvertices() { + return vertex_count; } -int ColladaModel::ntriangle() { - return triangle_count; +int ColladaModel::nfaces() { + return face_count; } \ No newline at end of file diff --git a/OpenWindow/ColladaModel.h b/OpenWindow/ColladaModel.h index 0229568..622cfa7 100644 --- a/OpenWindow/ColladaModel.h +++ b/OpenWindow/ColladaModel.h @@ -19,21 +19,28 @@ class ColladaModel { private: - std::vector positions_; - std::vector normals_; - std::vector > triangles_; + int face_count; + int vertex_count; + int normal_count; + int textureco_count; - int vertice_count; - int triangle_count; + std::vector > faces_; + std::vector vertices_; + std::vector normals_; + std::vector textureco_; public: ColladaModel(const char* filename); ~ColladaModel(); - Vec3f position(int i); - std::vector triangle(int idx); + std::vector face(int idx); + Vec3f vertex(int i); + Vec3f normal(int i); + Vec3f textureco(int i); - int nposition(); - int ntriangle(); + int nfaces(); + int nvertices(); + int nnormals(); + int ntextureco(); }; #endif \ No newline at end of file diff --git a/OpenWindow/output.tga b/OpenWindow/output.tga index 2cf62b69ea6554987b4c39c7d55026090f7b1631..6d683cec17054c7d6eb557e01670d92d854a41f5 100644 GIT binary patch literal 23416 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 S|IdH?<-dO$|M!poTJt~d#brML literal 20044 zcmeI)y9t0m5CqVL%dEig8qh9II1mMY*ncBxay6K|g$X7dUc3=qw96@{K0jX-8!*5C z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJgP8))C+j_oX0-Rrsx J_f+RH#tRFadkFvl diff --git a/OpenWindow/renderer.cpp b/OpenWindow/renderer.cpp index 30c6b88..4a77694 100644 --- a/OpenWindow/renderer.cpp +++ b/OpenWindow/renderer.cpp @@ -208,25 +208,7 @@ void my_triangle(Vec2i t0, Vec2i t1, Vec2i t2, TGAImage& image, TGAColor color) void render() { - ColladaModel* model = new ColladaModel("african_head.dae"); - TGAImage image(800, 800, TGAImage::RGB); - Vec3f light_dir(0, 0, -1); - for (int i = 0; i < model->ntriangle(); i++) { - std::vector face = model->triangle(i); - Vec2i screen_coords[3]; - Vec3f world_coords[3]; - for (int j = 0; j < 3; j++) { - Vec3f v = face[0]; - screen_coords[j] = Vec2i((v.x + 1.) * 800 / 2., (v.y + 1.) * 800 / 2.); - world_coords[j] = v; - } - my_triangle(screen_coords[0], screen_coords[1], screen_coords[2], image, TGAColor(255,255,255,255)); - } - - image.flip_vertically(); // i want to have the origin at the left bottom corner of the image - image.write_tga_file("output.tga"); - delete model; - + //Model* model = new Model("african_head.obj"); //Matrix ViewPort = viewport(screen_width / 8, screen_height / 8, screen_width * 3 / 4, screen_height * 3 / 4); //Matrix Projection = Matrix::identity(); //Matrix ModelView = lookat(eye, center, Vec3f(0, 1, 0)); @@ -249,7 +231,7 @@ void render() // Vec3f v = model->vert(face[j]); // Vec4f v4(v); // Vec3f coord(z * v4); - // + // screen_coords[j] = coord; // world_coords[j] = v; // diffuse_coords[j] = model->uv(i, j); @@ -259,6 +241,22 @@ void render() // triangle(screen_coords, model, diffuse_coords, intensities, Vec3f(0, 0, 5)); //} - //delete model; -} + ColladaModel* model = new ColladaModel("african_head.dae"); + TGAImage image(800, 800, TGAImage::RGB); + Vec3f light_dir(0, 0, -1); + for (int i = 0; i < model->nfaces(); i++) { + std::vector face = model->face(i); + Vec2i screen_coords[3]; + Vec3f world_coords[3]; + for (int j = 0; j < 3; j++) { + Vec3f v = model->vertex(face[j][0]); + screen_coords[j] = Vec2i((v.x + 1.) * 800 / 2., (v.y + 1.) * 800 / 2.); + world_coords[j] = v; + } + my_triangle(screen_coords[0], screen_coords[1], screen_coords[2], image, white); + } + image.flip_vertically(); // i want to have the origin at the left bottom corner of the image + image.write_tga_file("output.tga"); + delete model; +} \ No newline at end of file