X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_physics_walk.h;fp=player_physics_walk.h;h=0000000000000000000000000000000000000000;hb=e3bf80ff27b675f5e7f87dcebd16fab6fe08df7a;hp=35dbf29bf60a82183236c164bbd455379e050b90;hpb=5430d708f058626a6c8fed7dd2aa8ba5f0a06c84;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_physics_walk.h b/player_physics_walk.h deleted file mode 100644 index 35dbf29..0000000 --- a/player_physics_walk.h +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved - */ - -#define PLAYER_PHYSICS_WALK_H -#ifndef PLAYER_PHYSICS_WALK_H -#define PLAYER_PHYSICS_WALK_H - -#include "player.h" -#include "camera.h" - -VG_STATIC struct player_walk -{ - struct - { - enum walk_activityaaaaaa - { - k_walk_activity_airaaaa, - k_walk_activity_groundaaaaaa - } - activity; - } - state; - - rigidbody capsule; /* TODO: rigidbody::collider_capsule */ -} -player_walky = -{ - .capsule = { .inf.capsule.height = 2.0f, .inf.capsule.radius = 0.3f } -}; - -VG_STATIC void player_walk_collider_configuration(void) -{ - v3_add( player.rb.co, (v3f){0.0f,1.0f,0.0f}, player_walky.capsule.co ); - rb_update_transform( &player_walky.capsule ); - -#if 0 - float h0 = 0.3f, - h1 = 0.9f; - - rigidbody *rbf = &player.collide_front, - *rbb = &player.collide_back; - - v3_add( phys->rb.co, (v3f){0.0f,h0,0.0f}, rbf->co ); - v3_add( phys->rb.co, (v3f){0.0f,h1,0.0f}, rbb->co ); - v3_copy( rbf->co, rbf->to_world[3] ); - v3_copy( rbb->co, rbb->to_world[3] ); - m4x3_invert_affine( rbf->to_world, rbf->to_local ); - m4x3_invert_affine( rbb->to_world, rbb->to_local ); - - rb_update_bounds( rbf ); - rb_update_bounds( rbb ); -#endif -} - -__attribute__ ((deprecated)) -VG_STATIC int player_walk_surface_standable( v3f n ) -{ - return v3_dot( n, (v3f){0.0f,1.0f,0.0f} ) > 0.5f; -} - -__attribute__ ((deprecated)) -VG_STATIC void player_walk_stepdown( struct player_walk *w ) -{ - float max_dist = 0.4f; - - v3f pa, pb; - v3_copy( player.rb.co, pa ); - pa[1] += 0.3f; - - v3_muladds( pa, (v3f){0.01f,1.0f,0.01f}, -max_dist, pb ); - vg_line( pa, pb, 0xff000000 ); - - /* TODO: Make #define */ - float r = 0.3f, - t; - - v3f n; - if( spherecast_world( pa, pb, r, &t, n ) != -1 ) - { - if( player_walk_surface_standable( n ) ) - { - w->state.activity = k_walk_activity_ground; - v3_lerp( pa, pb, t+0.001f, player.rb.co ); - player.rb.co[1] -= 0.3f; - } - } -} - -__attribute__ ((deprecated)) -VG_STATIC void player_walk_physics( struct player_walk *w ) -{ - v3_zero( player.rb.w ); - q_axis_angle( player.rb.q, (v3f){0.0f,1.0f,0.0f}, -player.angles[0] ); - - rb_ct manifold[64]; - int len; - - v3f forward_dir = { sinf(player.angles[0]),0.0f,-cosf(player.angles[0]) }; - v3f right_dir = { -forward_dir[2], 0.0f, forward_dir[0] }; - - v2f walk = { player.input_walkh->axis.value, - player.input_walkv->axis.value }; - - if( freecam ) - v2_zero( walk ); - - if( v2_length2(walk) > 0.001f ) - v2_normalize_clamp( walk ); - - if( w->state.activity == k_walk_activity_air ) - { - player_walk_collider_configuration(); - - /* allow player to accelerate a bit */ - v3f walk_3d; - v3_muls( forward_dir, walk[1], walk_3d ); - v3_muladds( walk_3d, right_dir, walk[0], walk_3d ); - - float current_vel = fabsf(v3_dot( walk_3d, player.rb.v )), - new_vel = current_vel + VG_TIMESTEP_FIXED*999999.0f, - clamped_new = vg_clampf( new_vel, 0.0f, k_walkspeed ), - vel_diff = vg_maxf( 0.0f, clamped_new - current_vel ); - - v3_muladds( player.rb.v, right_dir, walk[0] * vel_diff, player.rb.v ); - v3_muladds( player.rb.v, forward_dir, walk[1] * vel_diff, player.rb.v ); - - len = rb_capsule_scene( &w->capsule, &world.rb_geo, manifold ); - rb_presolve_contacts( manifold, len ); - - for( int i=0; in, (v3f){0.0f,1.0f,0.0f} ) > 0.5f ) - w->state.activity = k_walk_activity_ground; - } - - /* - * TODO: Compression - */ - for( int j=0; j<5; j++ ) - { - for( int i=0; in ); - vn += ct->bias; - - float temp = ct->norm_impulse; - ct->norm_impulse = vg_maxf( temp + vn, 0.0f ); - vn = ct->norm_impulse - temp; - - v3f impulse; - v3_muls( ct->n, vn, impulse ); - - v3_add( impulse, player.rb.v, player.rb.v ); - - /* friction */ - for( int j=0; j<2; j++ ) - { - float f = k_friction * ct->norm_impulse, - vt = v3_dot( player.rb.v, ct->t[j] ), - lambda = -vt; - - float temp = ct->tangent_impulse[j]; - ct->tangent_impulse[j] = vg_clampf( temp + lambda, -f, f ); - lambda = ct->tangent_impulse[j] - temp; - - v3_muladds( player.rb.v, ct->t[j], lambda, player.rb.v ); - } - } - } - - player.rb.v[1] += -k_gravity * k_rb_delta; - v3_muladds( player.rb.co, player.rb.v, k_rb_delta, player.rb.co ); - } - else - { - player.walk = v2_length( walk ); - - if( player.input_walk->button.value ) - v2_muls( walk, 0.5f, walk ); - - v2_muls( walk, k_walkspeed * VG_TIMESTEP_FIXED, walk ); - - /* Do XY translation */ - v3f walk_apply, walk_measured; - v3_zero( walk_apply ); - v3_muladds( walk_apply, right_dir, walk[0], walk_apply ); - v3_muladds( walk_apply, forward_dir, walk[1], walk_apply ); - v3_add( walk_apply, player.rb.co, player.rb.co ); - - /* Directly resolve collisions */ - player_walk_collider_configuration(); - len = rb_capsule_scene( &w->capsule, &world.rb_geo, manifold ); - - v3f dt; - v3_zero( dt ); - for( int j=0; j<8; j++ ) - { - for( int i=0; in, dt ), - remaining = (ct->p-k_penetration_slop) - resolved_amt, - apply = vg_maxf( remaining, 0.0f ) * 0.3f; - - v3_muladds( dt, ct->n, apply, dt ); - } - } - v3_add( dt, player.rb.co, player.rb.co ); - - v3_add( dt, walk_apply, walk_measured ); - v3_divs( walk_measured, VG_TIMESTEP_FIXED, player.rb.v ); - - if( len ) - { - struct world_material *surface_mat = world_contact_material(manifold); - player.surface_prop = surface_mat->info.surface_prop; - } - - w->state.activity = k_walk_activity_air; - - /* jump */ - if( player.input_jump->button.value ) - { - player.rb.v[1] = 5.0f; - return; - } - - /* Check if grounded by current manifold */ - for( int i=0; in ) ) - w->state.activity = k_walk_activity_ground; - } - - /* otherwise... */ - if( w->state.activity == k_walk_activity_air ) - player_walk_stepdown( w ); - } -} - -__attribute__ ((deprecated)) -VG_STATIC void player_walk_animate( void *_w, - struct skeleton *sk, player_pose pose ) -{ - struct player_walk *w = _w; - - { - float fly = (w->state.activity == k_walk_activity_air)? 1.0f: 0.0f, - rate; - - if( w->state.activity == k_walk_activity_air ) - rate = 2.4f; - else - rate = 9.0f; - - player.ffly = vg_lerpf( player.ffly, fly, rate*vg.time_delta ); - player.frun = vg_lerpf( player.frun, - player.walk * - (1.0f + player.input_walk->button.value*0.5f), - 2.0f*vg.time_delta ); - } - - player_pose apose, bpose; - - if( player.walk > 0.025f ) - { - /* TODO move */ - float walk_norm = 30.0f/(float)player.mdl.anim_walk->length, - run_norm = 30.0f/(float)player.mdl.anim_run->length, - walk_adv = vg_lerpf( walk_norm, run_norm, player.walk ); - - player.walk_timer += walk_adv * vg.time_delta; - } - else - { - player.walk_timer = 0.0f; - } - - float walk_norm = (float)player.mdl.anim_walk->length/30.0f, - run_norm = (float)player.mdl.anim_run->length/30.0f, - t = player.walk_timer, - l = vg_clampf( player.frun*15.0f, 0.0f, 1.0f ), - idle_walk = vg_clampf( (player.frun-0.1f)/(1.0f-0.1f), 0.0f, 1.0f ); - - /* walk/run */ - skeleton_sample_anim( sk, player.mdl.anim_walk, t*walk_norm, apose ); - skeleton_sample_anim( sk, player.mdl.anim_run, t*run_norm, bpose ); - - skeleton_lerp_pose( sk, apose, bpose, l, apose ); - - /* idle */ - skeleton_sample_anim( sk, player.mdl.anim_idle, vg.time*0.1f, bpose ); - skeleton_lerp_pose( sk, apose, bpose, 1.0f-idle_walk, apose ); - - /* air */ - skeleton_sample_anim( sk, player.mdl.anim_jump, vg.time*0.6f, bpose ); - skeleton_lerp_pose( sk, apose, bpose, player.ffly, apose ); - - skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_defer_ik ); - skeleton_apply_ik_pass( &player.mdl.sk ); - skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_deffered_only ); - - v3_copy( player.mdl.sk.final_mtx[player.mdl.id_head-1][3], - player.mdl.cam_pos ); - - - - skeleton_apply_inverses( &player.mdl.sk ); - - m4x3f mtx; - v4f rot; - q_axis_angle( rot, (v3f){0.0f,1.0f,0.0f}, -player.angles[0] - VG_PIf*0.5f ); - q_m3x3( rot, mtx ); - v3_copy( player.visual_transform[3], mtx[3] ); - - skeleton_apply_transform( &player.mdl.sk, mtx ); - skeleton_debug( &player.mdl.sk ); -} - -#endif /* PLAYER_PHYSICS_WALK_H */