diff options
Diffstat (limited to 'src/code')
| -rw-r--r-- | src/code/z_shrink_window.c | 120 |
1 files changed, 108 insertions, 12 deletions
diff --git a/src/code/z_shrink_window.c b/src/code/z_shrink_window.c index 3b2d86114..194ee5083 100644 --- a/src/code/z_shrink_window.c +++ b/src/code/z_shrink_window.c @@ -1,25 +1,121 @@ +/** + * File: z_shrink_window.c + * Description: Draws black top/bottom/side borders on the viewing window (e.g. Z-targeting, talking to NPC) + */ #include "global.h" -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_SetLetterboxTarget.s") +ShrinkWindowContext gShrinkWindowContext; +ShrinkWindowContext* gShrinkWindowContextPtr; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_GetLetterboxTarget.s") +void ShrinkWindow_SetLetterboxTarget(s32 target) { + gShrinkWindowContextPtr->letterboxTarget = target; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_SetLetterboxMagnitude.s") +s32 ShrinkWindow_GetLetterboxTarget(void) { + return gShrinkWindowContextPtr->letterboxTarget; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_GetLetterboxMagnitude.s") +void ShrinkWindow_SetLetterboxMagnitude(s32 magnitude) { + gShrinkWindowContextPtr->letterboxMagnitude = magnitude; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_SetPillarboxTarget.s") +s32 ShrinkWindow_GetLetterboxMagnitude(void) { + return gShrinkWindowContextPtr->letterboxMagnitude; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_GetPillarboxTarget.s") +void ShrinkWindow_SetPillarboxTarget(s32 target) { + gShrinkWindowContextPtr->pillarboxTarget = target; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_SetPillarboxMagnitude.s") +s32 ShrinkWindow_GetPillarboxTarget(void) { + return gShrinkWindowContextPtr->pillarboxTarget; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_GetPillarboxMagnitude.s") +void ShrinkWindow_SetPillarboxMagnitude(s32 magnitude) { + gShrinkWindowContextPtr->pillarboxMagnitude = magnitude; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_Init.s") +s32 ShrinkWindow_GetPillarboxMagnitude(void) { + return gShrinkWindowContextPtr->pillarboxMagnitude; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_Fini.s") +void ShrinkWindow_Init(void) { + gShrinkWindowContextPtr = &gShrinkWindowContext; + bzero(gShrinkWindowContextPtr, sizeof(gShrinkWindowContext)); +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_Step.s") +void ShrinkWindow_Destroy(void) { + gShrinkWindowContextPtr = NULL; +} -#pragma GLOBAL_ASM("asm/non_matchings/code/z_shrink_window/ShrinkWindow_Draw.s") +void ShrinkWindow_Update(s32 framerateDivisor) { + s32 step = ((framerateDivisor == 3) ? 10 : 30 / framerateDivisor); + s32 nextMagnitude; + + nextMagnitude = gShrinkWindowContextPtr->letterboxMagnitude; + Math_StepToIGet(&nextMagnitude, gShrinkWindowContextPtr->letterboxTarget, step); + gShrinkWindowContextPtr->letterboxMagnitude = nextMagnitude; + + nextMagnitude = gShrinkWindowContextPtr->pillarboxMagnitude; + Math_StepToIGet(&nextMagnitude, gShrinkWindowContextPtr->pillarboxTarget, step); + gShrinkWindowContextPtr->pillarboxMagnitude = nextMagnitude; +} + +void ShrinkWindow_Draw(GraphicsContext* gfxCtx) { + Gfx* gfx; + s8 letterboxMagnitude = gShrinkWindowContextPtr->letterboxMagnitude; + s8 pillarboxMagnitude = gShrinkWindowContextPtr->pillarboxMagnitude; + + if (letterboxMagnitude > 0) { + OPEN_DISPS(gfxCtx); + + gfx = OVERLAY_DISP; + + gDPPipeSync(gfx++); + gDPSetCycleType(gfx++, G_CYC_FILL); + gDPSetRenderMode(gfx++, G_RM_NOOP, G_RM_NOOP2); + gDPSetFillColor(gfx++, (GPACK_RGBA5551(0, 0, 0, 1) << 16) | GPACK_RGBA5551(0, 0, 0, 1)); + gDPFillRectangle(gfx++, 0, 0, gScreenWidth - 1, letterboxMagnitude - 1); + gDPFillRectangle(gfx++, 0, gScreenHeight - letterboxMagnitude, gScreenWidth - 1, gScreenHeight - 1); + + gDPPipeSync(gfx++); + gDPSetCycleType(gfx++, G_CYC_1CYCLE); + gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 0); + gDPFillRectangle(gfx++, 0, letterboxMagnitude, gScreenWidth, letterboxMagnitude + 1); + gDPFillRectangle(gfx++, 0, gScreenHeight - letterboxMagnitude - 1, gScreenWidth, + gScreenHeight - letterboxMagnitude); + + gDPPipeSync(gfx++); + OVERLAY_DISP = gfx++; + + CLOSE_DISPS(gfxCtx); + } + if (pillarboxMagnitude > 0) { + OPEN_DISPS(gfxCtx); + + gfx = OVERLAY_DISP; + + gDPPipeSync(gfx++); + gDPSetCycleType(gfx++, G_CYC_FILL); + gDPSetRenderMode(gfx++, G_RM_NOOP, G_RM_NOOP2); + gDPSetFillColor(gfx++, (GPACK_RGBA5551(0, 0, 0, 1) << 16) | GPACK_RGBA5551(0, 0, 0, 1)); + + gDPFillRectangle(gfx++, 0, 0, pillarboxMagnitude - 1, gScreenHeight - 1); + gDPFillRectangle(gfx++, gScreenWidth - pillarboxMagnitude, 0, gScreenWidth - 1, gScreenHeight - 1); + + gDPPipeSync(gfx++); + gDPSetCycleType(gfx++, G_CYC_1CYCLE); + gDPSetRenderMode(gfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, 0); + + gDPFillRectangle(gfx++, pillarboxMagnitude, 0, pillarboxMagnitude + 2, gScreenHeight); + gDPFillRectangle(gfx++, gScreenWidth - pillarboxMagnitude - 2, 0, gScreenWidth - pillarboxMagnitude, + gScreenHeight); + + gDPPipeSync(gfx++); + OVERLAY_DISP = gfx++; + + CLOSE_DISPS(gfxCtx); + } +} |
