From 191bf91146eb7e3ac15fb18de6e7267d1cd686af Mon Sep 17 00:00:00 2001 From: hgn Date: Sat, 3 Dec 2022 12:49:54 +0000 Subject: [PATCH] framebuffer viewer --- menu.h | 17 ++--- player_physics.h | 9 +-- render.h | 173 ++++++++++++++++++++++++++++++++++++++++++-- shaders/blitblur.fs | 3 +- shaders/blitblur.h | 8 +- skaterift.c | 70 +++++++++--------- world_water.h | 2 + 7 files changed, 225 insertions(+), 57 deletions(-) diff --git a/menu.h b/menu.h index b8c5c8d..d8dbd1a 100644 --- a/menu.h +++ b/menu.h @@ -78,11 +78,8 @@ enum menu_page struct menu_btn_userdata { - union - { - int i; - void *ptr_generic; - }; + int i; + void *ptr_generic; }; VG_STATIC int menu_settings_if( struct menu_btn_userdata ud ) @@ -139,11 +136,11 @@ struct menu_button } VG_STATIC menu_buttons[] = { -{ - "text_quit", menu_vis, {.i=k_menu_page_main|k_menu_page_quit}, - .fn_press = menu_btn_quit, - .ld="text_reset", .lr="text_settings", .ll="text_map" -}, + { + "text_quit", menu_vis, {.i=k_menu_page_main|k_menu_page_quit}, + .fn_press = menu_btn_quit, + .ld="text_reset", .lr="text_settings", .ll="text_map" + }, { "text_quitty", menu_vis, {.i=k_menu_page_quit} }, diff --git a/player_physics.h b/player_physics.h index 6bfb559..997b69d 100644 --- a/player_physics.h +++ b/player_physics.h @@ -729,12 +729,9 @@ VG_STATIC int player_update_grind_collision( rb_ct *contact ) v3f delta; v3_sub( c1, c0, delta ); - if( v3_dot( delta, phys->rb.up ) > 0.0f ) + if( v3_dot( delta, phys->rb.up ) > 0.0001f ) { - v3_copy( delta, contact->n ); - float l = v3_length( contact->n ); - v3_muls( contact->n, 1.0f/l, contact->n ); - contact->p = l; + contact->p = v3_length( delta ); contact->type = k_contact_type_edge; contact->element_id = 0; v3_copy( c1, contact->co ); @@ -747,6 +744,8 @@ VG_STATIC int player_update_grind_collision( rb_ct *contact ) v3_cross( (v3f){0.0f,1.0f,0.0f}, edge_dir, axis_dir ); v3_cross( edge_dir, axis_dir, contact->n ); + vg_info( "%f %f\n", v3_length( contact->n ), contact->p ); + return 1; } else diff --git a/render.h b/render.h index e3c7ee7..374cc06 100644 --- a/render.h +++ b/render.h @@ -121,13 +121,16 @@ struct framebuffer k_framebuffer_quality_high_only } quality; - + GLenum internalformat, format, type, attachment; GLuint id; + + /* Runtime */ + int debug_view; } attachments[5]; GLuint fb; @@ -588,15 +591,48 @@ VG_STATIC void render_fb_resize(void) } } +VG_STATIC int render_framebuffer_control( int argc, char const *argv[] ); VG_STATIC void render_init_fs_quad(void) { vg_info( "[render] Allocate quad\n" ); - float quad[] = { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, - 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, + float quad[] = + { + 0.00f,0.00f, 1.00f,1.00f, 0.00f,1.00f, + 0.00f,0.00f, 1.00f,0.00f, 1.00f,1.00f, + + 0.20f,0.00f, 0.80f,1.00f, 0.20f,1.00f, + 0.20f,0.00f, 0.80f,0.00f, 0.80f,1.00f, + + /* 9x9 debug grid */ + /* row0 */ + 0.00f,0.00f, 0.30f,0.30f, 0.00f,0.30f, + 0.00f,0.00f, 0.30f,0.00f, 0.30f,0.30f, + 0.30f,0.00f, 0.60f,0.30f, 0.30f,0.30f, + 0.30f,0.00f, 0.60f,0.00f, 0.60f,0.30f, + 0.60f,0.00f, 0.90f,0.30f, 0.60f,0.30f, + 0.60f,0.00f, 0.90f,0.00f, 0.90f,0.30f, + /* row1 */ + 0.00f,0.30f, 0.30f,0.60f, 0.00f,0.60f, + 0.00f,0.30f, 0.30f,0.30f, 0.30f,0.60f, + 0.30f,0.30f, 0.60f,0.60f, 0.30f,0.60f, + 0.30f,0.30f, 0.60f,0.30f, 0.60f,0.60f, + 0.60f,0.30f, 0.90f,0.60f, 0.60f,0.60f, + 0.60f,0.30f, 0.90f,0.30f, 0.90f,0.60f, + /* row2 */ + 0.00f,0.60f, 0.30f,0.90f, 0.00f,0.90f, + 0.00f,0.60f, 0.30f,0.60f, 0.30f,0.90f, + 0.30f,0.60f, 0.60f,0.90f, 0.30f,0.90f, + 0.30f,0.60f, 0.60f,0.60f, 0.60f,0.90f, + 0.60f,0.60f, 0.90f,0.90f, 0.60f,0.90f, + 0.60f,0.60f, 0.90f,0.60f, 0.90f,0.90f, + }; - 0.2f, 0.0f, 0.8f, 1.0f, 0.2f, 1.0f, - 0.2f, 0.0f, 0.8f, 0.0f, 0.8f, 1.0f }; + vg_function_push( (struct vg_cmd) + { + .name = "fb", + .function = render_framebuffer_control + }); glGenVertexArrays( 1, &gpipeline.fsquad.vao ); glGenBuffers( 1, &gpipeline.fsquad.vbo ); @@ -669,4 +705,131 @@ VG_STATIC void render_fsquad1(void) glDrawArrays( GL_TRIANGLES, 6, 6 ); } +/* + * Call this inside the UI function + */ +VG_STATIC void render_view_framebuffer_ui(void) +{ + int viewing_count = 0; + + glBindVertexArray( gpipeline.fsquad.vao ); + shader_blit_use(); + shader_blit_uTexMain( 0 ); + + for( int i=0; iattachments); j++ ) + { + struct framebuffer_attachment *at = &fb->attachments[j]; + + if( !at->debug_view ) + continue; + + v2f corner, + window = { vg.window_x, vg.window_y }; + + corner[0] = viewing_count % 3; + corner[1] = 1 + (viewing_count / 3); + v2_mul( corner, window, corner ); + v2_muls( corner, 0.3f, corner ); + corner[1] = vg.window_y - corner[1]; + + ui_text( (ui_rect){ corner[0], corner[1], 0.0f, 0.0f }, + fb->display_name, 2, k_text_align_left ); + ui_text( (ui_rect){ corner[0], corner[1] + 32, 0.0f, 0.0f, }, + at->display_name, 1, k_text_align_left ); + + if( at->purpose == k_framebuffer_attachment_type_renderbuffer ) + { + v2f center; + v2_muladds( corner, window, 0.15f, center ); + + ui_text( (ui_rect){ center[0], center[1], 0.0f, 0.0f }, + "", 1, k_text_align_center ); + } + else + { + render_fb_bind_texture( fb, j, 0 ); + + int start = (viewing_count+2) * 6, + count = 6; + glDrawArrays( GL_TRIANGLES, start, count ); + } + + viewing_count ++; + } + } +} + +VG_STATIC void render_framebuffer_show( struct framebuffer *fb, + struct framebuffer_attachment *at, + int operation ) +{ + at->debug_view = operation; + vg_info( "%s %s:%s\n", (operation?"shown": "hidden"), + fb->display_name, at->display_name ); +} + +/* + * arg0: command "show"/"hide" + * arg1: framebuffer name /"all" + * arg2: subname /none + */ +VG_STATIC int render_framebuffer_control( int argc, char const *argv[] ) +{ + if( argc < 2 ) + { + vg_error( "Usage: fb \"show/hide\" /\"all\" /none\n" ); + return 0; + } + + int modify_all = 0, + operation = 0; + + if( !strcmp( argv[0], "show" ) ) + operation = 1; + else if( !strcmp( argv[0], "hide" ) ) + operation = 0; + else + { + vg_error( "Unknown framebuffer operation: '%s'\n", argv[0] ); + return 0; + } + + if( !strcmp( argv[1], "all" ) ) + modify_all = 1; + + for( int i=0; iattachments); j++ ) + { + struct framebuffer_attachment *at = &fb->attachments[j]; + + if( at->purpose == k_framebuffer_attachment_type_none ) + continue; + + if( modify_all ) + { + render_framebuffer_show( fb, at, operation ); + } + else + { + if( !strcmp( fb->display_name, argv[1] ) ) + { + if( argc == 2 ) + render_framebuffer_show( fb, at, operation ); + else if( !strcmp( at->display_name, argv[2] ) ) + render_framebuffer_show( fb, at, operation ); + } + } + } + } + + return 0; +} + #endif /* RENDER_H */ diff --git a/shaders/blitblur.fs b/shaders/blitblur.fs index 3a7b1fc..65f4ea2 100644 --- a/shaders/blitblur.fs +++ b/shaders/blitblur.fs @@ -2,6 +2,7 @@ out vec4 FragColor; uniform sampler2D uTexMain; uniform sampler2D uTexMotion; uniform float uBlurStrength; +uniform vec2 uOverrideDir; in vec2 aUv; @@ -18,7 +19,7 @@ void main() vec2 vrand = rand_hash22( aUv ) * 2.0 - vec2(1.0); vec2 vrand1 = rand_hash22( vrand ) * 2.0 - vec2(1.0); - vec2 vdir = texture( uTexMotion, aUv ).xy * uBlurStrength; + vec2 vdir = texture( uTexMotion, aUv ).xy * uBlurStrength + uOverrideDir; vec4 vcolour0 = texture( uTexMain, aUv + vdir*vrand.x ); vec4 vcolour1 = texture( uTexMain, aUv + vdir*vrand.y ); diff --git a/shaders/blitblur.h b/shaders/blitblur.h index a662d41..fcea645 100644 --- a/shaders/blitblur.h +++ b/shaders/blitblur.h @@ -24,6 +24,7 @@ static struct vg_shader _shader_blitblur = { "uniform sampler2D uTexMain;\n" "uniform sampler2D uTexMotion;\n" "uniform float uBlurStrength;\n" +"uniform vec2 uOverrideDir;\n" "\n" "in vec2 aUv;\n" "\n" @@ -40,7 +41,7 @@ static struct vg_shader _shader_blitblur = { " vec2 vrand = rand_hash22( aUv ) * 2.0 - vec2(1.0);\n" " vec2 vrand1 = rand_hash22( vrand ) * 2.0 - vec2(1.0);\n" " \n" -" vec2 vdir = texture( uTexMotion, aUv ).xy * uBlurStrength;\n" +" vec2 vdir = texture( uTexMotion, aUv ).xy * uBlurStrength + uOverrideDir;\n" "\n" " vec4 vcolour0 = texture( uTexMain, aUv + vdir*vrand.x );\n" " vec4 vcolour1 = texture( uTexMain, aUv + vdir*vrand.y );\n" @@ -55,6 +56,7 @@ static struct vg_shader _shader_blitblur = { static GLuint _uniform_blitblur_uTexMain; static GLuint _uniform_blitblur_uTexMotion; static GLuint _uniform_blitblur_uBlurStrength; +static GLuint _uniform_blitblur_uOverrideDir; static void shader_blitblur_uTexMain(int i){ glUniform1i(_uniform_blitblur_uTexMain,i); } @@ -64,6 +66,9 @@ static void shader_blitblur_uTexMotion(int i){ static void shader_blitblur_uBlurStrength(float f){ glUniform1f(_uniform_blitblur_uBlurStrength,f); } +static void shader_blitblur_uOverrideDir(v2f v){ + glUniform2fv(_uniform_blitblur_uOverrideDir,1,v); +} static void shader_blitblur_register(void){ vg_shader_register( &_shader_blitblur ); } @@ -72,5 +77,6 @@ static void shader_blitblur_link(void){ _uniform_blitblur_uTexMain = glGetUniformLocation( _shader_blitblur.id, "uTexMain" ); _uniform_blitblur_uTexMotion = glGetUniformLocation( _shader_blitblur.id, "uTexMotion" ); _uniform_blitblur_uBlurStrength = glGetUniformLocation( _shader_blitblur.id, "uBlurStrength" ); + _uniform_blitblur_uOverrideDir = glGetUniformLocation( _shader_blitblur.id, "uOverrideDir" ); } #endif /* SHADER_blitblur_H */ diff --git a/skaterift.c b/skaterift.c index baa3b84..de702d7 100644 --- a/skaterift.c +++ b/skaterift.c @@ -96,7 +96,7 @@ VG_STATIC void vg_load(void) /* 'systems' are completely loaded now */ strcpy( world.world_name, "maps/mp_mtzero.mdl" ); - strcpy( world.world_name, "maps/mp_gridmap.mdl" ); + //strcpy( world.world_name, "maps/mp_gridmap.mdl" ); world_load(); vg_console_load_autos(); } @@ -163,6 +163,10 @@ VG_STATIC void present_view_with_post_processing(void) shader_blitblur_uTexMotion( 1 ); shader_blitblur_uBlurStrength( cl_blur_strength / (vg.frame_delta*60.0f) ); + v2f menu_blurring; + v2_muls( (v2f){ 0.04f, 0.001f }, menu_opacity, menu_blurring ); + shader_blitblur_uOverrideDir( menu_blurring ); + if( cl_view_id == 0 ) render_fb_bind_texture( gpipeline.fb_main, 0, 0 ); else if( cl_view_id == 1 ) @@ -174,6 +178,25 @@ VG_STATIC void present_view_with_post_processing(void) render_fsquad(); } +VG_STATIC void render_player_transparent(void) +{ + camera small_cam; + m4x3_copy( main_camera.transform, small_cam.transform ); + + small_cam.fov = main_camera.fov; + small_cam.nearz = 0.05f; + small_cam.farz = 60.0f; + + camera_update_view( &small_cam ); + camera_update_projection( &small_cam ); + camera_finalize( &small_cam ); + + /* Draw player to window buffer and blend background ontop */ + + glBindFramebuffer( GL_FRAMEBUFFER, 0 ); + draw_player( &small_cam ); +} + VG_STATIC void render_scene(void) { render_fb_bind( gpipeline.fb_main ); @@ -184,10 +207,20 @@ VG_STATIC void render_scene(void) glEnable( GL_DEPTH_TEST ); render_world( &main_camera ); + + int player_transparent = !(player.is_dead || freecam), + player_draw = !cl_menu; + + if( !player_transparent && player_draw ) + draw_player( &main_camera ); + render_water_texture( &main_camera ); render_fb_bind( gpipeline.fb_main ); render_water_surface( &main_camera ); render_world_gates( &main_camera ); + + if( player_transparent && player_draw ) + render_player_transparent(); } VG_STATIC void render_menu(void) @@ -196,31 +229,6 @@ VG_STATIC void render_menu(void) menu_render( &main_camera ); } -VG_STATIC void render_player_into_world(void) -{ - render_fb_bind( gpipeline.fb_main ); - draw_player( &main_camera ); -} - -VG_STATIC void render_player_transparent(void) -{ - camera small_cam; - m4x3_copy( main_camera.transform, small_cam.transform ); - - small_cam.fov = main_camera.fov; - small_cam.nearz = 0.05f; - small_cam.farz = 60.0f; - - camera_update_view( &small_cam ); - camera_update_projection( &small_cam ); - camera_finalize( &small_cam ); - - /* Draw player to window buffer and blend background ontop */ - - glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - draw_player( &small_cam ); -} - VG_STATIC void render_main_game(void) { static float fov = 60.0f; @@ -243,15 +251,6 @@ VG_STATIC void render_main_game(void) /* ========== Begin Frame ========== */ render_scene(); - - if( !cl_menu ) - { - if( player.is_dead | freecam ) - render_player_into_world(); - else - render_player_transparent(); - } - present_view_with_post_processing(); if( cl_menu ) @@ -331,6 +330,7 @@ VG_STATIC void vg_ui(void) //glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); audio_debug_soundscapes(); + render_view_framebuffer_ui(); } #if 0 diff --git a/world_water.h b/world_water.h index 6a53a05..cd4836a 100644 --- a/world_water.h +++ b/world_water.h @@ -52,6 +52,8 @@ VG_STATIC void render_water_texture( camera *cam ) float cam_height = cam->transform[3][1] - world.water.height; camera water_cam; + water_cam.farz = cam->farz; + water_cam.nearz = cam->nearz; v3_copy( cam->transform[3], water_cam.transform[3] ); water_cam.transform[3][1] -= 2.0f * cam_height; -- 2.25.1