mirror of
				https://github.com/Zelda64Recomp/Zelda64Recomp.git
				synced 2025-10-30 08:03:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			158 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "patches.h"
 | 
						|
 | 
						|
// Disable frustum culling for actors, but leave distance culling intact
 | 
						|
s32 func_800BA2FC(PlayState* play, Actor* actor, Vec3f* projectedPos, f32 projectedW) {
 | 
						|
    if ((-actor->uncullZoneScale < projectedPos->z) &&
 | 
						|
        (projectedPos->z < (actor->uncullZoneForward + actor->uncullZoneScale))) {
 | 
						|
        // f32 phi_f12;
 | 
						|
        // f32 phi_f2 = CLAMP_MIN(projectedW, 1.0f);
 | 
						|
        // f32 phi_f14;
 | 
						|
        // f32 phi_f16;
 | 
						|
 | 
						|
        // if (play->view.fovy != 60.0f) {
 | 
						|
        //     phi_f12 = actor->uncullZoneScale * play->projectionMtxFDiagonal.x * 0.76980036f; // sqrt(16/27)
 | 
						|
 | 
						|
        //     phi_f14 = play->projectionMtxFDiagonal.y * 0.57735026f; // 1 / sqrt(3)
 | 
						|
        //     phi_f16 = actor->uncullZoneScale * phi_f14;
 | 
						|
        //     phi_f14 *= actor->uncullZoneDownward;
 | 
						|
        // } else {
 | 
						|
        //     phi_f16 = phi_f12 = actor->uncullZoneScale;
 | 
						|
        //     phi_f14 = actor->uncullZoneDownward;
 | 
						|
        // }
 | 
						|
 | 
						|
        // if (((fabsf(projectedPos->x) - phi_f12) < phi_f2) && ((-phi_f2 < (projectedPos->y + phi_f14))) &&
 | 
						|
        //     ((projectedPos->y - phi_f16) < phi_f2)) {
 | 
						|
            return true;
 | 
						|
        // }
 | 
						|
    }
 | 
						|
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
// Disable frustum culling for bush spawning
 | 
						|
// s32 EnWood02_SpawnZoneCheck(EnWood02* this, PlayState* play, Vec3f* arg2) {
 | 
						|
//     f32 phi_f12;
 | 
						|
 | 
						|
//     SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, arg2, &this->actor.projectedPos, &this->actor.projectedW);
 | 
						|
 | 
						|
//     if (this->actor.projectedW == 0.0f) {
 | 
						|
//         phi_f12 = 1000.0f;
 | 
						|
//     } else {
 | 
						|
//         phi_f12 = fabsf(1.0f / this->actor.projectedW);
 | 
						|
//     }
 | 
						|
 | 
						|
//     if (((-this->actor.uncullZoneScale < this->actor.projectedPos.z) &&
 | 
						|
//          (this->actor.projectedPos.z < (this->actor.uncullZoneForward + this->actor.uncullZoneScale)) /* &&
 | 
						|
//          (((fabsf(this->actor.projectedPos.x) - this->actor.uncullZoneScale) * phi_f12) < 1.0f)) &&
 | 
						|
//         (((this->actor.projectedPos.y + this->actor.uncullZoneDownward) * phi_f12) > -1.0f) &&
 | 
						|
//         (((this->actor.projectedPos.y - this->actor.uncullZoneScale) * phi_f12) < 1.0f */)) {
 | 
						|
//         return true;
 | 
						|
//     }
 | 
						|
//     return false;
 | 
						|
// }
 | 
						|
 | 
						|
// Disable frustum culling for grass
 | 
						|
s32 func_809A9110(PlayState* play, Vec3f* pos) {
 | 
						|
    f32 w;
 | 
						|
    Vec3f projectedPos;
 | 
						|
 | 
						|
    SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, pos, &projectedPos, &w);
 | 
						|
 | 
						|
    if ((play->projectionMtxFDiagonal.z * -130.13191f) < projectedPos.z) {
 | 
						|
        if (w < 1.0f) {
 | 
						|
            w = 1.0f;
 | 
						|
        }
 | 
						|
 | 
						|
        // if (((fabsf(projectedPos.x) - (130.13191f * play->projectionMtxFDiagonal.x)) < w) &&
 | 
						|
        //     ((fabsf(projectedPos.y) - (130.13191f * play->projectionMtxFDiagonal.y)) < w)) {
 | 
						|
            return true;
 | 
						|
        // }
 | 
						|
    }
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
// Replace point light glow effect with RT64 point Z test so it works in widescreen
 | 
						|
 | 
						|
void Lights_GlowCheck(PlayState* play) {
 | 
						|
    LightNode* light = play->lightCtx.listHead;
 | 
						|
 | 
						|
    while (light != NULL) {
 | 
						|
        LightPoint* params = &light->info->params.point;
 | 
						|
 | 
						|
        if (light->info->type == LIGHT_POINT_GLOW) {
 | 
						|
            Vec3f worldPos;
 | 
						|
            Vec3f projectedPos;
 | 
						|
            f32 invW;
 | 
						|
 | 
						|
            worldPos.x = params->x;
 | 
						|
            worldPos.y = params->y;
 | 
						|
            worldPos.z = params->z;
 | 
						|
            Actor_GetProjectedPos(play, &worldPos, &projectedPos, &invW);
 | 
						|
 | 
						|
            params->drawGlow = 0;
 | 
						|
 | 
						|
            // @recomp Enable glow as long as the projected Z position is valid to enable widescreen support.
 | 
						|
            // The depth check will be handled via the vertex Z test extended gbi command.
 | 
						|
            if ((projectedPos.z > 1)) {
 | 
						|
                params->drawGlow = 1;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        light = light->next;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
extern Gfx gameplay_keep_DL_029CB0[];
 | 
						|
extern Gfx gameplay_keep_DL_029CF0[];
 | 
						|
 | 
						|
Vtx light_test_vert = VTX(0, 0, 0,  0, 0,  0xFF, 0xFF, 0xFF, 0xFF);
 | 
						|
 | 
						|
void Lights_DrawGlow(PlayState* play) {
 | 
						|
    Gfx* dl;
 | 
						|
    LightPoint* params;
 | 
						|
    LightNode* light = play->lightCtx.listHead;
 | 
						|
 | 
						|
    if (light != NULL) {
 | 
						|
        OPEN_DISPS(play->state.gfxCtx);
 | 
						|
 | 
						|
        dl = Gfx_SetupDL65_NoCD(POLY_XLU_DISP);
 | 
						|
 | 
						|
        gDPSetDither(dl++, G_CD_NOISE);
 | 
						|
 | 
						|
        gDPSetCombineLERP(dl++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
 | 
						|
                          0);
 | 
						|
 | 
						|
        gSPDisplayList(dl++, gameplay_keep_DL_029CB0);
 | 
						|
 | 
						|
        do {
 | 
						|
            if (light->info->type == LIGHT_POINT_GLOW) {
 | 
						|
                params = &light->info->params.point;
 | 
						|
                if (params->drawGlow) {
 | 
						|
                    f32 scale = SQ((f32)params->radius) * 2e-6f;
 | 
						|
 | 
						|
                    gDPSetPrimColor(dl++, 0, 0, params->color[0], params->color[1], params->color[2], 50);
 | 
						|
 | 
						|
                    Matrix_Translate(params->x, params->y, params->z, MTXMODE_NEW);
 | 
						|
                    Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
 | 
						|
 | 
						|
                    gSPMatrix(dl++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); // <--- Made these use the right DL pointer
 | 
						|
 | 
						|
                    // @recomp Use the vertex Z test to prevent drawing the glow if the depth check fails.
 | 
						|
                    // This replaces the normal Z buffer read in a way that supports widescreen and isn't 1 frame out of date.
 | 
						|
                    gSPVertex(dl++, &light_test_vert, 1, 0);
 | 
						|
                    gEXVertexZTest(dl++, 0);
 | 
						|
 
 | 
						|
                    gSPDisplayList(dl++, gameplay_keep_DL_029CF0);
 | 
						|
                    
 | 
						|
                    gEXEndVertexZTest(dl++);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            light = light->next;
 | 
						|
        } while (light != NULL);
 | 
						|
 | 
						|
        POLY_XLU_DISP = dl;
 | 
						|
 | 
						|
        CLOSE_DISPS(play->state.gfxCtx);
 | 
						|
    }
 | 
						|
}
 |