mirror of
https://github.com/zeldaret/oot.git
synced 2025-01-26 02:27:02 +00:00
skelanime, wip
This commit is contained in:
parent
db5f70ad1c
commit
96ba073f19
2 changed files with 204 additions and 16 deletions
|
@ -1031,7 +1031,7 @@ typedef struct
|
||||||
Vec3s pos;
|
Vec3s pos;
|
||||||
u8 firstChildIndex;
|
u8 firstChildIndex;
|
||||||
u8 nextLimbIndex;
|
u8 nextLimbIndex;
|
||||||
Gfx* dList;
|
Gfx* displayLists[1]; // maybe?
|
||||||
} SkelLimbEntry;
|
} SkelLimbEntry;
|
||||||
|
|
||||||
typedef struct SkelAnime
|
typedef struct SkelAnime
|
||||||
|
|
|
@ -39,15 +39,15 @@ static testfunc D_8012A484[] =
|
||||||
//.bss
|
//.bss
|
||||||
u32 D_801600B0;
|
u32 D_801600B0;
|
||||||
|
|
||||||
#ifdef NON_MATCHING
|
// SkelAnime_LodDrawLimb
|
||||||
void func_800A08A0(GlobalContext* globalCtx, s32 limbIndex, u32* limbTable , Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 arg7)
|
void func_800A08A0(GlobalContext* globalCtx, s32 limbIndex, u32* limbTable , Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex)
|
||||||
{
|
{
|
||||||
GraphicsContext* gfxCtx;
|
|
||||||
Gfx* gfx[3];
|
|
||||||
SkelLimbEntry* limbEntry;
|
SkelLimbEntry* limbEntry;
|
||||||
Vec3s rot;
|
|
||||||
Vec3f pos;
|
|
||||||
Gfx* dList;
|
Gfx* dList;
|
||||||
|
Vec3f pos;
|
||||||
|
Vec3s rot;
|
||||||
|
GraphicsContext* gfxCtx;
|
||||||
|
Gfx* gfx[4];
|
||||||
|
|
||||||
gfxCtx = globalCtx->state.gfxCtx;
|
gfxCtx = globalCtx->state.gfxCtx;
|
||||||
func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 773);
|
func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 773);
|
||||||
|
@ -60,14 +60,20 @@ void func_800A08A0(GlobalContext* globalCtx, s32 limbIndex, u32* limbTable , Vec
|
||||||
pos.y = limbEntry->pos.y;
|
pos.y = limbEntry->pos.y;
|
||||||
pos.z = limbEntry->pos.z;
|
pos.z = limbEntry->pos.z;
|
||||||
|
|
||||||
dList = &limbEntry->dList[arg7];
|
dList = limbEntry->displayLists[dListIndex];
|
||||||
if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList, &pos, &rot, actor) == 0))
|
if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList, &pos, &rot, actor) == 0))
|
||||||
{
|
{
|
||||||
func_800D1340(&pos, &rot);
|
func_800D1340(&pos, &rot);
|
||||||
if (dList != NULL)
|
if (dList != NULL)
|
||||||
{
|
{
|
||||||
gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(gfxCtx, "../z_skelanime.c", 0x325), G_MTX_LOAD);
|
do
|
||||||
gSPDisplayList(gfxCtx->polyOpa.p++, dList);
|
{
|
||||||
|
if(1)
|
||||||
|
{
|
||||||
|
gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_skelanime.c", 0x325), G_MTX_LOAD);
|
||||||
|
gSPDisplayList(gfxCtx->polyOpa.p++, dList);
|
||||||
|
}
|
||||||
|
} while(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,27 +84,209 @@ void func_800A08A0(GlobalContext* globalCtx, s32 limbIndex, u32* limbTable , Vec
|
||||||
|
|
||||||
if (limbEntry->firstChildIndex != 0xFF)
|
if (limbEntry->firstChildIndex != 0xFF)
|
||||||
{
|
{
|
||||||
func_800A08A0(globalCtx, limbEntry->firstChildIndex, limbTable, actorDrawTable, updateMtxFunc, appendDlistFunc, actor, arg7);
|
func_800A08A0(globalCtx, limbEntry->firstChildIndex, limbTable, actorDrawTable, updateMtxFunc, appendDlistFunc, actor, dListIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix_Pull();
|
Matrix_Pull();
|
||||||
|
|
||||||
if (limbEntry->nextLimbIndex != 0xFF)
|
if (limbEntry->nextLimbIndex != 0xFF)
|
||||||
{
|
{
|
||||||
func_800A08A0(globalCtx, limbEntry->nextLimbIndex, limbTable, actorDrawTable, updateMtxFunc, appendDlistFunc, actor, arg7);
|
func_800A08A0(globalCtx, limbEntry->nextLimbIndex, limbTable, actorDrawTable, updateMtxFunc, appendDlistFunc, actor, dListIndex);
|
||||||
|
}
|
||||||
|
func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 0x335);
|
||||||
|
}
|
||||||
|
|
||||||
|
// SkelAnime_LodDraw
|
||||||
|
void func_800A0B40(GlobalContext* globalCtx, u32* limbIndex, Vec3s* actorDrawTable, SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc, Actor* actor, s32 dListIndex)
|
||||||
|
{
|
||||||
|
SkelLimbEntry* limbEntry;
|
||||||
|
char pad[4];
|
||||||
|
Gfx* dList;
|
||||||
|
Vec3f pos;
|
||||||
|
Vec3s rot;
|
||||||
|
GraphicsContext* gfxCtx;
|
||||||
|
Gfx* gfx[4];
|
||||||
|
|
||||||
|
if (limbIndex == NULL)
|
||||||
|
{
|
||||||
|
osSyncPrintf("\x1b[31m");
|
||||||
|
osSyncPrintf("Si2_Lod_draw():skelがNULLです。\n");
|
||||||
|
osSyncPrintf("\x1b[m");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gfxCtx = globalCtx->state.gfxCtx;
|
||||||
|
func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 0x351);
|
||||||
|
Matrix_Push();
|
||||||
|
|
||||||
|
limbEntry = SEGMENTED_TO_VIRTUAL(*limbIndex);
|
||||||
|
pos.x = (f32) actorDrawTable->x;
|
||||||
|
pos.y = (f32) actorDrawTable->y;
|
||||||
|
pos.z = (f32) actorDrawTable->z;
|
||||||
|
|
||||||
|
rot = actorDrawTable[1];
|
||||||
|
dList = limbEntry->displayLists[dListIndex];
|
||||||
|
|
||||||
|
if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, 1, &dList, &pos, &rot, actor) == 0))
|
||||||
|
{
|
||||||
|
func_800D1340(&pos, &rot);
|
||||||
|
if (dList != NULL)
|
||||||
|
{
|
||||||
|
gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_skelanime.c", 0x371), G_MTX_LOAD);
|
||||||
|
gSPDisplayList(gfxCtx->polyOpa.p++, dList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (appendDlistFunc != NULL)
|
||||||
|
{
|
||||||
|
appendDlistFunc(globalCtx, 1, &dList, &rot, actor);
|
||||||
|
}
|
||||||
|
if (limbEntry->firstChildIndex != 0xFF)
|
||||||
|
{
|
||||||
|
func_800A08A0(globalCtx, limbEntry->firstChildIndex, limbIndex, actorDrawTable, updateMtxFunc, appendDlistFunc, actor, dListIndex);
|
||||||
|
}
|
||||||
|
Matrix_Pull();
|
||||||
|
func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 0x37E);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef NON_MATCHING
|
||||||
|
// SkelAnime_LodDrawLimbSV
|
||||||
|
void func_800A0D94(GlobalContext* globalCtx, s32 limbIndex, u32* limbTable, Vec3s* actorDrawTable,
|
||||||
|
SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc,
|
||||||
|
Actor* actor, s32 dListIndex, Mtx** mtx)
|
||||||
|
{
|
||||||
|
Gfx* dList[2];
|
||||||
|
GraphicsContext* gfxCtx;
|
||||||
|
SkelLimbEntry* limbEntry;
|
||||||
|
Vec3f pos;
|
||||||
|
Vec3s rot;
|
||||||
|
Gfx* gfx[3];
|
||||||
|
|
||||||
|
Matrix_Push();
|
||||||
|
|
||||||
|
limbEntry = SEGMENTED_TO_VIRTUAL(limbTable[limbIndex]);
|
||||||
|
limbIndex++;
|
||||||
|
|
||||||
|
rot = actorDrawTable[limbIndex];
|
||||||
|
pos.x = limbEntry->pos.x;
|
||||||
|
pos.y = limbEntry->pos.y;
|
||||||
|
pos.z = limbEntry->pos.z;
|
||||||
|
dList[1] = dList[0] = limbEntry->displayLists[dListIndex];
|
||||||
|
if ((updateMtxFunc == NULL) || (updateMtxFunc(globalCtx, limbIndex, &dList[1], &pos, &rot, actor) == 0))
|
||||||
|
{
|
||||||
|
func_800D1340(&pos, &rot);
|
||||||
|
if (dList[1] != NULL)
|
||||||
|
{
|
||||||
|
Matrix_ToMtx(*mtx, "../z_skelanime.c", 945); gfxCtx = globalCtx->state.gfxCtx;
|
||||||
|
func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 946);
|
||||||
|
gSPMatrix(gfxCtx->polyOpa.p++, *mtx, G_MTX_LOAD);
|
||||||
|
gSPDisplayList(gfxCtx->polyOpa.p++, dList[1]);
|
||||||
|
func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 949);
|
||||||
|
(*mtx)++;
|
||||||
|
}
|
||||||
|
else if (dList[0] != 0)
|
||||||
|
{
|
||||||
|
Matrix_ToMtx(*mtx, "../z_skelanime.c", 954);
|
||||||
|
(*mtx)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (appendDlistFunc != NULL)
|
||||||
|
{
|
||||||
|
appendDlistFunc(globalCtx, limbIndex, &dList[1], &rot, actor);
|
||||||
|
}
|
||||||
|
if (limbEntry->firstChildIndex != 0xFF)
|
||||||
|
{
|
||||||
|
func_800A0D94(globalCtx, limbEntry->firstChildIndex, limbTable, actorDrawTable,
|
||||||
|
updateMtxFunc, appendDlistFunc, actor, dListIndex, mtx);
|
||||||
|
}
|
||||||
|
|
||||||
|
Matrix_Pull();
|
||||||
|
|
||||||
|
if (limbEntry->nextLimbIndex != 0xFF)
|
||||||
|
{
|
||||||
|
func_800A0D94(globalCtx, limbEntry->nextLimbIndex, limbTable,
|
||||||
|
actorDrawTable, updateMtxFunc, appendDlistFunc, actor, dListIndex, mtx);
|
||||||
}
|
}
|
||||||
func_800C6B54(&gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 0x335);
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A08A0.s")
|
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A0D94.s")
|
||||||
#endif
|
#endif
|
||||||
#undef NON_MATCHING
|
#undef NON_MATCHING
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A0B40.s")
|
#ifdef NON_MATCHING
|
||||||
|
// SkelAnime_LodDrawSV
|
||||||
|
void func_800A106C(GlobalContext* globalCtx, u32* limbTable, Vec3s* actorDrawTable, s32 limbCount,
|
||||||
|
SkelAnime_LimbUpdateMatrix updateMtxFunc, SkelAnime_LimbAppendDlist appendDlistFunc,
|
||||||
|
Actor* actor, s32 dListIndex)
|
||||||
|
{
|
||||||
|
SkelLimbEntry *limbEntry;
|
||||||
|
Gfx* dList[2];
|
||||||
|
Vec3f pos;
|
||||||
|
Vec3s rot;
|
||||||
|
Mtx* mtx;
|
||||||
|
GraphicsContext* gfxCtx;
|
||||||
|
Gfx* gfx[4];
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A0D94.s")
|
do
|
||||||
|
{
|
||||||
|
if(1)
|
||||||
|
{
|
||||||
|
mtx = Graph_Alloc(globalCtx->state.gfxCtx, limbCount * 0x40);
|
||||||
|
}
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
if (limbTable == NULL)
|
||||||
|
{
|
||||||
|
osSyncPrintf("\x1b[31m");
|
||||||
|
osSyncPrintf("Si2_Lod_draw_SV():skelがNULLです。\n");
|
||||||
|
osSyncPrintf("\x1b[m");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gfxCtx = globalCtx->state.gfxCtx;
|
||||||
|
func_800C6AC4(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1000);
|
||||||
|
gSPSegment(gfxCtx->polyOpa.p++, 0xD, mtx);
|
||||||
|
Matrix_Push();
|
||||||
|
|
||||||
|
limbEntry = SEGMENTED_TO_VIRTUAL(*limbTable);
|
||||||
|
|
||||||
|
pos.x = actorDrawTable->x;
|
||||||
|
pos.y = actorDrawTable->y;
|
||||||
|
pos.z = actorDrawTable->z;
|
||||||
|
|
||||||
|
rot = actorDrawTable[1];
|
||||||
|
|
||||||
|
dList[0] = dList[1] = limbEntry->displayLists[dListIndex];
|
||||||
|
|
||||||
|
if ((updateMtxFunc == 0) || (updateMtxFunc(globalCtx, 1, &dList[1], &pos, &rot, actor) == 0))
|
||||||
|
{
|
||||||
|
func_800D1340(&pos, &rot);
|
||||||
|
if (dList[1] != NULL)
|
||||||
|
{
|
||||||
|
mtx = Matrix_ToMtx(mtx, "../z_skelanime.c", 1033);
|
||||||
|
gSPMatrix(gfxCtx->polyOpa.p++, mtx, G_MTX_LOAD);
|
||||||
|
gSPDisplayList(gfxCtx->polyOpa.p++, dList[1]);
|
||||||
|
mtx++;
|
||||||
|
}
|
||||||
|
else if (dList[0] != NULL)
|
||||||
|
{
|
||||||
|
Matrix_ToMtx(mtx, "../z_skelanime.c", 1040);
|
||||||
|
mtx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (appendDlistFunc != 0)
|
||||||
|
{
|
||||||
|
appendDlistFunc(globalCtx, 1, &dList[0], &rot, actor);
|
||||||
|
}
|
||||||
|
if (limbEntry->firstChildIndex != 0xFF)
|
||||||
|
{
|
||||||
|
func_800A0D94(globalCtx, limbEntry->firstChildIndex, limbTable, actorDrawTable, updateMtxFunc, appendDlistFunc, actor, dListIndex, &mtx);
|
||||||
|
}
|
||||||
|
Matrix_Pull();
|
||||||
|
func_800C6B54(gfx, globalCtx->state.gfxCtx, "../z_skelanime.c", 1053);
|
||||||
|
}
|
||||||
|
#else
|
||||||
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A106C.s")
|
#pragma GLOBAL_ASM("asm/non_matchings/code/z_skelanime/func_800A106C.s")
|
||||||
|
#endif
|
||||||
|
#undef NON_MATCHING
|
||||||
|
|
||||||
#ifdef NON_MATCHING
|
#ifdef NON_MATCHING
|
||||||
// SkelAnime_DrawLimb
|
// SkelAnime_DrawLimb
|
||||||
|
|
Loading…
Reference in a new issue