X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_device_skate.h;h=13f6398a0b549d37f338b2b25ffd0bacb7062320;hb=2f1dca88d325b4eebd030232c694627f5791ebce;hp=04a2da1115242581249cece7b445d8d03d23c553;hpb=ff8fcac9582d07bc1ccbf08421d6ffec1758a755;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_device_skate.h b/player_device_skate.h index 04a2da1..13f6398 100644 --- a/player_device_skate.h +++ b/player_device_skate.h @@ -44,9 +44,11 @@ struct player_device_skate double start_push, cur_push; - struct mixedcam_state cam; - v3f prev_pos; + + + v3f vl, /* 1st */ + posl; /* 3rd */ } state, state_gate_storage; @@ -1126,9 +1128,35 @@ VG_STATIC void player_skate_update( player_interface *player, &s->sphere_front, manifold ), len_back = skate_collide_smooth( player, mtx_back, &s->sphere_back, &manifold[len_front] ), - interface_len = len_front + len_back; + /* try to slap both wheels onto the ground when landing to prevent mega + * angular velocities being added */ + if( (s->state.activity == k_skate_activity_air) && (len_front != len_back) ) + { + v3f trace_from, trace_dir; + v3_muls( player->rb.to_world[1], -1.0f, trace_dir ); + + if( len_front ) + v3_copy( mtx_back[3], trace_from ); + else + v3_copy( mtx_front[3], trace_from ); + + ray_hit ray; + ray.dist = 0.6f; + + if( ray_world( trace_from, trace_dir, &ray ) ) + { + rb_ct *ct = &manifold[ interface_len ]; + + v3_copy( ray.pos, ct->co ); + v3_copy( ray.normal, ct->n ); + ct->p = 0.0f; + + interface_len ++; + } + } + interface_manifold = manifold; grind_manifold = manifold + interface_len; @@ -1171,8 +1199,12 @@ VG_STATIC void player_skate_update( player_interface *player, m4x3_mulv( gate->transport, s->state.cog, s->state.cog ); m3x3_mulv( gate->transport, s->state.cog_v, s->state.cog_v ); m3x3_mulv( gate->transport, s->state.throw_v, s->state.throw_v ); + m4x3_mulv( gate->transport, s->state.posl, s->state.posl ); + m3x3_mulv( gate->transport, s->state.vl, s->state.vl ); +#if 0 mixedcam_transport( &s->state.cam, gate ); +#endif v4f transport_rotation; m3x3_q( gate->transport, transport_rotation ); @@ -1506,40 +1538,34 @@ VG_STATIC void skate_camera_firstperson( player_interface *player, //v3_normalize( flat_dir ); v3_lerp( flat_dir, vel_dir, vg_clampf( tti / 2.0f, 0.4f, 1.0f ), look_dir ); - v3_lerp( s->state.cam.vl, look_dir, 4.0f*vg.time_delta, s->state.cam.vl ); + v3_lerp( s->state.vl, look_dir, 4.0f*vg.time_delta, s->state.vl ); - skate_camera_vector_look( &at->cam_1st, s->state.cam.vl, 0.7f, 0.5f ); + skate_camera_vector_look( &at->cam_1st, s->state.vl, 1.0f, 0.25f ); } -#if 0 VG_STATIC void skate_camera_thirdperson( player_interface *player, - struct player_device_skate *s, - struct player_avatar *av, camera *cam ) + player_attachment *at ) { - v3f prev_pos, cam_look_dir, d; + struct player_device_skate *s = at->storage; + struct player_avatar *av = player->playeravatar; - v3_copy( s->state.cam.pos, prev_pos ); - skate_camera_thirdperson_nextpos( player, s, av, s->state.cam.pos, d); + v3f origin, dir, target; + v3_copy( player->rb.co, origin ); + v3_add( origin, (v3f){0.0f,1.35f,0.0f}, origin ); + v3_sub( origin, s->state.posl, dir ); + + if( v3_length2( dir ) < 0.1f*0.1f ) + v3_copy( (v3f){ 0.0f, 0.0f, 1.0f }, dir ); /* FIXME */ + else + v3_normalize( dir ); - if( s->state.cam.gate ) - { - v2f _; - if( gate_intersect_plane( s->state.cam.gate, - s->state.cam.pos, prev_pos, _ ) ) - { - m4x3_mulv( s->state.cam.gate->transport, - s->state.cam.pos, s->state.cam.pos ); - m3x3_mulv( s->state.cam.gate->transport, d, d ); - player_apply_transport_to_cam( s->state.cam.gate->transport ); + v3_muladds( origin, dir, -2.0f, target ); + v3_lerp( s->state.posl, target, vg.frame_delta * 12.0f, s->state.posl ); - s->state.cam.gate = NULL; - } - } - - skate_camera_vector_look( cam, d, 1.0f, 0.0f ); - v3_copy( s->state.cam.pos, cam->pos ); + v3_copy( s->state.posl, at->cam_3rd.pos ); + skate_camera_vector_look( &at->cam_3rd, dir, 1.0f, 0.0f ); + at->cam_3rd.fov = 100.0f; } -#endif VG_STATIC void player_skate_post_animate( player_interface *player, player_attachment *at ) @@ -1551,11 +1577,7 @@ VG_STATIC void player_skate_post_animate( player_interface *player, v3_zero( at->cam_1st.angles ); at->cam_1st.fov = 90.0f; -#if 0 - if( cl_thirdperson ) - skate_camera_thirdperson( player, s, av, cam ); - else -#endif + skate_camera_thirdperson( player, at ); skate_camera_firstperson( player, at ); /* FIXME: Organize this. Its int wrong fucking place */ @@ -1579,7 +1601,9 @@ VG_STATIC void player_skate_reset( player_interface *player, struct player_device_skate *s = at->storage; v3_muladds( player->rb.co, player->rb.to_world[1], 1.0f, s->state.cog ); +#if 0 mixedcam_reset( player, &s->state.cam ); +#endif } VG_STATIC player_device player_device_skate =