skateshop basics
[carveJwlIkooP6JGAAIwe30JlM.git] / player_skate.c
index c300b3f579a67c95a1b95663d00d5b89b461726d..9b1aea11a47c83f7b35af6553dcecfc0287919f3 100644 (file)
@@ -124,15 +124,15 @@ VG_STATIC int skate_grind_scansq( player_instance *player,
    v3_normalize( support_axis );
    
    while( bh_next( world->geo_bh, &it, box, &idx ) ){
-      u32 *ptri = &world->scene_geo->arrindices[ idx*3 ];
+      u32 *ptri = &world->scene_geo.arrindices[ idx*3 ];
       v3f tri[3];
 
       struct world_surface *surf = world_tri_index_surface(world,ptri[0]);
-      if( !(surf->info.flags & k_material_flag_skate_surface) )
+      if( !(surf->info.flags & k_material_flag_grindable) )
          continue;
 
       for( int j=0; j<3; j++ )
-         v3_copy( world->scene_geo->arrvertices[ptri[j]].co, tri[j] );
+         v3_copy( world->scene_geo.arrvertices[ptri[j]].co, tri[j] );
 
       for( int j=0; j<3; j++ ){
          int i0 = j,
@@ -519,7 +519,7 @@ void player__approximate_best_trajectory( player_instance *player )
             v3_copy( co, inf->log[ inf->log_length ++ ] ); 
 
             v3_copy( n, inf->n );
-            u32 *tri = &trace_world->scene_geo->arrindices[ idx*3 ];
+            u32 *tri = &trace_world->scene_geo.arrindices[ idx*3 ];
             struct world_surface *surf = 
                world_tri_index_surface( trace_world, tri[0] );
 
@@ -532,11 +532,13 @@ void player__approximate_best_trajectory( player_instance *player )
             inf->score = -v3_dot( ve, inf->n );
             inf->land_dist = t + k_trace_delta * t1;
 
-            
             /* Bias prediction towords ramps */
-            if( !(surf->info.flags & k_material_flag_skate_surface) )
+            if( !(surf->info.flags & k_material_flag_skate_target) )
                inf->score *= 10.0f;
 
+            if( surf->info.flags & k_material_flag_boundary )
+               s->possible_jump_count --;
+
             break;
          }
          
@@ -1161,7 +1163,7 @@ VG_STATIC void player__skate_post_update( player_instance *player )
       jump_info *jump = &s->possible_jumps[i];
 
       if( jump->log_length == 0 ){
-         vg_fatal_exit_loop( "assert: jump->log_length == 0\n" );
+         vg_fatal_error( "assert: jump->log_length == 0\n" );
       }
       
       for( int j=0; j<jump->log_length - 1; j ++ ){
@@ -1402,11 +1404,11 @@ int skate_compute_surface_alignment( player_instance *player,
 
       if( idx != -1 )
       {
-         u32 *tri = &world->scene_geo->arrindices[ idx * 3 ];
+         u32 *tri = &world->scene_geo.arrindices[ idx * 3 ];
          v3f verts[3];
 
          for( int j=0; j<3; j++ )
-            v3_copy( world->scene_geo->arrvertices[ tri[j] ].co, verts[j] );
+            v3_copy( world->scene_geo.arrvertices[ tri[j] ].co, verts[j] );
 
          v3f vert0, vert1, n;
          v3_sub( verts[1], verts[0], vert0 );
@@ -1949,7 +1951,7 @@ VG_STATIC enum skate_activity skate_availible_grind( player_instance *player )
    struct player_skate *s = &player->_skate;
 
    if( s->grind_cooldown > 100 ){
-      vg_fatal_exit_loop( "wth!\n" );
+      vg_fatal_error( "wth!\n" );
    }
 
    /* debounces this state manager a little bit */
@@ -2955,15 +2957,22 @@ VG_STATIC void player__skate_animate( player_instance *player,
       q_mul( kf_board->q, qtrick, kf_board->q );
       q_normalize( kf_board->q );
 
-
-      /* foot weight distribution */
-      if( s->blend_weight > 0.0f ){
-         kf_foot_l->co[2] += s->blend_weight * 0.2f;
-         kf_foot_r->co[2] += s->blend_weight * 0.1f;
-      }
-      else{
-         kf_foot_r->co[2] += s->blend_weight * 0.3f;
-         kf_foot_l->co[2] += s->blend_weight * 0.1f;
+      struct player_board *board = player->board;
+      
+      if( board ){
+         /* foot weight distribution */
+         if( s->blend_weight > 0.0f ){
+            kf_foot_l->co[2] = 
+               vg_lerpf( kf_foot_l->co[2], 
+                         board->truck_positions[k_board_truck_back][2]+0.3f, 
+                         0.5f*s->blend_weight );
+         }
+         else{
+            kf_foot_r->co[2] = 
+               vg_lerpf( kf_foot_r->co[2], 
+                         board->truck_positions[k_board_truck_front][2]-0.3f, 
+                         -0.5f*s->blend_weight );
+         }
       }
 
       float slapm = vg_maxf( 1.0f-v3_length2( s->state.trick_vel ), 0.0f );
@@ -3029,14 +3038,17 @@ VG_STATIC void player__skate_animate( player_instance *player,
 
    /* 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 );
 
-   float substep = vg.time_fixed_extrapolate;
+   v3f ext_up,ext_co;
+   q_mulv( dest->root_q, (v3f){0.0f,1.0f,0.0f}, ext_up );
+   v3_copy( dest->root_co, ext_co );
+   v3_muladds( dest->root_co, ext_up, -0.1f, dest->root_co );
 
    v4f qflip;
    if( (s->state.activity <= k_skate_activity_air_to_grind) &&
        (fabsf(s->state.flip_rate) > 0.01f) )
    {
+      float substep = vg.time_fixed_extrapolate;
       float t     = s->state.flip_time+s->state.flip_rate*substep*k_rb_delta;
             sign  = vg_signf( t );
 
@@ -3054,7 +3066,7 @@ VG_STATIC void player__skate_animate( player_instance *player,
       q_normalize( dest->root_q );
 
       v3f rotation_point, rco;
-      v3_muladds( player->rb.co, player->rb.to_world[1], 0.5f, rotation_point );
+      v3_muladds( ext_co, ext_up, 0.5f, rotation_point );
       v3_sub( dest->root_co, rotation_point, rco );
       
       q_mulv( qflip, rco, rco );
@@ -3075,6 +3087,8 @@ VG_STATIC void player__skate_post_animate( player_instance *player )
    m4x3_mulv( av->sk.final_mtx[ av->id_head ], head, s->state.head_position );
    m4x3_mulv( player->rb.to_local, s->state.head_position, 
                                    s->state.head_position );
+
+   /* TODO: Extrapolate to_local matrix? */
 }
 
 VG_STATIC void player__skate_reset_animator( player_instance *player )