X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player.c;h=19c44929cd61f01ea336592f8ab36d2d6e266438;hb=8c376ed2e4021a18b0a6c6e800109d67ad09d198;hp=ea29b4cecd5ea68b675634dd1ae847896210c3a1;hpb=d6171f1c56789b2ca79efa3313fbbf74a13bda7a;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player.c b/player.c index ea29b4c..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 ){ - __respawn( 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,7 +352,7 @@ 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; @@ -343,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 ); @@ -362,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 ){ @@ -385,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 ), @@ -400,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), @@ -474,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 ); @@ -528,7 +569,6 @@ 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 ] )