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/viewchar.h"
35 glmesh player_meshes
[3];
38 VG_STATIC
void player_avatar_load( struct player_avatar
*av
, const char *path
)
40 /* load in reference player model, with animations and such */
41 /* FIXME: This is allocated as un-freeable systems memory */
43 mdl_open( &av
->meta
, path
);
44 mdl_load_metadata( &av
->meta
, vg_mem
.rtmemory
);
45 mdl_load_anim_data( &av
->meta
, vg_mem
.rtmemory
);
47 struct skeleton
*sk
= &av
->sk
;
48 skeleton_setup( sk
, vg_mem
.rtmemory
, &av
->meta
);
50 av
->id_hip
= skeleton_bone_id( sk
, "hips" );
51 av
->id_ik_hand_l
= skeleton_bone_id( sk
, "hand.IK.L" );
52 av
->id_ik_hand_r
= skeleton_bone_id( sk
, "hand.IK.R" );
53 av
->id_ik_elbow_l
= skeleton_bone_id( sk
, "elbow.L" );
54 av
->id_ik_elbow_r
= skeleton_bone_id( sk
, "elbow.R" );
55 av
->id_head
= skeleton_bone_id( sk
, "head" );
56 av
->id_ik_foot_l
= skeleton_bone_id( sk
, "foot.IK.L" );
57 av
->id_ik_foot_r
= skeleton_bone_id( sk
, "foot.IK.R" );
58 av
->id_board
= skeleton_bone_id( sk
, "board" );
62 VG_STATIC
void player_load_reference( struct player_model
*pmodel
)
64 shader_viewchar_register();
65 vg_acquire_thread_sync();
67 vg_tex2d_init( (vg_tex2d
*[]){ &tex_characters
}, 1 );
69 vg_release_thread_sync();
71 /* load in reference player model, with animations and such */
72 mdl_open( &player
.mdl
.meta
, "models/ch_new.mdl" );
73 mdl_load_metadata( &player
.mdl
.meta
, vg_mem
.rtmemory
);
74 mdl_load_anim_data( &player
.mdl
.meta
, vg_mem
.rtmemory
);
76 vg_linear_clear( vg_mem
.scratch
);
77 mdl_load_mesh_data( &player
.mdl
.meta
, vg_mem
.scratch
);
78 mdl_close( &player
.mdl
.meta
);
81 * load in other player models. This may need to be more sophisticated in
82 * the futre if we have more of these guys
84 mdl_context ctx_outlaw
,
87 mdl_open( &ctx_outlaw
, "models/ch_outlaw.mdl" );
88 mdl_load_metadata( &ctx_outlaw
, vg_mem
.scratch
);
89 mdl_load_mesh_data( &ctx_outlaw
, vg_mem
.scratch
);
90 mdl_close( &ctx_outlaw
);
92 mdl_open( &ctx_jordan
, "models/ch_jordan.mdl" );
93 mdl_load_metadata( &ctx_jordan
, vg_mem
.scratch
);
94 mdl_load_mesh_data( &ctx_jordan
, vg_mem
.scratch
);
95 mdl_close( &ctx_jordan
);
97 vg_acquire_thread_sync();
99 mdl_unpack_glmesh( &player
.mdl
.meta
, &player
.mdl
.player_meshes
[0] );
100 mdl_unpack_glmesh( &ctx_outlaw
, &player
.mdl
.player_meshes
[1] );
101 mdl_unpack_glmesh( &ctx_jordan
, &player
.mdl
.player_meshes
[2] );
103 vg_release_thread_sync();
105 skeleton_setup( &player
.mdl
.sk
, vg_mem
.rtmemory
, &player
.mdl
.meta
);
106 player_init_ragdoll();
114 struct skeleton_anim
**anim
;
117 { "pose_stand", &player
.mdl
.anim_stand
},
118 { "pose_highg", &player
.mdl
.anim_highg
},
119 { "pose_slide", &player
.mdl
.anim_slide
},
120 { "pose_air", &player
.mdl
.anim_air
},
121 { "push", &player
.mdl
.anim_push
},
122 { "push_reverse", &player
.mdl
.anim_push_reverse
},
123 { "ollie", &player
.mdl
.anim_ollie
},
124 { "ollie_reverse",&player
.mdl
.anim_ollie_reverse
},
125 { "grabs", &player
.mdl
.anim_grabs
},
126 { "walk", &player
.mdl
.anim_walk
},
127 { "run", &player
.mdl
.anim_run
},
128 { "idle_cycle", &player
.mdl
.anim_idle
},
129 { "jump", &player
.mdl
.anim_jump
}
132 for( int i
=0; i
<vg_list_size(anims
); i
++ )
134 *anims
[i
].anim
= skeleton_get_anim( &player
.mdl
.sk
, anims
[i
].name
);
136 if( !(*anims
[i
].anim
) )
138 vg_error( "Animation '%s' is missing\n", anims
[i
].name
);
139 vg_fatal_exit_loop( "Invalid character file" );
152 { "hips", &player
.mdl
.id_hip
},
153 { "hand.IK.L", &player
.mdl
.id_ik_hand_l
},
154 { "hand.IK.R", &player
.mdl
.id_ik_hand_r
},
155 { "elbow.L", &player
.mdl
.id_ik_elbow_l
},
156 { "elbow.R", &player
.mdl
.id_ik_elbow_r
},
157 { "head", &player
.mdl
.id_head
},
158 { "foot.IK.L", &player
.mdl
.id_ik_foot_l
},
159 { "foot.IK.R", &player
.mdl
.id_ik_foot_r
},
160 { "board", &player
.mdl
.id_board
}
163 for( int i
=0; i
<vg_list_size(bones
); i
++ )
165 *bones
[i
].bone_id
= skeleton_bone_id( &player
.mdl
.sk
, bones
[i
].name
);
167 if( !(*bones
[i
].bone_id
) )
169 vg_error( "Required bone '%s' is missing\n", bones
[i
].name
);
170 vg_fatal_exit_loop( "Invalid character file" );