v3_cross( plane, player->basis[1], support_axis );
v3_normalize( support_axis );
- while( bh_next( world->geo_bh, &it, box, &idx ) )
- {
+ while( bh_next( world->geo_bh, &it, box, &idx ) ){
u32 *ptri = &world->scene_geo->arrindices[ idx*3 ];
v3f tri[3];
- struct world_material *mat = world_tri_index_material(world,ptri[0]);
- if( !(mat->info.flags & k_material_flag_skate_surface) )
+ struct world_surface *surf = world_tri_index_surface(world,ptri[0]);
+ if( !(surf->info.flags & k_material_flag_skate_surface) )
continue;
for( int j=0; j<3; j++ )
v3_copy( world->scene_geo->arrvertices[ptri[j]].co, tri[j] );
- for( int j=0; j<3; j++ )
- {
+ for( int j=0; j<3; j++ ){
int i0 = j,
i1 = (j+1) % 3;
struct grind_sample *sample = &samples[ sample_count ];
v3f co;
- if( plane_segment( plane, tri[i0], tri[i1], co ) )
- {
+ if( plane_segment( plane, tri[i0], tri[i1], co ) ){
v3f d;
v3_sub( co, pos, d );
if( v3_length2( d ) > r*r )
int passed_samples = 0;
- for( int i=0; i<sample_count-1; i++ )
- {
+ for( int i=0; i<sample_count-1; i++ ){
struct grind_sample *si, *sj;
si = &samples[i];
- for( int j=i+1; j<sample_count; j++ )
- {
+ for( int j=i+1; j<sample_count; j++ ){
if( i == j )
continue;
p->land_dist = t + k_trace_delta * t1;
u32 vert_index = world->scene_geo->arrindices[ idx*3 ];
- struct world_material *mat =
- world_tri_index_material( world, vert_index );
+ struct world_surface *surf =
+ world_tri_index_surface( world, vert_index );
/* Bias prediction towords ramps */
- if( !(mat->info.flags & k_material_flag_skate_surface) )
+ if( !(surf->info.flags & k_material_flag_skate_surface) )
p->score *= 10.0f;
break;
s->prediction_count --;
}
- if( grind_located )
- {
+ if( grind_located ){
/* calculate the exact solution(s) to jump onto that grind spot */
struct land_prediction *p = &s->predictions[ s->prediction_count ];
p->gravity = k_gravity;
- if( solve_prediction_for_target( player, grind.co, 0.125f*VG_PIf, p ) )
- {
+ if( solve_prediction_for_target( player, grind.co, 0.125f*VG_PIf, p ) ){
v3_copy( grind.n, p->n );
/* determine score */
struct land_prediction *best = NULL;
- for( int i=0; i<s->prediction_count; i ++ )
- {
+ for( int i=0; i<s->prediction_count; i ++ ){
struct land_prediction *p = &s->predictions[i];
if( p->score < score_min )
score_max = vg_maxf( score_max, p->score );
}
- for( int i=0; i<s->prediction_count; i ++ )
- {
+ for( int i=0; i<s->prediction_count; i ++ ){
struct land_prediction *p = &s->predictions[i];
float s = p->score;
p->colour |= 0xff000000;
}
- if( best )
- {
+ if( best ){
v3_copy( best->n, s->land_normal );
v3_copy( best->v, player->rb.v );
s->land_dist = best->land_dist;
v2_normalize_clamp( steer );
s->state.gravity_bias = best->gravity;
- if( (fabsf(steer[1]) > 0.5f) && (s->land_dist >= 1.5f) )
- {
+ if( (fabsf(steer[1]) > 0.5f) && (s->land_dist >= 1.5f) ){
s->state.flip_rate = (1.0f/s->land_dist) * vg_signf(steer[1]) *
s->state.reverse ;
s->state.flip_time = 0.0f;
v3_copy( player->rb.to_world[0], s->state.flip_axis );
}
- else
- {
+ else{
s->state.flip_rate = 0.0f;
v3_zero( s->state.flip_axis );
}
}
- else
- {
+ else{
v3_copy( player->basis[1], s->land_normal );
}
}
v3_muladds( s->board_trick_residuald, s->board_trick_residualv,
k_rb_delta, s->board_trick_residuald );
- if( s->state.activity == k_skate_activity_air )
- {
+ if( s->state.activity == k_skate_activity_air ){
if( v3_length2( s->state.trick_vel ) < 0.0001f )
return;
float min_rate = 99999.0f;
- for( int i=0; i<3; i++ )
- {
+ for( int i=0; i<3; i++ ){
float v = s->state.trick_vel[i];
if( (v > 0.0f) && (v < min_rate) )
min_rate = v;
v3_muladds( s->state.trick_euler, s->state.trick_vel, k_rb_delta,
s->state.trick_euler );
- if( !carry_on && (s->state.trick_time + k_rb_delta >= next_end) )
- {
+ if( !carry_on && (s->state.trick_time + k_rb_delta >= next_end) ){
s->state.trick_time = 0.0f;
s->state.trick_euler[0] = roundf( s->state.trick_euler[0] );
s->state.trick_euler[1] = roundf( s->state.trick_euler[1] );
s->state.trick_time += k_rb_delta;
}
- else
- {
+ else{
if( (v3_length2(s->state.trick_vel) >= 0.0001f ) &&
s->state.trick_time > 0.2f)
{
float grabt = player->input_grab->axis.value;
- if( grabt > 0.5f )
- {
+ if( grabt > 0.5f ){
v2_muladds( s->state.grab_mouse_delta, vg.mouse_delta, 0.02f,
s->state.grab_mouse_delta );
float rate = 26.0f,
top = 1.0f;
- if( s->state.activity == k_skate_activity_air )
- {
+ if( s->state.activity == k_skate_activity_air ){
rate = 6.0f * fabsf(steer);
top = 1.5f;
}
- else
- {
+ else{
/* rotate slower when grabbing on ground */
steer *= (1.0f-(s->state.jump_charge+grab)*0.4f);
- if( s->state.activity == k_skate_activity_grind_5050 )
- {
+ if( s->state.activity == k_skate_activity_grind_5050 ){
rate = 0.0f;
top = 0.0f;
}
- else if( s->state.activity >= k_skate_activity_grind_any )
- {
+ else if( s->state.activity >= k_skate_activity_grind_any ){
rate *= fabsf(steer);
float a = 0.8f * -steer * k_rb_delta;
v3_normalize( s->grind_vec );
}
- else if( s->state.manual_direction )
- {
+ else if( s->state.manual_direction ){
rate = 35.0f;
top = 1.5f;
}
/* Pushing additive force */
- if( !player->input_jump->button.value )
- {
+ if( !player->input_jump->button.value ){
if( player->input_push->button.value ||
(vg.time-s->state.start_push<0.75) )
{
s->state.charging_jump = player->input_jump->button.value;
/* Cannot charge this in air */
- if( s->state.activity == k_skate_activity_air )
- {
+ if( s->state.activity == k_skate_activity_air ){
s->state.charging_jump = 0;
return;
}
- if( s->state.charging_jump )
- {
+ if( s->state.charging_jump ){
s->state.jump_charge += k_rb_delta * k_jump_charge_speed;
if( !charging_jump_prev )
s->state.jump_dir = s->state.reverse>0.0f? 1: 0;
}
- else
- {
+ else{
s->state.jump_charge -= k_jump_charge_speed * k_rb_delta;
}
s->state.jump_charge = vg_clampf( s->state.jump_charge, 0.0f, 1.0f );
/* player let go after charging past 0.2: trigger jump */
- if( (!s->state.charging_jump) && (s->state.jump_charge > 0.2f) )
- {
+ if( (!s->state.charging_jump) && (s->state.jump_charge > 0.2f) ){
v3f jumpdir;
/* Launch more up if alignment is up else improve velocity */
{
struct player_skate *s = &player->_skate;
- if( s->state.activity != k_skate_activity_ground )
- {
+ if( s->state.activity != k_skate_activity_ground ){
v3_zero( s->state.throw_v );
return;
}
*
* TODO: Max speed boost
*/
- if( player->input_grab->axis.value > 0.5f )
- {
- if( s->state.activity == k_skate_activity_ground )
- {
+ if( player->input_grab->axis.value > 0.5f ){
+ if( s->state.activity == k_skate_activity_ground ){
/* Throw */
v3_muls( player->rb.to_world[1], k_mmthrow_scale, s->state.throw_v );
}
}
- else
- {
+ else{
/* Collect */
float doty = v3_dot( player->rb.to_world[1], s->state.throw_v );
v3f Fl, Fv;
v3_muladds( s->state.throw_v, player->rb.to_world[1], -doty, Fl);
- if( s->state.activity == k_skate_activity_ground )
- {
+ if( s->state.activity == k_skate_activity_ground ){
v3_muladds( player->rb.v, Fl, k_mmcollect_lat, player->rb.v );
v3_muladds( s->state.throw_v, Fl, -k_mmcollect_lat, s->state.throw_v );
}
}
/* Decay */
- if( v3_length2( s->state.throw_v ) > 0.0001f )
- {
+ if( v3_length2( s->state.throw_v ) > 0.0001f ){
v3f dir;
v3_copy( s->state.throw_v, dir );
v3_normalize( dir );
float decay_rate = 1.0f - (k_rb_delta * 3.0f),
decay_rate_y = 1.0f;
- if( s->state.activity >= k_skate_activity_grind_any )
- {
+ if( s->state.activity >= k_skate_activity_grind_any ){
decay_rate = 1.0f-vg_lerpf( 3.0f, 20.0f, s->grind_strength ) * k_rb_delta;
decay_rate_y = decay_rate;
}
{
struct player_skate *s = &player->_skate;
- if( vg_input_button_down( player->input_use ) )
- {
+ if( vg_input_button_down( player->input_use ) ){
player->subsystem = k_player_subsystem_walk;
v3f angles;
return;
}
- if( vg_input_button_down( player->input_reset ) )
- {
+ if( vg_input_button_down( player->input_reset ) ){
player->rb.co[1] += 2.0f;
s->state.cog[1] += 2.0f;
q_axis_angle( player->rb.q, (v3f){1.0f,0.0f,0.0f}, VG_PIf * 0.25f );
if( (s->state.activity == k_skate_activity_air) &&
(trick_id = player_skate_trick_input( player )) )
{
- if( (vg.time - s->state.jump_time) < 0.1f )
- {
+ if( (vg.time - s->state.jump_time) < 0.1f ){
v3_zero( s->state.trick_vel );
s->state.trick_time = 0.0f;
- if( trick_id == 1 )
- {
+ if( trick_id == 1 ){
s->state.trick_vel[0] = 3.0f;
}
- else if( trick_id == 2 )
- {
+ else if( trick_id == 2 ){
s->state.trick_vel[2] = 3.0f;
}
- else if( trick_id == 3 )
- {
+ else if( trick_id == 3 ){
s->state.trick_vel[0] = 2.0f;
s->state.trick_vel[2] = 2.0f;
}
audio_set_lfo_wave( 0, k_lfo_polynomial_bipolar,
vg_lerpf( 250.0f, 80.0f, attn ) );
- if( s->aud_main )
- {
+ if( s->aud_main ){
s->aud_main->colour = 0x00103efe;
audio_channel_set_spacial( s->aud_main, player->rb.co, 40.0f );
audio_channel_slope_volume( s->aud_main, 0.05f, vol_main );
audio_channel_set_sampling_rate( s->aud_main, rate );
}
- if( s->aud_slide )
- {
+ if( s->aud_slide ){
s->aud_slide->colour = 0x00103efe;
audio_channel_set_spacial( s->aud_slide, player->rb.co, 40.0f );
audio_channel_slope_volume( s->aud_slide, 0.05f, vol_slide );
audio_channel_sidechain_lfo( s->aud_slide, 0, sidechain_amt );
}
- if( s->aud_air )
- {
+ if( s->aud_air ){
s->aud_air->colour = 0x00103efe;
audio_channel_set_spacial( s->aud_air, player->rb.co, 40.0f );
audio_channel_slope_volume( s->aud_air, 0.05f, vol_air );
s->surface = k_surface_prop_concrete;
- for( int i=0; i<manifold_len; i++ )
- {
+ for( int i=0; i<manifold_len; i++ ){
rb_ct *ct = &manifold[i];
- struct world_material *surface_mat = world_contact_material( world, ct );
+ struct world_surface *surf = world_contact_surface( world, ct );
- if( surface_mat->info.surface_prop != k_surface_prop_concrete )
- s->surface = surface_mat->info.surface_prop;
+ if( surf->info.surface_prop != k_surface_prop_concrete )
+ s->surface = surf->info.surface_prop;
}
- for( int i=0; i<k_wheel_count; i++ )
- {
+ for( int i=0; i<k_wheel_count; i++ ){
m4x3f mtx;
m3x3_copy( player->rb.to_world, mtx );
m4x3_mulv( player->rb.to_world, wheels[i].pos, mtx[3] );
skate_integrate( player );
vg_line_pt3( s->state.cog, 0.02f, VG__WHITE );
- struct gate_hit hit;
- if( world_intersect_gates(world, player->rb.co, s->state.prev_pos, &hit) )
- {
- teleport_gate *gate = hit.gate;
+ ent_gate *gate =
+ world_intersect_gates(world, player->rb.co, s->state.prev_pos );
+
+ if( gate ){
m4x3_mulv( gate->transport, player->rb.co, player->rb.co );
m3x3_mulv( gate->transport, player->rb.v, player->rb.v );
m4x3_mulv( gate->transport, s->state.cog, s->state.cog );
rb_update_transform( &player->rb );
s->state_gate_storage = s->state;
- player__pass_gate( player, &hit );
+ player__pass_gate( player, gate );
}
/* FIXME: Rate limit */
}
VG_STATIC void player__skate_reset( player_instance *player,
- struct respawn_point *rp )
+ 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->q, player->rb.q );
+ v4_copy( rp->transform.q, player->rb.q );
s->state.activity = k_skate_activity_air;
s->state.activity_prev = k_skate_activity_air;