2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
13 #include "player_ragdoll.h"
14 #include "rigidbody.h"
16 #include "shaders/model_character_view.h"
37 glmesh player_meshes
[3];
40 VG_STATIC
void player_avatar_load( struct player_avatar
*av
, const char *path
)
42 /* load in reference player model, with animations and such */
43 /* FIXME: This is allocated as un-freeable systems memory */
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
);
50 struct skeleton
*sk
= &av
->sk
;
51 skeleton_setup( sk
, vg_mem
.rtmemory
, &av
->meta
);
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" );
67 VG_STATIC
void player_load_reference( struct player_model
*pmodel
)
69 shader_viewchar_register();
70 vg_acquire_thread_sync();
72 vg_tex2d_init( (vg_tex2d
*[]){ &tex_characters
}, 1 );
74 vg_release_thread_sync();
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
);
81 vg_linear_clear( vg_mem
.scratch
);
82 mdl_load_mesh_data( &player
.mdl
.meta
, vg_mem
.scratch
);
83 mdl_close( &player
.mdl
.meta
);
86 * load in other player models. This may need to be more sophisticated in
87 * the futre if we have more of these guys
89 mdl_context ctx_outlaw
,
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
);
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
);
102 vg_acquire_thread_sync();
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] );
108 vg_release_thread_sync();
110 skeleton_setup( &player
.mdl
.sk
, vg_mem
.rtmemory
, &player
.mdl
.meta
);
111 player_init_ragdoll();
119 struct skeleton_anim
**anim
;
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
}
137 for( int i
=0; i
<vg_list_size(anims
); i
++ )
139 *anims
[i
].anim
= skeleton_get_anim( &player
.mdl
.sk
, anims
[i
].name
);
141 if( !(*anims
[i
].anim
) )
143 vg_error( "Animation '%s' is missing\n", anims
[i
].name
);
144 vg_fatal_exit_loop( "Invalid character file" );
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
}
168 for( int i
=0; i
<vg_list_size(bones
); i
++ )
170 *bones
[i
].bone_id
= skeleton_bone_id( &player
.mdl
.sk
, bones
[i
].name
);
172 if( !(*bones
[i
].bone_id
) )
174 vg_error( "Required bone '%s' is missing\n", bones
[i
].name
);
175 vg_fatal_exit_loop( "Invalid character file" );