6 #include "player_model.h"
9 void player__debugtext( int size
, const char *fmt
, ... )
14 va_start( args
, fmt
);
15 vsnprintf( buffer
, 1024, fmt
, args
);
18 ui_text( vg_uictx
.cursor
, buffer
, size
, k_text_align_right
);
19 vg_uictx
.cursor
[1] += 14*size
;
26 void player__create( player_instance
*inst
)
28 static int only_once
= 0;
29 assert( only_once
== 0 );
32 inst
->input_js1h
= vg_create_named_input( "steer-h", k_input_type_axis
);
33 inst
->input_js1v
= vg_create_named_input( "steer-v", k_input_type_axis
);
34 inst
->input_grab
= vg_create_named_input( "grab", k_input_type_axis_norm
);
35 inst
->input_js2h
= vg_create_named_input( "grab-h", k_input_type_axis
);
36 inst
->input_js2v
= vg_create_named_input( "grab-v", k_input_type_axis
);
37 inst
->input_jump
= vg_create_named_input( "jump", k_input_type_button
);
38 inst
->input_push
= vg_create_named_input( "push", k_input_type_button
);
39 inst
->input_walk
= vg_create_named_input( "walk", k_input_type_button
);
40 inst
->input_walkh
= vg_create_named_input( "walk-h", k_input_type_axis
);
41 inst
->input_walkv
= vg_create_named_input( "walk-v", k_input_type_axis
);
42 inst
->input_use
= vg_create_named_input( "use", k_input_type_button
);
43 inst
->input_reset
= vg_create_named_input( "reset", k_input_type_button
);
44 inst
->input_camera
=vg_create_named_input( "camera", k_input_type_button
);
45 inst
->input_trick0
=vg_create_named_input( "trick0", k_input_type_button
);
46 inst
->input_trick1
=vg_create_named_input( "trick1", k_input_type_button
);
47 inst
->input_trick2
=vg_create_named_input( "trick2", k_input_type_button
);
49 const char *default_cfg
[] =
51 "bind steer-h gp-ls-h",
55 "bind steer-v gp-ls-v",
61 "bind grab-h gp-rs-h",
62 "bind grab-v gp-rs-v",
71 "bind trick2 gp-x", /* keyboard: m0 + m1 */
79 "bind walk-h gp-ls-h",
80 "bind walk-v -gp-ls-v",
94 for( int i
=0; i
<vg_list_size(default_cfg
); i
++ )
95 vg_execute_console_input(default_cfg
[i
]);
97 v3_zero( inst
->rb
.co
);
98 v3_zero( inst
->rb
.w
);
99 v3_zero( inst
->rb
.v
);
100 q_identity( inst
->rb
.q
);
101 m4x3_identity( inst
->rb
.to_world
);
102 m4x3_identity( inst
->rb
.to_local
);
109 void player__use_avatar( player_instance
*player
, struct player_avatar
*av
)
111 player
->playeravatar
= av
;
112 player_setup_ragdoll_from_avatar( &player
->ragdoll
, av
);
116 void player__use_mesh( player_instance
*player
, glmesh
*mesh
)
118 player
->playermesh
= mesh
;
122 void player__use_texture( player_instance
*player
, vg_tex2d
*tex
)
124 player
->playertex
= tex
;
128 void player__bind( player_instance
*player
)
130 player__skate_bind( player
);
131 player__walk_bind( player
);
136 * ----------------------------------------------------------------------------
139 void player__pre_update( player_instance
*player
)
141 if( vg_input_button_down( player
->input_camera
) )
143 if( player
->camera_mode
== k_cam_firstperson
)
144 player
->camera_mode
= k_cam_thirdperson
;
146 player
->camera_mode
= k_cam_firstperson
;
149 if( _player_pre_update
[ player
->subsystem
] )
150 _player_pre_update
[ player
->subsystem
]( player
);
154 void player__update( player_instance
*player
)
156 if( _player_update
[ player
->subsystem
] )
157 _player_update
[ player
->subsystem
]( player
);
161 void player__post_update( player_instance
*player
)
163 if( _player_post_update
[ player
->subsystem
] )
164 _player_post_update
[ player
->subsystem
]( player
);
167 VG_STATIC
void player_apply_transport_to_cam( m4x3f transport
)
169 /* FIXME: Applies to main_camera directly! */
171 /* Pre-emptively edit the camera matrices so that the motion vectors
175 m4x3_invert_affine( transport
, transport_i
);
176 m4x3_expand( transport_i
, transport_4
);
177 m4x4_mul( main_camera
.mtx
.pv
, transport_4
, main_camera
.mtx
.pv
);
178 m4x4_mul( main_camera
.mtx
.v
, transport_4
, main_camera
.mtx
.v
);
181 __attribute__ ((deprecated
))
182 VG_STATIC
void gate_rotate_angles( teleport_gate
*gate
, v3f angles
, v3f d
)
184 v3_copy( angles
, d
);
187 v3f fwd_dir
= { cosf(angles
[0]),
190 m3x3_mulv( gate
->transport
, fwd_dir
, fwd_dir
);
192 v3_copy( angles
, d
);
193 d
[0] = atan2f( fwd_dir
[2], fwd_dir
[0] );
197 * Applies gate transport to a player_interface
200 void player__pass_gate( player_instance
*player
, teleport_gate
*gate
)
202 player
->gate_waiting
= gate
;
204 m4x3_mulv( gate
->transport
, player
->tpv_lpf
, player
->tpv_lpf
);
205 m3x3_mulv( gate
->transport
, player
->cam_velocity_smooth
,
206 player
->cam_velocity_smooth
);
208 m3x3_copy( player
->basis
, player
->basis_gate
);
211 m3x3_q( gate
->transport
, q
);
212 q_mul( q
, player
->qbasis
, player
->qbasis
);
213 q_normalize( player
->qbasis
);
214 q_m3x3( player
->qbasis
, player
->basis
);
215 m3x3_transpose( player
->basis
, player
->invbasis
);
218 VG_STATIC
void player__pre_render( player_instance
*player
)
220 if( _player_animate
[ player
->subsystem
] )
222 player_animation res
;
223 _player_animate
[ player
->subsystem
]( player
, &res
);
225 /* TODO: eventually, blending code goes here */
228 q_m3x3( res
.root_q
, transform
);
229 v3_copy( res
.root_co
, transform
[3] );
231 struct skeleton
*sk
= &player
->playeravatar
->sk
;
233 if( player
->holdout_time
> 0.0f
)
235 skeleton_lerp_pose( sk
, res
.pose
, player
->holdout_pose
,
236 player
->holdout_time
, res
.pose
);
237 player
->holdout_time
-= vg
.frame_delta
* 2.0f
;
240 skeleton_apply_pose( sk
, res
.pose
, k_anim_apply_defer_ik
);
241 skeleton_apply_ik_pass( sk
);
242 skeleton_apply_pose( sk
, res
.pose
, k_anim_apply_deffered_only
);
243 skeleton_apply_inverses( sk
);
244 skeleton_apply_transform( sk
, transform
);
247 skeleton_debug( sk
);
251 if( _player_post_animate
[ player
->subsystem
] )
252 _player_post_animate
[ player
->subsystem
]( player
);
254 struct player_avatar
*av
= player
->playeravatar
;
255 v3f vp0
= {0.0f
,0.1f
, 0.55f
},
256 vp1
= {0.0f
,0.1f
,-0.55f
};
258 m4x3_mulv( av
->sk
.final_mtx
[ av
->id_board
], vp0
, TEMP_BOARD_0
);
259 m4x3_mulv( av
->sk
.final_mtx
[ av
->id_board
], vp1
, TEMP_BOARD_1
);
261 player__cam_iterate( player
);
264 PLAYER_API
void player__render( camera
*cam
, player_instance
*player
)
266 shader_model_character_view_use();
267 vg_tex2d_bind( player
->playertex
, 0 );
268 shader_model_character_view_uTexMain( 0 );
269 shader_model_character_view_uCamera( cam
->transform
[3] );
270 shader_model_character_view_uPv( cam
->mtx
.pv
);
272 world_instance
*world
= get_active_world();
273 world_link_lighting_ub( world
, _shader_model_character_view
.id
, 2 );
275 glUniformMatrix4x3fv( _uniform_model_character_view_uTransforms
,
276 player
->playeravatar
->sk
.bone_count
,
278 (float *)player
->playeravatar
->sk
.final_mtx
);
280 mesh_bind( player
->playermesh
);
281 mesh_draw( player
->playermesh
);
284 PLAYER_API
void player__im_gui( player_instance
*player
)
286 vg_uictx
.cursor
[0] = vg
.window_x
- 200;
287 vg_uictx
.cursor
[1] = 0;
288 vg_uictx
.cursor
[2] = 200;
289 vg_uictx
.cursor
[3] = 200;
291 struct ui_vert
*b
= ui_fill_rect( vg_uictx
.cursor
, 0x70000000 );
293 vg_uictx
.cursor
[0] = vg
.window_x
;
295 player__debugtext( 1, "angles: " PRINTF_v3f( player
->cam
.angles
) );
296 player__debugtext( 1, "basis: " PRINTF_v4f( player
->qbasis
) );
298 if( _player_im_gui
[ player
->subsystem
] )
299 _player_im_gui
[ player
->subsystem
]( player
);
301 b
[2].co
[1] = vg_uictx
.cursor
[1];
302 b
[3].co
[1] = vg_uictx
.cursor
[1];
305 PLAYER_API
void player__spawn( player_instance
*player
,
306 struct respawn_point
*rp
)
308 v3_copy( rp
->co
, player
->rb
.co
);
309 v3_zero( player
->rb
.v
);
310 v3_zero( player
->rb
.w
);
311 q_identity( player
->rb
.q
);
312 rb_update_transform( &player
->rb
);
314 q_identity( player
->qbasis
);
315 m3x3_identity( player
->basis
);
316 m3x3_identity( player
->invbasis
);
318 player
->subsystem
= k_player_subsystem_walk
;
320 if( _player_reset
[ player
->subsystem
] )
321 _player_reset
[ player
->subsystem
]( player
, rp
);
325 PLAYER_API
void player__kill( player_instance
*player
)
330 #endif /* PLAYER_C */