Merge branch 'main' of github.com:TheRedShip/RT_GPU

This commit is contained in:
TheRedShip
2025-01-17 16:30:33 +01:00
4 changed files with 79 additions and 37 deletions

View File

@ -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

View File

@ -6,7 +6,7 @@
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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<glm::vec3> &vertices, int mat, Scene &scene);
long int checkVertexIndex(int index, size_t size);
void parseMtl(std::stringstream &line, std::map<std::string, int> &materials, Scene &scene);
void addTriangleFromPolygon(std::vector<glm::vec3> &vertices, Scene &scene);
bool addTriangleFromPolygon(std::vector<glm::vec3> &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<glm::vec3> vertices, size_t cur);
std::ifstream _file;
std::vector<glm::vec3> vertex;

View File

@ -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

View File

@ -6,7 +6,7 @@
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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<glm::vec3> &vertices)
//{
//
//}
void ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, Scene &scene)
int ObjParser::pointInTriangle(glm::vec3 pts[3], std::vector<glm::vec3> 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<glm::vec3> &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;
// std::cout << std::endl;
// std::cout << 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);
}
return(0);
std::cout << "____________________" << std::endl;
}
void ObjParser::addFace(std::stringstream &line, std::vector<glm::vec3> &vertices, int mat, Scene &scene)
@ -93,8 +136,10 @@ void ObjParser::addFace(std::stringstream &line, std::vector<glm::vec3> &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);