X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player.c;h=19c44929cd61f01ea336592f8ab36d2d6e266438;hb=8c376ed2e4021a18b0a6c6e800109d67ad09d198;hp=483df660638629a2cef7de9952095b28e9fbc91f;hpb=eb203257efcfe324217de9e733cc6c1371b99de6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player.c b/player.c index 483df66..19c4492 100644 --- a/player.c +++ b/player.c @@ -5,6 +5,35 @@ #include "camera.h" #include "player_model.h" +VG_STATIC int localplayer_cmd_respawn( int argc, const char *argv[] ) +{ + ent_spawn *rp = NULL, *r; + world_instance *world = localplayer.viewable_world; + + if( argc == 1 ){ + rp = world_find_spawn_by_name( world, argv[0] ); + } + else if( argc == 0 ){ + rp = world_find_closest_spawn( world, localplayer.rb.co ); + } + + if( !rp ) + return 0; + + player__spawn( &localplayer, rp ); + return 1; +} + +VG_STATIC void player_init(void) +{ + for( u32 i=0; isubsystem == k_player_subsystem_dead ){ - player->subsystem = k_player_subsystem_walk; - //reset_player( 0, NULL ); + localplayer_cmd_respawn( 0, NULL ); } else{ /* cant do that */ @@ -242,7 +273,7 @@ void player__post_update( player_instance *player ) _player_post_update[ player->subsystem ]( player ); if((player->subsystem != k_player_subsystem_dead) && !player->gate_waiting){ - player->rewind_accum += vg.frame_delta; + player->rewind_accum += vg.time_frame_delta; if( player->rewind_accum > 0.25f ){ player->rewind_accum -= 0.25f; @@ -291,6 +322,9 @@ VG_STATIC void gate_rotate_angles( ent_gate *gate, v3f angles, v3f d ) PLAYER_API void player__pass_gate( player_instance *player, ent_gate *gate ) { + world_routes_fracture( get_active_world(), gate, + player->rb.co, player->rb.v ); + player->gate_waiting = gate; world_routes_activate_entry_gate( get_active_world(), gate ); @@ -318,9 +352,11 @@ void player__pass_gate( player_instance *player, ent_gate *gate ) m4x3_mulv( gate->transport, player->cam.pos, player->cam.pos ); player_save_rewind_frame( player ); - if( gate->type == k_gate_type_nonlocal ) + if( gate->type == k_gate_type_nonlocel ) world_global.active_world = gate->target; + world_global.in_volume = 0; + audio_lock(); audio_oneshot( &audio_gate_pass, 1.0f, 0.0f ); audio_unlock(); @@ -341,7 +377,7 @@ VG_STATIC void player__pre_render( player_instance *player ) if( player->holdout_time > 0.0f ){ skeleton_lerp_pose( sk, res.pose, player->holdout_pose, player->holdout_time, res.pose ); - player->holdout_time -= vg.frame_delta * 2.0f; + player->holdout_time -= vg.time_frame_delta * 2.0f; } skeleton_apply_pose( sk, res.pose, k_anim_apply_defer_ik ); @@ -360,8 +396,9 @@ VG_STATIC void player__pre_render( player_instance *player ) v3f vp0 = {0.0f,0.1f, 0.55f}, vp1 = {0.0f,0.1f,-0.55f}; - m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp0, TEMP_BOARD_0 ); - m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp1, TEMP_BOARD_1 ); + struct ub_world_lighting *ubo = &get_active_world()->ub_lighting; + m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp0, ubo->g_board_0 ); + m4x3_mulv( av->sk.final_mtx[ av->id_board ], vp1, ubo->g_board_1 ); if( player->rewinding ){ if( player->rewind_time <= 0.0f ){ @@ -375,6 +412,7 @@ VG_STATIC void player__pre_render( player_instance *player ) player->rewind_total_length = 0.0f; player->rewind_accum = 0.0f; world_global.sky_target_rate = 1.0; + world_global.time = world_global.last_use; } else{ world_global.sky_target_rate = -100.0; @@ -382,10 +420,6 @@ VG_STATIC void player__pre_render( player_instance *player ) float budget = vg.time_delta, overall_length = player->rewind_length; -#if 0 - world_routes_rollback_time( player.rewind_time / overall_length ); -#endif - for( int i=0; (i<10)&&(player->rewind_time>0.0f)&&(budget>0.0f); i++ ){ /* Interpolate frames */ int i0 = floorf( player->rewind_time ), @@ -397,7 +431,7 @@ VG_STATIC void player__pre_render( player_instance *player ) float dist = vg_maxf( v3_dist( fr->pos, fr1->pos ), 0.001f ), subl = vg_fractf( player->rewind_time ) + 0.001f, - sramp= 3.0f-(1.0f/(0.4f+0.4f*player->rewind_time)), + sramp = 3.0f-(1.0f/(0.4f+0.4f*player->rewind_time)), speed = sramp*28.0f + 0.5f*player->rewind_time, mod = speed * (budget / dist), @@ -471,6 +505,16 @@ PLAYER_API void player__render( camera *cam, player_instance *player ) shader_model_character_view_uTexMain( 0 ); shader_model_character_view_uCamera( cam->transform[3] ); shader_model_character_view_uPv( cam->mtx.pv ); + shader_model_character_view_uTexSceneDepth( 1 ); + render_fb_bind_texture( gpipeline.fb_main, 2, 1 ); + v3f inverse; + render_fb_inverse_ratio( gpipeline.fb_main, inverse ); + inverse[2] = main_camera.farz-main_camera.nearz; + + shader_model_character_view_uInverseRatioDepth( inverse ); + render_fb_inverse_ratio( NULL, inverse ); + inverse[2] = cam->farz-cam->nearz; + shader_model_character_view_uInverseRatioMain( inverse ); world_instance *world = get_active_world(); world_link_lighting_ub( world, _shader_model_character_view.id ); @@ -525,7 +569,7 @@ PLAYER_API void player__spawn( player_instance *player, m3x3_identity( player->invbasis ); player->subsystem = k_player_subsystem_walk; - player->viewable_world = get_active_world(); + player->gate_waiting = NULL; if( _player_reset[ player->subsystem ] ) _player_reset[ player->subsystem ]( player, rp );