diff --git a/Makefile b/Makefile index 1096c76..d1d0117 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ ALL_SRCS := $(IMGUI_SRCS) \ class/Scene.cpp \ class/SceneParser.cpp \ class/ObjParser.cpp \ - CLASS/BVH.cpp \ + class/BVH.cpp \ SRCS := $(ALL_SRCS:%=$(SRCS_DIR)/%) OBJS := $(addprefix $(OBJS_DIR)/, $(SRCS:%.cpp=%.o)) diff --git a/RT b/RT deleted file mode 100644 index a06a478..0000000 Binary files a/RT and /dev/null differ diff --git a/imgui.ini b/imgui.ini index 85e92ba..3af6cd7 100644 --- a/imgui.ini +++ b/imgui.ini @@ -3,14 +3,14 @@ Pos=60,60 Size=400,400 [Window][Camera] -Pos=1655,22 +Pos=651,101 Size=229,184 [Window][Material] -Pos=1629,224 +Pos=1136,164 Size=266,285 [Window][Fog settings] -Pos=1656,509 +Pos=884,462 Size=247,157 diff --git a/includes/RT/ObjParser.hpp b/includes/RT/ObjParser.hpp index b28b264..937461c 100644 --- a/includes/RT/ObjParser.hpp +++ b/includes/RT/ObjParser.hpp @@ -6,7 +6,7 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/16 15:00:49 by tomoron #+# #+# */ -/* Updated: 2025/01/16 22:00:15 by tomoron ### ########.fr */ +/* Updated: 2025/01/17 14:53:58 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,8 +27,9 @@ class ObjParser void addFace(std::stringstream &line, std::vector &vertices, int mat, Scene &scene); long int checkVertexIndex(int index, size_t size); void parseMtl(std::stringstream &line, std::map &materials, Scene &scene); - void addTriangleFromPolygon(std::vector &vertices, Scene &scene); + bool addTriangleFromPolygon(std::vector &vertices, Scene &scene, int mat, int inv); void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, int mat, Scene &scene); + int pointInTriangle(glm::vec3 pts[3], std::vector vertices, size_t cur); std::ifstream _file; std::vector vertex; diff --git a/obj/Lowpoly_tree_sample.obj b/obj/Lowpoly_tree_sample.obj index 9c2c816..f199bf5 100644 --- a/obj/Lowpoly_tree_sample.obj +++ b/obj/Lowpoly_tree_sample.obj @@ -1,7 +1,3 @@ -# OBJ written from D:\Cloud\Projects\Personal\Turbosquid\Lowpoly_Trees\Publish_Sample\Lowpoly_tree_sample.obj -# Units meters - -o Tree_lp_11 v -0.524753 -0.707811 -1.37533 v -1.53072 -0.666692 -0.246043 v -0.906262 -0.661508 1.11465 diff --git a/srcs/class/ObjParser.cpp b/srcs/class/ObjParser.cpp index fb3a378..d429df1 100644 --- a/srcs/class/ObjParser.cpp +++ b/srcs/class/ObjParser.cpp @@ -6,7 +6,7 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/16 15:00:33 by tomoron #+# #+# */ -/* Updated: 2025/01/16 22:00:46 by tomoron ### ########.fr */ +/* Updated: 2025/01/17 14:54:36 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,39 +42,82 @@ long int ObjParser::checkVertexIndex(int index, size_t size) return(index - 1); } -//void ObjParser::isEar(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, std::vector &vertices) -//{ -// -//} - -void ObjParser::addTriangleFromPolygon(std::vector &vertices, Scene &scene) +int ObjParser::pointInTriangle(glm::vec3 pts[3], std::vector vertices, size_t cur) { - glm::vec3 normal; - glm::vec3 v1, v2 ,v3, v4; + glm::vec3 v0, v1, v2; + float d00, d01, d11, d20, d21; + float den; + float u, v; + + for(size_t i = 0; i < vertices.size(); i++) + { + if(i == ((cur - 1) % vertices.size()) || i == cur || i == ((cur + 1) % vertices.size())) + continue; + v0 = pts[2] - pts[0]; + v1 = pts[1] - pts[0]; + v2 = vertices[i] - pts[0]; + + d00 = glm::dot(v0, v0); + d01 = glm::dot(v0, v1); + d11 = glm::dot(v1, v1); + d20 = glm::dot(v2, v0); + d21 = glm::dot(v2, v1); + den = glm::dot(d00, d11) - glm::dot(d01, d01); + + u = (glm::dot(d11, d20) - glm::dot(d01, d21)) / den; + v = (glm::dot(d00, d21) - glm::dot(d01, d20)) / den; + if(u >= 0 && v >= 0 && (u + v) <= 1) + return(1); + } + return(0); +} + +bool ObjParser::addTriangleFromPolygon(std::vector &vertices, Scene &scene, int mat, int inv) +{ + glm::vec3 v1, v2 ,v3; + float dot; (void)scene; for (size_t i = 0; i < vertices.size(); i++) { - v1 = vertices[(i - 1) % vertices.size()]; + std::cout << (char)('A' + i) << std::endl; + if(!i) + v1 = vertices.back(); + else + v1 = vertices[i - 1]; v2 = vertices[i]; v3 = vertices[(i + 1) % vertices.size()]; - v4 = vertices[(i + 2) % vertices.size()]; - normal = glm::normalize(glm::cross(v2 - v1, v3 - v1)); - // std::cout << glm::to_string(normal) << std::endl; - - // float dot = glm::dot(normal, v4 - v1); - // std::cout << dot << std::endl; - //if(isEar(v1, v2 ,v3, vertices)) - //{ - // vertices.erase(vertices.begin() + i); - // scene.addObject(new Triangle(v1, v2 ,v3)); - //} + std::cout << glm::to_string(v1) << std::endl; + std::cout << glm::to_string(v2) << std::endl; + std::cout << glm::to_string(v3) << std::endl; +// not gud dot = glm::dot(v2 - v1, v2 - v3) / (glm::length(v2 - v1) * glm::length(v2 - v3)); +// with the one above dot = std::acos(dot) * (180.0/3.141592653589793238463); // if dot > 180 + if (inv) + dot = glm::cross(v2 - v1, v2 - v3).z; //maybe gud + else + dot = glm::cross(v2 - v3, v2 - v1).z; //maybe gud +// almost works dot = glm::dot(glm::normalize(v1 - v2), glm::normalize(v3 - v2)); + std::cout << "dot : " << dot << std::endl; + if(dot <= 0) + { + std::cout << "concave" << std::endl; + continue; + } +// std::cout << "convex" << std::endl; +// std::cout << std::endl; +// continue; + if(pointInTriangle((glm::vec3 [3]){v1, v2, v3}, vertices, i)) + { + std::cout << "vert in triangle" << std::endl; + continue; + } + vertices.erase(vertices.begin() + i); + addTriangle(v1, v2 ,v3 ,mat, scene); + return(1); } - // std::cout << std::endl; - // std::cout << std::endl; - // std::cout << std::endl; - // std::cout << std::endl; + return(0); + std::cout << "____________________" << std::endl; } void ObjParser::addFace(std::stringstream &line, std::vector &vertices, int mat, Scene &scene) @@ -93,8 +136,10 @@ void ObjParser::addFace(std::stringstream &line, std::vector &vertice // std::cout << face_vertices[i].x << " " << face_vertices[i].y << " " << face_vertices[i].z << " | "; // std::cout << std::endl; -// while(face_vertices.size() > 3) -// addTriangleFromPolygon(face_vertices, scene); + while(face_vertices.size() > 3) + if (!addTriangleFromPolygon(face_vertices, scene, mat, 0)) + addTriangleFromPolygon(face_vertices, scene, mat, 1); + if(!line.eof()) throw std::runtime_error("OBJ: an error occured while parsing face"); addTriangle(face_vertices[0], face_vertices[1], face_vertices[2],mat, scene); @@ -208,7 +253,7 @@ void ObjParser::parse(Scene &scene) throw std::runtime_error("OBJ: invalid material name"); curMat = matNames[identifier]; } - }catch (std::exception &e) + } catch (std::exception &e) { std::cerr << line << std::endl; throw;