1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-05 07:24:34 +00:00

Decompile speed_meter.c and add VIEWPORT_INIT macro (#127)

* Decompile speed_meter.c and add VIEWPORT_INIT macro

- speed_meter.c: OK
- Add VIEWPORT_INIT(viewport, by, rx, ty, lx) macro

* get rid of some magic numbers

* use early return instead of a big if block in SpeedMeter_DrawTimeEntries
This commit is contained in:
Random 2020-05-13 05:05:55 +02:00 committed by GitHub
parent 74a654ecae
commit 08d9fee6e4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 249 additions and 749 deletions

View file

@ -3,7 +3,7 @@
volatile u32 gIrqMgrResetStatus = 0;
volatile OSTime sIrqMgrResetTime = 0;
volatile OSTime sIrqMgrRetraceTime = 0;
volatile OSTime gIrqMgrRetraceTime = 0;
u32 sIrqMgrRetraceCount = 0;
#define RETRACE_MSG 666
@ -154,11 +154,11 @@ void IrqMgr_HandlePRENMI500(IrqMgr* this) {
}
void IrqMgr_HandleRetrace(IrqMgr* this) {
if (sIrqMgrRetraceTime == 0ull) {
if (gIrqMgrRetraceTime == 0ull) {
if (this->retraceTime == 0) {
this->retraceTime = osGetTime();
} else {
sIrqMgrRetraceTime = osGetTime() - this->retraceTime;
gIrqMgrRetraceTime = osGetTime() - this->retraceTime;
}
}
sIrqMgrRetraceCount++;

View file

@ -1,52 +1,206 @@
#include <ultra64.h>
#include <global.h>
#include <vt.h>
typedef struct {
/* 0x00 */ char unk_00[0x18];
/* 0x18 */ s32 unk_18;
/* 0x1C */ s32 unk_1C;
} struct_801664D0; // size = 0x20
SpeedMeterTimeEntry sSpeedMeterTimeEntryArray[] = {
{ &D_8016A520, 0, 0, GPACK_RGBA5551(0xFF, 0x00, 0x00, 1) },
{ &D_8016A528, 0, 2, GPACK_RGBA5551(0xFF, 0xFF, 0x00, 1) },
{ &D_8016A530, 0, 4, GPACK_RGBA5551(0x00, 0x00, 0xFF, 1) },
{ &D_8016A538, 0, 6, GPACK_RGBA5551(0xFF, 0x80, 0x80, 1) },
{ &D_8016A540, 0, 8, GPACK_RGBA5551(0x00, 0xFF, 0x00, 1) },
{ &D_8016A548, 0, 10, GPACK_RGBA5551(0xFF, 0x00, 0xFF, 1) },
};
extern struct_801664D0 D_801664D0;
#define DrawRec(gfx, color, ulx, uly, lrx, lry) \
gDPPipeSync(gfx); \
gDPSetFillColor(gfx, ((color) << 16) | (color)); \
gDPFillRectangle(gfx, (ulx), (uly), (lrx), (lry)); \
gDPPipeSync(gfx);
void func_800C9940(struct_801664D0* arg0, u32 arg1, u32 arg2) {
LogUtils_CheckNullPointer("this", arg0, "../speed_meter.c", 181);
arg0->unk_18 = arg1;
arg0->unk_1C = arg2;
void SpeedMeter_InitImpl(SpeedMeter* this, u32 arg1, u32 y) {
LogUtils_CheckNullPointer("this", this, "../speed_meter.c", 181);
this->unk_18 = arg1;
this->y = y;
}
void func_800C9998(struct_801664D0* arg0) {
func_800C9940(arg0, 0x20, 0x16);
void SpeedMeter_Init(SpeedMeter* this) {
SpeedMeter_InitImpl(this, 32, 22);
}
void func_800C99BC(struct_801664D0* arg0) {
void SpeedMeter_Destroy(SpeedMeter* this) {
}
#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/func_800C99C4.s")
void SpeedMeter_DrawTimeEntries(SpeedMeter* this, GraphicsContext* gfxCtx) {
u32 pad[2];
u32 baseX = 32;
s32 temp;
s32 i;
s32 uly;
s32 lry;
View view;
u32 pad2[3];
Gfx* gfx;
Gfx* dispRefs[5];
Viewport viewport;
typedef struct {
/* 0x00 */ u32 unk_00;
/* 0x04 */ u32 unk_04;
/* 0x08 */ u16 unk_08;
/* 0x0A */ u16 unk_0A;
/* 0x0C */ u32 unk_0C;
/* 0x10 */ u32 unk_10;
/* 0x14 */ u32 unk_14;
/* 0x18 */ u32 unk_18;
} struct_800C9E08;
uly = this->y;
lry = this->y + 2;
void func_800C9E08(struct_800C9E08* arg0, u32 arg1, u32 arg2, u16 arg3, u16 arg4, u32 arg5, u32 arg6, u32 arg7,
u32 arg8) {
arg0->unk_00 = arg1;
arg0->unk_04 = arg2;
arg0->unk_08 = arg3;
arg0->unk_0A = arg4;
arg0->unk_0C = arg5;
arg0->unk_10 = arg6;
arg0->unk_14 = arg7;
arg0->unk_18 = arg8;
Graph_OpenDisps(dispRefs, gfxCtx, "../speed_meter.c", 225);
/*! @bug if gIrqMgrRetraceTime is 0, the function won't call Graph_CloseDisps */
if (gIrqMgrRetraceTime == 0) {
return;
}
gSpeedMeterTimeEntryPtr = &sSpeedMeterTimeEntryArray;
for (i = 0; i < ARRAY_COUNT(sSpeedMeterTimeEntryArray); i++) {
temp = ((f64)*gSpeedMeterTimeEntryPtr->time / gIrqMgrRetraceTime) * 64.0;
gSpeedMeterTimeEntryPtr->x = temp + baseX;
gSpeedMeterTimeEntryPtr++;
}
View_Init(&view, gfxCtx);
view.flags = 0xA;
VIEWPORT_INIT(viewport, SCREEN_HEIGHT, SCREEN_WIDTH, 0, 0);
View_SetViewport(&view, &viewport);
gfx = gfxCtx->overlay.p;
func_800AB9EC(&view, 0xF, &gfx);
gDPPipeSync(gfx++);
gDPSetOtherMode(gfx++,
G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE,
G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2);
DrawRec(gfx++, GPACK_RGBA5551(0x00, 0x00, 0xFF, 1), baseX + 64 * 0, uly, baseX + 64 * 1, lry);
DrawRec(gfx++, GPACK_RGBA5551(0x00, 0xFF, 0x00, 1), baseX + 64 * 1, uly, baseX + 64 * 2, lry);
DrawRec(gfx++, GPACK_RGBA5551(0xFF, 0x00, 0x00, 1), baseX + 64 * 2, uly, baseX + 64 * 3, lry);
DrawRec(gfx++, GPACK_RGBA5551(0xFF, 0x00, 0xFF, 1), baseX + 64 * 3, uly, baseX + 64 * 4, lry);
gSpeedMeterTimeEntryPtr = sSpeedMeterTimeEntryArray;
for (i = 0; i < ARRAY_COUNT(sSpeedMeterTimeEntryArray); i++) {
DrawRec(gfx++, gSpeedMeterTimeEntryPtr->color, baseX, lry + gSpeedMeterTimeEntryPtr->y,
gSpeedMeterTimeEntryPtr->x, lry + gSpeedMeterTimeEntryPtr->y + 1);
gSpeedMeterTimeEntryPtr++;
}
gDPPipeSync(gfx++);
gfxCtx->overlay.p = gfx;
Graph_CloseDisps(dispRefs, gfxCtx, "../speed_meter.c", 276);
}
#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/func_800C9E44.s")
void SpeedMeter_InitAllocEntry(SpeedMeterAllocEntry* this, u32 maxval, u32 val, u16 backColor, u16 foreColor, u32 ulx,
u32 lrx, u32 uly, u32 lry) {
this->maxval = maxval;
this->val = val;
this->backColor = backColor;
this->foreColor = foreColor;
this->ulx = ulx;
this->lrx = lrx;
this->uly = uly;
this->lry = lry;
}
#pragma GLOBAL_ASM("asm/non_matchings/code/speed_meter/func_800CA104.s")
void SpeedMeter_DrawAllocEntry(SpeedMeterAllocEntry* this, GraphicsContext* gfxCtx) {
s32 usedOff;
View view;
Gfx* gfx;
Gfx* dispRefs[5];
Viewport viewport;
u32 pad2;
if (this->maxval == 0) {
osSyncPrintf(VT_FGCOL(RED));
LOG_NUM("this->maxval", this->maxval, "../speed_meter.c", 313);
osSyncPrintf(VT_RST);
} else {
Graph_OpenDisps(dispRefs, gfxCtx, "../speed_meter.c", 318);
View_Init(&view, gfxCtx);
view.flags = 0xA;
VIEWPORT_INIT(viewport, SCREEN_HEIGHT, SCREEN_WIDTH, 0, 0);
View_SetViewport(&view, &viewport);
gfx = gfxCtx->overlay.p;
func_800AB9EC(&view, 0xF, &gfx);
gDPPipeSync(gfx++);
gDPSetOtherMode(gfx++,
G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_FILL | G_PM_NPRIMITIVE,
G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2);
usedOff = ((this->lrx - this->ulx) * this->val) / this->maxval + this->ulx;
DrawRec(gfx++, this->backColor, usedOff, this->uly, this->lrx, this->lry);
DrawRec(gfx++, this->foreColor, this->ulx, this->uly, usedOff, this->lry);
gDPPipeSync(gfx++);
gfxCtx->overlay.p = gfx;
Graph_CloseDisps(dispRefs, gfxCtx, "../speed_meter.c", 339);
}
}
void SpeedMeter_DrawAllocEntries(SpeedMeter* meter, GraphicsContext* gfxCtx, GameState* state) {
u32 pad[2];
u32 ulx = 30;
u32 lrx = 290;
SpeedMeterAllocEntry entry;
u32 temp;
s32 y;
TwoHeadGfxArena* thga;
u32 zeldaFreeMax;
u32 zeldaFree;
u32 zeldaAlloc;
s32 sysFreeMax;
s32 sysFree;
s32 sysAlloc;
y = 212;
if (SREG(0) > 2) {
if (ZeldaArena_IsInitalized()) {
ZeldaArena_GetSizes(&zeldaFreeMax, &zeldaFree, &zeldaAlloc);
SpeedMeter_InitAllocEntry(&entry, zeldaFree + zeldaAlloc, zeldaAlloc, GPACK_RGBA5551(0x00, 0x00, 0xFF, 1),
GPACK_RGBA5551(0xFF, 0xFF, 0xFF, 1), ulx, lrx, y, y + 1);
SpeedMeter_DrawAllocEntry(&entry, gfxCtx);
y++;
y++;
}
}
if (SREG(0) > 1) {
SystemArena_GetSizes(&sysFreeMax, &sysFree, &sysAlloc);
SpeedMeter_InitAllocEntry(&entry, sysFree + sysAlloc - state->tha.size, sysAlloc - state->tha.size,
GPACK_RGBA5551(0x00, 0x00, 0xFF, 1), GPACK_RGBA5551(0xFF, 0x80, 0x80, 1), ulx, lrx, y,
y);
SpeedMeter_DrawAllocEntry(&entry, gfxCtx);
y++;
}
thga = (TwoHeadGfxArena*)&state->tha;
SpeedMeter_InitAllocEntry(&entry, thga->size, thga->size - THA_GetSize((TwoHeadArena*)thga),
GPACK_RGBA5551(0x00, 0x00, 0xFF, 1), GPACK_RGBA5551(0x00, 0xFF, 0x00, 1), ulx, lrx, y, y);
SpeedMeter_DrawAllocEntry(&entry, gfxCtx);
y++;
thga = &gfxCtx->polyOpa;
SpeedMeter_InitAllocEntry(&entry, thga->size, thga->size - THGA_GetSize(thga), GPACK_RGBA5551(0x00, 0x00, 0xFF, 1),
GPACK_RGBA5551(0xFF, 0x00, 0xFF, 1), ulx, lrx, y, y);
SpeedMeter_DrawAllocEntry(&entry, gfxCtx);
y++;
thga = &gfxCtx->polyXlu;
SpeedMeter_InitAllocEntry(&entry, thga->size, thga->size - THGA_GetSize(thga), GPACK_RGBA5551(0x00, 0x00, 0xFF, 1),
GPACK_RGBA5551(0xFF, 0xFF, 0x00, 1), ulx, lrx, y, y);
SpeedMeter_DrawAllocEntry(&entry, gfxCtx);
y++;
thga = &gfxCtx->overlay;
SpeedMeter_InitAllocEntry(&entry, thga->size, thga->size - THGA_GetSize(thga), GPACK_RGBA5551(0x00, 0x00, 0xFF, 1),
GPACK_RGBA5551(0xFF, 0x00, 0x00, 1), ulx, lrx, y, y);
SpeedMeter_DrawAllocEntry(&entry, gfxCtx);
y++;
}

View file

@ -1140,10 +1140,7 @@ void Gameplay_Draw(GlobalContext* globalCtx) {
View_Init(&view, gfxCtx);
view.flags = 2 | 8;
// clang-format off
viewport.bottomY = SCREEN_HEIGHT; viewport.rightX = SCREEN_WIDTH;
viewport.topY = 0; viewport.leftX = 0;
// clang-format on
VIEWPORT_INIT(viewport, SCREEN_HEIGHT, SCREEN_WIDTH, 0, 0);
View_SetViewport(&view, &viewport);
func_800AB9EC(&view, 15, &gfxP);

View file

@ -61,10 +61,7 @@ void Sample_SetupView(SampleContext* this) {
gfxCtx = this->state.gfxCtx;
View_Init(view, gfxCtx);
// clang-format off
viewport.bottomY = SCREEN_HEIGHT; viewport.rightX = SCREEN_WIDTH;
viewport.topY = 0; viewport.leftX = 0;
// clang-format on
VIEWPORT_INIT(viewport, SCREEN_HEIGHT, SCREEN_WIDTH, 0, 0);
View_SetViewport(view, &viewport);
func_800AA460(view, 60, 10, 12800);