diff --git a/includes/RT/ObjParser.hpp b/includes/RT/ObjParser.hpp index 2338997..19f04c0 100644 --- a/includes/RT/ObjParser.hpp +++ b/includes/RT/ObjParser.hpp @@ -29,7 +29,7 @@ class ObjParser void addFace(std::stringstream &line); long int checkVertexIndex(int index, size_t size); void parseMtl(std::stringstream &line, Scene &scene); - bool addTriangleFromPolygon(std::vector &vertices, int inv); + bool addTriangleFromPolygon(std::vector &vertices, std::vector &textureVertices, int inv); void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, std::vector textureVertices); std::string getFilePath(std::string &file); int pointInTriangle(glm::vec3 pts[3], std::vector vertices, size_t cur); diff --git a/scenes/test.rt b/scenes/test.rt index 291f9af..a3f2b2a 100644 --- a/scenes/test.rt +++ b/scenes/test.rt @@ -8,6 +8,6 @@ MAT 255 255 255 0. 0.0 0.0 LAM 0 // tex 1 sp 0 8 0 1.0 1 -OBJ scenes/obj/tails.obj 0 0 0 1 -# OBJ scenes/obj/Lowpoly_tree_sample.obj 10 0 0 -OBJ scenes/obj/cat.obj -10 0 0 0.25 90 0 0 +OBJ obj/tails.obj 0 0 0 1 +# OBJ obj/Lowpoly_tree_sample.obj 10 0 0 +OBJ obj/cat.obj -10 0 0 0.25 90 0 0 diff --git a/srcs/class/ObjParser.cpp b/srcs/class/ObjParser.cpp index 4697074..428d159 100644 --- a/srcs/class/ObjParser.cpp +++ b/srcs/class/ObjParser.cpp @@ -98,20 +98,31 @@ int ObjParser::pointInTriangle(glm::vec3 pts[3], std::vector vertices return(0); } -bool ObjParser::addTriangleFromPolygon(std::vector &vertices, int inv) +bool ObjParser::addTriangleFromPolygon(std::vector &vertices, std::vector &textureVertices, int inv) { - glm::vec3 v1, v2 ,v3; + glm::vec3 v1, v2, v3; + glm::vec2 vt1, vt2, vt3; + float dot; for (size_t i = 0; i < vertices.size(); i++) { if(!i) + { v1 = vertices.back(); + vt1 = textureVertices.back(); + } else + { v1 = vertices[i - 1]; + vt1 = textureVertices[i - 1]; + } v2 = vertices[i]; v3 = vertices[(i + 1) % vertices.size()]; + vt2 = textureVertices[i]; + vt3 = textureVertices[(i + 1) % textureVertices.size()]; + if (inv) dot = glm::cross(v2 - v1, v2 - v3).z; else @@ -122,7 +133,15 @@ bool ObjParser::addTriangleFromPolygon(std::vector &vertices, int inv if(pointInTriangle(triangleVertices, vertices, i)) continue; vertices.erase(vertices.begin() + i); - addTriangle(v1, v2, v3, std::vector(0)); + textureVertices.erase(textureVertices.begin() + i); + + + std::vector texture; + texture.push_back(vt1); + texture.push_back(vt2); + texture.push_back(vt3); + + addTriangle(v1, v2, v3, texture); return(1); } return(0); @@ -172,8 +191,8 @@ void ObjParser::addFace(std::stringstream &line) throw std::runtime_error("OBJ : face does not have enough vertices"); while(faceVertices.size() > 3) - if (!addTriangleFromPolygon(faceVertices, 0)) - if(!addTriangleFromPolygon(faceVertices, 1)) + if (!addTriangleFromPolygon(faceVertices, textureVertices, 0)) + if(!addTriangleFromPolygon(faceVertices, textureVertices, 1)) return ; if(!line.eof())