From 67928190c66b05bd48b6b515278e930974d25cd2 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 4 Jul 2023 17:34:49 +0100 Subject: [PATCH] animation board tweaks --- ent_skateshop.c | 4 +++- player.h | 2 ++ player_render.c | 22 +++++++++++++++++++--- player_render.h | 6 ++++++ player_skate.c | 23 +++++++++++++++++++++-- player_skate.h | 3 +-- workshop.c | 5 +++-- 7 files changed, 55 insertions(+), 10 deletions(-) diff --git a/ent_skateshop.c b/ent_skateshop.c index 40e17f7..4c55bb9 100644 --- a/ent_skateshop.c +++ b/ent_skateshop.c @@ -432,9 +432,11 @@ VG_STATIC void skateshop_render_boardshop(void) q_nlerp( xform.q, mark_display->transform.q, t, xform.q ); v3_lerp( xform.s, mark_display->transform.s, t, xform.s ); + struct board_pose pose = {0}; m4x3f mmdl; mdl_transform_m4x3( &xform, mmdl ); - render_board( &main_camera, world, board, mmdl, k_board_shader_entity ); + render_board( &main_camera, world, board, mmdl, + &pose, k_board_shader_entity ); fade_out:; float rate = 5.0f*vg.time_delta; diff --git a/player.h b/player.h index e5f3dc7..7484ce9 100644 --- a/player.h +++ b/player.h @@ -82,6 +82,8 @@ struct player_instance{ player_pose holdout_pose; float holdout_time; + struct board_pose board_pose; + /* * Rewind * ---------------------------------------------------- diff --git a/player_render.c b/player_render.c index a039022..ce3fa5a 100644 --- a/player_render.c +++ b/player_render.c @@ -293,6 +293,7 @@ VG_STATIC void player__pre_render( player_instance *player ) VG_STATIC void render_board( camera *cam, world_instance *world, struct player_board *board, m4x3f root, + struct board_pose *pose, enum board_shader shader ) { if( !board ) return; @@ -349,7 +350,20 @@ VG_STATIC void render_board( camera *cam, world_instance *world, if( board->board.indice_count ){ m4x3f mlocal; m3x3_identity( mlocal ); - v3_copy( board->board_position, mlocal[3] ); + + mdl_keyframe kf; + v3_zero( kf.co ); + q_identity( kf.q ); + v3_zero( kf.s ); + + v4f qroll; + q_axis_angle( qroll, (v3f){0.0f,0.0f,1.0f}, pose->lean * 0.6f ); + keyframe_rotate_around( &kf, (v3f){0.0f,0.11f,0.0f}, + (v3f){0.0f,0.0f,0.0f}, qroll ); + + v3_add( board->board_position, kf.co, mlocal[3] ); + q_m3x3( kf.q, mlocal ); + m4x3_mul( root, mlocal, mlocal ); if( shader == k_board_shader_entity ){ @@ -463,9 +477,11 @@ PLAYER_API void player__render( camera *cam, player_instance *player ) struct player_board *board = addon_cache_item_if_loaded( k_addon_type_board, player->board_view_slot ); + render_board( cam, world, board, player->playeravatar->sk.final_mtx[ - player->playeravatar->id_board], - k_board_shader_player ); + player->playeravatar->id_board], + &player->board_pose, + k_board_shader_player ); SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); } diff --git a/player_render.h b/player_render.h index 31fba37..d2b17bb 100644 --- a/player_render.h +++ b/player_render.h @@ -57,6 +57,10 @@ struct player_board{ board; }; +struct board_pose { + f32 lean; +}; + struct player_model{ struct dynamic_model_1texture mdl; }; @@ -79,7 +83,9 @@ VG_STATIC void player_model_unload( struct player_model *board ); VG_STATIC void render_board( camera *cam, world_instance *world, struct player_board *board, m4x3f root, + struct board_pose *pose, enum board_shader shader ); + VG_STATIC void render_playermodel( camera *cam, world_instance *world, struct player_model *model, struct skeleton *skeleton ); diff --git a/player_skate.c b/player_skate.c index ef13865..a796b7c 100644 --- a/player_skate.c +++ b/player_skate.c @@ -2760,9 +2760,29 @@ VG_STATIC void player__skate_animate( player_instance *player, float dir_frame = s->blend_z * (15.0f/30.0f), stand_blend = offset[1]*-2.0f; + v2f steer; + joystick_state( k_srjoystick_steer, steer ); + f32 lean1, + lean2 = steer[0] * s->state.reverse * -0.36f, + lean; + + if( fabsf(s->state.slip) > 0.3f ){ + f32 slide_dir = vg_signf(v3_dot(player->rb.v,player->rb.to_world[0])); + s->state.delayed_slip_dir = slide_dir; + } + lean1 = s->blend_slide * s->state.delayed_slip_dir; + + if( fabsf(lean1)>fabsf(lean2) ) lean = lean1; + else lean = lean2; + + if( ((int)roundf(s->state.trick_euler[0])) % 2 ) lean = -lean; + lean = vg_clampf( lean, -1.0f, 1.0f ); + + player->board_pose.lean = vg_lerpf( player->board_pose.lean, lean, + vg.time_delta * 18.0f ); + v3f local_cog; m4x3_mulv( player->rb.to_local, s->state.cog, local_cog ); - stand_blend = vg_clampf( 1.0f-local_cog[1], 0, 1 ); skeleton_sample_anim( sk, s->anim_stand, dir_frame, apose ); @@ -2977,7 +2997,6 @@ VG_STATIC void player__skate_animate( player_instance *player, q_mul( qtotal, kf_board->q, kf_board->q ); - /* trick rotation */ v4f qtrick, qyaw, qpitch, qroll; v3f euler; diff --git a/player_skate.h b/player_skate.h index 1429ff0..9fbc563 100644 --- a/player_skate.h +++ b/player_skate.h @@ -24,8 +24,7 @@ struct player_skate{ activity, activity_prev; - float reverse, - slip; + f32 reverse, slip, delayed_slip_dir; int manual_direction; diff --git a/workshop.c b/workshop.c index 9917359..30ddb56 100644 --- a/workshop.c +++ b/workshop.c @@ -998,8 +998,9 @@ VG_STATIC void workshop_render_board_preview(void){ sizeof(struct ub_world_lighting), &world->ub_lighting ); render_world( world, &cam, 1 ); - render_board( &cam, world, board, mmdl, k_board_shader_entity ); - render_board( &cam, world, board, mmdl1, k_board_shader_entity ); + struct board_pose pose = {0}; + render_board( &cam, world, board, mmdl, &pose, k_board_shader_entity ); + render_board( &cam, world, board, mmdl1, &pose, k_board_shader_entity ); glBindFramebuffer( GL_FRAMEBUFFER, 0 ); glViewport( 0,0, vg.window_x, vg.window_y ); -- 2.25.1