mirror of https://github.com/zeldaret/oot.git
143 lines
4.0 KiB
C
143 lines
4.0 KiB
C
#include "transition_wipe.h"
|
|
|
|
#include "gfx.h"
|
|
#include "save.h"
|
|
#include "tex_len.h"
|
|
#include "transition_instances.h"
|
|
|
|
typedef enum TransitionWipeDirection {
|
|
/* 0 */ TRANS_WIPE_DIR_IN,
|
|
/* 1 */ TRANS_WIPE_DIR_OUT
|
|
} TransitionWipeDirection;
|
|
|
|
Vtx sTransWipeVtx[25] = {
|
|
#include "assets/code/fbdemo_wipe1/sTransWipeVtx.inc.c"
|
|
};
|
|
|
|
#define sTransWipeTex_WIDTH 64
|
|
#define sTransWipeTex_HEIGHT 64
|
|
u64 sTransWipeTex[TEX_LEN(u64, sTransWipeTex_WIDTH, sTransWipeTex_HEIGHT, 4)] = {
|
|
#include "assets/code/fbdemo_wipe1/sTransWipeTex.i4.inc.c"
|
|
};
|
|
|
|
Gfx sTransWipeDL[31] = {
|
|
#include "assets/code/fbdemo_wipe1/sTransWipeDL.inc.c"
|
|
};
|
|
|
|
// unused.
|
|
Gfx sTransWipeSyncDL[] = {
|
|
gsDPPipeSync(),
|
|
gsSPEndDisplayList(),
|
|
};
|
|
|
|
void TransitionWipe_Start(void* thisx) {
|
|
TransitionWipe* this = (TransitionWipe*)thisx;
|
|
|
|
this->isDone = false;
|
|
|
|
if (this->direction != TRANS_WIPE_DIR_IN) {
|
|
this->texY = (s32)(83.25f * (1 << 2));
|
|
} else {
|
|
this->texY = (s32)(153.0f * (1 << 2));
|
|
}
|
|
|
|
guPerspective(&this->projection, &this->normal, 60.0f, (4.0f / 3.0f), 10.0f, 12800.0f, 1.0f);
|
|
guLookAt(&this->lookAt, 0.0f, 0.0f, 400.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
|
|
}
|
|
|
|
void* TransitionWipe_Init(void* thisx) {
|
|
TransitionWipe* this = (TransitionWipe*)thisx;
|
|
|
|
bzero(this, sizeof(TransitionWipe));
|
|
return this;
|
|
}
|
|
|
|
void TransitionWipe_Destroy(void* thisx) {
|
|
}
|
|
|
|
void TransitionWipe_Update(void* thisx, s32 updateRate) {
|
|
TransitionWipe* this = (TransitionWipe*)thisx;
|
|
|
|
if (this->direction != TRANS_WIPE_DIR_IN) {
|
|
this->texY += (((void)0, gSaveContext.transWipeSpeed) * 3) / updateRate;
|
|
if (this->texY >= (s32)(153.0f * (1 << 2))) {
|
|
this->texY = (s32)(153.0f * (1 << 2));
|
|
this->isDone = true;
|
|
}
|
|
} else {
|
|
this->texY -= (((void)0, gSaveContext.transWipeSpeed) * 3) / updateRate;
|
|
if (this->texY <= (s32)(83.25f * (1 << 2))) {
|
|
this->texY = (s32)(83.25f * (1 << 2));
|
|
this->isDone = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
void TransitionWipe_Draw(void* thisx, Gfx** gfxP) {
|
|
Gfx* gfx = *gfxP;
|
|
Mtx* modelView;
|
|
TransitionWipe* this = (TransitionWipe*)thisx;
|
|
Color_RGBA8_u32* color;
|
|
s32 pad[3];
|
|
Gfx* texScroll;
|
|
|
|
modelView = this->modelView[this->frame];
|
|
this->frame ^= 1;
|
|
|
|
guScale(&modelView[0], 0.56f, 0.56f, 1.0f);
|
|
guRotate(&modelView[1], 0.0f, 0.0f, 0.0f, 1.0f);
|
|
guTranslate(&modelView[2], 0.0f, 0.0f, 0.0f);
|
|
|
|
gDPPipeSync(gfx++);
|
|
|
|
texScroll = Gfx_BranchTexScroll(&gfx, this->texX, this->texY, 0, 0);
|
|
gSPSegment(gfx++, 8, texScroll);
|
|
|
|
color = &this->color;
|
|
gDPSetPrimColor(gfx++, 0, 0x80, color->r, color->g, color->b, 255);
|
|
|
|
gSPMatrix(gfx++, &this->projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
|
|
gSPPerspNormalize(gfx++, this->normal);
|
|
gSPMatrix(gfx++, &this->lookAt, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_PROJECTION);
|
|
gSPMatrix(gfx++, &modelView[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
gSPMatrix(gfx++, &modelView[1], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
|
|
gSPMatrix(gfx++, &modelView[2], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
|
|
gSPDisplayList(gfx++, sTransWipeDL);
|
|
gDPPipeSync(gfx++);
|
|
*gfxP = gfx;
|
|
}
|
|
|
|
s32 TransitionWipe_IsDone(void* thisx) {
|
|
TransitionWipe* this = (TransitionWipe*)thisx;
|
|
|
|
return this->isDone;
|
|
}
|
|
|
|
void TransitionWipe_SetType(void* thisx, s32 type) {
|
|
TransitionWipe* this = (TransitionWipe*)thisx;
|
|
|
|
if (type == TRANS_INSTANCE_TYPE_FILL_OUT) {
|
|
this->direction = TRANS_WIPE_DIR_OUT;
|
|
} else {
|
|
this->direction = TRANS_WIPE_DIR_IN;
|
|
}
|
|
|
|
if (this->direction != TRANS_WIPE_DIR_IN) {
|
|
this->texY = (s32)(83.25f * (1 << 2));
|
|
} else {
|
|
this->texY = (s32)(153.0f * (1 << 2));
|
|
}
|
|
}
|
|
|
|
void TransitionWipe_SetColor(void* thisx, u32 color) {
|
|
TransitionWipe* this = (TransitionWipe*)thisx;
|
|
|
|
this->color.rgba = color;
|
|
}
|
|
|
|
void TransitionWipe_SetUnkColor(void* thisx, u32 color) {
|
|
TransitionWipe* this = (TransitionWipe*)thisx;
|
|
|
|
this->unkColor.rgba = color;
|
|
}
|