struct replay_globals player_replay =
{
.active_keyframe = -1,
- .show_ui = 1,
- .editor_mode = 0
};
void replay_clear( replay_buffer *replay )
player_replay.resume_begin = player_replay.local.cursor;
player_replay.resume_transition = 0.0f;
}
-
- gui_helper_reset( k_gui_helper_mode_clear );
}
-static void skaterift_replay_update_helpers(void);
-
void skaterift_replay_pre_update(void)
{
- if( skaterift.activity != k_skaterift_replay ) return;
+ if( skaterift.activity != k_skaterift_replay )
+ return;
- bool input = player_replay.editor_mode^0x1;
+ bool input = 1;
if( player_replay.replay_control == k_replay_control_resume )
{
}
else
{
- vg_slewf( &player_replay.resume_transition, 1.0f,
- vg.time_frame_delta * (1.0f/1.0f) );
+ vg_slewf( &player_replay.resume_transition, 1.0f, vg.time_frame_delta * (1.0f/1.0f) );
if( player_replay.resume_transition >= 1.0f )
skaterift_restore_frame( player_replay.resume_target );
}
else
{
- if( input && button_down( k_srbind_replay_play ) )
- player_replay.replay_control = k_replay_control_play;
- if( input && button_down( k_srbind_replay_freecam ) )
+ if( button_down( k_srbind_replay_play ) )
+ player_replay.replay_control ^= k_replay_control_play;
+
+ if( button_down( k_srbind_replay_freecam ) )
{
player_replay.use_freecam ^= 0x1;
if( player_replay.use_freecam )
{
- replay_get_camera( &player_replay.local,
- &player_replay.replay_freecam );
+ replay_get_camera( &player_replay.local, &player_replay.replay_freecam );
}
- skaterift_replay_update_helpers();
}
- f32 target_speed = 0.0f;
- if( input )
- target_speed = axis_state( k_sraxis_replay_h ) * 5.0;
+ if( button_down( k_srbind_replay_hide_ui ) )
+ player_replay.hide_ui = 1;
- if( input && button_press( k_srbind_reset ) )
- target_speed += -2.0;
+ f32 target_speed = axis_state( k_sraxis_replay_h ) * 5.0;
if( fabsf(target_speed) > 0.01f )
player_replay.replay_control = k_replay_control_scrub;
if( player_replay.replay_control == k_replay_control_play )
target_speed = 1.0;
- vg_slewf( &player_replay.track_velocity, target_speed,
- 18.0f*vg.time_frame_delta );
+ vg_slewf( &player_replay.track_velocity, target_speed, 18.0f*vg.time_frame_delta );
if( fabsf( player_replay.track_velocity ) > 0.0001f )
{
player_replay.track_velocity = 0.0f;
}
- if( input && button_down( k_srbind_mback ) )
+ if( button_down( k_srbind_mback ) )
{
- if( player_replay.local.statehead )
- skaterift_restore_frame( player_replay.local.statehead );
+ if( player_replay.hide_ui )
+ {
+ player_replay.hide_ui = 0;
+ }
else
- skaterift.activity = k_skaterift_default;
+ {
+ if( player_replay.local.statehead )
+ skaterift_restore_frame( player_replay.local.statehead );
+ else
+ skaterift.activity = k_skaterift_default;
+ }
srinput.state = k_input_state_resume;
- gui_helper_reset( k_gui_helper_mode_clear );
}
- if( input )
+ if( player_replay.use_freecam )
{
- if( player_replay.use_freecam )
- {
- freecam_preupdate();
- }
- else
+ freecam_preupdate();
+ }
+ else
+ {
+ if( skaterift.allow_replay_resume )
{
if( button_down( k_srbind_replay_resume ) )
{
}
}
-static void skaterift_replay_update_helpers(void)
-{
- player_replay.helper_resume->greyed = player_replay.use_freecam;
-
- vg_str freecam_text;
- vg_strnull( &freecam_text, player_replay.helper_freecam->text,
- GUI_HELPER_TEXT_LENGTH );
- vg_strcat( &freecam_text,
- player_replay.use_freecam? "Exit freecam": "Freecam" );
-}
-
-static void replay_show_helpers(void)
+void skaterift_open_replay(void)
{
- gui_helper_reset( k_gui_helper_mode_default );
- vg_str text;
-
- if( gui_new_helper( input_axis_list[k_sraxis_replay_h], &text ) )
- vg_strcat( &text, "Scrub" );
-
- if( (player_replay.helper_resume = gui_new_helper(
- input_button_list[k_srbind_replay_resume], &text )) )
- vg_strcat( &text, "Resume" );
-
- if( gui_new_helper( input_button_list[k_srbind_replay_play], &text ))
- vg_strcat( &text, "Playback" );
-
- player_replay.helper_freecam = gui_new_helper(
- input_button_list[k_srbind_replay_freecam], &text );
-
- skaterift_replay_update_helpers();
-}
-
-void skaterift_replay_post_render(void)
-{
-#ifndef SR_ALLOW_REWIND_HUB
- if( _world.active_instance != k_world_purpose_client )
- return;
-#endif
-
- if( (_world.event == k_world_event_challenge) && (_world.challenge_state >= k_challenge_state_running) )
- {
- if( button_press( k_srbind_reset ) )
- {
- player_replay.reset_timer += vg.time_delta;
-
- if( player_replay.reset_timer > 1.0f )
- {
- srinput.state = k_input_state_resume;
- _restart_active_challenge();
- player_replay.reset_timer = 0.0f;
- gui_helper_reset( k_gui_helper_mode_clear );
- }
- }
- else
- {
- player_replay.reset_timer = 0.0f;
- }
- }
- else
+ skaterift.activity = k_skaterift_replay;
+ skaterift_record_frame( &player_replay.local, 1 );
+ if( player_replay.local.head )
{
- /* capture the current resume frame at the very last point */
- if( button_down( k_srbind_reset ) )
- {
- if( _world.main.info.flags & k_world_flag_no_rewind )
- {
- gui_location_print_ccmd( 1, (const char *[]){ KRED "Rewind is not allowed here.." } );
- }
- else
- {
- if( skaterift.activity == k_skaterift_default )
- {
- localplayer.rewinded_since_last_gate = 1;
- skaterift.activity = k_skaterift_replay;
- skaterift_record_frame( &player_replay.local, 1 );
- if( player_replay.local.head )
- {
- player_replay.local.cursor = player_replay.local.head->time;
- player_replay.local.cursor_frame = player_replay.local.head;
- }
- player_replay.replay_control = k_replay_control_scrub;
- replay_show_helpers();
- }
- }
- }
+ player_replay.local.cursor = player_replay.local.head->time;
+ player_replay.local.cursor_frame = player_replay.local.head;
}
+ player_replay.replay_control = k_replay_control_scrub;
+ player_replay.hide_ui = 0;
+ gui_helper_reset( k_gui_helper_mode_clear );
}
void skaterift_replay_init(void)
void skaterift_replay_imgui( ui_context *ctx )
{
- if( (_world.event == k_world_event_challenge) && (_world.challenge_state >= k_challenge_state_running) )
- {
- if( player_replay.reset_timer > 0.0f )
- {
- ui_rect box = { vg.window_x/2 - 200, vg.window_y - 200, 400, 100 };
- ui_fill( ctx, box, ui_opacity( GUI_COL_DARK, 0.35f ) );
- ui_outline( ctx, box, 1, GUI_COL_NORM, 0 );
-
- ctx->font = &vgf_default_title;
- ui_rect title = { box[0], box[1] + 16, box[2], box[3]-16 };
- ui_text( ctx, box, "Retry?", 1, k_ui_align_center, 0 );
-
- ui_rect bar = { box[0] + 8, (box[1] + box[3]) - (24+8), box[2] - 16, 24 };
- ui_fill( ctx, bar, ui_opacity( GUI_COL_DARK, 0.8f ) );
-
- ui_rect inner = { bar[0]+1, bar[1]+1, (f32)(bar[2]-2)*player_replay.reset_timer, bar[3]-2 };
- ui_fill( ctx, inner, ui_colour( ctx, k_ui_yellow ) );
-
- ctx->font = &vgf_default_small;
- }
- }
-
- if( skaterift.activity != k_skaterift_replay ) return;
-
- /* extra keys for entering editor */
- static u8 f1_key = 0;
- u8 f1_now = vg_getkey(SDLK_F1);
- if( f1_now && !f1_key && player_replay.show_ui )
- {
- player_replay.editor_mode ^= 0x1;
-
- if( player_replay.editor_mode )
- gui_helper_reset( k_gui_helper_mode_clear );
- else
- replay_show_helpers();
- }
- f1_key = f1_now;
-
- static u8 f2_key = 0;
- u8 f2_now = vg_getkey(SDLK_F2);
- if( f2_now && !f2_key )
- {
- player_replay.show_ui ^= 0x1;
- }
- f2_key = f2_now;
-
- if( player_replay.editor_mode )
- {
- static u8 space_key = 0;
- u8 space_now = vg_getkey(SDLK_SPACE);
- if( space_now & !space_key )
- {
- player_replay.replay_control ^= k_replay_control_play;
- }
- space_key = space_now;
- }
+ if( skaterift.activity != k_skaterift_replay )
+ return;
- if( !player_replay.show_ui ) return;
+ if( player_replay.hide_ui )
+ return;
- if( player_replay.editor_mode )
+ if( vg_input.display_input_method != k_input_method_controller )
{
- u32 colour = ui_opacity( ui_colour(ctx,k_ui_fg), 0.3333f );
- ui_rect cx = { vg.window_x/2, 0, 1, vg.window_y },
- cy = { 0, vg.window_y/2, vg.window_x, 1 };
- ui_fill( ctx, cx, colour );
- ui_fill( ctx, cy, colour );
+ ui_capture_mouse( ctx, 1 );
}
replay_buffer *replay = &player_replay.local;
char buffer[ 128 ];
/* mainbar */
- ui_px height = 32,
- cwidth = 2;
- ui_rect timeline = { 0, 0, vg.window_x, height };
+ ui_rect timeline = { 8, vg.window_y-(32+8), vg.window_x-16, 32 };
+ ui_rect start_box;
+ ui_split( timeline, k_ui_axis_v, 32, 8, start_box, timeline );
+
+ const char *start_text = (player_replay.replay_control == k_replay_control_play)? "||": ">";
+ if( menu_button_rect( ctx, start_box, 0, 1, start_text ) )
+ {
+ player_replay.replay_control ^= k_replay_control_play;
+ }
+
ui_fill( ctx, timeline, ui_colour( ctx, k_ui_bg ) );
/* cursor frame block */
{
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, 0,
- VG_MAX(4,(ui_px)(l*vg.window_x)), timeline[3]+2 };
+ ui_rect box = { timeline[0] + s*(f64)timeline[2], timeline[1],
+ VG_MAX(4,(ui_px)(l*timeline[2])), timeline[3]+2 };
ui_fill( ctx, box, ui_colour( ctx, k_ui_bg+4 ) );
}
}
/* cursor */
- ui_rect cusor = { cur * (f64)vg.window_x - (cwidth/2), 0,
- cwidth, (player_replay.editor_mode? 0: 16) + timeline[3] };
+ ui_rect cusor = { timeline[0] + cur*(f64)timeline[2] - 1, timeline[1],
+ 2, timeline[3] };
ui_fill( ctx, cusor, ui_colour( ctx, k_ui_bg+7 ) );
/* latest state marker */
- if( replay->statehead )
+ if( skaterift.allow_replay_resume )
{
- f64 t = (replay->statehead->time - start) / len;
- ui_rect tag = { t*(f64)vg.window_x, 0, 2, timeline[3]+8 };
- ui_fill( ctx, tag, ui_colour( ctx, k_ui_green+k_ui_brighter ) );
- }
+ if( replay->statehead )
+ {
+ f64 t = (replay->statehead->time - start) / len;
+ ui_rect tag = { timeline[0] + t*(f64)timeline[2], timeline[1],
+ 2, timeline[3]+8 };
+ ui_fill( ctx, tag, ui_colour( ctx, k_ui_green+k_ui_brighter ) );
+ }
- /* previous state marker */
- replay_frame *prev = replay_find_recent_stateframe( replay );
- if( prev )
- {
- f64 t = (prev->time - start) / len;
- ui_rect tag = { t*(f64)vg.window_x, 0, 2, timeline[3]+8 };
- ui_fill( ctx, tag, ui_colour( ctx, k_ui_yellow+k_ui_brighter ) );
+ /* previous state marker */
+ replay_frame *prev = replay_find_recent_stateframe( replay );
+ if( prev )
+ {
+ f64 t = (prev->time - start) / len;
+ ui_rect tag = { timeline[0] + t*(f64)timeline[2], timeline[1],
+ 2, timeline[3]+8 };
+ ui_fill( ctx, tag, ui_colour( ctx, k_ui_yellow+k_ui_brighter ) );
+ }
}
- snprintf( buffer, 128, "-%.2fs (F1: Edit replay)", (end-replay->cursor) );
+ snprintf( buffer, 128, "-%.2fs", (end-replay->cursor) );
ui_text( ctx, timeline, buffer, 1, k_ui_align_middle_left, 0 );
ui_text( ctx, timeline, "0s", 1, k_ui_align_middle_right, 0 );
- if( !player_replay.editor_mode ) return;
- ui_capture_mouse( ctx, 1 );
- ui_rect panel = { 0, timeline[3] + 20, 200, 400 };
- ui_fill( ctx, panel, ui_opacity( ui_colour( ctx, k_ui_bg ), 0.5f ) );
- ui_rect_pad( panel, (ui_px[2]){4,4} );
+ /* helpers */
+ ctx->font = &vgf_default_large;
+
+ ui_rect helper_list_l = { 10, timeline[1] - (ctx->font->sy+8), vg.window_x/2, ctx->font->sy };
+ char buf[256];
+ vg_str str;
+ vg_strnull( &str, buf, sizeof(buf) );
+ vg_input_string( &str, input_axis_list[k_sraxis_replay_h], 1 );
+ vg_strcat( &str, "\x07 Scrub" );
+ ui_text( ctx, helper_list_l, buf, 1, k_ui_align_left, 0 );
+ helper_list_l[1] -= helper_list_l[3]+2;
+
+ vg_strnull( &str, buf, sizeof(buf) );
+ vg_input_string( &str, input_button_list[k_srbind_replay_play], 1 );
+ vg_strcat( &str, (player_replay.replay_control == k_replay_control_play)? "\x07 Pause": "\x07 Play" );
+ ui_text( ctx, helper_list_l, buf, 1, k_ui_align_left, 0 );
+ helper_list_l[1] -= helper_list_l[3]+2;
+
+ vg_strnull( &str, buf, sizeof(buf) );
+ vg_input_string( &str, input_button_list[k_srbind_replay_freecam], 1 );
+ vg_strcat( &str, "\x07 Freecam" );
+ ui_text( ctx, helper_list_l, buf, 1, k_ui_align_left, 0 );
+ helper_list_l[1] -= helper_list_l[3]+2;
+
+ vg_strnull( &str, buf, sizeof(buf) );
+ vg_input_string( &str, input_button_list[k_srbind_replay_hide_ui], 1 );
+ vg_strcat( &str, "\x07 Hide UI" );
+ ui_text( ctx, helper_list_l, buf, 1, k_ui_align_left, 0 );
+ helper_list_l[1] -= helper_list_l[3]+2;
+
+ ui_rect helper_list_r = { vg.window_x/2, timeline[1] - (ctx->font->sy+8), vg.window_x/2-10, ctx->font->sy };
+ vg_strnull( &str, buf, sizeof(buf) );
+ vg_input_string( &str, input_button_list[k_srbind_mback], 1 );
+ vg_strcat( &str, "\x07 Exit Replay" );
+ ui_text( ctx, helper_list_r, buf, 1, k_ui_align_right, 0 );
+ helper_list_l[1] -= helper_list_r[3]+2;
+
+ if( player_replay.use_freecam )
+ {
+ ui_rect box = { vg.window_x/2 - 200, 40, 400, ctx->font->sy };
+ ui_text( ctx, box, KYEL "\x06\x02--- Freecam Enabled ---", 1, k_ui_align_center, 0 );
+ }
+
+ ctx->font = &vgf_default_small;
+
+ /* timeline scrub */
+ bool start_in_timeline =
+ ui_clicking(ctx, UI_MOUSE_LEFT) &&
+ ui_inside_rect(timeline, ctx->mouse_click);
- if( ui_button( ctx, panel,
- (player_replay.replay_control == k_replay_control_play)?
- "Pause (space)": "Play (space)" ) == k_ui_button_click )
+ if( (ui_inside_rect( timeline, ctx->mouse )) || start_in_timeline )
{
- player_replay.replay_control ^= k_replay_control_play;
+ ui_rect cursor = { ctx->mouse[0], timeline[1], 4, timeline[3] };
+ ui_fill( ctx, cursor, ui_colour( ctx, k_ui_fg ) );
+ ctx->cursor = k_ui_cursor_ibeam;
+
+ if( ui_clicking( ctx, UI_MOUSE_LEFT ) && start_in_timeline )
+ {
+ f64 mouse_t = start + ((f64)(ctx->mouse[0]-timeline[0]) / (f64)timeline[2])*len;
+ replay_seek( &player_replay.local, mouse_t );
+ player_replay.active_keyframe = -1;
+ }
}
+
+ /* This contains the UI for the old removed keyframe editor --------------------------------------- */
+#if 0
/* script bar */
- ui_rect script = { 0, height + 2, vg.window_x, 16 };
+ ui_rect script = { timeline[0], timeline[1]+timeline[3] + 2, timeline[2], 16 };
ui_fill( ctx, script, ui_colour( ctx, k_ui_bg ) );
- f64 mouse_t = start + ((f64)ctx->mouse[0] / (f64)vg.window_x)*len;
/* keyframe draw and select */
bool absorb_by_keyframe = 0;
replay_keyframe *kf = &player_replay.keyframes[i];
f64 t = (kf->time-start)/len;
- ui_px x = t*(f64)vg.window_x-8;
+ ui_px x = timeline[0] + t*(f64)timeline[2]-8;
/* draw connections between keyframes */
if( i )
}
}
}
+#endif
- /* timeline scrub */
- bool start_in_timeline =
- ui_clicking(ctx, UI_MOUSE_LEFT) &&
- ui_inside_rect(timeline, ctx->mouse_click);
- if( (ui_inside_rect( timeline, ctx->mouse )) || start_in_timeline )
- {
- ui_rect cursor = { ctx->mouse[0], timeline[1], 4, timeline[3] };
- ui_fill( ctx, cursor, ui_colour( ctx, k_ui_fg ) );
- ctx->cursor = k_ui_cursor_ibeam;
-
- if( ui_clicking( ctx, UI_MOUSE_LEFT ) && start_in_timeline )
- {
- replay_seek( &player_replay.local, mouse_t );
- player_replay.active_keyframe = -1;
- }
- }
-
+#if 0
if( ui_button( ctx, panel, "Clear keyframes" ) == k_ui_button_click )
{
player_replay.keyframe_count = 0;
if( (ui_button( ctx, panel, "Hide UI (F2)" ) == k_ui_button_click) )
{
- player_replay.show_ui ^= 0x1;
+ player_replay.hide_ui = 1;
}
if( player_replay.active_keyframe != -1 )
_world.main.time = new_time;
ui_info( ctx, panel, "" );
- if( ui_button( ctx, panel, "Exit editor (F1)" ) == k_ui_button_click )
- {
- player_replay.editor_mode = 0;
- replay_show_helpers();
- }
-
- /* TODO: Add Q/E scrub here too.
- * Add replay trimming
- */
+#endif
}