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"
39 glmesh player_meshes
[3];
42 VG_STATIC
void player_avatar_load( struct player_avatar
*av
, const char *path
)
44 /* load in reference player model, with animations and such */
45 /* FIXME: This is allocated as un-freeable systems memory */
47 mdl_open( &av
->meta
, path
, vg_mem
.rtmemory
);
48 mdl_load_metadata_block( &av
->meta
, vg_mem
.rtmemory
);
49 mdl_load_animation_block( &av
->meta
, vg_mem
.rtmemory
);
50 mdl_close( &av
->meta
);
52 struct skeleton
*sk
= &av
->sk
;
53 skeleton_setup( sk
, vg_mem
.rtmemory
, &av
->meta
);
55 av
->id_hip
= skeleton_bone_id( sk
, "hips" );
56 av
->id_ik_hand_l
= skeleton_bone_id( sk
, "hand.IK.L" );
57 av
->id_ik_hand_r
= skeleton_bone_id( sk
, "hand.IK.R" );
58 av
->id_ik_elbow_l
= skeleton_bone_id( sk
, "elbow.L" );
59 av
->id_ik_elbow_r
= skeleton_bone_id( sk
, "elbow.R" );
60 av
->id_head
= skeleton_bone_id( sk
, "head" );
61 av
->id_ik_foot_l
= skeleton_bone_id( sk
, "foot.IK.L" );
62 av
->id_ik_foot_r
= skeleton_bone_id( sk
, "foot.IK.R" );
63 av
->id_board
= skeleton_bone_id( sk
, "board" );
64 av
->id_wheel_l
= skeleton_bone_id( sk
, "wheel.L" );
65 av
->id_wheel_r
= skeleton_bone_id( sk
, "wheel.R" );
66 av
->id_ik_knee_l
= skeleton_bone_id( sk
, "knee.L" );
67 av
->id_ik_knee_r
= skeleton_bone_id( sk
, "knee.R" );
71 VG_STATIC
void player_load_reference( struct player_model
*pmodel
)
73 shader_viewchar_register();
74 vg_acquire_thread_sync();
76 vg_tex2d_init( (vg_tex2d
*[]){ &tex_characters
}, 1 );
78 vg_release_thread_sync();
80 /* load in reference player model, with animations and such */
81 mdl_open( &player
.mdl
.meta
, "models/ch_new.mdl" );
82 mdl_load_metadata( &player
.mdl
.meta
, vg_mem
.rtmemory
);
83 mdl_load_anim_data( &player
.mdl
.meta
, vg_mem
.rtmemory
);
85 vg_linear_clear( vg_mem
.scratch
);
86 mdl_load_mesh_data( &player
.mdl
.meta
, vg_mem
.scratch
);
87 mdl_close( &player
.mdl
.meta
);
90 * load in other player models. This may need to be more sophisticated in
91 * the futre if we have more of these guys
93 mdl_context ctx_outlaw
,
96 mdl_open( &ctx_outlaw
, "models/ch_outlaw.mdl" );
97 mdl_load_metadata( &ctx_outlaw
, vg_mem
.scratch
);
98 mdl_load_mesh_data( &ctx_outlaw
, vg_mem
.scratch
);
99 mdl_close( &ctx_outlaw
);
101 mdl_open( &ctx_jordan
, "models/ch_jordan.mdl" );
102 mdl_load_metadata( &ctx_jordan
, vg_mem
.scratch
);
103 mdl_load_mesh_data( &ctx_jordan
, vg_mem
.scratch
);
104 mdl_close( &ctx_jordan
);
106 vg_acquire_thread_sync();
108 mdl_unpack_glmesh( &player
.mdl
.meta
, &player
.mdl
.player_meshes
[0] );
109 mdl_unpack_glmesh( &ctx_outlaw
, &player
.mdl
.player_meshes
[1] );
110 mdl_unpack_glmesh( &ctx_jordan
, &player
.mdl
.player_meshes
[2] );
112 vg_release_thread_sync();
114 skeleton_setup( &player
.mdl
.sk
, vg_mem
.rtmemory
, &player
.mdl
.meta
);
115 player_init_ragdoll();
123 struct skeleton_anim
**anim
;
126 { "pose_stand", &player
.mdl
.anim_stand
},
127 { "pose_highg", &player
.mdl
.anim_highg
},
128 { "pose_slide", &player
.mdl
.anim_slide
},
129 { "pose_air", &player
.mdl
.anim_air
},
130 { "push", &player
.mdl
.anim_push
},
131 { "push_reverse", &player
.mdl
.anim_push_reverse
},
132 { "ollie", &player
.mdl
.anim_ollie
},
133 { "ollie_reverse",&player
.mdl
.anim_ollie_reverse
},
134 { "grabs", &player
.mdl
.anim_grabs
},
135 { "walk", &player
.mdl
.anim_walk
},
136 { "run", &player
.mdl
.anim_run
},
137 { "idle_cycle", &player
.mdl
.anim_idle
},
138 { "jump", &player
.mdl
.anim_jump
}
141 for( int i
=0; i
<vg_list_size(anims
); i
++ )
143 *anims
[i
].anim
= skeleton_get_anim( &player
.mdl
.sk
, anims
[i
].name
);
145 if( !(*anims
[i
].anim
) )
147 vg_error( "Animation '%s' is missing\n", anims
[i
].name
);
148 vg_fatal_exit_loop( "Invalid character file" );
161 { "hips", &player
.mdl
.id_hip
},
162 { "hand.IK.L", &player
.mdl
.id_ik_hand_l
},
163 { "hand.IK.R", &player
.mdl
.id_ik_hand_r
},
164 { "elbow.L", &player
.mdl
.id_ik_elbow_l
},
165 { "elbow.R", &player
.mdl
.id_ik_elbow_r
},
166 { "head", &player
.mdl
.id_head
},
167 { "foot.IK.L", &player
.mdl
.id_ik_foot_l
},
168 { "foot.IK.R", &player
.mdl
.id_ik_foot_r
},
169 { "board", &player
.mdl
.id_board
}
172 for( int i
=0; i
<vg_list_size(bones
); i
++ )
174 *bones
[i
].bone_id
= skeleton_bone_id( &player
.mdl
.sk
, bones
[i
].name
);
176 if( !(*bones
[i
].bone_id
) )
178 vg_error( "Required bone '%s' is missing\n", bones
[i
].name
);
179 vg_fatal_exit_loop( "Invalid character file" );