if( (reg->alias.type == type) && (reg->foldername_hash == folder_hash) ){
if( !strcmp( reg->alias.foldername, folder_name ) ){
reg->state = k_addon_state_indexed;
- return NULL;
+ return reg;
}
}
}
*/
static void player__pass_gate( u32 id ){
world_instance *world = world_current_instance();
+ skaterift_record_frame( &skaterift.replay, 1 );
/* update boundary hash (network animation) */
u16 index = mdl_entity_id_id(id) & ~NETMSG_BOUNDARY_MASK;
world_routes_fracture( world, gate, localplayer.rb.co, localplayer.rb.v );
localplayer.gate_waiting = gate;
+ localplayer.deferred_frame_record = 1;
struct player_cam_controller *cc = &localplayer.cam_control;
m4x3_mulv( gate->transport, cc->tpv_lpf, cc->tpv_lpf );
world_static.active_instance = gate->target;
player__clean_refs();
+
+ replay_clear( &skaterift.replay );
}
- else
+ else {
world_routes_activate_entry_gate( world, gate );
+ }
v3f v0;
v3_angles_vector( localplayer.angles, v0 );
audio_lock();
audio_oneshot( &audio_gate_pass, 1.0f, 0.0f );
audio_unlock();
-
- replay_clear( &skaterift.replay );
}
static void player_apply_transport_to_cam( m4x3f transport ){
v3f cam_land_punch, cam_land_punch_v;
ent_gate *gate_waiting;
+ int deferred_frame_record;
+
int immobile;
int rewinded_since_last_gate;
f32 pol = v3_dot( localplayer.cam.pos, plane ) - plane[3];
- /* check camera polarity */
- if( (pol < 0.0f) || (pol > 5.0f) ) {
+ int cleared = (pol < 0.0f) || (pol > 5.0f);
+
+ if( cleared ){
vg_success( "Plane cleared\n" );
- player_apply_transport_to_cam( localplayer.gate_waiting->transport );
- localplayer.gate_waiting = NULL;
}
- else{
- /* de-transform camera and player back */
- m4x3f inverse;
- m4x3_invert_affine( localplayer.gate_waiting->transport, inverse );
- m4x3_mulv( inverse, localplayer.cam.pos, localplayer.cam.pos );
- v3f v0;
- v3_angles_vector( localplayer.cam.angles, v0 );
- m3x3_mulv( inverse, v0, v0 );
- v3_angles( v0, localplayer.cam.angles );
+ m4x3f inverse;
+ m4x3_invert_affine( localplayer.gate_waiting->transport, inverse );
+
+ /* de-transform camera and player back */
+ v3f v0;
+ m4x3_mulv( inverse, localplayer.cam.pos, localplayer.cam.pos );
+ v3_angles_vector( localplayer.cam.angles, v0 );
+ m3x3_mulv( inverse, v0, v0 );
+ v3_angles( v0, localplayer.cam.angles );
- skeleton_apply_transform( &localplayer.skeleton, inverse,
+ skeleton_apply_transform( &localplayer.skeleton, inverse,
+ localplayer.final_mtx );
+
+ /* record and re-put things again */
+ if( cleared ){
+ skaterift_record_frame( &skaterift.replay, 1 );
+ localplayer.deferred_frame_record = 1;
+
+ skeleton_apply_transform( &localplayer.skeleton,
+ localplayer.gate_waiting->transport,
localplayer.final_mtx );
+
+ m4x3_mulv( localplayer.gate_waiting->transport,
+ localplayer.cam.pos, localplayer.cam.pos );
+ v3_angles_vector( localplayer.cam.angles, v0 );
+ m3x3_mulv( localplayer.gate_waiting->transport, v0, v0 );
+ v3_angles( v0, localplayer.cam.angles );
+ player_apply_transport_to_cam( localplayer.gate_waiting->transport );
+ localplayer.gate_waiting = NULL;
}
}
}
replay_frame *next = frame->r;
if( next ){
f64 l = next->time - frame->time,
- t = (replay->cursor - frame->time) / l;
+ t = (l <= (1.0/128.0))? 0.0: (replay->cursor - frame->time) / l;
return vg_clampf( t, 0.0f, 1.0f );
}
else
v4f q;
};
-static
-void skaterift_record_frame( replay_buffer *replay, int force_gamestate ){
+static void skaterift_record_frame( replay_buffer *replay,
+ int force_gamestate ){
f64 delta = 9999999.9,
statedelta = 9999999.9;
if( localplayer.gate_waiting ){
m4x3_mulv( localplayer.gate_waiting->transport,
frame->cam_pos, frame->cam_pos );
+
+ v3f v0;
+ v3_angles_vector( localplayer.cam.angles, v0 );
+ m3x3_mulv( localplayer.gate_waiting->transport, v0, v0 );
+ v3_angles( v0, frame->cam_angles );
}
- v3_copy( localplayer.cam.angles, frame->cam_angles );
+ else
+ v3_copy( localplayer.cam.angles, frame->cam_angles );
+
frame->cam_fov = localplayer.cam.fov;
/* animator */
struct replay_gamestate {
rigidbody rb;
v3f angles;
-
struct player_cam_controller cam_control;
};
static void skaterift_replay_pre_update(void);
static void skaterift_replay_imgui(void);
static void skaterift_replay_debug_info(void);
+static void skaterift_record_frame( replay_buffer *replay,
+ int force_gamestate );
#endif /* PLAYER_REPLAY_H */
static addon_reg *skaterift_mount_world_unloadable( const char *path, u32 ext ){
addon_reg *reg = addon_mount_local_addon( path, k_addon_type_world, ".mdl" );
+ if( !reg ) vg_fatal_error( "world not found\n" );
reg->flags |= (ADDON_REG_HIDDEN | ext);
return reg;
}
}
else{
player__animate();
- skaterift_record_frame( &skaterift.replay, 0 );
+ skaterift_record_frame( &skaterift.replay,
+ localplayer.deferred_frame_record );
+ localplayer.deferred_frame_record = 0;
}
animate_remote_players();
player__pre_render();