diff options
| author | Mateja Marić <mail@matejamaric.com> | 2021-02-19 15:19:45 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-19 15:19:45 +0100 | 
| commit | 3b89cf20f583a82a3cd5bdbe04c07630838af5c3 (patch) | |
| tree | 46b427b725795b86e7414111720b547aacfddceb | |
| parent | ea5f50550ea2027043c9c3d0f5d998a1a1d336a5 (diff) | |
| parent | cf3e1771a342764ca26b2af843f173d1e994ed9f (diff) | |
| download | erender-3b89cf20f583a82a3cd5bdbe04c07630838af5c3.tar.gz erender-3b89cf20f583a82a3cd5bdbe04c07630838af5c3.zip | |
Merge pull request #7 from MatejaMaric/fix-issue-6
Fix issue #6
| -rw-r--r-- | src/ObjModel.cpp | 104 | ||||
| -rw-r--r-- | src/ObjModel.h | 3 | ||||
| -rw-r--r-- | src/main.cpp | 117 | 
3 files changed, 129 insertions, 95 deletions
| diff --git a/src/ObjModel.cpp b/src/ObjModel.cpp index f23cfc3..8933da8 100644 --- a/src/ObjModel.cpp +++ b/src/ObjModel.cpp @@ -6,56 +6,66 @@ 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;
 -	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);
  }
  ObjModel::ObjModel(const ObjModel& a) 
 diff --git a/src/ObjModel.h b/src/ObjModel.h index 9f66867..63d49ef 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,8 @@ 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);
  	ObjModel(const ObjModel& a);
 diff --git a/src/main.cpp b/src/main.cpp index f229003..ca4ff1b 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,54 +28,77 @@ 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::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();
 -	}
 +	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";
 +  }
 +
 +  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;
  	return 0;
  }
 | 
