X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_model.h;h=a2379fca6e3db158655a83e2bd53de5663afd2b5;hb=2ca677a0ec9d00db46a8b97bec30dbea8280a79b;hp=6483f06d4aeb2cf385e9b25cd47c76ab8673d136;hpb=3ee65e6e24bfc39db7c7dd8c1f4cec3d5c42d0f8;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_model.h b/player_model.h index 6483f06..a2379fc 100644 --- a/player_model.h +++ b/player_model.h @@ -1,48 +1,31 @@ -#ifndef CHARACTER_H +/* + * Copyright 2021-2022 (C) Mount0 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 "player.h" +#include "player_ragdoll.h" #include "shaders/viewchar.h" vg_tex2d tex_characters = { .path = "textures/ch_gradient.qoi" }; -static void character_register(void) +static void player_model_register(void) { shader_viewchar_register(); } -static void character_init(void) +static void player_model_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; - - 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 ) + +/* + * Load model from file (.mdl) + */ +static int player_load_model( const char *name ) { char buf[64]; @@ -51,39 +34,83 @@ static int character_load( struct character *ch, const char *name ) if( !src ) return 0; + + struct player_model *mdl = &player.mdl; - int error_count = 0; - mdl_unpack_glmesh( src, &ch->mesh ); + mdl_unpack_glmesh( src, &mdl->mesh ); + skeleton_setup( &mdl->sk, src ); + + /* + * Link animations + */ + struct _load_anim + { + 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 } + }; - 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->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" ); - + for( int i=0; isk, 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; + } + } + + /* + * Link bones + */ + struct _load_bone + { + 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 } + }; + + for( int i=0; isk, 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; + } + } + + player_init_ragdoll( src ); free( src ); return 1; -} -static void character_eval( struct character *ch ){} -static void character_draw( struct character *ch, float temp, m4x3f camera ){} -static void character_init_ragdoll_joints( struct character *ch ){} -static void character_init_ragdoll( struct character *ch ){} -static void character_ragdoll_go( struct character *ch, v3f pos ){} -static void character_ragdoll_copypose( struct character *ch, v3f v ){} -static void character_debug_ragdoll( struct character *ch ){} -static void character_ragdoll_iter( struct character *ch ){} +il_free_err: + free( src ); + return 0; +} #endif