replay->cursor_frame = NULL;
replay->statehead = NULL;
replay->cursor = -99999.9;
- replay->control = k_replay_control_none;
}
replay_gamestate *replay_frame_gamestate( replay_frame *frame, u16 index ){
return NULL;
}
-VG_STATIC void player_replay_control_update( player_instance *player ){
-#if 0
+VG_STATIC void replay_get_camera( replay_buffer *replay, camera *cam ){
+ cam->nearz = 0.1f;
+ cam->farz = 100.0f;
+ if( replay->cursor_frame ){
+ /* TODO: frame lerp */
+ cam->fov = replay->cursor_frame->cam_fov;
+ v3_copy( replay->cursor_frame->cam_pos, cam->pos );
+ v3_copy( replay->cursor_frame->cam_angles, cam->angles );
+ }
+ else {
+ v3_zero( cam->pos );
+ v3_zero( cam->angles );
+ cam->fov = 90.0f;
+ }
+}
+
+VG_STATIC void skaterift_replay_pre_update(void){
+ if( skaterift.activity != k_skaterift_replay ) return;
+
f64 speed = 1.0;
- f64 target = player->replay.cursor;
+ f64 target = skaterift.replay.cursor;
if( vg_getkey( SDLK_9 ) ){
target -= vg.time_frame_delta * speed;
- player->replay.control = k_replay_control_scrub;
- replay_seek( &player->replay, target );
+ skaterift.replay_control = k_replay_control_scrub;
+ replay_seek( &skaterift.replay, target );
}
if( vg_getkey( SDLK_0 ) ){
target += vg.time_frame_delta * speed;
- player->replay.control = k_replay_control_scrub;
- replay_seek( &player->replay, target );
+ skaterift.replay_control = k_replay_control_scrub;
+ replay_seek( &skaterift.replay, target );
}
if( vg_getkey( SDLK_7 ) )
- player->replay.control = k_replay_control_play;
+ skaterift.replay_control = k_replay_control_play;
- if( player->replay.control == k_replay_control_play ){
+ if( skaterift.replay_control == k_replay_control_play ){
target += vg.time_frame_delta;
- replay_seek( &player->replay, target );
+ replay_seek( &skaterift.replay, target );
}
if( vg_getkey( SDLK_8 ) ){
- replay_frame *prev = replay_find_recent_stateframe( &player->replay );
+ replay_frame *prev = replay_find_recent_stateframe( &skaterift.replay );
if( prev ){
/* TODO: Make gamestate_apply function / swap ... */
replay_gamestate *gs = replay_frame_gamestate( prev, 0 );
if( gs->system == k_player_subsystem_walk ){
- memcpy( &player->_walk.state, &gs->walk,
+ memcpy( &localplayer._walk.state, &gs->walk,
sizeof(struct player_walk_state) );
}
else if( gs->system == k_player_subsystem_skate ){
- memcpy( &player->_skate.state, &gs->skate,
+ memcpy( &localplayer._skate.state, &gs->skate,
sizeof(struct player_skate_state) );
}
- player->subsystem = gs->system;
-
- memcpy( &player->rb, &gs->rb, sizeof(rigidbody) );
- v3_copy( gs->angles, player->angles );
- v3_copy( prev->cam_pos, player->cam.pos );
- v3_copy( prev->cam_angles, player->cam_override_angles );
- player->cam.fov = prev->cam_fov;
- memcpy( &player->cam_control, &gs->cam_control,
+ localplayer.subsystem = gs->system;
+
+ memcpy( &localplayer.rb, &gs->rb, sizeof(rigidbody) );
+ v3_copy( gs->angles, localplayer.angles );
+
+ v3_copy( prev->cam_pos, localplayer.cam.pos );
+ v3_copy( prev->cam_angles, localplayer.cam.angles );
+ localplayer.cam.fov = prev->cam_fov;
+
+ memcpy( &localplayer.cam_control, &gs->cam_control,
sizeof(struct player_cam_controller) );
/* chop end off replay */
prev->r = NULL;
- player->replay.statehead = prev;
- player->replay.head = prev;
- player->replay.cursor_frame = prev;
- player->replay.cursor = prev->time;
- player->replay.control = k_replay_control_none;
+ skaterift.replay.statehead = prev;
+ skaterift.replay.head = prev;
+ skaterift.replay.cursor_frame = prev;
+ skaterift.replay.cursor = prev->time;
+ skaterift.replay_control = k_replay_control_scrub;
+ skaterift.activity = k_skaterift_default;
vg.time = prev->time;
return;
}
}
-#endif
}
-VG_STATIC void replay_debug_info( player_instance *player ){
-#if 0
+VG_STATIC void skaterift_replay_debug_info(void){
player__debugtext( 2, "replay info" );
- replay_buffer *replay = &player->replay;
+ replay_buffer *replay = &skaterift.replay;
u32 head = 0,
tail = 0;
len = end - start;
player__debugtext( 1, "cursor: %.2fs / %.2fs\n", cur, len );
-#endif
}
-VG_STATIC void replay_imgui( player_instance *player ){
-#if 0
- if( player->replay.control == k_replay_control_none ) return;
+VG_STATIC void skaterift_replay_imgui(void){
+ if( skaterift.activity != k_skaterift_replay ) return;
- replay_buffer *replay = &player->replay;
+ replay_buffer *replay = &skaterift.replay;
f64 start = replay->cursor,
end = replay->cursor;
if( replay->tail ) start = replay->tail->time;
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,
- VG_MAX(4,(ui_px)l), bar[3]+2 };
+ VG_MAX(4,(ui_px)(l*vg.window_x)), bar[3]+2 };
ui_fill( box, ui_colour( k_ui_bg+4 ) );
}
}
snprintf( buffer, 128, "-%.2fs\n", len );
ui_text( bar, buffer, 1, k_ui_align_middle_left, 0 );
ui_text( bar, "0s", 1, k_ui_align_middle_right, 0 );
-#endif
}
#endif /* PLAYER_REPLAY_C */
if( button_down( k_srbind_reset ) ){
if( skaterift.activity == k_skaterift_default ){
skaterift.activity = k_skaterift_replay;
+ player_record_replay_frame( &localplayer, &skaterift.replay, 1 );
}
}
player__pre_update( &localplayer );
global_skateshop_preupdate();
+ skaterift_replay_pre_update();
world_update( world_current_instance(), localplayer.rb.co );
audio_ambient_sprites_update( world_current_instance(), localplayer.rb.co );
camera_lerp( &localplayer.cam, &global_skateshop.cam,
vg_smoothstepf(global_skateshop.factive), &skaterift.cam );
+ if( skaterift.activity == k_skaterift_replay ){
+ camera temp;
+ replay_get_camera( &skaterift.replay, &temp );
+ camera_lerp( &skaterift.cam, &temp, 1.0f-skaterift.time_rate,
+ &skaterift.cam );
+ }
+
skaterift.cam.nearz = 0.1f;
skaterift.cam.farz = 2100.0f;
}
VG_STATIC void render_main_game(void){
+ player__animate( &localplayer );
+ if( skaterift.activity == k_skaterift_replay ){
+ player__animate_from_replay( &localplayer, &skaterift.replay );
+ }
+ else
+ player_record_replay_frame( &localplayer, &skaterift.replay, 0 );
player__pre_render( &localplayer );
+
skaterift_composite_maincamera();
render_scene();
player__im_gui( &localplayer );
world_instance *world = world_current_instance();
- replay_imgui( &localplayer );
+ skaterift_replay_imgui();
workshop_form_gui();
render_view_framebuffer_ui();
}