Compare commits

..

2 Commits

Author SHA1 Message Date
0x01FE
de39d10776 update readme and remove a debug 2025-11-19 22:06:57 -06:00
0x01FE
57d749f09b fixed FPS issues (turns out you shouldn't look at 32768 * 16 voxels every frame 2025-11-19 22:04:05 -06:00
3 changed files with 18 additions and 4 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@ -47,3 +47,9 @@ It took me a couple of days to fix the ray casting. I forgot that my mesh is off
Woah! The camera doesn't just phase through placed blocks anymore! The camera can also fall into the void for eternity! So cool! Woah! The camera doesn't just phase through placed blocks anymore! The camera can also fall into the void for eternity! So cool!
![The camera, sitting atop a built platform, overlooking another "Hi" built from stone](.attachments/physics.png) ![The camera, sitting atop a built platform, overlooking another "Hi" built from stone](.attachments/physics.png)
## 0.8.0 : Data Structure Redo - 11/19/25
Final part of the blog post tutorial. Changing the data structure of the Chunk's to store voxels in a 1d array instead of a HashMap.
![Hi written on a dirt plane in stone.](.attachments/data-structure-redo.png)

View File

@ -59,25 +59,33 @@ class Chunk {
// Mutators // Mutators
inline void set(int x, int y, int z, VoxelKind v) { inline void set(int x, int y, int z, VoxelKind v) {
data[index(x, y, z)] = v; data[index(x, y, z)] = v;
empty_checked = false; // Invalidate cache
} }
inline void set(glm::ivec3 pos, VoxelKind v) { inline void set(glm::ivec3 pos, VoxelKind v) {
// std::cout << "Setting Pos (" << pos.x << ", " << pos.y << ", " << pos.z << ")" << std::endl; // std::cout << "Setting Pos (" << pos.x << ", " << pos.y << ", " << pos.z << ")" << std::endl;
data[index(pos.x, pos.y, pos.z)] = v; data[index(pos.x, pos.y, pos.z)] = v;
empty_checked = false; // Invalidate cache
} }
// Other // Other
inline bool isEmpty() const { inline bool isEmpty() const {
return std::all_of(data.begin(), data.end(), [](VoxelKind k){ if (!empty_checked) {
return k == VoxelKind::Air; is_empty = std::all_of(data.begin(), data.end(), [](VoxelKind k){
}); return k == VoxelKind::Air;
});
empty_checked = true;
}
return is_empty;
} }
private: private:
static constexpr int SIZE = CHUNK_SIZE; static constexpr int SIZE = CHUNK_SIZE;
static constexpr int TOTAL = SIZE * SIZE * SIZE; static constexpr int TOTAL = SIZE * SIZE * SIZE;
std::array<VoxelKind, TOTAL + 1> data; std::array<VoxelKind, TOTAL> data;
std::unique_ptr<Mesh> mesh; // Nullable mesh std::unique_ptr<Mesh> 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 { static inline constexpr int index(int x, int y, int z) noexcept {
return x + (y * SIZE) + (z * SIZE * SIZE); return x + (y * SIZE) + (z * SIZE * SIZE);