fuck you, you cant put your couch there
authorhgn <hgodden00@gmail.com>
Fri, 31 Mar 2023 00:01:42 +0000 (01:01 +0100)
committerhgn <hgodden00@gmail.com>
Fri, 31 Mar 2023 00:01:42 +0000 (01:01 +0100)
maps_src/mp_gridmap.mdl
player_skate.c
player_skate.h
skeleton.h
sound_src/metalscrape.ogg
sound_src/slidetap.ogg
sound_src/woodimpact.ogg
sound_src/woodroll0.ogg
sound_src/woodroll1.ogg
sound_src/woodroll2.ogg
sound_src/woodslide.ogg

index 9e7a5108abcc084b7db2e6fceca5735c1469a926..5ad866944e229a4c0d9482ee000a025130064774 100644 (file)
Binary files a/maps_src/mp_gridmap.mdl and b/maps_src/mp_gridmap.mdl differ
index 446c4bff10a37ba932eb8a808ad6e1c0fd28461d..8535540b52807c2a6ce9419d91ebff5d3bc6aa4a 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "player.h"
 #include "audio.h"
+#include "vg/vg_perlin.h"
 
 VG_STATIC void player__skate_bind( player_instance *player )
 {
@@ -523,8 +524,6 @@ void player__approximate_best_trajectory( player_instance *player )
                {
                   grind_located = 1;
                   grind_located_gravity = inf->gravity;
-
-                  vg_success( "Grind located\n" );
                }
             }
          }
@@ -1031,8 +1030,6 @@ VG_STATIC void skate_apply_jump_model( player_instance *player )
       s->state.jump_charge = 0.0f;
       s->state.jump_time = vg.time;
 
-      vg_success( PRINTF_v3f( jumpdir ) );
-
       v2f steer = { player->input_js1h->axis.value,
                     player->input_js1v->axis.value };
       v2_normalize_clamp( steer );
