X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_interface.h;h=f28d7a82ac5b960fd4238cae9b0c72f442c5bd14;hb=07d0834b13ecf5de312cf3578e8aca8f106f5ef1;hp=c890166d93cbe30ca5b03146852e953af96c023a;hpb=2ab1c45f664daf5a452fd212c89dcfd918f7dd81;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_interface.h b/player_interface.h index c890166..f28d7a8 100644 --- a/player_interface.h +++ b/player_interface.h @@ -4,6 +4,8 @@ #include "model.h" #include "camera.h" #include "rigidbody.h" +#include "player_ragdoll.h" +#include "player_model.h" #include "world.h" typedef struct player_device player_device; @@ -35,15 +37,23 @@ struct player_interface *input_use, *input_reset, *input_grab; + + struct player_avatar *playeravatar; + glmesh *playermesh; + struct player_ragdoll ragdoll; }; +/* FIXME: yo */ +vg_tex2d tex_characters = { .path = "textures/ch_gradient.qoi" }; + struct player_device { + void (* bind ) ( player_interface *player, player_attachment *at ); void (* pre_update) ( player_interface *player, player_attachment *at ); void (* update) ( player_interface *player, player_attachment *at ); void (* post_update)( player_interface *player, player_attachment *at ); void (* pose) ( player_interface *player, player_attachment *at, - player_pose pose ); + player_pose pose, m4x3f transform ); void (* get_camera) ( player_interface *player, player_attachment *at, camera *cam ); @@ -127,11 +137,25 @@ VG_STATIC void player_interface_create_player( player_interface *inst ) m4x3_identity( inst->rb.to_local ); } +VG_STATIC void player_use_avatar( player_interface *player, + struct player_avatar *av ) +{ + player->playeravatar = av; + player_setup_ragdoll_from_avatar( &player->ragdoll, av ); +} + +VG_STATIC void player_use_mesh( player_interface *player, glmesh *mesh ) +{ + player->playermesh = mesh; +} + VG_STATIC void player_use_device( player_interface *player, player_device *dev, void *storage ) { player->dev.device = dev; player->dev.storage = storage; + + player->dev.device->bind( player, &player->dev ); } VG_STATIC void player_pre_update( player_interface *player ) @@ -157,8 +181,6 @@ VG_STATIC void player_post_update( player_interface *player ) if( player->dev.device->post_update ) player->dev.device->post_update( player, &player->dev ); - if( player->dev.device->get_camera ) - player->dev.device->get_camera( player, &player->dev, &player->cam ); #if 0 camera_update_transform( &player->cam ); camera_update_view( &player->cam ); @@ -177,6 +199,43 @@ VG_STATIC void player_pre_render( player_interface *player ) } #endif +VG_STATIC void player_pre_render( player_interface *player ) +{ + player_pose pose; + m4x3f transform; + + player->dev.device->pose( player, &player->dev, pose, transform ); + + struct skeleton *sk = &player->playeravatar->sk; + + skeleton_apply_pose( sk, pose, k_anim_apply_defer_ik ); + skeleton_apply_ik_pass( sk ); + skeleton_apply_pose( sk, pose, k_anim_apply_deffered_only ); + skeleton_apply_inverses( sk ); + skeleton_apply_transform( sk, transform ); + skeleton_debug( sk ); + + player->dev.device->get_camera( player, &player->dev, &player->cam ); + /* TODO: if dead copy ragdoll.. . */ +} + +VG_STATIC void player_render( camera *cam, player_interface *player ) +{ + shader_viewchar_use(); + vg_tex2d_bind( &tex_characters, 0 ); + shader_viewchar_uTexMain( 0 ); + shader_viewchar_uCamera( cam->transform[3] ); + shader_viewchar_uPv( cam->mtx.pv ); + shader_link_standard_ub( _shader_viewchar.id, 2 ); + glUniformMatrix4x3fv( _uniform_viewchar_uTransforms, + player->playeravatar->sk.bone_count, + 0, + (float *)player->playeravatar->sk.final_mtx ); + + mesh_bind( player->playermesh ); + mesh_draw( player->playermesh ); +} + VG_STATIC void player_debugtext( int size, const char *fmt, ... ) { char buffer[ 1024 ]; @@ -198,11 +257,12 @@ VG_STATIC void player_ui( player_interface *player ) { vg_uictx.cursor[0] = vg.window_x - 200; vg_uictx.cursor[1] = 0; - vg_uictx.cursor[2] = 0; + vg_uictx.cursor[2] = 200; vg_uictx.cursor[3] = 200; struct ui_vert *b = ui_fill_rect( vg_uictx.cursor, 0x70000000 ); + vg_uictx.cursor[0] = vg.window_x; player->dev.device->debug_ui( player, &player->dev ); b[2].co[1] = vg_uictx.cursor[1];