1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-08-08 15:30:14 +00:00

Decompile z_oceff_wipe (#122)

* Decompile z_oceff_wipe

- z_oceff_wipe: OK
- z_oceff_wipe2: OK
- z_oceff_wipe3: OK
- z_oceff_wipe4: OK
- Add patched libmalloc to ido 7 to prevent segfaults
- Add CUR_CAM macro

* Rename CUR_CAM to ACTIVE_CAM

* Fixes in PR #122
This commit is contained in:
Random 2020-05-09 22:58:02 +02:00 committed by GitHub
parent 4c68c61df5
commit 40836f5d82
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
56 changed files with 978 additions and 1670 deletions

View file

@ -5,6 +5,7 @@
*/
#include "z_oceff_wipe.h"
#include <vt.h>
#define FLAGS 0x02000010
@ -15,7 +16,6 @@ void OceffWipe_Destroy(Actor* thisx, GlobalContext* globalCtx);
void OceffWipe_Update(Actor* thisx, GlobalContext* globalCtx);
void OceffWipe_Draw(Actor* thisx, GlobalContext* globalCtx);
/*
const ActorInit Oceff_Wipe_InitVars = {
ACTOR_OCEFF_WIPE,
ACTORTYPE_ITEMACTION,
@ -27,11 +27,104 @@ const ActorInit Oceff_Wipe_InitVars = {
(ActorFunc)OceffWipe_Update,
(ActorFunc)OceffWipe_Draw,
};
*/
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Oceff_Wipe/OceffWipe_Init.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Oceff_Wipe/OceffWipe_Destroy.s")
#include "z_oceff_wipe_gfx.c"
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Oceff_Wipe/OceffWipe_Update.s")
u8 sOceffWipeAlphaIndices[] = {
0x01, 0x10, 0x22, 0x01, 0x20, 0x12, 0x01, 0x20, 0x12, 0x01,
0x10, 0x22, 0x01, 0x20, 0x12, 0x01, 0x12, 0x21, 0x01, 0x02,
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Oceff_Wipe/OceffWipe_Draw.s")
void OceffWipe_Init(Actor* thisx, GlobalContext* globalCtx) {
OceffWipe* this = THIS;
Actor_SetScale(&this->actor, 0.1f);
this->counter = 0;
this->actor.posRot.pos = ACTIVE_CAM->eye;
osSyncPrintf(VT_FGCOL(CYAN) " WIPE arg_data = %d\n" VT_RST, this->actor.params);
}
void OceffWipe_Destroy(Actor* thisx, GlobalContext* globalCtx) {
OceffWipe* this = THIS;
Player* player = PLAYER;
func_800876C8(globalCtx);
if (gSaveContext.nayrusLoveTimer) {
player->unk_692 |= 0x40;
}
}
void OceffWipe_Update(Actor* thisx, GlobalContext* globalCtx) {
OceffWipe* this = THIS;
this->actor.posRot.pos = ACTIVE_CAM->eye;
if (this->counter < 100) {
this->counter++;
} else {
Actor_Kill(&this->actor);
}
}
void OceffWipe_Draw(Actor* thisx, GlobalContext* globalCtx) {
u32 scroll;
OceffWipe* this = THIS;
f32 z;
GraphicsContext* gfxCtx;
u8 alphaTable[3];
s32 i;
Vec3f eye;
Vtx(*vtxPtr)[2];
Vec3f vec;
Gfx* dispRefs[5];
scroll = globalCtx->state.frames & 0xFF;
eye = ACTIVE_CAM->eye;
func_8005AFB4(&vec, ACTIVE_CAM);
gfxCtx = globalCtx->state.gfxCtx;
Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_oceff_wipe.c", 346);
if (this->counter < 32) {
z = Math_Sins(this->counter << 9) * 1400;
} else {
z = 1400;
}
if (this->counter >= 80) {
alphaTable[0] = 0;
alphaTable[1] = (0x64 - this->counter) * 8;
alphaTable[2] = (0x64 - this->counter) * 12;
} else {
alphaTable[0] = 0;
alphaTable[1] = 0xA0;
alphaTable[2] = 0xFF;
}
for (i = 0; i < 20; i++) {
vtxPtr = (Vtx(*)[2])vertices;
vtxPtr[i][0].v.cn[3] = alphaTable[((sOceffWipeAlphaIndices[i] & 0xF0) >> 4)];
vtxPtr[i][1].v.cn[3] = alphaTable[sOceffWipeAlphaIndices[i] & 0xF];
}
func_80093D84(globalCtx->state.gfxCtx);
Matrix_Translate(eye.x + vec.x, eye.y + vec.y, eye.z + vec.z, MTXMODE_NEW);
Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY);
func_800D1FD4(&globalCtx->mf_11DA0);
Matrix_Translate(0.0f, 0.0f, -z, MTXMODE_APPLY);
gSPMatrix(gfxCtx->polyXlu.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_oceff_wipe.c", 375),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (this->actor.params) {
gDPSetPrimColor(gfxCtx->polyXlu.p++, 0x00, 0x00, 0xAA, 0xFF, 0xFF, 0xFF);
gDPSetEnvColor(gfxCtx->polyXlu.p++, 0x00, 0x96, 0xFF, 0x80);
} else {
gDPSetPrimColor(gfxCtx->polyXlu.p++, 0x00, 0x00, 0xFF, 0xFF, 0xC8, 0xFF);
gDPSetEnvColor(gfxCtx->polyXlu.p++, 100, 0x00, 0xFF, 0x80);
}
gSPDisplayList(gfxCtx->polyXlu.p++, textureDL);
gSPDisplayList(gfxCtx->polyXlu.p++, Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0 - scroll, scroll * (-2), 32, 32,
1, 0 - scroll, scroll * (-2), 32, 32));
gSPDisplayList(gfxCtx->polyXlu.p++, frustrumDl);
Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_oceff_wipe.c", 398);
}

