framebuffer viewer
authorhgn <hgodden00@gmail.com>
Sat, 3 Dec 2022 12:49:54 +0000 (12:49 +0000)
committerhgn <hgodden00@gmail.com>
Sat, 3 Dec 2022 12:49:54 +0000 (12:49 +0000)
menu.h
player_physics.h
render.h
shaders/blitblur.fs
shaders/blitblur.h
skaterift.c
world_water.h

diff --git a/menu.h b/menu.h
index b8c5c8dbe2c5ed62bc0701f4c7a147e2c02bc408..d8dbd1a576a1d32cd12060c6209e5812cd704b60 100644 (file)
--- 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}
    },
index 6bfb559204e87f2923dabbf5c29271537f2c276e..997b69d1b657fa696eec2ab8fac0d0c286b43ad5 100644 (file)
@@ -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
index e3c7ee734b515c4bf0e01b31e341c36f56531272..374cc06a0343590958e271bb0dea9c6d3bd92ff2 100644 (file)
--- 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; i<vg_list_size(framebuffers); i++ )
+   {
+      struct framebuffer *fb = &framebuffers[i];
+
+      for( int j=0; j<vg_list_size(fb->attachments); 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 },
+                     "<hardware texture>", 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  <name>/"all"
+ * arg2: subname           <name>/none
+ */
+VG_STATIC int render_framebuffer_control( int argc, char const *argv[] )
+{
+   if( argc < 2 )
+   {
+      vg_error( "Usage: fb \"show/hide\" <name>/\"all\" <name>/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; i<vg_list_size(framebuffers); i++ )
+   {
+      struct framebuffer *fb = &framebuffers[i];
+      
+      for( int j=0; j<vg_list_size(fb->attachments); 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 */
index 3a7b1fcd5daf36efb4684188841b45f001f25548..65f4ea24706b996c49c64090577b98a88813ccbd 100644 (file)
@@ -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 );
index a662d41834adec96e8568b4fbd7c919dd67d80cc..fcea6452f9c195aac35c671f2325ff1b4401d3b9 100644 (file)
@@ -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 */
index baa3b84c01a7887453807dead178322a2ba6281c..de702d78b974a5c52a95b75be745b5e5d48dc0d8 100644 (file)
@@ -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
index 6a53a05f39a2de1e3ed5fbb6cca4e115b27f18e1..cd4836a44cfefcdd550dc33aca5a687193745345 100644 (file)
@@ -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;