VG_STATIC int player_walk_scan_for_drop_in( player_instance *player )
{
struct player_walk *w = &player->_walk;
+ world_instance *world = get_active_world();
v3f dir, center;
q_mulv( player->rb.q, (v3f){0.0f,0.0f,1.0f}, dir );
ray_hit *ray = &samples[ sample_count ];
ray->dist = 2.0f;
- if( ray_world( pos, ray_dir, ray ) )
+ if( ray_world( world, pos, ray_dir, ray ) )
{
vg_line( pos, ray->pos, VG__RED );
vg_line_pt3( ray->pos, 0.025f, VG__BLACK );
ray_hit ray;
ray.dist = k_board_length*2.0f + 0.6f;
- if( ray_world( va, v0, &ray ) )
+ if( ray_world( world, va, v0, &ray ) )
{
vg_line( va, vb, VG__RED );
vg_line_pt3( ray.pos, 0.1f, VG__RED );
}
v3_muls( v0, -1.0f, v0 );
- if( ray_world( vb, v0, &ray ) )
+ if( ray_world( world, vb, v0, &ray ) )
{
vg_line( va, vb, VG__RED );
vg_line_pt3( ray.pos, 0.1f, VG__RED );
/*
* Collision detection
*/
+ world_instance *world = get_active_world();
+
len = rb_capsule__scene( mtx, &w->collider, NULL,
- &world.rb_geo.inf.scene, manifold );
+ &world->rb_geo.inf.scene, manifold );
rb_manifold_filter_coplanar( manifold, len, 0.01f );
len = rb_manifold_apply_filtered( manifold, len );
v3_muls( right_dir, walk[0], movedir );
v3_muladds( movedir, forward_dir, walk[1], movedir );
- if( w->state.activity == k_walk_activity_ground )
- {
+ if( w->state.activity == k_walk_activity_ground ){
v3_normalize( surface_avg );
v3f tx, ty;
rb_tangent_basis( surface_avg, tx, ty );
- if( v2_length2(walk) > 0.001f )
- {
+ if( v2_length2(walk) > 0.001f ){
/* clip movement to the surface */
float d = v3_dot(surface_avg,movedir);
v3_muladds( movedir, surface_avg, -d, movedir );
nominal_speed = k_walkspeed;
/* jump */
- if( player->input_jump->button.value )
- {
+ if( player->input_jump->button.value ){
v3_muladds( player->rb.v, player->basis[1], 5.0f, player->rb.v );
w->state.activity = k_walk_activity_air;
accel_speed = k_walk_air_accel;
nominal_speed = k_airspeed;
}
- else
- {
+ else{
player_friction( player->rb.v );
- struct world_material *surface_mat = world_contact_material(manifold);
- w->surface = surface_mat->info.surface_prop;
+ struct world_surface *surf = world_contact_surface( world, manifold );
+ w->surface = surf->info.surface_prop;
}
}
- else
- {
+ else{
accel_speed = k_walk_air_accel;
nominal_speed = k_airspeed;
}
- if( v2_length2(walk) > 0.001f )
- {
+ if( v2_length2(walk) > 0.001f ){
player_accelerate( player->rb.v, movedir, nominal_speed, accel_speed );
v3_normalize( movedir );
}
/*
* Resolve velocity constraints
*/
- for( int j=0; j<5; j++ )
- {
- for( int i=0; i<len; i++ )
- {
+ for( int j=0; j<5; j++ ){
+ for( int i=0; i<len; i++ ){
struct contact *ct = &manifold[i];
/*normal */
float t, sr = w->collider.radius-0.04f;
v3f n;
- if( spherecast_world( lwr_prev, lwr_now, sr, &t, n ) != -1 )
+ if( spherecast_world( world, lwr_prev, lwr_now, sr, &t, n ) != -1 )
{
v3_lerp( lwr_prev, lwr_now, vg_maxf(0.01f,t), player->rb.co );
player->rb.co[1] -= w->collider.radius;
}
}
- teleport_gate *gate;
- if( (gate = world_intersect_gates( player->rb.co, w->state.prev_pos )) )
- {
+ ent_gate *gate =
+ world_intersect_gates( world, player->rb.co, w->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 );