diff --git a/config/rel_slices.yml b/config/rel_slices.yml index cf830f3a..5d4a34d8 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -1405,6 +1405,8 @@ data/npc/model/tex/brd_9.c: .data: [0x8077D980, 0x8077E6A0] data/npc/model/tex/brd_10.c: .data: [0x8077E6A0, 0x8077F3C0] +data/player/BOY_part_data.c: + .data: [0x807D5F60, 0x807D5FE8] data/npc/model/mdl/fox_1.c: .data: [0x807D5FE8, 0x807D8098] data/npc/model/tex/fox_1.c: diff --git a/include/c_keyframe.h b/include/c_keyframe.h index 34aa8f49..93333990 100644 --- a/include/c_keyframe.h +++ b/include/c_keyframe.h @@ -382,10 +382,10 @@ extern void cKF_SkeletonInfo_R_combine_work_set(cKF_SkeletonInfo_R_combine_work_ * @param joint Pointer to the joint data. * @param flag Pointer to the current joint flag. * @param combine Pointer to the combine work set structure. - * @param cwork_num Pointer to the current work layer number. + * @param part_table Pointer to the current part table. */ extern void cKF_SkeletonInfo_R_combine_translation(s16** joint, int* flag, cKF_SkeletonInfo_R_combine_work_c* combine, - s8* cwork_num); + s8* part_table); /** * Combines rotation data from multiple animation layers for a joint, modifying it based on animation flags. @@ -393,34 +393,34 @@ extern void cKF_SkeletonInfo_R_combine_translation(s16** joint, int* flag, cKF_S * @param joint Pointer to the current joint's rotation data. * @param flag Pointer to the animation flag affecting the current joint. * @param combine Pointer to the combine work set structure containing animation layer data. - * @param cwork_num Pointer to the layer number being processed. + * @param part_table Pointer to the current part table. */ extern void cKF_SkeletonInfo_R_combine_rotation(s16** joint, int* flag, cKF_SkeletonInfo_R_combine_work_c* combine, - s8* cwork_num); + s8* part_table); /** * Combines and plays two sets of animation data, applying translations and rotations from both. * * @param info1 First skeleton info structure to combine. * @param info2 Second skeleton info structure to combine. - * @param flag Pointer to a flag determining the combination behavior. + * @param part_table Pointer to the part table determining the combination behavior. * @return Status of the combination and play operation. */ -extern int cKF_SkeletonInfo_R_combine_play(cKF_SkeletonInfo_R_c* info1, cKF_SkeletonInfo_R_c* info2, s8* flag); +extern int cKF_SkeletonInfo_R_combine_play(cKF_SkeletonInfo_R_c* info1, cKF_SkeletonInfo_R_c* info2, s8* part_table); /** * Combines and plays three sets of animation data, applying translations and rotations, and updates playback state. * - * @param arg1 Result of playing first animation. - * @param arg2 Result of playing second animation. - * @param arg3 Result of playing third animation. + * @param state1 Result of playing first animation. + * @param state2 Result of playing second animation. + * @param state3 Result of playing third animation. * @param info1 First skeleton info structure to combine. * @param info2 Second skeleton info structure to combine. * @param info3 Third skeleton info structure to combine. - * @param flag Pointer to a flag determining the combination behavior. + * @param part_table Pointer to the part table determining the combination behavior. */ -extern void cKF_SkeletonInfo_R_T_combine_play(int* arg1, int* arg2, int* arg3, cKF_SkeletonInfo_R_c* info1, - cKF_SkeletonInfo_R_c* info2, cKF_SkeletonInfo_R_c* info3, s8* flag); +extern void cKF_SkeletonInfo_R_T_combine_play(int* state1, int* state2, int* state3, cKF_SkeletonInfo_R_c* info1, + cKF_SkeletonInfo_R_c* info2, cKF_SkeletonInfo_R_c* info3, s8* part_table); /** * Sets base shape translation and rotation for a skeleton info structure. diff --git a/src/c_keyframe.c b/src/c_keyframe.c index 7036c087..e9b14c18 100644 --- a/src/c_keyframe.c +++ b/src/c_keyframe.c @@ -74,7 +74,7 @@ static int cKF_FrameControl_passCheck(cKF_FrameControl_c* fc, f32 current, f32* *out = 0.0f; cur = fc->current_frame; if (cur == current) { - return 0; + return FALSE; } speed = (fc->start_frame < fc->end_frame) ? fc->speed : -fc->speed; @@ -83,24 +83,24 @@ static int cKF_FrameControl_passCheck(cKF_FrameControl_c* fc, f32 current, f32* if ((speed >= 0.0f && cur < current && cur + speed >= current) || (speed < 0.0f && cur > current && cur + speed <= current)) { *out = cur + speed - current; // Calculate overshoot - return 1; + return TRUE; } - return 0; + return FALSE; } extern int cKF_FrameControl_passCheck_now(cKF_FrameControl_c* fc, f32 current) { f32 cur = fc->current_frame; f32 speed; - int ret = 0; + int ret = FALSE; if (cur != current) { speed = (fc->start_frame < fc->end_frame) ? fc->speed : -fc->speed; if ((speed >= 0.0f && cur >= current && cur - speed < current) || (speed < 0.0f && cur <= current && cur - speed > current)) { - ret = 1; + ret = TRUE; } } else { - ret = 1; + ret = TRUE; } return ret; } @@ -743,13 +743,13 @@ extern void cKF_SkeletonInfo_R_combine_work_set(cKF_SkeletonInfo_R_combine_work_ } extern void cKF_SkeletonInfo_R_combine_translation(s16** joint, int* flag, cKF_SkeletonInfo_R_combine_work_c* combine, - s8* cwork_num) { - int i = 0; + s8* part_table) { + int i; - for (i; i < 3; i++) { - switch (*cwork_num) { + for (i = 0; i < 3; i++) { + /* Determine which animation we should pull from for the joint */ + switch (*part_table) { case 0: - if (*combine[0].anm_check_bit_tbl & *flag) { (**joint) = cKF_KeyCalc(combine[0].anm_data_src_idx, combine[0].anm_key_num[combine[0].anm_key_num_idx], @@ -760,7 +760,6 @@ extern void cKF_SkeletonInfo_R_combine_translation(s16** joint, int* flag, cKF_S break; case 1: - if (*combine[1].anm_check_bit_tbl & *flag) { (**joint) = cKF_KeyCalc(combine[1].anm_data_src_idx, combine[1].anm_key_num[combine[1].anm_key_num_idx], @@ -771,7 +770,6 @@ extern void cKF_SkeletonInfo_R_combine_translation(s16** joint, int* flag, cKF_S break; case 2: - if (*combine[2].anm_check_bit_tbl & *flag) { (**joint) = cKF_KeyCalc(combine[2].anm_data_src_idx, combine[2].anm_key_num[combine[2].anm_key_num_idx], @@ -789,12 +787,14 @@ extern void cKF_SkeletonInfo_R_combine_translation(s16** joint, int* flag, cKF_S } else { combine[0].anm_const_val_tbl_idx++; } + if (*combine[1].anm_check_bit_tbl & *flag) { combine[1].anm_data_src_idx += combine[1].anm_key_num[combine[1].anm_key_num_idx]; combine[1].anm_key_num_idx++; } else { combine[1].anm_const_val_tbl_idx++; } + if (*combine[2].anm_check_bit_tbl & *flag) { combine[2].anm_data_src_idx += combine[2].anm_key_num[combine[2].anm_key_num_idx]; combine[2].anm_key_num_idx++; @@ -808,17 +808,17 @@ extern void cKF_SkeletonInfo_R_combine_translation(s16** joint, int* flag, cKF_S } extern void cKF_SkeletonInfo_R_combine_rotation(s16** joint, int* flag, cKF_SkeletonInfo_R_combine_work_c* combine, - s8* cwork_num) { - int i = 0; + s8* part_table) { + int i; int j; - s16* temp; f32 calc_joint; - for (i; i < combine->keyframe->skeleton->num_joints; i++) { + for (i = 0; i < combine->keyframe->skeleton->num_joints; i++) { *flag = 4; for (j = 0; j < 3; j++) { - switch (cwork_num[i + 1]) { + /* Determine which animation we should pull from for the joint */ + switch (part_table[i + 1]) { case 0: if (*flag & combine[0].anm_check_bit_tbl[i]) { (**joint) = @@ -868,54 +868,54 @@ extern void cKF_SkeletonInfo_R_combine_rotation(s16** joint, int* flag, cKF_Skel combine[2].anm_const_val_tbl_idx++; } - temp = *joint; - calc_joint = 0.1f * (*temp); - **joint = (s16)(int)((calc_joint - ((f32)(int)(calc_joint * 0.0027777778f) * 360.0f)) * 182.04445f); + /* + * At this point, rotation values in joint are encoded in [degree.x] format. + * This gives one decimal of rotational precision. We then convert from degrees to + * s16 binangle. + */ + /* s16 degree -> float degree with 1 decimal place precision */ + calc_joint = 0.1f * (**joint); + /* degree (unbound) -> [0.0f, 360.0f) -> binangle [-32768, 32767] */ + **joint = (s16)DEG2SHORT_ANGLE2(MOD_F(calc_joint, 360.0f)); *flag = (u32)*flag >> 1; *joint += 1; } } } -extern int cKF_SkeletonInfo_R_combine_play(cKF_SkeletonInfo_R_c* info1, cKF_SkeletonInfo_R_c* info2, s8* flag) { +extern int cKF_SkeletonInfo_R_combine_play(cKF_SkeletonInfo_R_c* info1, cKF_SkeletonInfo_R_c* info2, s8* part_table) { int combinet; s16* joint; - - cKF_SkeletonInfo_R_combine_work_c combine1; - cKF_SkeletonInfo_R_combine_work_c combine2; - cKF_SkeletonInfo_R_combine_work_c combine3; - + cKF_SkeletonInfo_R_combine_work_c combine[3]; int i; - int j; - s_xyz* joint2; s_xyz* applyjoint; - if ((info1 == NULL) || (info2 == NULL) || (flag == NULL)) { + if ((info1 == NULL) || (info2 == NULL) || (part_table == NULL)) { return cKF_STATE_NONE; } joint = (F32_IS_ZERO(info1->morph_counter)) ? &info1->current_joint->x : &info1->target_joint->x; if (info1 != NULL) { - cKF_SkeletonInfo_R_combine_work_set(&combine3, info1); + cKF_SkeletonInfo_R_combine_work_set(&combine[0], info1); } if (info2 != NULL) { - cKF_SkeletonInfo_R_combine_work_set(&combine2, info2); - cKF_SkeletonInfo_R_combine_work_set(&combine1, info2); + cKF_SkeletonInfo_R_combine_work_set(&combine[1], info2); + cKF_SkeletonInfo_R_combine_work_set(&combine[2], info2); } combinet = 0x20; - cKF_SkeletonInfo_R_combine_translation(&joint, &combinet, &combine3, flag); - cKF_SkeletonInfo_R_combine_rotation(&joint, &combinet, &combine3, flag); + cKF_SkeletonInfo_R_combine_translation(&joint, &combinet, &combine[0], part_table); + cKF_SkeletonInfo_R_combine_rotation(&joint, &combinet, &combine[0], part_table); if (info1->rotation_diff_table != NULL) { applyjoint = (F32_IS_ZERO(info1->morph_counter)) ? info1->current_joint : info1->target_joint; applyjoint += 1; - for (i = 0, j = 0; i < info1->skeleton->num_joints; i++, j++) { - applyjoint->x += info1->rotation_diff_table[j].x; - applyjoint->y += info1->rotation_diff_table[j].y; - applyjoint->z += info1->rotation_diff_table[j].z; + for (i = 0; i < info1->skeleton->num_joints; i++) { + applyjoint->x += info1->rotation_diff_table[i].x; + applyjoint->y += info1->rotation_diff_table[i].y; + applyjoint->z += info1->rotation_diff_table[i].z; applyjoint++; } @@ -923,95 +923,89 @@ extern int cKF_SkeletonInfo_R_combine_play(cKF_SkeletonInfo_R_c* info1, cKF_Skel if (F32_IS_ZERO(info1->morph_counter)) { cKF_FrameControl_play(&info2->frame_control); return cKF_FrameControl_play(&info1->frame_control); - } - if (info1->morph_counter > 0.0f) { + } else if (info1->morph_counter > 0.0f) { cKF_SkeletonInfo_R_morphJoint(info1); info1->morph_counter -= 0.5f; if (info1->morph_counter <= 0.0f) { info1->morph_counter = 0.0f; } return cKF_STATE_NONE; + } else { + cKF_SkeletonInfo_R_morphJoint(info1); + info1->morph_counter += 0.5f; + if (info1->morph_counter >= 0.0f) { + info1->morph_counter = 0.0f; + } + cKF_FrameControl_play(&info2->frame_control); + return cKF_FrameControl_play(&info1->frame_control); } - cKF_SkeletonInfo_R_morphJoint(info1); - info1->morph_counter += 0.5f; - if (info1->morph_counter >= 0.0f) { - info1->morph_counter = 0.0f; - } - cKF_FrameControl_play(&info2->frame_control); - return cKF_FrameControl_play(&info1->frame_control); } -extern void cKF_SkeletonInfo_R_T_combine_play(int* arg1, int* arg2, int* arg3, cKF_SkeletonInfo_R_c* info1, - cKF_SkeletonInfo_R_c* info2, cKF_SkeletonInfo_R_c* info3, s8* flag) { +extern void cKF_SkeletonInfo_R_T_combine_play(int* state1, int* state2, int* state3, cKF_SkeletonInfo_R_c* info1, + cKF_SkeletonInfo_R_c* info2, cKF_SkeletonInfo_R_c* info3, + s8* part_table) { int combinet; s16* joint; - - cKF_SkeletonInfo_R_combine_work_c combine1; - cKF_SkeletonInfo_R_combine_work_c combine2; - cKF_SkeletonInfo_R_combine_work_c combine3; + cKF_SkeletonInfo_R_combine_work_c combine[3]; int i; - int j; - s_xyz* joint2; s_xyz* applyjoint; - if ((info1 == NULL) || (info2 == NULL) || (info3 == NULL) || (flag == NULL)) { + if ((info1 == NULL) || (info2 == NULL) || (info3 == NULL) || (part_table == NULL)) { return; } joint = (F32_IS_ZERO(info1->morph_counter)) ? &info1->current_joint->x : &info1->target_joint->x; if (info1 != NULL) { - cKF_SkeletonInfo_R_combine_work_set(&combine3, info1); + cKF_SkeletonInfo_R_combine_work_set(&combine[0], info1); } if (info2 != NULL) { - cKF_SkeletonInfo_R_combine_work_set(&combine2, info2); + cKF_SkeletonInfo_R_combine_work_set(&combine[1], info2); } if (info3 != NULL) { - cKF_SkeletonInfo_R_combine_work_set(&combine1, info3); + cKF_SkeletonInfo_R_combine_work_set(&combine[2], info3); } combinet = 0x20; - cKF_SkeletonInfo_R_combine_translation(&joint, &combinet, &combine3, flag); - cKF_SkeletonInfo_R_combine_rotation(&joint, &combinet, &combine3, flag); + cKF_SkeletonInfo_R_combine_translation(&joint, &combinet, &combine[0], part_table); + cKF_SkeletonInfo_R_combine_rotation(&joint, &combinet, &combine[0], part_table); if (info1->rotation_diff_table != NULL) { applyjoint = (F32_IS_ZERO(info1->morph_counter)) ? info1->current_joint : info1->target_joint; applyjoint += 1; - for (i = 0, j = 0; i < info1->skeleton->num_joints; i++, j++) { - applyjoint->x += info1->rotation_diff_table[j].x; - applyjoint->y += info1->rotation_diff_table[j].y; - applyjoint->z += info1->rotation_diff_table[j].z; + for (i = 0; i < info1->skeleton->num_joints; i++) { + applyjoint->x += info1->rotation_diff_table[i].x; + applyjoint->y += info1->rotation_diff_table[i].y; + applyjoint->z += info1->rotation_diff_table[i].z; applyjoint++; } } if (F32_IS_ZERO(info1->morph_counter)) { - *arg1 = cKF_FrameControl_play(&info1->frame_control); - *arg2 = cKF_FrameControl_play(&info2->frame_control); - *arg3 = cKF_FrameControl_play(&info3->frame_control); - return; - } - if (info1->morph_counter > 0.0f) { + *state1 = cKF_FrameControl_play(&info1->frame_control); + *state2 = cKF_FrameControl_play(&info2->frame_control); + *state3 = cKF_FrameControl_play(&info3->frame_control); + } else if (info1->morph_counter > 0.0f) { cKF_SkeletonInfo_R_morphJoint(info1); info1->morph_counter -= 0.5f; if (info1->morph_counter <= 0.0f) { info1->morph_counter = 0.0f; } - *arg1 = 0; - *arg2 = 0; - *arg3 = 0; - return; + *state1 = cKF_STATE_NONE; + *state2 = cKF_STATE_NONE; + *state3 = cKF_STATE_NONE; + } else { + cKF_SkeletonInfo_R_morphJoint(info1); + info1->morph_counter += 0.5f; + if (info1->morph_counter >= 0.0f) { + info1->morph_counter = 0.0f; + } + *state1 = cKF_FrameControl_play(&info1->frame_control); + *state2 = cKF_FrameControl_play(&info2->frame_control); + *state3 = cKF_FrameControl_play(&info3->frame_control); } - cKF_SkeletonInfo_R_morphJoint(info1); - info1->morph_counter += 0.5f; - if (info1->morph_counter >= 0.0f) { - info1->morph_counter = 0.0f; - } - *arg1 = cKF_FrameControl_play(&info1->frame_control); - *arg2 = cKF_FrameControl_play(&info2->frame_control); - *arg3 = cKF_FrameControl_play(&info3->frame_control); } extern void cKF_SkeletonInfo_R_Animation_Set_base_shape_trs(cKF_SkeletonInfo_R_c* keyframe, f32 transx, f32 transy, @@ -1032,12 +1026,8 @@ extern void cKF_SkeletonInfo_R_Animation_Set_base_shape_trs(cKF_SkeletonInfo_R_c extern void cKF_SkeletonInfo_R_AnimationMove_ct_base(xyz_t* basepos, xyz_t* correctpos, s16 ybase, s16 yidle, f32 counter, cKF_SkeletonInfo_R_c* keyframe, int an_flag) { - int sub; - keyframe->animation_enabled = an_flag; - keyframe->fixed_counter = (counter >= 0.0f) ? counter : -counter; - keyframe->base_world_position = ZeroVec; keyframe->model_world_position_correction = ZeroVec; @@ -1060,11 +1050,12 @@ extern void cKF_SkeletonInfo_R_AnimationMove_ct_base(xyz_t* basepos, xyz_t* corr keyframe->model_angle_correction = 0; if (an_flag & cKF_ANIMATION_ROT_Y) { - sub = ybase - yidle; - if (sub > 0x8000) { - sub = -(0x10000 - sub); - } else if (sub < -0x8000) { - sub += 0x10000; + int sub = ybase - yidle; + + if (sub > DEG2SHORT_ANGLE2(180.0f)) { + sub = -(DEG2SHORT_ANGLE2(360.0f) - sub); + } else if (sub < DEG2SHORT_ANGLE2(-180.0f)) { + sub += DEG2SHORT_ANGLE2(360.0f); } keyframe->base_angle_y = yidle; keyframe->model_angle_correction = sub; diff --git a/src/data/player/BOY_part_data.c b/src/data/player/BOY_part_data.c new file mode 100644 index 00000000..ca9af8ad --- /dev/null +++ b/src/data/player/BOY_part_data.c @@ -0,0 +1,164 @@ +#include "types.h" +#include "m_player.h" + +/* + * These tables dictate which animation will play for a given joint. + * The player has two main animation states. 0 uses PLAYER_ACTOR::keyframe0, + * and 1 uses PLAYER_ACTOR::keyframe1. This is essentially a barebones + * animation overlay system. + */ + +// clang-format off +s8 BOY_part_data[][mPlayer_JOINT_NUM + 1] = { + /* Normal */ + { + 0, /* Base translation */ + 0, /* mPlayer_JOINT_ROOT */ + 0, /* mPlayer_JOINT_BASE */ + 0, /* mPlayer_JOINT_LFOOT_BASE */ + 0, /* mPlayer_JOINT_LFOOT1 */ + 0, /* mPlayer_JOINT_LFOOT2 */ + 0, /* mPlayer_JOINT_LFOOT3 */ + 0, /* mPlayer_JOINT_RFOOT_BASE */ + 0, /* mPlayer_JOINT_RFOOT1 */ + 0, /* mPlayer_JOINT_RFOOT2 */ + 0, /* mPlayer_JOINT_RFOOT3 */ + 0, /* mPlayer_JOINT_TAIL_BASE */ + 0, /* mPlayer_JOINT_TAIL1 */ + 0, /* mPlayer_JOINT_TAIL2 */ + 0, /* mPlayer_JOINT_CHEST */ + 0, /* mPlayer_JOINT_LARM_BASE */ + 0, /* mPlayer_JOINT_LARM1 */ + 0, /* mPlayer_JOINT_LARM2 */ + 0, /* mPlayer_JOINT_RARM_BASE */ + 0, /* mPlayer_JOINT_RARM1 */ + 0, /* mPlayer_JOINT_RARM2 */ + 0, /* mPlayer_JOINT_HAND */ + 0, /* mPlayer_JOINT_HEAD_BASE */ + 0, /* mPlayer_JOINT_MOUTH_BASE */ + 0, /* mPlayer_JOINT_MOUTH */ + 0, /* mPlayer_JOINT_HEAD */ + 0, /* mPlayer_JOINT_FEEL */ + }, + /* Axe */ + { + 0, /* Base translation */ + 0, /* mPlayer_JOINT_ROOT */ + 0, /* mPlayer_JOINT_BASE */ + 0, /* mPlayer_JOINT_LFOOT_BASE */ + 0, /* mPlayer_JOINT_LFOOT1 */ + 0, /* mPlayer_JOINT_LFOOT2 */ + 0, /* mPlayer_JOINT_LFOOT3 */ + 0, /* mPlayer_JOINT_RFOOT_BASE */ + 0, /* mPlayer_JOINT_RFOOT1 */ + 0, /* mPlayer_JOINT_RFOOT2 */ + 0, /* mPlayer_JOINT_RFOOT3 */ + 0, /* mPlayer_JOINT_TAIL_BASE */ + 0, /* mPlayer_JOINT_TAIL1 */ + 0, /* mPlayer_JOINT_TAIL2 */ + 0, /* mPlayer_JOINT_CHEST */ + 1, /* mPlayer_JOINT_LARM_BASE */ + 1, /* mPlayer_JOINT_LARM1 */ + 1, /* mPlayer_JOINT_LARM2 */ + 1, /* mPlayer_JOINT_RARM_BASE */ + 1, /* mPlayer_JOINT_RARM1 */ + 1, /* mPlayer_JOINT_RARM2 */ + 1, /* mPlayer_JOINT_HAND */ + 0, /* mPlayer_JOINT_HEAD_BASE */ + 0, /* mPlayer_JOINT_MOUTH_BASE */ + 0, /* mPlayer_JOINT_MOUTH */ + 0, /* mPlayer_JOINT_HEAD */ + 0, /* mPlayer_JOINT_FEEL */ + }, + /* Pickup */ + { + 0, /* Base translation */ + 0, /* mPlayer_JOINT_ROOT */ + 0, /* mPlayer_JOINT_BASE */ + 0, /* mPlayer_JOINT_LFOOT_BASE */ + 0, /* mPlayer_JOINT_LFOOT1 */ + 0, /* mPlayer_JOINT_LFOOT2 */ + 0, /* mPlayer_JOINT_LFOOT3 */ + 0, /* mPlayer_JOINT_RFOOT_BASE */ + 0, /* mPlayer_JOINT_RFOOT1 */ + 0, /* mPlayer_JOINT_RFOOT2 */ + 0, /* mPlayer_JOINT_RFOOT3 */ + 0, /* mPlayer_JOINT_TAIL_BASE */ + 0, /* mPlayer_JOINT_TAIL1 */ + 0, /* mPlayer_JOINT_TAIL2 */ + 0, /* mPlayer_JOINT_CHEST */ + 0, /* mPlayer_JOINT_LARM_BASE */ + 0, /* mPlayer_JOINT_LARM1 */ + 0, /* mPlayer_JOINT_LARM2 */ + 1, /* mPlayer_JOINT_RARM_BASE */ + 1, /* mPlayer_JOINT_RARM1 */ + 1, /* mPlayer_JOINT_RARM2 */ + 1, /* mPlayer_JOINT_HAND */ + 0, /* mPlayer_JOINT_HEAD_BASE */ + 0, /* mPlayer_JOINT_MOUTH_BASE */ + 0, /* mPlayer_JOINT_MOUTH */ + 0, /* mPlayer_JOINT_HEAD */ + 0, /* mPlayer_JOINT_FEEL */ + }, + /* Net */ + { + 0, /* Base translation */ + 0, /* mPlayer_JOINT_ROOT */ + 0, /* mPlayer_JOINT_BASE */ + 0, /* mPlayer_JOINT_LFOOT_BASE */ + 0, /* mPlayer_JOINT_LFOOT1 */ + 0, /* mPlayer_JOINT_LFOOT2 */ + 0, /* mPlayer_JOINT_LFOOT3 */ + 0, /* mPlayer_JOINT_RFOOT_BASE */ + 0, /* mPlayer_JOINT_RFOOT1 */ + 0, /* mPlayer_JOINT_RFOOT2 */ + 0, /* mPlayer_JOINT_RFOOT3 */ + 0, /* mPlayer_JOINT_TAIL_BASE */ + 0, /* mPlayer_JOINT_TAIL1 */ + 0, /* mPlayer_JOINT_TAIL2 */ + 0, /* mPlayer_JOINT_CHEST */ + 0, /* mPlayer_JOINT_LARM_BASE */ + 0, /* mPlayer_JOINT_LARM1 */ + 0, /* mPlayer_JOINT_LARM2 */ + 1, /* mPlayer_JOINT_RARM_BASE */ + 1, /* mPlayer_JOINT_RARM1 */ + 1, /* mPlayer_JOINT_RARM2 */ + 1, /* mPlayer_JOINT_HAND */ + 0, /* mPlayer_JOINT_HEAD_BASE */ + 0, /* mPlayer_JOINT_MOUTH_BASE */ + 0, /* mPlayer_JOINT_MOUTH */ + 0, /* mPlayer_JOINT_HEAD */ + 0, /* mPlayer_JOINT_FEEL */ + }, + /* Fan */ + { + 1, /* Base translation */ + 1, /* mPlayer_JOINT_ROOT */ + 1, /* mPlayer_JOINT_BASE */ + 1, /* mPlayer_JOINT_LFOOT_BASE */ + 1, /* mPlayer_JOINT_LFOOT1 */ + 1, /* mPlayer_JOINT_LFOOT2 */ + 1, /* mPlayer_JOINT_LFOOT3 */ + 1, /* mPlayer_JOINT_RFOOT_BASE */ + 1, /* mPlayer_JOINT_RFOOT1 */ + 1, /* mPlayer_JOINT_RFOOT2 */ + 1, /* mPlayer_JOINT_RFOOT3 */ + 1, /* mPlayer_JOINT_TAIL_BASE */ + 1, /* mPlayer_JOINT_TAIL1 */ + 1, /* mPlayer_JOINT_TAIL2 */ + 1, /* mPlayer_JOINT_CHEST */ + 1, /* mPlayer_JOINT_LARM_BASE */ + 1, /* mPlayer_JOINT_LARM1 */ + 1, /* mPlayer_JOINT_LARM2 */ + 0, /* mPlayer_JOINT_RARM_BASE */ + 0, /* mPlayer_JOINT_RARM1 */ + 0, /* mPlayer_JOINT_RARM2 */ + 0, /* mPlayer_JOINT_HAND */ + 0, /* mPlayer_JOINT_HEAD_BASE */ + 1, /* mPlayer_JOINT_MOUTH_BASE */ + 1, /* mPlayer_JOINT_MOUTH */ + 1, /* mPlayer_JOINT_HEAD */ + 1, /* mPlayer_JOINT_FEEL */ + }, +}; +// clang-format on