diff --git a/src/mesh/marching_cubes.cpp b/src/mesh/marching_cubes.cpp index 8bdc282..815761f 100644 --- a/src/mesh/marching_cubes.cpp +++ b/src/mesh/marching_cubes.cpp @@ -131,7 +131,8 @@ MCMesh marching_cubes(const std::function& f, if (edge_mask == 0) continue; // Compute interpolated vertices for intersected edges - int vert_idx[12] = {-1}; + int vert_idx[12]; + for (int& v : vert_idx) v = -1; for (int e = 0; e < 12; ++e) { if (!(edge_mask & (1 << e))) continue; int v0 = kEdgeCorners[e][0], v1 = kEdgeCorners[e][1]; @@ -148,10 +149,12 @@ MCMesh marching_cubes(const std::function& f, } } - // Triangulate from standard table + // Triangulate from standard table (validate entries: 0..11) const int* tris = kTriTable[cube_idx]; - for (int t = 0; tris[t] != -1; t += 3) { - if (tris[t+2] == -1) break; + for (int t = 0; t < 15 && tris[t] != -1; t += 3) { + if (tris[t] < 0 || tris[t] > 11 || tris[t+1] < 0 || tris[t+1] > 11 + || tris[t+2] < 0 || tris[t+2] > 11) break; + if (vert_idx[tris[t]] < 0 || vert_idx[tris[t+1]] < 0 || vert_idx[tris[t+2]] < 0) break; result.triangles.push_back({ vert_idx[tris[t]], vert_idx[tris[t+1]], vert_idx[tris[t+2]] });