diff options
| author | RevoSucks <projectrevotpp@hotmail.com> | 2023-10-31 21:41:29 -0400 |
|---|---|---|
| committer | RevoSucks <projectrevotpp@hotmail.com> | 2023-10-31 21:41:29 -0400 |
| commit | 34c5be44cb680ecd6c6be4fc9343ed6138d8a79c (patch) | |
| tree | 8f7d66ef2fdb97bf3aab2c54767dc119600aab76 /src/code | |
| parent | 11f36e3e8d6950eb15121f743586c3cbd00438dc (diff) | |
| parent | 4f0a5a9dd0c818e7f2569061dfd58cd13489c46f (diff) | |
c_keyframe
Diffstat (limited to 'src/code')
| -rw-r--r-- | src/code/c_keyframe.c | 911 | ||||
| -rw-r--r-- | src/code/graph.c | 1 | ||||
| -rw-r--r-- | src/code/z_play.c | 1 |
3 files changed, 828 insertions, 85 deletions
diff --git a/src/code/c_keyframe.c b/src/code/c_keyframe.c index 5914eec77..e999c7304 100644 --- a/src/code/c_keyframe.c +++ b/src/code/c_keyframe.c @@ -1,85 +1,830 @@ #include "global.h" -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801830A0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801830C8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801830E8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183148.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183224.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801832B0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_8018332C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_8018340C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183430.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_8018349C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801834A8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183510.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183580.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801835EC.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183658.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801836CC.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_8018373C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801837CC.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183808.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183880.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183A3C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183B08.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183B68.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80183DE0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_8018410C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_8018450C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801845A4.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801845C8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_8018462C.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80184638.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801846AC.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80184728.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801847A0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80184818.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80184898.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80184914.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801849A0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801849DC.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80184C48.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801850A0.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_801853C8.s") - -#pragma GLOBAL_ASM("asm/non_matchings/code/c_keyframe/func_80185460.s") +#define FMOD(x, mod) ((x) - ((s32)((x) * (1.0f / (mod))) * (f32)(mod))) + +// cKF_FrameControl_zeroClera +void func_801830A0(FrameControl* frameCtrl) { + frameCtrl->unk_8 = 0.0f; + frameCtrl->unk_10 = 0.0f; + frameCtrl->unk_C = 0.0f; + frameCtrl->unk_4 = 0.0f; + frameCtrl->unk_0 = 0.0f; + frameCtrl->unk_14 = false; +} + +// cKF_FrameControl_ct +void func_801830C8(FrameControl* frameCtrl) { + func_801830A0(frameCtrl); +} + +// cKF_FrameControl_setFrame +void func_801830E8(FrameControl* frameCtrl, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, s32 arg6) { + frameCtrl->unk_0 = arg1; + frameCtrl->unk_4 = (arg2 < 1.0f) ? arg3 : arg2; + frameCtrl->unk_8 = arg3; + frameCtrl->unk_C = arg5; + frameCtrl->unk_10 = arg4; + frameCtrl->unk_14 = arg6; +} + +s32 func_80183148(FrameControl* frameCtrl, f32 arg1, f32* out) { + f32 temp_f0; + f32 temp_f14; + f32 phi_f2; + + *out = 0.0f; + temp_f0 = frameCtrl->unk_10; + + if (arg1 == temp_f0) { + return false; + } + + phi_f2 = (frameCtrl->unk_0 < frameCtrl->unk_4) ? frameCtrl->unk_C : -frameCtrl->unk_C; + temp_f14 = phi_f2 * 1.5f; + + if ((temp_f14 >= 0.0f && temp_f0 < arg1 && arg1 <= temp_f0 + temp_f14) || + (temp_f14 < 0.0f && arg1 < temp_f0 && temp_f0 + temp_f14 <= arg1)) { + + *out = temp_f0 + temp_f14 - arg1; + return true; + } + return false; +} + +s32 func_80183224(FrameControl* frameCtrl) { + f32 sp1C; + + if (frameCtrl->unk_10 == frameCtrl->unk_4) { + return 1; + } + if (func_80183148(frameCtrl, frameCtrl->unk_4, &sp1C)) { + frameCtrl->unk_10 = frameCtrl->unk_4; + return 1; + } + if (func_80183148(frameCtrl, frameCtrl->unk_0, &sp1C)) { + frameCtrl->unk_10 = frameCtrl->unk_4; + return 1; + } + return 0; +} + +s32 func_801832B0(FrameControl* frameCtrl) { + f32 sp1C; + + if (func_80183148(frameCtrl, frameCtrl->unk_4, &sp1C)) { + frameCtrl->unk_10 = frameCtrl->unk_0 + sp1C; + return 2; + } + if (func_80183148(frameCtrl, frameCtrl->unk_0, &sp1C)) { + frameCtrl->unk_10 = frameCtrl->unk_4 + sp1C; + return 2; + } + return 0; +} + +s32 func_8018332C(FrameControl* frameCtrl) { + s32 phi_v0; + f32 phi_f0; + + if (!frameCtrl->unk_14) { + phi_v0 = func_80183224(frameCtrl); + } else { + phi_v0 = func_801832B0(frameCtrl); + } + if (phi_v0 == 0) { + phi_f0 = (frameCtrl->unk_0 < frameCtrl->unk_4) ? frameCtrl->unk_C : -frameCtrl->unk_C; + frameCtrl->unk_10 = frameCtrl->unk_10 + phi_f0 * 1.5f; + } + if (frameCtrl->unk_10 < 1.0f) { + frameCtrl->unk_10 = (frameCtrl->unk_10 - 1.0f) + frameCtrl->unk_8; + } else if (frameCtrl->unk_8 < frameCtrl->unk_10) { + frameCtrl->unk_10 = (frameCtrl->unk_10 - frameCtrl->unk_8) + 1.0f; + } + return phi_v0; +} + +// cKF_SkeletonInfo_R_zeroClear +void func_8018340C(SkeletonInfo* skeleton) { + skeleton->unk_18 = NULL; + skeleton->unk_1C = NULL; + skeleton->frameData = NULL; + skeleton->unk_20 = NULL; + skeleton->unk_2C = NULL; + skeleton->unk_24 = 0.0f; +} + +// cKF_SkeletonInfo_R_ct +void func_80183430(SkeletonInfo* skeleton, Struct_801BFA14_Arg1* arg1, SkeletonInfo_1C* arg2, Vec3s* frameData, + s16* arg4, UnkKeyframeCallback* callbacks) { + func_8018340C(skeleton); + func_801830C8(&skeleton->frameCtrl); + skeleton->unk_18 = (Struct_801BFA14_Arg1*)Lib_SegmentedToVirtual(arg1); + skeleton->unk_1C = (SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg2); + skeleton->frameData = frameData; + skeleton->unk_2C = arg4; + skeleton->unk_20 = callbacks; +} + +// cKF_SkeletonInfo_R_dt +void func_8018349C(SkeletonInfo* skeleton) { +} + +void func_8018373C(SkeletonInfo* skeleton, Struct_801BFA14_Arg1* arg1, SkeletonInfo_1C* arg2, f32 arg3, f32 arg4, + f32 arg5, f32 arg6, f32 arg7, s32 arg8); + +void func_801834A8(SkeletonInfo* skeleton, SkeletonInfo_1C* arg1) { + func_8018373C(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, 1.0f, 0.0f, false); +} + +void func_80183510(SkeletonInfo* skeleton, SkeletonInfo_1C* arg1, f32 arg2) { + func_8018373C(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, arg2, 0.0f, false); +} + +void func_80183580(SkeletonInfo* skeleton, SkeletonInfo_1C* arg1, f32 arg2) { + func_8018373C(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, 1.0f, arg2, false); +} + +void func_801835EC(SkeletonInfo* skeleton, SkeletonInfo_1C* arg1) { + func_8018373C(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, 1.0f, 0.0f, true); +} + +void func_80183658(SkeletonInfo* skeleton, SkeletonInfo_1C* arg1, f32 arg2) { + func_8018373C(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, arg2, 0.0f, true); +} + +void func_801836CC(SkeletonInfo* skeleton, SkeletonInfo_1C* arg1, f32 arg2) { + func_8018373C(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, 1.0f, arg2, true); +} + +void func_8018373C(SkeletonInfo* skeleton, Struct_801BFA14_Arg1* arg1, SkeletonInfo_1C* arg2, f32 arg3, f32 arg4, + f32 arg5, f32 arg6, f32 arg7, s32 arg8) { + skeleton->unk_24 = arg7; + + if (skeleton->unk_18 != arg1) { + skeleton->unk_18 = (Struct_801BFA14_Arg1*)Lib_SegmentedToVirtual(arg1); + } + skeleton->unk_1C = (SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg2); + + func_801830E8(&skeleton->frameCtrl, arg3, arg4, skeleton->unk_1C->unk_12, arg5, arg6, arg8); +} + +void func_801837CC(SkeletonInfo* skeleton, SkeletonInfo_1C* arg1) { + skeleton->unk_1C = (SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1); + skeleton->frameCtrl.unk_8 = skeleton->unk_1C->unk_12; +} + +#define CB(x) ((x) * (x) * (x)) + +// cKF_HermitCalc +// hermite interpolation +f32 func_80183808(f32 t, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5) { + f32 p = 3.0f * SQ(t) - 2.0f * CB(t); + + return (1.0f - p) * arg2 + p * arg3 + ((CB(t) - 2.0f * SQ(t) + t) * arg4 + (CB(t) - SQ(t)) * arg5) * arg1; +} + +// cKF_KeyCalc +s16 func_80183880(s16 arg0, s16 arg1, Vec3s* arg2, f32 arg3) { + Vec3s* temp_a3 = &arg2[arg0]; + Vec3s* temp_v1 = &temp_a3[arg1]; + f32 temp_f2; + s16 phi_v0; + s16 phi_v1; + + if (arg3 <= temp_a3->x) { + return temp_a3->y; + } + if (temp_a3[arg1 - 1].x <= arg3) { + return temp_a3[arg1 - 1].y; + } + + for (phi_v0 = 1, phi_v1 = 0; true; phi_v0++, phi_v1++) { + if (arg3 < temp_a3[phi_v0].x) { + temp_f2 = temp_a3[phi_v0].x - temp_a3[phi_v1].x; + + if (!IS_ZERO(temp_f2)) { + return nearbyint(func_80183808((arg3 - temp_a3[phi_v1].x) / temp_f2, temp_f2 * (1.0f / 30), + temp_a3[phi_v1].y, temp_a3[phi_v0].y, temp_a3[phi_v1].z, + temp_a3[phi_v0].z)); + } + return temp_a3[phi_v1].y; + } + } +} + +// cKF_SkeletonInfo_subRotInterpolation +void func_80183A3C(f32 t, s16* out, s16 rot1, s16 rot2) { + u16 urot1 = rot1; + s32 pad; + u16 urot2 = rot2; + f32 f1 = rot1; + f32 signedDiff = rot2 - f1; + f32 f2 = urot1; + f32 unsignedDiff = urot2 - f2; + + if (fabsf(signedDiff) < fabsf(unsignedDiff)) { + *out = f1 + signedDiff * t; + } else { + *out = f2 + unsignedDiff * t; + } +} + +// lerp +// cKF_SkeletonInfo_morphST +void func_80183B08(s16 arg0[3], s16 arg1[3], f32 t) { + s32 i; + + for (i = 0; i < 3; i++) { + if (*arg0 != *arg1) { + f32 f1 = *arg0; + f32 f2 = *arg1; + *arg0 = f1 + (f2 - f1) * t; + } + arg0++; + arg1++; + } +} + +void func_80183B68(SkeletonInfo* skeleton) { + Vec3s* frameData = skeleton->frameData; + Vec3s* phi_s1 = (Vec3s*)skeleton->unk_2C; + f32 t = 1.0f / fabsf(skeleton->unk_24); + s32 i; + + for (i = 0; i < skeleton->unk_18->limbCount; i++) { + Vec3s temp_a2; + Vec3s temp_a3; + + func_80183B08((s16*)frameData, (s16*)phi_s1, t); + + frameData++; + phi_s1++; + + temp_a2.x = frameData->x; + temp_a2.y = frameData->y; + temp_a2.z = frameData->z; + + temp_a3.x = phi_s1->x; + temp_a3.y = phi_s1->y; + temp_a3.z = phi_s1->z; + + if (temp_a2.x != temp_a3.x || temp_a2.y != temp_a3.y || temp_a2.z != temp_a3.z) { + Vec3s temp_a0; + f32 v1; + f32 v2; + + temp_a0.x = 0x7FFF + temp_a2.x; + temp_a0.y = 0x7FFF - temp_a2.y; + temp_a0.z = 0x7FFF + temp_a2.z; + + v1 = fabsf((f32)temp_a3.x - temp_a2.x) + fabsf((f32)temp_a3.y - temp_a2.y) + + fabsf((f32)temp_a3.z - temp_a2.z); + v2 = fabsf((f32)temp_a3.x - temp_a0.x) + fabsf((f32)temp_a3.y - temp_a0.y) + + fabsf((f32)temp_a3.z - temp_a0.z); + + if (v1 < v2) { + func_80183A3C(t, &frameData->x, temp_a2.x, temp_a3.x); + func_80183A3C(t, &frameData->y, temp_a2.y, temp_a3.y); + func_80183A3C(t, &frameData->z, temp_a2.z, temp_a3.z); + } else { + func_80183A3C(t, &frameData->x, temp_a0.x, temp_a3.x); + func_80183A3C(t, &frameData->y, temp_a0.y, temp_a3.y); + func_80183A3C(t, &frameData->z, temp_a0.z, temp_a3.z); + } + } + phi_s1++; + frameData++; + func_80183B08((s16*)frameData, (s16*)phi_s1, t); + frameData++; + phi_s1++; + } +} + +s32 func_80183DE0(SkeletonInfo* skeleton) { + s32 sp9C; + s32 pad[7]; + s16* sp7C; + Vec3s* sp78; + s16* sp74; + s32 pad1[3]; + u16* phi_v1; + s32 phi_s1; + s16* phi_s2; + u32 phi_s3; + s32 phi_s4 = 0; + s32 phi_s5 = 0; + s32 phi_s6 = 0; + s32 phi_s7; + + if (skeleton->unk_24 != 0.0f) { + phi_s2 = skeleton->unk_2C; + } else { + phi_s2 = (s16*)skeleton->frameData; + } + + sp7C = (s16*)Lib_SegmentedToVirtual(skeleton->unk_1C->unk_C); + sp74 = (s16*)Lib_SegmentedToVirtual(skeleton->unk_1C->unk_8); + sp78 = (Vec3s*)Lib_SegmentedToVirtual(skeleton->unk_1C->unk_4); + phi_v1 = (u16*)Lib_SegmentedToVirtual(skeleton->unk_1C->unk_0); + + for (sp9C = 0; sp9C < skeleton->unk_18->limbCount; sp9C++, phi_v1++) { + for (phi_s3 = 256, phi_s7 = 0; phi_s7 < 3; phi_s7++) { + for (phi_s1 = 0; phi_s1 < 3; phi_s1++, phi_s2++) { + if (*phi_v1 & phi_s3) { + *phi_s2 = func_80183880(phi_s6, sp74[phi_s4], sp78, skeleton->frameCtrl.unk_10); + phi_s6 += sp74[phi_s4]; + phi_s4++; + } else { + *phi_s2 = sp7C[phi_s5]; + phi_s5++; + } + phi_s3 >>= 1; + if (phi_s7 == 1) { + *phi_s2 = FMOD(*phi_s2 * 0.1f, 360) * 182.04445f; + } + } + } + } + + if (IS_ZERO(skeleton->unk_24)) { + return func_8018332C(&skeleton->frameCtrl); + } else if (skeleton->unk_24 > 0.0f) { + func_80183B68(skeleton); + skeleton->unk_24 -= 1.0f; + if (skeleton->unk_24 <= 0.0f) { + skeleton->unk_24 = 0.0f; + } + return 0; + } else { + func_80183B68(skeleton); + skeleton->unk_24 += 1.0f; + if (skeleton->unk_24 >= 0.0f) { + skeleton->unk_24 = 0.0f; + } + return func_8018332C(&skeleton->frameCtrl); + } +} + +// cKF_Si3_draw_SV_R_child +void func_8018410C(PlayState* play, SkeletonInfo* skeleton, s32* limbIndex, + OverrideKeyframeDrawScaled overrideKeyframeDraw, PostKeyframeDrawScaled postKeyframeDraw, void* arg, + Mtx** mtx) { + Struct_801BFA14_Arg1_Field4_2* limb = + (Struct_801BFA14_Arg1_Field4_2*)Lib_SegmentedToVirtual(skeleton->unk_18->unk_4_2); + s32 i; + Gfx* newDList; + Gfx* limbDList; + u8 flags; + Vec3f scale; + Vec3s rot; + Vec3f pos; + Vec3s* frameData; + + OPEN_DISPS(play->state.gfxCtx); + + limb += *limbIndex; + frameData = &skeleton->frameData[*limbIndex * 3]; + + scale.x = frameData->x * 0.01f; + scale.y = frameData->y * 0.01f; + scale.z = frameData->z * 0.01f; + + frameData++; + + rot.x = frameData->x; + rot.y = frameData->y; + rot.z = frameData->z; + + frameData++; + + pos.x = frameData->x; + pos.y = frameData->y; + pos.z = frameData->z; + + Matrix_Push(); + + newDList = limbDList = limb->dList; + flags = limb->flags; + + if (overrideKeyframeDraw == NULL || + (overrideKeyframeDraw != NULL && + overrideKeyframeDraw(play, skeleton, *limbIndex, &newDList, &flags, arg, &scale, &rot, &pos) != 0)) { + if ((skeleton->unk_20 == NULL) || (limb->unk_6 == 0xFF) || (skeleton->unk_20[limb->unk_6] == NULL) || + skeleton->unk_20[limb->unk_6](play, skeleton, *limbIndex, &newDList, &flags, arg) != 0) { + + Matrix_TranslateRotateZYX(&pos, &rot); + + if (scale.x != 1.0f || scale.y != 1.0f || scale.z != 1.0f) { + Matrix_Scale(scale.x, scale.y, scale.z, MTXMODE_APPLY); + } + + if (newDList != NULL) { + Matrix_ToMtx(*mtx); + + if (flags & KEYFRAME_XLU) { + gSPMatrix(POLY_XLU_DISP++, *mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, newDList); + } else { + gSPMatrix(POLY_OPA_DISP++, *mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, newDList); + } + + (*mtx)++; + } else if (limbDList != NULL) { + gSPMatrix(POLY_OPA_DISP++, *mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + Matrix_ToMtx(*mtx); + + (*mtx)++; + } + } + } + + if (postKeyframeDraw != NULL) { + postKeyframeDraw(play, skeleton, *limbIndex, &newDList, &flags, arg, &scale, &rot, &pos); + } + + (*limbIndex)++; + + for (i = 0; i < limb->unk_4; i++) { + func_8018410C(play, skeleton, limbIndex, overrideKeyframeDraw, postKeyframeDraw, arg, mtx); + } + + Matrix_Pop(); + CLOSE_DISPS(play->state.gfxCtx); +} + +// cKF_Si3_draw_R_SV +void func_8018450C(PlayState* play, SkeletonInfo* skeleton, Mtx* mtx, OverrideKeyframeDrawScaled overrideKeyframeDraw, + PostKeyframeDrawScaled postKeyframeDraw, void* arg) { + s32 limbIndex; + + if (mtx == NULL) { + return; + } + + OPEN_DISPS(play->state.gfxCtx); + + gSPSegment(POLY_OPA_DISP++, 0x0D, mtx); + gSPSegment(POLY_XLU_DISP++, 0x0D, mtx); + + limbIndex = 0; + func_8018410C(play, skeleton, &limbIndex, overrideKeyframeDraw, postKeyframeDraw, arg, &mtx); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void func_801845A4(SkeletonInfo2* skeleton) { + skeleton->unk_18 = 0; + skeleton->unk_1C = 0; + skeleton->frameData = NULL; + skeleton->unk_28 = 0; + skeleton->unk_2C = 0; + skeleton->unk_20 = 0.0f; +} + +void func_801845C8(SkeletonInfo2* skeleton, Struct_801BFA14_Arg1* arg1, SkeletonInfo_1C* arg2, Vec3s* frameData, + s16* arg4) { + func_801845A4(skeleton); + func_801830C8(&skeleton->frameCtrl); + skeleton->unk_18 = (Struct_801BFA14_Arg1*)Lib_SegmentedToVirtual(arg1); + skeleton->unk_1C = (SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg2); + skeleton->frameData = frameData; + skeleton->unk_28 = arg4; +} + +void func_8018462C(SkeletonInfo2* skeleton) { +} + +void func_80184914(SkeletonInfo2* skeleton, Struct_801BFA14_Arg1* arg1, SkeletonInfo_1C* arg2, f32 arg3, f32 arg4, + f32 arg5, f32 arg6, f32 arg7, s32 arg8, s32 arg9); + +void func_80184638(SkeletonInfo2* skeleton, SkeletonInfo_1C* arg1, s32 arg2) { + func_80184914(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, 1.0f, 0.0f, false, arg2); +} + +void func_801846AC(SkeletonInfo2* skeleton, SkeletonInfo_1C* arg1, s32 arg2, f32 arg3) { + func_80184914(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, arg3, 0.0f, false, arg2); +} + +void func_80184728(SkeletonInfo2* skeleton, SkeletonInfo_1C* arg1, s32 arg2, f32 arg3) { + func_80184914(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, 1.0f, arg3, false, arg2); +} + +void func_801847A0(SkeletonInfo2* skeleton, SkeletonInfo_1C* arg1, s32 arg2) { + func_80184914(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, 1.0f, 0.0f, true, arg2); +} + +void func_80184818(SkeletonInfo2* skeleton, SkeletonInfo_1C* arg1, s32 arg2, f32 arg3) { + func_80184914(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, arg3, 0.0f, true, arg2); +} + +void func_80184898(SkeletonInfo2* skeleton, SkeletonInfo_1C* arg1, s32 arg2, f32 arg3) { + func_80184914(skeleton, skeleton->unk_18, arg1, 1.0f, ((SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg1))->unk_12, + 1.0f, 1.0f, arg3, true, arg2); +} + +void func_80184914(SkeletonInfo2* skeleton, Struct_801BFA14_Arg1* arg1, SkeletonInfo_1C* arg2, f32 arg3, f32 arg4, + f32 arg5, f32 arg6, f32 arg7, s32 arg8, s32 arg9) { + skeleton->unk_20 = arg7; + skeleton->unk_18 = (Struct_801BFA14_Arg1*)Lib_SegmentedToVirtual(arg1); + skeleton->unk_1C = (SkeletonInfo_1C*)Lib_SegmentedToVirtual(arg2); + + func_801830E8(&skeleton->frameCtrl, arg3, arg4, skeleton->unk_1C->unk_12, arg5, arg6, arg8); + skeleton->unk_2C = arg9; +} + +void func_801849A0(SkeletonInfo2* skeleton, SkeletonInfo_1C* arg1) { + skeleton->unk_1C = Lib_SegmentedToVirtual(arg1); + skeleton->frameCtrl.unk_8 = skeleton->unk_1C->unk_12; +} + +void func_801849DC(SkeletonInfo2* skeleton) { + Vec3s* frameData = skeleton->frameData; + Vec3s* phi_s7 = (Vec3s*)skeleton->unk_28; + f32 t = 1.0f / fabsf(skeleton->unk_20); + s32 i; + + func_80183B08((s16*)frameData, (s16*)phi_s7, t); + + frameData++; + phi_s7++; + + for (i = 0; i < skeleton->unk_18->limbCount; i++) { + Vec3s temp_a2; + Vec3s temp_a3; + + temp_a2.x = frameData->x; + temp_a2.y = frameData->y; + temp_a2.z = frameData->z; + + temp_a3.x = phi_s7->x; + temp_a3.y = phi_s7->y; + temp_a3.z = phi_s7->z; + + if (temp_a2.x != temp_a3.x || temp_a2.y != temp_a3.y || temp_a2.z != temp_a3.z) { + Vec3s temp_a0; + f32 v1; + f32 v2; + + temp_a0.x = temp_a2.x + 0x7FFF; + temp_a0.y = 0x7FFF - temp_a2.y; + temp_a0.z = temp_a2.z + 0x7FFF; + + v1 = fabsf((f32)temp_a3.x - temp_a2.x) + fabsf((f32)temp_a3.y - temp_a2.y) + + fabsf((f32)temp_a3.z - temp_a2.z); + v2 = fabsf((f32)temp_a3.x - temp_a0.x) + fabsf((f32)temp_a3.y - temp_a0.y) + + fabsf((f32)temp_a3.z - temp_a0.z); + + if (v1 < v2) { + func_80183A3C(t, &frameData->x, temp_a2.x, temp_a3.x); + func_80183A3C(t, &frameData->y, temp_a2.y, temp_a3.y); + func_80183A3C(t, &frameData->z, temp_a2.z, temp_a3.z); + } else { + func_80183A3C(t, &frameData->x, temp_a0.x, temp_a3.x); + func_80183A3C(t, &frameData->y, temp_a0.y, temp_a3.y); + func_80183A3C(t, &frameData->z, temp_a0.z, temp_a3.z); + } + } + phi_s7++; + frameData++; + } +} + +s32 func_80184C48(SkeletonInfo2* skeleton) { + s32 sp84; + u32 phi_s2; + u8* phi_t0; + s32 phi_s3; + s32 phi_s4 = 0; + s32 phi_s5 = 0; + s32 phi_s6 = 0; + s16* sp68; + Vec3s* sp64; + s16* sp60; + s16* phi_s1; + + if (skeleton->unk_20 != 0.0f) { + phi_s1 = skeleton->unk_28; + } else { + phi_s1 = (s16*)skeleton->frameData; + } + + sp68 = (s16*)Lib_SegmentedToVirtual(skeleton->unk_1C->unk_C); + sp60 = (s16*)Lib_SegmentedToVirtual(skeleton->unk_1C->unk_8); + sp64 = (Vec3s*)Lib_SegmentedToVirtual(skeleton->unk_1C->unk_4); + phi_t0 = (u8*)Lib_SegmentedToVirtual(skeleton->unk_1C->unk_0); + + for (phi_s2 = 32, phi_s3 = 0; phi_s3 < 3; phi_s3++, phi_s2 >>= 1) { + if (phi_t0[0] & phi_s2) { + *phi_s1 = func_80183880(phi_s6, sp60[phi_s4], sp64, skeleton->frameCtrl.unk_10); + phi_s6 += sp60[phi_s4++]; + } else { + *phi_s1 = sp68[phi_s5++]; + } + phi_s1++; + } + + for (sp84 = 0; sp84 < skeleton->unk_18->limbCount; sp84++) { + for (phi_s2 = 4, phi_s3 = 0; phi_s3 < 3; phi_s3++) { + s32 pad; + + if (phi_t0[sp84] & phi_s2) { + *phi_s1 = func_80183880(phi_s6, sp60[phi_s4], sp64, skeleton->frameCtrl.unk_10); + phi_s6 += sp60[phi_s4++]; + } else { + *phi_s1 = sp68[phi_s5++]; + } + *phi_s1 = FMOD(*phi_s1 * 0.1f, 360) * 182.04445f; + phi_s2 >>= 1; + phi_s1++; + } + } + + if (skeleton->unk_2C != NULL) { + Vec3s* phi_v0; + + if (skeleton->unk_20 != 0.0f) { + phi_v0 = (Vec3s*)skeleton->unk_28; + } else { + phi_v0 = skeleton->frameData; + } + + phi_v0++; + for (sp84 = 0; sp84 < skeleton->unk_18->limbCount; sp84++, phi_v0++) { + phi_v0->x = phi_v0->x + skeleton->unk_2C[sp84].x; + phi_v0->y = phi_v0->y + skeleton->unk_2C[sp84].y; + phi_v0->z = phi_v0->z + skeleton->unk_2C[sp84].z; + } + } + + if (IS_ZERO(skeleton->unk_20)) { + return func_8018332C(&skeleton->frameCtrl); + } + if (skeleton->unk_20 > 0.0f) { + func_801849DC(skeleton); + skeleton->unk_20 -= 1.0f; + if (skeleton->unk_20 <= 0.0f) { + skeleton->unk_20 = 0.0f; + } + return 0; + } + func_801849DC(skeleton); + skeleton->unk_20 += 1.0f; + if (skeleton->unk_20 >= 0.0f) { + skeleton->unk_20 = 0.0f; + } + return func_8018332C(&skeleton->frameCtrl); +} + +void func_801850A0(PlayState* play, SkeletonInfo2* skeleton, s32* limbIndex, OverrideKeyframeDraw overrideKeyframeDraw, + PostKeyframeDraw postKeyframeDraw, void* arg, Mtx** mtx) { + Struct_801BFA14_Arg1_Field4* jointData = + *limbIndex + (Struct_801BFA14_Arg1_Field4*)Lib_SegmentedToVirtual(skeleton->unk_18->unk_4); + s32 i; + Gfx* newDList; + Gfx* limbDList; + u8 flags; + Vec3s rot; + Vec3s* frameData = &skeleton->frameData[*limbIndex]; + Vec3f pos; + + if (*limbIndex != 0) { + pos.x = jointData->root.x; + pos.y = jointData->root.y; + pos.z = jointData->root.z; + } else { + pos.x = frameData->x; + pos.y = frameData->y; + pos.z = frameData->z; + } + + frameData++; + + rot.x = frameData->x; + rot.y = frameData->y; + rot.z = frameData->z; + + OPEN_DISPS(play->state.gfxCtx); + + Matrix_Push(); + + newDList = limbDList = jointData->dList; + flags = jointData->flags; + + if (overrideKeyframeDraw == NULL || + (overrideKeyframeDraw != NULL && + overrideKeyframeDraw(play, skeleton, *limbIndex, &newDList, &flags, arg, &rot, &pos) != 0)) { + Matrix_TranslateRotateZYX(&pos, &rot); + if (newDList != NULL) { + Matrix_ToMtx(*mtx); + + if (flags & KEYFRAME_XLU) { + gSPMatrix(POLY_XLU_DISP++, *mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, newDList); + } else { + gSPMatrix(POLY_OPA_DISP++, *mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, newDList); + } + (*mtx)++; + } else if (limbDList != NULL) { + Matrix_ToMtx(*mtx); + + gSPMatrix(POLY_OPA_DISP++, *mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + (*mtx)++; + } + } + + if (postKeyframeDraw != NULL) { + postKeyframeDraw(play, skeleton, *limbIndex, &newDList, &flags, arg, &rot, &pos); + } + + (*limbIndex)++; + + for (i = 0; i < jointData->unk_4; i++) { + func_801850A0(play, skeleton, limbIndex, overrideKeyframeDraw, postKeyframeDraw, arg, mtx); + } + + Matrix_Pop(); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void func_801853C8(PlayState* play, SkeletonInfo2* skeleton, Mtx* mtx, OverrideKeyframeDraw overrideKeyframeDraw, + PostKeyframeDraw postKeyframeDraw, void* arg) { + s32 limbIndex; + + if (mtx == NULL) { + return; + } + + OPEN_DISPS(play->state.gfxCtx); + + gSPSegment(POLY_OPA_DISP++, 0x0D, mtx); + gSPSegment(POLY_XLU_DISP++, 0x0D, mtx); + + limbIndex = 0; + func_801850A0(play, skeleton, &limbIndex, overrideKeyframeDraw, postKeyframeDraw, arg, &mtx); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void func_80185460(SkeletonInfo2* arg0, s32 arg1, s16* arg2) { + s16* temp_fp; + s32 sp78; + s32 var_s3 = 0; + s32 var_s4 = 0; + s32 var_s5 = 0; + s32 var_s1; + u16* var_v1; + s16* var_s6 = arg2; + s16* sp5C; + Vec3s* sp58; + s32 sp44; + + sp5C = (s16*)Lib_SegmentedToVirtual(arg0->unk_1C->unk_C); + temp_fp = (s16*)Lib_SegmentedToVirtual(arg0->unk_1C->unk_8); + sp58 = (Vec3s*)Lib_SegmentedToVirtual(arg0->unk_1C->unk_4); + var_v1 = (u16*)Lib_SegmentedToVirtual(arg0->unk_1C->unk_0); + + for (sp44 = 0; sp44 < arg0->unk_18->limbCount; sp44++) { + u32 var_s2 = 256; + + for (sp78 = 0; sp78 < 3; sp78++) { + if ((sp44 == arg1) && (sp78 == 0)) { + for (var_s1 = 0; var_s1 < 3; var_s1++) { + if (var_v1[sp44] & var_s2) { + *var_s6 = func_80183880(var_s5, temp_fp[var_s3], sp58, arg0->frameCtrl.unk_10); + var_s5 += temp_fp[var_s3]; + var_s3++; + } else { + *var_s6 = sp5C[var_s4]; + var_s4++; + } + var_s2 >>= 1; + var_s6++; + } + } else { + for (var_s1 = 0; var_s1 < 3; var_s1++) { + if (var_v1[sp44] & var_s2) { + var_s5 += temp_fp[var_s3]; + var_s3++; + } else { + var_s4++; + } + var_s2 >>= 1; + } + } + } + } +} diff --git a/src/code/graph.c b/src/code/graph.c index 3a178d2b8..ad4ad0286 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -1,4 +1,3 @@ -#include "prevent_bss_reordering.h" #include "z64.h" #include "regs.h" #include "functions.h" diff --git a/src/code/z_play.c b/src/code/z_play.c index 1be807146..3646d4e3e 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -1,4 +1,3 @@ -#include "prevent_bss_reordering.h" #include "z64.h" #include "regs.h" #include "functions.h" |
