/* TODO: holdout blending (from when the game has to slow down) */
player_animation res;
- replay_frame *frame = replay->cursor_frame;
+ replay_frame *frame = replay->cursor_frame,
+ *next = NULL;
if( frame ){
- memcpy( &res, &frame->anim, sizeof(frame->anim) );
- memcpy( &frame->board_pose, &player->board_pose,
- sizeof(player->board_pose) );
+ next = frame->r;
+
+ if( next ){
+ f32 t = replay_subframe_time( replay );
+
+ struct skeleton *sk = &player->playeravatar->sk;
+ skeleton_lerp_pose(sk, frame->anim.pose, next->anim.pose, t, res.pose);
+ v3_lerp( frame->anim.root_co, next->anim.root_co, t, res.root_co );
+ q_nlerp( frame->anim.root_q, next->anim.root_q, t, res.root_q );
+ res.type = k_player_animation_type_absolute;
+ player->board_pose.lean = vg_lerpf( frame->board_pose.lean,
+ next->board_pose.lean, t );
+ }
+ else {
+ memcpy( &res, &frame->anim, sizeof(frame->anim) );
+ memcpy( &frame->board_pose, &player->board_pose,
+ sizeof(player->board_pose) );
+ }
}
else return;
const f64 k_replay_rate = 1.0/30.0,
k_gamestate_rate = 0.5;
- u16 gamestates = 0;
- if( statedelta > k_gamestate_rate || force_gamestate /* or switching */ ){
- gamestates = 1;
+ u32 gamestate_size = 0;
+ void *gamestate_src = NULL;
+ if( (statedelta > k_gamestate_rate) || force_gamestate ){
+ if( player->subsystem == k_player_subsystem_walk ){
+ gamestate_size = sizeof(struct player_walk_state);
+ gamestate_src = &player->_walk.state;
+ }
+ else if( player->subsystem == k_player_subsystem_skate ){
+ gamestate_size = sizeof(struct player_skate_state);
+ gamestate_src = &player->_skate.state;
+ }
+ else if( player->subsystem == k_player_subsystem_dead ){
+ gamestate_size = sizeof(struct player_ragdoll);
+ gamestate_src = &player->ragdoll;
+ }
}
+ assert( gamestate_size < 0xffff );
- if( (delta > k_replay_rate) || gamestates ){
- replay_frame *frame = replay_newframe( replay, gamestates, 0 );
+ if( (delta > k_replay_rate) || gamestate_size ){
+ replay_frame *frame = replay_newframe( replay, gamestate_size, 0 );
replay->cursor = vg.time;
replay->cursor_frame = frame;
v3_copy( player->cam.angles, frame->cam_angles );
frame->cam_fov = player->cam.fov;
- if( gamestates ){
- replay_gamestate *gs = replay_frame_gamestate( frame, 0 );
+ if( gamestate_size ){
+ replay_gamestate *gs = replay_frame_gamestate( frame );
gs->system = player->subsystem;
- if( player->subsystem == k_player_subsystem_walk ){
- memcpy( &gs->walk, &player->_walk.state,
- sizeof(struct player_walk_state) );
- }
- else if( player->subsystem == k_player_subsystem_skate ){
- memcpy( &gs->skate, &player->_skate.state,
- sizeof(struct player_skate_state) );
- }
-
+ /* permanent block */
memcpy( &gs->rb, &player->rb, sizeof(rigidbody) );
memcpy( &gs->cam_control, &player->cam_control,
sizeof(struct player_cam_controller) );
v3_copy( player->angles, gs->angles );
+
+ /* subsytem/dynamic block */
+ void *dst = replay_gamestate_subsystem_data( gs );
+ memcpy( dst, gamestate_src, gamestate_size );
}
}
}