From d657537821e430169cf9399122f2cfdf372eb6b3 Mon Sep 17 00:00:00 2001 From: raysan5 Date: Tue, 24 Mar 2020 18:42:57 +0100 Subject: [PATCH] Support mtl loading by tinyobj_parse_obj() #1134 I don't like this solution but well... let's use it for the moment... --- src/models.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/models.c b/src/models.c index 7bd424bb9..ec7dfe5d2 100644 --- a/src/models.c +++ b/src/models.c @@ -50,6 +50,14 @@ #include // Required for: strncmp() [Used in LoadModelAnimations()], strlen() [Used in LoadTextureFromCgltfImage()] #include // Required for: sinf(), cosf(), sqrtf(), fabsf() +#if defined(_WIN32) + #include // Required for: _chdir() [Used in LoadOBJ()] + #define CHDIR _chdir +#else + #include // Required for: chdir() (POSIX) [Used in LoadOBJ()] + #define CHDIR chdir +#endif + #include "rlgl.h" // raylib OpenGL abstraction layer to OpenGL 1.1, 2.1, 3.3+ or ES2 #if defined(SUPPORT_FILEFORMAT_OBJ) || defined(SUPPORT_FILEFORMAT_MTL) @@ -2832,29 +2840,17 @@ static Model LoadOBJ(const char *fileName) tinyobj_material_t *materials = NULL; unsigned int materialCount = 0; - int dataLength = 0; - char *data = NULL; + char *fileData = LoadFileText(fileName); + int dataSize = strlen(fileData); - // Load model data - FILE *objFile = fopen(fileName, "rb"); - - if (objFile != NULL) + if (fileData != NULL) { - fseek(objFile, 0, SEEK_END); - long length = ftell(objFile); // Get file size - fseek(objFile, 0, SEEK_SET); // Reset file pointer - - data = (char *)RL_MALLOC(length); + char currentDir[1024] = { 0 }; + strcpy(currentDir, GetWorkingDirectory()); + chdir(GetDirectoryPath(fileName)); - fread(data, length, 1, objFile); - dataLength = length; - fclose(objFile); - } - - if (data != NULL) - { unsigned int flags = TINYOBJ_FLAG_TRIANGULATE; - int ret = tinyobj_parse_obj(&attrib, &meshes, &meshCount, &materials, &materialCount, data, dataLength, flags); + int ret = tinyobj_parse_obj(&attrib, &meshes, &meshCount, &materials, &materialCount, fileData, dataSize, flags); if (ret != TINYOBJ_SUCCESS) TRACELOG(LOG_WARNING, "[%s] Model data could not be loaded", fileName); else TRACELOG(LOG_INFO, "[%s] Model data loaded successfully: %i meshes / %i materials", fileName, meshCount, materialCount); @@ -2995,7 +2991,9 @@ static Model LoadOBJ(const char *fileName) tinyobj_shapes_free(meshes, meshCount); tinyobj_materials_free(materials, materialCount); - RL_FREE(data); + RL_FREE(fileData); + + chdir(currentDir); } // NOTE: At this point we have all model data loaded @@ -3122,7 +3120,7 @@ static Model LoadIQM(const char *fileName) return model; } - fread(&iqm,sizeof(IQMHeader), 1, iqmFile); // Read IQM header + fread(&iqm, sizeof(IQMHeader), 1, iqmFile); // Read IQM header if (strncmp(iqm.magic, IQM_MAGIC, sizeof(IQM_MAGIC))) {