From 2a4dd0b013e949206793bc993eaa3cc0ed1e2114 Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Wed, 25 Mar 2020 16:33:26 -0500 Subject: add non_matching code for func_800A29BC --- src/code/z_skelanime.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'src/code') diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index 501797081..da47be03f 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -754,8 +754,57 @@ Gfx* SkelAnime_DrawSV2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* acto return gfx; } -// Seems to be some kind of rotations update, somewhat large. +#ifdef NON_MATCHING +/* + * Seems to be completely unused by the game, doesn't really make much sense with the + * rest of SkelAnime animation types. This does not match due to loop unrolling, but + * is functionally equal. +*/ + +typedef struct { + s16 limitx; + s16 indexx; + s16 limity; + s16 indexy; + s16 limitz; + s16 indexz; +} unk_struct; +s16 func_800A29BC(AnimationHeader* animationSeg, s32 arg1, Vec3s *arg2) +{ + AnimationRotationValue* temp_t1; + unk_struct *temp_a3; + AnimationHeader *temp_v0; + s32 i; + + temp_v0 = SEGMENTED_TO_VIRTUAL(animationSeg); + temp_a3 = SEGMENTED_TO_VIRTUAL(temp_v0->rotationIndexSeg); + temp_t1 = SEGMENTED_TO_VIRTUAL(temp_v0->rotationValueSeg); + + + arg2->x = arg1 < temp_a3->limitx ? (&temp_t1[arg1])[temp_a3->indexx] : temp_t1[temp_a3->indexx]; + arg2->y = arg1 < temp_a3->limity ? (&temp_t1[arg1])[temp_a3->indexy] : temp_t1[temp_a3->indexy]; + arg2->z = arg1 < temp_a3->limitz ? (&temp_t1[arg1])[temp_a3->indexz] : temp_t1[temp_a3->indexz]; + + arg2++; + temp_a3++; + i = 1; + if(temp_v0->genericHeader.unk_02 > 0){ + do { + + arg2->x = arg1 < temp_a3->limitx ? (&temp_t1[arg1])[temp_a3->indexx] : temp_t1[temp_a3->indexx]; + arg2->y = arg1 < temp_a3->limity ? (&temp_t1[arg1])[temp_a3->indexy] : temp_t1[temp_a3->indexy]; + arg2->z = arg1 < temp_a3->limitz ? (&temp_t1[arg1])[temp_a3->indexz] : temp_t1[temp_a3->indexz]; + + temp_a3++; + arg2++; + i++; + } while ((temp_v0->genericHeader.unk_02 + 1) != i); + } + return temp_v0->genericHeader.unk_02; +} +#else #pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A29BC.s") +#endif s16 func_800A2DBC(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); -- cgit v1.2.3 From e03c7377b9d480597ac013710d9fc14833e1ae71 Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Wed, 25 Mar 2020 22:01:24 -0500 Subject: name SkelAnime struct members --- src/code/z_skelanime.c | 197 +++++++++++++++++++++++++------------------------ 1 file changed, 101 insertions(+), 96 deletions(-) (limited to 'src/code') diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index da47be03f..07dd85ddc 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -1046,7 +1046,7 @@ void SkelAnime_InitLinkAnimetion(GlobalContext* globalCtx, SkelAnime* skelAnime, skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg); headerCount = skeletonHeader->limbCount; - skelAnime->unk_34 = flags; + skelAnime->initFlags = flags; limbCount = (flags & 2) ? headerCount : 1; if (flags & 1) { @@ -1068,17 +1068,17 @@ void SkelAnime_InitLinkAnimetion(GlobalContext* globalCtx, SkelAnime* skelAnime, if (actorDrawTbl == NULL) { skelAnime->actorDrawTbl = ZeldaArena_MallocDebug(allocSize, "../z_skelanime.c", 2364); - skelAnime->unk_24 = ZeldaArena_MallocDebug(allocSize, "../z_skelanime.c", 2365); + skelAnime->transitionDrawTbl = ZeldaArena_MallocDebug(allocSize, "../z_skelanime.c", 2365); } else { if (limbBufCount != limbCount) { __assert("joint_buff_num == joint_num", "../z_skelanime.c", 2369); } skelAnime->actorDrawTbl = (Vec3s*)ALIGN16((u32)actorDrawTbl); - skelAnime->unk_24 = (Vec3s*)ALIGN16((u32)arg6); + skelAnime->transitionDrawTbl = (Vec3s*)ALIGN16((u32)arg6); } - if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->unk_24 == NULL)) { + if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->transitionDrawTbl == NULL)) { osSyncPrintf(VT_FGCOL(RED)); osSyncPrintf( "Skeleton_Info_Rom_SV_ct メモリアロケーションエラー\n"); // Skeleton_Info_Rom_SV_ct Memory allocation error @@ -1094,7 +1094,7 @@ void func_800A3B8C(SkelAnime* skelAnime) { } else { skelAnime->animUpdate = &func_800A3E0C; } - skelAnime->unk_28 = 0.0f; + skelAnime->transCurrentFrame = 0.0f; } void func_800A3BC0(GlobalContext* globalCtx, SkelAnime* skelAnime) { @@ -1102,17 +1102,17 @@ void func_800A3BC0(GlobalContext* globalCtx, SkelAnime* skelAnime) { } s32 func_800A3BE4(GlobalContext* globalCtx, SkelAnime* skelAnime) { - f32 prevUnk28 = skelAnime->unk_28; + f32 prevUnk28 = skelAnime->transCurrentFrame; f32 updateRate = R_UPDATE_RATE * 0.5f; - skelAnime->unk_28 -= skelAnime->unk_2C * updateRate; + skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; - if (skelAnime->unk_28 <= 0.0f) { + if (skelAnime->transCurrentFrame <= 0.0f) { func_800A3B8C(skelAnime); } - SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->unk_24, - 1.0f - (skelAnime->unk_28 / prevUnk28)); + SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, + 1.0f - (skelAnime->transCurrentFrame / prevUnk28)); return 0; } @@ -1121,15 +1121,15 @@ void func_800A3C9C(GlobalContext* globalCtx, SkelAnime* skelAnime) { SkelAnime_LoadLinkAnimetion(globalCtx, skelAnime->linkAnimetionSeg, skelAnime->animCurrentFrame, skelAnime->limbCount, skelAnime->actorDrawTbl); - if (skelAnime->unk_28 != 0) { + if (skelAnime->transCurrentFrame != 0) { updateRate = R_UPDATE_RATE * 0.5f; - skelAnime->unk_28 -= skelAnime->unk_2C * updateRate; - if (skelAnime->unk_28 <= 0.0f) { - skelAnime->unk_28 = 0.0f; + skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; + if (skelAnime->transCurrentFrame <= 0.0f) { + skelAnime->transCurrentFrame = 0.0f; return; } - SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->unk_24, - skelAnime->unk_28); + SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, + skelAnime->transCurrentFrame); } } @@ -1167,39 +1167,39 @@ s32 func_800A3E0C(GlobalContext* globalCtx, SkelAnime* skelAnime) { return 0; } -void func_800A3EE8(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 arg2) { - skelAnime->unk_28 = 1.0f; - skelAnime->unk_2C = 1.0f / arg2; +void func_800A3EE8(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 transitionRate) { + skelAnime->transCurrentFrame = 1.0f; + skelAnime->transitionStep = 1.0f / transitionRate; } #ifdef NON_MATCHING void SkelAnime_LinkChangeAnimation(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed, f32 frame, - f32 frameCount, u8 arg6, f32 arg7) { + f32 frameCount, u8 arg6, f32 transitionRate) { skelAnime->unk_01 = arg6; - if ((arg7 != 0.0f) && + if ((transitionRate != 0.0f) && ((linkAnimetionEntrySeg == skelAnime->linkAnimetionSeg) || (frame != skelAnime->animCurrentFrame))) { - if (arg7 < 0.0f) { + if (transitionRate < 0.0f) { func_800A3B8C(skelAnime); - SkelAnime_CopyVec3s(skelAnime, skelAnime->unk_24, skelAnime->actorDrawTbl); - arg7 = -arg7; + SkelAnime_CopyVec3s(skelAnime, skelAnime->transitionDrawTbl, skelAnime->actorDrawTbl); + transitionRate = -transitionRate; } else { skelAnime->animUpdate = &func_800A3BE4; SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, - skelAnime->unk_24); + skelAnime->transitionDrawTbl); } - skelAnime->unk_28 = 1.0f; - skelAnime->unk_2C = 1.0f / arg7; + skelAnime->transCurrentFrame = 1.0f; + skelAnime->transitionStep = 1.0f / transitionRate; } else { func_800A3B8C(skelAnime); SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, skelAnime->actorDrawTbl); - skelAnime->unk_28 = 0.0f; + skelAnime->transCurrentFrame = 0.0f; } skelAnime->animCurrentFrame = 0.0f; - skelAnime->unk_0C = frame; + skelAnime->initialFrame = frame; skelAnime->animCurrentFrame = frame; skelAnime->animFrameCount = frameCount; skelAnime->unk_14 = func_800A1FC8(&linkAnimetionEntrySeg->genericHeader); @@ -1232,16 +1232,16 @@ void func_800A419C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetion } void func_800A41FC(GlobalContext* globalCtx, SkelAnime* skelAnime) { - SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->unk_24, skelAnime->actorDrawTbl); + SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->transitionDrawTbl, skelAnime->actorDrawTbl); } void func_800A422C(GlobalContext* globalCtx, SkelAnime* skelAnime) { - SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->unk_24); + SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl); } void func_800A425C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 frame) { - SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, skelAnime->unk_24); + SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, skelAnime->transitionDrawTbl); } void func_800A42A0(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, @@ -1251,7 +1251,7 @@ void func_800A42A0(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetion } void func_800A42E4(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 arg2) { - SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->unk_24, arg2); + SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, arg2); } void func_800A431C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 frame, @@ -1270,12 +1270,12 @@ void func_800A43B8(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetion LinkAnimetionEntry* linkAnimetionEntrySeg2, f32 arg5, f32 arg6, Vec3s* arg7) { Vec3s* alignedArg7; - SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, skelAnime->unk_24); + SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, skelAnime->transitionDrawTbl); alignedArg7 = (Vec3s*)ALIGN16((u32)arg7); SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg2, (s32)arg5, skelAnime->limbCount, alignedArg7); - SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->unk_24, alignedArg7, arg6); + SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->transitionDrawTbl, alignedArg7, arg6); } void func_800A4454(SkelAnime* skelAnime) { @@ -1318,7 +1318,7 @@ s32 func_800A4530(SkelAnime* skelAnime, f32 arg1) { } void SkelAnime_Init(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg, - AnimationHeader* animationSeg, Vec3s* actorDrawTable, Vec3s* arg5, s32 limbCount) { + AnimationHeader* animationSeg, Vec3s* actorDrawTable, Vec3s* transitionDrawTable, s32 limbCount) { SkeletonHeader* skeletonHeader; skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg); @@ -1327,16 +1327,16 @@ void SkelAnime_Init(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHead if (actorDrawTable == NULL) { skelAnime->actorDrawTbl = ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->actorDrawTbl), "../z_skelanime.c", 2968); - skelAnime->unk_24 = - ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->unk_24), "../z_skelanime.c", 2969); + skelAnime->transitionDrawTbl = + ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->transitionDrawTbl), "../z_skelanime.c", 2969); } else { if (limbCount != skelAnime->limbCount) { __assert("joint_buff_num == this->joint_num", "../z_skelanime.c", 2973); } skelAnime->actorDrawTbl = actorDrawTable; - skelAnime->unk_24 = arg5; + skelAnime->transitionDrawTbl = transitionDrawTable; } - if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->unk_24 == NULL)) { + if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->transitionDrawTbl == NULL)) { osSyncPrintf(VT_FGCOL(RED)); osSyncPrintf("Skeleton_Info2_ct メモリアロケーションエラー\n"); // Skeleton_Info2_ct memory allocation error osSyncPrintf(VT_RST); @@ -1348,7 +1348,7 @@ void SkelAnime_Init(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHead } void SkelAnime_InitSV(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg, - AnimationHeader* animationSeg, Vec3s* actorDrawTable, Vec3s* arg5, s32 limbCount) { + AnimationHeader* animationSeg, Vec3s* actorDrawTable, Vec3s* transitionDrawTable, s32 limbCount) { SkeletonHeader* skeletonHeader; skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg); @@ -1360,16 +1360,16 @@ void SkelAnime_InitSV(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHe skelAnime->actorDrawTbl = ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->actorDrawTbl), "../z_skelanime.c", 3047); - skelAnime->unk_24 = - ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->unk_24), "../z_skelanime.c", 3048); + skelAnime->transitionDrawTbl = + ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->transitionDrawTbl), "../z_skelanime.c", 3048); } else { if (limbCount != skelAnime->limbCount) { __assert("joint_buff_num == this->joint_num", "../z_skelanime.c", 3052); } skelAnime->actorDrawTbl = actorDrawTable; - skelAnime->unk_24 = arg5; + skelAnime->transitionDrawTbl = transitionDrawTable; } - if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->unk_24 == NULL)) { + if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->transitionDrawTbl == NULL)) { osSyncPrintf(VT_FGCOL(RED)); osSyncPrintf( "Skeleton_Info_Rom_SV_ct メモリアロケーションエラー\n"); // Skeleton_Info_Rom_SV_ct Memory allocation error @@ -1390,9 +1390,9 @@ void SkelAnime_InitSkin(GlobalContext* globalCtx, SkelAnime* skelAnime, Skeleton skelAnime->skeleton = SEGMENTED_TO_VIRTUAL(skeletonHeader->skeletonSeg); skelAnime->actorDrawTbl = ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->actorDrawTbl), "../z_skelanime.c", 3120); - skelAnime->unk_24 = - ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->unk_24), "../z_skelanime.c", 3121); - if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->unk_24 == NULL)) { + skelAnime->transitionDrawTbl = + ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->transitionDrawTbl), "../z_skelanime.c", 3121); + if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->transitionDrawTbl == NULL)) { osSyncPrintf(VT_FGCOL(RED)); osSyncPrintf( "Skeleton_Info2_skin2_ct メモリアロケーションエラー\n"); // Skeleton_Info2_skin2_ct Memory allocation error @@ -1422,15 +1422,15 @@ s32 func_800A4A20(SkelAnime* skelAnime) { f32 prevUnk28; f32 updateRate; - prevUnk28 = skelAnime->unk_28; + prevUnk28 = skelAnime->transCurrentFrame; updateRate = R_UPDATE_RATE * 0.33333334f; - skelAnime->unk_28 -= skelAnime->unk_2C * updateRate; - if (skelAnime->unk_28 <= 0.0f) { + skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; + if (skelAnime->transCurrentFrame <= 0.0f) { func_800A49B0(skelAnime); - skelAnime->unk_28 = 0.0f; + skelAnime->transCurrentFrame = 0.0f; } - func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->unk_24, - 1.0f - (skelAnime->unk_28 / prevUnk28)); + func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, + 1.0f - (skelAnime->transCurrentFrame / prevUnk28)); return 0; } @@ -1443,14 +1443,14 @@ s32 func_800A4AD8(SkelAnime* skelAnime) { f32 phi_f2; f32 updateRate; - temp_a2 = (s16)(skelAnime->unk_28 * 16384.0f); + temp_a2 = (s16)(skelAnime->transCurrentFrame * 16384.0f); updateRate = R_UPDATE_RATE * 0.33333334f; - skelAnime->unk_28 -= skelAnime->unk_2C * updateRate; - if (skelAnime->unk_28 <= 0.0f) { + skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; + if (skelAnime->transCurrentFrame <= 0.0f) { func_800A49B0(skelAnime); - skelAnime->unk_28 = 0.0f; + skelAnime->transCurrentFrame = 0.0f; } - temp_a1 = (s16)(skelAnime->unk_28 * 16384.0f); + temp_a1 = (s16)(skelAnime->transCurrentFrame * 16384.0f); if (skelAnime->unk_03 < 0) { sp28 = 1.0f - Math_Coss(temp_a2); phi_f2 = 1.0f - Math_Coss(temp_a1); @@ -1463,7 +1463,7 @@ s32 func_800A4AD8(SkelAnime* skelAnime) { } else { phi_f2 = 0.0f; } - func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->unk_24, + func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, 1.0f - phi_f2); return 0; } @@ -1494,15 +1494,15 @@ void func_800A4C58(SkelAnime* skelAnime) { SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, temp_f8, skelAnime->limbCount, sp38); func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, sp38, temp_f2); } - if (skelAnime->unk_28 != 0) { - skelAnime->unk_28 -= skelAnime->unk_2C * (R_UPDATE_RATE * 0.33333334f); - temp_f0 = skelAnime->unk_28; + if (skelAnime->transCurrentFrame != 0) { + skelAnime->transCurrentFrame -= skelAnime->transitionStep * (R_UPDATE_RATE * 0.33333334f); + temp_f0 = skelAnime->transCurrentFrame; if (temp_f0 <= 0.0f) { - skelAnime->unk_28 = 0.0f; + skelAnime->transCurrentFrame = 0.0f; return; } - func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->unk_24, - skelAnime->unk_28); + func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, + skelAnime->transCurrentFrame); } } #else @@ -1524,10 +1524,10 @@ s32 func_800A4D9C(SkelAnime* skelAnime) { s32 func_800A4E38(SkelAnime* skelAnime) { f32 updateRate = R_UPDATE_RATE * 0.33333334f; skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate; - if (skelAnime->animCurrentFrame < skelAnime->unk_0C) { - skelAnime->animCurrentFrame = (skelAnime->animCurrentFrame - skelAnime->unk_0C) + skelAnime->animFrameCount; + if (skelAnime->animCurrentFrame < skelAnime->initialFrame) { + skelAnime->animCurrentFrame = (skelAnime->animCurrentFrame - skelAnime->initialFrame) + skelAnime->animFrameCount; } else if (skelAnime->animFrameCount <= skelAnime->animCurrentFrame) { - skelAnime->animCurrentFrame = (skelAnime->animCurrentFrame - skelAnime->animFrameCount) + skelAnime->unk_0C; + skelAnime->animCurrentFrame = (skelAnime->animCurrentFrame - skelAnime->animFrameCount) + skelAnime->initialFrame; } func_800A4C58(skelAnime); @@ -1568,7 +1568,7 @@ void SkelAnime_ChangeAnimationImpl(SkelAnime* skelAnime, AnimationHeader* animat ((animationSeg != skelAnime->animCurrentSeg) || (frame != skelAnime->animCurrentFrame))) { if (transitionRate < 0) { func_800A49B0(skelAnime); - SkelAnime_CopyVec3s(skelAnime, skelAnime->unk_24, skelAnime->actorDrawTbl); + SkelAnime_CopyVec3s(skelAnime, skelAnime->transitionDrawTbl, skelAnime->actorDrawTbl); transitionRate = -transitionRate; } else { if (unk2 != 0) { @@ -1577,18 +1577,18 @@ void SkelAnime_ChangeAnimationImpl(SkelAnime* skelAnime, AnimationHeader* animat } else { skelAnime->animUpdate = &func_800A4A20; } - SkelAnime_AnimateFrame(animationSeg, frame, skelAnime->limbCount, skelAnime->unk_24); + SkelAnime_AnimateFrame(animationSeg, frame, skelAnime->limbCount, skelAnime->transitionDrawTbl); } - skelAnime->unk_28 = 1.0f; - skelAnime->unk_2C = 1.0f / transitionRate; + skelAnime->transCurrentFrame = 1.0f; + skelAnime->transitionStep = 1.0f / transitionRate; } else { func_800A49B0(skelAnime); SkelAnime_AnimateFrame(animationSeg, frame, skelAnime->limbCount, skelAnime->actorDrawTbl); - skelAnime->unk_28 = 0.0f; + skelAnime->transCurrentFrame = 0.0f; } skelAnime->animCurrentSeg = animationSeg; - skelAnime->unk_0C = frame; + skelAnime->initialFrame = frame; skelAnime->animFrameCount = frameCount; skelAnime->unk_14 = func_800A1FC8(&animationSeg->genericHeader); if (skelAnime->unk_01 >= 4) { @@ -1647,9 +1647,9 @@ void func_800A53DC(SkelAnime* skelAnime) { void func_800A5408(SkelAnime* skelAnime) { f32 frameCount = skelAnime->animFrameCount; - skelAnime->animFrameCount = skelAnime->unk_0C; + skelAnime->animFrameCount = skelAnime->initialFrame; skelAnime->animPlaybackSpeed = -skelAnime->animPlaybackSpeed; - skelAnime->unk_0C = frameCount; + skelAnime->initialFrame = frameCount; } #else #pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A5408.s") @@ -1673,48 +1673,53 @@ void func_800A5490(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src, u8* arg3) { } } +/* + * Moves `pos` backwards on the xz plane from `angle` +*/ void func_800A54FC(SkelAnime* skelAnime, Vec3f* pos, s16 angle) { f32 x; f32 z; f32 sin; f32 cos; - if (skelAnime->unk_35 & 0x10) { + if (skelAnime->flags & 0x10) { pos->z = 0.0f; pos->x = 0.0f; } else { + // `angle` rotation around y axis. x = skelAnime->actorDrawTbl->x; z = skelAnime->actorDrawTbl->z; sin = Math_Sins(angle); cos = Math_Coss(angle); pos->x = x * cos + z * sin; pos->z = z * cos - x * sin; - x = skelAnime->unk_38; - z = skelAnime->unk_3C; - sin = Math_Sins(skelAnime->unk_36); - cos = Math_Coss(skelAnime->unk_36); + x = skelAnime->prevFramePos.x; + z = skelAnime->prevFramePos.z; + // `prevFrameRot` rotation around y axis. + sin = Math_Sins(skelAnime->prevFrameRot); + cos = Math_Coss(skelAnime->prevFrameRot); pos->x -= x * cos + z * sin; pos->z -= z * cos - x * sin; } - skelAnime->unk_36 = angle; - skelAnime->unk_38 = skelAnime->actorDrawTbl->x; - skelAnime->actorDrawTbl->x = skelAnime->unk_3E; - skelAnime->unk_3C = skelAnime->actorDrawTbl->z; - skelAnime->actorDrawTbl->z = skelAnime->unk_42; - if (skelAnime->unk_35 & 2) { - if (skelAnime->unk_35 & 0x10) { + skelAnime->prevFrameRot = angle; + skelAnime->prevFramePos.x = skelAnime->actorDrawTbl->x; + skelAnime->actorDrawTbl->x = skelAnime->unk_3E.x; + skelAnime->prevFramePos.z = skelAnime->actorDrawTbl->z; + skelAnime->actorDrawTbl->z = skelAnime->unk_3E.z; + if (skelAnime->flags & ANIME_FLAG_UPDATEXZ) { + if (skelAnime->flags & ANIME_FLAG_UPDATEY) { pos->y = 0.0f; } else { - pos->y = skelAnime->actorDrawTbl->y - skelAnime->unk_3A; + pos->y = skelAnime->actorDrawTbl->y - skelAnime->prevFramePos.y; } - skelAnime->unk_3A = skelAnime->actorDrawTbl->y; - skelAnime->actorDrawTbl->y = skelAnime->unk_40; + skelAnime->prevFramePos.y = skelAnime->actorDrawTbl->y; + skelAnime->actorDrawTbl->y = skelAnime->unk_3E.y; } else { pos->y = 0.0f; - skelAnime->unk_3A = skelAnime->actorDrawTbl->y; + skelAnime->prevFramePos.y = skelAnime->actorDrawTbl->y; } - skelAnime->unk_35 &= ~0x10; + skelAnime->flags &= ~ANIME_FLAG_UPDATEY; } s32 func_800A56C8(SkelAnime* skelAnime, f32 arg1) { @@ -1728,8 +1733,8 @@ void SkelAnime_Free(SkelAnime* skelAnime, GlobalContext* globalCtx) { osSyncPrintf("now_joint あきまへん!!\n"); // now_joint Akimane! ! } - if (skelAnime->unk_24 != NULL) { - ZeldaArena_FreeDebug(skelAnime->unk_24, "../z_skelanime.c", 3731); + if (skelAnime->transitionDrawTbl != NULL) { + ZeldaArena_FreeDebug(skelAnime->transitionDrawTbl, "../z_skelanime.c", 3731); } else { osSyncPrintf("morf_joint あきまへん!!\n"); // "morf_joint Akimane !!" } -- cgit v1.2.3 From 24babfa95a4c296b3895ae1c937ef6bdb80ed34d Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Mon, 30 Mar 2020 17:53:26 -0500 Subject: skelanime update wip --- src/code/sys_matrix.c | 4 +- src/code/z_skelanime.c | 256 +++++++++++++++++++++---------------------------- 2 files changed, 110 insertions(+), 150 deletions(-) (limited to 'src/code') diff --git a/src/code/sys_matrix.c b/src/code/sys_matrix.c index 24c5768d0..c320a3286 100644 --- a/src/code/sys_matrix.c +++ b/src/code/sys_matrix.c @@ -298,7 +298,7 @@ void Matrix_RotateZ(f32 z, u8 mode) { /* * Rotates the top of the matrix stack by `z` degrees, then * rotates that matrix by `y` degrees, then rotates that matrix - * by `x` degrees. + * by `x` degrees. (roll-pitch-yaw) * Original Name: Matrix_RotateXYZ, changed to reflect rotation order. */ void Matrix_RotateZYX(s16 x, s16 y, s16 z, u8 mode) { @@ -388,7 +388,7 @@ void Matrix_RotateZYX(s16 x, s16 y, s16 z, u8 mode) { /* * Translates the top of the matrix stack by `translation` units, - * then rotates that matrix by `rotation` in Z-Y-X order + * then rotates that matrix by `rotation` in Z-Y-X order (roll-pitch-yaw) */ void Matrix_TranslateThenRotateZYX(Vec3f* translation, Vec3s* rotation) { MtxF* cmf = sCurrentMatrix; diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index 07dd85ddc..3f3220ee9 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -15,7 +15,7 @@ void SkelAnime_AnimationType2Loaded(GlobalContext* globalCtx, AnimationEntryType void SkelAnime_AnimationType3Loaded(GlobalContext* globalCtx, AnimationEntryType3* entry); void SkelAnime_AnimationType4Loaded(GlobalContext* globalCtx, AnimationEntryType4* entry); void SkelAnime_AnimationType5Loaded(GlobalContext* globalCtx, AnimationEntryType5* entry); - +#define NON_MATCHING //.data u32 D_8012A480 = 0; static AnimationEntryCallback sAnimationLoadDone[] = { @@ -26,6 +26,9 @@ static AnimationEntryCallback sAnimationLoadDone[] = { //.bss u32 D_801600B0; +/* + * Draws the limb at `limbIndex` with a level of detail display lists index by `dListIndex` +*/ void SkelAnime_LodDrawLimb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex) { @@ -81,6 +84,9 @@ void SkelAnime_LodDrawLimb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* sk func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 821); } +/* + * Draws the Skeleton described by `skeleton` with a level of detail display list indexed by `dListIndex` +*/ void SkelAnime_LodDraw(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex) { @@ -131,8 +137,10 @@ void SkelAnime_LodDraw(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* acto func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 894); } -#ifdef NON_MATCHING -// regalloc +/* + * Draws the limb at `limbIndex` with a level of detail display lists index by `dListIndex`, Limb matrices come + * from a dynamic allocation from the graph arena. +*/ void SkelAnime_LodDrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex, Mtx** mtx) { @@ -153,7 +161,9 @@ void SkelAnime_LodDrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* pos.x = limbEntry->translation.x; pos.y = limbEntry->translation.y; pos.z = limbEntry->translation.z; - dList[1] = dList[0] = limbEntry->displayLists[dListIndex]; + // Double assignment here would not work. + dList[0] = limbEntry->displayLists[dListIndex]; + dList[1] = dList[0]; if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList[1], &pos, &rot, actor) == 0)) { Matrix_TranslateThenRotateZYX(&pos, &rot); @@ -185,16 +195,17 @@ void SkelAnime_LodDrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* appendDlistFunc, actor, dListIndex, mtx); } } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_LodDrawLimbSV.s") -#endif -#ifdef NON_MATCHING -// regalloc -void SkelAnime_LodDrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, s32 limbCount, +/* + * Draws the Skeleton described by `skeleton` with a level of detail display list indexed by `dListIndex` + * Matricies for the limbs are dynamically allocted from the graph arena. The dynamic allocation occurs + * because the Skeleton is too large to be supported by the normal matrix stack. +*/ +void SkelAnime_LodDrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, s32 dListCount, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex) { SkelLimbEntry* limbEntry; + char pad[4]; Gfx* dList[2]; Vec3f pos; Vec3s rot; @@ -202,7 +213,7 @@ void SkelAnime_LodDrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* ac GraphicsContext* gfxCtx; Gfx* gfx[4]; - mtx = Graph_Alloc(globalCtx->state.gfxCtx, limbCount * sizeof(Mtx)); + mtx = Graph_Alloc(globalCtx->state.gfxCtx, dListCount * sizeof(Mtx)); if (skeleton == NULL) { osSyncPrintf(VT_FGCOL(RED)); @@ -216,14 +227,14 @@ void SkelAnime_LodDrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* ac Matrix_Push(); limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[0]); - if (limbEntry) {} pos.x = actorDrawTable->x; pos.y = actorDrawTable->y; pos.z = actorDrawTable->z; rot = actorDrawTable[1]; - dList[0] = dList[1] = limbEntry->displayLists[dListIndex]; + dList[0] = limbEntry->displayLists[dListIndex]; + dList[1] = dList[0]; if ((updateMtxFunc == 0) || (updateMtxFunc(globalCtx, 1, &dList[1], &pos, &rot, actor) == 0)) { Matrix_TranslateThenRotateZYX(&pos, &rot); @@ -250,10 +261,10 @@ void SkelAnime_LodDrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* ac func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1053); } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_LodDrawSV.s") -#endif +/* + * Draws the limb of the Skeleton `skeleton` at `limbIndex` +*/ void SkelAnime_DrawLimb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor) { @@ -362,8 +373,6 @@ void SkelAnime_Draw(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDr func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1190); } -#ifdef NON_MATCHING -// close, needs a bit bmore work. Mainly seems centered around SEGMENTED_TO_VIRTUAL void SkelAnime_DrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, Mtx** limbMatricies) { @@ -386,7 +395,8 @@ void SkelAnime_DrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* ske pos.y = limbEntry->translation.y; pos.z = limbEntry->translation.z; - dList[0] = dList[1] = limbEntry->displayLists[0]; + dList[0] = limbEntry->displayLists[0]; + dList[1] = dList[0]; if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList[1], &pos, &rot, actor) == 0)) { Matrix_TranslateThenRotateZYX(&pos, &rot); @@ -419,13 +429,8 @@ void SkelAnime_DrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* ske func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1265); } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_DrawLimbSV.s") -#endif -#ifdef NON_MATCHING -// Regalloc, pretty much same as SkelAnime_LodDrawSV -void SkelAnime_DrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, s32 limbCount, +void SkelAnime_DrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, s32 dListCount, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor) { SkelLimbEntry* limbEntry; @@ -437,7 +442,7 @@ void SkelAnime_DrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actor GraphicsContext* gfxCtx; Gfx* gfx[4]; - mtx = Graph_Alloc(globalCtx->state.gfxCtx, limbCount * sizeof(Mtx)); + mtx = Graph_Alloc(globalCtx->state.gfxCtx, dListCount * sizeof(Mtx)); if (skeleton == NULL) { osSyncPrintf(VT_FGCOL(RED)); @@ -457,12 +462,13 @@ void SkelAnime_DrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actor limbEntry = SEGMENTED_TO_VIRTUAL(skeleton->limbs[0]); pos.x = actorDrawTable->x; - pos.y = actorDrawTable->x; + pos.y = actorDrawTable->y; pos.z = actorDrawTable->z; rot = actorDrawTable[1]; - dList[0] = dList[1] = limbEntry->displayLists[0]; + dList[0] = limbEntry->displayLists[0]; + dList[1] = dList[0]; if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, 1, &dList[1], &pos, &rot, actor) == 0)) { Matrix_TranslateThenRotateZYX(&pos, &rot); @@ -491,9 +497,6 @@ void SkelAnime_DrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actor Matrix_Pull(); func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1347); } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_DrawSV.s") -#endif /* * Copies the rotation values from the rotation value table, indexed by the rotation index table @@ -534,17 +537,22 @@ void SkelAnime_AnimateFrame(AnimationHeader* animationSeg, s32 currentFrame, s32 } } -s16 func_800A1FC8(GenericAnimationHeader* animationSeg) { +s16 SkelAnime_GetTotalFrames(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); return animation->frameCount; } + s16 SkelAnime_GetFrameCount(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); - + // Loads an unsigned half for some reason. return (u16)animation->frameCount - 1; } +/* + * Draws the Skeleton `skeleton`'s limb at index `limbIndex`. Appends all generated graphics commands to + * `gfx`. Returns a pointer to the next gfx to be appended to. +*/ Gfx* SkelAnime_Draw2Limb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix2 updateMtxFunc, SkelAnime_LimbAppendDlist2 appendDlistFunc, Actor* actor, Gfx* gfx) { @@ -593,6 +601,10 @@ Gfx* SkelAnime_Draw2Limb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skel return gfx; } +/* + * Draws the Skeleton `skeleton` Appends all generated graphics to `gfx`, and returns a pointer to the + * next gfx to be appended to. +*/ Gfx* SkelAnime_Draw2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix2 updateMtxFunc, SkelAnime_LimbAppendDlist2 appendDlistFunc, Actor* actor, Gfx* gfx) { @@ -754,57 +766,7 @@ Gfx* SkelAnime_DrawSV2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* acto return gfx; } -#ifdef NON_MATCHING -/* - * Seems to be completely unused by the game, doesn't really make much sense with the - * rest of SkelAnime animation types. This does not match due to loop unrolling, but - * is functionally equal. -*/ - -typedef struct { - s16 limitx; - s16 indexx; - s16 limity; - s16 indexy; - s16 limitz; - s16 indexz; -} unk_struct; -s16 func_800A29BC(AnimationHeader* animationSeg, s32 arg1, Vec3s *arg2) -{ - AnimationRotationValue* temp_t1; - unk_struct *temp_a3; - AnimationHeader *temp_v0; - s32 i; - - temp_v0 = SEGMENTED_TO_VIRTUAL(animationSeg); - temp_a3 = SEGMENTED_TO_VIRTUAL(temp_v0->rotationIndexSeg); - temp_t1 = SEGMENTED_TO_VIRTUAL(temp_v0->rotationValueSeg); - - - arg2->x = arg1 < temp_a3->limitx ? (&temp_t1[arg1])[temp_a3->indexx] : temp_t1[temp_a3->indexx]; - arg2->y = arg1 < temp_a3->limity ? (&temp_t1[arg1])[temp_a3->indexy] : temp_t1[temp_a3->indexy]; - arg2->z = arg1 < temp_a3->limitz ? (&temp_t1[arg1])[temp_a3->indexz] : temp_t1[temp_a3->indexz]; - - arg2++; - temp_a3++; - i = 1; - if(temp_v0->genericHeader.unk_02 > 0){ - do { - - arg2->x = arg1 < temp_a3->limitx ? (&temp_t1[arg1])[temp_a3->indexx] : temp_t1[temp_a3->indexx]; - arg2->y = arg1 < temp_a3->limity ? (&temp_t1[arg1])[temp_a3->indexy] : temp_t1[temp_a3->indexy]; - arg2->z = arg1 < temp_a3->limitz ? (&temp_t1[arg1])[temp_a3->indexz] : temp_t1[temp_a3->indexz]; - - temp_a3++; - arg2++; - i++; - } while ((temp_v0->genericHeader.unk_02 + 1) != i); - } - return temp_v0->genericHeader.unk_02; -} -#else #pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A29BC.s") -#endif s16 func_800A2DBC(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); @@ -812,46 +774,52 @@ s16 func_800A2DBC(GenericAnimationHeader* animationSeg) { return animation->unk_02; } -s16 func_800A2DF4(GenericAnimationHeader* animationSeg) { +/* + * Appears to be unused anywhere in the game. Appears to be a clone of + * SkelAnime_GetTotalFrames +*/ +s16 SkelAnime_GetTotalFrames2(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); return animation->frameCount; } -s16 func_800A2E2C(GenericAnimationHeader* animationSeg) { +/* + * Appears to be unused anywhere in the game. Appears to be a clone of + * SkelAnime_GetFrameCount +*/ +s16 SkelAnime_GetFrameCount2(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); return animation->frameCount - 1; } -#ifdef NON_MATCHING -// Functionally equal, but loop unrolling is way off. -void func_800A2E70(s32 limbCount, Vec3s* vec1, Vec3s* vec2, Vec3s* vec3, f32 unkf) { - Vec3s* pvec1; - Vec3s* pvec2; - Vec3s* pvec3; - s32 iVar3; - - if (unkf < 1.0f) { - for (iVar3 = 0, pvec1 = vec1, pvec2 = vec2, pvec3 = vec3; iVar3 < limbCount; - iVar3++, pvec1++, pvec2++, pvec3++) { - pvec1->x = pvec2->x + ((s16)(pvec3->x - pvec2->x) * unkf); - pvec1->y = pvec2->y + ((s16)(pvec3->y - pvec2->y) * unkf); - pvec1->z = pvec2->z + ((s16)(pvec3->z - pvec2->z) * unkf); +void SkelAnime_InterpolateRotation(s32 limbCount, Vec3s* dst, Vec3s* vec2, Vec3s* vec3, f32 unkf) { + s32 i; + s16 dist; + s16 temp2; + + if(unkf < 1.0f){ + for(i = 0; i < limbCount;i++, dst++, vec2++, vec3++){ + temp2 = vec2->x; + dist = vec3->x - temp2; + dst->x = (s16)(dist * unkf) + temp2; + temp2 = vec2->y; + dist = vec3->y - temp2; + dst->y = (s16)(dist * unkf) + temp2; + temp2 = vec2->z; + dist = vec3->z - temp2; + dst->z = (s16)(dist * unkf) + temp2; } - } else { - for (iVar3 = 0; iVar3 < limbCount; iVar3++) { - pvec1 = &vec1[iVar3]; - pvec3 = &vec3[iVar3]; - pvec1->x = pvec3->x; - pvec1->y = pvec3->y; - pvec1->z = pvec3->z; + } + else { + for (i = 0;i < limbCount; i++, dst++, vec3++) { + dst->x = vec3->x; + dst->y = vec3->y; + dst->z = vec3->z; } } } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A2E70.s") -#endif void SkelAnime_AnimationCtxReset(AnimationContext* animationCtx) { animationCtx->animationCount = 0; @@ -977,7 +945,7 @@ void SkelAnime_AnimationType1Loaded(GlobalContext* globalCtx, AnimationEntryType void SkelAnime_AnimationType2Loaded(GlobalContext* globalCtx, AnimationEntryType2* entry) { if ((entry->unk_00 & D_8012A480) == 0) { - func_800A2E70(entry->limbCount, entry->unk_04, entry->unk_04, entry->unk_08, entry->unk_0C); + SkelAnime_InterpolateRotation(entry->limbCount, entry->unk_04, entry->unk_04, entry->unk_08, entry->unk_0C); } } @@ -1138,9 +1106,9 @@ s32 func_800A3D70(GlobalContext* globalCtx, SkelAnime* skelAnime) { skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate; if (skelAnime->animCurrentFrame < 0.0f) { - skelAnime->animCurrentFrame += skelAnime->unk_14; - } else if (skelAnime->unk_14 <= skelAnime->animCurrentFrame) { - skelAnime->animCurrentFrame -= skelAnime->unk_14; + skelAnime->animCurrentFrame += skelAnime->totalFrames; + } else if (skelAnime->totalFrames <= skelAnime->animCurrentFrame) { + skelAnime->animCurrentFrame -= skelAnime->totalFrames; } func_800A3C9C(globalCtx, skelAnime); return 0; @@ -1158,9 +1126,9 @@ s32 func_800A3E0C(GlobalContext* globalCtx, SkelAnime* skelAnime) { skelAnime->animCurrentFrame = skelAnime->animFrameCount; } else { if (skelAnime->animCurrentFrame < 0.0f) { - skelAnime->animCurrentFrame += skelAnime->unk_14; - } else if (skelAnime->unk_14 <= skelAnime->animCurrentFrame) { - skelAnime->animCurrentFrame -= skelAnime->unk_14; + skelAnime->animCurrentFrame += skelAnime->totalFrames; + } else if (skelAnime->totalFrames <= skelAnime->animCurrentFrame) { + skelAnime->animCurrentFrame -= skelAnime->totalFrames; } } func_800A3C9C(globalCtx, skelAnime); @@ -1172,15 +1140,14 @@ void func_800A3EE8(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 transitio skelAnime->transitionStep = 1.0f / transitionRate; } -#ifdef NON_MATCHING void SkelAnime_LinkChangeAnimation(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed, f32 frame, f32 frameCount, u8 arg6, f32 transitionRate) { skelAnime->unk_01 = arg6; if ((transitionRate != 0.0f) && - ((linkAnimetionEntrySeg == skelAnime->linkAnimetionSeg) || (frame != skelAnime->animCurrentFrame))) { - if (transitionRate < 0.0f) { + ((linkAnimetionEntrySeg != skelAnime->linkAnimetionSeg) || (frame != skelAnime->animCurrentFrame))) { + if (transitionRate < 0) { func_800A3B8C(skelAnime); SkelAnime_CopyVec3s(skelAnime, skelAnime->transitionDrawTbl, skelAnime->actorDrawTbl); transitionRate = -transitionRate; @@ -1198,16 +1165,14 @@ void SkelAnime_LinkChangeAnimation(GlobalContext* globalCtx, SkelAnime* skelAnim skelAnime->transCurrentFrame = 0.0f; } + skelAnime->linkAnimetionSeg = linkAnimetionEntrySeg; skelAnime->animCurrentFrame = 0.0f; skelAnime->initialFrame = frame; skelAnime->animCurrentFrame = frame; skelAnime->animFrameCount = frameCount; - skelAnime->unk_14 = func_800A1FC8(&linkAnimetionEntrySeg->genericHeader); + skelAnime->totalFrames = SkelAnime_GetTotalFrames(linkAnimetionEntrySeg); skelAnime->animPlaybackSpeed = playbackSpeed; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/SkelAnime_LinkChangeAnimation.s") -#endif void func_800A407C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg) { SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, @@ -1291,15 +1256,15 @@ s32 func_800A4478(SkelAnime* skelAnime, f32 arg1, f32 updateRate) { updateSpeed = skelAnime->animPlaybackSpeed * updateRate; nextFrame = skelAnime->animCurrentFrame - updateSpeed; if (nextFrame < 0.0f) { - nextFrame += skelAnime->unk_14; + nextFrame += skelAnime->totalFrames; } else { - if (skelAnime->unk_14 <= nextFrame) { - nextFrame -= skelAnime->unk_14; + if (skelAnime->totalFrames <= nextFrame) { + nextFrame -= skelAnime->totalFrames; } } if (arg1 == 0.0f) { if (0.0f < updateSpeed) { - arg1 = skelAnime->unk_14; + arg1 = skelAnime->totalFrames; } } temp_f12 = (nextFrame + updateSpeed) - arg1; @@ -1429,16 +1394,14 @@ s32 func_800A4A20(SkelAnime* skelAnime) { func_800A49B0(skelAnime); skelAnime->transCurrentFrame = 0.0f; } - func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, + SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, 1.0f - (skelAnime->transCurrentFrame / prevUnk28)); return 0; } -#ifdef NON_MATCHING -// small stack alloc s32 func_800A4AD8(SkelAnime* skelAnime) { - s16 temp_a1; s16 temp_a2; + s16 temp_a1; f32 sp28; f32 phi_f2; f32 updateRate; @@ -1463,13 +1426,10 @@ s32 func_800A4AD8(SkelAnime* skelAnime) { } else { phi_f2 = 0.0f; } - func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, + SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, 1.0f - phi_f2); return 0; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4AD8.s") -#endif #ifdef NON_MATCHING // regalloc @@ -1483,16 +1443,16 @@ void func_800A4C58(SkelAnime* skelAnime) { SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, skelAnime->animCurrentFrame, skelAnime->limbCount, skelAnime->actorDrawTbl); - if (skelAnime->unk_01) { + if (skelAnime->unk_01 & 0x1) { temp_f8 = (s32)skelAnime->animCurrentFrame; temp_f10 = temp_f8; temp_f8++; temp_f2 = skelAnime->animCurrentFrame - temp_f10; - if (temp_f8 >= (s32)skelAnime->unk_14) { + if (temp_f8 >= (s32)skelAnime->totalFrames) { temp_f8 = 0; } SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, temp_f8, skelAnime->limbCount, sp38); - func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, sp38, temp_f2); + SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, sp38, temp_f2); } if (skelAnime->transCurrentFrame != 0) { skelAnime->transCurrentFrame -= skelAnime->transitionStep * (R_UPDATE_RATE * 0.33333334f); @@ -1501,7 +1461,7 @@ void func_800A4C58(SkelAnime* skelAnime) { skelAnime->transCurrentFrame = 0.0f; return; } - func_800A2E70(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, + SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, skelAnime->transCurrentFrame); } } @@ -1513,9 +1473,9 @@ s32 func_800A4D9C(SkelAnime* skelAnime) { f32 updateRate = R_UPDATE_RATE * 0.33333334f; skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate; if (skelAnime->animCurrentFrame < 0.0f) { - skelAnime->animCurrentFrame += skelAnime->unk_14; - } else if (skelAnime->unk_14 <= skelAnime->animCurrentFrame) { - skelAnime->animCurrentFrame -= skelAnime->unk_14; + skelAnime->animCurrentFrame += skelAnime->totalFrames; + } else if (skelAnime->totalFrames <= skelAnime->animCurrentFrame) { + skelAnime->animCurrentFrame -= skelAnime->totalFrames; } func_800A4C58(skelAnime); return 0; @@ -1550,10 +1510,10 @@ s32 func_800A4EE0(SkelAnime* skelAnime) { skelAnime->animCurrentFrame = skelAnime->animFrameCount; } else { if (skelAnime->animCurrentFrame < 0.0f) { - skelAnime->animCurrentFrame += skelAnime->unk_14; + skelAnime->animCurrentFrame += skelAnime->totalFrames; } else { - if (skelAnime->unk_14 <= skelAnime->animCurrentFrame) { - skelAnime->animCurrentFrame -= skelAnime->unk_14; + if (skelAnime->totalFrames <= skelAnime->animCurrentFrame) { + skelAnime->animCurrentFrame -= skelAnime->totalFrames; } } } @@ -1590,13 +1550,13 @@ void SkelAnime_ChangeAnimationImpl(SkelAnime* skelAnime, AnimationHeader* animat skelAnime->animCurrentSeg = animationSeg; skelAnime->initialFrame = frame; skelAnime->animFrameCount = frameCount; - skelAnime->unk_14 = func_800A1FC8(&animationSeg->genericHeader); + skelAnime->totalFrames = SkelAnime_GetTotalFrames(&animationSeg->genericHeader); if (skelAnime->unk_01 >= 4) { skelAnime->animCurrentFrame = 0.0f; } else { skelAnime->animCurrentFrame = frame; if (skelAnime->unk_01 < 2) { - skelAnime->animFrameCount = skelAnime->unk_14 - 1.0f; + skelAnime->animFrameCount = skelAnime->totalFrames - 1.0f; } } skelAnime->animPlaybackSpeed = playbackSpeed; @@ -1638,7 +1598,7 @@ void SkelAnime_ChangeAnimationPlaybackSpeed(SkelAnime* skelAnime, AnimationHeade void func_800A53DC(SkelAnime* skelAnime) { skelAnime->unk_01 = 2; - skelAnime->animFrameCount = skelAnime->unk_14; + skelAnime->animFrameCount = skelAnime->totalFrames; func_800A49B0(skelAnime); } -- cgit v1.2.3 From b9f2d4c707e9a603e0b1891227aa801745b4184a Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Mon, 30 Mar 2020 20:12:49 -0500 Subject: more skelanime wip --- src/code/z_skelanime.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'src/code') diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index 3f3220ee9..f986f8417 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -15,7 +15,7 @@ void SkelAnime_AnimationType2Loaded(GlobalContext* globalCtx, AnimationEntryType void SkelAnime_AnimationType3Loaded(GlobalContext* globalCtx, AnimationEntryType3* entry); void SkelAnime_AnimationType4Loaded(GlobalContext* globalCtx, AnimationEntryType4* entry); void SkelAnime_AnimationType5Loaded(GlobalContext* globalCtx, AnimationEntryType5* entry); -#define NON_MATCHING +//#define NON_MATCHING //.data u32 D_8012A480 = 0; static AnimationEntryCallback sAnimationLoadDone[] = { @@ -149,7 +149,7 @@ void SkelAnime_LodDrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* Vec3f pos; Vec3s rot; GraphicsContext* gfxCtx; - Gfx* gfx[3]; + Gfx* gfx[4]; Matrix_Push(); @@ -381,7 +381,7 @@ void SkelAnime_DrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* ske Vec3f pos; Vec3s rot; GraphicsContext* gfxCtx; - Gfx* gfx[3]; + Gfx* gfx[4]; gfxCtx = globalCtx->state.gfxCtx; func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1214); @@ -1057,7 +1057,7 @@ void SkelAnime_InitLinkAnimetion(GlobalContext* globalCtx, SkelAnime* skelAnime, } void func_800A3B8C(SkelAnime* skelAnime) { - if (skelAnime->unk_01 < 2) { + if (skelAnime->mode < 2) { skelAnime->animUpdate = &func_800A3D70; } else { skelAnime->animUpdate = &func_800A3E0C; @@ -1142,9 +1142,9 @@ void func_800A3EE8(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 transitio void SkelAnime_LinkChangeAnimation(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed, f32 frame, - f32 frameCount, u8 arg6, f32 transitionRate) { + f32 frameCount, u8 animationMode, f32 transitionRate) { - skelAnime->unk_01 = arg6; + skelAnime->mode = animationMode; if ((transitionRate != 0.0f) && ((linkAnimetionEntrySeg != skelAnime->linkAnimetionSeg) || (frame != skelAnime->animCurrentFrame))) { if (transitionRate < 0) { @@ -1244,7 +1244,7 @@ void func_800A43B8(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetion } void func_800A4454(SkelAnime* skelAnime) { - skelAnime->unk_01 = 2; + skelAnime->mode = 2; func_800A3B8C(skelAnime); } @@ -1370,9 +1370,9 @@ void SkelAnime_InitSkin(GlobalContext* globalCtx, SkelAnime* skelAnime, Skeleton } void func_800A49B0(SkelAnime* skelAnime) { - if (skelAnime->unk_01 < 2) { + if (skelAnime->mode < 2) { skelAnime->animUpdate = &func_800A4D9C; - } else if (skelAnime->unk_01 < 4) { + } else if (skelAnime->mode < 4) { skelAnime->animUpdate = &func_800A4EE0; } else { skelAnime->animUpdate = &func_800A4E38; @@ -1522,8 +1522,8 @@ s32 func_800A4EE0(SkelAnime* skelAnime) { } void SkelAnime_ChangeAnimationImpl(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed, f32 frame, - f32 frameCount, u8 unk1, f32 transitionRate, s8 unk2) { - skelAnime->unk_01 = unk1; + f32 frameCount, u8 animationType, f32 transitionRate, s8 unk2) { + skelAnime->mode = animationType; if ((transitionRate != 0.0f) && ((animationSeg != skelAnime->animCurrentSeg) || (frame != skelAnime->animCurrentFrame))) { if (transitionRate < 0) { @@ -1551,11 +1551,11 @@ void SkelAnime_ChangeAnimationImpl(SkelAnime* skelAnime, AnimationHeader* animat skelAnime->initialFrame = frame; skelAnime->animFrameCount = frameCount; skelAnime->totalFrames = SkelAnime_GetTotalFrames(&animationSeg->genericHeader); - if (skelAnime->unk_01 >= 4) { + if (skelAnime->mode >= 4) { skelAnime->animCurrentFrame = 0.0f; } else { skelAnime->animCurrentFrame = frame; - if (skelAnime->unk_01 < 2) { + if (skelAnime->mode < 2) { skelAnime->animFrameCount = skelAnime->totalFrames - 1.0f; } } @@ -1597,7 +1597,7 @@ void SkelAnime_ChangeAnimationPlaybackSpeed(SkelAnime* skelAnime, AnimationHeade } void func_800A53DC(SkelAnime* skelAnime) { - skelAnime->unk_01 = 2; + skelAnime->mode = 2; skelAnime->animFrameCount = skelAnime->totalFrames; func_800A49B0(skelAnime); } -- cgit v1.2.3 From 6d6299cb0b6c202af5a40199744f3db352b252a8 Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Mon, 30 Mar 2020 22:22:10 -0500 Subject: use ONE_THIRD define for 0.333f --- src/code/z_skelanime.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'src/code') diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index f986f8417..49870ef41 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -2,6 +2,8 @@ #include #include +#define ONE_THIRD (1.0f / 3.0f) + s32 func_800A3D70(GlobalContext*, SkelAnime*); s32 func_800A3E0C(GlobalContext*, SkelAnime*); s32 func_800A4D9C(SkelAnime* skelAnime); @@ -1388,7 +1390,7 @@ s32 func_800A4A20(SkelAnime* skelAnime) { f32 updateRate; prevUnk28 = skelAnime->transCurrentFrame; - updateRate = R_UPDATE_RATE * 0.33333334f; + updateRate = R_UPDATE_RATE * ONE_THIRD; skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; if (skelAnime->transCurrentFrame <= 0.0f) { func_800A49B0(skelAnime); @@ -1407,7 +1409,7 @@ s32 func_800A4AD8(SkelAnime* skelAnime) { f32 updateRate; temp_a2 = (s16)(skelAnime->transCurrentFrame * 16384.0f); - updateRate = R_UPDATE_RATE * 0.33333334f; + updateRate = R_UPDATE_RATE * ONE_THIRD; skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; if (skelAnime->transCurrentFrame <= 0.0f) { func_800A49B0(skelAnime); @@ -1443,7 +1445,7 @@ void func_800A4C58(SkelAnime* skelAnime) { SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, skelAnime->animCurrentFrame, skelAnime->limbCount, skelAnime->actorDrawTbl); - if (skelAnime->unk_01 & 0x1) { + if (skelAnime->mode & 0x1) { temp_f8 = (s32)skelAnime->animCurrentFrame; temp_f10 = temp_f8; temp_f8++; @@ -1455,7 +1457,7 @@ void func_800A4C58(SkelAnime* skelAnime) { SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, sp38, temp_f2); } if (skelAnime->transCurrentFrame != 0) { - skelAnime->transCurrentFrame -= skelAnime->transitionStep * (R_UPDATE_RATE * 0.33333334f); + skelAnime->transCurrentFrame -= skelAnime->transitionStep * (R_UPDATE_RATE * ONE_THIRD); temp_f0 = skelAnime->transCurrentFrame; if (temp_f0 <= 0.0f) { skelAnime->transCurrentFrame = 0.0f; @@ -1470,7 +1472,7 @@ void func_800A4C58(SkelAnime* skelAnime) { #endif s32 func_800A4D9C(SkelAnime* skelAnime) { - f32 updateRate = R_UPDATE_RATE * 0.33333334f; + f32 updateRate = R_UPDATE_RATE * ONE_THIRD; skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate; if (skelAnime->animCurrentFrame < 0.0f) { skelAnime->animCurrentFrame += skelAnime->totalFrames; @@ -1482,7 +1484,7 @@ s32 func_800A4D9C(SkelAnime* skelAnime) { } s32 func_800A4E38(SkelAnime* skelAnime) { - f32 updateRate = R_UPDATE_RATE * 0.33333334f; + f32 updateRate = R_UPDATE_RATE * ONE_THIRD; skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate; if (skelAnime->animCurrentFrame < skelAnime->initialFrame) { skelAnime->animCurrentFrame = (skelAnime->animCurrentFrame - skelAnime->initialFrame) + skelAnime->animFrameCount; @@ -1497,7 +1499,7 @@ s32 func_800A4E38(SkelAnime* skelAnime) { s32 func_800A4EE0(SkelAnime* skelAnime) { f32 temp_f14; - temp_f14 = R_UPDATE_RATE * 0.33333334f; + temp_f14 = R_UPDATE_RATE * ONE_THIRD; if (skelAnime->animCurrentFrame == skelAnime->animFrameCount) { SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, (s32)skelAnime->animCurrentFrame, skelAnime->limbCount, -- cgit v1.2.3 From 8f54c82a9672506e33c58e216230f88bda3242e9 Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Mon, 30 Mar 2020 22:37:01 -0500 Subject: rename SkelAnime_ChangeAnimation functions --- src/code/z_skelanime.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src/code') diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index 49870ef41..e055cd356 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -1310,7 +1310,7 @@ void SkelAnime_Init(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHead } if (animationSeg != NULL) { - SkelAnime_ChangeAnimationDefault(skelAnime, animationSeg); + SkelAnime_ChangeAnimationDefaultRepeat(skelAnime, animationSeg); } } @@ -1344,7 +1344,7 @@ void SkelAnime_InitSV(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHe } if (animationSeg != NULL) { - SkelAnime_ChangeAnimationDefault(skelAnime, animationSeg); + SkelAnime_ChangeAnimationDefaultRepeat(skelAnime, animationSeg); } } @@ -1367,7 +1367,7 @@ void SkelAnime_InitSkin(GlobalContext* globalCtx, SkelAnime* skelAnime, Skeleton } if (animationSeg != NULL) { - SkelAnime_ChangeAnimationDefault(skelAnime, animationSeg); + SkelAnime_ChangeAnimationDefaultRepeat(skelAnime, animationSeg); } } @@ -1565,35 +1565,35 @@ void SkelAnime_ChangeAnimationImpl(SkelAnime* skelAnime, AnimationHeader* animat } void SkelAnime_ChangeAnimation(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed, f32 frame, - f32 frameCount, u8 unk1, f32 transitionRate) { - SkelAnime_ChangeAnimationImpl(skelAnime, animationSeg, playbackSpeed, frame, frameCount, unk1, transitionRate, 0); + f32 frameCount, u8 mode, f32 transitionRate) { + SkelAnime_ChangeAnimationImpl(skelAnime, animationSeg, playbackSpeed, frame, frameCount, mode, transitionRate, 0); } - -void func_800A51E8(SkelAnime* skelAnime, AnimationHeader* animationSeg) { +//SkelAnimeChangeAnimationDefaultStop +void SkelAnimeChangeAnimationDefaultStop(SkelAnime* skelAnime, AnimationHeader* animationSeg) { SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, 0.0f); } -void func_800A5240(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) { +void SkelAnime_ChangeAnimationTransitionStop(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) { SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, transitionRate); } - -void func_800A529C(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) { +//SkelAnime_ChangeAnimationPlaybackStop +void SkelAnime_ChangeAnimationPlaybackStop(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) { SkelAnime_ChangeAnimation(skelAnime, animationSeg, playbackSpeed, 0.0f, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, 0.0f); } -void SkelAnime_ChangeAnimationDefault(SkelAnime* skelAnime, AnimationHeader* animationSeg) { +void SkelAnime_ChangeAnimationDefaultRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg) { SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, 0.0f); } -void SkelAnime_ChangeAnimationTransitionRate(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) { +void SkelAnime_ChangeAnimationTransitionRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) { SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f, 0.0f, 0, transitionRate); } -void SkelAnime_ChangeAnimationPlaybackSpeed(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) { +void SkelAnime_ChangeAnimationPlaybackRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) { SkelAnime_ChangeAnimation(skelAnime, animationSeg, playbackSpeed, 0.0f, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, 0.0f); } -- cgit v1.2.3 From 75f570f4ac4e760ef1431ddc41e50a95ed24d099 Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Tue, 31 Mar 2020 18:29:09 -0500 Subject: skelanime wip --- src/code/z_skelanime.c | 143 +++++++++++++++++++++++++++++++------------------ 1 file changed, 92 insertions(+), 51 deletions(-) (limited to 'src/code') diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index e055cd356..ca38ec046 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -3,7 +3,7 @@ #include #define ONE_THIRD (1.0f / 3.0f) - +#define NON_MATCHING s32 func_800A3D70(GlobalContext*, SkelAnime*); s32 func_800A3E0C(GlobalContext*, SkelAnime*); s32 func_800A4D9C(SkelAnime* skelAnime); @@ -17,7 +17,7 @@ void SkelAnime_AnimationType2Loaded(GlobalContext* globalCtx, AnimationEntryType void SkelAnime_AnimationType3Loaded(GlobalContext* globalCtx, AnimationEntryType3* entry); void SkelAnime_AnimationType4Loaded(GlobalContext* globalCtx, AnimationEntryType4* entry); void SkelAnime_AnimationType5Loaded(GlobalContext* globalCtx, AnimationEntryType5* entry); -//#define NON_MATCHING + //.data u32 D_8012A480 = 0; static AnimationEntryCallback sAnimationLoadDone[] = { @@ -768,7 +768,61 @@ Gfx* SkelAnime_DrawSV2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* acto return gfx; } +#ifdef NON_MATCHING +s32 func_800A29BC(s32 arg0, s32 arg1, Vec3s *arg2) +{ + s16* temp_t1; + s16* temp_a3; + AnimationHeader *temp_v0; + s32 phi_v0; + s32 t; + + temp_v0 = SEGMENTED_TO_VIRTUAL(arg0); + t = temp_v0->genericHeader.unk_02; + temp_a3 = SEGMENTED_TO_VIRTUAL(temp_v0->rotationIndexSeg); + temp_t1 = SEGMENTED_TO_VIRTUAL(temp_v0->rotationValueSeg); + + arg2->x = arg1 < temp_a3[0] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[1]] : temp_t1[temp_a3[1]]; + arg2->y = arg1 < temp_a3[2] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[3]] : temp_t1[temp_a3[3]]; + arg2->z = arg1 < temp_a3[4] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[5]] : temp_t1[temp_a3[5]]; + + phi_v0 = 1; + arg2++; + temp_a3 += 6; + + if(t > 0){ + if(t & 1){ + phi_v0++; + arg2->x = arg1 < temp_a3[0] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[1]] : temp_t1[temp_a3[1]]; + arg2->y = arg1 < temp_a3[2] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[3]] : temp_t1[temp_a3[3]]; + arg2->z = arg1 < temp_a3[4] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[5]] : temp_t1[temp_a3[5]]; + temp_a3 += 6; + arg2++; + if(t + 1 == phi_v0){ + goto ret; + } + } + do{ + phi_v0 += 2; + arg2->x = arg1 < temp_a3[0] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[1]] : temp_t1[temp_a3[1]]; + arg2->y = arg1 < temp_a3[2] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[3]] : temp_t1[temp_a3[3]]; + arg2->z = arg1 < temp_a3[4] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[5]] : temp_t1[temp_a3[5]]; + temp_a3 += 6; + arg2++; + arg2->x = arg1 < temp_a3[0] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[1]] : temp_t1[temp_a3[1]]; + arg2->y = arg1 < temp_a3[2] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[3]] : temp_t1[temp_a3[3]]; + arg2->z = arg1 < temp_a3[4] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[5]] : temp_t1[temp_a3[5]]; + temp_a3 += 6; + arg2++; + } while(phi_v0 != t + 1); + + } +ret: + return t; +} +#else #pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A29BC.s") +#endif s16 func_800A2DBC(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); @@ -1067,8 +1121,8 @@ void func_800A3B8C(SkelAnime* skelAnime) { skelAnime->transCurrentFrame = 0.0f; } -void func_800A3BC0(GlobalContext* globalCtx, SkelAnime* skelAnime) { - skelAnime->animUpdate(globalCtx, skelAnime); +s32 func_800A3BC0(GlobalContext* globalCtx, SkelAnime* skelAnime) { + return skelAnime->animUpdate(globalCtx, skelAnime); } s32 func_800A3BE4(GlobalContext* globalCtx, SkelAnime* skelAnime) { @@ -1176,23 +1230,23 @@ void SkelAnime_LinkChangeAnimation(GlobalContext* globalCtx, SkelAnime* skelAnim skelAnime->animPlaybackSpeed = playbackSpeed; } -void func_800A407C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg) { +void SkelAnime_LinkChangeAnimationDefaultStop(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg) { SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f); } -void func_800A40DC(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, +void SkelAnime_LinkChangeAnimationPlaybackStop(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed) { SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f, SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f); } -void func_800A4140(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg) { +void SkelAnime_LinkChangeAnimationDefaultRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg) { SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f); } -void func_800A419C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, +void SkelAnime_LinkChangeAnimationPlaybackRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed) { SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f, SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f); @@ -1259,21 +1313,17 @@ s32 func_800A4478(SkelAnime* skelAnime, f32 arg1, f32 updateRate) { nextFrame = skelAnime->animCurrentFrame - updateSpeed; if (nextFrame < 0.0f) { nextFrame += skelAnime->totalFrames; - } else { - if (skelAnime->totalFrames <= nextFrame) { - nextFrame -= skelAnime->totalFrames; - } + } else if (skelAnime->totalFrames <= nextFrame) { + nextFrame -= skelAnime->totalFrames; } - if (arg1 == 0.0f) { - if (0.0f < updateSpeed) { - arg1 = skelAnime->totalFrames; - } + + if ((arg1 == 0.0f) && (updateSpeed > 0.0f)) { + arg1 = skelAnime->totalFrames; } + temp_f12 = (nextFrame + updateSpeed) - arg1; - if (0.0f <= (temp_f12 * updateSpeed)) { - if (((temp_f12 - updateSpeed) * updateSpeed) < 0.0f) { - return 1; - } + if ((0.0f <= (temp_f12 * updateSpeed)) && (((temp_f12 - updateSpeed) * updateSpeed) < 0.0f)) { + return 1; } return 0; } @@ -1433,33 +1483,31 @@ s32 func_800A4AD8(SkelAnime* skelAnime) { return 0; } -#ifdef NON_MATCHING -// regalloc void func_800A4C58(SkelAnime* skelAnime) { - char pad[6]; - f32 temp_f0; + s32 t; + f32 updateRate; + char pad[4]; + Vec3s sp38[98]; f32 temp_f10; - Vec3s sp38[97]; - s32 temp_f8; f32 temp_f2; SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, skelAnime->animCurrentFrame, skelAnime->limbCount, skelAnime->actorDrawTbl); if (skelAnime->mode & 0x1) { - temp_f8 = (s32)skelAnime->animCurrentFrame; - temp_f10 = temp_f8; - temp_f8++; + t = (s32)skelAnime->animCurrentFrame; + temp_f10 = t; temp_f2 = skelAnime->animCurrentFrame - temp_f10; - if (temp_f8 >= (s32)skelAnime->totalFrames) { - temp_f8 = 0; + t++; + if (t >= (s32)skelAnime->totalFrames) { + t = 0; } - SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, temp_f8, skelAnime->limbCount, sp38); + SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, t, skelAnime->limbCount, sp38); SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, sp38, temp_f2); } if (skelAnime->transCurrentFrame != 0) { - skelAnime->transCurrentFrame -= skelAnime->transitionStep * (R_UPDATE_RATE * ONE_THIRD); - temp_f0 = skelAnime->transCurrentFrame; - if (temp_f0 <= 0.0f) { + updateRate = R_UPDATE_RATE * ONE_THIRD; + skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; + if (skelAnime->transCurrentFrame <= 0.0f) { skelAnime->transCurrentFrame = 0.0f; return; } @@ -1467,9 +1515,6 @@ void func_800A4C58(SkelAnime* skelAnime) { skelAnime->transCurrentFrame); } } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A4C58.s") -#endif s32 func_800A4D9C(SkelAnime* skelAnime) { f32 updateRate = R_UPDATE_RATE * ONE_THIRD; @@ -1568,8 +1613,8 @@ void SkelAnime_ChangeAnimation(SkelAnime* skelAnime, AnimationHeader* animationS f32 frameCount, u8 mode, f32 transitionRate) { SkelAnime_ChangeAnimationImpl(skelAnime, animationSeg, playbackSpeed, frame, frameCount, mode, transitionRate, 0); } -//SkelAnimeChangeAnimationDefaultStop -void SkelAnimeChangeAnimationDefaultStop(SkelAnime* skelAnime, AnimationHeader* animationSeg) { + +void SkelAnime_ChangeAnimationDefaultStop(SkelAnime* skelAnime, AnimationHeader* animationSeg) { SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, 0.0f); } @@ -1578,7 +1623,7 @@ void SkelAnime_ChangeAnimationTransitionStop(SkelAnime* skelAnime, AnimationHead SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, transitionRate); } -//SkelAnime_ChangeAnimationPlaybackStop + void SkelAnime_ChangeAnimationPlaybackStop(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) { SkelAnime_ChangeAnimation(skelAnime, animationSeg, playbackSpeed, 0.0f, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, 0.0f); @@ -1598,24 +1643,20 @@ void SkelAnime_ChangeAnimationPlaybackRepeat(SkelAnime* skelAnime, AnimationHead SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, 0.0f); } -void func_800A53DC(SkelAnime* skelAnime) { +void SkelAnime_AnimationSetStop(SkelAnime* skelAnime) { skelAnime->mode = 2; skelAnime->animFrameCount = skelAnime->totalFrames; func_800A49B0(skelAnime); } -#ifdef NON_MATCHING -// regalloc -void func_800A5408(SkelAnime* skelAnime) { - f32 frameCount = skelAnime->animFrameCount; - skelAnime->animFrameCount = skelAnime->initialFrame; +void SkelAnime_AnimationReverse(SkelAnime* skelAnime) { + f32 initialFrame = skelAnime->initialFrame; + + skelAnime->initialFrame = skelAnime->animFrameCount; skelAnime->animPlaybackSpeed = -skelAnime->animPlaybackSpeed; - skelAnime->initialFrame = frameCount; + skelAnime->animFrameCount = initialFrame; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A5408.s") -#endif void func_800A5428(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src, u8* index) { s32 i; -- cgit v1.2.3 From f069777b19a6d8c54173569552e8286e1b854be5 Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Tue, 31 Mar 2020 20:19:21 -0500 Subject: name more skelanime struct members, match all but 1 function, name more functions, some documentation --- src/code/z_skelanime.c | 140 ++++++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 65 deletions(-) (limited to 'src/code') diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index ca38ec046..954de5a41 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -3,13 +3,11 @@ #include #define ONE_THIRD (1.0f / 3.0f) -#define NON_MATCHING s32 func_800A3D70(GlobalContext*, SkelAnime*); s32 func_800A3E0C(GlobalContext*, SkelAnime*); s32 func_800A4D9C(SkelAnime* skelAnime); s32 func_800A4EE0(SkelAnime* skelAnime); s32 func_800A4E38(SkelAnime* skelAnime); -s32 func_800A4AD8(SkelAnime* skelAnime); void SkelAnime_CopyVec3s(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src); void SkelAnime_LinkAnimetionLoaded(GlobalContext* globalCtx, AnimationEntryType0* entry); void SkelAnime_AnimationType1Loaded(GlobalContext* globalCtx, AnimationEntryType1* entry); @@ -30,7 +28,7 @@ u32 D_801600B0; /* * Draws the limb at `limbIndex` with a level of detail display lists index by `dListIndex` -*/ + */ void SkelAnime_LodDrawLimb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex) { @@ -88,7 +86,7 @@ void SkelAnime_LodDrawLimb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* sk /* * Draws the Skeleton described by `skeleton` with a level of detail display list indexed by `dListIndex` -*/ + */ void SkelAnime_LodDraw(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex) { @@ -102,7 +100,7 @@ void SkelAnime_LodDraw(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* acto if (skeleton == NULL) { osSyncPrintf(VT_FGCOL(RED)); - osSyncPrintf("Si2_Lod_draw():skelがNULLです。\n"); + osSyncPrintf("Si2_Lod_draw():skelがNULLです。\n"); // Si2_Lod_draw (): skel is NULL. osSyncPrintf(VT_RST); return; } @@ -142,7 +140,7 @@ void SkelAnime_LodDraw(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* acto /* * Draws the limb at `limbIndex` with a level of detail display lists index by `dListIndex`, Limb matrices come * from a dynamic allocation from the graph arena. -*/ + */ void SkelAnime_LodDrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex, Mtx** mtx) { @@ -202,7 +200,7 @@ void SkelAnime_LodDrawLimbSV(GlobalContext* globalCtx, s32 limbIndex, Skeleton* * Draws the Skeleton described by `skeleton` with a level of detail display list indexed by `dListIndex` * Matricies for the limbs are dynamically allocted from the graph arena. The dynamic allocation occurs * because the Skeleton is too large to be supported by the normal matrix stack. -*/ + */ void SkelAnime_LodDrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, s32 dListCount, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex) { @@ -219,7 +217,7 @@ void SkelAnime_LodDrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* ac if (skeleton == NULL) { osSyncPrintf(VT_FGCOL(RED)); - osSyncPrintf("Si2_Lod_draw_SV():skelがNULLです。\n"); + osSyncPrintf("Si2_Lod_draw_SV():skelがNULLです。\n"); // Si2_Lod_draw_SV (): skel is NULL. osSyncPrintf(VT_RST); return; } @@ -266,7 +264,7 @@ void SkelAnime_LodDrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* ac /* * Draws the limb of the Skeleton `skeleton` at `limbIndex` -*/ + */ void SkelAnime_DrawLimb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor) { @@ -544,7 +542,6 @@ s16 SkelAnime_GetTotalFrames(GenericAnimationHeader* animationSeg) { return animation->frameCount; } - s16 SkelAnime_GetFrameCount(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); // Loads an unsigned half for some reason. @@ -554,7 +551,7 @@ s16 SkelAnime_GetFrameCount(GenericAnimationHeader* animationSeg) { /* * Draws the Skeleton `skeleton`'s limb at index `limbIndex`. Appends all generated graphics commands to * `gfx`. Returns a pointer to the next gfx to be appended to. -*/ + */ Gfx* SkelAnime_Draw2Limb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix2 updateMtxFunc, SkelAnime_LimbAppendDlist2 appendDlistFunc, Actor* actor, Gfx* gfx) { @@ -606,7 +603,7 @@ Gfx* SkelAnime_Draw2Limb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skel /* * Draws the Skeleton `skeleton` Appends all generated graphics to `gfx`, and returns a pointer to the * next gfx to be appended to. -*/ + */ Gfx* SkelAnime_Draw2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix2 updateMtxFunc, SkelAnime_LimbAppendDlist2 appendDlistFunc, Actor* actor, Gfx* gfx) { @@ -618,7 +615,7 @@ Gfx* SkelAnime_Draw2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorD if (skeleton == NULL) { osSyncPrintf(VT_FGCOL(RED)); - osSyncPrintf("Si2_draw2():skelがNULLです。NULLを返します。\n"); + osSyncPrintf("Si2_draw2():skelがNULLです。NULLを返します。\n"); // Si2_draw2 (): skel is NULL. Returns NULL. osSyncPrintf(VT_RST); return NULL; } @@ -710,6 +707,10 @@ Gfx* SkelAnime_DrawLimbSV2(GlobalContext* globalCtx, s32 limbIndex, Skeleton* sk return gfx; } +/* + * Draws the Skeleton `skeleton` Appends all generated graphics to `gfx`, and returns a pointer to the + * next gfx to be appended to. Allocates matricies for display lists on the graph heap. + */ Gfx* SkelAnime_DrawSV2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* actorDrawTable, s32 dListCount, SkelAnime_LimbUpdateMatrix2 updateMtxFunc, SkelAnime_LimbAppendDlist2 appendDlistFunc, Actor* actor, Gfx* gfx) { @@ -724,7 +725,8 @@ Gfx* SkelAnime_DrawSV2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* acto mtx = Graph_Alloc(globalCtx->state.gfxCtx, dListCount * sizeof(*mtx)); if (skeleton == NULL) { osSyncPrintf(VT_FGCOL(RED)); - osSyncPrintf("Si2_draw2_SV():skelがNULLです。NULLを返します。\n"); + osSyncPrintf( + "Si2_draw2_SV():skelがNULLです。NULLを返します。\n"); // Si2_draw2_SV (): skel is NULL. Returns NULL. osSyncPrintf(VT_RST); return NULL; } @@ -769,11 +771,11 @@ Gfx* SkelAnime_DrawSV2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* acto } #ifdef NON_MATCHING -s32 func_800A29BC(s32 arg0, s32 arg1, Vec3s *arg2) -{ +// Function is unused. This is functionally equivilent, misplace andi which caused regalloc +s32 func_800A29BC(s32 arg0, s32 arg1, Vec3s* arg2) { s16* temp_t1; s16* temp_a3; - AnimationHeader *temp_v0; + AnimationHeader* temp_v0; s32 phi_v0; s32 t; @@ -790,19 +792,19 @@ s32 func_800A29BC(s32 arg0, s32 arg1, Vec3s *arg2) arg2++; temp_a3 += 6; - if(t > 0){ - if(t & 1){ + if (t > 0) { + if (t & 1) { phi_v0++; arg2->x = arg1 < temp_a3[0] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[1]] : temp_t1[temp_a3[1]]; arg2->y = arg1 < temp_a3[2] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[3]] : temp_t1[temp_a3[3]]; arg2->z = arg1 < temp_a3[4] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[5]] : temp_t1[temp_a3[5]]; temp_a3 += 6; arg2++; - if(t + 1 == phi_v0){ + if (t + 1 == phi_v0) { goto ret; } } - do{ + do { phi_v0 += 2; arg2->x = arg1 < temp_a3[0] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[1]] : temp_t1[temp_a3[1]]; arg2->y = arg1 < temp_a3[2] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[3]] : temp_t1[temp_a3[3]]; @@ -814,8 +816,7 @@ s32 func_800A29BC(s32 arg0, s32 arg1, Vec3s *arg2) arg2->z = arg1 < temp_a3[4] ? ((s16*)((arg1 * 2) + (u32)temp_t1))[temp_a3[5]] : temp_t1[temp_a3[5]]; temp_a3 += 6; arg2++; - } while(phi_v0 != t + 1); - + } while (phi_v0 != t + 1); } ret: return t; @@ -833,7 +834,7 @@ s16 func_800A2DBC(GenericAnimationHeader* animationSeg) { /* * Appears to be unused anywhere in the game. Appears to be a clone of * SkelAnime_GetTotalFrames -*/ + */ s16 SkelAnime_GetTotalFrames2(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); @@ -843,20 +844,20 @@ s16 SkelAnime_GetTotalFrames2(GenericAnimationHeader* animationSeg) { /* * Appears to be unused anywhere in the game. Appears to be a clone of * SkelAnime_GetFrameCount -*/ + */ s16 SkelAnime_GetFrameCount2(GenericAnimationHeader* animationSeg) { GenericAnimationHeader* animation = SEGMENTED_TO_VIRTUAL(animationSeg); return animation->frameCount - 1; } -void SkelAnime_InterpolateRotation(s32 limbCount, Vec3s* dst, Vec3s* vec2, Vec3s* vec3, f32 unkf) { +void SkelAnime_InterpolateVec3s(s32 limbCount, Vec3s* dst, Vec3s* vec2, Vec3s* vec3, f32 unkf) { s32 i; s16 dist; s16 temp2; - if(unkf < 1.0f){ - for(i = 0; i < limbCount;i++, dst++, vec2++, vec3++){ + if (unkf < 1.0f) { + for (i = 0; i < limbCount; i++, dst++, vec2++, vec3++) { temp2 = vec2->x; dist = vec3->x - temp2; dst->x = (s16)(dist * unkf) + temp2; @@ -867,9 +868,8 @@ void SkelAnime_InterpolateRotation(s32 limbCount, Vec3s* dst, Vec3s* vec2, Vec3s dist = vec3->z - temp2; dst->z = (s16)(dist * unkf) + temp2; } - } - else { - for (i = 0;i < limbCount; i++, dst++, vec3++) { + } else { + for (i = 0; i < limbCount; i++, dst++, vec3++) { dst->x = vec3->x; dst->y = vec3->y; dst->z = vec3->z; @@ -1001,7 +1001,7 @@ void SkelAnime_AnimationType1Loaded(GlobalContext* globalCtx, AnimationEntryType void SkelAnime_AnimationType2Loaded(GlobalContext* globalCtx, AnimationEntryType2* entry) { if ((entry->unk_00 & D_8012A480) == 0) { - SkelAnime_InterpolateRotation(entry->limbCount, entry->unk_04, entry->unk_04, entry->unk_08, entry->unk_0C); + SkelAnime_InterpolateVec3s(entry->limbCount, entry->unk_04, entry->unk_04, entry->unk_08, entry->unk_0C); } } @@ -1152,8 +1152,8 @@ void func_800A3C9C(GlobalContext* globalCtx, SkelAnime* skelAnime) { skelAnime->transCurrentFrame = 0.0f; return; } - SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, - skelAnime->transCurrentFrame); + SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, + skelAnime->transitionDrawTbl, skelAnime->transCurrentFrame); } } @@ -1230,39 +1230,44 @@ void SkelAnime_LinkChangeAnimation(GlobalContext* globalCtx, SkelAnime* skelAnim skelAnime->animPlaybackSpeed = playbackSpeed; } -void SkelAnime_LinkChangeAnimationDefaultStop(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg) { +void SkelAnime_LinkChangeAnimationDefaultStop(GlobalContext* globalCtx, SkelAnime* skelAnime, + LinkAnimetionEntry* linkAnimetionEntrySeg) { SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f); } -void SkelAnime_LinkChangeAnimationPlaybackStop(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, - f32 playbackSpeed) { +void SkelAnime_LinkChangeAnimationPlaybackStop(GlobalContext* globalCtx, SkelAnime* skelAnime, + LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed) { SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f, SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f); } -void SkelAnime_LinkChangeAnimationDefaultRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg) { +void SkelAnime_LinkChangeAnimationDefaultRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, + LinkAnimetionEntry* linkAnimetionEntrySeg) { SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f); } -void SkelAnime_LinkChangeAnimationPlaybackRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, - f32 playbackSpeed) { +void SkelAnime_LinkChangeAnimationPlaybackRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, + LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed) { SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f, SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f); } void func_800A41FC(GlobalContext* globalCtx, SkelAnime* skelAnime) { - SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->transitionDrawTbl, skelAnime->actorDrawTbl); + SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->transitionDrawTbl, + skelAnime->actorDrawTbl); } void func_800A422C(GlobalContext* globalCtx, SkelAnime* skelAnime) { - SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl); + SkelAnime_LoadAnimationType1(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, + skelAnime->transitionDrawTbl); } void func_800A425C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 frame) { - SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, skelAnime->transitionDrawTbl); + SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, + skelAnime->transitionDrawTbl); } void func_800A42A0(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, @@ -1272,7 +1277,8 @@ void func_800A42A0(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetion } void func_800A42E4(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 arg2) { - SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, arg2); + SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, + arg2); } void func_800A431C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 frame, @@ -1291,7 +1297,8 @@ void func_800A43B8(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetion LinkAnimetionEntry* linkAnimetionEntrySeg2, f32 arg5, f32 arg6, Vec3s* arg7) { Vec3s* alignedArg7; - SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, skelAnime->transitionDrawTbl); + SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, + skelAnime->transitionDrawTbl); alignedArg7 = (Vec3s*)ALIGN16((u32)arg7); @@ -1313,7 +1320,7 @@ s32 func_800A4478(SkelAnime* skelAnime, f32 arg1, f32 updateRate) { nextFrame = skelAnime->animCurrentFrame - updateSpeed; if (nextFrame < 0.0f) { nextFrame += skelAnime->totalFrames; - } else if (skelAnime->totalFrames <= nextFrame) { + } else if (skelAnime->totalFrames <= nextFrame) { nextFrame -= skelAnime->totalFrames; } @@ -1344,8 +1351,8 @@ void SkelAnime_Init(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHead if (actorDrawTable == NULL) { skelAnime->actorDrawTbl = ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->actorDrawTbl), "../z_skelanime.c", 2968); - skelAnime->transitionDrawTbl = - ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->transitionDrawTbl), "../z_skelanime.c", 2969); + skelAnime->transitionDrawTbl = ZeldaArena_MallocDebug( + skelAnime->limbCount * sizeof(*skelAnime->transitionDrawTbl), "../z_skelanime.c", 2969); } else { if (limbCount != skelAnime->limbCount) { __assert("joint_buff_num == this->joint_num", "../z_skelanime.c", 2973); @@ -1377,8 +1384,8 @@ void SkelAnime_InitSV(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHe skelAnime->actorDrawTbl = ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->actorDrawTbl), "../z_skelanime.c", 3047); - skelAnime->transitionDrawTbl = - ZeldaArena_MallocDebug(skelAnime->limbCount * sizeof(*skelAnime->transitionDrawTbl), "../z_skelanime.c", 3048); + skelAnime->transitionDrawTbl = ZeldaArena_MallocDebug( + skelAnime->limbCount * sizeof(*skelAnime->transitionDrawTbl), "../z_skelanime.c", 3048); } else { if (limbCount != skelAnime->limbCount) { __assert("joint_buff_num == this->joint_num", "../z_skelanime.c", 3052); @@ -1446,8 +1453,8 @@ s32 func_800A4A20(SkelAnime* skelAnime) { func_800A49B0(skelAnime); skelAnime->transCurrentFrame = 0.0f; } - SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, - 1.0f - (skelAnime->transCurrentFrame / prevUnk28)); + SkelAnime_InterpolateVec3s(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, + skelAnime->transitionDrawTbl, 1.0f - (skelAnime->transCurrentFrame / prevUnk28)); return 0; } @@ -1478,8 +1485,8 @@ s32 func_800A4AD8(SkelAnime* skelAnime) { } else { phi_f2 = 0.0f; } - SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, - 1.0f - phi_f2); + SkelAnime_InterpolateVec3s(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, + skelAnime->transitionDrawTbl, 1.0f - phi_f2); return 0; } @@ -1502,7 +1509,8 @@ void func_800A4C58(SkelAnime* skelAnime) { t = 0; } SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, t, skelAnime->limbCount, sp38); - SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, sp38, temp_f2); + SkelAnime_InterpolateVec3s(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, sp38, + temp_f2); } if (skelAnime->transCurrentFrame != 0) { updateRate = R_UPDATE_RATE * ONE_THIRD; @@ -1511,8 +1519,8 @@ void func_800A4C58(SkelAnime* skelAnime) { skelAnime->transCurrentFrame = 0.0f; return; } - SkelAnime_InterpolateRotation(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, - skelAnime->transCurrentFrame); + SkelAnime_InterpolateVec3s(skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->actorDrawTbl, + skelAnime->transitionDrawTbl, skelAnime->transCurrentFrame); } } @@ -1532,9 +1540,11 @@ s32 func_800A4E38(SkelAnime* skelAnime) { f32 updateRate = R_UPDATE_RATE * ONE_THIRD; skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate; if (skelAnime->animCurrentFrame < skelAnime->initialFrame) { - skelAnime->animCurrentFrame = (skelAnime->animCurrentFrame - skelAnime->initialFrame) + skelAnime->animFrameCount; + skelAnime->animCurrentFrame = + (skelAnime->animCurrentFrame - skelAnime->initialFrame) + skelAnime->animFrameCount; } else if (skelAnime->animFrameCount <= skelAnime->animCurrentFrame) { - skelAnime->animCurrentFrame = (skelAnime->animCurrentFrame - skelAnime->animFrameCount) + skelAnime->initialFrame; + skelAnime->animCurrentFrame = + (skelAnime->animCurrentFrame - skelAnime->animFrameCount) + skelAnime->initialFrame; } func_800A4C58(skelAnime); @@ -1542,9 +1552,9 @@ s32 func_800A4E38(SkelAnime* skelAnime) { } s32 func_800A4EE0(SkelAnime* skelAnime) { - f32 temp_f14; + f32 updateRate; - temp_f14 = R_UPDATE_RATE * ONE_THIRD; + updateRate = R_UPDATE_RATE * ONE_THIRD; if (skelAnime->animCurrentFrame == skelAnime->animFrameCount) { SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, (s32)skelAnime->animCurrentFrame, skelAnime->limbCount, @@ -1552,7 +1562,7 @@ s32 func_800A4EE0(SkelAnime* skelAnime) { func_800A4C58(skelAnime); return 1; } - skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * temp_f14; + skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate; if (0.0f < ((skelAnime->animCurrentFrame - skelAnime->animFrameCount) * skelAnime->animPlaybackSpeed)) { skelAnime->animCurrentFrame = skelAnime->animFrameCount; } else { @@ -1634,7 +1644,8 @@ void SkelAnime_ChangeAnimationDefaultRepeat(SkelAnime* skelAnime, AnimationHeade SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, 0.0f); } -void SkelAnime_ChangeAnimationTransitionRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) { +void SkelAnime_ChangeAnimationTransitionRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg, + f32 transitionRate) { SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f, 0.0f, 0, transitionRate); } @@ -1649,7 +1660,6 @@ void SkelAnime_AnimationSetStop(SkelAnime* skelAnime) { func_800A49B0(skelAnime); } - void SkelAnime_AnimationReverse(SkelAnime* skelAnime) { f32 initialFrame = skelAnime->initialFrame; @@ -1678,7 +1688,7 @@ void func_800A5490(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src, u8* arg3) { /* * Moves `pos` backwards on the xz plane from `angle` -*/ + */ void func_800A54FC(SkelAnime* skelAnime, Vec3f* pos, s16 angle) { f32 x; f32 z; -- cgit v1.2.3 From 32bda67e0f8065f5d84effbfce84d6c188df50e4 Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Tue, 31 Mar 2020 20:53:53 -0500 Subject: Name a few unknown parameters --- src/code/z_skelanime.c | 48 +++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 21 deletions(-) (limited to 'src/code') diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index 954de5a41..b7f854aaf 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -1060,8 +1060,8 @@ void func_800A390C(GlobalContext* globalCtx, AnimationContext* animationCtx) { } void SkelAnime_InitLinkAnimetion(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg, - LinkAnimetionEntry* linkAnimetionEntrySeg, s32 flags, Vec3s* actorDrawTbl, Vec3s* arg6, - s32 limbBufCount) { + LinkAnimetionEntry* linkAnimetionEntrySeg, s32 flags, Vec3s* actorDrawTbl, + Vec3s* transitionDrawTbl, s32 limbBufCount) { char pad[8]; SkeletonHeader* skeletonHeader; size_t allocSize; @@ -1099,7 +1099,7 @@ void SkelAnime_InitLinkAnimetion(GlobalContext* globalCtx, SkelAnime* skelAnime, } skelAnime->actorDrawTbl = (Vec3s*)ALIGN16((u32)actorDrawTbl); - skelAnime->transitionDrawTbl = (Vec3s*)ALIGN16((u32)arg6); + skelAnime->transitionDrawTbl = (Vec3s*)ALIGN16((u32)transitionDrawTbl); } if ((skelAnime->actorDrawTbl == NULL) || (skelAnime->transitionDrawTbl == NULL)) { @@ -1191,7 +1191,7 @@ s32 func_800A3E0C(GlobalContext* globalCtx, SkelAnime* skelAnime) { return 0; } -void func_800A3EE8(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 transitionRate) { +void SkelAnime_SetTransition(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 transitionRate) { skelAnime->transCurrentFrame = 1.0f; skelAnime->transitionStep = 1.0f / transitionRate; } @@ -1276,37 +1276,43 @@ void func_800A42A0(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetion skelAnime->actorDrawTbl); } -void func_800A42E4(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 arg2) { +void func_800A42E4(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 frame) { SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, skelAnime->transitionDrawTbl, - arg2); + frame); } -void func_800A431C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 frame, - LinkAnimetionEntry* linkAnimetionEntrySeg2, f32 arg5, f32 arg6, Vec3s* arg7) { - Vec3s* alignedArg7; - SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, +void func_800A431C(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, + f32 transitionFrame, LinkAnimetionEntry* linkAnimetionEntrySeg2, f32 frame, f32 transitionRate, + Vec3s* actorDrawTbl) { + Vec3s* alignedActorDrawTbl; + SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)transitionFrame, skelAnime->limbCount, skelAnime->actorDrawTbl); - alignedArg7 = (Vec3s*)ALIGN16((u32)arg7); + alignedActorDrawTbl = (Vec3s*)ALIGN16((u32)actorDrawTbl); - SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg2, (s32)arg5, skelAnime->limbCount, alignedArg7); - SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, alignedArg7, arg6); + SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg2, (s32)frame, skelAnime->limbCount, + alignedActorDrawTbl); + SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->actorDrawTbl, alignedActorDrawTbl, + transitionRate); } -void func_800A43B8(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, f32 frame, - LinkAnimetionEntry* linkAnimetionEntrySeg2, f32 arg5, f32 arg6, Vec3s* arg7) { - Vec3s* alignedArg7; +void func_800A43B8(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, + f32 transitionFrame, LinkAnimetionEntry* linkAnimetionEntrySeg2, f32 frame, f32 transitionRate, + Vec3s* actorDrawTbl) { + Vec3s* alignedActorDrawTbl; - SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)frame, skelAnime->limbCount, + SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg, (s32)transitionFrame, skelAnime->limbCount, skelAnime->transitionDrawTbl); - alignedArg7 = (Vec3s*)ALIGN16((u32)arg7); + alignedActorDrawTbl = (Vec3s*)ALIGN16((u32)actorDrawTbl); - SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg2, (s32)arg5, skelAnime->limbCount, alignedArg7); - SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->transitionDrawTbl, alignedArg7, arg6); + SkelAnime_LoadLinkAnimetion(globalCtx, linkAnimetionEntrySeg2, (s32)frame, skelAnime->limbCount, + alignedActorDrawTbl); + SkelAnime_LoadAnimationType2(globalCtx, skelAnime->limbCount, skelAnime->transitionDrawTbl, alignedActorDrawTbl, + transitionRate); } -void func_800A4454(SkelAnime* skelAnime) { +void SkelAnime_SetModeStop(SkelAnime* skelAnime) { skelAnime->mode = 2; func_800A3B8C(skelAnime); } -- cgit v1.2.3 From 3ab1af0c24f7bc10fff86f03cafa2637cdd79f79 Mon Sep 17 00:00:00 2001 From: KrimtonZ Date: Thu, 2 Apr 2020 12:44:19 -0500 Subject: pr updates --- src/code/z_actor.c | 4 +- src/code/z_skelanime.c | 113 ++++++++++++++++++++++++------------------------- 2 files changed, 57 insertions(+), 60 deletions(-) (limited to 'src/code') diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 2cf5eb0de..2781bb5ae 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -3955,8 +3955,8 @@ void func_80034EC0(SkelAnime* skelAnime, struct_80034EC0_Entry* arg1, s32 arg2) frameCount = SkelAnime_GetFrameCount(arg1->animation); } - SkelAnime_ChangeAnimation(skelAnime, arg1->animation, arg1->playbackSpeed, arg1->unk_08, frameCount, arg1->unk_10, - arg1->transitionRate); + SkelAnime_ChangeAnim(skelAnime, arg1->animation, arg1->playbackSpeed, arg1->unk_08, frameCount, arg1->unk_10, + arg1->transitionRate); } void func_80034F54(GlobalContext* globalCtx, s16* arg1, s16* arg2, s32 arg3) { diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index b7f854aaf..05f23531c 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -2,7 +2,6 @@ #include #include -#define ONE_THIRD (1.0f / 3.0f) s32 func_800A3D70(GlobalContext*, SkelAnime*); s32 func_800A3E0C(GlobalContext*, SkelAnime*); s32 func_800A4D9C(SkelAnime* skelAnime); @@ -1109,7 +1108,7 @@ void SkelAnime_InitLinkAnimetion(GlobalContext* globalCtx, SkelAnime* skelAnime, osSyncPrintf(VT_RST); } - SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, 0.0f, 0, 0.0f); + SkelAnime_ChangeLinkAnim(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, 0.0f, 0, 0.0f); } void func_800A3B8C(SkelAnime* skelAnime) { @@ -1196,9 +1195,8 @@ void SkelAnime_SetTransition(GlobalContext* globalCtx, SkelAnime* skelAnime, f32 skelAnime->transitionStep = 1.0f / transitionRate; } -void SkelAnime_LinkChangeAnimation(GlobalContext* globalCtx, SkelAnime* skelAnime, - LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed, f32 frame, - f32 frameCount, u8 animationMode, f32 transitionRate) { +void SkelAnime_ChangeLinkAnim(GlobalContext* globalCtx, SkelAnime* skelAnime, LinkAnimetionEntry* linkAnimetionEntrySeg, + f32 playbackSpeed, f32 frame, f32 frameCount, u8 animationMode, f32 transitionRate) { skelAnime->mode = animationMode; if ((transitionRate != 0.0f) && @@ -1230,28 +1228,28 @@ void SkelAnime_LinkChangeAnimation(GlobalContext* globalCtx, SkelAnime* skelAnim skelAnime->animPlaybackSpeed = playbackSpeed; } -void SkelAnime_LinkChangeAnimationDefaultStop(GlobalContext* globalCtx, SkelAnime* skelAnime, - LinkAnimetionEntry* linkAnimetionEntrySeg) { - SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, - SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f); +void SkelAnime_ChangeLinkAnimDefaultStop(GlobalContext* globalCtx, SkelAnime* skelAnime, + LinkAnimetionEntry* linkAnimetionEntrySeg) { + SkelAnime_ChangeLinkAnim(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, + SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f); } -void SkelAnime_LinkChangeAnimationPlaybackStop(GlobalContext* globalCtx, SkelAnime* skelAnime, - LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed) { - SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f, - SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f); +void SkelAnime_ChangeLinkAnimPlaybackStop(GlobalContext* globalCtx, SkelAnime* skelAnime, + LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed) { + SkelAnime_ChangeLinkAnim(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f, + SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 2, 0.0f); } -void SkelAnime_LinkChangeAnimationDefaultRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, - LinkAnimetionEntry* linkAnimetionEntrySeg) { - SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, - SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f); +void SkelAnime_ChangeLinkAnimDefaultRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, + LinkAnimetionEntry* linkAnimetionEntrySeg) { + SkelAnime_ChangeLinkAnim(globalCtx, skelAnime, linkAnimetionEntrySeg, 1.0f, 0.0f, + SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f); } -void SkelAnime_LinkChangeAnimationPlaybackRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, - LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed) { - SkelAnime_LinkChangeAnimation(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f, - SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f); +void SkelAnime_ChangeLinkAnimPlaybackRepeat(GlobalContext* globalCtx, SkelAnime* skelAnime, + LinkAnimetionEntry* linkAnimetionEntrySeg, f32 playbackSpeed) { + SkelAnime_ChangeLinkAnim(globalCtx, skelAnime, linkAnimetionEntrySeg, playbackSpeed, 0.0f, + SkelAnime_GetFrameCount(&linkAnimetionEntrySeg->genericHeader), 0, 0.0f); } void func_800A41FC(GlobalContext* globalCtx, SkelAnime* skelAnime) { @@ -1373,7 +1371,7 @@ void SkelAnime_Init(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHead } if (animationSeg != NULL) { - SkelAnime_ChangeAnimationDefaultRepeat(skelAnime, animationSeg); + SkelAnime_ChangeAnimDefaultRepeat(skelAnime, animationSeg); } } @@ -1407,7 +1405,7 @@ void SkelAnime_InitSV(GlobalContext* globalCtx, SkelAnime* skelAnime, SkeletonHe } if (animationSeg != NULL) { - SkelAnime_ChangeAnimationDefaultRepeat(skelAnime, animationSeg); + SkelAnime_ChangeAnimDefaultRepeat(skelAnime, animationSeg); } } @@ -1430,7 +1428,7 @@ void SkelAnime_InitSkin(GlobalContext* globalCtx, SkelAnime* skelAnime, Skeleton } if (animationSeg != NULL) { - SkelAnime_ChangeAnimationDefaultRepeat(skelAnime, animationSeg); + SkelAnime_ChangeAnimDefaultRepeat(skelAnime, animationSeg); } } @@ -1453,7 +1451,7 @@ s32 func_800A4A20(SkelAnime* skelAnime) { f32 updateRate; prevUnk28 = skelAnime->transCurrentFrame; - updateRate = R_UPDATE_RATE * ONE_THIRD; + updateRate = R_UPDATE_RATE * (1.0f / 3.0f); skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; if (skelAnime->transCurrentFrame <= 0.0f) { func_800A49B0(skelAnime); @@ -1472,7 +1470,7 @@ s32 func_800A4AD8(SkelAnime* skelAnime) { f32 updateRate; temp_a2 = (s16)(skelAnime->transCurrentFrame * 16384.0f); - updateRate = R_UPDATE_RATE * ONE_THIRD; + updateRate = R_UPDATE_RATE * (1.0f / 3.0f); skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; if (skelAnime->transCurrentFrame <= 0.0f) { func_800A49B0(skelAnime); @@ -1519,7 +1517,7 @@ void func_800A4C58(SkelAnime* skelAnime) { temp_f2); } if (skelAnime->transCurrentFrame != 0) { - updateRate = R_UPDATE_RATE * ONE_THIRD; + updateRate = R_UPDATE_RATE * (1.0f / 3.0f); skelAnime->transCurrentFrame -= skelAnime->transitionStep * updateRate; if (skelAnime->transCurrentFrame <= 0.0f) { skelAnime->transCurrentFrame = 0.0f; @@ -1531,7 +1529,7 @@ void func_800A4C58(SkelAnime* skelAnime) { } s32 func_800A4D9C(SkelAnime* skelAnime) { - f32 updateRate = R_UPDATE_RATE * ONE_THIRD; + f32 updateRate = R_UPDATE_RATE * (1.0f / 3.0f); skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate; if (skelAnime->animCurrentFrame < 0.0f) { skelAnime->animCurrentFrame += skelAnime->totalFrames; @@ -1543,7 +1541,7 @@ s32 func_800A4D9C(SkelAnime* skelAnime) { } s32 func_800A4E38(SkelAnime* skelAnime) { - f32 updateRate = R_UPDATE_RATE * ONE_THIRD; + f32 updateRate = R_UPDATE_RATE * (1.0f / 3.0f); skelAnime->animCurrentFrame += skelAnime->animPlaybackSpeed * updateRate; if (skelAnime->animCurrentFrame < skelAnime->initialFrame) { skelAnime->animCurrentFrame = @@ -1560,7 +1558,7 @@ s32 func_800A4E38(SkelAnime* skelAnime) { s32 func_800A4EE0(SkelAnime* skelAnime) { f32 updateRate; - updateRate = R_UPDATE_RATE * ONE_THIRD; + updateRate = R_UPDATE_RATE * (1.0f / 3.0f); if (skelAnime->animCurrentFrame == skelAnime->animFrameCount) { SkelAnime_AnimateFrame(skelAnime->animCurrentSeg, (s32)skelAnime->animCurrentFrame, skelAnime->limbCount, @@ -1584,8 +1582,8 @@ s32 func_800A4EE0(SkelAnime* skelAnime) { return 0; } -void SkelAnime_ChangeAnimationImpl(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed, f32 frame, - f32 frameCount, u8 animationType, f32 transitionRate, s8 unk2) { +void SkelAnime_ChangeAnimImpl(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed, f32 frame, + f32 frameCount, u8 animationType, f32 transitionRate, s8 unk2) { skelAnime->mode = animationType; if ((transitionRate != 0.0f) && ((animationSeg != skelAnime->animCurrentSeg) || (frame != skelAnime->animCurrentFrame))) { @@ -1625,48 +1623,47 @@ void SkelAnime_ChangeAnimationImpl(SkelAnime* skelAnime, AnimationHeader* animat skelAnime->animPlaybackSpeed = playbackSpeed; } -void SkelAnime_ChangeAnimation(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed, f32 frame, - f32 frameCount, u8 mode, f32 transitionRate) { - SkelAnime_ChangeAnimationImpl(skelAnime, animationSeg, playbackSpeed, frame, frameCount, mode, transitionRate, 0); +void SkelAnime_ChangeAnim(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed, f32 frame, + f32 frameCount, u8 mode, f32 transitionRate) { + SkelAnime_ChangeAnimImpl(skelAnime, animationSeg, playbackSpeed, frame, frameCount, mode, transitionRate, 0); } -void SkelAnime_ChangeAnimationDefaultStop(SkelAnime* skelAnime, AnimationHeader* animationSeg) { - SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f, - SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, 0.0f); +void SkelAnime_ChangeAnimDefaultStop(SkelAnime* skelAnime, AnimationHeader* animationSeg) { + SkelAnime_ChangeAnim(skelAnime, animationSeg, 1.0f, 0.0f, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, + 0.0f); } -void SkelAnime_ChangeAnimationTransitionStop(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) { - SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0, SkelAnime_GetFrameCount(&animationSeg->genericHeader), - 2, transitionRate); +void SkelAnime_ChangeAnimTransitionStop(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) { + SkelAnime_ChangeAnim(skelAnime, animationSeg, 1.0f, 0, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, + transitionRate); } -void SkelAnime_ChangeAnimationPlaybackStop(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) { - SkelAnime_ChangeAnimation(skelAnime, animationSeg, playbackSpeed, 0.0f, - SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, 0.0f); +void SkelAnime_ChangeAnimPlaybackStop(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) { + SkelAnime_ChangeAnim(skelAnime, animationSeg, playbackSpeed, 0.0f, + SkelAnime_GetFrameCount(&animationSeg->genericHeader), 2, 0.0f); } -void SkelAnime_ChangeAnimationDefaultRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg) { - SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f, - SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, 0.0f); +void SkelAnime_ChangeAnimDefaultRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg) { + SkelAnime_ChangeAnim(skelAnime, animationSeg, 1.0f, 0.0f, SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, + 0.0f); } -void SkelAnime_ChangeAnimationTransitionRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg, - f32 transitionRate) { - SkelAnime_ChangeAnimation(skelAnime, animationSeg, 1.0f, 0.0f, 0.0f, 0, transitionRate); +void SkelAnime_ChangeAnimTransitionRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 transitionRate) { + SkelAnime_ChangeAnim(skelAnime, animationSeg, 1.0f, 0.0f, 0.0f, 0, transitionRate); } -void SkelAnime_ChangeAnimationPlaybackRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) { - SkelAnime_ChangeAnimation(skelAnime, animationSeg, playbackSpeed, 0.0f, - SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, 0.0f); +void SkelAnime_ChangeAnimPlaybackRepeat(SkelAnime* skelAnime, AnimationHeader* animationSeg, f32 playbackSpeed) { + SkelAnime_ChangeAnim(skelAnime, animationSeg, playbackSpeed, 0.0f, + SkelAnime_GetFrameCount(&animationSeg->genericHeader), 0, 0.0f); } -void SkelAnime_AnimationSetStop(SkelAnime* skelAnime) { +void SkelAnime_AnimSetStop(SkelAnime* skelAnime) { skelAnime->mode = 2; skelAnime->animFrameCount = skelAnime->totalFrames; func_800A49B0(skelAnime); } -void SkelAnime_AnimationReverse(SkelAnime* skelAnime) { +void SkelAnime_AnimReverse(SkelAnime* skelAnime) { f32 initialFrame = skelAnime->initialFrame; skelAnime->initialFrame = skelAnime->animFrameCount; @@ -1726,8 +1723,8 @@ void func_800A54FC(SkelAnime* skelAnime, Vec3f* pos, s16 angle) { skelAnime->actorDrawTbl->x = skelAnime->unk_3E.x; skelAnime->prevFramePos.z = skelAnime->actorDrawTbl->z; skelAnime->actorDrawTbl->z = skelAnime->unk_3E.z; - if (skelAnime->flags & ANIME_FLAG_UPDATEXZ) { - if (skelAnime->flags & ANIME_FLAG_UPDATEY) { + if (skelAnime->flags & ANIM_FLAG_UPDATEXZ) { + if (skelAnime->flags & ANIM_FLAG_UPDATEY) { pos->y = 0.0f; } else { pos->y = skelAnime->actorDrawTbl->y - skelAnime->prevFramePos.y; @@ -1738,7 +1735,7 @@ void func_800A54FC(SkelAnime* skelAnime, Vec3f* pos, s16 angle) { pos->y = 0.0f; skelAnime->prevFramePos.y = skelAnime->actorDrawTbl->y; } - skelAnime->flags &= ~ANIME_FLAG_UPDATEY; + skelAnime->flags &= ~ANIM_FLAG_UPDATEY; } s32 func_800A56C8(SkelAnime* skelAnime, f32 arg1) { -- cgit v1.2.3