diff --git a/src/game/camera.c b/src/game/camera.c index 4ce409ec..9f9e068a 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -11802,12 +11802,6 @@ void rom_hack_cam_walk(Vec3f pos, Vec3f dir, f32 dist) { return; } - Vec3f prevPos = { - pos[0], - pos[1], - pos[2], - }; - // figure out dir normal Vec3f dirNorm; vec3f_copy(dirNorm, dir); diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 32d5af44..e0cb4030 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -42,7 +42,9 @@ #define MATRIX_STACK_SIZE 32 -#define MAX_PROJECTION_NEAR_VALUE 5 +f32 gProjectionMaxNearValue = 5; +s16 gProjectionVanillaNearValue = 100; +s16 gProjectionVanillaFarValue = 1000; s16 gMatStackIndex; Mat4 gMatStack[MATRIX_STACK_SIZE] = {}; @@ -224,7 +226,7 @@ void patch_mtx_interpolated(f32 delta) { if (sPerspectiveNode != NULL) { u16 perspNorm; f32 fovInterpolated = delta_interpolate_f32(sPerspectiveNode->prevFov, sPerspectiveNode->fov, delta); - f32 near = MIN(sPerspectiveNode->near, MAX_PROJECTION_NEAR_VALUE); + f32 near = MIN(sPerspectiveNode->near, gProjectionMaxNearValue); guPerspective(sPerspectiveMtx, &perspNorm, not_zero(fovInterpolated, gOverrideFOV), sPerspectiveAspect, not_zero(near, gOverrideNear), not_zero(sPerspectiveNode->far, gOverrideFar), 1.0f); gSPMatrix(sPerspectivePos, VIRTUAL_TO_PHYSICAL(sPerspectiveNode), G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH); } @@ -459,7 +461,9 @@ static void geo_process_perspective(struct GraphNodePerspective *node) { f32 aspect = (f32) gCurGraphNodeRoot->width / divisor; #endif - f32 near = MIN(node->near, MAX_PROJECTION_NEAR_VALUE); + gProjectionVanillaNearValue = node->near; + gProjectionVanillaFarValue = node->far; + f32 near = MIN(node->near, gProjectionMaxNearValue); guPerspective(mtx, &perspNorm, not_zero(node->prevFov, gOverrideFOV), aspect, not_zero(near, gOverrideNear), not_zero(node->far, gOverrideFar), 1.0f); sPerspectiveNode = node; diff --git a/src/game/rendering_graph_node.h b/src/game/rendering_graph_node.h index 4c135228..625df498 100644 --- a/src/game/rendering_graph_node.h +++ b/src/game/rendering_graph_node.h @@ -5,6 +5,10 @@ #include "engine/graph_node.h" +extern f32 gProjectionMaxNearValue; +extern s16 gProjectionVanillaNearValue; +extern s16 gProjectionVanillaFarValue; + extern struct GraphNodeRoot *gCurGraphNodeRoot; extern struct GraphNodeMasterList *gCurGraphNodeMasterList; extern struct GraphNodePerspective *gCurGraphNodeCamFrustum; diff --git a/src/pc/controller/controller_keyboard_debug.c b/src/pc/controller/controller_keyboard_debug.c index 09a72e58..bc8bcdff 100644 --- a/src/pc/controller/controller_keyboard_debug.c +++ b/src/pc/controller/controller_keyboard_debug.c @@ -15,8 +15,8 @@ #include "pc/lua/smlua.h" #include "pc/network/socket/socket.h" - static bool sHoldingAlt = false; +static bool sHoldingShift = false; #define SCANCODE_0 0x0B #define SCANCODE_1 0x02 @@ -30,6 +30,7 @@ static bool sHoldingAlt = false; #define SCANCODE_9 0x0A #define SCANCODE_F5 0x3f #define SCANCODE_ALT 0x38 +#define SCANCODE_SHIFT 0x2A static void debug_breakpoint_here(void) { // create easy breakpoint position for debugging @@ -96,6 +97,7 @@ void debug_keyboard_on_key_down(int scancode) { if (gNetworkSystem == &gNetworkSystemSocket) { switch (scancode & 0xFF) { case SCANCODE_ALT: sHoldingAlt = true; break; + case SCANCODE_SHIFT: sHoldingShift = true; break; case SCANCODE_3: debug_breakpoint_here(); break; #ifdef DEVELOPMENT case SCANCODE_1: if (sHoldingAlt) { debug_warp_level1(); } break; @@ -114,6 +116,7 @@ void debug_keyboard_on_key_up(int scancode) { if (gNetworkSystem == &gNetworkSystemSocket) { switch (scancode & 0xFF) { case SCANCODE_ALT: sHoldingAlt = false; break; + case SCANCODE_SHIFT: sHoldingShift = false; break; } } } diff --git a/src/pc/gfx/gfx_pc.c b/src/pc/gfx/gfx_pc.c index 7abc8227..dfd63048 100644 --- a/src/pc/gfx/gfx_pc.c +++ b/src/pc/gfx/gfx_pc.c @@ -28,6 +28,8 @@ #include "macros.h" +#include "game/rendering_graph_node.h" + #define SUPPORT_CHECK(x) assert(x) // SCALE_M_N: upscale/downscale M-bit integer to N-bit @@ -171,6 +173,10 @@ static size_t buf_vbo_num_tris; static struct GfxWindowManagerAPI *gfx_wapi; static struct GfxRenderingAPI *gfx_rapi; +static f32 sDepthZAdd = 0; +static f32 sDepthZMult = 1; +static f32 sDepthZSub = 0; + // 4x4 pink-black checkerboard texture to indicate missing textures #define MISSING_W 4 #define MISSING_H 4 @@ -866,8 +872,13 @@ static void OPTIMIZE_O3 gfx_sp_vertex(size_t n_vertices, size_t dest_index, cons if (winv < 0.0f) { winv = 32767.0f; } - + + z -= sDepthZSub; + z *= sDepthZMult; + z += sDepthZAdd; + float fog_z = z * winv * rsp.fog_mul + rsp.fog_offset; + if (fog_z < 0) fog_z = 0; if (fog_z > 255) fog_z = 255; d->color.a = fog_z; // Use alpha variable to store fog factor @@ -1182,6 +1193,12 @@ static void gfx_sp_moveword(uint8_t index, UNUSED uint16_t offset, uint32_t data case G_MW_FOG: rsp.fog_mul = (int16_t)(data >> 16); rsp.fog_offset = (int16_t)data; + + // Alter depth buffer to deal with new near plane + sDepthZAdd = (gProjectionMaxNearValue - gProjectionVanillaNearValue) + gProjectionMaxNearValue; + sDepthZMult = (gProjectionVanillaFarValue - gProjectionMaxNearValue) / (gProjectionVanillaFarValue - gProjectionVanillaNearValue); + sDepthZSub = gProjectionVanillaNearValue; + break; } }