|
|
|
|
@ -1,5 +1,5 @@
|
|
|
|
|
#include <cassert> |
|
|
|
|
#include <cstdlib> // calloc |
|
|
|
|
#include <string> |
|
|
|
|
|
|
|
|
|
#include <assimp/cimport.h> |
|
|
|
|
#include <assimp/scene.h> |
|
|
|
|
@ -15,7 +15,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline glm::vec3 copyVector(aiVector3D v_in, glm::vec3& v_out); |
|
|
|
|
meMeshInfo* copyMeshInfo(const aiScene* scene, aiMesh* mesh); |
|
|
|
|
meMeshInfo* copyMeshInfo(const char* data_dir, const aiScene* scene, aiMesh* mesh); |
|
|
|
|
void freeMesh(meMeshInfo* mesh); |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
@ -32,7 +32,7 @@ meInitAssimp()
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
meLoadFromFile(const char* filename, meMeshGroup& mesh_group) |
|
|
|
|
meLoadFromFile(const char* data_dir, const char* filename, meMeshGroup& mesh_group) |
|
|
|
|
{ |
|
|
|
|
LOG(INFO) << "Loading file: " << filename << "\n"; |
|
|
|
|
const aiScene* scene = aiImportFile(filename, aiProcessPreset_TargetRealtime_MaxQuality); |
|
|
|
|
@ -48,11 +48,11 @@ meLoadFromFile(const char* filename, meMeshGroup& mesh_group)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
mesh_group.num_meshes = scene->mNumMeshes; |
|
|
|
|
mesh_group.meshes = (meMeshInfo**) std::calloc(mesh_group.num_meshes, sizeof(meMeshInfo*)); |
|
|
|
|
mesh_group.meshes = UTIL_ALLOC(mesh_group.num_meshes, meMeshInfo*); |
|
|
|
|
mesh_group.use_normals = scene->mMeshes[0]->HasNormals(); |
|
|
|
|
|
|
|
|
|
for (uint i = 0; i < scene->mNumMeshes; i++) { |
|
|
|
|
mesh_group.meshes[i] = copyMeshInfo(scene, scene->mMeshes[i]); |
|
|
|
|
mesh_group.meshes[i] = copyMeshInfo(data_dir, scene, scene->mMeshes[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// free memeory from assimp
|
|
|
|
|
@ -65,6 +65,8 @@ meFreeMeshGroup(meMeshGroup& mesh_group)
|
|
|
|
|
{ |
|
|
|
|
for (uint i = 0; i < mesh_group.num_meshes; i++) |
|
|
|
|
freeMesh(mesh_group.meshes[i]); |
|
|
|
|
|
|
|
|
|
utilSafeFree(mesh_group.meshes); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
@ -83,17 +85,17 @@ copyVector(aiVector3D v_in, glm::vec3& v_out)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
meMeshInfo* |
|
|
|
|
copyMeshInfo(const aiScene* scene, aiMesh* mesh) |
|
|
|
|
copyMeshInfo(const char* data_dir, const aiScene* scene, aiMesh* mesh) |
|
|
|
|
{ |
|
|
|
|
meMeshInfo* mi = (meMeshInfo*) std::calloc(1, sizeof(meMeshInfo)); |
|
|
|
|
meMeshInfo* mi = UTIL_ALLOC(1, meMeshInfo); |
|
|
|
|
mi->model_transform = glm::mat4(1); |
|
|
|
|
|
|
|
|
|
// allocate buffers for vertex and index data from mesh
|
|
|
|
|
mi->num_vertices = mesh->mNumVertices; |
|
|
|
|
mi->vertices = (glm::vec3 *) std::calloc(mi->num_vertices, sizeof(glm::vec3)); |
|
|
|
|
mi->normals = (glm::vec3 *) std::calloc(mi->num_vertices, sizeof(glm::vec3)); |
|
|
|
|
mi->vertices = UTIL_ALLOC(mi->num_vertices, glm::vec3); |
|
|
|
|
mi->normals = UTIL_ALLOC(mi->num_vertices, glm::vec3); |
|
|
|
|
mi->num_indices = mesh->mNumFaces * 3; // NOTE: assume 3 vertices per face
|
|
|
|
|
mi->indices = (uint *) std::calloc(mi->num_indices, sizeof(uint)); |
|
|
|
|
mi->indices = UTIL_ALLOC(mi->num_indices, uint); |
|
|
|
|
|
|
|
|
|
// copy vertices and normals
|
|
|
|
|
for (uint i = 0; i < mi->num_vertices; i++) { |
|
|
|
|
@ -119,12 +121,30 @@ copyMeshInfo(const aiScene* scene, aiMesh* mesh)
|
|
|
|
|
mi->diffuse_color.b = color.b; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (mat->GetTextureCount(aiTextureType_DIFFUSE) > 0) { |
|
|
|
|
aiString file_name; |
|
|
|
|
if (AI_SUCCESS != mat->GetTexture(aiTextureType_DIFFUSE, 0, &file_name, NULL, NULL, NULL, NULL, NULL)) { |
|
|
|
|
LOG(ERROR) << "Some Assimp-type-error\n"; |
|
|
|
|
} else { |
|
|
|
|
std::string file_path; |
|
|
|
|
file_path.append(data_dir).append("/").append(file_name.C_Str()); |
|
|
|
|
LOG(INFO) << "Loading texture file: " << file_name.C_Str() << "\n"; |
|
|
|
|
mi->diffuse_texture_path = file_path.c_str(); |
|
|
|
|
mi->diffuse_texture = utilLoadImage(file_path.c_str()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return mi; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
freeMesh(meMeshInfo* mesh) |
|
|
|
|
{ |
|
|
|
|
if (mesh->diffuse_texture.pixels != 0) { |
|
|
|
|
utilFreeImage(mesh->diffuse_texture); |
|
|
|
|
mesh->diffuse_texture_path = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
utilSafeFree(mesh->vertices); |
|
|
|
|
utilSafeFree(mesh->normals); |
|
|
|
|
utilSafeFree(mesh->indices); |
|
|
|
|
|