View file

@ -8,7 +8,7 @@ struct OceffWipe;
typedef struct OceffWipe {
/* 0x0000 */ Actor actor;
/* 0x014C */ char unk_14C[0x4];
/* 0x014C */ s16 counter;
} OceffWipe; // size = 0x0150
extern const ActorInit Oceff_Wipe_InitVars;

View file

@ -0,0 +1,101 @@
#include "z_oceff_wipe.h"
static u32 tex0[] = {
0x354D5AAC, 0xA5561C01, 0x124688B5, 0x74583231, 0x313D71D6, 0x9F5B3507, 0x104089AD, 0x748F440C, 0x408176AC,
0xB4661301, 0x2261C0BE, 0x49392533, 0x2C497FC4, 0x80451D06, 0x2466BBD0, 0x9CB85411, 0x40A09DA3, 0xB37F210B,
0x3D8AEAC7, 0x3F241930, 0x2F5591A7, 0x6441080F, 0x4191E8DB, 0xB7A76B18, 0x4094BAA0, 0x76532D22, 0x60BAFEE8,
0x8253545F, 0x6078A896, 0x73540723, 0x66C2FEBB, 0x87888723, 0x4B87C79E, 0x33123048, 0x88E3FFFC, 0xD39F7E72,
0x8DA2AE80, 0xA77B1940, 0x90EBFFA9, 0x6289973E, 0x6F9ACD83, 0x2D104B7F, 0xAEEBFDF3, 0xD8B26772, 0xA7C7AD77,
0xB1B34A61, 0xB0F8FFD5, 0x9496986B, 0x9EC6D25D, 0x503E85B3, 0xC0C1E1EE, 0xBD9B618E, 0xBFE4A975, 0x86E18B86,
0xABCFF7F2, 0xBC837E69, 0xB5EFE465, 0x5B66BACB, 0xC794AADC, 0xAC8982AE, 0xD3F59754, 0x65E2AAAD, 0x8C85D0E1,
0xAF634D39, 0xC7E2EDA3, 0x527ECACF, 0xBF777FC0, 0xA284A5A5, 0xE3FE8A2F, 0x60CCAFBE, 0x7164B8BA, 0x97553A2B,
0xE8BCBCDA, 0x76A1BBBA, 0x844D83BD, 0x9C6B875B, 0xD9FFAA3F, 0x6AC9B59B, 0x6592BD94, 0x956D3D3B, 0xFFA773D3,
0xB5B9AB90, 0x4033A0BC, 0x873E3E1D, 0xB5FFE48D, 0x8CC9A761, 0x62CBAF79, 0x98883457, 0xF3766FAF, 0xD5B2A26B,
0x44549D8B, 0x56232221, 0x7DFFF2DD, 0xC6B68840, 0x4ECCA267, 0x696D296E, 0xA8328AAD, 0xD3998447, 0x5E7D8C5B,
0x391F1E35, 0x4EF6CDD3, 0xDD9B6C2D, 0x27A09571, 0x37443656, 0x4C1265C9, 0xCA91612E, 0x3B5A7A65, 0x2F4F3421,
0x36EAC380, 0xB6814A1B, 0x0C607075, 0x5860803B, 0x27102CCD, 0xC9A87A47, 0x16204B80, 0x44B3860F, 0x28DAE042,
0x7F773710, 0x0235616D, 0xA089BE60, 0x34161EBC, 0xBBAAA972, 0x172A3B91, 0x96F6C319, 0x21B7F02A, 0x618F662A,
0x02327A8C, 0x97577B5C, 0x48171FB3, 0xA090AF87, 0x1F65609D, 0xD8FFD41E, 0x177CC522, 0x69A8A462, 0x0D3A93B6,
0x4F0C1821, 0x39151CA7, 0x928EAA9A, 0x33919BAF, 0xEBFBDA23, 0x093B6937, 0x80AEA66C, 0x304491C7, 0x3A031710,
0x16162197, 0x9B9FB5BA, 0x4C95CED8, 0xF8F0D425, 0x05144066, 0x84B17F5A, 0x725E8DCD, 0x5D376910, 0x19183886,
0xA3A1C4C6, 0x6584D1F1, 0xFFFABF12, 0x0E123F77, 0x88AF6881, 0xB97F98BB, 0x879BBC23, 0x4A20557C, 0x9BA5D0BB,
0x7583C6E0, 0xFEFFB322, 0x34283976, 0x95B06EB8, 0xE29B999F, 0xBDE9E582, 0x814C5C82, 0xA1C0ECBE, 0x789ED6B2,
0xF4FFD78F, 0x73324087, 0xA0C26FAB, 0xE0B1A5B9, 0xF2FFFADE, 0xAC906A89, 0xB3DDFFCB, 0x86B8CD75, 0xDFFFF1D7,
0x8F31579C, 0xAFDE7B87, 0xC8BAB4EB, 0xF0F2FFE4, 0xB29B798B, 0xC3F4FFD2, 0xA0A17C32, 0xA9FFE8BD, 0x784D7A91,
0xC7F5AB9B, 0xBEBB86D9, 0xB0BCF9D4, 0x835C4C70, 0xD8FFFFD7, 0xA2682907, 0x68FFE29F, 0x61707B7A, 0xE5FFE7C8,
0xCCC33C8E, 0x768CE0C7, 0x51281940, 0xCBFFFFCB, 0x87450C00, 0x4BF3D58E, 0x6D767B92, 0xFAFFFFC8, 0xC7BF175B,
0x708BBA9A, 0x3A161542, 0xB4FFF5A9, 0x6D39090C, 0x50D8BC86, 0x897AA1C8, 0xFFFFF4A1, 0x8C880B50, 0x91A49762,
0x2D0C1E78, 0xD4FFD97F, 0x58351E23, 0x6BB49283, 0x9B95C9EE, 0xFFFFD377, 0x4336075E, 0xBFB27641, 0x1B0224B5,
0xFCF7AC55, 0x41384344, 0x8FA06468, 0x9FB5DBFD, 0xFFF1A553, 0x190B1275, 0xCCA75D3A, 0x0C042ED9, 0xFFD97C33,
0x28405669, 0xB0914C3A, 0x9199C6FF, 0xFECF7835, 0x080C308B, 0xB38F6D47, 0x0A0D3DDB, 0xF3A75519, 0x1341558E,
0xBE7B4321, 0x6B4D94F8, 0xE4AC591A, 0x02175096, 0x8E7A9145, 0x1D224BBF, 0xC1723508, 0x0D3E5FA5, 0xA568351E,
0x422B6EE0, 0xBB85480B, 0x04256799, 0x716D6D21,
};
static Vtx vertices[] = {
VTX(-165, 227, 0, 1229, 1024, 0xFF, 0xFF, 0xFF, 0x00), VTX(-206, 283, 300, 1229, 512, 0xFF, 0xFF, 0xFF, 0xA0),
VTX(0, 350, 300, 1024, 512, 0xFF, 0xFF, 0xFF, 0xA0), VTX(0, 280, 0, 1024, 1024, 0xFF, 0xFF, 0xFF, 0x00),
VTX(-294, 405, 1000, 1229, 0, 0xFF, 0xFF, 0xFF, 0xFF), VTX(0, 500, 1000, 1024, 0, 0xFF, 0xFF, 0xFF, 0xFF),
VTX(-266, 87, 0, 1434, 1024, 0xFF, 0xFF, 0xFF, 0x00), VTX(-333, 108, 300, 1434, 512, 0xFF, 0xFF, 0xFF, 0xA0),
VTX(-476, 155, 1000, 1434, 0, 0xFF, 0xFF, 0xFF, 0xFF), VTX(-266, -87, 0, 1638, 1024, 0xFF, 0xFF, 0xFF, 0x00),
VTX(-333, -108, 300, 1638, 512, 0xFF, 0xFF, 0xFF, 0xA0), VTX(-476, -155, 1000, 1638, 0, 0xFF, 0xFF, 0xFF, 0xFF),
VTX(-165, -227, 0, 1843, 1024, 0xFF, 0xFF, 0xFF, 0x00), VTX(-206, -283, 300, 1843, 512, 0xFF, 0xFF, 0xFF, 0xA0),
VTX(-294, -405, 1000, 1843, 0, 0xFF, 0xFF, 0xFF, 0xFF), VTX(0, -280, 0, 2048, 1024, 0xFF, 0xFF, 0xFF, 0x00),
VTX(0, -350, 300, 2048, 512, 0xFF, 0xFF, 0xFF, 0xA0), VTX(0, -500, 1000, 2048, 0, 0xFF, 0xFF, 0xFF, 0xFF),
VTX(165, -227, 0, 205, 1024, 0xFF, 0xFF, 0xFF, 0x00), VTX(206, -283, 300, 205, 512, 0xFF, 0xFF, 0xFF, 0xA0),
VTX(0, -350, 300, 0, 512, 0xFF, 0xFF, 0xFF, 0xA0), VTX(0, -280, 0, 0, 1024, 0xFF, 0xFF, 0xFF, 0x00),
VTX(294, -405, 1000, 205, 0, 0xFF, 0xFF, 0xFF, 0xFF), VTX(0, -500, 1000, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF),
VTX(266, -87, 0, 410, 1024, 0xFF, 0xFF, 0xFF, 0x00), VTX(333, -108, 300, 410, 512, 0xFF, 0xFF, 0xFF, 0xA0),
VTX(476, -155, 1000, 410, 0, 0xFF, 0xFF, 0xFF, 0xFF), VTX(266, 87, 0, 614, 1024, 0xFF, 0xFF, 0xFF, 0x00),
VTX(333, 108, 300, 614, 512, 0xFF, 0xFF, 0xFF, 0xA0), VTX(476, 155, 1000, 614, 0, 0xFF, 0xFF, 0xFF, 0xFF),
VTX(165, 227, 0, 819, 1024, 0xFF, 0xFF, 0xFF, 0x00), VTX(206, 283, 300, 819, 512, 0xFF, 0xFF, 0xFF, 0xA0),
VTX(206, 283, 300, 819, 512, 0xFF, 0xFF, 0xFF, 0xA0), VTX(294, 405, 1000, 819, 0, 0xFF, 0xFF, 0xFF, 0xFF),
VTX(476, 155, 1000, 614, 0, 0xFF, 0xFF, 0xFF, 0xFF), VTX(333, 108, 300, 614, 512, 0xFF, 0xFF, 0xFF, 0xA0),
VTX(0, 280, 0, 1024, 1024, 0xFF, 0xFF, 0xFF, 0x00), VTX(0, 350, 300, 1024, 512, 0xFF, 0xFF, 0xFF, 0xA0),
VTX(165, 227, 0, 819, 1024, 0xFF, 0xFF, 0xFF, 0x00), VTX(0, 500, 1000, 1024, 0, 0xFF, 0xFF, 0xFF, 0xFF),
};
static Gfx textureDL[] = {
gsDPPipeSync(),
gsDPSetTextureLUT(G_TT_NONE),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
gsDPLoadTextureBlock(tex0, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_NOMIRROR,
G_TX_NOMIRROR | G_TX_NOMIRROR, 5, 5, 1, 0),
gsDPTileSync(),
gsDPSetTile(G_IM_FMT_I, G_IM_SIZ_8b, 4, 0x0, 1, 0, G_TX_NOMIRROR | G_TX_NOMIRROR, 5, 15,
G_TX_NOMIRROR | G_TX_NOMIRROR, 5, 0),
gsDPSetTileSize(1, 0, 0, (31 << 2), (31 << 2)),
gsDPSetCombineLERP(TEXEL1, PRIMITIVE, ENV_ALPHA, TEXEL0, TEXEL1, TEXEL0, ENVIRONMENT, TEXEL0, PRIMITIVE,
ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, SHADE, 0),
gsDPSetRenderMode(AA_EN | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_OPA | FORCE_BL |
GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1),
G_RM_AA_XLU_SURF2),
gsSPClearGeometryMode(G_TEXTURE_ENABLE | G_CULL_BACK | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR),
gsSPEndDisplayList(),
};
static Gfx frustrumDl[] = {
gsSPVertex(vertices, 32, 0),
gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0),
gsSP2Triangles(1, 4, 5, 0, 1, 5, 2, 0),
gsSP2Triangles(6, 7, 1, 0, 6, 1, 0, 0),
gsSP2Triangles(7, 8, 4, 0, 7, 4, 1, 0),
gsSP2Triangles(9, 10, 7, 0, 9, 7, 6, 0),
gsSP2Triangles(10, 11, 8, 0, 10, 8, 7, 0),
gsSP2Triangles(12, 13, 10, 0, 12, 10, 9, 0),
gsSP2Triangles(13, 14, 11, 0, 13, 11, 10, 0),
gsSP2Triangles(15, 16, 13, 0, 15, 13, 12, 0),
gsSP2Triangles(16, 17, 14, 0, 16, 14, 13, 0),
gsSP2Triangles(18, 19, 20, 0, 18, 20, 21, 0),
gsSP2Triangles(19, 22, 23, 0, 19, 23, 20, 0),
gsSP2Triangles(24, 25, 19, 0, 24, 19, 18, 0),
gsSP2Triangles(25, 26, 22, 0, 25, 22, 19, 0),
gsSP2Triangles(27, 28, 25, 0, 27, 25, 24, 0),
gsSP2Triangles(28, 29, 26, 0, 28, 26, 25, 0),
gsSP2Triangles(30, 31, 28, 0, 30, 28, 27, 0),
gsSPVertex(vertices + 32, 8, 0),
gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0),
gsSP2Triangles(4, 5, 0, 0, 4, 0, 6, 0),
gsSP2Triangles(5, 7, 1, 0, 5, 1, 0, 0),
gsSPEndDisplayList(),
};