3ec1fac58ad9266c0e697d7fb716fb60f1dec208
4 #include "player_glide.h"
7 static f32 k_glide_steer
= 2.0f
,
10 k_glide_drag
= 0.0001f
,
11 k_glide_slip_yaw
= 0.1f
,
12 k_glide_lift_pitch
= 0.0f
,
13 k_glide_wing_orient
= -0.1f
,
14 k_glide_balance
= 1.0f
;
16 static i32 k_glide_pause
= 0;
18 static void player_glide_pre_update(void){
21 static void massless_accel( rigidbody
*rb
, v3f delta
, v3f impulse
){
23 v3_muladds( rb
->v
, impulse
, k_rb_delta
, rb
->v
);
25 /* Angular velocity */
27 v3_cross( delta
, impulse
, wa
);
28 v3_muladds( rb
->w
, wa
, k_rb_delta
, rb
->w
);
31 static void calculate_lift( v3f vl
, f32 aoa_bias
,
32 v3f axis
, v3f back
, f32 power
,
35 v3_cross( back
, axis
, up
);
38 v3_muladds( vl
, axis
, -v3_dot(axis
,vl
), wind
);
40 f32 windv2
= v3_length2(wind
),
41 aoa
= atan2f( v3_dot( up
, wind
), v3_dot( back
, wind
) ) + aoa_bias
,
42 cl
= aoa
/ VG_PIf
, /* TODO: make it a curve */
43 L
= windv2
* cl
* power
;
47 v3_cross( wind
, axis
, lift_dir
);
49 /* this is where induced drag (from the flappy things) would go */
51 v3_muls( lift_dir
, L
, out_force
);
54 static void calculate_drag( v3f vl
, f32 cd
, v3f out_force
){
55 f32 v2
= v3_length2( vl
);
59 v3_muls( vl
, -cd
*v2
, out_force
);
62 static void player_glide_update(void){
63 rigidbody
*rb
= &localplayer
.rb
;
64 vg_line_sphere( rb
->to_world
, 1.0f
, 0 );
67 joystick_state( k_srjoystick_steer
, steer
);
71 m3x3_mulv( rb
->to_local
, rb
->v
, vl
);
72 m3x3_mulv( rb
->to_local
, rb
->w
, wl
);
74 v3f F
, Flift
, Fslip
, Fdrag
, FslipW
, FliftW
;
76 calculate_lift( vl
, steer
[1]*k_glide_steer
,
78 (v3f
){0,sinf(k_glide_wing_orient
),cosf(k_glide_wing_orient
)},
80 v3_copy( Flift
, player_glide
.info_lift
);
81 v3_cross( (v3f
){0,0,0}, Flift
, FliftW
);
83 calculate_lift( vl
, 0.0f
,
84 (v3f
){0,1,0},(v3f
){0,0,1},
86 v3_copy( Fslip
, player_glide
.info_slip
);
87 v3_cross( (v3f
){0,k_glide_lift_pitch
,k_glide_slip_yaw
}, Fslip
, FslipW
);
89 calculate_drag( vl
, k_glide_drag
, Fdrag
);
90 v3_copy( Fdrag
, player_glide
.info_drag
);
92 v3f balance
= {0.0f
,-k_glide_balance
,0.0f
};
93 m3x3_mulv( rb
->to_local
, balance
, balance
);
96 steer
[1]*k_glide_steer
- balance
[2],
98 -steer
[0]*k_glide_steer
+ balance
[0],
101 if( player_glide
.ticker
){
102 player_glide
.ticker
--;
105 player_glide
.ticker
+= k_glide_pause
;
108 v3_add( Flift
, Fslip
, F
);
109 v3_add( F
, Fdrag
, F
);
111 m3x3_mulv( rb
->to_world
, F
, F
);
112 v3_muladds( rb
->v
, F
, k_rb_delta
, rb
->v
);
114 v3_add( Fw
, FslipW
, Fw
);
115 v3_add( Fw
, FliftW
, Fw
);
116 m3x3_mulv( rb
->to_world
, Fw
, Fw
);
117 v3_muladds( rb
->w
, Fw
, k_rb_delta
, rb
->w
);
120 rb_update_transform( rb
);
123 static void player_glide_post_update(void){
126 static void player_glide_animate(void){
127 struct player_glide
*g
= &player_glide
;
128 struct player_glide_animator
*animator
= &g
->animator
;
129 rb_extrapolate( &localplayer
.rb
, animator
->root_co
, animator
->root_q
);
132 static void player_glide_pose( void *_animator
, player_pose
*pose
){
133 struct skeleton
*sk
= &localplayer
.skeleton
;
134 struct player_glide_animator
*animator
= _animator
;
136 skeleton_sample_anim( sk
, player_glide
.anim_temp
, 0.0f
, pose
->keyframes
);
138 v3_copy( animator
->root_co
, pose
->root_co
);
139 v4_copy( animator
->root_q
, pose
->root_q
);
142 static void player_glide_post_animate(void){
143 if( localplayer
.cam_control
.camera_mode
== k_cam_firstperson
)
144 localplayer
.cam_velocity_influence
= 0.0f
;
146 localplayer
.cam_velocity_influence
= 0.0f
;
149 v3_muls( localplayer
.rb
.to_world
[2], -1.0f
, fwd
);
150 v3_angles( fwd
, localplayer
.angles
);
153 static void player_glide_im_gui(void){
154 player__debugtext( 1, "Nothing here" );
155 player__debugtext( 1, " lift: %.2f %.2f %.2f",
156 player_glide
.info_lift
[0],
157 player_glide
.info_lift
[1],
158 player_glide
.info_lift
[2] );
159 player__debugtext( 1, " slip: %.2f %.2f %.2f",
160 player_glide
.info_slip
[0],
161 player_glide
.info_slip
[1],
162 player_glide
.info_slip
[2] );
163 player__debugtext( 1, " drag: %.2f %.2f %.2f",
164 player_glide
.info_drag
[0],
165 player_glide
.info_drag
[1],
166 player_glide
.info_drag
[2] );
169 static void player_glide_bind(void){
170 struct skeleton
*sk
= &localplayer
.skeleton
;
171 player_glide
.anim_temp
= skeleton_get_anim( sk
, "idle_cycle+y" );
173 u32 mask
= VG_VAR_CHEAT
|VG_VAR_PERSISTENT
;
174 VG_VAR_F32( k_glide_steer
, flags
=mask
);
175 VG_VAR_F32( k_glide_cl
, flags
=mask
);
176 VG_VAR_F32( k_glide_cs
, flags
=mask
);
177 VG_VAR_F32( k_glide_drag
, flags
=mask
);
178 VG_VAR_F32( k_glide_slip_yaw
, flags
=mask
);
179 VG_VAR_F32( k_glide_lift_pitch
, flags
=mask
);
180 VG_VAR_I32( k_glide_pause
, flags
=mask
);
181 VG_VAR_F32( k_glide_balance
, flags
=mask
);
182 VG_VAR_F32( k_glide_wing_orient
, flags
=mask
);
185 #endif /* PLAYER_GLIDE_C */