X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_model.h;h=cab438e9d7c24afebffb36045a8486e0d5c441c1;hb=47941822dae18a018c985847b052e70214a3ccc6;hp=95b5a7624de95832f4ce58b242f925a8e54d9238;hpb=46643f969b12c2144a5f15ac5509610f18b467e4;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_model.h b/player_model.h index 95b5a76..cab438e 100644 --- a/player_model.h +++ b/player_model.h @@ -1,92 +1,124 @@ -#ifndef CHARACTER_H +/* + * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved + */ + +#ifndef CHARACTER_H #define CHARACTER_H -#include "common.h" -#include "model.h" -#include "rigidbody.h" -#include "render.h" -#include "skeleton.h" -#include "skeleton_animator.h" +#include "player.h" +#include "player_ragdoll.h" #include "shaders/viewchar.h" vg_tex2d tex_characters = { .path = "textures/ch_gradient.qoi" }; -static void character_register(void) +VG_STATIC void player_model_init(void) { shader_viewchar_register(); -} - -static void character_init(void) -{ - vg_tex2d_init( (vg_tex2d *[]){ &tex_characters }, 1 ); -} - -struct character -{ - glmesh mesh; - struct skeleton sk; - struct skeleton_anim *anim_stand, - *anim_highg, - *anim_slide, - *anim_air, - *anim_push, *anim_push_reverse, - *anim_ollie; - - u32 id_hip, - id_ik_hand_l, - id_ik_hand_r, - id_ik_elbow_l, - id_ik_elbow_r, - id_head; - - v3f cam_pos; - - int shoes[2]; -}; - -static int character_load( struct character *ch, const char *name ) -{ - char buf[64]; - - snprintf( buf, sizeof(buf)-1, "models/%s.mdl", name ); - mdl_header *src = mdl_load( buf ); - - if( !src ) - return 0; + vg_acquire_thread_sync(); + { + vg_tex2d_init( (vg_tex2d *[]){ &tex_characters }, 1 ); + } + vg_release_thread_sync(); + + /* 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 ); - int error_count = 0; - mdl_unpack_glmesh( src, &ch->mesh ); + vg_acquire_thread_sync(); + { + 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(); + + skeleton_setup( &player.mdl.sk, vg_mem.rtmemory, &player.mdl.meta ); + player_init_ragdoll(); + + /* + * 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 } + }; - if( !error_count ) - vg_success( "Loaded character file '%s' with no errors\n", name ); - - skeleton_setup( &ch->sk, src ); - ch->anim_stand = skeleton_get_anim( &ch->sk, "pose_stand" ); - ch->anim_highg = skeleton_get_anim( &ch->sk, "pose_highg" ); - ch->anim_slide = skeleton_get_anim( &ch->sk, "pose_slide" ); - ch->anim_air = skeleton_get_anim( &ch->sk, "pose_air" ); - ch->anim_push = skeleton_get_anim( &ch->sk, "push" ); - ch->anim_push_reverse = skeleton_get_anim( &ch->sk, "push_reverse" ); - ch->anim_ollie = skeleton_get_anim( &ch->sk, "ollie" ); - - ch->id_hip = skeleton_bone_id( &ch->sk, "hips" ); - ch->id_ik_hand_l = skeleton_bone_id( &ch->sk, "hand.IK.L" ); - ch->id_ik_hand_r = skeleton_bone_id( &ch->sk, "hand.IK.R" ); - ch->id_ik_elbow_l = skeleton_bone_id( &ch->sk, "elbow.L" ); - ch->id_ik_elbow_r = skeleton_bone_id( &ch->sk, "elbow.R" ); - ch->id_head = skeleton_bone_id( &ch->sk, "head" ); - - free( src ); - return 1; + for( int i=0; i