From 7c5d74e98e22e6095a21720f0f7b1e965a6d3ea3 Mon Sep 17 00:00:00 2001 From: Eike Decker Date: Fri, 15 Nov 2024 16:40:14 +0100 Subject: [PATCH] Fixing an OBJ loader bug that fragmented the loaded meshes (#4494) The nextShapeEnd integer is a pointer in the OBJ data structures. The faceVertIndex is a vertex index counter for the mesh we are about to create. Both integers are not compatible, which causes the code to finish the meshes too early, thus writing the OBJ data incompletely into the target meshes. It wasn't noticed because for the last mesh, it process all remaining data, causing the last mesh to contain all remaining triangles. This would have been noticed if the OBJ meshes used different textures for each mesh. --- src/rmodels.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rmodels.c b/src/rmodels.c index 04f7210f..b5830b2c 100644 --- a/src/rmodels.c +++ b/src/rmodels.c @@ -4244,7 +4244,7 @@ static Model LoadOBJ(const char *fileName) // walk all the faces for (unsigned int faceId = 0; faceId < objAttributes.num_faces; faceId++) { - if (faceVertIndex >= nextShapeEnd) + if (faceId >= nextShapeEnd) { // try to find the last vert in the next shape nextShape++; @@ -4295,7 +4295,7 @@ static Model LoadOBJ(const char *fileName) for (unsigned int faceId = 0; faceId < objAttributes.num_faces; faceId++) { bool newMesh = false; // do we need a new mesh? - if (faceVertIndex >= nextShapeEnd) + if (faceId >= nextShapeEnd) { // try to find the last vert in the next shape nextShape++; @@ -4357,7 +4357,7 @@ static Model LoadOBJ(const char *fileName) for (unsigned int faceId = 0; faceId < objAttributes.num_faces; faceId++) { bool newMesh = false; // do we need a new mesh? - if (faceVertIndex >= nextShapeEnd) + if (faceId >= nextShapeEnd) { // try to find the last vert in the next shape nextShape++;