12 #include <assimp/Importer.hpp> 13 #include <assimp/postprocess.h> 15 #include <glm/glm.hpp> 17 #include <opencv2/core/core.hpp> 18 #include <opencv2/highgui/highgui.hpp> 29 for(GLuint i = 0; i <
meshes_.size(); i++)
44 Assimp::Importer
import;
45 const aiScene* scene =
import.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);
47 if(!scene || scene->mFlags == AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
49 std::cerr <<
"ERROR::ASSIMP::" <<
import.GetErrorString() << std::endl;
53 size_t foundpos = path.find_last_of(
'/');
54 if (foundpos == std::string::npos)
70 for (GLuint i = 0; i < node->mNumMeshes; ++i)
72 aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
77 for (GLuint i = 0; i < node->mNumChildren; ++i)
86 std::vector<Mesh::Vertex> vertices;
87 std::vector<GLuint> indices;
88 std::vector<Mesh::Texture> textures;
91 for (GLuint i = 0; i < mesh->mNumVertices; ++i)
96 vertex.
Position = glm::vec3(mesh->mVertices[i].x, mesh->mVertices[i].y, mesh->mVertices[i].z);
97 vertex.
Normal = glm::vec3(mesh->mNormals[i].x, mesh->mNormals[i].y, mesh->mNormals[i].z);
100 if (mesh->mTextureCoords[0])
102 vertex.
TexCoords = glm::vec2(mesh->mTextureCoords[0][i].x, mesh->mTextureCoords[0][i].y);
106 vertex.
TexCoords = glm::vec2(0.0f, 0.0f);
109 vertices.push_back(vertex);
113 for (GLuint i = 0; i < mesh->mNumFaces; ++i)
115 aiFace face = mesh->mFaces[i];
116 for (GLuint j = 0; j < face.mNumIndices; ++j)
118 indices.push_back(face.mIndices[j]);
124 if (mesh->mMaterialIndex > 0)
126 aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
128 std::vector<Mesh::Texture> diffuseMaps =
loadMaterialTextures(material, aiTextureType_DIFFUSE,
"texture_diffuse");
129 textures.insert(textures.end(), diffuseMaps.begin(), diffuseMaps.end());
131 std::vector<Mesh::Texture> specularMaps =
loadMaterialTextures(material, aiTextureType_SPECULAR,
"texture_specular");
132 textures.insert(textures.end(), specularMaps.begin(), specularMaps.end());
135 return Mesh(vertices, indices, textures);
141 std::vector<Mesh::Texture> textures;
142 for (GLuint i = 0; i < mat->GetTextureCount(type); ++i)
145 mat->GetTexture(type, i, &str);
146 GLboolean skip =
false;
163 texture.
type = typeName;
165 textures.push_back(texture);
178 std::string filename = directory +
"/" + std::string(path);
179 cv::Mat image = cv::imread(filename, cv::IMREAD_ANYCOLOR);
183 glGenTextures(1, &textureID);
186 glBindTexture(GL_TEXTURE_2D, textureID);
187 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.cols, image.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, image.ptr());
188 glGenerateMipmap(GL_TEXTURE_2D);
191 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
192 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
193 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
194 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
195 glBindTexture(GL_TEXTURE_2D, 0);
Mesh processMesh(aiMesh *mesh, const aiScene *scene)
std::vector< Mesh::Texture > textures_loaded_
void loadModel(std::string path)
Model(const GLchar *path)
void processNode(aiNode *node, const aiScene *scene)
GLint TextureFromFile(const char *path, std::string directory)
std::vector< Mesh::Texture > loadMaterialTextures(aiMaterial *mat, aiTextureType type, std::string typeName)
std::vector< Mesh > meshes_