From 3a52808a6609a0b356d739017d1f0eb6f8123e98 Mon Sep 17 00:00:00 2001 From: Aaditya Dhruv Date: Sun, 25 Jan 2026 23:45:10 -0600 Subject: Fix block_init/draw bug, add more blocks to draw - VAO/VBO binding bug fixed, added explaination in comments - Add 9 rotating blocks --- CMakeLists.txt | 1 + src/block.c | 12 +++++++++--- src/block.h | 1 - src/engine.c | 28 +++++++++++++++++----------- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cff1d8..f2bf966 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(junkcraft VERSION 1.0 DESCRIPTION "Minecraft clone" LANGUAGES C) +set(CMAKE_BUILD_TYPE Debug) message("Compiler: ${CMAKE_CXX_COMPILER_ID}") add_subdirectory(src) diff --git a/src/block.c b/src/block.c index 8b7ba20..32b9560 100644 --- a/src/block.c +++ b/src/block.c @@ -53,7 +53,13 @@ int block_init(vec3 pos, struct block* blk) { glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); // Set EBO to the vertex_order glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, blk->_ebo); - + //NOTE: This is important, otherwise with multiple block_init calls, it + //creates a segfault since the bindings get all messed up. Why it gets + //messed up? Let's say we make 2 blocks. Block 1 creates VBOs, then VAO, + //then binds everything. Now VAO is still bound. Block 2 init starts. First + //call is create_vbo. Since VAO is already bound, it gets bound to the OLD + //VAO!! Always clear before use. + glBindVertexArray(0); return 0; } @@ -66,8 +72,9 @@ void block_update(struct block* blk) { vec3 rot_axis = { 1.0f, 1.0f, 0.0f }; vec3 axis_y = { 0.0f, 1.0f, 0.0f }; vec3 pivot = { 0.0f, 0.0f, 0.0f }; - vec3 translation = { 0.0f, 0, -2.0f }; + vec3 scale = { 0.25f, 0.25f, 0.25f }; glm_translate(blk->model, blk->coords); + glm_scale(blk->model, scale); glm_rotate_at(blk->model, pivot, angle, rot_axis); // View matrix (camera) vec3 camera = { 0.0f, 0.0f, 2.0f }; @@ -98,7 +105,6 @@ int block_draw(struct block* blk, struct shader* shader) { 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, - }; glUniform3fv(loc, 6, (void*)colors); glDrawElements(GL_TRIANGLES, blk->_vertex_count, GL_UNSIGNED_INT, 0); diff --git a/src/block.h b/src/block.h index faabe58..aecb804 100644 --- a/src/block.h +++ b/src/block.h @@ -5,7 +5,6 @@ struct block { vec3 coords; - int type; GLuint _vao; GLuint _vbo; GLuint _ebo; diff --git a/src/engine.c b/src/engine.c index e5cda7e..ec1fdcd 100644 --- a/src/engine.c +++ b/src/engine.c @@ -24,17 +24,23 @@ int engine_init(struct engine *engine) { engine->shader = shader; // Setup Objects to draw - struct block* blk = malloc(sizeof(struct block)); - memset(blk, 0, sizeof(struct block)); - vec3 pos = { 0, 0, -1.0f }; - if (block_init(pos, blk) != 0) { - free(window); - free(shader); - free(blk); - return -1; - } vector_init(&engine->objects); - VECTOR_INSERT(engine->objects, (void*)blk); + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + fprintf(stderr, "Creating block %d\n", i + j); + struct block* blk = malloc(sizeof(struct block)); + memset(blk, 0, sizeof(struct block)); + vec3 pos = { 0.5f * ((float)i - 1), 0.5f * ((float)j - 1), 0.0f}; + if (block_init(pos, blk) != 0) { + //TODO: Fix frees here + return -1; + } + fprintf(stderr, "Inserting block %d\n", i + j); + if (VECTOR_INSERT(engine->objects, (void*)blk) == -1) exit(1); + fprintf(stderr, "Done block %d\n", i + j); + } + } engine->game_loop = 1; return 0; @@ -53,7 +59,7 @@ void engine_draw(struct engine* engine) { glEnable(GL_DEPTH_TEST); //glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glUseProgram(engine->shader->program); - for (int i = 0; i < engine->objects->len; i++) { + for (int i = 0; i < vector_length(engine->objects); i++) { struct block* block = vector_get(engine->objects, i); block_draw(block, engine->shader); } -- cgit