@@ -1127,7 +1124,8 @@ VG_STATIC void skate_integrate( player_instance *player )
 {
    struct player_skate *s = &player->_skate;
 
-   float decay_rate = 1.0f - (k_rb_delta * 3.0f),
+   float decay_rate_x = 1.0f - (k_rb_delta * 3.0f),
+         decay_rate_z = decay_rate_x,
          decay_rate_y = 1.0f;
 
    if( s->state.activity >= k_skate_activity_grind_any ){
@@ -1135,13 +1133,14 @@ VG_STATIC void skate_integrate( player_instance *player )
       decay_rate = 1.0f-vg_lerpf( 3.0f, 20.0f, s->grind_strength ) * k_rb_delta;
       decay_rate_y = decay_rate;
 #endif
-      decay_rate = 1.0f-(40.0f*k_rb_delta);
+      decay_rate_x = 1.0f-(16.0f*k_rb_delta);
       decay_rate_y = 1.0f-(10.0f*k_rb_delta);
+      decay_rate_z = 1.0f-(40.0f*k_rb_delta);
    }
 
-   float wx = v3_dot( player->rb.w, player->rb.to_world[0] ) * decay_rate,
+   float wx = v3_dot( player->rb.w, player->rb.to_world[0] ) * decay_rate_x,
          wy = v3_dot( player->rb.w, player->rb.to_world[1] ) * decay_rate_y,
-         wz = v3_dot( player->rb.w, player->rb.to_world[2] ) * decay_rate;
+         wz = v3_dot( player->rb.w, player->rb.to_world[2] ) * decay_rate_z;
 
    v3_muls(                  player->rb.to_world[0], wx, player->rb.w );
    v3_muladds( player->rb.w, player->rb.to_world[1], wy, player->rb.w );
@@ -1292,15 +1291,14 @@ VG_STATIC void player__skate_post_update( player_instance *player )
             sample_type = k_skate_sample_concrete_scrape_metal;
       }
       else if( (s->state.activity == k_skate_activity_grind_back50) ||
-               (s->state.activity == k_skate_activity_grind_front50) ){
-
-         float d = v3_dot( player->rb.to_world[2], s->grind_dir );
-
+               (s->state.activity == k_skate_activity_grind_front50) )
+      {
          if( s->surface == k_surface_prop_metal ){
             sample_type = k_skate_sample_metal_scrape_generic;
          }
          else{
-            if( d > 0.70710678118654752f )
+            float a = v3_dot( player->rb.to_world[2], s->grind_dir );
+            if( fabsf(a) > 0.70710678118654752f )
                sample_type = k_skate_sample_concrete_scrape_wood;
             else 
                sample_type = k_skate_sample_concrete_scrape_metal;
@@ -2014,25 +2012,56 @@ VG_STATIC enum skate_activity skate_availible_grind( player_instance *player )
        res_front50 = 0,
        res_slide   = 0;
 
+   int allow_back  = 1,
+       allow_front = 1;
+
+   if( s->state.activity == k_skate_activity_grind_5050 || 
+       s->state.activity == k_skate_activity_grind_back50 ||
+       s->state.activity == k_skate_activity_grind_front50 )
+   {
+      float tilt = player->input_js1v->axis.value;
+
+      if( fabsf(tilt) >= 0.25f ){
+         v3f raw = {0.0f,0.0f,tilt};
+         m3x3_mulv( player->rb.to_world, raw, raw );
+
+         float way = player->input_js1v->axis.value *
+                        vg_signf( v3_dot( raw, player->rb.v ) );
+
+         if( way < 0.0f ) allow_front = 0;
+         else allow_back = 0;
+      }
+   }
+
    if( s->state.activity == k_skate_activity_grind_boardslide ){
       res_slide = skate_boardslide_renew( player, &inf_slide );
    }
    else if( s->state.activity == k_skate_activity_grind_back50 ){
       res_back50  = skate_grind_truck_renew( player,  1.0f, &inf_back50 );
-      res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
+
+      if( allow_front )
+         res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
    }
    else if( s->state.activity == k_skate_activity_grind_front50 ){
       res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 );
-      res_back50  = skate_grind_truck_entry( player,  1.0f, &inf_back50 );
+
+      if( allow_back )
+         res_back50  = skate_grind_truck_entry( player,  1.0f, &inf_back50 );
    }
    else if( s->state.activity == k_skate_activity_grind_5050 ){
-      res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 );
-      res_back50  = skate_grind_truck_entry( player,  1.0f, &inf_back50 );
+      if( allow_front )
+         res_front50 = skate_grind_truck_renew( player, -1.0f, &inf_front50 );
+      if( allow_back )
+         res_back50  = skate_grind_truck_renew( player,  1.0f, &inf_back50 );
    }
    else{
       res_slide   = skate_boardslide_entry( player, &inf_slide );
-      res_back50  = skate_grind_truck_entry( player,  1.0f, &inf_back50 );
-      res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
+
+      if( allow_back )
+         res_back50  = skate_grind_truck_entry( player,  1.0f, &inf_back50 );
+
+      if( allow_front )
+         res_front50 = skate_grind_truck_entry( player, -1.0f, &inf_front50 );
 
       if( res_back50 != res_front50 ){
          int wants_to_do_that = fabsf(player->input_js1v->axis.value) >= 0.25f;
@@ -2806,6 +2835,16 @@ VG_STATIC void player__skate_animate( player_instance *player,
    skeleton_lerp_pose( sk, ground_pose, air_pose, s->blend_fly, dest->pose );
 
 
+   mdl_keyframe *kf_board    = &dest->pose[av->id_board-1],
+                *kf_foot_l   = &dest->pose[av->id_ik_foot_l-1],
+                *kf_foot_r   = &dest->pose[av->id_ik_foot_r-1],
+                *kf_knee_l   = &dest->pose[av->id_ik_knee_l-1],
+                *kf_knee_r   = &dest->pose[av->id_ik_knee_r-1],
+                *kf_hip      = &dest->pose[av->id_hip-1],
+                *kf_wheels[] = { &dest->pose[av->id_wheel_r-1],
+                                 &dest->pose[av->id_wheel_l-1] };
+
+
    mdl_keyframe grind_pose[32];
    {
       /* TODO: factor balance into this sampler */
@@ -2901,15 +2940,8 @@ VG_STATIC void player__skate_animate( player_instance *player,
          for( int i=0; i<vg_list_size(apply_to); i ++ ){
             mdl_keyframe *kf = &dest->pose[apply_to[i]-1];
 
-            v3f v0, co;
-            v3_add( kf->co, av->sk.bones[apply_to[i]].co, co );
-            v3_sub( co, origin, v0 );
-            q_mulv( qtotal, v0, v0 );
-            v3_add( v0, origin, co );
-            v3_sub( co, av->sk.bones[apply_to[i]].co, kf->co );
-
-            q_mul( qtotal, kf->q, kf->q );
-            q_normalize( kf->q );
+            keyframe_rotate_around( kf, origin, av->sk.bones[apply_to[i]].co,
+                                    qtotal );
          }
 
          v3f p1, p2;
@@ -2918,18 +2950,8 @@ VG_STATIC void player__skate_animate( player_instance *player,
 
          vg_line_arrow( player->rb.co, p1, 0.25f, VG__PINK );
          vg_line_arrow( player->rb.co, p2, 0.25f, VG__PINK );
-      }
-
 
-
-      mdl_keyframe *kf_board    = &dest->pose[av->id_board-1],
-                   *kf_foot_l   = &dest->pose[av->id_ik_foot_l-1],
-                   *kf_foot_r   = &dest->pose[av->id_ik_foot_r-1],
-                   *kf_knee_l   = &dest->pose[av->id_ik_knee_l-1],
-                   *kf_knee_r   = &dest->pose[av->id_ik_knee_r-1],
-                   *kf_hip      = &dest->pose[av->id_hip-1],
-                   *kf_wheels[] = { &dest->pose[av->id_wheel_r-1],
-                                    &dest->pose[av->id_wheel_l-1] };
+      }
 
       v4f qtotal;
       v4f qtrickr, qyawr, qpitchr, qrollr;
@@ -2980,11 +3002,14 @@ VG_STATIC void player__skate_animate( player_instance *player,
          kf_foot_l->co[2] += s->blend_weight * 0.1f;
       }
 
+      float slapm = vg_maxf( 1.0f-v3_length2( s->state.trick_vel ), 0.0f );
+      s->subslap = vg_lerpf( s->subslap, slapm, vg.time_delta*10.0f );
+
       kf_foot_l->co[1] += s->state.slap;
       kf_foot_r->co[1] += s->state.slap;
       kf_knee_l->co[1] += s->state.slap;
       kf_knee_r->co[1] += s->state.slap;
-      kf_board->co[1] += s->state.slap;
+      kf_board->co[1] += s->state.slap * s->subslap;
       kf_hip->co[1] += s->state.slap * 0.25f;
 
       /* 
@@ -3007,6 +3032,37 @@ VG_STATIC void player__skate_animate( player_instance *player,
       }
    }
 
+   {
+      mdl_keyframe
+                *kf_head    = &dest->pose[av->id_head-1],
+                *kf_elbow_l = &dest->pose[av->id_ik_elbow_l-1],
+                *kf_elbow_r = &dest->pose[av->id_ik_elbow_r-1],
+                *kf_hand_l  = &dest->pose[av->id_ik_hand_l-1],
+                *kf_hand_r  = &dest->pose[av->id_ik_hand_r-1];
+
+      float warble = perlin1d( vg.time, 2.0f, 2, 300 );
+            warble *= vg_maxf(s->blend_grind,fabsf(s->blend_weight)) * 0.3f;
+
+      v4f qrot;
+      q_axis_angle( qrot, (v3f){0.8f,0.7f,0.6f}, warble );
+
+      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 );
+      keyframe_rotate_around( kf_hand_r, origin, 
+                              av->sk.bones[av->id_ik_hand_r].co, qrot );
+      keyframe_rotate_around( kf_hip, origin, 
+                              av->sk.bones[av->id_hip].co, qrot );
+      keyframe_rotate_around( kf_elbow_r, origin, 
+                              av->sk.bones[av->id_ik_elbow_r].co, qrot );
+      keyframe_rotate_around( kf_elbow_l, origin, 
+                              av->sk.bones[av->id_ik_elbow_l].co, qrot );
+
+      q_inv( qrot, qrot );
+      q_mul( qrot, kf_head->q, kf_head->q );
+      q_normalize( kf_head->q );
+   }
+
    /* transform */
    rb_extrapolate( &player->rb, dest->root_co, dest->root_q );
    v3_muladds( dest->root_co, player->rb.to_world[1], -0.1f, dest->root_co );
@@ -3080,33 +3136,22 @@ VG_STATIC void player__skate_clear_mechanics( player_instance *player )
    struct player_skate *s = &player->_skate;
    s->state.jump_charge    = 0.0f;
    s->state.flip_rate      = 0.0f;
-#if 0
-   s->state.steery         = 0.0f;
-   s->state.steerx         = 0.0f;
-   s->state.steery_s       = 0.0f;
-   s->state.steerx_s       = 0.0f;
-#endif
    s->state.reverse        = 0.0f;
    s->state.slip           = 0.0f;
    v3_copy( player->rb.co, s->state.prev_pos );
-
-#if 0
-   m3x3_identity( s->state.velocity_bias );
-   m3x3_identity( s->state.velocity_bias_pstep );
-#endif
-
+   v4_copy( player->rb.q, s->state.smoothed_rotation );
    v3_zero( s->state.throw_v );
    v3_zero( s->state.trick_vel );
    v3_zero( s->state.trick_euler );
+   v3_zero( s->state.cog_v );
+   v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog );
 }
 
 VG_STATIC void player__skate_reset( player_instance *player,
                                     ent_spawn *rp )
 {
    struct player_skate *s = &player->_skate;
-   v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog );
    v3_zero( player->rb.v );
-   v3_zero( s->state.cog_v );
    v4_copy( rp->transform.q, player->rb.q );
 
    s->state.activity = k_skate_activity_air;
index 9f21115eee71e0f4318873f47eb77f925571ef67..0f99fdbb8d3a87a0c9053e6560fbf90d441fa3c7 100644 (file)
@@ -95,7 +95,8 @@ struct player_skate
          blend_push,
          blend_jump,
          blend_airdir,
-         blend_weight;
+         blend_weight,
+         subslap;
 
    /* vectors representing the direction of the axels in localspace */
    v3f truckv0[2];
index 2fcfb5023f171540b517c989a918914061a8c754..2595cda8c6476254700f6da43eac496dd4ffbd24 100644 (file)
@@ -73,6 +73,22 @@ VG_STATIC void keyframe_copy_pose( mdl_keyframe *kfa, mdl_keyframe *kfb,
       kfb[i] = kfa[i];
 }
 
+
+/* apply a rotation from the perspective of root */
+VG_STATIC void keyframe_rotate_around( mdl_keyframe *kf, 
+                                       v3f origin, v3f offset, v4f q )
+{
+   v3f v0, co;
+   v3_add( kf->co, offset, co );
+   v3_sub( co, origin, v0 );
+   q_mulv( q, v0, v0 );
+   v3_add( v0, origin, co );
+   v3_sub( co, offset, kf->co );
+
+   q_mul( q, kf->q, kf->q );
+   q_normalize( kf->q );
+}
+
 /*
  * Lerp between two sets of keyframes and store in dest. Rotations use Nlerp.
  */
index 64f8b39c935f4cd68ceb339291c5b4e0125dbd0c..c6448c50faabe34460b139494f770088ec3c51f1 100644 (file)
Binary files a/sound_src/metalscrape.ogg and b/sound_src/metalscrape.ogg differ
index 34cceab88997370d7dcf0975f8dd339b2c37aea3..72a070d04bb2500964d299cf8495c1c93c7318a3 100644 (file)
Binary files a/sound_src/slidetap.ogg and b/sound_src/slidetap.ogg differ
index 439ec310e93a51b8092707f582be0d2be8ec0c8d..ae56fd17b6e9fcd2a300d5788f3aa0ad688ffc4b 100644 (file)
Binary files a/sound_src/woodimpact.ogg and b/sound_src/woodimpact.ogg differ
index 3e204e2adcda9c7672dbcfbe83340285a92e3632..b512134d0e311561fd66f8e4fe2d4413898c2c3f 100644 (file)
Binary files a/sound_src/woodroll0.ogg and b/sound_src/woodroll0.ogg differ
index d05a9fad4fde29635e40c05d64a1ce361b57fb88..e7b31f2f22887cf938a16e2765ac503979668730 100644 (file)
Binary files a/sound_src/woodroll1.ogg and b/sound_src/woodroll1.ogg differ
index 060e84264153b481cb781ed92bf05460434e1844..9bf862978b5ab81642d5d41f6d50e666c05d352f 100644 (file)
Binary files a/sound_src/woodroll2.ogg and b/sound_src/woodroll2.ogg differ
index 9946a6b0e201db0d5a8cef1f8e1ffb5b4d9f55f8..23602e3c0683e1111520c506cd9a61f9a67b7663 100644 (file)
Binary files a/sound_src/woodslide.ogg and b/sound_src/woodslide.ogg differ