29#include "engine_logger.hpp"
33using namespace brenta;
35model::model(std::string
const &path, GLint wrapping, GLint filtering_min,
36 GLint filtering_mag, GLboolean has_mipmap, GLint mipmap_min,
37 GLint mipmap_mag,
bool flip)
51 for (
unsigned int i = 0; i < meshes.size(); i++)
57void model::load_model(std::string path)
60 Assimp::Importer importer;
61 const aiScene *scene =
62 importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);
64 if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE
67 ERROR(
"Could not load model with assimp: {}", importer.GetErrorString());
70 directory = path.substr(0, path.find_last_of(
'/'));
72 process_node(scene->mRootNode, scene);
75void model::process_node(aiNode *node,
const aiScene *scene)
77 for (
unsigned int i = 0; i < node->mNumMeshes; i++)
79 aiMesh *m = scene->mMeshes[node->mMeshes[i]];
80 meshes.push_back(process_mesh(m, scene));
82 for (
unsigned int i = 0; i < node->mNumChildren; i++)
84 process_node(node->mChildren[i], scene);
88mesh model::process_mesh(aiMesh *m,
const aiScene *scene)
90 std::vector<types::vertex> vertices;
91 std::vector<unsigned int> indices;
92 std::vector<types::texture> textures;
94 for (
unsigned int i = 0; i < m->mNumVertices; i++)
98 vector.x = m->mVertices[i].x;
99 vector.y = m->mVertices[i].y;
100 vector.z = m->mVertices[i].z;
101 vertex.position = vector;
103 vector.x = m->mNormals[i].x;
104 vector.y = m->mNormals[i].y;
105 vector.z = m->mNormals[i].z;
106 vertex.normal = vector;
108 if (m->mTextureCoords[0])
111 vec.x = m->mTextureCoords[0][i].x;
112 vec.y = m->mTextureCoords[0][i].y;
113 vertex.tex_coords = vec;
116 vertex.tex_coords = glm::vec2(0.0f, 0.0f);
118 vertices.push_back(vertex);
121 for (
unsigned int i = 0; i < m->mNumFaces; i++)
123 aiFace face = m->mFaces[i];
124 for (
unsigned int j = 0; j < face.mNumIndices; j++)
125 indices.push_back(face.mIndices[j]);
128 if (m->mMaterialIndex >= 0)
130 aiMaterial *material = scene->mMaterials[m->mMaterialIndex];
131 std::vector<types::texture> diffuseMaps = load_material_textures(
132 material, aiTextureType_DIFFUSE,
"texture_diffuse");
133 textures.insert(textures.end(), diffuseMaps.begin(), diffuseMaps.end());
134 std::vector<types::texture> specularMaps = load_material_textures(
135 material, aiTextureType_SPECULAR,
"texture_specular");
136 textures.insert(textures.end(), specularMaps.begin(),
140 return mesh(vertices, indices, textures, this->
wrapping,
145std::vector<types::texture> model::load_material_textures(aiMaterial *mat,
147 std::string typeName)
149 std::vector<types::texture> textures;
150 for (
unsigned int i = 0; i < mat->GetTextureCount(type); i++)
153 mat->GetTexture(type, i, &str);
155 for (
unsigned int j = 0; j < textures_loaded.size(); j++)
157 if (std::strcmp(textures_loaded[j].path.c_str(), str.C_Str()) == 0)
159 textures.push_back(textures_loaded[j]);
167 std::string path = directory +
"/" + std::string(str.C_Str());
172 texture.type = typeName;
175 textures_loaded.push_back(
texture);
205model::builder &model::builder::set_has_mipmap(GLboolean has_hipmap)
229model model::builder::build()
The Mesh class represents a 3D model.
model()
Empty constructor.
void draw(types::shader_name_t shader)
Draw the model.
bool flip
If the texture should be flipped.
GLint filtering_mag
Texture filtering mode.
GLboolean has_mipmap
If the texture has a mipmap.
GLint wrapping
Texture wrapping mode.
GLint mipmap_mag
Mipmap filtering mode.
GLint filtering_min
Texture filtering mode.
GLint mipmap_min
Mipmap filtering mode.
static unsigned int load_texture(std::string path, GLint wrapping=GL_REPEAT, GLint filtering_min=GL_NEAREST, GLint filtering_mag=GL_NEAREST, GLboolean has_mipmap=GL_TRUE, GLint mipmap_min=GL_LINEAR_MIPMAP_LINEAR, GLint mipmap_mag=GL_LINEAR, bool flip=true)
Load a texture from a file.
The Texture struct represents a texture of a 3D model.
The Vertex struct represents a vertex of a 3D model.