seperation of body initialization, glider model
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.c
index 6d9aa924a1cbfc00dcb51bcb2828882c94675884..0cd5e35bd510a4b28d7d98e5761e82ee70dc7ad2 100644 (file)
@@ -12,7 +12,7 @@
 
 static void player__skate_bind(void){
    struct skeleton *sk = &localplayer.skeleton;
-   rb_update_transform( &localplayer.rb );
+   rb_update_matrices( &localplayer.rb );
 
    struct { struct skeleton_anim **anim; const char *name; }
    bindings[] = {
@@ -61,11 +61,11 @@ static void player__skate_kill_audio(void){
  * Does collision detection on a sphere vs world, and applies some smoothing
  * filters to the manifold afterwards
  */
-static int skate_collide_smooth( m4x3f mtx, rb_sphere *sphere, rb_ct *man ){
+static int skate_collide_smooth( m4x3f mtx, f32 r, rb_ct *man ){
    world_instance *world = world_current_instance();
 
    int len = 0;
-   len = rb_sphere__scene( mtx, sphere, NULL, &world->rb_geo.inf.scene, man,
+   len = rb_sphere__scene( mtx, r, NULL, world->geo_bh, man,
                            k_material_flag_walking );
 
    for( int i=0; i<len; i++ ){
@@ -1146,7 +1146,7 @@ static void skate_integrate(void){
                localplayer.rb.w );
 
    state->flip_time += state->flip_rate * k_rb_delta;
-   rb_update_transform( &localplayer.rb );
+   rb_update_matrices( &localplayer.rb );
 }
 
 static enum trick_type player_skate_trick_input(void){
@@ -1209,7 +1209,7 @@ static void player__skate_pre_update(void){
       m3x3_q( transfer, qtransfer );
       q_mul( qtransfer, state->store_smoothed, state->smoothed_rotation );
       q_normalize( state->smoothed_rotation );
-      rb_update_transform( &localplayer.rb );
+      rb_update_matrices( &localplayer.rb );
 
       if( end ){
          state->activity = k_skate_activity_air;
@@ -1222,6 +1222,13 @@ static void player__skate_pre_update(void){
 
       if( state->activity <= k_skate_activity_air_to_grind ){
          localplayer.subsystem = k_player_subsystem_glide;
+
+         v3_copy( localplayer.rb.co, player_glide.rb.co );
+         v4_copy( localplayer.rb.q,  player_glide.rb.q );
+         v3_copy( localplayer.rb.v,  player_glide.rb.v );
+         v3_copy( localplayer.rb.w,  player_glide.rb.w );
+         rb_update_matrices( &player_glide.rb );
+
          player__begin_holdout( (v3f){0,0,0} );
          return;
       }
@@ -2466,7 +2473,7 @@ begin_collision:;
       v3_add( localplayer.rb.co, cg_offset, localplayer.rb.co );
    }
 
-   rb_update_transform( &localplayer.rb );
+   rb_update_matrices( &localplayer.rb );
    localplayer.rb.v[1] += -state->gravity_bias * player_skate.substep_delta;
 
    player_skate.substep -= player_skate.substep_delta;
@@ -2486,7 +2493,7 @@ begin_collision:;
                           k_material_flag_walking ) != -1) )
    {
       v3_lerp( start_co, localplayer.rb.co, t, localplayer.rb.co );
-      rb_update_transform( &localplayer.rb );
+      rb_update_matrices( &localplayer.rb );
 
       player__dead_transition( k_player_die_type_head );
       return;
@@ -2504,12 +2511,10 @@ begin_collision:;
       m4x3f mtx;
       m3x3_identity( mtx );
       m4x3_mulv( localplayer.rb.to_world, wheels[i].pos, mtx[3] );
-      
-      rb_sphere collider = { .radius = wheels[i].radius };
 
       rb_ct *man = &manifold[ manifold_len ];
 
-      int l = skate_collide_smooth( mtx, &collider, man );
+      int l = skate_collide_smooth( mtx, wheels[i].radius, man );
       if( l )
          wheels[i].state = k_collider_state_colliding;
 
@@ -2517,8 +2522,8 @@ begin_collision:;
    }
 
    float grind_radius = k_board_radius * 0.75f;
-   rb_capsule capsule = { .height = (k_board_length+0.2f)*2.0f, 
-                          .radius=grind_radius };
+   rb_capsule capsule = { .h = (k_board_length+0.2f)*2.0f, 
+                          .r = grind_radius };
    m4x3f mtx;
    v3_muls( localplayer.rb.to_world[0],  1.0f, mtx[0] );
    v3_muls( localplayer.rb.to_world[2], -1.0f, mtx[1] );
@@ -2528,7 +2533,7 @@ begin_collision:;
 
    rb_ct *cman = &manifold[manifold_len];
 
-   int l = rb_capsule__scene( mtx, &capsule, NULL, &world->rb_geo.inf.scene,
+   int l = rb_capsule__scene( mtx, &capsule, NULL, world->geo_bh,
                               cman, k_material_flag_walking );
 
    /* weld joints */
@@ -2540,7 +2545,7 @@ begin_collision:;
    manifold_len += l;
 
    if( vg_lines.draw )
-      vg_line_capsule( mtx, capsule.radius, capsule.height, VG__WHITE );
+      vg_line_capsule( mtx, capsule.r, capsule.h, VG__WHITE );
 
    /* add limits */
    if( state->activity >= k_skate_activity_grind_any ){
@@ -2640,7 +2645,7 @@ begin_collision:;
    v3f dt;
    rb_depenetrate( manifold, manifold_len, dt );
    v3_add( dt, localplayer.rb.co, localplayer.rb.co );
-   rb_update_transform( &localplayer.rb );
+   rb_update_matrices( &localplayer.rb );
 
    substep_count ++;
 
@@ -2710,7 +2715,9 @@ begin_collision:;
       q_mul( transport_rotation, localplayer.rb.q, localplayer.rb.q );
       q_mul( transport_rotation, state->smoothed_rotation,
                                  state->smoothed_rotation );
-      rb_update_transform( &localplayer.rb );
+      q_normalize( localplayer.rb.q );
+      q_normalize( state->smoothed_rotation );
+      rb_update_matrices( &localplayer.rb );
       player__pass_gate( id );
    }