+ jump_info grind_jumps[2];
+
+ int valid_count =
+ create_jumps_to_hit_target( player, grind_jumps, grind.co,
+ 0.175f*VG_PIf, grind_located_gravity );
+
+ /* knock out original landing points in the 1m area */
+ for( u32 j=0; j<s->possible_jump_count; j++ ){
+ jump_info *jump = &s->possible_jumps[ j ];
+ float dist = v3_dist2( jump->log[jump->log_length-1], grind.co );
+ float descale = 1.0f-vg_minf(1.0f,dist);
+ jump->score += descale*3.0f;
+ }
+
+ for( int i=0; i<valid_count; i++ ){
+ jump_info *jump = &grind_jumps[i];
+ jump->type = k_prediction_grind;
+
+ v3f launch_v, launch_co, co0, co1;
+
+ v3_copy( jump->v, launch_v );
+ v3_copy( player->rb.co, launch_co );
+
+ m3x3f basis;
+ m3x3_copy( player->basis, basis );
+
+ float t = 0.05f * jump->land_dist;
+ v3_muls( launch_v, t, co0 );
+ v3_muladds( co0, basis[1], -0.5f * jump->gravity * t*t, co0 );
+ v3_add( launch_co, co0, co0 );
+
+ /* rough scan to make sure we dont collide with anything */
+ for( int j=1; j<=16; j++ ){
+ t = (float)j*(1.0f/16.0f);
+ t *= 0.9f;
+ t += 0.05f;
+ t *= jump->land_dist;
+
+ v3_muls( launch_v, t, co1 );
+ v3_muladds( co1, basis[1], -0.5f * jump->gravity * t*t, co1 );
+ v3_add( launch_co, co1, co1 );
+
+ float t1;
+ v3f n;
+
+ int idx = spherecast_world( world0, co0,co1,
+ k_board_radius*0.1f, &t1, n);
+ if( idx != -1 ){
+ goto invalidated_grind;
+ }
+
+ v3_copy( co1, co0 );
+ }