animation board tweaks
[carveJwlIkooP6JGAAIwe30JlM.git] / player_render.c
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 );
 }