X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_model.h;h=f2b375aa19988ba7391f5042cb67880ae8aa1ddf;hb=c33e4f46d864b2fde0c5938bf5a9388b1e8b5c04;hp=e0693b16433aad19987cf4b81ade116c0d6269e4;hpb=c2d67378dd5c82de50b8fbbbe222ec6be2da4eee;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_model.h b/player_model.h index e0693b1..f2b375a 100644 --- a/player_model.h +++ b/player_model.h @@ -1,5 +1,5 @@ /* - * Copyright 2021-2022 (C) Mount0 Software, Harry Godden - All Rights Reserved + * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved */ #ifndef CHARACTER_H @@ -11,29 +11,26 @@ vg_tex2d tex_characters = { .path = "textures/ch_gradient.qoi" }; -static int player_model_init(void) +static void player_model_init(void) { shader_viewchar_register(); - - if( vg_acquire_thread_sync(1) ) + vg_acquire_thread_sync(); { vg_tex2d_init( (vg_tex2d *[]){ &tex_characters }, 1 ); - vg_release_thread_sync(1); - return 1; } - else - return 0; + 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 int player_load_model( const char *name ) +static void player_load_model( const char *name ) { char buf[64]; @@ -41,14 +38,15 @@ static int player_load_model( const char *name ) mdl_header *src = mdl_load( buf ); if( !src ) - return 0; + { + vg_error( "Could not load model\n" ); + return; + } - struct player_model *mdl = &player.mdl; - - if( !mdl_unpack_glmesh( src, &mdl->mesh ) ) - goto il_free_err; + struct player_model temp; - skeleton_setup( &mdl->sk, src ); + mdl_unpack_glmesh( src, &temp.mesh ); + skeleton_setup( &temp.sk, src ); /* * Link animations @@ -59,29 +57,31 @@ static int player_load_model( const char *name ) struct skeleton_anim **anim; } anims[] = { - { "pose_stand", &mdl->anim_stand }, - { "pose_highg", &mdl->anim_highg }, - { "pose_slide", &mdl->anim_slide }, - { "pose_air", &mdl->anim_air }, - { "push", &mdl->anim_push }, - { "push_reverse", &mdl->anim_push_reverse }, - { "ollie", &mdl->anim_ollie }, - { "ollie_reverse",&mdl->anim_ollie_reverse }, - { "grabs", &mdl->anim_grabs }, - { "walk", &mdl->anim_walk }, - { "run", &mdl->anim_run }, - { "idle_cycle", &mdl->anim_idle } + { "pose_stand", &temp.anim_stand }, + { "pose_highg", &temp.anim_highg }, + { "pose_slide", &temp.anim_slide }, + { "pose_air", &temp.anim_air }, + { "push", &temp.anim_push }, + { "push_reverse", &temp.anim_push_reverse }, + { "ollie", &temp.anim_ollie }, + { "ollie_reverse",&temp.anim_ollie_reverse }, + { "grabs", &temp.anim_grabs }, + { "walk", &temp.anim_walk }, + { "run", &temp.anim_run }, + { "idle_cycle", &temp.anim_idle }, + { "jump", &temp.anim_jump } }; for( int i=0; isk, anims[i].name ); + *anims[i].anim = skeleton_get_anim( &temp.sk, anims[i].name ); if( !(*anims[i].anim) ) { vg_error( "Animation '%s' is missing from character '%s'\n", anims[i].name, name ); - goto il_free_err; + vg_free( src ); + return; } } @@ -94,33 +94,32 @@ static int player_load_model( const char *name ) u32 *bone_id; } bones[] = { - { "hips", &mdl->id_hip }, - { "hand.IK.L", &mdl->id_ik_hand_l }, - { "hand.IK.R", &mdl->id_ik_hand_r }, - { "elbow.L", &mdl->id_ik_elbow_l }, - { "elbow.R", &mdl->id_ik_elbow_r }, - { "head", &mdl->id_head } + { "hips", &temp.id_hip }, + { "hand.IK.L", &temp.id_ik_hand_l }, + { "hand.IK.R", &temp.id_ik_hand_r }, + { "elbow.L", &temp.id_ik_elbow_l }, + { "elbow.R", &temp.id_ik_elbow_r }, + { "head", &temp.id_head } }; for( int i=0; isk, bones[i].name ); + *bones[i].bone_id = skeleton_bone_id( &temp.sk, bones[i].name ); if( !(*bones[i].bone_id) ) { vg_error( "Required bone '%s' is missing from character '%s'\n", bones[i].name, name ); - goto il_free_err; + vg_free( src ); + return; } } + /* swap temp into actual model */ + mesh_free( &player.mdl.mesh ); + player.mdl = temp; player_init_ragdoll( src ); - free( src ); - return 1; - -il_free_err: - free( src ); - return 0; + vg_free( src ); } #endif