2 * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved
5 #define PLAYER_PHYSICS_H
6 #ifndef PLAYER_PHYSICS_H
7 #define PLAYER_PHYSICS_H
12 VG_STATIC
void player_integrate(void);
14 VG_STATIC
int player_collide_sphere( rigidbody
*rb
, rb_ct
*manifold
)
19 len
= rb_sphere_scene( rb
, &world
.rb_geo
, manifold
);
20 rb_manifold_filter_coplanar( manifold
, len
, 0.05f
);
23 rb_manifold_filter_backface( manifold
, len
);
24 rb_manifold_filter_joint_edges( manifold
, len
, 0.05f
);
25 rb_manifold_filter_pairs( manifold
, len
, 0.05f
);
27 int new_len
= rb_manifold_apply_filtered( manifold
, len
);
40 VG_STATIC
void apply_gravity( v3f vel
, float const timestep
)
42 v3f gravity
= { 0.0f
, -9.6f
, 0.0f
};
43 v3_muladds( vel
, gravity
, timestep
, vel
);
46 VG_STATIC
void player_integrate(void)
48 struct player_phys
*phys
= &player
.phys
;
49 v3_sub( phys
->rb
.v
, phys
->v_last
, phys
->a
);
50 v3_muls( phys
->a
, 1.0f
/VG_TIMESTEP_FIXED
, phys
->a
);
51 v3_copy( phys
->rb
.v
, phys
->v_last
);
53 apply_gravity( phys
->rb
.v
, VG_TIMESTEP_FIXED
);
54 v3_muladds( phys
->rb
.co
, phys
->rb
.v
, VG_TIMESTEP_FIXED
, phys
->rb
.co
);
58 VG_STATIC
void player_freecam(void)
62 float movespeed
= fc_speed
* VG_TIMESTEP_FIXED
;
63 v3f lookdir
= { 0.0f
, 0.0f
, -1.0f
},
64 sidedir
= { 1.0f
, 0.0f
, 0.0f
};
66 m3x3_mulv( main_camera
.transform
, lookdir
, lookdir
);
67 m3x3_mulv( main_camera
.transform
, sidedir
, sidedir
);
69 static v3f move_vel
= { 0.0f
, 0.0f
, 0.0f
};
71 v2f steer
= { player
.input_js1h
->axis
.value
,
72 player
.input_js1v
->axis
.value
};
74 v3_muladds( move_vel
, sidedir
, movespeed
*steer
[0], move_vel
);
75 v3_muladds( move_vel
, lookdir
, -movespeed
*steer
[1], move_vel
);
77 v3_muls( move_vel
, 0.7f
, move_vel
);
78 v3_add( move_vel
, player
.camera_pos
, player
.camera_pos
);
81 VG_STATIC
int kill_player( int argc
, char const *argv
[] )
87 VG_STATIC
int reset_player( int argc
, char const *argv
[] )
89 struct respawn_point
*rp
= NULL
, *r
;
93 for( int i
=0; i
<world
.spawn_count
; i
++ )
96 if( !strcmp( r
->name
, argv
[0] ) )
104 vg_warn( "No spawn named '%s'\n", argv
[0] );
109 float min_dist
= INFINITY
;
111 for( int i
=0; i
<world
.spawn_count
; i
++ )
113 r
= &world
.spawns
[i
];
114 float d
= v3_dist2( r
->co
, player
.co
);
116 vg_info( "Dist %s : %f\n", r
->name
, d
);
127 vg_error( "No spawn found\n" );
128 vg_info( "Player position: %f %f %f\n", player
.co
[0],
132 if( !world
.spawn_count
)
135 rp
= &world
.spawns
[0];
141 q_m3x3( rp
->q
, the_long_way
);
143 v3f delta
= {1.0f
,0.0f
,0.0f
};
144 m3x3_mulv( the_long_way
, delta
, delta
);
148 player
.angles
[0] = atan2f( delta
[0], -delta
[2] );
149 player
.angles
[1] = -asinf( delta
[1] );
152 player
.controller
= k_player_controller_walk
;
153 /* TODO: trigger controller slurp */
159 VG_STATIC
void reset_player_poll( int argc
, char const *argv
[] )
163 for( int i
=0; i
<world
.spawn_count
; i
++ )
165 struct respawn_point
*r
= &world
.spawns
[i
];
166 console_suggest_score_text( r
->name
, argv
[argc
-1], 0 );
171 #endif /* PLAYER_PHYSICS_H */