6#include <brenta/logger.hpp>
7#include <brenta/model.hpp>
10using namespace brenta;
18 GL_LINEAR_MIPMAP_LINEAR,
25 this->wrapping = conf.wrapping;
26 this->filtering_min = conf.filtering_min;
27 this->filtering_mag = conf.filtering_mag;
28 this->has_mipmap = conf.has_mipmap;
29 this->mipmap_min = conf.mipmap_min;
30 this->mipmap_mag = conf.mipmap_mag;
31 this->flip = conf.flip;
32 this->path = conf.path;
35 DEBUG(
"model: initialized");
40 DEBUG(
"model: destroyed");
46 Assimp::Importer importer;
47 const aiScene *scene =
48 importer.ReadFile(this->path, aiProcess_Triangulate | aiProcess_FlipUVs);
50 if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
52 ERROR(
"model::load_model: Could not load model with assimp: {}",
53 importer.GetErrorString());
56 directory = this->path.substr(0, this->path.find_last_of(
'/'));
58 process_node(scene->mRootNode, scene);
61void model::draw(shader::name_t
shader)
const
63 for (
unsigned int i = 0; i < meshes.size(); i++)
69void model::process_node(aiNode *node,
const aiScene *scene)
71 for (
unsigned int i = 0; i < node->mNumMeshes; i++)
73 aiMesh *m = scene->mMeshes[node->mMeshes[i]];
74 process_mesh(m, scene);
76 for (
unsigned int i = 0; i < node->mNumChildren; i++)
78 process_node(node->mChildren[i], scene);
82void model::process_mesh(aiMesh *m,
const aiScene *scene)
84 std::vector<types::vertex> vertices;
85 std::vector<unsigned int> indices;
86 std::vector<std::shared_ptr<texture>> textures;
88 for (
unsigned int i = 0; i < m->mNumVertices; i++)
92 vector.x = m->mVertices[i].x;
93 vector.y = m->mVertices[i].y;
94 vector.z = m->mVertices[i].z;
95 vertex.position = vector;
97 vector.x = m->mNormals[i].x;
98 vector.y = m->mNormals[i].y;
99 vector.z = m->mNormals[i].z;
100 vertex.normal = vector;
102 if (m->mTextureCoords[0])
105 vec.x = m->mTextureCoords[0][i].x;
106 vec.y = m->mTextureCoords[0][i].y;
107 vertex.tex_coords = vec;
110 vertex.tex_coords = glm::vec2(0.0f, 0.0f);
112 vertices.push_back(vertex);
115 for (
unsigned int i = 0; i < m->mNumFaces; i++)
117 aiFace face = m->mFaces[i];
118 for (
unsigned int j = 0; j < face.mNumIndices; j++)
119 indices.push_back(face.mIndices[j]);
122 aiMaterial *material = scene->mMaterials[m->mMaterialIndex];
123 std::vector<std::shared_ptr<texture>> diffuse =
124 load_material_textures(material,
125 aiTextureType_DIFFUSE,
127 textures.insert(textures.end(),
131 std::vector<std::shared_ptr<texture>> specular =
132 load_material_textures(material,
133 aiTextureType_SPECULAR,
135 textures.insert(textures.end(),
139 mesh me =
mesh({vertices, indices, textures, this->wrapping,
140 this->filtering_min, this->filtering_mag, this->has_mipmap,
141 this->mipmap_min, this->mipmap_mag});
142 meshes.push_back(std::move(me));
145std::vector<std::shared_ptr<texture>> model::load_material_textures(aiMaterial *mat,
147 const std::string &typeName)
149 std::vector<std::shared_ptr<texture>> textures;
150 for (
unsigned int i = 0; i < mat->GetTextureCount(type); i++)
153 mat->GetTexture(type, i, &str);
155 std::string path = directory +
"/" + std::string(str.C_Str());
157 for (
unsigned int j = 0; j < textures_loaded.size(); j++)
160 if (textures_loaded[j]->path == path)
162 textures.push_back(textures_loaded[j]);
170 std::shared_ptr<texture> t_ptr = std::make_shared<texture>(std::move(t));
171 textures_loaded.push_back(t_ptr);
172 textures.push_back(t_ptr);
184 this->conf.path = path;
190 this->conf.wrapping = wrapping;
196 this->conf.filtering_min = filtering_min;
202 this->conf.filtering_mag = filtering_mag;
208 this->conf.has_mipmap = has_mipmap;
214 this->conf.mipmap_min = mipmap_min;
220 this->conf.mipmap_mag = mipmap_mag;
226 this->conf.flip = flip;
230model model::builder::build()
232 return model(this->conf);
The Mesh class represents a 3D model.
model()
Empty constructor.
The Vertex struct represents a vertex of a 3D model.