+ | Polygone textured

This commit is contained in:
TheRedShip
2025-01-29 15:16:04 +01:00
parent c59a9c037f
commit 7eb27a5c2c
3 changed files with 28 additions and 9 deletions

View File

@ -29,7 +29,7 @@ class ObjParser
void addFace(std::stringstream &line); void addFace(std::stringstream &line);
long int checkVertexIndex(int index, size_t size); long int checkVertexIndex(int index, size_t size);
void parseMtl(std::stringstream &line, Scene &scene); void parseMtl(std::stringstream &line, Scene &scene);
bool addTriangleFromPolygon(std::vector<glm::vec3> &vertices, int inv); bool addTriangleFromPolygon(std::vector<glm::vec3> &vertices, std::vector<glm::vec2> &textureVertices, int inv);
void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, std::vector<glm::vec2> textureVertices); void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, std::vector<glm::vec2> textureVertices);
std::string getFilePath(std::string &file); std::string getFilePath(std::string &file);
int pointInTriangle(glm::vec3 pts[3], std::vector<glm::vec3> vertices, size_t cur); int pointInTriangle(glm::vec3 pts[3], std::vector<glm::vec3> vertices, size_t cur);

View File

@ -8,6 +8,6 @@ MAT 255 255 255 0. 0.0 0.0 LAM 0 // tex 1
sp 0 8 0 1.0 1 sp 0 8 0 1.0 1
OBJ scenes/obj/tails.obj 0 0 0 1 OBJ obj/tails.obj 0 0 0 1
# OBJ scenes/obj/Lowpoly_tree_sample.obj 10 0 0 # OBJ obj/Lowpoly_tree_sample.obj 10 0 0
OBJ scenes/obj/cat.obj -10 0 0 0.25 90 0 0 OBJ obj/cat.obj -10 0 0 0.25 90 0 0

View File

@ -98,20 +98,31 @@ int ObjParser::pointInTriangle(glm::vec3 pts[3], std::vector<glm::vec3> vertices
return(0); return(0);
} }
bool ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, int inv) bool ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, std::vector<glm::vec2> &textureVertices, int inv)
{ {
glm::vec3 v1, v2 ,v3; glm::vec3 v1, v2, v3;
glm::vec2 vt1, vt2, vt3;
float dot; float dot;
for (size_t i = 0; i < vertices.size(); i++) for (size_t i = 0; i < vertices.size(); i++)
{ {
if(!i) if(!i)
{
v1 = vertices.back(); v1 = vertices.back();
vt1 = textureVertices.back();
}
else else
{
v1 = vertices[i - 1]; v1 = vertices[i - 1];
vt1 = textureVertices[i - 1];
}
v2 = vertices[i]; v2 = vertices[i];
v3 = vertices[(i + 1) % vertices.size()]; v3 = vertices[(i + 1) % vertices.size()];
vt2 = textureVertices[i];
vt3 = textureVertices[(i + 1) % textureVertices.size()];
if (inv) if (inv)
dot = glm::cross(v2 - v1, v2 - v3).z; dot = glm::cross(v2 - v1, v2 - v3).z;
else else
@ -122,7 +133,15 @@ bool ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, int inv
if(pointInTriangle(triangleVertices, vertices, i)) if(pointInTriangle(triangleVertices, vertices, i))
continue; continue;
vertices.erase(vertices.begin() + i); vertices.erase(vertices.begin() + i);
addTriangle(v1, v2, v3, std::vector<glm::vec2>(0)); textureVertices.erase(textureVertices.begin() + i);
std::vector<glm::vec2> texture;
texture.push_back(vt1);
texture.push_back(vt2);
texture.push_back(vt3);
addTriangle(v1, v2, v3, texture);
return(1); return(1);
} }
return(0); return(0);
@ -172,8 +191,8 @@ void ObjParser::addFace(std::stringstream &line)
throw std::runtime_error("OBJ : face does not have enough vertices"); throw std::runtime_error("OBJ : face does not have enough vertices");
while(faceVertices.size() > 3) while(faceVertices.size() > 3)
if (!addTriangleFromPolygon(faceVertices, 0)) if (!addTriangleFromPolygon(faceVertices, textureVertices, 0))
if(!addTriangleFromPolygon(faceVertices, 1)) if(!addTriangleFromPolygon(faceVertices, textureVertices, 1))
return ; return ;
if(!line.eof()) if(!line.eof())