summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorpetrie911 <69443847+petrie911@users.noreply.github.com>2021-02-12 13:41:34 -0600
committerGitHub <noreply@github.com>2021-02-12 20:41:34 +0100
commit5f552a369c87ed909057a771a562de772856da43 (patch)
treef2d47cadbb53e500f16799743073e869065fa0b1 /src/code
parenta30b5bbb268aa6ee2f84a192d9ae492201258b23 (diff)
z_skin OK and z_skin_awb decomped (one barely nonmatching) (#632)
* skin_awb some functions done * more matches * stuff * matching skins * closer? * less skin * skin * format * one thing * merge actor Co-authored-by: gns <adamkiddle23@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
Diffstat (limited to 'src/code')
-rw-r--r--src/code/z_skin.c98
-rw-r--r--src/code/z_skin_awb.c188
2 files changed, 234 insertions, 52 deletions
diff --git a/src/code/z_skin.c b/src/code/z_skin.c
index 456fb4c78..fdb1169da 100644
--- a/src/code/z_skin.c
+++ b/src/code/z_skin.c
@@ -36,56 +36,64 @@ void func_800A57C0(MtxF* mtx, Struct_800A57C0* arg1, Struct_800A598C* arg2, Vtx*
}
}
-#ifdef NON_MATCHING
-// Regalloc, Stack
void func_800A598C(GraphicsContext* gfxCtx, PSkinAwb* skin, s32 limbIndex, s32 arg3) {
- SkinLimb** limbs;
+ s32 temp_1;
+ SkinLimb** skeleton;
SkinLimb* limb;
Struct_800A5E28* data;
Struct_800A598C* phi_s6;
- s32 temp_a0_2;
SkinAvb* avb;
- Struct_800A598C* new_var;
+ s32 temp_a0_2;
+ f32 temp_f20;
Struct_800A57C0* temp_v0;
Struct_800A598C_2* temp_s3;
Vtx* spEC;
+ Struct_800A598C* temp_2;
Vec3f spDC;
Vec3f spD0;
+ Struct_800A598C_2* phi_s0;
OPEN_DISPS(gfxCtx, "../z_skin.c", 254);
- limbs = (SkinLimb**)SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
- limb = (SkinLimb*)SEGMENTED_TO_VIRTUAL(limbs[limbIndex]);
- data = (Struct_800A5E28*)SEGMENTED_TO_VIRTUAL(limb->segment);
- phi_s6 = &((Struct_800A598C*)SEGMENTED_TO_VIRTUAL(data->unk_4))[0];
+ skeleton = (SkinLimb**)SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
+ data = SEGMENTED_TO_VIRTUAL(((SkinLimb*)SEGMENTED_TO_VIRTUAL(skeleton[limbIndex]))->segment);
+ temp_2 = (Struct_800A598C*)SEGMENTED_TO_VIRTUAL(data->unk_4);
+
avb = &skin->avbTbl[limbIndex];
+
spEC = avb->buf[avb->unk_0];
- new_var = &phi_s6[data->unk_2];
- while (phi_s6 < new_var) {
+ temp_1 = data->unk_2;
+
+ for (phi_s6 = temp_2; phi_s6 < temp_2 + temp_1; phi_s6++) {
temp_a0_2 = phi_s6->unk_2;
temp_v0 = (Struct_800A57C0*)SEGMENTED_TO_VIRTUAL(phi_s6->unk_8);
temp_s3 = (Struct_800A598C_2*)SEGMENTED_TO_VIRTUAL(phi_s6->unk_C);
+
if (temp_a0_2 == 1) {
Vec3f spAC;
+
spAC.x = temp_s3[0].x;
spAC.y = temp_s3[0].y;
spAC.z = temp_s3[0].z;
SkinMatrix_Vec3fMtxFMultXYZ(&D_801600C0[temp_s3[0].unk_0], &spAC, &spDC);
} else if (arg3 == 1) {
- Struct_800A598C_2* temp_s0 = &temp_s3[phi_s6->unk_4];
Vec3f spA0;
- spA0.x = temp_s0->x;
- spA0.y = temp_s0->y;
- spA0.z = temp_s0->z;
- SkinMatrix_Vec3fMtxFMultXYZ(&D_801600C0[temp_s0->unk_0], &spA0, &spDC);
+
+ phi_s0 = &temp_s3[phi_s6->unk_4];
+
+ spA0.x = phi_s0->x;
+ spA0.y = phi_s0->y;
+ spA0.z = phi_s0->z;
+ SkinMatrix_Vec3fMtxFMultXYZ(&D_801600C0[phi_s0->unk_0], &spA0, &spDC);
} else {
- Struct_800A598C_2* phi_s0 = &temp_s3[0];
- f32 phi_f26 = 0.0f;
- f32 phi_f24 = 0.0f;
- f32 phi_f22 = 0.0f;
- while (phi_s0 < &temp_s3[temp_a0_2]) {
- Vec3f sp88;
- f32 temp_f20 = phi_s0->unk_8 * 0.01f;
+ Vec3f phi_f20;
+ Vec3f sp88;
+
+ phi_f20.x = phi_f20.y = phi_f20.z = 0.0f;
+
+ for (phi_s0 = &temp_s3[0]; phi_s0 < &temp_s3[temp_a0_2]; phi_s0++) {
+ temp_f20 = phi_s0->unk_8 * 0.01f;
+
sp88.x = phi_s0->x;
sp88.y = phi_s0->y;
sp88.z = phi_s0->z;
@@ -93,38 +101,30 @@ void func_800A598C(GraphicsContext* gfxCtx, PSkinAwb* skin, s32 limbIndex, s32 a
spD0.x *= temp_f20;
spD0.y *= temp_f20;
spD0.z *= temp_f20;
- phi_f26 += spD0.x;
- phi_f24 += spD0.y;
- phi_f22 += spD0.z;
- phi_s0++;
+ phi_f20.x += spD0.x;
+ phi_f20.y += spD0.y;
+ phi_f20.z += spD0.z;
}
- spDC.x = phi_f26;
- spDC.y = phi_f24;
- spDC.z = phi_f22;
+ spDC.x = phi_f20.x;
+ spDC.y = phi_f20.y;
+ spDC.z = phi_f20.z;
}
func_800A57C0(&D_801600C0[temp_s3[phi_s6->unk_4].unk_0], temp_v0, phi_s6, spEC, &spDC);
- phi_s6++;
}
gSPSegment(POLY_OPA_DISP++, 0x08, avb->buf[avb->unk_0]);
- if (avb->unk_0 == 0) {
- avb->unk_0 = 1;
- } else {
- avb->unk_0 = 0;
- }
+
+ avb->unk_0 = (avb->unk_0 == 0) ? 1 : 0;
CLOSE_DISPS(gfxCtx, "../z_skin.c", 344);
}
-#else
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skin/func_800A598C.s")
-#endif
void func_800A5E28(GraphicsContext* gfxCtx, PSkinAwb* skin, s32 limbIndex, s32 arg3, s32 arg4) {
- SkinLimb** limbs;
+ SkinLimb** skeleton;
Struct_800A5E28* temp_t9;
OPEN_DISPS(gfxCtx, "../z_skin.c", 364);
- limbs = (SkinLimb**)SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
- temp_t9 = (Struct_800A5E28*)SEGMENTED_TO_VIRTUAL(((SkinLimb*)SEGMENTED_TO_VIRTUAL(limbs[limbIndex]))->segment);
+ skeleton = SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
+ temp_t9 = SEGMENTED_TO_VIRTUAL(((SkinLimb*)SEGMENTED_TO_VIRTUAL(skeleton[limbIndex]))->segment);
if (!(arg4 & 1)) {
func_800A598C(gfxCtx, skin, limbIndex, arg3);
}
@@ -134,13 +134,13 @@ void func_800A5E28(GraphicsContext* gfxCtx, PSkinAwb* skin, s32 limbIndex, s32 a
void func_800A5F60(GraphicsContext* gfxCtx, PSkinAwb* skin, s32 limbIndex, Gfx* arg3, s32 arg4) {
Gfx* gfx = arg3;
- SkinLimb** limbs;
+ SkinLimb** skeleton;
s32 pad;
OPEN_DISPS(gfxCtx, "../z_skin.c", 395);
- limbs = SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
+ skeleton = SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
if (arg3 == NULL) {
- gfx = (Gfx*)((SkinLimb*)SEGMENTED_TO_VIRTUAL(limbs[limbIndex]))->segment;
+ gfx = ((SkinLimb*)SEGMENTED_TO_VIRTUAL(skeleton[limbIndex]))->segment;
}
if (gfx != NULL) {
Mtx* mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &D_801600C0[limbIndex]);
@@ -158,7 +158,7 @@ void func_800A60D8(Actor* actor, GlobalContext* globalCtx, PSkinAwb* skin, SkinC
s32 arg5, s32 arg6, s32 arg7) {
s32 i;
s32 dataType;
- SkinLimb** limbs;
+ SkinLimb** skeleton;
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
s32 pad;
@@ -166,9 +166,10 @@ void func_800A60D8(Actor* actor, GlobalContext* globalCtx, PSkinAwb* skin, SkinC
if ((arg7 & 1) == 0) {
func_800A6AC4(skin, &D_801600C0[0], actor, arg5);
}
- limbs = SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
+ skeleton = SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
if ((arg7 & 2) == 0) {
Mtx* mtx;
+
gSPMatrix(POLY_OPA_DISP++, &gMtxClear, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &skin->mtx);
if (mtx == NULL) {
@@ -178,10 +179,11 @@ void func_800A60D8(Actor* actor, GlobalContext* globalCtx, PSkinAwb* skin, SkinC
}
for (i = 0; i < skin->skeletonHeader->limbCount; i++) {
s32 phi_a0 = 1;
+
if (arg4 != NULL) {
phi_a0 = arg4(actor, globalCtx, i, skin);
}
- dataType = ((SkinLimb*)SEGMENTED_TO_VIRTUAL(limbs[i]))->unk_8;
+ dataType = ((SkinLimb*)SEGMENTED_TO_VIRTUAL(skeleton[i]))->unk_8;
if (dataType == 4 && phi_a0 == 1) {
func_800A5E28(gfxCtx, skin, i, arg6, arg7);
} else if (dataType == 0xB && phi_a0 == 1) {
diff --git a/src/code/z_skin_awb.c b/src/code/z_skin_awb.c
index b506d002f..e9bab3fd6 100644
--- a/src/code/z_skin_awb.c
+++ b/src/code/z_skin_awb.c
@@ -1,11 +1,191 @@
#include "global.h"
+#include "overlays/actors/ovl_En_fHG/z_en_fhg.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skin_awb/func_800A6460.s")
+void func_800A6460(GlobalContext* globalCtx, PSkinAwb* skin, s32 limbIndex) {
+ s32 i;
+ SkinLimb** skeleton = SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
+ Struct_800A5E28* temp_v1 = SEGMENTED_TO_VIRTUAL(((SkinLimb*)SEGMENTED_TO_VIRTUAL(skeleton[limbIndex]))->segment);
+ Struct_800A598C* temp_v0 = SEGMENTED_TO_VIRTUAL(temp_v1->unk_4);
+ Struct_800A598C* phi_s0;
+ Struct_800A57C0* temp_s1;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skin_awb/func_800A663C.s")
+ for (i = 0; i < 2; i++) {
+ Vtx* temp2 = skin->avbTbl[limbIndex].buf[i];
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skin_awb/func_800A6888.s")
+ for (phi_s0 = temp_v0; phi_s0 < temp_v0 + temp_v1->unk_2; phi_s0++) {
+ Struct_800A57C0* phi_s1 = SEGMENTED_TO_VIRTUAL(phi_s0->unk_8);
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_skin_awb/func_800A698C.s")
+ for (temp_s1 = phi_s1; temp_s1 < phi_s1 + phi_s0->unk_0; temp_s1++) {
+ Vtx* temp_t5_3 = &temp2[temp_s1->unk_0];
+ temp_t5_3->v.flag = 0;
+ temp_t5_3->v.tc[0] = temp_s1->unk_2;
+ temp_t5_3->v.tc[1] = temp_s1->unk_4;
+ temp_t5_3->v.cn[3] = temp_s1->unk_9;
+ }
+ }
+ }
+}
+
+void func_800A663C(GlobalContext* globalCtx, PSkinAwb* skin, SkeletonHeader* skeletonHeader,
+ AnimationHeader* animationHeader) {
+ s32 limbCount;
+ s32 i;
+ SkinLimb** skeleton;
+ SkeletonHeader* virtSkelHeader = SEGMENTED_TO_VIRTUAL(skeletonHeader);
+
+ skin->avbCount = virtSkelHeader->limbCount;
+ skin->skeletonHeader = virtSkelHeader;
+
+ skeleton = SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
+ limbCount = skin->skeletonHeader->limbCount;
+ skin->avbTbl = ZeldaArena_MallocDebug(limbCount * sizeof(SkinAvb), "../z_skin_awb.c", 212);
+ if (skin->avbTbl == NULL) {
+ __assert("pskin_awb->avb_tbl != NULL", "../z_skin_awb.c", 214);
+ }
+ for (i = 0; i < limbCount; i++) {
+ SkinAvb* avbEntry = &skin->avbTbl[i];
+ SkinLimb* limb = SEGMENTED_TO_VIRTUAL(skeleton[i]);
+
+ if ((limb->unk_8 != 4) || (limb->segment == NULL)) {
+ avbEntry->unk_0 = 0;
+
+ avbEntry->buf[0] = NULL;
+ avbEntry->buf[1] = NULL;
+ } else {
+ Struct_800A5E28* temp_s1 = SEGMENTED_TO_VIRTUAL(((void)0, limb->segment));
+
+ avbEntry->unk_0 = 0;
+ avbEntry->buf[0] = ZeldaArena_MallocDebug(temp_s1->unk_0 * sizeof(Vtx), "../z_skin_awb.c", 235);
+ if (avbEntry->buf[0] == 0) {
+ __assert("psavb->buf[0] != NULL", "../z_skin_awb.c", 237);
+ }
+ avbEntry->buf[1] = ZeldaArena_MallocDebug(temp_s1->unk_0 * sizeof(Vtx), "../z_skin_awb.c", 240);
+ if (avbEntry->buf[1] == 0) {
+ __assert("psavb->buf[1] != NULL", "../z_skin_awb.c", 242);
+ }
+ func_800A6460(globalCtx, skin, i);
+ }
+ if (1) {}
+ }
+ SkelAnime_InitSkin(globalCtx, &skin->skelAnime, skeletonHeader, animationHeader);
+}
+
+void func_800A6888(GlobalContext* globalCtx, PSkinAwb* arg1) {
+ s32 i;
+ if (arg1->avbTbl != NULL) {
+ for (i = 0; i < arg1->avbCount; i++) {
+ if (arg1->avbTbl[i].buf[0] != 0) {
+ ZeldaArena_FreeDebug(arg1->avbTbl[i].buf[0], "../z_skin_awb.c", 276);
+ arg1->avbTbl[i].buf[0] = 0;
+ }
+ if (arg1->avbTbl[i].buf[1] != 0) {
+ ZeldaArena_FreeDebug(arg1->avbTbl[i].buf[1], "../z_skin_awb.c", 280);
+ arg1->avbTbl[i].buf[1] = 0;
+ }
+ }
+ if (arg1->avbTbl != NULL) {
+ ZeldaArena_FreeDebug(arg1->avbTbl, "../z_skin_awb.c", 286);
+ }
+ SkelAnime_Free(&arg1->skelAnime, globalCtx);
+ }
+}
+
+s32 func_800A698C(PSkinAwb* skin, SkinLimb** skeleton, MtxF* mf, u8 parentIndex, u8 limbIndex) {
+ s32 pad;
+ SkinLimb* limb = SEGMENTED_TO_VIRTUAL(skeleton[limbIndex]);
+ MtxF* mtx;
+ s32 temp_ret;
+ MtxF sp28;
+
+ if (parentIndex == 0xFF) {
+ SkinMatrix_GetClear(&mtx);
+ } else {
+ mtx = &mf[(s32)parentIndex];
+ }
+
+ SkinMatrix_MtxFMtxFMult(mtx, &mf[limbIndex], &sp28);
+ SkinMatrix_MtxFCopy(&sp28, &mf[limbIndex]);
+
+ if (limb->child != 0xFF) {
+ temp_ret = func_800A698C(skin, skeleton, mf, limbIndex, limb->child);
+ if (temp_ret) { // func_800A698C only returns false
+ return temp_ret;
+ }
+ }
+
+ if (limb->sibling != 0xFF) {
+ temp_ret = func_800A698C(skin, skeleton, mf, parentIndex, limb->sibling);
+ if (temp_ret) { // func_800A698C only returns false
+ return temp_ret;
+ }
+ }
+ return false;
+}
+
+#ifdef NON_MATCHING
+// Matches except for an `addiu s0, s0, 0`, which obviously does nothing.
+// Likely some indexing optimization I can't figure out.
+s32 func_800A6AC4(PSkinAwb* skin, MtxF* arg1, Actor* actor, s32 arg3) {
+ s32 i;
+ u32 zero = 0;
+ f32 yRot;
+ f32 xRot;
+ f32 zRot;
+ s32 temp_ret;
+ f32 yTransl;
+ f32 xTransl;
+ f32 zTransl;
+ SkinLimb** skeleton = SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment);
+ Vec3s* jointRot = &skin->skelAnime.jointTable[0];
+
+ jointRot++;
+ xRot = jointRot[0].x;
+ yRot = jointRot[0].y;
+ zRot = jointRot[0].z;
+
+ if (arg3 != 0) {
+
+ xTransl = jointRot[-1].x;
+ yTransl = jointRot[-1].y;
+ zTransl = jointRot[-1].z;
+
+ jointRot += zero;
+
+ if (arg3 == 0x23) {
+ EnfHG* horse = (EnfHG*)actor;
+
+ yRot += horse->turnRot;
+ }
+ SkinMatrix_SetRotateRPYTranslate(arg1, xRot, yRot, zRot, xTransl, yTransl, zTransl);
+ } else {
+ SkinMatrix_SetRotateRPYTranslate(arg1, xRot, yRot, zRot, 0.0f, 0.0f, 0.0f);
+ }
+ jointRot++;
+ for (i = 1; i < skin->skeletonHeader->limbCount; i++) {
+ SkinLimb* limb = SEGMENTED_TO_VIRTUAL(skeleton[i]);
+
+ xTransl = limb->jointPos.x;
+ yTransl = limb->jointPos.y;
+ zTransl = limb->jointPos.z;
+ xRot = jointRot->x;
+ yRot = jointRot->y;
+ zRot = jointRot->z;
+ jointRot++;
+ SkinMatrix_SetRotateRPYTranslate(&arg1[i], xRot, yRot, zRot, xTransl, yTransl, zTransl);
+ }
+
+ SkinMatrix_SetScaleRotateYRPTranslate(
+ &skin->mtx, actor->scale.x, actor->scale.y, actor->scale.z, actor->shape.rot.x, actor->shape.rot.y,
+ actor->shape.rot.z, actor->world.pos.x, actor->world.pos.y + (actor->shape.yOffset * actor->scale.y),
+ actor->world.pos.z);
+
+ temp_ret = func_800A698C(skin, SEGMENTED_TO_VIRTUAL(skin->skeletonHeader->segment), arg1, 0xFF, 0);
+ if (!temp_ret) { // func_800A698C only returns false
+ return temp_ret;
+ }
+ return 0;
+}
+#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skin_awb/func_800A6AC4.s")
+#endif