diff --git a/src/models.c b/src/models.c index 491ca4093..7bd424bb9 100644 --- a/src/models.c +++ b/src/models.c @@ -65,7 +65,7 @@ #if defined(SUPPORT_FILEFORMAT_GLTF) #define CGLTF_MALLOC RL_MALLOC #define CGLTF_FREE RL_FREE - + #define CGLTF_IMPLEMENTATION #include "external/cgltf.h" // glTF file format loading #include "external/stb_image.h" // glTF texture images loading @@ -76,7 +76,7 @@ #define PAR_CALLOC(T, N) ((T*)RL_CALLOC(N*sizeof(T), 1)) #define PAR_REALLOC(T, BUF, N) ((T*)RL_REALLOC(BUF, sizeof(T)*(N))) #define PAR_FREE RL_FREE - + #define PAR_SHAPES_IMPLEMENTATION #include "external/par_shapes.h" // Shapes 3d parametric generation #endif @@ -1831,6 +1831,11 @@ Mesh GenMeshHeightmap(Image heightmap, Vector3 size) Vector3 scaleFactor = { size.x/mapX, size.y/255.0f, size.z/mapZ }; + Vector3 vA; + Vector3 vB; + Vector3 vC; + Vector3 vN; + for (int z = 0; z < mapZ-1; z++) { for (int x = 0; x < mapX-1; x++) @@ -1888,14 +1893,34 @@ Mesh GenMeshHeightmap(Image heightmap, Vector3 size) // Fill normals array with data //-------------------------------------------------------------- - for (int i = 0; i < 18; i += 3) + for (int i = 0; i < 18; i += 9) { - mesh.normals[nCounter + i] = 0.0f; - mesh.normals[nCounter + i + 1] = 1.0f; - mesh.normals[nCounter + i + 2] = 0.0f; - } + vA.x = mesh.vertices[nCounter + i]; + vA.y = mesh.vertices[nCounter + i + 1]; + vA.z = mesh.vertices[nCounter + i + 2]; + + vB.x = mesh.vertices[nCounter + i + 3]; + vB.y = mesh.vertices[nCounter + i + 4]; + vB.z = mesh.vertices[nCounter + i + 5]; - // TODO: Calculate normals in an efficient way + vC.x = mesh.vertices[nCounter + i + 6]; + vC.y = mesh.vertices[nCounter + i + 7]; + vC.z = mesh.vertices[nCounter + i + 8]; + + vN = Vector3Normalize(Vector3CrossProduct(Vector3Subtract(vB, vA), Vector3Subtract(vC, vA))); + + mesh.normals[nCounter + i] = vN.x; + mesh.normals[nCounter + i + 1] = vN.y; + mesh.normals[nCounter + i + 2] = vN.z; + + mesh.normals[nCounter + i + 3] = vN.x; + mesh.normals[nCounter + i + 4] = vN.y; + mesh.normals[nCounter + i + 5] = vN.z; + + mesh.normals[nCounter + i + 6] = vN.x; + mesh.normals[nCounter + i + 7] = vN.y; + mesh.normals[nCounter + i + 8] = vN.z; + } nCounter += 18; // 6 vertex, 18 floats trisCounter += 2;