X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_walk.c;h=6b7788c1405a9be7854e8af56382b8d47c24c12f;hb=7a2032debc2c3bff7e4f795f39fd0e798186b4c2;hp=c86c9dba385d28ac8f3da4b0a22ad0013659c59b;hpb=3e8fda9c7cbc50d1ae95195905c953bdeedf71b9;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_walk.c b/player_walk.c index c86c9db..6b7788c 100644 --- a/player_walk.c +++ b/player_walk.c @@ -118,6 +118,7 @@ VG_STATIC void player_walk_drop_in_overhang_transform( player_instance *player, 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 ); @@ -140,7 +141,7 @@ VG_STATIC int player_walk_scan_for_drop_in( player_instance *player ) 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 ); @@ -218,7 +219,7 @@ VG_STATIC int player_walk_scan_for_drop_in( player_instance *player ) 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 ); @@ -227,7 +228,7 @@ VG_STATIC int player_walk_scan_for_drop_in( player_instance *player ) } 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 ); @@ -395,8 +396,10 @@ VG_STATIC void player__walk_update( player_instance *player ) /* * 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 ); @@ -429,15 +432,13 @@ VG_STATIC void player__walk_update( player_instance *player ) 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 ); @@ -447,29 +448,25 @@ VG_STATIC void player__walk_update( player_instance *player ) 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 ); } @@ -477,10 +474,8 @@ VG_STATIC void player__walk_update( player_instance *player ) /* * Resolve velocity constraints */ - for( int j=0; j<5; j++ ) - { - for( int i=0; icollider.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; @@ -576,9 +571,9 @@ VG_STATIC void player__walk_update( player_instance *player ) } } - 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 );