From 79048d1ad84e33d5eacbc5dfbef752948e9a787f Mon Sep 17 00:00:00 2001
From: Mateja <mail@matejamaric.com>
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<std::chrono::duration<double>>(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<sstream>
 #include<fstream>
 #include<exception>
+#include<chrono>
 
 struct Triangle {
 	int p[3][3];
@@ -21,6 +22,7 @@ public:
 	std::vector<Texture_Coordinates> uvcoo;
 	std::vector<Vector4f> normals;
 	std::vector<Triangle> faces;
+  std::chrono::duration<double> 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<chrono>
-
-#include<SFML/Window.hpp>
+#include<SFML/Window.hpp>
 #include<SFML/Graphics.hpp>
 
 #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<double> speed = std::chrono::duration_cast<std::chrono::duration<double>>(time2 - time1);
-	std::cout << "Model loading time: " << speed.count() << "s\n";
+	std::chrono::duration<double> modelTextureLoadingTime = std::chrono::duration_cast<std::chrono::duration<double>>(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 <mail@matejamaric.com>
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<std::chrono::duration<double>>(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<Texture_Coordinates> uvcoo;
 	std::vector<Vector4f> normals;
 	std::vector<Triangle> faces;
+  bool isLoaded;
   std::chrono::duration<double> 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