2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
17 #include "player_ragdoll.h"
18 #include "rigidbody.h"
20 #include "shaders/viewchar.h"
27 v3f cam_pos
; /* FIXME ? */
30 struct skeleton_anim
*anim_stand
,
34 *anim_push
, *anim_push_reverse
,
35 *anim_ollie
, *anim_ollie_reverse
,
36 *anim_grabs
, *anim_stop
,
37 *anim_walk
, *anim_run
, *anim_idle
,
53 glmesh player_meshes
[3];
56 VG_STATIC
void player_avatar_load( struct player_avatar
*av
, const char *path
)
58 /* load in reference player model, with animations and such */
59 /* FIXME: This is allocated as un-freeable systems memory */
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
);
65 struct skeleton
*sk
= &av
->sk
;
66 skeleton_setup( sk
, vg_mem
.rtmemory
, &av
->meta
);
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" );
80 VG_STATIC
void player_load_reference( struct player_model
*pmodel
)
82 shader_viewchar_register();
83 vg_acquire_thread_sync();
85 vg_tex2d_init( (vg_tex2d
*[]){ &tex_characters
}, 1 );
87 vg_release_thread_sync();
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
);
94 vg_linear_clear( vg_mem
.scratch
);
95 mdl_load_mesh_data( &player
.mdl
.meta
, vg_mem
.scratch
);
96 mdl_close( &player
.mdl
.meta
);
99 * load in other player models. This may need to be more sophisticated in
100 * the futre if we have more of these guys
102 mdl_context ctx_outlaw
,
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
);
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
);
115 vg_acquire_thread_sync();
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] );
121 vg_release_thread_sync();
123 skeleton_setup( &player
.mdl
.sk
, vg_mem
.rtmemory
, &player
.mdl
.meta
);
124 player_init_ragdoll();
132 struct skeleton_anim
**anim
;
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
}
150 for( int i
=0; i
<vg_list_size(anims
); i
++ )
152 *anims
[i
].anim
= skeleton_get_anim( &player
.mdl
.sk
, anims
[i
].name
);
154 if( !(*anims
[i
].anim
) )
156 vg_error( "Animation '%s' is missing\n", anims
[i
].name
);
157 vg_fatal_exit_loop( "Invalid character file" );
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
}
181 for( int i
=0; i
<vg_list_size(bones
); i
++ )
183 *bones
[i
].bone_id
= skeleton_bone_id( &player
.mdl
.sk
, bones
[i
].name
);
185 if( !(*bones
[i
].bone_id
) )
187 vg_error( "Required bone '%s' is missing\n", bones
[i
].name
);
188 vg_fatal_exit_loop( "Invalid character file" );