username medals display
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.c
index 41e03a40b46e836e30d2543279f9753c624a86b6..745a6ff85b07cf437ce4280fca186c93158d42db 100644 (file)
@@ -9,9 +9,7 @@
 #include "addon.h"
 
 static void player__skate_bind(void){
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
-
+   struct skeleton *sk = &localplayer.skeleton;
    rb_update_transform( &localplayer.rb );
 
    struct { struct skeleton_anim **anim; const char *name; }
@@ -181,8 +179,7 @@ too_many_samples:
    if( sample_count < 2 )
       return 0;
 
-   v3f 
-       average_direction,
+   v3f average_direction,
        average_normal;
 
    v2f min_co, max_co;
@@ -227,6 +224,10 @@ too_many_samples:
          v3_copy( si->normal3, n0 );
          v3_copy( sj->normal3, n1 );
          v3_cross( n0, n1, dir );
+
+         if( v3_length2( dir ) <= 0.001f )
+            continue;
+
          v3_normalize( dir );
 
          /* make sure the directions all face a common hemisphere */
@@ -1102,7 +1103,13 @@ static void player__skate_pre_update(void){
       v3_copy( localplayer.cam.angles, localplayer.angles );
       localplayer.angles[2] = 0.0f;
 
-      player__begin_holdout();
+      v3f newpos, offset;
+      m4x3_mulv( localplayer.rb.to_world, (v3f){0.0f,1.0f,0.0f}, newpos );
+      v3_add( newpos, (v3f){0.0f,-1.0f,0.0f}, newpos );
+      v3_sub( localplayer.rb.co, newpos, offset );
+      v3_copy( newpos, localplayer.rb.co );
+
+      player__begin_holdout( offset );
       player__skate_kill_audio();
       player__walk_transition();
       return;
@@ -2676,7 +2683,9 @@ static void player__skate_animate(void){
                                  (1.0f-fabsf(animator->slide)*0.9f);
    animator->offset[1]=vg_clampf(animator->offset[1],-0.5f,0.0f);
 
-   v3_muls( animator->offset, 0.3f, localplayer.cam_control.tpv_offset_extra );
+   v3f cam_offset;
+   v3_mul( animator->offset, (v3f){1.0f,0.3f,1.0f}, cam_offset );
+   v3_copy( cam_offset, localplayer.cam_control.tpv_offset_extra );
 
    /* localized vectors */
    m4x3_mulv( localplayer.rb.to_local, state->cog, animator->local_cog );
@@ -2892,8 +2901,7 @@ static void player__skate_animate(void){
 }
                         
 static void player__skate_pose( void *_animator, player_pose *pose ){
-   struct player_avatar *av = localplayer.playeravatar;
-   struct skeleton *sk = &av->sk;
+   struct skeleton *sk = &localplayer.skeleton;
    struct player_skate_animator *animator = _animator;
 
    pose->type = k_player_pose_type_ik;
@@ -2975,14 +2983,14 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
    skeleton_lerp_pose( sk, ground_pose, air_pose, animator->fly, 
                        pose->keyframes );
 
-   mdl_keyframe *kf_board    = &pose->keyframes[av->id_board-1],
-                *kf_foot_l   = &pose->keyframes[av->id_ik_foot_l-1],
-                *kf_foot_r   = &pose->keyframes[av->id_ik_foot_r-1],
-                *kf_knee_l   = &pose->keyframes[av->id_ik_knee_l-1],
-                *kf_knee_r   = &pose->keyframes[av->id_ik_knee_r-1],
-                *kf_hip      = &pose->keyframes[av->id_hip-1],
-                *kf_wheels[] = { &pose->keyframes[av->id_wheel_r-1],
-                                 &pose->keyframes[av->id_wheel_l-1] };
+   mdl_keyframe *kf_board    = &pose->keyframes[localplayer.id_board-1],
+                *kf_foot_l   = &pose->keyframes[localplayer.id_ik_foot_l-1],
+                *kf_foot_r   = &pose->keyframes[localplayer.id_ik_foot_r-1],
+                *kf_knee_l   = &pose->keyframes[localplayer.id_ik_knee_l-1],
+                *kf_knee_r   = &pose->keyframes[localplayer.id_ik_knee_r-1],
+                *kf_hip      = &pose->keyframes[localplayer.id_hip-1],
+                *kf_wheels[] = { &pose->keyframes[localplayer.id_wheel_r-1],
+                                 &pose->keyframes[localplayer.id_wheel_l-1] };
 
 
    mdl_keyframe grind_pose[32];
@@ -2998,11 +3006,11 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
    float add_grab_mod = 1.0f - animator->fly;
 
    /* additive effects */
-   u32 apply_to[] = { av->id_hip, 
-                      av->id_ik_hand_l,
-                      av->id_ik_hand_r,
-                      av->id_ik_elbow_l,
-                      av->id_ik_elbow_r };
+   u32 apply_to[] = { localplayer.id_hip, 
+                      localplayer.id_ik_hand_l,
+                      localplayer.id_ik_hand_r,
+                      localplayer.id_ik_elbow_l,
+                      localplayer.id_ik_elbow_r };
 
    float apply_rates[] = { 1.0f,
                            0.75f,
@@ -3017,11 +3025,11 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
 
    /* angle 'correction' */
    v3f origin;
-   v3_add( av->sk.bones[av->id_hip].co, kf_hip->co, origin );
+   v3_add( sk->bones[localplayer.id_hip].co, kf_hip->co, origin );
 
    for( int i=0; i<vg_list_size(apply_to); i ++ ){
       mdl_keyframe *kf = &pose->keyframes[apply_to[i]-1];
-      keyframe_rotate_around( kf, origin, av->sk.bones[apply_to[i]].co,
+      keyframe_rotate_around( kf, origin, sk->bones[apply_to[i]].co,
                               animator->qfixuptotal );
    }
 
@@ -3083,14 +3091,13 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
       q_normalize( kf_wheels[i]->q );
    }
 
-#if 0
    {
       mdl_keyframe
-         *kf_head    = &pose->keyframes[av->id_head-1],
-         *kf_elbow_l = &pose->keyframes[av->id_ik_elbow_l-1],
-         *kf_elbow_r = &pose->keyframes[av->id_ik_elbow_r-1],
-         *kf_hand_l  = &pose->keyframes[av->id_ik_hand_l-1],
-         *kf_hand_r  = &pose->keyframes[av->id_ik_hand_r-1];
+         *kf_head    = &pose->keyframes[localplayer.id_head-1],
+         *kf_elbow_l = &pose->keyframes[localplayer.id_ik_elbow_l-1],
+         *kf_elbow_r = &pose->keyframes[localplayer.id_ik_elbow_r-1],
+         *kf_hand_l  = &pose->keyframes[localplayer.id_ik_hand_l-1],
+         *kf_hand_r  = &pose->keyframes[localplayer.id_ik_hand_r-1];
 
       float warble = perlin1d( vg.time, 2.0f, 2, 300 );
             warble *= vg_maxf(animator->grind, fabsf(animator->weight)) * 0.3f;
@@ -3100,31 +3107,28 @@ static void player__skate_pose( void *_animator, player_pose *pose ){
 
       v3f origin = {0.0f,0.2f,0.0f};
       keyframe_rotate_around( kf_hand_l, origin, 
-                              av->sk.bones[av->id_ik_hand_l].co, qrot );
+                              sk->bones[localplayer.id_ik_hand_l].co, qrot );
       keyframe_rotate_around( kf_hand_r, origin, 
-                              av->sk.bones[av->id_ik_hand_r].co, qrot );
+                              sk->bones[localplayer.id_ik_hand_r].co, qrot );
       keyframe_rotate_around( kf_hip, origin, 
-                              av->sk.bones[av->id_hip].co, qrot );
+                              sk->bones[localplayer.id_hip].co, qrot );
       keyframe_rotate_around( kf_elbow_r, origin, 
-                              av->sk.bones[av->id_ik_elbow_r].co, qrot );
+                              sk->bones[localplayer.id_ik_elbow_r].co, qrot );
       keyframe_rotate_around( kf_elbow_l, origin, 
-                              av->sk.bones[av->id_ik_elbow_l].co, qrot );
+                              sk->bones[localplayer.id_ik_elbow_l].co, qrot );
 
       q_inv( qrot, qrot );
       q_mul( qrot, kf_head->q, kf_head->q );
       q_normalize( kf_head->q );
    }
-#endif
 }
 
 static void player__skate_post_animate(void){
-   struct player_avatar *av = localplayer.playeravatar;
    struct player_skate_state *state = &player_skate.state;
-
    localplayer.cam_velocity_influence = 1.0f;
 
    v3f head = { 0.0f, 1.8f, 0.0f };
-   m4x3_mulv( localplayer.final_mtx[ av->id_head ], 
+   m4x3_mulv( localplayer.final_mtx[ localplayer.id_head ], 
               head, state->head_position );
    m4x3_mulv( localplayer.rb.to_local, 
               state->head_position, state->head_position );