From 79048d1ad84e33d5eacbc5dfbef752948e9a787f Mon Sep 17 00:00:00 2001 From: Mateja Date: Fri, 19 Feb 2021 14:56:08 +0100 Subject: Add texure loading check and loading time. Add ObjModel loadingTime. --- src/ObjModel.cpp | 4 ++++ src/ObjModel.h | 2 ++ src/main.cpp | 48 +++++++++++++++++++++++++++++++----------------- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/ObjModel.cpp b/src/ObjModel.cpp index f23cfc3..aa81cec 100644 --- a/src/ObjModel.cpp +++ b/src/ObjModel.cpp @@ -6,6 +6,8 @@ ObjModel::ObjModel() {} ObjModel::ObjModel(std::string fileName) { + std::chrono::high_resolution_clock::time_point time1 = std::chrono::high_resolution_clock::now(); + int hlp = 0; std::ifstream f(fileName); std::string s0; @@ -56,6 +58,8 @@ ObjModel::ObjModel(std::string fileName) } } + std::chrono::high_resolution_clock::time_point time2 = std::chrono::high_resolution_clock::now(); + loadingTime = std::chrono::duration_cast>(time2 - time1); } ObjModel::ObjModel(const ObjModel& a) diff --git a/src/ObjModel.h b/src/ObjModel.h index 9f66867..5ceed26 100644 --- a/src/ObjModel.h +++ b/src/ObjModel.h @@ -5,6 +5,7 @@ #include #include #include +#include struct Triangle { int p[3][3]; @@ -21,6 +22,7 @@ public: std::vector uvcoo; std::vector normals; std::vector faces; + std::chrono::duration loadingTime; ObjModel(); ObjModel(std::string fileName); ObjModel(const ObjModel& a); diff --git a/src/main.cpp b/src/main.cpp index f229003..11e199d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,4 @@ -#include - -#include +#include #include #include"Render.h" @@ -30,22 +28,36 @@ int main() Render render(width, height); - sf::Image image; - image.loadFromFile("model/modelTexture.png"); - Bitmap modelTexture(image.getSize().x, image.getSize().y); - const sf::Uint8* pp = image.getPixelsPtr(); - for (int i = 0; i < image.getSize().x * image.getSize().y * 4; i += 4) { - modelTexture.pixels[i + 0] = (unsigned char)pp[i + 0]; - modelTexture.pixels[i + 1] = (unsigned char)pp[i + 1]; - modelTexture.pixels[i + 2] = (unsigned char)pp[i + 2]; - modelTexture.pixels[i + 3] = (unsigned char)pp[i + 3]; - } + Bitmap* modelTexture; + + bool textureLoaded = false; std::chrono::high_resolution_clock::time_point time1 = std::chrono::high_resolution_clock::now(); - ObjModel model("model/model.obj"); + sf::Image image; + textureLoaded = image.loadFromFile("model/modelTexture.png"); + if (textureLoaded) { + modelTexture = new Bitmap(image.getSize().x, image.getSize().y); + const sf::Uint8* pp = image.getPixelsPtr(); + for (int i = 0; i < image.getSize().x * image.getSize().y * 4; i += 4) { + modelTexture->pixels[i + 0] = (unsigned char)pp[i + 0]; + modelTexture->pixels[i + 1] = (unsigned char)pp[i + 1]; + modelTexture->pixels[i + 2] = (unsigned char)pp[i + 2]; + modelTexture->pixels[i + 3] = (unsigned char)pp[i + 3]; + } + } std::chrono::high_resolution_clock::time_point time2 = std::chrono::high_resolution_clock::now(); - std::chrono::duration speed = std::chrono::duration_cast>(time2 - time1); - std::cout << "Model loading time: " << speed.count() << "s\n"; + std::chrono::duration modelTextureLoadingTime = std::chrono::duration_cast>(time2 - time1); + + ObjModel model("model/model.obj"); + + if (textureLoaded) { + std::cout << "Texture loading time: " << modelTextureLoadingTime.count() << "\n"; + } + else { + std::cerr << "Couldn't load and/or find texture!\n"; + } + + std::cout << "Model loading time: " << model.loadingTime.count() << "s\n"; std::cout << "Vertices count: " << model.vertices.size() << "\nNumber of normals: " << model.normals.size() << "\nUV count: " << model.uvcoo.size() << "\n"; std::cout << "Number of faces: " << model.faces.size() << "\n"; @@ -72,12 +84,14 @@ int main() render.fill(255, 255, 255); render.resetZBuf(); - render.renderModel(projectedModel, modelTexture); + render.renderModel(projectedModel, *modelTexture); texture.update((sf::Uint8*)render.pixels); window.draw(sprite); window.display(); } + delete modelTexture; + return 0; } -- cgit v1.2.3 From cf3e1771a342764ca26b2af843f173d1e994ed9f Mon Sep 17 00:00:00 2001 From: Mateja Date: Fri, 19 Feb 2021 15:10:53 +0100 Subject: Add load model check. Don't render if model and/or texture is not loaded. --- src/ObjModel.cpp | 100 +++++++++++++++++++++++++++++-------------------------- src/ObjModel.h | 1 + src/main.cpp | 73 ++++++++++++++++++++++------------------ 3 files changed, 94 insertions(+), 80 deletions(-) diff --git a/src/ObjModel.cpp b/src/ObjModel.cpp index aa81cec..8933da8 100644 --- a/src/ObjModel.cpp +++ b/src/ObjModel.cpp @@ -10,53 +10,59 @@ ObjModel::ObjModel(std::string fileName) int hlp = 0; std::ifstream f(fileName); - std::string s0; - while (getline(f, s0)) { - std::stringstream ss0(s0); - std::string s1 = ""; - ss0 >> s1; - if (s1.compare(0, s1.length(), "v") == 0) { - ss0 >> s1; - float x = std::stof(s1); - ss0 >> s1; - float y = std::stof(s1); - ss0 >> s1; - float z = std::stof(s1); - Vertice t(x, y, z, 1.0f, 0.0f, 0.0f); - vertices.push_back(t); - } - else if (s1.compare(0, s1.length(), "vn") == 0) { - ss0 >> s1; - float x = std::stof(s1); - ss0 >> s1; - float y = std::stof(s1); - ss0 >> s1; - float z = std::stof(s1); - Vector4f v(x, y, z, 0.0f); - normals.push_back(v); - } - else if (s1.compare(0, s1.length(), "vt") == 0) { - ss0 >> s1; - float u = std::stof(s1); - ss0 >> s1; - float v = std::stof(s1); - Texture_Coordinates kt; - kt.u = u; kt.v = v; - uvcoo.push_back(kt); - } - else if (s1.compare(0, s1.length(), "f") == 0) { - Triangle pt; - for (int i = 0; i < 3; i++) { - ss0 >> s1; - std::stringstream ss1(s1); - std::string s2; - for (int j = 0; std::getline(ss1, s2, '/'); j++) { - pt.p[i][j] = std::stoi(s2); - } - } - faces.push_back(pt); - } - } + if (f.is_open()) { + std::string s0; + while (getline(f, s0)) { + std::stringstream ss0(s0); + std::string s1 = ""; + ss0 >> s1; + if (s1.compare(0, s1.length(), "v") == 0) { + ss0 >> s1; + float x = std::stof(s1); + ss0 >> s1; + float y = std::stof(s1); + ss0 >> s1; + float z = std::stof(s1); + Vertice t(x, y, z, 1.0f, 0.0f, 0.0f); + vertices.push_back(t); + } + else if (s1.compare(0, s1.length(), "vn") == 0) { + ss0 >> s1; + float x = std::stof(s1); + ss0 >> s1; + float y = std::stof(s1); + ss0 >> s1; + float z = std::stof(s1); + Vector4f v(x, y, z, 0.0f); + normals.push_back(v); + } + else if (s1.compare(0, s1.length(), "vt") == 0) { + ss0 >> s1; + float u = std::stof(s1); + ss0 >> s1; + float v = std::stof(s1); + Texture_Coordinates kt; + kt.u = u; kt.v = v; + uvcoo.push_back(kt); + } + else if (s1.compare(0, s1.length(), "f") == 0) { + Triangle pt; + for (int i = 0; i < 3; i++) { + ss0 >> s1; + std::stringstream ss1(s1); + std::string s2; + for (int j = 0; std::getline(ss1, s2, '/'); j++) { + pt.p[i][j] = std::stoi(s2); + } + } + faces.push_back(pt); + } + } + isLoaded = true; + } + else { + isLoaded = false; + } std::chrono::high_resolution_clock::time_point time2 = std::chrono::high_resolution_clock::now(); loadingTime = std::chrono::duration_cast>(time2 - time1); diff --git a/src/ObjModel.h b/src/ObjModel.h index 5ceed26..63d49ef 100644 --- a/src/ObjModel.h +++ b/src/ObjModel.h @@ -22,6 +22,7 @@ public: std::vector uvcoo; std::vector normals; std::vector faces; + bool isLoaded; std::chrono::duration loadingTime; ObjModel(); ObjModel(std::string fileName); diff --git a/src/main.cpp b/src/main.cpp index 11e199d..ca4ff1b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -57,39 +57,46 @@ int main() std::cerr << "Couldn't load and/or find texture!\n"; } - std::cout << "Model loading time: " << model.loadingTime.count() << "s\n"; - std::cout << "Vertices count: " << model.vertices.size() << "\nNumber of normals: " << model.normals.size() << "\nUV count: " << model.uvcoo.size() << "\n"; - std::cout << "Number of faces: " << model.faces.size() << "\n"; - - while (window.isOpen()) - { - while (window.pollEvent(event)) - if (event.type == sf::Event::Closed) - window.close(); - - time = clock.getElapsedTime(); - - Vertice a1, b1, c1, d1, e1, f1; - - Matrix4f move = Matrix4f::move(0.0f, -150.0f, 600.0f); - Matrix4f rotate = Matrix4f::rotate(0.0f, time.asSeconds() * 25.0f, 0.0f); - Matrix4f scale = Matrix4f::scale(1.0f, 1.0f, 1.0f); - Matrix4f project = Matrix4f::perspective(1.0f, 10000.0f, fov, width / height); - Matrix4f end_matrix = project * move * rotate * scale; - - ObjModel projectedModel = model.multiplyMatrix(end_matrix); - projectedModel.divideW(); - projectedModel.screenspace(width, height); - - - render.fill(255, 255, 255); - render.resetZBuf(); - render.renderModel(projectedModel, *modelTexture); - - texture.update((sf::Uint8*)render.pixels); - window.draw(sprite); - window.display(); - } + if (model.isLoaded) { + std::cout << "Model loading time: " << model.loadingTime.count() << "s\n"; + std::cout << "Vertices count: " << model.vertices.size() << "\nNumber of normals: " << model.normals.size() << "\nUV count: " << model.uvcoo.size() << "\n"; + std::cout << "Number of faces: " << model.faces.size() << "\n"; + } + else { + std::cerr << "Couldn't load and/or find model!\n"; + } + + if (textureLoaded && model.isLoaded) { + while (window.isOpen()) + { + while (window.pollEvent(event)) + if (event.type == sf::Event::Closed) + window.close(); + + time = clock.getElapsedTime(); + + Vertice a1, b1, c1, d1, e1, f1; + + Matrix4f move = Matrix4f::move(0.0f, -150.0f, 600.0f); + Matrix4f rotate = Matrix4f::rotate(0.0f, time.asSeconds() * 25.0f, 0.0f); + Matrix4f scale = Matrix4f::scale(1.0f, 1.0f, 1.0f); + Matrix4f project = Matrix4f::perspective(1.0f, 10000.0f, fov, width / height); + Matrix4f end_matrix = project * move * rotate * scale; + + ObjModel projectedModel = model.multiplyMatrix(end_matrix); + projectedModel.divideW(); + projectedModel.screenspace(width, height); + + + render.fill(255, 255, 255); + render.resetZBuf(); + render.renderModel(projectedModel, *modelTexture); + + texture.update((sf::Uint8*)render.pixels); + window.draw(sprite); + window.display(); + } + } delete modelTexture; -- cgit v1.2.3