From 8913983ada7ef3395dc3dc25a592a90f0d3aa628 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 5 Dec 2025 12:38:43 -0600 Subject: [PATCH] destroyable animated blocks --- blend/block.blend | Bin 467478 -> 464161 bytes include/collision2.hpp | 7 +- include/model/block.h | 376 ++++-------------------- include/model/block.obj | 493 ++++++++++---------------------- include/state.h | 3 +- include/update.hpp | 2 +- src/collision2.cpp | 48 +++- src/main.c | 10 +- src/render.cpp | 36 +-- src/shader/vertex_color.fp.glsl | 6 +- src/update.cpp | 41 ++- 11 files changed, 321 insertions(+), 701 deletions(-) diff --git a/blend/block.blend b/blend/block.blend index 241d9048e08d5990fb5ce4c954771e829484647c..f4fe3306218437c94645e6830f32418517b296b2 100644 GIT binary patch delta 93968 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 eAPr!*_P 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 delta 84050 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 r6Lr%rP+rHTom fabsf(n.y)) + return vec3(1 * fabsf(n.x) / n.x, 0, 0); + else if (fabsf(n.y) > fabsf(n.x)) + return vec3(0, 1 * fabsf(n.y) / n.y, 0); + else { + if (fabsf(cdistance0.x) > fabsf(cdistance0.y)) + return vec3(1 * -fabsf(cdistance0.x) / cdistance0.x, 0, 0); + else if (fabsf(cdistance0.y) > fabsf(cdistance0.x)) + return vec3(0, 1 * -fabsf(cdistance0.y) / cdistance0.y, 0); + else + return normalize(vec3(1, 1, 0)); + } +} + +bool aabb_circle_collision(vec3 aabb_position, vec3 circle_position, vec3 bounds, struct collision_data * data) +{ vec3 distance = circle_position - aabb_position; vec3 closest_point_pd = clamp(distance, -bounds, bounds); vec3 closest_point_p = aabb_position + closest_point_pd; @@ -30,5 +63,16 @@ bool aabb_circle_collision(vec3 aabb_position, vec3 circle_position) if (!collided) return collided; + vec3 cdistance0 = closest_point_p - circle_position; + vec3 cdistance = normalize(cdistance0); + vec3 closest_point_c = circle_position + cdistance; + vec3 penetration_dir = closest_point_p - closest_point_c; + vec3 penetration_vec = normalize(penetration_dir); + + vec3 escape_position = circle_position + penetration_vec * magnitude(penetration_dir); + + data->escape_position = escape_position; + data->bounds_normal = bounds_normal(bounds, closest_point_pd, cdistance0); + return collided; } diff --git a/src/main.c b/src/main.c index 86b30cc..f112b04 100644 --- a/src/main.c +++ b/src/main.c @@ -167,6 +167,8 @@ int main() reset_level(&state); state.start_time = glfwGetTime(); + glEnable(GL_DEPTH_TEST); + while(!glfwWindowShouldClose(window)) { if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); @@ -209,9 +211,8 @@ int main() if (state.paddle_x > 12 - extent) state.paddle_x = 12 - extent; - update(&state); double time = glfwGetTime(); - state.remaining = 20.0 - (time - state.start_time); + update(&state, time); if ((state.ball_x + state.ball_dx * 0.4) > 12.25f) { state.ball_x = 12.25f; @@ -229,7 +230,8 @@ int main() state.ball_dy = -state.ball_dy; } - glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthFunc(GL_GREATER); glUseProgram(program); @@ -245,7 +247,7 @@ int main() uniform_light_pos, &state); - glEnable(GL_DEPTH_TEST); + glDisable(GL_BLEND); glDepthFunc(GL_ALWAYS); glUseProgram(font_program); diff --git a/src/render.cpp b/src/render.cpp index 6205e1c..ed72215 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -133,20 +133,26 @@ void render(mesh paddle_mesh, for (int y = 0; y < 28; y++) { for (int x = 0; x < 13; x++) { - char tile = state->level[y * 13 + x]; - //if (tile == 0) - //continue; + int block_ix = y * 13 + x; + char tile = state->level[block_ix]; + if (tile == 0) + continue; + double destroyed_time = state->blocks[block_ix].destroyed_time; + double dt = state->time - destroyed_time; + if (destroyed_time != 0.0 && dt >= 2.0) + continue; const float cs = 1.0f / 255.0f; - vec3 base_color = vec3(((float)state->pal[tile * 3 + 0]) * cs, + + vec4 base_color = vec4(((float)state->pal[tile * 3 + 0]) * cs, ((float)state->pal[tile * 3 + 1]) * cs, - ((float)state->pal[tile * 3 + 2]) * cs); + ((float)state->pal[tile * 3 + 2]) * cs, + 1.0f); + if (destroyed_time != 0.0) { + base_color = vec4(1, 0, 0, (float)((2.0 - dt) * 0.5)); + } vec3 block_position = vec3(x * 4.0f, -y * 2.0f, 0.0f); - vec3 ball_position = vec3(state->ball_x * 4.0f, -state->ball_y * 2.0f, 0.0); - bool collided = aabb_circle_collision(block_position, ball_position); - if (collided) - base_color = vec3(1, 0, 0); mat4x4 rx = rotate_x(-PI / 2.0f); mat4x4 t = translate(block_position); @@ -158,7 +164,7 @@ void render(mesh paddle_mesh, glUniform4fv(uniform_trans, 4, &trans[0][0]); glUniform3fv(uniform_normal_trans, 3, &normal_trans[0][0]); - glUniform3fv(uniform_base_color, 1, &base_color[0]); + glUniform4fv(uniform_base_color, 1, &base_color[0]); glUniform3fv(uniform_light_pos, 1, &light_pos[0]); glDrawElements(GL_TRIANGLES, block_mesh.length, GL_UNSIGNED_INT, 0); @@ -176,8 +182,7 @@ void render(mesh paddle_mesh, mat4x4 trans = a * t * rx; mat3x3 normal_trans = submatrix(rx, 3, 3); - //vec3 base_color = vec3(1, 1, 1); - vec3 base_color = vec3(1, 1, 1) * 0.5f; + vec4 base_color = vec4(0.5f, 0.5f, 0.5f, 1.0f); //vec3 light_pos = vec3(-1, -1, 1); glBindBuffer(GL_ARRAY_BUFFER, paddle_mesh.vtx); @@ -210,7 +215,7 @@ void render(mesh paddle_mesh, glUniform4fv(uniform_trans, 4, &trans[0][0]); glUniform3fv(uniform_normal_trans, 3, &normal_trans[0][0]); - glUniform3fv(uniform_base_color, 1, &base_color[0]); + glUniform4fv(uniform_base_color, 1, &base_color[0]); glUniform3fv(uniform_light_pos, 1, &light_pos[0]); glDrawElements(GL_TRIANGLES, paddle_mesh.length, GL_UNSIGNED_INT, 0); @@ -226,8 +231,7 @@ void render(mesh paddle_mesh, mat4x4 trans = a * t * rx; mat3x3 normal_trans = submatrix(rx, 3, 3); - //vec3 base_color = vec3(1, 1, 1); - vec3 base_color = vec3(1, 1, 1) * 0.5f; + vec4 base_color = vec4(0.5f, 0.5f, 0.5f, 1.0f); //vec3 light_pos = vec3(-1, -1, 1); glBindBuffer(GL_ARRAY_BUFFER, ball_mesh.vtx); @@ -260,7 +264,7 @@ void render(mesh paddle_mesh, glUniform4fv(uniform_trans, 4, &trans[0][0]); glUniform3fv(uniform_normal_trans, 3, &normal_trans[0][0]); - glUniform3fv(uniform_base_color, 1, &base_color[0]); + glUniform4fv(uniform_base_color, 1, &base_color[0]); glUniform3fv(uniform_light_pos, 1, &light_pos[0]); glDrawElements(GL_TRIANGLES, paddle_mesh.length, GL_UNSIGNED_INT, 0); diff --git a/src/shader/vertex_color.fp.glsl b/src/shader/vertex_color.fp.glsl index 4f7616c..90a02da 100644 --- a/src/shader/vertex_color.fp.glsl +++ b/src/shader/vertex_color.fp.glsl @@ -1,6 +1,6 @@ #version 120 -uniform vec3 base_color; +uniform vec4 base_color; uniform vec3 light_pos; varying vec3 fp_position; @@ -15,9 +15,9 @@ void main() vec3 light_dir = normalize(light_pos - fp_position); float diffuse = max(dot(fp_normal, light_dir), 0.0); - vec3 color = (diffuse + 0.5) * base_color; + vec3 color = (diffuse + 0.5) * base_color.xyz; - gl_FragColor = vec4(color, 1.0); + gl_FragColor = vec4(color, base_color.w); //gl_FragColor = vec4(fp_normal * 0.5 + 0.5, 1.0); //gl_FragColor = vec4(fp_texture, 0.0, 1.0); } diff --git a/src/update.cpp b/src/update.cpp index 1084b75..e6f884c 100644 --- a/src/update.cpp +++ b/src/update.cpp @@ -3,7 +3,7 @@ #include #include "update.hpp" -#include "collision.hpp" +#include "collision2.hpp" #include "state.h" #include "level/level1.data.h" @@ -20,8 +20,8 @@ void reset_level(struct game_state * state) state->ball_x = 0.0; state->ball_y = 25.0; - state->ball_dx = 0.01; - state->ball_dy = 0.01; + state->ball_dx = 0.1; + state->ball_dy = 0.1; state->start_time = 0.0; @@ -36,8 +36,41 @@ void reset_level(struct game_state * state) } } -void update(struct game_state * state) +void update(struct game_state * state, double time) { + for (int y = 0; y < 28; y++) { + for (int x = 0; x < 13; x++) { + int block_ix = y * 13 + x; + char tile = state->level[block_ix]; + if (tile == 0) + continue; + if (state->blocks[block_ix].destroyed_time != 0.0) + continue; + + vec3 block_position = vec3(x * 4.0f, -y * 2.0f, 0.0f); + vec3 ball_position = vec3(state->ball_x * 4.0f, -state->ball_y * 2.0f, 0.0); + + // paddle 6.0 + // block 4.0 + // const vec3 paddle_bounds = vec3(3, 1, 0); + const vec3 block_bounds = vec3(2, 1, 0); + struct collision_data cd; + bool collided = aabb_circle_collision(block_position, ball_position, block_bounds, &cd); + if (collided) { + state->ball_x = cd.escape_position.x / 4.0f; + state->ball_y = -cd.escape_position.y / 2.0f; + vec3 vel = reflect(vec3(state->ball_dx, state->ball_dy, 0), cd.bounds_normal); + state->ball_dx = vel.x; + state->ball_dy = vel.y; + + state->blocks[block_ix].destroyed_time = time; + } + } + } + state->ball_x += state->ball_dx; state->ball_y += state->ball_dy; + + state->time = time; + state->remaining = 20.0 - (time - state->start_time); }