#include <stdlib.h>
#include <assimp/cimport.h>
#include <assimp/postprocess.h>
+#include <assimp/scene.h>
#include "asset.h"
#include "logger.h"
#include "tga.h"
-static const AiScene* importScene(const char* path);
-static Vector3D convertAiVector3D(AiVector3D vect);
-static const char* replaceFileExtension(const AiString path, const char* ext);
+static const struct aiScene* importScene(const char* path);
+static Vector3D convertAiVector3D(struct aiVector3D vect);
+static const char* replaceFileExtension(const struct aiString path, const char* ext);
-const Asset3D* importAsset(const char* path) {
- const AiScene* scene = importScene(path);
+const Solid* importSolid(const char* path) {
+ const struct aiScene* scene = importScene(path);
if (scene == NULL) {
+ logError("Failed to import solid from %s", path);
return NULL;
}
const unsigned int numMeshes = scene->mNumMeshes;
const unsigned int numMaterials = scene->mNumMaterials;
+
+ // TODO Consider assets with some arrays empty, and prevent zero mallocs
- Asset3D* asset = malloc(sizeof(Asset3D));
- asset->numMeshes = numMeshes;
- asset->meshes = malloc(numMeshes * sizeof(Mesh));
- asset->numMaterials = numMaterials;
- asset->materials = malloc(numMaterials * sizeof(Material));
+ Solid* solid = malloc(sizeof(Solid));
+ solid->numMeshes = numMeshes;
+ solid->meshes = malloc(numMeshes * sizeof(Mesh));
+ solid->numMaterials = numMaterials;
+ solid->materials = malloc(numMaterials * sizeof(Material));
for (unsigned int meshIndex = 0; meshIndex < numMeshes; ++meshIndex) {
- const AiMesh* aiMesh = scene->mMeshes[meshIndex];
+ const struct aiMesh* aiMesh = scene->mMeshes[meshIndex];
const unsigned int numVertices = aiMesh->mNumVertices;
const unsigned int numFaces = aiMesh->mNumFaces;
}
for (unsigned int faceIndex = 0; faceIndex < numFaces; ++faceIndex) {
- const AiFace aiFace = aiMesh->mFaces[faceIndex];
+ const struct aiFace aiFace = aiMesh->mFaces[faceIndex];
const unsigned int numIndices = aiFace.mNumIndices;
Face face = { .numIndices = numIndices,
- .indices = malloc(numIndices
- * sizeof(unsigned int)) };
+ .indices = malloc(numIndices * sizeof(size_t)) };
for (unsigned int i = 0; i < numIndices; ++i) {
face.indices[i] = aiFace.mIndices[i];
mesh.faces[faceIndex] = face;
}
- asset->meshes[meshIndex] = mesh;
+ solid->meshes[meshIndex] = mesh;
}
GLuint* textureIds = malloc(numMaterials * sizeof(GLuint));
glBindTexture(GL_TEXTURE_2D, material.textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- AiString originalTexturePath;
+ struct aiString originalTexturePath;
if (aiGetMaterialTexture(scene->mMaterials[matIndex],
aiTextureType_DIFFUSE,
0,
&originalTexturePath,
NULL, NULL, NULL, NULL, NULL, NULL) == AI_SUCCESS) {
- const char* textureFile = replaceFileExtension(originalTexturePath, ".tga");
- const size_t textureFileLength = strlen(textureFile);
- char* texturePath = malloc(strlen("assets/") + textureFileLength + 1);
+ const char* textureFilename = replaceFileExtension(originalTexturePath, ".tga");
+ const size_t textureFilenameLength = strlen(textureFilename);
+ char* texturePath = malloc(strlen("assets/") + textureFilenameLength + 1);
strcpy(texturePath, "assets/");
- strncat(texturePath, textureFile, textureFileLength);
+ strncat(texturePath, textureFilename, textureFilenameLength);
TgaImage* textureImage = readTga(texturePath);
if (textureImage == NULL) {
- logError("Asset texture file not found: %s", texturePath);
+ logError("Importing solid from %s: Cannot read texture file %s", path, texturePath);
}
else {
glTexImage2D(GL_TEXTURE_2D,
}
}
- asset->materials[matIndex] = material;
+ solid->materials[matIndex] = material;
}
glBindTexture(GL_TEXTURE_2D, 0);
aiReleaseImport(scene);
- return asset;
+ return solid;
}
-static const AiScene* importScene(const char* path) {
- const AiScene* scene = aiImportFile(path, aiProcess_PreTransformVertices);
- if (scene == NULL) {
- logError("Failed to import asset from %s", path);
- }
- else if ((scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE) == AI_SCENE_FLAGS_INCOMPLETE) {
+static const struct aiScene* importScene(const char* path) {
+ const struct aiScene* scene = aiImportFile(path, aiProcess_PreTransformVertices);
+ if (scene != NULL && scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE) {
logError("Incomplete scene imported from %s", path);
aiReleaseImport(scene);
scene = NULL;
return scene;
}
-static Vector3D convertAiVector3D(AiVector3D vect) {
+static Vector3D convertAiVector3D(struct aiVector3D vect) {
return (Vector3D) { .x = vect.x,
.y = vect.y,
.z = vect.z };
}
-/** BUGS
+/**
+ * BUGS
* The following function will not work properly with texture
* file names (excluding directory part) beginning with '.'
*/
-static const char* replaceFileExtension(const AiString path, const char* ext) {
+static const char* replaceFileExtension(const struct aiString path, const char* ext) {
size_t lengthToCopy = path.length;
char* lastDotSubstr = strrchr(path.data, '.');