diff --git a/src/Chunk.h b/src/Chunk.h index 5948e76..17ca20e 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -59,25 +59,33 @@ class Chunk { // Mutators inline void set(int x, int y, int z, VoxelKind v) { data[index(x, y, z)] = v; + empty_checked = false; // Invalidate cache } inline void set(glm::ivec3 pos, VoxelKind v) { // std::cout << "Setting Pos (" << pos.x << ", " << pos.y << ", " << pos.z << ")" << std::endl; data[index(pos.x, pos.y, pos.z)] = v; + empty_checked = false; // Invalidate cache } // Other inline bool isEmpty() const { - return std::all_of(data.begin(), data.end(), [](VoxelKind k){ - return k == VoxelKind::Air; - }); + if (!empty_checked) { + is_empty = std::all_of(data.begin(), data.end(), [](VoxelKind k){ + return k == VoxelKind::Air; + }); + empty_checked = true; + } + return is_empty; } private: static constexpr int SIZE = CHUNK_SIZE; static constexpr int TOTAL = SIZE * SIZE * SIZE; - std::array data; + std::array data; std::unique_ptr mesh; // Nullable mesh + mutable bool is_empty = true; // Cache empty state + mutable bool empty_checked = false; // Track if we've checked static inline constexpr int index(int x, int y, int z) noexcept { return x + (y * SIZE) + (z * SIZE * SIZE); diff --git a/src/Mesh.cpp b/src/Mesh.cpp index 625bc5b..f0b772a 100644 --- a/src/Mesh.cpp +++ b/src/Mesh.cpp @@ -43,7 +43,7 @@ void Mesh::init() { void Mesh::uploadData(const std::vector &vboData, const std::vector &eboData) { m_indexCount = eboData.size(); - // std::cout << "Uploading mesh: " << vboData.size() << " floats, " << eboData.size() << " indices" << std::endl; + std::cout << "Uploading mesh: " << vboData.size() << " floats, " << eboData.size() << " indices" << std::endl; // Bind VAO first, then upload buffer data glBindVertexArray(m_VAO);