X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_render.c;h=283b2510e4f0db097d20cfc3ed343775e71b6c9a;hb=09fc72b08113fa157a3abb2ded6086babedd10cf;hp=d687370573016ce3a98c4a3495f5dc75827edb63;hpb=b615f03b922d155f9449d2a23d3cc18eed320ed3;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_render.c b/player_render.c index d687370..283b251 100644 --- a/player_render.c +++ b/player_render.c @@ -7,6 +7,7 @@ #include "player_model.h" #include "ent_skateshop.h" #include "audio.h" +#include "input.h" #include "shaders/model_character_view.h" #include "shaders/model_board_view.h" @@ -137,35 +138,36 @@ VG_STATIC void player_model_unload( struct player_model *board ){ dynamic_model_unload( &board->mdl ); } -VG_STATIC void player__pre_render( player_instance *player ) -{ - if( _player_animate[ player->subsystem ] ){ - player_animation res; - res.type = k_player_animation_type_fk; +VG_STATIC void player__animate( player_instance *player ){ + if( _player_animate[ player->subsystem ] && + _player_pose[ player->subsystem ] ){ + _player_animate[ player->subsystem ]( player ); + _player_pose[ player->subsystem ]( player ); - _player_animate[ player->subsystem ]( player, &res ); + player_pose *pose = &player->pose; m4x3f transform; - q_m3x3( res.root_q, transform ); - v3_copy( res.root_co, transform[3] ); + q_m3x3( pose->root_q, transform ); + v3_copy( pose->root_co, transform[3] ); struct skeleton *sk = &player->playeravatar->sk; if( player->holdout_time > 0.0f ){ - skeleton_lerp_pose( sk, res.pose, player->holdout_pose, - player->holdout_time, res.pose ); + skeleton_lerp_pose( sk, + pose->keyframes, player->holdout_pose.keyframes, + player->holdout_time, pose->keyframes ); player->holdout_time -= vg.time_frame_delta * 2.0f; } - if( res.type == k_player_animation_type_fk ){ - skeleton_apply_pose( sk, res.pose, k_anim_apply_defer_ik ); + if( pose->type == k_player_pose_type_fk ){ + skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_defer_ik ); skeleton_apply_ik_pass( sk ); - skeleton_apply_pose( sk, res.pose, k_anim_apply_deffered_only ); + skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_deffered_only ); skeleton_apply_inverses( sk ); skeleton_apply_transform( sk, transform ); } else { - skeleton_apply_pose( sk, res.pose, k_anim_apply_absolute ); + skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_absolute ); } skeleton_debug( sk ); @@ -174,13 +176,48 @@ VG_STATIC void player__pre_render( player_instance *player ) if( _player_post_animate[ player->subsystem ] ) _player_post_animate[ player->subsystem ]( player ); + player__cam_iterate( player ); +} + +VG_STATIC void player__animate_from_replay( player_instance *player, + replay_buffer *replay ){ + /* TODO: holdout blending (from when the game has to slow down) */ + replay_frame *frame = replay->cursor_frame, + *next = NULL; + + player_pose *pose = &player->pose; + + if( frame ){ + next = frame->r; + + if( next ){ + f32 t = replay_subframe_time( replay ); + + struct skeleton *sk = &player->playeravatar->sk; + skeleton_lerp_pose( sk, frame->pose.keyframes, next->pose.keyframes, + t, pose->keyframes ); + v3_lerp( frame->pose.root_co, next->pose.root_co, t, pose->root_co ); + q_nlerp( frame->pose.root_q, next->pose.root_q, t, pose->root_q ); + pose->type = k_player_pose_type_absolute; + pose->board.lean = vg_lerpf( frame->pose.board.lean, + next->pose.board.lean, t ); + } + else + memcpy( pose, &frame->pose, sizeof(frame->pose) ); + } + else return; + + struct skeleton *sk = &player->playeravatar->sk; + skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_absolute ); +} + +VG_STATIC void player__pre_render( player_instance *player ){ + /* shadowing/ao info */ struct player_avatar *av = player->playeravatar; struct player_board *board = addon_cache_item_if_loaded( k_addon_type_board, player->board_view_slot ); - v3f vp0, vp1; - if( board ){ v3_copy((v3f){0.0f,0.1f, board->truck_positions[0][2]}, vp0 ); v3_copy((v3f){0.0f,0.1f, board->truck_positions[1][2]}, vp1 ); @@ -193,165 +230,11 @@ VG_STATIC void player__pre_render( player_instance *player ) struct ub_world_lighting *ubo = &world_current_instance()->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->immobile ){ - player__cam_iterate( player ); - return; - } - -#if 0 - if( player->rewinding ){ - if( player->rewind_time <= 0.0f ){ - double taken = vg.time - player->rewind_start; - vg_success( "Rewind took (rt, pt, tl): %f, %f, %f\n", - taken, player->rewind_predicted_time, - player->rewind_total_length ); - - player->rewinding = 0; - player->rewind_length = 1; - player->rewind_total_length = 0.0f; - player->rewind_accum = 0.0f; - world_render.sky_target_rate = 1.0; - world_static.time = world_static.last_use; - } - else{ - world_render.sky_target_rate = -100.0; - - float budget = vg.time_delta, - overall_length = player->rewind_length; - - for( int i=0; (i<10)&&(player->rewind_time>0.0f)&&(budget>0.0f); i++ ){ - /* Interpolate frames */ - int i0 = floorf( player->rewind_time ), - i1 = VG_MIN( i0+1, player->rewind_length-1 ); - - struct rewind_frame *fr = &player->rewind_buffer[i0], - *fr1 = &player->rewind_buffer[i1]; - - 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)), - speed = sramp*28.0f + 0.5f*player->rewind_time, - mod = speed * (budget / dist), - - advl = vg_minf( mod, subl ), - advt = (advl / mod) * budget; - - player->dist_accum += speed * advt; - player->rewind_time -= advl; - budget -= advt; - } - - player->rewind_time = vg_maxf( 0.0f, player->rewind_time ); - - float current_time = vg.time - player->rewind_start, - remaining = player->rewind_predicted_time - current_time; - - if( player->rewind_sound_wait ){ - if( player->rewind_predicted_time >= 6.5f ){ - if( remaining <= 6.5f ){ - audio_lock(); - audio_oneshot( &audio_rewind[3], 1.0f, 0.0f ); - audio_unlock(); - player->rewind_sound_wait = 0; - } - } - else if( player->rewind_predicted_time >= 2.5f ){ - if( remaining <= 2.5f ){ - audio_lock(); - audio_oneshot( &audio_rewind[2], 1.0f, 0.0f ); - audio_unlock(); - player->rewind_sound_wait = 0; - } - } - else if( player->rewind_predicted_time >= 1.5f ){ - if( remaining <= 1.5f ){ - audio_lock(); - audio_oneshot( &audio_rewind[1], 1.0f, 0.0f ); - audio_unlock(); - player->rewind_sound_wait = 0; - } - } - } - - int i0 = floorf( player->rewind_time ), - i1 = VG_MIN( i0+1, player->rewind_length-1 ); - - struct rewind_frame *fr = &player->rewind_buffer[i0], - *fr1 = &player->rewind_buffer[i1]; - - float sub = vg_fractf(player->rewind_time); - - v3_lerp( fr->pos, fr1->pos, sub, player->cam_override_pos ); - player->cam_override_angles[0] = - vg_alerpf( fr->ang[0], fr1->ang[0], sub ); - player->cam_override_angles[1] = - vg_lerpf ( fr->ang[1], fr1->ang[1], sub ); - player->cam_override_fov = player->cam.fov; - - float blend = player->rewind_time * 0.25f; - player->cam_override_strength = vg_clampf( blend, 0.0f, 1.0f ); - } - } - else player->cam_override_strength = 0.0f; -#else - player->cam_override_strength = 0.0f; -#endif - - player__cam_iterate( player ); - - /* dev playbacker */ - if( k_replay_test ){ - f64 speed = 1.0; - f64 target = player->replay.cursor; - - if( vg_getkey( SDLK_9 ) ) - target -= vg.time_frame_delta * speed; - if( vg_getkey( SDLK_0 ) ) - target += vg.time_frame_delta * speed; - - replay_seek( &player->replay, target ); - - player_animation res; - replay_frame *frame = player->replay.cursor_frame; - - if( frame ){ - memcpy( &res, &frame->anim, sizeof(frame->anim) ); - memcpy( &frame->board_pose, &player->board_pose, - sizeof(player->board_pose) ); - } - else return; - - struct skeleton *sk = &player->playeravatar->sk; - skeleton_apply_pose( sk, res.pose, k_anim_apply_absolute ); - } - else { - /* replay recorder */ - replay_buffer *replay = &player->replay; - f64 delta = vg.time - replay->cursor; - if( delta > (1.0/30.0) ){ - replay->cursor = vg.time; - replay_frame *frame = replay_newframe( replay ); - - player_animation *res = &frame->anim; - v3_zero( res->root_co ); - q_identity( res->root_q ); - res->type = k_player_animation_type_absolute; - - struct skeleton *sk = &player->playeravatar->sk; - skeleton_decompose_mtx_absolute( sk, res->pose ); - - memcpy( &frame->board_pose, &player->board_pose, - sizeof(player->board_pose) ); - frame->time = vg.time; - } - } } VG_STATIC void render_board( camera *cam, world_instance *world, struct player_board *board, m4x3f root, - struct board_pose *pose, + struct player_board_pose *pose, enum board_shader shader ) { if( !board ) return; @@ -371,7 +254,7 @@ VG_STATIC void render_board( camera *cam, world_instance *world, render_fb_inverse_ratio( gpipeline.fb_main, inverse ); - inverse[2] = main_camera.farz-main_camera.nearz; + inverse[2] = skaterift.cam.farz-skaterift.cam.nearz; shader_model_board_view_uInverseRatioDepth( inverse ); render_fb_inverse_ratio( NULL, inverse ); @@ -481,6 +364,7 @@ VG_STATIC void render_board( camera *cam, world_instance *world, } VG_STATIC void render_playermodel( camera *cam, world_instance *world, + int depth_compare, struct player_model *model, struct skeleton *skeleton ){ if( !model ) return; @@ -492,16 +376,20 @@ VG_STATIC void render_playermodel( camera *cam, world_instance *world, 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 ); + if( depth_compare ){ + 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] = skaterift.cam.farz-skaterift.cam.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 ); + } + shader_model_character_view_uDepthCompare( depth_compare ); world_link_lighting_ub( world, _shader_model_character_view.id ); world_bind_position_texture( world, _shader_model_character_view.id, @@ -520,8 +408,7 @@ VG_STATIC void render_playermodel( camera *cam, world_instance *world, mesh_draw( &model->mdl.mesh ); } -PLAYER_API void player__render( camera *cam, player_instance *player ) -{ +PLAYER_API void player__render( camera *cam, player_instance *player ){ world_instance *world = world_current_instance(); SDL_AtomicLock( &addon_system.sl_cache_using_resources ); @@ -530,7 +417,7 @@ PLAYER_API void player__render( camera *cam, player_instance *player ) player->playermodel_view_slot ); if( !model ) model = &player->fallback_model; - render_playermodel( cam, world, model, &player->playeravatar->sk ); + render_playermodel( cam, world, 1, model, &player->playeravatar->sk ); struct player_board *board = addon_cache_item_if_loaded( k_addon_type_board, @@ -538,7 +425,7 @@ PLAYER_API void player__render( camera *cam, player_instance *player ) render_board( cam, world, board, player->playeravatar->sk.final_mtx[ player->playeravatar->id_board], - &player->board_pose, + &player->pose.board, k_board_shader_player ); SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );