Add BOY_part_data, cleanup c_keyframe

This commit is contained in:
Cuyler36
2024-09-12 13:10:59 -04:00
parent a8fe3cd022
commit e3d1e879b4
4 changed files with 262 additions and 105 deletions
+2
View File
@@ -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:
+12 -12
View File
@@ -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.
+84 -93
View File
@@ -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;
+164
View File
@@ -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