From 5164754a26940426c8ba48b40e3162ecc2e18f71 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 5 Dec 2025 16:56:39 -0600 Subject: [PATCH] animate background, paddle, balls --- blend/paddle.blend | Bin 530188 -> 536868 bytes include/model/paddle.h | 7316 +++++++++++++-------------- include/model/paddle.obj | 3922 +++++++------- include/render.hpp | 8 +- include/shader/background.fp.glsl.h | 19 + include/shader/background.vp.glsl.h | 19 + src/main.c | 67 +- src/render.cpp | 50 +- src/shader/background.fp.glsl | 21 + src/shader/background.vp.glsl | 25 + src/shader/font.vp.glsl | 1 - 11 files changed, 6003 insertions(+), 5445 deletions(-) create mode 100644 include/shader/background.fp.glsl.h create mode 100644 include/shader/background.vp.glsl.h create mode 100644 src/shader/background.fp.glsl create mode 100644 src/shader/background.vp.glsl diff --git a/blend/paddle.blend b/blend/paddle.blend index 089477f86384d816eff2120bcfd5910ab04adb94..b6e56be616ce2775aa09c2c11b818793133c9fc5 100644 GIT binary patch delta 113710 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 delta 100882 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 + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_shader_background_fp_glsl_start __asm("_binary_src_shader_background_fp_glsl_start"); +extern uint32_t _binary_src_shader_background_fp_glsl_end __asm("_binary_src_shader_background_fp_glsl_end"); +extern uint32_t _binary_src_shader_background_fp_glsl_size __asm("_binary_src_shader_background_fp_glsl_size"); + +#define src_shader_background_fp_glsl_start ((const char *)&_binary_src_shader_background_fp_glsl_start) +#define src_shader_background_fp_glsl_end ((const char *)&_binary_src_shader_background_fp_glsl_end) +#define src_shader_background_fp_glsl_size (src_shader_background_fp_glsl_end - src_shader_background_fp_glsl_start) + +#ifdef __cplusplus +} +#endif diff --git a/include/shader/background.vp.glsl.h b/include/shader/background.vp.glsl.h new file mode 100644 index 0000000..08437d7 --- /dev/null +++ b/include/shader/background.vp.glsl.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_src_shader_background_vp_glsl_start __asm("_binary_src_shader_background_vp_glsl_start"); +extern uint32_t _binary_src_shader_background_vp_glsl_end __asm("_binary_src_shader_background_vp_glsl_end"); +extern uint32_t _binary_src_shader_background_vp_glsl_size __asm("_binary_src_shader_background_vp_glsl_size"); + +#define src_shader_background_vp_glsl_start ((const char *)&_binary_src_shader_background_vp_glsl_start) +#define src_shader_background_vp_glsl_end ((const char *)&_binary_src_shader_background_vp_glsl_end) +#define src_shader_background_vp_glsl_size (src_shader_background_vp_glsl_end - src_shader_background_vp_glsl_start) + +#ifdef __cplusplus +} +#endif diff --git a/src/main.c b/src/main.c index ab50ecc..b9fc9a9 100644 --- a/src/main.c +++ b/src/main.c @@ -8,9 +8,10 @@ #include "shader/vertex_color.fp.glsl.h" #include "shader/vertex_color.vp.glsl.h" - #include "shader/font.fp.glsl.h" #include "shader/font.vp.glsl.h" +#include "shader/background.fp.glsl.h" +#include "shader/background.vp.glsl.h" #include "font/ter_u32n.data.h" @@ -24,8 +25,8 @@ //#include "model/cube.h" #include "model/plane.h" -int vp_width = 1600; -int vp_height = 1200; +int vp_width = 800; +int vp_height = 600; void framebuffer_size_callback(GLFWwindow* window, int width, int height) { @@ -100,24 +101,20 @@ int main() glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); ////////////////////////////////////////////////////////////////////// - // buffer initialization + // mesh initialization ////////////////////////////////////////////////////////////////////// - /* - uint triangle_vertex_buffer = make_buffer(GL_ARRAY_BUFFER, - triangle_vertex_buffer_data, - (sizeof (triangle_vertex_buffer_data))); - */ - struct mesh paddle_mesh; struct mesh block_mesh; struct mesh ball_mesh; + struct mesh plane_mesh; block_mesh.vtx = make_buffer(GL_ARRAY_BUFFER, block_vertices, (sizeof (block_vertices))); block_mesh.idx = make_buffer(GL_ELEMENT_ARRAY_BUFFER, block_Cube_triangles, (sizeof (block_Cube_triangles))); block_mesh.length = block_Cube_triangles_length; - //block_mesh.vtx = make_buffer(GL_ARRAY_BUFFER, cube_vertices, (sizeof (cube_vertices))); - //block_mesh.idx = make_buffer(GL_ELEMENT_ARRAY_BUFFER, cube_Cube_triangles, (sizeof (cube_Cube_triangles))); - //block_mesh.length = cube_Cube_triangles_length; + + //cube_mesh.vtx = make_buffer(GL_ARRAY_BUFFER, cube_vertices, (sizeof (cube_vertices))); + //cube_mesh.idx = make_buffer(GL_ELEMENT_ARRAY_BUFFER, cube_Cube_triangles, (sizeof (cube_Cube_triangles))); + //cube_mesh.length = cube_Cube_triangles_length; paddle_mesh.vtx = make_buffer(GL_ARRAY_BUFFER, paddle_vertices, (sizeof (paddle_vertices))); paddle_mesh.idx = make_buffer(GL_ELEMENT_ARRAY_BUFFER, paddle_Cylinder_triangles, (sizeof (paddle_Cylinder_triangles))); @@ -127,11 +124,20 @@ int main() ball_mesh.idx = make_buffer(GL_ELEMENT_ARRAY_BUFFER, ball_Icosphere_triangles, (sizeof (ball_Icosphere_triangles))); ball_mesh.length = ball_Icosphere_triangles_length; + plane_mesh.vtx = make_buffer(GL_ARRAY_BUFFER, plane_vertices, (sizeof (plane_vertices))); + plane_mesh.idx = make_buffer(GL_ELEMENT_ARRAY_BUFFER, plane_Plane_triangles, (sizeof (plane_Plane_triangles))); + plane_mesh.length = plane_Plane_triangles_length; + + ////////////////////////////////////////////////////////////////////// + // shaders + ////////////////////////////////////////////////////////////////////// + + // + uint program = compile_shader(src_shader_vertex_color_vp_glsl_start, src_shader_vertex_color_vp_glsl_size, src_shader_vertex_color_fp_glsl_start, src_shader_vertex_color_fp_glsl_size); - glUseProgram(program); uint attrib_position = glGetAttribLocation(program, "position"); uint attrib_texture = glGetAttribLocation(program, "_texture"); uint attrib_normal = glGetAttribLocation(program, "normal"); @@ -140,25 +146,29 @@ int main() uint uniform_base_color = glGetUniformLocation(program, "base_color"); uint uniform_light_pos = glGetUniformLocation(program, "light_pos"); - // - struct mesh plane_mesh; - - plane_mesh.vtx = make_buffer(GL_ARRAY_BUFFER, plane_vertices, (sizeof (plane_vertices))); - plane_mesh.idx = make_buffer(GL_ELEMENT_ARRAY_BUFFER, plane_Plane_triangles, (sizeof (plane_Plane_triangles))); - plane_mesh.length = plane_Plane_triangles_length; + // font uint font_program = compile_shader(src_shader_font_vp_glsl_start, src_shader_font_vp_glsl_size, src_shader_font_fp_glsl_start, src_shader_font_fp_glsl_size); - glUseProgram(font_program); uint font__attrib_position = glGetAttribLocation(font_program, "position"); uint font__attrib_texture = glGetAttribLocation(font_program, "_texture"); - uint font__attrib_normal = glGetAttribLocation(font_program, "normal"); uint font__uniform_trans = glGetUniformLocation(font_program, "trans"); uint font__uniform_texture_trans = glGetUniformLocation(font_program, "texture_trans"); uint font__uniform_texture0 = glGetUniformLocation(font_program, "texture0"); + // background + + uint bg_program = compile_shader(src_shader_background_vp_glsl_start, + src_shader_background_vp_glsl_size, + src_shader_background_fp_glsl_start, + src_shader_background_fp_glsl_size); + uint bg__attrib_position = glGetAttribLocation(bg_program, "position"); + uint bg__uniform_resolution = glGetUniformLocation(bg_program, "resolution"); + uint bg__uniform_trans = glGetUniformLocation(bg_program, "trans"); + uint bg__uniform_time = glGetUniformLocation(bg_program, "time"); + ////////////////////////////////////////////////////////////////////// // textures ////////////////////////////////////////////////////////////////////// @@ -228,7 +238,7 @@ int main() const char * name = glfwGetJoystickName(GLFW_JOYSTICK_1 + i); if (name != last_gamepad_name) { - printf("active gamepad: `%s`; axes: %d\n", name, count); + printf("active gamepad: `%s`; axes: 6 ; buttons: %d\n", name, count); last_gamepad_name = name; } @@ -259,6 +269,16 @@ int main() update(&state, time); + glDisable(GL_BLEND); + glDepthFunc(GL_ALWAYS); + glUseProgram(bg_program); + render_background(plane_mesh, + bg__attrib_position, + bg__uniform_resolution, + bg__uniform_trans, + bg__uniform_time, + &state); + glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthFunc(GL_GREATER); @@ -283,7 +303,6 @@ int main() render_font(plane_mesh, font__attrib_position, font__attrib_texture, - font__attrib_normal, font__uniform_trans, font__uniform_texture_trans, font__uniform_texture0, diff --git a/src/render.cpp b/src/render.cpp index aa154b1..856feb1 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -176,11 +176,12 @@ void render(mesh paddle_mesh, { mat4x4 rx = rotate_y(PI / 2.0f); + mat4x4 ry = rotate_x((float)state->time); mat4x4 t = translate(vec3(state->paddle_x * 4.0f, -state->paddle_y * 2.0f, 0.0)); - mat4x4 trans = a * t * rx; - mat3x3 normal_trans = submatrix(rx, 3, 3); + mat4x4 trans = a * t * ry * rx; + mat3x3 normal_trans = submatrix(ry * rx, 3, 3); vec4 base_color = vec4(0.5f, 0.5f, 0.5f, 1.0f); //vec3 light_pos = vec3(-1, -1, 1); @@ -227,12 +228,13 @@ void render(mesh paddle_mesh, for (int i = 0; i < state->balls_launched; i++) { struct ball_state& ball = state->balls[i]; - mat4x4 rx = rotate_y(PI / 2.0f); + mat4x4 rx = rotate_x((float)state->time); + mat4x4 ry = rotate_y((float)state->time * 0.5f); vec3 ball_position = vec3(ball.ball_x * 4.0f, -ball.ball_y * 2.0f, 0.0); mat4x4 t = translate(ball_position); - mat4x4 trans = a * t * rx; - mat3x3 normal_trans = submatrix(rx, 3, 3); + mat4x4 trans = a * t * ry * rx; + mat3x3 normal_trans = submatrix(ry * rx, 3, 3); //vec4 base_color = vec4(0.5f, 0.5f, 0.5f, 1.0f); float hue = state->time - ball.launch_time; hue = hue - floorf(hue); @@ -309,7 +311,6 @@ static inline int max(int a, int b) void render_font(struct mesh plane_mesh, uint attrib_position, uint attrib_texture, - uint attrib_normal, uint uniform_trans, uint uniform_texture_trans, uint uniform_texture0, @@ -332,16 +333,8 @@ void render_font(struct mesh plane_mesh, (sizeof (float)) * 8, (void*)(3 * 4) ); - glVertexAttribPointer(attrib_normal, - 3, - GL_FLOAT, - GL_FALSE, - (sizeof (float)) * 8, - (void*)(5 * 4) - ); glEnableVertexAttribArray(attrib_position); glEnableVertexAttribArray(attrib_texture); - glEnableVertexAttribArray(attrib_normal); float aspect = (float)vp_height / (float)vp_width; @@ -369,3 +362,32 @@ void render_font(struct mesh plane_mesh, advance += grid_width; } } + +void render_background(struct mesh plane_mesh, + uint attrib_position, + uint uniform_resolution, + uint uniform_trans, + uint uniform_time, + struct game_state * state) +{ + glBindBuffer(GL_ARRAY_BUFFER, plane_mesh.vtx); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, plane_mesh.idx); + + glVertexAttribPointer(attrib_position, + 3, + GL_FLOAT, + GL_FALSE, + (sizeof (float)) * 8, + (void*)(0 * 4) + ); + glEnableVertexAttribArray(attrib_position); + + mat4x4 r = rotate_y(PI / 1.0f) * rotate_z(PI / 1.0f) * rotate_x(PI / 2.0f); + mat4x4 trans = r; + glUniform4fv(uniform_trans, 4, &trans[0][0]); + glUniform1f(uniform_time, state->time); + vec2 resolution = vec2(vp_width, vp_height); + glUniform2fv(uniform_resolution, 1, &resolution[0]); + + glDrawElements(GL_TRIANGLES, plane_mesh.length, GL_UNSIGNED_INT, 0); +} diff --git a/src/shader/background.fp.glsl b/src/shader/background.fp.glsl new file mode 100644 index 0000000..c585b03 --- /dev/null +++ b/src/shader/background.fp.glsl @@ -0,0 +1,21 @@ +#version 120 + +varying vec2 fp_uv; + +uniform float time; + +vec3 palette(float d) { + vec3 v = d + vec3(0.25, 0.40625, 0.5625); // 40 45 49 + v = v * 6.28318548202514648438; + v = cos(v); + return vec3(0.5, 0.5, 0.5) * v + vec3(0.5, 0.5, 0.5); // 48 +} + +void main() +{ + vec2 uv = fp_uv; + float d = length(uv); + float td = time * 0.5 + d; + + gl_FragColor = vec4(palette(td) * 0.2, 1); +} diff --git a/src/shader/background.vp.glsl b/src/shader/background.vp.glsl new file mode 100644 index 0000000..9671579 --- /dev/null +++ b/src/shader/background.vp.glsl @@ -0,0 +1,25 @@ +#version 120 + +attribute vec3 position; + +uniform vec4 trans[4]; +uniform vec2 resolution; + +varying vec2 fp_uv; + +vec4 transform4(vec4 v) +{ + return vec4(dot(trans[0], v), + dot(trans[1], v), + dot(trans[2], v), + dot(trans[3], v)); +} + +void main() +{ + vec4 pos = transform4(vec4(position, 1)); + + fp_uv = vec2(pos.x * resolution.x / resolution.y, pos.y); + + gl_Position = pos; +} diff --git a/src/shader/font.vp.glsl b/src/shader/font.vp.glsl index 0809cb9..ff05d10 100644 --- a/src/shader/font.vp.glsl +++ b/src/shader/font.vp.glsl @@ -2,7 +2,6 @@ attribute vec3 position; attribute vec2 _texture; -attribute vec3 normal; varying vec2 fp_texture; varying vec2 fp_texture_trans;