X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_model.h;h=2567a83aac42668c46843d73e0cb4519b27536c1;hb=9d5997f1e611b66c7220f7eb388f427032d8da79;hp=a2379fca6e3db158655a83e2bd53de5663afd2b5;hpb=2ca677a0ec9d00db46a8b97bec30dbea8280a79b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_model.h b/player_model.h index a2379fc..2567a83 100644 --- a/player_model.h +++ b/player_model.h @@ -1,44 +1,118 @@ /* - * 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 #define CHARACTER_H -#include "player.h" +#define VG_GAME +#include "vg/vg.h" + +#include "model.h" +#include "skeleton.h" #include "player_ragdoll.h" -#include "shaders/viewchar.h" +#include "rigidbody.h" -vg_tex2d tex_characters = { .path = "textures/ch_gradient.qoi" }; +#include "shaders/model_character_view.h" -static void player_model_register(void) +struct player_avatar { - shader_viewchar_register(); -} + mdl_context meta; + struct skeleton sk; + + u32 id_hip, + id_ik_hand_l, + id_ik_hand_r, + id_ik_elbow_l, + id_ik_elbow_r, + id_head, + id_ik_foot_l, + id_ik_foot_r, + id_ik_knee_l, + id_ik_knee_r, + id_wheel_l, + id_wheel_r, + id_board; +}; + +#if 0 +glmesh player_meshes[3]; +#endif -static void player_model_init(void) +VG_STATIC void player_avatar_load( struct player_avatar *av, const char *path ) { - vg_tex2d_init( (vg_tex2d *[]){ &tex_characters }, 1 ); + /* load in reference player model, with animations and such */ + /* FIXME: This is allocated as un-freeable systems memory */ + + mdl_open( &av->meta, path, vg_mem.rtmemory ); + mdl_load_metadata_block( &av->meta, vg_mem.rtmemory ); + mdl_load_animation_block( &av->meta, vg_mem.rtmemory ); + mdl_close( &av->meta ); + + struct skeleton *sk = &av->sk; + skeleton_setup( sk, vg_mem.rtmemory, &av->meta ); + + av->id_hip = skeleton_bone_id( sk, "hips" ); + av->id_ik_hand_l = skeleton_bone_id( sk, "hand.IK.L" ); + av->id_ik_hand_r = skeleton_bone_id( sk, "hand.IK.R" ); + av->id_ik_elbow_l = skeleton_bone_id( sk, "elbow.L" ); + av->id_ik_elbow_r = skeleton_bone_id( sk, "elbow.R" ); + av->id_head = skeleton_bone_id( sk, "head" ); + av->id_ik_foot_l = skeleton_bone_id( sk, "foot.IK.L" ); + av->id_ik_foot_r = skeleton_bone_id( sk, "foot.IK.R" ); + av->id_board = skeleton_bone_id( sk, "board" ); + av->id_wheel_l = skeleton_bone_id( sk, "wheel.L" ); + av->id_wheel_r = skeleton_bone_id( sk, "wheel.R" ); + av->id_ik_knee_l = skeleton_bone_id( sk, "knee.L" ); + av->id_ik_knee_r = skeleton_bone_id( sk, "knee.R" ); } - -/* - * Load model from file (.mdl) - */ -static int player_load_model( const char *name ) +#if 0 +VG_STATIC void player_load_reference( struct player_model *pmodel ) { - char buf[64]; + shader_viewchar_register(); + vg_acquire_thread_sync(); + { + vg_tex2d_init( (vg_tex2d *[]){ &tex_characters }, 1 ); + } + vg_release_thread_sync(); - snprintf( buf, sizeof(buf)-1, "models/%s.mdl", name ); - mdl_header *src = mdl_load( buf ); + /* 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 ); - if( !src ) - return 0; + vg_linear_clear( vg_mem.scratch ); + mdl_load_mesh_data( &player.mdl.meta, vg_mem.scratch ); + mdl_close( &player.mdl.meta ); - struct player_model *mdl = &player.mdl; + /* + * 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 ); - mdl_unpack_glmesh( src, &mdl->mesh ); - skeleton_setup( &mdl->sk, src ); + 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 @@ -49,29 +123,29 @@ 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", &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; isk, anims[i].name ); + *anims[i].anim = skeleton_get_anim( &player.mdl.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_error( "Animation '%s' is missing\n", anims[i].name ); + vg_fatal_exit_loop( "Invalid character file" ); } } @@ -84,33 +158,28 @@ 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", &player.mdl.id_hip }, + { "hand.IK.L", &player.mdl.id_ik_hand_l }, + { "hand.IK.R", &player.mdl.id_ik_hand_r }, + { "elbow.L", &player.mdl.id_ik_elbow_l }, + { "elbow.R", &player.mdl.id_ik_elbow_r }, + { "head", &player.mdl.id_head }, + { "foot.IK.L", &player.mdl.id_ik_foot_l }, + { "foot.IK.R", &player.mdl.id_ik_foot_r }, + { "board", &player.mdl.id_board } }; for( int i=0; isk, bones[i].name ); + *bones[i].bone_id = skeleton_bone_id( &player.mdl.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_error( "Required bone '%s' is missing\n", bones[i].name ); + vg_fatal_exit_loop( "Invalid character file" ); } } - - player_init_ragdoll( src ); - free( src ); - return 1; - -il_free_err: - free( src ); - return 0; } +#endif #endif