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