finalize shaders and replay
authorhgn <hgodden00@gmail.com>
Tue, 11 Jul 2023 22:08:54 +0000 (23:08 +0100)
committerhgn <hgodden00@gmail.com>
Tue, 11 Jul 2023 22:08:54 +0000 (23:08 +0100)
player_replay.c
player_skate.c
player_skate.h
shaders/blitblur.fs
shaders/blitblur.h
skaterift.c
workshop.c

index ed0c6444b51fc0a684cf5f2e7e9442acf8ca5ea6..21d92bc2f6f090d99765aa5ad75850eac6823f58 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "player_replay.h"
 #include "input.h"
+#include "gui.h"
 
 VG_STATIC void replay_clear( replay_buffer *replay ){
    replay->head = NULL;
@@ -496,7 +497,7 @@ VG_STATIC void skaterift_replay_imgui(void){
    /* mainbar */
    ui_px height = 32,
          cwidth = 2;
-   ui_rect bar = { 0, vg.window_y - height, vg.window_x, height };
+   ui_rect bar = { 0, 0, vg.window_x, height };
    ui_fill( bar, ui_colour( k_ui_bg ) );
 
    /* cursor frame block */
@@ -504,21 +505,21 @@ VG_STATIC void skaterift_replay_imgui(void){
       if( replay->cursor_frame->r ){
          f64 l = (replay->cursor_frame->r->time-replay->cursor_frame->time)/len,
              s = (replay->cursor_frame->time - start) / len;
-         ui_rect box = { s*(f64)vg.window_x, bar[1]-2
+         ui_rect box = { s*(f64)vg.window_x, 0
                          VG_MAX(4,(ui_px)(l*vg.window_x)), bar[3]+2 };
          ui_fill( box, ui_colour( k_ui_bg+4 ) );
       }
    }
 
    /* cursor */
-   ui_rect cusor = { cur * (f64)vg.window_x - (cwidth/2), bar[1]
+   ui_rect cusor = { cur * (f64)vg.window_x - (cwidth/2), 0
                      cwidth, bar[3] };
    ui_fill( cusor, ui_colour( k_ui_bg+7 ) );
 
    /* latest state marker */
    if( replay->statehead ){
       f64 t = (replay->statehead->time - start) / len;
-      ui_rect tag = { t*(f64)vg.window_x, bar[1]-8, 2, bar[3]+8 };
+      ui_rect tag = { t*(f64)vg.window_x, 0, 2, bar[3]+8 };
       ui_fill( tag, ui_colour( k_ui_green+k_ui_brighter ) );
    }
 
@@ -526,7 +527,7 @@ VG_STATIC void skaterift_replay_imgui(void){
    replay_frame *prev = replay_find_recent_stateframe( replay );
    if( prev ){
       f64 t = (prev->time - start) / len;
-      ui_rect tag = { t*(f64)vg.window_x, bar[1]-8, 2, bar[3]+8 };
+      ui_rect tag = { t*(f64)vg.window_x, 0, 2, bar[3]+8 };
       ui_fill( tag, ui_colour( k_ui_yellow+k_ui_brighter ) );
    }
 
@@ -539,11 +540,20 @@ VG_STATIC void skaterift_replay_imgui(void){
    ui_text( bar, buffer, 1, k_ui_align_middle_left, 0 );
    ui_text( bar, "0s", 1, k_ui_align_middle_right, 0 );
 
-   ui_rect info = { 0, vg.window_y-bar[3]-64, 128, 64 };
-   if( vg_input.display_input_method == k_input_method_controller )
-      ui_text( info, "scrub: <- LS ->\nresume:LB\nplay: A", 1,0,0 );
-   else
-      ui_text( info, "scrub: <- ->\nresume:R\nplay: space", 1,0,0 );
+#if 0
+   char buf[256];
+   snprintf( buf, 256, "scrub: %s\nresume: %s\nplay: %s\n", 
+               axis_display_string( k_sraxis_replay_h ),
+               button_display_string( k_srbind_replay_resume ),
+               button_display_string( k_srbind_replay_play ) );
+
+   ui_rect info = { 0, vg.window_y-bar[3]-128, 256, 128 };
+   ui_text( info, buf, 2,0,0 );
+#endif
+
+   gui_helper_action( axis_display_string(k_sraxis_replay_h), "scrub" );
+   gui_helper_action( button_display_string(k_srbind_replay_resume), "resume" );
+   gui_helper_action( button_display_string(k_srbind_replay_play), "play" );
 }
 
 #endif /* PLAYER_REPLAY_C */
index 1ef19a1b6af6d67bdbddc6ebcc634f118d683803..49cd6e76e76ccd2951e4a5f4d638f3e1b4ce12a2 100644 (file)
@@ -657,9 +657,9 @@ invalidated_grind:;
    }
 
    if( best ){
-      v3_copy( best->n, s->land_normal );
+      v3_copy( best->n, s->state.land_normal );
       v3_copy( best->v, player->rb.v );
-      s->land_dist = best->land_dist;
+      s->state.land_dist = best->land_dist;
 
       s->state.gravity_bias = best->gravity;
 
@@ -671,8 +671,8 @@ invalidated_grind:;
       joystick_state( k_srjoystick_steer, steer );
       v2_normalize_clamp( steer );
 
-      if( (fabsf(steer[1]) > 0.5f) && (s->land_dist >= 1.5f) ){
-         s->state.flip_rate = (1.0f/s->land_dist) * vg_signf(steer[1]) *
+      if( (fabsf(steer[1]) > 0.5f) && (s->state.land_dist >= 1.5f) ){
+         s->state.flip_rate = (1.0f/s->state.land_dist) * vg_signf(steer[1]) *
                                  s->state.reverse ;
          s->state.flip_time = 0.0f;
          v3_copy( player->rb.to_world[0], s->state.flip_axis );
@@ -683,7 +683,7 @@ invalidated_grind:;
       }
    }
    else{
-      v3_copy( player->basis[1], s->land_normal );
+      v3_copy( player->basis[1], s->state.land_normal );
    }
 }
 
@@ -703,10 +703,10 @@ VG_STATIC void skate_apply_air_model( player_instance *player )
    if( s->state.activity_prev > k_skate_activity_air_to_grind )
       player__approximate_best_trajectory( player );
 
-   float angle = v3_dot( player->rb.to_world[1], s->land_normal );
+   float angle = v3_dot( player->rb.to_world[1], s->state.land_normal );
    angle = vg_clampf( angle, -1.0f, 1.0f );
    v3f axis; 
-   v3_cross( player->rb.to_world[1], s->land_normal, axis );
+   v3_cross( player->rb.to_world[1], s->state.land_normal, axis );
 
    v4f correction;
    q_axis_angle( correction, axis, 
@@ -3152,7 +3152,7 @@ VG_STATIC void player__skate_animate( player_instance *player,
       t  = sign * (1.0f-t*t);
 
       float angle = vg_clampf( t, -1.0f, 1.0f ) * VG_TAUf,
-            distm = s->land_dist * fabsf(s->state.flip_rate) * 3.0f,
+            distm = s->state.land_dist * fabsf(s->state.flip_rate) * 3.0f,
             blend = vg_clampf( 1.0f-distm, 0.0f, 1.0f );
 
       angle = vg_lerpf( angle, vg_signf(s->state.flip_rate) * VG_TAUf, blend );
index eca4582b5943ebb4c9d960822734b24ed1ad1e0b..b09c68a79334ee64c897328178424c4003405123 100644 (file)
@@ -73,6 +73,9 @@ struct player_skate{
 
       v4f smoothed_rotation;
 
+      float land_dist;
+      v3f land_normal;
+
       /* animator controls which require persistence */
       v3f board_trick_residualv,
           board_trick_residuald;
@@ -152,9 +155,6 @@ struct player_skate{
    possible_jumps[36];
    u32 possible_jump_count;
 
-   float land_dist;
-   v3f land_normal;
-
    v3f surface_picture,
        weight_distribution,
        grind_vec,
index 1d3bdfa656882360273daa25a393ade631516a90..7f08b4f4265f5f344d1265c6a75449e8f1abd22a 100644 (file)
@@ -5,6 +5,7 @@ uniform float uBlurStrength;
 uniform vec2 uOverrideDir;
 uniform float uTime;
 uniform float uGlitchStrength;
+uniform vec2 uClampUv;
 
 in vec2 aUv;
 
@@ -36,10 +37,10 @@ void main(){
    
    vec2 vdir = texture( uTexMotion, vuv ).xy * uBlurStrength + uOverrideDir;
 
-   vec4 vcolour0 = texture( uTexMain, vuv + vdir*vrand.x );
-   vec4 vcolour1 = texture( uTexMain, vuv + vdir*vrand.y );
-   vec4 vcolour2 = texture( uTexMain, vuv + vdir*vrand1.x );
-   vec4 vcolour3 = texture( uTexMain, vuv + vdir*vrand1.y );
+   vec4 vcolour0 = texture( uTexMain, min(vuv + vdir*vrand.x,uClampUv) );
+   vec4 vcolour1 = texture( uTexMain, min(vuv + vdir*vrand.y,uClampUv) );
+   vec4 vcolour2 = texture( uTexMain, min(vuv + vdir*vrand1.x,uClampUv) );
+   vec4 vcolour3 = texture( uTexMain, min(vuv + vdir*vrand1.y,uClampUv) );
 
    FragColor = ( vcolour0 + vcolour1 + vcolour2 + vcolour3 ) * 0.25;
 }
index 5de8e0a63544bdba324545f468d0d0710ff5f768..7d95dcce30edfd0bdb283381a69631b6fb701dec 100644 (file)
@@ -31,6 +31,7 @@ static struct vg_shader _shader_blitblur = {
 "uniform vec2 uOverrideDir;\n"
 "uniform float uTime;\n"
 "uniform float uGlitchStrength;\n"
+"uniform vec2 uClampUv;\n"
 "\n"
 "in vec2 aUv;\n"
 "\n"
@@ -62,10 +63,10 @@ static struct vg_shader _shader_blitblur = {
 "   \n"
 "   vec2 vdir = texture( uTexMotion, vuv ).xy * uBlurStrength + uOverrideDir;\n"
 "\n"
-"   vec4 vcolour0 = texture( uTexMain, vuv + vdir*vrand.x );\n"
-"   vec4 vcolour1 = texture( uTexMain, vuv + vdir*vrand.y );\n"
-"   vec4 vcolour2 = texture( uTexMain, vuv + vdir*vrand1.x );\n"
-"   vec4 vcolour3 = texture( uTexMain, vuv + vdir*vrand1.y );\n"
+"   vec4 vcolour0 = texture( uTexMain, min(vuv + vdir*vrand.x,uClampUv) );\n"
+"   vec4 vcolour1 = texture( uTexMain, min(vuv + vdir*vrand.y,uClampUv) );\n"
+"   vec4 vcolour2 = texture( uTexMain, min(vuv + vdir*vrand1.x,uClampUv) );\n"
+"   vec4 vcolour3 = texture( uTexMain, min(vuv + vdir*vrand1.y,uClampUv) );\n"
 "\n"
 "   FragColor = ( vcolour0 + vcolour1 + vcolour2 + vcolour3 ) * 0.25;\n"
 "}\n"
@@ -79,6 +80,7 @@ static GLuint _uniform_blitblur_uBlurStrength;
 static GLuint _uniform_blitblur_uOverrideDir;
 static GLuint _uniform_blitblur_uTime;
 static GLuint _uniform_blitblur_uGlitchStrength;
+static GLuint _uniform_blitblur_uClampUv;
 static void shader_blitblur_uInverseRatio(v2f v){
    glUniform2fv(_uniform_blitblur_uInverseRatio,1,v);
 }
@@ -100,6 +102,9 @@ static void shader_blitblur_uTime(float f){
 static void shader_blitblur_uGlitchStrength(float f){
    glUniform1f(_uniform_blitblur_uGlitchStrength,f);
 }
+static void shader_blitblur_uClampUv(v2f v){
+   glUniform2fv(_uniform_blitblur_uClampUv,1,v);
+}
 static void shader_blitblur_register(void){
    vg_shader_register( &_shader_blitblur );
 }
@@ -112,5 +117,6 @@ static void shader_blitblur_link(void){
    _uniform_blitblur_uOverrideDir = glGetUniformLocation( _shader_blitblur.id, "uOverrideDir" );
    _uniform_blitblur_uTime = glGetUniformLocation( _shader_blitblur.id, "uTime" );
    _uniform_blitblur_uGlitchStrength = glGetUniformLocation( _shader_blitblur.id, "uGlitchStrength" );
+   _uniform_blitblur_uClampUv = glGetUniformLocation( _shader_blitblur.id, "uClampUv" );
 }
 #endif /* SHADER_blitblur_H */
index a6d8d8dca038dd457b834b760ede7852d77a4b5d..beb4fa315a78881d4996284bc39bafddec8a2936 100644 (file)
@@ -358,6 +358,10 @@ VG_STATIC void present_view_with_post_processing(void){
                                      (vg.time_frame_delta*60.0) );
       shader_blitblur_uInverseRatio( inverse );
 
+      inverse[0] -= 0.0001f;
+      inverse[1] -= 0.0001f;
+      shader_blitblur_uClampUv( inverse );
+
       static f64 effect_time = 133.0;
       effect_time += vg.time_frame_delta;
       shader_blitblur_uTime( effect_time );
index 1efc4287ffac47a746dcf3d3a0e7f0a190e56659..5f02caa4023b0e17c09bbce4f9c0384af2e41c85 100644 (file)
@@ -1285,7 +1285,7 @@ VG_STATIC void workshop_form_gui_edit_page( ui_rect content ){
    ui_split( inner, k_ui_axis_v, inner[2]-btn_width, 0, label, btn_right);
    ui_rect_pad( btn_right, (ui_px[2]){2,2} );
 
-   if( ui_button_text( btn_right, "\x91", 2 ) ){
+   if( ui_button_text( btn_right, "\xbf", 2 ) ){
       ISteamFriends *hSteamFriends = SteamAPI_SteamFriends();
       SteamAPI_ISteamFriends_ActivateGameOverlayToWebPage( hSteamFriends,
             "https://steamcommunity.com/sharedfiles/workshoplegalagreement",