mirror of
https://github.com/TheRedShip/RT_GPU.git
synced 2025-09-27 18:48:36 +02:00
Merge branch 'main' of github.com:TheRedShip/RT_GPU
This commit is contained in:
@ -3,14 +3,14 @@ Pos=60,60
|
|||||||
Size=400,400
|
Size=400,400
|
||||||
|
|
||||||
[Window][Camera]
|
[Window][Camera]
|
||||||
Pos=1655,22
|
Pos=651,101
|
||||||
Size=229,184
|
Size=229,184
|
||||||
|
|
||||||
[Window][Material]
|
[Window][Material]
|
||||||
Pos=1629,224
|
Pos=1136,164
|
||||||
Size=266,285
|
Size=266,285
|
||||||
|
|
||||||
[Window][Fog settings]
|
[Window][Fog settings]
|
||||||
Pos=1656,509
|
Pos=884,462
|
||||||
Size=247,157
|
Size=247,157
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/01/16 15:00:49 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<glm::vec3> &vertices, int mat, Scene &scene);
|
void addFace(std::stringstream &line, std::vector<glm::vec3> &vertices, int mat, Scene &scene);
|
||||||
long int checkVertexIndex(int index, size_t size);
|
long int checkVertexIndex(int index, size_t size);
|
||||||
void parseMtl(std::stringstream &line, std::map<std::string, int> &materials, Scene &scene);
|
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);
|
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::ifstream _file;
|
||||||
std::vector<glm::vec3> vertex;
|
std::vector<glm::vec3> vertex;
|
||||||
|
@ -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 -0.524753 -0.707811 -1.37533
|
||||||
v -1.53072 -0.666692 -0.246043
|
v -1.53072 -0.666692 -0.246043
|
||||||
v -0.906262 -0.661508 1.11465
|
v -0.906262 -0.661508 1.11465
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
|
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/01/16 15:00:33 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);
|
return(index - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//void ObjParser::isEar(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, std::vector<glm::vec3> &vertices)
|
int ObjParser::pointInTriangle(glm::vec3 pts[3], std::vector<glm::vec3> vertices, size_t cur)
|
||||||
//{
|
|
||||||
//
|
|
||||||
//}
|
|
||||||
|
|
||||||
void ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, Scene &scene)
|
|
||||||
{
|
{
|
||||||
glm::vec3 normal;
|
glm::vec3 v0, v1, v2;
|
||||||
glm::vec3 v1, v2 ,v3, v4;
|
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;
|
(void)scene;
|
||||||
for (size_t i = 0; i < vertices.size(); i++)
|
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];
|
v2 = vertices[i];
|
||||||
v3 = vertices[(i + 1) % vertices.size()];
|
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(v1) << std::endl;
|
||||||
// std::cout << glm::to_string(normal) << std::endl;
|
std::cout << glm::to_string(v2) << std::endl;
|
||||||
|
std::cout << glm::to_string(v3) << std::endl;
|
||||||
// float dot = glm::dot(normal, v4 - v1);
|
// not gud dot = glm::dot(v2 - v1, v2 - v3) / (glm::length(v2 - v1) * glm::length(v2 - v3));
|
||||||
// std::cout << dot << std::endl;
|
// with the one above dot = std::acos(dot) * (180.0/3.141592653589793238463); // if dot > 180
|
||||||
//if(isEar(v1, v2 ,v3, vertices))
|
if (inv)
|
||||||
//{
|
dot = glm::cross(v2 - v1, v2 - v3).z; //maybe gud
|
||||||
// vertices.erase(vertices.begin() + i);
|
else
|
||||||
// scene.addObject(new Triangle(v1, v2 ,v3));
|
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;
|
return(0);
|
||||||
// std::cout << std::endl;
|
std::cout << "____________________" << std::endl;
|
||||||
// std::cout << std::endl;
|
|
||||||
// std::cout << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjParser::addFace(std::stringstream &line, std::vector<glm::vec3> &vertices, int mat, Scene &scene)
|
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 << face_vertices[i].x << " " << face_vertices[i].y << " " << face_vertices[i].z << " | ";
|
||||||
// std::cout << std::endl;
|
// std::cout << std::endl;
|
||||||
|
|
||||||
// while(face_vertices.size() > 3)
|
while(face_vertices.size() > 3)
|
||||||
// addTriangleFromPolygon(face_vertices, scene);
|
if (!addTriangleFromPolygon(face_vertices, scene, mat, 0))
|
||||||
|
addTriangleFromPolygon(face_vertices, scene, mat, 1);
|
||||||
|
|
||||||
if(!line.eof())
|
if(!line.eof())
|
||||||
throw std::runtime_error("OBJ: an error occured while parsing face");
|
throw std::runtime_error("OBJ: an error occured while parsing face");
|
||||||
addTriangle(face_vertices[0], face_vertices[1], face_vertices[2],mat, scene);
|
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");
|
throw std::runtime_error("OBJ: invalid material name");
|
||||||
curMat = matNames[identifier];
|
curMat = matNames[identifier];
|
||||||
}
|
}
|
||||||
}catch (std::exception &e)
|
} catch (std::exception &e)
|
||||||
{
|
{
|
||||||
std::cerr << line << std::endl;
|
std::cerr << line << std::endl;
|
||||||
throw;
|
throw;
|
||||||
|
Reference in New Issue
Block a user