From 666c62457411127dae8d79040dfd407e726dcff2 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 20 Jul 2021 14:06:17 +0100 Subject: [PATCH] engine: debug lines module --- build.sh | 2 +- fishladder.c | 11 +++-- vg/vg.h | 13 ++++-- vg/vg_lines.h | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 143 insertions(+), 9 deletions(-) create mode 100644 vg/vg_lines.h diff --git a/build.sh b/build.sh index f21790a..b131633 100755 --- a/build.sh +++ b/build.sh @@ -4,7 +4,7 @@ src="fishladder.c" target="fishladder" lib="-I. -L./lib -L./" libs="-lGL -lglfw -lX11 -lXxf86vm -lXrandr -lm -lpthread -lXi -ldl -l:steam/libsteam_api.so" -flags="-fsanitize=address -ggdb3" +flags="-fsanitize=address -ggdb3 -Wno-unused-function" run_after=false do_build=true diff --git a/fishladder.c b/fishladder.c index f6673f7..12628ca 100644 --- a/fishladder.c +++ b/fishladder.c @@ -30,7 +30,6 @@ SHADER_DEFINE( colour_shader, mat4 m_projection; mat4 m_view; -mat4 m_pv; mat4 m_mdl; int main( int argc, char *argv[] ) @@ -237,7 +236,7 @@ void vg_update(void) glm_translate_z( m_view, -10.f ); glm_rotate_x( m_view, 1.0f, m_view ); - glm_mat4_mul( m_projection, m_view, m_pv ); + glm_mat4_mul( m_projection, m_view, vg_pv ); // Get mouse ray vec3 ray_origin; @@ -245,7 +244,7 @@ void vg_update(void) mat4 pv_inverse; vec4 vp = { 0.f, 0.f, vg_window_x, vg_window_y }; - glm_mat4_inv( m_pv, pv_inverse ); + glm_mat4_inv( vg_pv, pv_inverse ); glm_unprojecti( (vec3){ vg_mouse_x, vg_window_y-vg_mouse_y, -1.f }, pv_inverse, vp, ray_dir ); glm_unprojecti( (vec3){ vg_mouse_x, vg_window_y-vg_mouse_y, 0.f }, pv_inverse, vp, ray_origin ); glm_vec3_sub( ray_dir, ray_origin, ray_dir ); @@ -262,6 +261,8 @@ void vg_update(void) int tile_y = floorf( tile_pos[2] ); map.selected = map_tile_at( (int [2]){tile_x, tile_y} ); + + vg_line2( (vec3){0.f,0.f,0.f}, (vec3){0.f,3.f,0.f}, 0xff0000ff, 0xff00ff00 ); } GLuint tile_vao; @@ -275,8 +276,10 @@ void vg_render(void) glClearColor( 0.94f, 0.94f, 0.94f, 1.0f ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + glBindVertexArray( tile_vao ); + SHADER_USE( colour_shader ); - glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uPv" ), 1, GL_FALSE, (float *)m_pv ); + glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); for( int y = 0; y < map.y; y ++ ) { diff --git a/vg/vg.h b/vg/vg.h index 6b4cd23..512c9a3 100644 --- a/vg/vg.h +++ b/vg/vg.h @@ -18,10 +18,13 @@ void vg_register_exit( void( *funcptr )(void), const char *name ); void vg_exiterr( const char *strErr ); +mat4 vg_pv; + #include "vg/vg_platform.h" #include "vg/vg_io.h" #include "vg/vg_audio.h" #include "vg/vg_shader.h" +#include "vg/vg_lines.h" #include "steam/steamworks_thin.h" @@ -333,8 +336,12 @@ static void vg_init( int argc, char *argv[], const char *window_name ) vg_audio_init(); vg_register_exit( &vg_audio_free, "vg_audio_free" ); + vg_lines_init(); + vg_register_exit( &vg_lines_free, "vg_lines_free" ); vg_start(); + vg_register_exit( &vg_free, "vg_free" ); + if( vg_shaders_compile() ) { // Main gameloop @@ -351,12 +358,11 @@ static void vg_init( int argc, char *argv[], const char *window_name ) vg_time_delta = vg_min( vg_time - vg_time_last, 0.1f ); vg_update_inputs(); - vg_update(); + vg_render(); - // Update mashed projections etc + vg_lines_drawall(); - vg_render(); vg_ui(); glfwSwapBuffers( vg_window ); @@ -365,7 +371,6 @@ static void vg_init( int argc, char *argv[], const char *window_name ) } } - vg_free(); vg_exit(); } diff --git a/vg/vg_lines.h b/vg/vg_lines.h new file mode 100644 index 0000000..81b0091 --- /dev/null +++ b/vg/vg_lines.h @@ -0,0 +1,126 @@ +// Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved + +SHADER_DEFINE( vg_line_shader, + + // VERTEX + "layout (location=0) in vec3 a_co;" + "layout (location=1) in vec4 a_colour;" + "uniform mat4 uPv;" + "" + "out vec4 s_colour;" + "" + "void main()" + "{" + " vec4 vert_pos = uPv * vec4( a_co, 1.0 );" + " s_colour = a_colour;" + " gl_Position = vert_pos;" + "}", + + // FRAGMENT + "out vec4 FragColor;" + "" + "in vec4 s_colour;" + "" + "void main()" + "{" + " FragColor = s_colour;" + "}" + , + UNIFORMS({ "uPv" }) +) + +struct +{ + struct vg_lines_vert + { + vec3 co; + u32 colour; + } + *buffer; + + GLuint vao, vbo; + u32 draw_idx, cap, buffer_size; + +} +vg_lines; + +static void vg_lines_init(void) +{ + SHADER_INIT( vg_line_shader ); + + glGenVertexArrays( 1, &vg_lines.vao ); + glGenBuffers( 1, &vg_lines.vbo ); + glBindVertexArray( vg_lines.vao ); + + glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo ); + + vg_lines.cap = 10000; + vg_lines.buffer_size = vg_lines.cap * sizeof( struct vg_lines_vert ); + + glBufferData( GL_ARRAY_BUFFER, vg_lines.buffer_size, NULL, GL_DYNAMIC_DRAW ); + glBindVertexArray( vg_lines.vao ); + + glVertexAttribPointer( + 0, + sizeof( vg_lines.buffer[0].co ) / sizeof(float), + GL_FLOAT, + GL_FALSE, + sizeof( struct vg_lines_vert ), + (void *)0 + ); + glEnableVertexAttribArray( 0 ); + + glVertexAttribPointer( + 1, + 4, + GL_UNSIGNED_BYTE, + GL_TRUE, + sizeof( struct vg_lines_vert ), + (void*)(offsetof( struct vg_lines_vert, colour )) + ); + glEnableVertexAttribArray( 1 ); + vg_lines.buffer = malloc( vg_lines.buffer_size ); +} + +static void vg_lines_free(void) +{ + glDeleteVertexArrays( 1, &vg_lines.vao ); + glDeleteBuffers( 1, &vg_lines.vbo ); + + free( vg_lines.buffer ); +} + +static void vg_lines_drawall(void) +{ + SHADER_USE( vg_line_shader ); + glUniformMatrix4fv( SHADER_UNIFORM( vg_line_shader, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); + + glBindVertexArray( vg_lines.vao ); + glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo ); + + glBufferSubData( GL_ARRAY_BUFFER, 0, vg_lines.draw_idx * sizeof(struct vg_lines_vert), vg_lines.buffer ); + glEnable( GL_BLEND ); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + glBlendEquation( GL_FUNC_ADD ); + + glDrawArrays( GL_LINES, 0, vg_lines.draw_idx ); + + glDisable( GL_BLEND ); + vg_lines.draw_idx = 0; +} + +static void vg_line2( vec3 from, vec3 to, u32 fc, u32 tc ) +{ + struct vg_lines_vert *v = vg_lines.buffer + vg_lines.draw_idx; + glm_vec3_copy( from, v[0].co ); + glm_vec3_copy( to, v[1].co ); + v[0].colour = fc; + v[1].colour = tc; + + vg_lines.draw_idx += 2; +} + +static void vg_line( vec3 from, vec3 to, u32 colour ) +{ + vg_line2( from, to, colour, colour ); +} -- 2.25.1