From a528498841a151efbd38cddcc9f09a5f39dbbd19 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 11 Jul 2023 23:08:54 +0100 Subject: [PATCH] finalize shaders and replay --- player_replay.c | 30 ++++++++++++++++++++---------- player_skate.c | 16 ++++++++-------- player_skate.h | 6 +++--- shaders/blitblur.fs | 9 +++++---- shaders/blitblur.h | 14 ++++++++++---- skaterift.c | 4 ++++ workshop.c | 2 +- 7 files changed, 51 insertions(+), 30 deletions(-) diff --git a/player_replay.c b/player_replay.c index ed0c644..21d92bc 100644 --- a/player_replay.c +++ b/player_replay.c @@ -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 */ diff --git a/player_skate.c b/player_skate.c index 1ef19a1..49cd6e7 100644 --- a/player_skate.c +++ b/player_skate.c @@ -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 ); diff --git a/player_skate.h b/player_skate.h index eca4582..b09c68a 100644 --- a/player_skate.h +++ b/player_skate.h @@ -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, diff --git a/shaders/blitblur.fs b/shaders/blitblur.fs index 1d3bdfa..7f08b4f 100644 --- a/shaders/blitblur.fs +++ b/shaders/blitblur.fs @@ -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; } diff --git a/shaders/blitblur.h b/shaders/blitblur.h index 5de8e0a..7d95dcc 100644 --- a/shaders/blitblur.h +++ b/shaders/blitblur.h @@ -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 */ diff --git a/skaterift.c b/skaterift.c index a6d8d8d..beb4fa3 100644 --- a/skaterift.c +++ b/skaterift.c @@ -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 ); diff --git a/workshop.c b/workshop.c index 1efc428..5f02caa 100644 --- a/workshop.c +++ b/workshop.c @@ -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", -- 2.25.1