animation board tweaks
authorhgn <hgodden00@gmail.com>
Tue, 4 Jul 2023 16:34:49 +0000 (17:34 +0100)
committerhgn <hgodden00@gmail.com>
Tue, 4 Jul 2023 16:34:49 +0000 (17:34 +0100)
ent_skateshop.c
player.h
player_render.c
player_render.h
player_skate.c
player_skate.h
workshop.c

index 40e17f7f25995c98ab54f2f6bb1d937e1e62034d..4c55bb939477117aac5c1cb36ae900aa50830ed9 100644 (file)
@@ -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;
index e5f3dc741ccf135863886de97074edc06b535d6c..7484ce94610c1100a030fe03cc4f2c3399fdef5e 100644 (file)
--- 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
     * ----------------------------------------------------
index a03902297c30b9442332f53adfde92624c36d6bd..ce3fa5a6a527463c99aada84fc8ee1735fd0a6be 100644 (file)
@@ -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 );
 }
index 31fba37d2a5ad4612e1c55e3e9ca7d69ae61ca30..d2b17bbeed54127cf0ab76afff13de51c77a5c06 100644 (file)
@@ -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 );
index ef13865546431cb5d2af4047c698bff0b0555bdf..a796b7c67ee721c2ecfdb528f4bddf78691480f3 100644 (file)
@@ -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;
index 1429ff04a04c7a16c7b17c5a9c12ac7b4d045060..9fbc5634832050bb574dbd4c37054f3b7bf59267 100644 (file)
@@ -24,8 +24,7 @@ struct player_skate{
       activity,
       activity_prev;
 
-      float reverse,
-            slip;
+      f32 reverse, slip, delayed_slip_dir;
 
       int manual_direction;
 
index 9917359246784df82c73b52d97bd234f7df2b2fc..30ddb5647528410b5cfdbf8debd7c982480fbea0 100644 (file)
@@ -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 );