aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateja Marić <mail@matejamaric.com>2021-02-19 15:19:45 +0100
committerGitHub <noreply@github.com>2021-02-19 15:19:45 +0100
commit3b89cf20f583a82a3cd5bdbe04c07630838af5c3 (patch)
tree46b427b725795b86e7414111720b547aacfddceb
parentea5f50550ea2027043c9c3d0f5d998a1a1d336a5 (diff)
parentcf3e1771a342764ca26b2af843f173d1e994ed9f (diff)
downloaderender-3b89cf20f583a82a3cd5bdbe04c07630838af5c3.tar.gz
erender-3b89cf20f583a82a3cd5bdbe04c07630838af5c3.zip
Merge pull request #7 from MatejaMaric/fix-issue-6
Fix issue #6
-rw-r--r--src/ObjModel.cpp104
-rw-r--r--src/ObjModel.h3
-rw-r--r--src/main.cpp117
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;
}