X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_model.h;h=cab438e9d7c24afebffb36045a8486e0d5c441c1;hb=47941822dae18a018c985847b052e70214a3ccc6;hp=4766c1695951653828931bc91c1a39fcc3478d96;hpb=4f96bd0040e35ecb21d353ee2b895129682d22c1;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_model.h b/player_model.h index 4766c16..cab438e 100644 --- a/player_model.h +++ b/player_model.h @@ -11,7 +11,7 @@ vg_tex2d tex_characters = { .path = "textures/ch_gradient.qoi" }; -static void player_model_init(void) +VG_STATIC void player_model_init(void) { shader_viewchar_register(); vg_acquire_thread_sync(); @@ -19,112 +19,106 @@ static void player_model_init(void) vg_tex2d_init( (vg_tex2d *[]){ &tex_characters }, 1 ); } vg_release_thread_sync(); -} - -static void player_model_free(void *_) -{ - mesh_free( &player.mdl.mesh ); - vg_tex2d_free( (vg_tex2d *[]){ &tex_characters }, 1 ); -} - -/* - * Load model from file (.mdl) - */ -static void player_load_model( const char *name, int replace_mode ) -{ - char buf[64]; - - snprintf( buf, sizeof(buf)-1, "models/%s.mdl", name ); - mdl_header *src = mdl_load( buf ); - if( !src ) + /* load in reference player model, with animations and such */ + mdl_open( &player.mdl.meta, "models/ch_new.mdl" ); + mdl_load_metadata( &player.mdl.meta, vg_mem.rtmemory ); + mdl_load_anim_data( &player.mdl.meta, vg_mem.rtmemory ); + + vg_linear_clear( vg_mem.scratch ); + mdl_load_mesh_data( &player.mdl.meta, vg_mem.scratch ); + mdl_close( &player.mdl.meta ); + + /* + * load in other player models. This may need to be more sophisticated in + * the futre if we have more of these guys + */ + mdl_context ctx_outlaw, + ctx_jordan; + + mdl_open( &ctx_outlaw, "models/ch_outlaw.mdl" ); + mdl_load_metadata( &ctx_outlaw, vg_mem.scratch ); + mdl_load_mesh_data( &ctx_outlaw, vg_mem.scratch ); + mdl_close( &ctx_outlaw ); + + mdl_open( &ctx_jordan, "models/ch_jordan.mdl" ); + mdl_load_metadata( &ctx_jordan, vg_mem.scratch ); + mdl_load_mesh_data( &ctx_jordan, vg_mem.scratch ); + mdl_close( &ctx_jordan ); + + vg_acquire_thread_sync(); { - vg_error( "Could not load model\n" ); - return; + mdl_unpack_glmesh( &player.mdl.meta, &player.mdl.player_meshes[0] ); + mdl_unpack_glmesh( &ctx_outlaw, &player.mdl.player_meshes[1] ); + mdl_unpack_glmesh( &ctx_jordan, &player.mdl.player_meshes[2] ); } + vg_release_thread_sync(); - mesh_free( &player.mdl.mesh ); - mdl_unpack_glmesh( src, &player.mdl.mesh ); + skeleton_setup( &player.mdl.sk, vg_mem.rtmemory, &player.mdl.meta ); + player_init_ragdoll(); - if( !replace_mode ) + /* + * Link animations + */ + struct _load_anim { - if( !skeleton_setup( &player.mdl.sk, src ) ) - { - vg_error( "Model: %s\n", buf ); - vg_fatal_exit_loop( "No skeleton" ); - } - - /* - * Link animations - */ - struct _load_anim - { - const char *name; - struct skeleton_anim **anim; - } - anims[] = { - { "pose_stand", &player.mdl.anim_stand }, - { "pose_highg", &player.mdl.anim_highg }, - { "pose_slide", &player.mdl.anim_slide }, - { "pose_air", &player.mdl.anim_air }, - { "push", &player.mdl.anim_push }, - { "push_reverse", &player.mdl.anim_push_reverse }, - { "ollie", &player.mdl.anim_ollie }, - { "ollie_reverse",&player.mdl.anim_ollie_reverse }, - { "grabs", &player.mdl.anim_grabs }, - { "walk", &player.mdl.anim_walk }, - { "run", &player.mdl.anim_run }, - { "idle_cycle", &player.mdl.anim_idle }, - { "jump", &player.mdl.anim_jump } - }; + const char *name; + struct skeleton_anim **anim; + } + anims[] = { + { "pose_stand", &player.mdl.anim_stand }, + { "pose_highg", &player.mdl.anim_highg }, + { "pose_slide", &player.mdl.anim_slide }, + { "pose_air", &player.mdl.anim_air }, + { "push", &player.mdl.anim_push }, + { "push_reverse", &player.mdl.anim_push_reverse }, + { "ollie", &player.mdl.anim_ollie }, + { "ollie_reverse",&player.mdl.anim_ollie_reverse }, + { "grabs", &player.mdl.anim_grabs }, + { "walk", &player.mdl.anim_walk }, + { "run", &player.mdl.anim_run }, + { "idle_cycle", &player.mdl.anim_idle }, + { "jump", &player.mdl.anim_jump } + }; + + for( int i=0; i