From 46be697e2fb1a8782c51ae8004e3815f122f4afc Mon Sep 17 00:00:00 2001 From: JISAUAY Date: Wed, 12 Nov 2025 14:06:57 -0600 Subject: [PATCH] added voxel types --- .attachments/voxel-types.png | Bin 0 -> 62006 bytes README.md | 6 +++++ shaders/cube_frag.glsl | 14 +++++++++- shaders/cube_vert.glsl | 3 +++ src/Chunk.cpp | 50 ++++++++++++++++++++--------------- src/Chunk.h | 12 ++++++--- src/Mesh.cpp | 7 +++-- src/World.cpp | 25 +++++++++++++----- src/World.h | 3 ++- src/main.cpp | 9 +++++-- 10 files changed, 91 insertions(+), 38 deletions(-) create mode 100644 .attachments/voxel-types.png diff --git a/.attachments/voxel-types.png b/.attachments/voxel-types.png new file mode 100644 index 0000000000000000000000000000000000000000..003ef10bf9951464b8632568d91af5cecbe4c022 GIT binary patch literal 62006 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 tOEaJVDLlm@gUk<)pVaZ60-EoC{tu`a( #include -const int VERTEX_SIZE = 6; +const int VERTEX_SIZE = 7; // x, y, z, nx, ny, nz, voxelKind const float topFace[24] = { // x, y, z, nx, ny, nz @@ -42,16 +42,17 @@ const float backFace[24] = { -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f }; -void addFace(glm::ivec3 pos, const float *faceVertices, std::vector &vbo, std::vector &ebo) { +void addFace(glm::ivec3 pos, const float *faceVertices, float voxelKind, std::vector &vbo, std::vector &ebo) { unsigned int vIndex = vbo.size() / VERTEX_SIZE; for (int i = 0; i < 4; i++) { - const float* v = &faceVertices[i * VERTEX_SIZE]; + const float* v = &faceVertices[i * 6]; // Face data is still 6 floats per vertex vbo.push_back(v[0] + pos.x); vbo.push_back(v[1] + pos.y); vbo.push_back(v[2] + pos.z); vbo.push_back(v[3]); vbo.push_back(v[4]); vbo.push_back(v[5]); + vbo.push_back(voxelKind); // Add voxel kind as 7th component } ebo.push_back(vIndex + 0); ebo.push_back(vIndex + 1); @@ -65,7 +66,7 @@ Chunk::Chunk() { // mesh is initially null (nullptr) } -Chunk::Chunk(std::unordered_set voxels) { +Chunk::Chunk(std::unordered_map voxels) { this->voxels = voxels; } @@ -83,24 +84,25 @@ void Chunk::generateMesh() { // std::cout << "Generating Chunk mesh..." << std::endl; - for (const glm::ivec3 pos : voxels) { - if (voxels.count(pos + glm::ivec3(0, 1, 0)) == 0) { - addFace(pos, topFace, vboData, eboData); - } - if (voxels.count(pos + glm::ivec3(0, -1, 0)) == 0) { - addFace(pos, bottomFace, vboData, eboData); - } - if (voxels.count(pos + glm::ivec3(1, 0, 0)) == 0) { - addFace(pos, rightFace, vboData, eboData); - } - if (voxels.count(pos + glm::ivec3(-1, 0, 0)) == 0) { - addFace(pos, leftFace, vboData, eboData); - } - if (voxels.count(pos + glm::ivec3(0, 0, 1)) == 0) { - addFace(pos, frontFace, vboData, eboData); - } - if (voxels.count(pos + glm::ivec3(0, 0, -1)) == 0) { - addFace(pos, backFace, vboData, eboData); + const std::pair neighbors[6] = { + std::pair(glm::ivec3(0, 1, 0), topFace), // top + std::pair(glm::ivec3(0, -1, 0), bottomFace), // bottom + std::pair(glm::ivec3(1, 0, 0), rightFace), // right + std::pair(glm::ivec3(-1, 0, 0), leftFace), // left + std::pair(glm::ivec3(0, 0, 1), frontFace), // front + std::pair(glm::ivec3(0, 0, -1), backFace) // back + }; + + for (const std::pair& pair : voxels) { + const glm::ivec3& pos = pair.first; + const VoxelKind& kind = pair.second; + + for (const std::pair& neighborPair : neighbors) { + glm::ivec3 dir = neighborPair.first; + const float* face = neighborPair.second; + if (voxels.count(pos + dir) == 0) { + addFace(pos, face, static_cast(kind), vboData, eboData); + } } } @@ -113,3 +115,7 @@ void Chunk::generateMesh() { // Now, upload this data to our mesh object mesh->uploadData(vboData, eboData); } + +void Chunk::regenerateMesh() { + this->generateMesh(); +} diff --git a/src/Chunk.h b/src/Chunk.h index cdce79b..925b453 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -1,13 +1,18 @@ #ifndef CHUNK_H #define CHUNK_H -#include +#include #include #include #include "Mesh.h" +enum VoxelKind { + Dirt, + Stone +}; + const int CHUNK_SIZE = 32; // Hash function for glm::ivec3 to use with unordered_set @@ -28,14 +33,15 @@ namespace std { class Chunk { public: - std::unordered_set voxels; + std::unordered_map voxels; Chunk(); - Chunk(std::unordered_set voxels); + Chunk(std::unordered_map voxels); Mesh* getMesh(); // Returns pointer, can be null if not generated yet void generateMesh(); + void regenerateMesh(); private: std::unique_ptr mesh; // Nullable mesh diff --git a/src/Mesh.cpp b/src/Mesh.cpp index bc16f36..625bc5b 100644 --- a/src/Mesh.cpp +++ b/src/Mesh.cpp @@ -24,11 +24,14 @@ void Mesh::init() { // 2. Set up attributes (this layout is now saved in the VAO) // Position Attribute - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // Normal Attribute - glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float))); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); + // VoxelKind Attribute + glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(6 * sizeof(float))); + glEnableVertexAttribArray(2); // 3. Bind EBO glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_EBO); diff --git a/src/World.cpp b/src/World.cpp index 1465a2e..d68a724 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -2,27 +2,38 @@ World::World() {} -void World::flip_voxel(glm::ivec3 position) { +void World::set_voxel(glm::ivec3 position, std::optional kind) { glm::ivec3 chunk_position = position / CHUNK_SIZE; glm::ivec3 local_position = position % CHUNK_SIZE; Chunk * chunk = get_or_create_chunk(chunk_position); - if (chunk->voxels.count(local_position) != 0) { + if (!kind.has_value()) { chunk->voxels.erase(chunk->voxels.find(local_position)); } else { - chunk->voxels.insert(local_position); + chunk->voxels[local_position] = kind.value(); } + + chunk->regenerateMesh(); } Chunk* World::get_or_create_chunk(glm::ivec3 chunk_position) { if (this->chunks.count(chunk_position) == 0) { // Fill in new chunk with a flat plane of voxels at y=0 - std::unordered_set voxels; + std::unordered_map voxels; if (chunk_position.y == 0) { - for (int z = 0; z <= 32; z++) { - for (int x = 0; x <= 32; x++) { - voxels.insert(glm::ivec3(x, 0, z)); + for (int z = 0; z <= CHUNK_SIZE; z++) { + for (int y = 0; y <= CHUNK_SIZE; y++) { + for (int x = 0; x <= CHUNK_SIZE; x++) { + glm::ivec3 offset = glm::ivec3(x, y, z); + glm::ivec3 world_voxel_position = chunk_position * 32 + offset; + + if (world_voxel_position.y == 0) { + voxels[offset] = VoxelKind::Dirt; + } else if (world_voxel_position.y < 0) { + voxels[offset] = VoxelKind::Stone; + } + } } } } diff --git a/src/World.h b/src/World.h index 927ac8f..82413fd 100644 --- a/src/World.h +++ b/src/World.h @@ -2,6 +2,7 @@ #define WORLD_H #include +#include #include @@ -14,7 +15,7 @@ class World World(); - void flip_voxel(glm::ivec3 position); + void set_voxel(glm::ivec3 position, std::optional kind); Chunk* get_or_create_chunk(glm::ivec3 chunk_position); }; diff --git a/src/main.cpp b/src/main.cpp index 6d0f431..29e821a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -54,6 +54,8 @@ bool first_mouse = true; bool mouse_lock = true; float last_x = 400, last_y = 300; +World world; + // Mouse Look void mouse_callback(GLFWwindow * window, double xpos, double ypos) { @@ -84,6 +86,10 @@ void mouse_callback(GLFWwindow * window, double xpos, double ypos) direction.y = -sin(glm::radians(pitch)); direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch)); camera.target = glm::normalize(direction); + + if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_2) == GLFW_PRESS) { + world.set_voxel(glm::ivec3(camera.position), VoxelKind::Stone); + } } // process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly @@ -183,7 +189,7 @@ int main() { glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 2. --- Create a Window --- - GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Voxel Engine 0.4.0", NULL, NULL); + GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Voxel Engine 0.5.0", NULL, NULL); if (window == NULL) { std::cerr << "Failed to create GLFW window" << std::endl; glfwTerminate(); @@ -206,7 +212,6 @@ int main() { // 5. --- Set up Vertex Data and Buffers --- // Load Cube OBJ - World world; // Object3D cube = Object3D("objs/cube.obj"); // std::cout << "World created with " << world.chunks.size() << " chunks" << std::endl;