summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorraysan5 <[email protected]>2020-03-24 18:42:57 +0100
committerraysan5 <[email protected]>2020-03-24 18:42:57 +0100
commitd657537821e430169cf9399122f2cfdf372eb6b3 (patch)
tree1c50f9da2b099e4b62e7d9aa64d39c45c2df474c /src
parent5fe0db347c2a7e855e362d3dcf60d30e86bb8a35 (diff)
downloadraylib-d657537821e430169cf9399122f2cfdf372eb6b3.tar.gz
raylib-d657537821e430169cf9399122f2cfdf372eb6b3.zip
Support mtl loading by tinyobj_parse_obj() #1134
I don't like this solution but well... let's use it for the moment...
Diffstat (limited to 'src')
-rw-r--r--src/models.c40
1 files changed, 19 insertions, 21 deletions
diff --git a/src/models.c b/src/models.c
index 7bd424bb..ec7dfe5d 100644
--- a/src/models.c
+++ b/src/models.c
@@ -50,6 +50,14 @@
#include <string.h> // Required for: strncmp() [Used in LoadModelAnimations()], strlen() [Used in LoadTextureFromCgltfImage()]
#include <math.h> // Required for: sinf(), cosf(), sqrtf(), fabsf()
+#if defined(_WIN32)
+ #include <direct.h> // Required for: _chdir() [Used in LoadOBJ()]
+ #define CHDIR _chdir
+#else
+ #include <unistd.h> // 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)))
{