fae0beef创建于 7月26日历史提交
// BanjoDecomp: depthbuffer.c
#include "core1/core1.h"
#include "functions.h"
#include "variables.h"
#include <ultra64.h>

#include <libultra/convert.h>

struct {
    u16 *data;
    bool unk4;
} sDepthBuffer;

void depthbuffer_clear(Gfx **gfx) {
    depthbuffer_clearRegion(gfx, 0, 0, gFramebufferWidth, gFramebufferHeight, gFramebuffers[getActiveFramebuffer()]);
}

void depthbuffer_clearRegion(Gfx **gfx, s32 x, s32 y, s32 w, s32 h, void *color_buffer) {
    if ((sDepthBuffer.data != NULL) && ((getGameMode() != GAME_MODE_4_PAUSED) || gsworld_getEnableDraw())) {
        gDPPipeSync((*gfx)++);
        gDPSetColorImage((*gfx)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, gFramebufferWidth, OS_K0_TO_PHYSICAL(sDepthBuffer.data));
        gDPSetCycleType((*gfx)++, G_CYC_FILL);
        gDPSetRenderMode((*gfx)++, G_RM_NOOP, G_RM_NOOP2);
        gDPSetFillColor((*gfx)++, (GPACK_ZDZ(G_MAXFBZ, 0) << 16) | GPACK_ZDZ(G_MAXFBZ, 0));
        gDPScisFillRectangle((*gfx)++, x, y, x + w - 1, y + h - 1);

        gDPPipeSync((*gfx)++);
        gDPSetColorImage((*gfx)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, gFramebufferWidth, OS_K0_TO_PHYSICAL(color_buffer));
    }
}

bool depthbuffer_getUnk4(void) {
    return sDepthBuffer.unk4;
}

bool depthbuffer_isDataPtrSet(void) {
    return sDepthBuffer.data != NULL;
}

void depthbuffer_stub(void) {}

void depthbuffer_enable(bool enable) {
    u16 *var_v0;

    if (enable) {
        sDepthBuffer.data = (u16 *) D_8000E800;

        var_v0 = sDepthBuffer.data;
        while (((uintptr_t) sDepthBuffer.data) % 64) { // [port] pointer-width
            sDepthBuffer.data = var_v0 + 1;
            var_v0 = sDepthBuffer.data;
        }
        
        do { } while ((D_8000E800 && 1) * 0); //remove this
    } else {
        sDepthBuffer.data = NULL;
    }

    sDepthBuffer.unk4 = FALSE;
}

void depthbuffer_setUnk4(bool value) {
    sDepthBuffer.unk4 = sDepthBuffer.data && value;
}

void depthbuffer_set(Gfx **gfx) {
    if (sDepthBuffer.data && getGameMode() != GAME_MODE_4_PAUSED) {
        gDPPipeSync((*gfx)++);
        gDPSetDepthImage((*gfx)++, sDepthBuffer.data);
    }
}

void *depthbuffer_getDataPtr(void) {
    return sDepthBuffer.data;
}