✨ Add Mesh3D class for loading OBJ files
This commit is contained in:
parent
1041ec48a2
commit
f5430f4dd7
19
include/Mesh3D.h
Normal file
19
include/Mesh3D.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#ifndef _MESH3D
|
||||||
|
#define _MESH3D
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace djalim {
|
||||||
|
|
||||||
|
class Mesh3D {
|
||||||
|
public:
|
||||||
|
// Constructor
|
||||||
|
Mesh3D(const std::string& filepath);
|
||||||
|
std::vector<float> meshVertices;
|
||||||
|
void loadOBJFile(const std::string& filepath);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !_MESH3D
|
||||||
|
|
||||||
123
src/core/Mesh3D.cpp
Normal file
123
src/core/Mesh3D.cpp
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
#include "Mesh3D.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iterator>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
struct objVertex {
|
||||||
|
float x, y, z;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct objVertexTexture{
|
||||||
|
float u,v;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct objFaceIndice{
|
||||||
|
int v,vt,vn;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct objFace {
|
||||||
|
objFaceIndice vertices[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
djalim::Mesh3D::Mesh3D(const std::string& filepath) {
|
||||||
|
loadOBJFile(filepath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void djalim::Mesh3D::loadOBJFile(const std::string& filepath){
|
||||||
|
|
||||||
|
std::ifstream file(filepath);
|
||||||
|
if (!file.is_open()) {
|
||||||
|
std::cerr << "Failed to open OBJ file: " << filepath << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
std::string line;
|
||||||
|
std::vector<objVertex> vertices;
|
||||||
|
std::vector<objVertex> vertexNormal;
|
||||||
|
std::vector<objVertexTexture> vertexTexture;
|
||||||
|
std::vector<objFace> faces;
|
||||||
|
|
||||||
|
while (std::getline(file, line)) {
|
||||||
|
std::stringstream ss(line);
|
||||||
|
std::string type;
|
||||||
|
ss >> type;
|
||||||
|
|
||||||
|
if (type == "v"){
|
||||||
|
float x, y, z;
|
||||||
|
ss >> x >> y >> z;
|
||||||
|
//std::cout << "found vertice: (" << x << ", " << y << ", " << z << ")" << std::endl;
|
||||||
|
objVertex v = {x, y, z};
|
||||||
|
vertices.push_back(v);
|
||||||
|
}
|
||||||
|
else if (type == "vn"){
|
||||||
|
float x, y, z;
|
||||||
|
ss >> x >> y >> z;
|
||||||
|
//std::cout << "found normal: (" << x << ", " << y << ", " << z << ")" << std::endl;
|
||||||
|
objVertex v = {x, y, z};
|
||||||
|
vertexNormal.push_back(v);
|
||||||
|
}
|
||||||
|
else if (type == "vt"){
|
||||||
|
float u, v;
|
||||||
|
ss >> u >> v;
|
||||||
|
//std::cout << "found texture: (" << u << ", " << v << ")" << std::endl;
|
||||||
|
objVertexTexture vt = {u, v};
|
||||||
|
vertexTexture.push_back(vt);
|
||||||
|
}
|
||||||
|
else if (type == "f"){
|
||||||
|
std::cout << "found face" << std::endl;
|
||||||
|
std::cout << ss.str() << std::endl;
|
||||||
|
objFace face;
|
||||||
|
// TODO Find a more elegant way to do this
|
||||||
|
for (int i = 0; i < 3; i++){
|
||||||
|
int a, b, c;
|
||||||
|
char slash;
|
||||||
|
ss >> a >> slash >> b >> slash >> c;
|
||||||
|
//std::cout << "vertex " << i << " :(" << a << ", " << b << ", " << c << ")" << std::endl;
|
||||||
|
objFaceIndice f = {a-1, b-1, c-1};
|
||||||
|
face.vertices[i] = f;
|
||||||
|
}
|
||||||
|
faces.push_back(face);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Pour chaque face
|
||||||
|
for(int i = 0; i < faces.size() ; i++ ){
|
||||||
|
objFace currentFace = faces[i];
|
||||||
|
// pour chaque vertex de cette face
|
||||||
|
for (int j = 0; j < 3; j++){
|
||||||
|
|
||||||
|
int verticeIndex = currentFace.vertices[j].v;
|
||||||
|
|
||||||
|
if(verticeIndex >= vertices.size()){
|
||||||
|
std::cerr << "Error: Vertex index out of range" << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
objVertex currentVertice = vertices[verticeIndex];
|
||||||
|
|
||||||
|
meshVertices.push_back(currentVertice.x);
|
||||||
|
meshVertices.push_back(currentVertice.y);
|
||||||
|
meshVertices.push_back(currentVertice.z);
|
||||||
|
|
||||||
|
//uv
|
||||||
|
|
||||||
|
int verticeTextureIndex = currentFace.vertices[j].vt;
|
||||||
|
|
||||||
|
if(verticeTextureIndex >= vertexTexture.size()){
|
||||||
|
std::cerr << "Error: Texture index out of range" << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
objVertexTexture currentTexture = vertexTexture[verticeTextureIndex];
|
||||||
|
|
||||||
|
meshVertices.push_back(currentTexture.u);
|
||||||
|
meshVertices.push_back(currentTexture.v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -1,7 +1,11 @@
|
|||||||
|
#define DEBUG true
|
||||||
|
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
|
#include "Mesh3D.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
djalim::OpenGlEngine engine = djalim::OpenGlEngine("Mon app", 800, 600);
|
//djalim::OpenGlEngine engine = djalim::OpenGlEngine("Mon app", 800, 600);
|
||||||
engine.start();
|
//engine.start();
|
||||||
|
djalim::Mesh3D mesh = djalim::Mesh3D("../assets/models/UTAH_BLEND.obj");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user