i hope your hapy
[carveJwlIkooP6JGAAIwe30JlM.git] / player_model.h
1 /*
2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
3 */
4
5 #ifndef CHARACTER_H
6 #define CHARACTER_H
7
8 #define VG_GAME
9 #include "vg/vg.h"
10
11 #include "model.h"
12 #include "skeleton.h"
13 #include "player_ragdoll.h"
14 #include "rigidbody.h"
15
16 #include "shaders/model_character_view.h"
17
18 struct player_avatar
19 {
20 mdl_context meta;
21 struct skeleton sk;
22
23 u32 id_hip,
24 id_ik_hand_l,
25 id_ik_hand_r,
26 id_ik_elbow_l,
27 id_ik_elbow_r,
28 id_head,
29 id_ik_foot_l,
30 id_ik_foot_r,
31 id_wheel_l,
32 id_wheel_r,
33 id_board;
34 };
35
36 #if 0
37 glmesh player_meshes[3];
38 #endif
39
40 VG_STATIC void player_avatar_load( struct player_avatar *av, const char *path )
41 {
42 /* load in reference player model, with animations and such */
43 /* FIXME: This is allocated as un-freeable systems memory */
44
45 mdl_open( &av->meta, path, vg_mem.rtmemory );
46 mdl_load_metadata_block( &av->meta, vg_mem.rtmemory );
47 mdl_load_animation_block( &av->meta, vg_mem.rtmemory );
48 mdl_close( &av->meta );
49
50 struct skeleton *sk = &av->sk;
51 skeleton_setup( sk, vg_mem.rtmemory, &av->meta );
52
53 av->id_hip = skeleton_bone_id( sk, "hips" );
54 av->id_ik_hand_l = skeleton_bone_id( sk, "hand.IK.L" );
55 av->id_ik_hand_r = skeleton_bone_id( sk, "hand.IK.R" );
56 av->id_ik_elbow_l = skeleton_bone_id( sk, "elbow.L" );
57 av->id_ik_elbow_r = skeleton_bone_id( sk, "elbow.R" );
58 av->id_head = skeleton_bone_id( sk, "head" );
59 av->id_ik_foot_l = skeleton_bone_id( sk, "foot.IK.L" );
60 av->id_ik_foot_r = skeleton_bone_id( sk, "foot.IK.R" );
61 av->id_board = skeleton_bone_id( sk, "board" );
62 av->id_wheel_l = skeleton_bone_id( sk, "wheel.L" );
63 av->id_wheel_r = skeleton_bone_id( sk, "wheel.R" );
64 }
65
66 #if 0
67 VG_STATIC void player_load_reference( struct player_model *pmodel )
68 {
69 shader_viewchar_register();
70 vg_acquire_thread_sync();
71 {
72 vg_tex2d_init( (vg_tex2d *[]){ &tex_characters }, 1 );
73 }
74 vg_release_thread_sync();
75
76 /* load in reference player model, with animations and such */
77 mdl_open( &player.mdl.meta, "models/ch_new.mdl" );
78 mdl_load_metadata( &player.mdl.meta, vg_mem.rtmemory );
79 mdl_load_anim_data( &player.mdl.meta, vg_mem.rtmemory );
80
81 vg_linear_clear( vg_mem.scratch );
82 mdl_load_mesh_data( &player.mdl.meta, vg_mem.scratch );
83 mdl_close( &player.mdl.meta );
84
85 /*
86 * load in other player models. This may need to be more sophisticated in
87 * the futre if we have more of these guys
88 */
89 mdl_context ctx_outlaw,
90 ctx_jordan;
91
92 mdl_open( &ctx_outlaw, "models/ch_outlaw.mdl" );
93 mdl_load_metadata( &ctx_outlaw, vg_mem.scratch );
94 mdl_load_mesh_data( &ctx_outlaw, vg_mem.scratch );
95 mdl_close( &ctx_outlaw );
96
97 mdl_open( &ctx_jordan, "models/ch_jordan.mdl" );
98 mdl_load_metadata( &ctx_jordan, vg_mem.scratch );
99 mdl_load_mesh_data( &ctx_jordan, vg_mem.scratch );
100 mdl_close( &ctx_jordan );
101
102 vg_acquire_thread_sync();
103 {
104 mdl_unpack_glmesh( &player.mdl.meta, &player.mdl.player_meshes[0] );
105 mdl_unpack_glmesh( &ctx_outlaw, &player.mdl.player_meshes[1] );
106 mdl_unpack_glmesh( &ctx_jordan, &player.mdl.player_meshes[2] );
107 }
108 vg_release_thread_sync();
109
110 skeleton_setup( &player.mdl.sk, vg_mem.rtmemory, &player.mdl.meta );
111 player_init_ragdoll();
112
113 /*
114 * Link animations
115 */
116 struct _load_anim
117 {
118 const char *name;
119 struct skeleton_anim **anim;
120 }
121 anims[] = {
122 { "pose_stand", &player.mdl.anim_stand },
123 { "pose_highg", &player.mdl.anim_highg },
124 { "pose_slide", &player.mdl.anim_slide },
125 { "pose_air", &player.mdl.anim_air },
126 { "push", &player.mdl.anim_push },
127 { "push_reverse", &player.mdl.anim_push_reverse },
128 { "ollie", &player.mdl.anim_ollie },
129 { "ollie_reverse",&player.mdl.anim_ollie_reverse },
130 { "grabs", &player.mdl.anim_grabs },
131 { "walk", &player.mdl.anim_walk },
132 { "run", &player.mdl.anim_run },
133 { "idle_cycle", &player.mdl.anim_idle },
134 { "jump", &player.mdl.anim_jump }
135 };
136
137 for( int i=0; i<vg_list_size(anims); i++ )
138 {
139 *anims[i].anim = skeleton_get_anim( &player.mdl.sk, anims[i].name );
140
141 if( !(*anims[i].anim) )
142 {
143 vg_error( "Animation '%s' is missing\n", anims[i].name );
144 vg_fatal_exit_loop( "Invalid character file" );
145 }
146 }
147
148 /*
149 * Link bones
150 */
151 struct _load_bone
152 {
153 const char *name;
154 u32 *bone_id;
155 }
156 bones[] = {
157 { "hips", &player.mdl.id_hip },
158 { "hand.IK.L", &player.mdl.id_ik_hand_l },
159 { "hand.IK.R", &player.mdl.id_ik_hand_r },
160 { "elbow.L", &player.mdl.id_ik_elbow_l },
161 { "elbow.R", &player.mdl.id_ik_elbow_r },
162 { "head", &player.mdl.id_head },
163 { "foot.IK.L", &player.mdl.id_ik_foot_l },
164 { "foot.IK.R", &player.mdl.id_ik_foot_r },
165 { "board", &player.mdl.id_board }
166 };
167
168 for( int i=0; i<vg_list_size(bones); i++ )
169 {
170 *bones[i].bone_id = skeleton_bone_id( &player.mdl.sk, bones[i].name );
171
172 if( !(*bones[i].bone_id) )
173 {
174 vg_error( "Required bone '%s' is missing\n", bones[i].name );
175 vg_fatal_exit_loop( "Invalid character file" );
176 }
177 }
178 }
179 #endif
180
181 #endif