From 8257c14cce7fd1df60238aa0f690593948b5befe Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 28 Jan 2024 18:56:28 +0000 Subject: [PATCH] backpack glider --- player.h | 1 - player_glide.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- player_glide.h | 5 ++--- player_render.c | 7 +------ 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/player.h b/player.h index 3ae9df1..97c8292 100644 --- a/player.h +++ b/player.h @@ -48,7 +48,6 @@ struct player_subsystem_interface{ void(*effects)( void *animator, m4x3f *final_mtx, struct player_board *board, struct player_effects_data *effect_data ); void(*post_animate)(void); - void(*render)( camera *cam, world_instance *world, player_pose *pose ); void(*network_animator_exchange)( bitpack_ctx *ctx, void *data ); void(*sfx_oneshot)( u8 id, v3f pos, f32 volume ); diff --git a/player_glide.c b/player_glide.c index 2343ad1..d67d8ec 100644 --- a/player_glide.c +++ b/player_glide.c @@ -360,16 +360,55 @@ static void player_glide_transition(void){ static void player_glide_render( camera *cam, world_instance *world, player_pose *pose ){ + if( !((localplayer.subsystem == k_player_subsystem_glide) || + localplayer.have_glider) ) + return; + + f32 t; + if( localplayer.subsystem == k_player_subsystem_glide ) + t = 1.0f; + else + t = 0.0f; + + vg_slewf( &player_glide.t, t, vg.time_frame_delta * 4.0f ); + shader_model_entity_use(); shader_model_entity_uTexMain( 0 ); shader_model_entity_uCamera( cam->transform[3] ); shader_model_entity_uPv( cam->mtx.pv ); - WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, model_entity ); + mdl_keyframe kf_backpack, + kf_res; + + + struct skeleton *sk = &localplayer.skeleton; + m4x3_mulv( localplayer.final_mtx[localplayer.id_chest ], + sk->bones[localplayer.id_chest].co, + kf_backpack.co ); + + v4f qyaw, qpitch, qchest, q; + q_axis_angle( qyaw, (v3f){0,1,0}, VG_TAUf*0.25f ); + q_axis_angle( qpitch, (v3f){1,0,0}, VG_TAUf*0.25f ); + m3x3_q( localplayer.final_mtx[ localplayer.id_chest ], qchest ); + + q_mul( qyaw, qpitch, q ); + q_mul( qchest, q, kf_backpack.q ); + q_normalize( kf_backpack.q ); + + v3_fill( kf_backpack.s, 0.2f ); + + v3_copy( pose->root_co, kf_res.co ); + v4_copy( pose->root_q, kf_res.q ); + v3_fill( kf_res.s, 1.0f ); + + keyframe_lerp( &kf_backpack, &kf_res, vg_smoothstepf( player_glide.t ), + &kf_res ); + m4x3f mmdl; - q_m3x3( pose->root_q, mmdl ); - v3_copy( pose->root_co, mmdl[3] ); + q_m3x3( kf_res.q, mmdl ); + m3x3_scale( mmdl, kf_res.s ); + v3_copy( kf_res.co, mmdl[3] ); u32 current_tex = 0xffffffff; glActiveTexture( GL_TEXTURE0 ); diff --git a/player_glide.h b/player_glide.h index 163e3ba..e6af01d 100644 --- a/player_glide.h +++ b/player_glide.h @@ -20,6 +20,8 @@ struct player_glide { rigidbody rb; + f32 t; + struct { v3f co, euler; m4x3f mdl; @@ -70,8 +72,6 @@ static void player_glide_post_animate(void); static void player_glide_im_gui(void); static void player_glide_bind(void); static void player_glide_transition(void); -static void player_glide_render( camera *cam, world_instance *world, - player_pose *pose ); struct player_subsystem_interface static player_subsystem_glide = { .pre_update = player_glide_pre_update, @@ -82,7 +82,6 @@ struct player_subsystem_interface static player_subsystem_glide = { .post_animate = player_glide_post_animate, .im_gui = player_glide_im_gui, .bind = player_glide_bind, - .render = player_glide_render, .animator_data = &player_glide.animator, .animator_size = sizeof(player_glide.animator), diff --git a/player_render.c b/player_render.c index f1ca753..c1e96f6 100644 --- a/player_render.c +++ b/player_render.c @@ -556,12 +556,7 @@ static void player__render( camera *cam ){ SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); - struct player_subsystem_interface *sys = - player_subsystems[localplayer.subsystem]; - - if( sys->render ){ - sys->render( cam, world, &localplayer.pose ); - } + player_glide_render( cam, world, &localplayer.pose ); } static void player_mirror_pose( mdl_keyframe pose[32], -- 2.25.1