Files
perfect-dark/src/game/game_176080.c
T
2022-07-02 22:09:48 +10:00

221 lines
5.5 KiB
C

#include <ultra64.h>
#include "constants.h"
#include "lib/sched.h"
#include "game/player.h"
#include "game/game_176080.h"
#include "game/mplayer/mplayer.h"
#include "game/options.h"
#include "bss.h"
#include "lib/vi.h"
#include "lib/memp.h"
#include "data.h"
#include "types.h"
u32 var800ab7c0;
u32 var800ab7c4;
u16 var800ab7c8[0x180];
u16 var800abac8[0x180];
u16 var800abdc8[0x180];
u16 *var800844f0 = NULL;
void *var800844f4 = NULL;
void *mblurGetAllocation(void)
{
return var800844f0;
}
void mblurReset(s32 stagenum)
{
var800844f0 = 0;
var800844f4 = 0;
if (stagenum != STAGE_TITLE) {
mblurAllocate();
}
}
void mblurAllocate(void)
{
if (IS4MB()) {
var800ab7c0 = 320;
if (g_Vars.normmplayerisrunning && PLAYERCOUNT() >= 2) {
var800ab7c4 = 110;
} else {
var800ab7c4 = 220;
}
} else {
var800ab7c0 = 640;
if (g_Vars.normmplayerisrunning && PLAYERCOUNT() >= 2) {
var800ab7c4 = 220;
} else {
var800ab7c4 = 220;
}
}
var800844f0 = mempAlloc(var800ab7c0 * var800ab7c4 * 2 + 0x40, MEMPOOL_STAGE);
var800844f0 = (void *)((u32)var800844f0 + 0x3f & ~0x3f);
var800844f4 = var800844f0;
}
void mblur0f176298(void)
{
var800844f4 = var800844f0;
}
Gfx *mblur0f1762ac(Gfx *gdl)
{
u32 subamount;
u32 addr;
if (g_Vars.normmplayerisrunning
&& (g_Vars.currentplayernum >= 2 || (PLAYERCOUNT() == 2 && g_Vars.currentplayernum == 1))) {
subamount = playerGetFbWidth() * playerGetFbHeight();
if (IS4MB() || optionsGetScreenSplit() == SCREENSPLIT_VERTICAL) {
subamount = 0;
}
} else {
subamount = 0;
}
addr = (u32)var800844f4 - subamount;
addr &= ~0x3f;
gDPPipeSync(gdl++);
gDPSetDepthImage(gdl++, addr);
return gdl;
}
Gfx *mblur0f1763f4(Gfx *gdl)
{
s32 left;
s32 right;
gDPPipeSync(gdl++);
gDPSetRenderMode(gdl++, G_RM_NOOP, G_RM_NOOP2);
gDPSetColorImage(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, viGetWidth(), OS_PHYSICAL_TO_K0(var800844f4));
gDPSetCycleType(gdl++, G_CYC_FILL);
gDPSetFillColor(gdl++, 0xfffcfffc);
gDPSetScissorFrac(gdl++, G_SC_NON_INTERLACE, 0, 0, playerGetFbWidth() * 4.0f, playerGetFbHeight() * 4.0f);
if (PLAYERCOUNT() <= 2) {
left = 0;
right = playerGetFbWidth() - 1;
} else if (g_Vars.currentplayernum == 0 || g_Vars.currentplayernum == 2) {
left = 0;
right = playerGetFbWidth() / 2 - 1;
} else {
left = playerGetFbWidth() / 2;
right = playerGetFbWidth() - 1;
}
gDPFillRectangle(gdl++, left, 0, right, playerGetFbHeight() - 1);
gDPPipeSync(gdl++);
return gdl;
}
u16 *mblur0f176668(s32 arg0)
{
u16 *addr;
if (arg0 == 0) {
addr = var800ab7c8;
}
if (arg0 == 1) {
addr = var800abac8;
}
if (arg0 == 2) {
addr = var800abdc8;
}
addr = (u16 *)(((u32)addr + 0x3f) & ~0x3f);
return addr;
}
Gfx *mblurRender(Gfx *gdl)
{
struct bootbufferthing *thing = bbufGetIndex0Buffer();
u32 stack;
u16 *sp4c = var800844f0;
u32 s4 = 0;
u16 *sp44;
u16 *s2;
u16 *image;
s32 i;
viGetBackBuffer();
sp44 = mblur0f176668(g_BootBufferIndex0);
g_BootBufferDirtyIndexes[g_BootBufferIndex0] = 1;
gDPPipeSync(gdl++);
gDPSetColorImage(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, viGetBufWidth(), OS_PHYSICAL_TO_K0(sp44));
gDPSetScissor(gdl++, G_SC_NON_INTERLACE, 0, 0, 320, 240);
gDPSetCycleType(gdl++, G_CYC_COPY);
gDPSetTile(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, 5, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPSetTile(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0080, 4, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPSetTile(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 160, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPSetTile(gdl++, G_IM_FMT_I, G_IM_SIZ_8b, 160, 0x0080, 1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, 15);
gSPTexture(gdl++, 0xffff, 0xffff, 0, G_TX_RENDERTILE, G_ON);
gDPSetEnvColor(gdl++, 0xff, 0xff, 0xff, 0xff);
gDPSetPrimColor(gdl++, 0, 0, 0xff, 0xff, 0xff, 0xff);
gDPSetRenderMode(gdl++, G_RM_NOOP, G_RM_NOOP2);
gDPSetCombineMode(gdl++, G_CC_DECALRGBA, G_CC_DECALRGBA);
gDPSetTextureFilter(gdl++, G_TF_POINT);
gDPSetTexturePersp(gdl++, G_TP_NONE);
gDPSetColorDither(gdl++, G_CD_DISABLE);
gDPSetAlphaDither(gdl++, G_AD_DISABLE);
gDPSetTextureLOD(gdl++, G_TL_TILE);
gDPSetTextureDetail(gdl++, G_TD_CLAMP);
gDPSetTextureLUT(gdl++, G_TT_NONE);
gDPSetAlphaCompare(gdl++, G_AC_NONE);
gSPClearGeometryMode(gdl++, G_ZBUFFER);
gDPTileSync(gdl++);
for (i = 0; i < 120; i++) {
if (1);
if (thing->unk00[0].unk00[i].unk00) {
s2 = &sp44[s4];
image = &sp4c[thing->unk00[0].unk00[i].unk0c.u16_1 * viGetWidth()];
gDPPipeSync(gdl++);
gDPSetTextureImage(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 320, image);
gDPLoadSync(gdl++);
gDPLoadBlock(gdl++, 5, 0, 0, viGetWidth() - 1, 0);
gDPPipeSync(gdl++);
gSPTextureRectangle(gdl++,
s4 << 2, 0,
(s4 + 3) << 2, 0,
G_TX_RENDERTILE, (thing->unk00[0].unk00[i].unk0c.u16_2 * 32) + 16, 0x0010, 0x1000, 0);
thing->unk00[0].unk00[i].unk0c.u16p = s2;
s4++;
if (s2);
}
}
gDPPipeSync(gdl++);
gDPLoadSync(gdl++);
gDPTileSync(gdl++);
gDPSetColorImage(gdl++, G_IM_FMT_RGBA, G_IM_SIZ_16b, viGetBufWidth(), OS_PHYSICAL_TO_K0(viGetBackBuffer()));
gDPSetScissorFrac(gdl++, G_SC_NON_INTERLACE, 0, 0, viGetWidth() * 4.0f, viGetHeight() * 4.0f);
gSPSetGeometryMode(gdl++, G_ZBUFFER);
gDPSetTextureFilter(gdl++, G_TF_BILERP);
gDPSetTexturePersp(gdl++, G_TP_PERSP);
gDPSetColorDither(gdl++, G_CD_BAYER);
if (sp44);
return gdl;
}