mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-22 20:15:17 +00:00
Alter fog depth to deal with new near plane value
This commit is contained in:
parent
503a6fcfe1
commit
1fec13a0cb
5 changed files with 33 additions and 11 deletions
|
@ -11802,12 +11802,6 @@ void rom_hack_cam_walk(Vec3f pos, Vec3f dir, f32 dist) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec3f prevPos = {
|
|
||||||
pos[0],
|
|
||||||
pos[1],
|
|
||||||
pos[2],
|
|
||||||
};
|
|
||||||
|
|
||||||
// figure out dir normal
|
// figure out dir normal
|
||||||
Vec3f dirNorm;
|
Vec3f dirNorm;
|
||||||
vec3f_copy(dirNorm, dir);
|
vec3f_copy(dirNorm, dir);
|
||||||
|
|
|
@ -42,7 +42,9 @@
|
||||||
|
|
||||||
#define MATRIX_STACK_SIZE 32
|
#define MATRIX_STACK_SIZE 32
|
||||||
|
|
||||||
#define MAX_PROJECTION_NEAR_VALUE 5
|
f32 gProjectionMaxNearValue = 5;
|
||||||
|
s16 gProjectionVanillaNearValue = 100;
|
||||||
|
s16 gProjectionVanillaFarValue = 1000;
|
||||||
|
|
||||||
s16 gMatStackIndex;
|
s16 gMatStackIndex;
|
||||||
Mat4 gMatStack[MATRIX_STACK_SIZE] = {};
|
Mat4 gMatStack[MATRIX_STACK_SIZE] = {};
|
||||||
|
@ -224,7 +226,7 @@ void patch_mtx_interpolated(f32 delta) {
|
||||||
if (sPerspectiveNode != NULL) {
|
if (sPerspectiveNode != NULL) {
|
||||||
u16 perspNorm;
|
u16 perspNorm;
|
||||||
f32 fovInterpolated = delta_interpolate_f32(sPerspectiveNode->prevFov, sPerspectiveNode->fov, delta);
|
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);
|
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);
|
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;
|
f32 aspect = (f32) gCurGraphNodeRoot->width / divisor;
|
||||||
#endif
|
#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);
|
guPerspective(mtx, &perspNorm, not_zero(node->prevFov, gOverrideFOV), aspect, not_zero(near, gOverrideNear), not_zero(node->far, gOverrideFar), 1.0f);
|
||||||
|
|
||||||
sPerspectiveNode = node;
|
sPerspectiveNode = node;
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
|
|
||||||
#include "engine/graph_node.h"
|
#include "engine/graph_node.h"
|
||||||
|
|
||||||
|
extern f32 gProjectionMaxNearValue;
|
||||||
|
extern s16 gProjectionVanillaNearValue;
|
||||||
|
extern s16 gProjectionVanillaFarValue;
|
||||||
|
|
||||||
extern struct GraphNodeRoot *gCurGraphNodeRoot;
|
extern struct GraphNodeRoot *gCurGraphNodeRoot;
|
||||||
extern struct GraphNodeMasterList *gCurGraphNodeMasterList;
|
extern struct GraphNodeMasterList *gCurGraphNodeMasterList;
|
||||||
extern struct GraphNodePerspective *gCurGraphNodeCamFrustum;
|
extern struct GraphNodePerspective *gCurGraphNodeCamFrustum;
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
#include "pc/lua/smlua.h"
|
#include "pc/lua/smlua.h"
|
||||||
#include "pc/network/socket/socket.h"
|
#include "pc/network/socket/socket.h"
|
||||||
|
|
||||||
|
|
||||||
static bool sHoldingAlt = false;
|
static bool sHoldingAlt = false;
|
||||||
|
static bool sHoldingShift = false;
|
||||||
|
|
||||||
#define SCANCODE_0 0x0B
|
#define SCANCODE_0 0x0B
|
||||||
#define SCANCODE_1 0x02
|
#define SCANCODE_1 0x02
|
||||||
|
@ -30,6 +30,7 @@ static bool sHoldingAlt = false;
|
||||||
#define SCANCODE_9 0x0A
|
#define SCANCODE_9 0x0A
|
||||||
#define SCANCODE_F5 0x3f
|
#define SCANCODE_F5 0x3f
|
||||||
#define SCANCODE_ALT 0x38
|
#define SCANCODE_ALT 0x38
|
||||||
|
#define SCANCODE_SHIFT 0x2A
|
||||||
|
|
||||||
static void debug_breakpoint_here(void) {
|
static void debug_breakpoint_here(void) {
|
||||||
// create easy breakpoint position for debugging
|
// create easy breakpoint position for debugging
|
||||||
|
@ -96,6 +97,7 @@ void debug_keyboard_on_key_down(int scancode) {
|
||||||
if (gNetworkSystem == &gNetworkSystemSocket) {
|
if (gNetworkSystem == &gNetworkSystemSocket) {
|
||||||
switch (scancode & 0xFF) {
|
switch (scancode & 0xFF) {
|
||||||
case SCANCODE_ALT: sHoldingAlt = true; break;
|
case SCANCODE_ALT: sHoldingAlt = true; break;
|
||||||
|
case SCANCODE_SHIFT: sHoldingShift = true; break;
|
||||||
case SCANCODE_3: debug_breakpoint_here(); break;
|
case SCANCODE_3: debug_breakpoint_here(); break;
|
||||||
#ifdef DEVELOPMENT
|
#ifdef DEVELOPMENT
|
||||||
case SCANCODE_1: if (sHoldingAlt) { debug_warp_level1(); } break;
|
case SCANCODE_1: if (sHoldingAlt) { debug_warp_level1(); } break;
|
||||||
|
@ -114,6 +116,7 @@ void debug_keyboard_on_key_up(int scancode) {
|
||||||
if (gNetworkSystem == &gNetworkSystemSocket) {
|
if (gNetworkSystem == &gNetworkSystemSocket) {
|
||||||
switch (scancode & 0xFF) {
|
switch (scancode & 0xFF) {
|
||||||
case SCANCODE_ALT: sHoldingAlt = false; break;
|
case SCANCODE_ALT: sHoldingAlt = false; break;
|
||||||
|
case SCANCODE_SHIFT: sHoldingShift = false; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
|
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
|
||||||
|
#include "game/rendering_graph_node.h"
|
||||||
|
|
||||||
#define SUPPORT_CHECK(x) assert(x)
|
#define SUPPORT_CHECK(x) assert(x)
|
||||||
|
|
||||||
// SCALE_M_N: upscale/downscale M-bit integer to N-bit
|
// 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 GfxWindowManagerAPI *gfx_wapi;
|
||||||
static struct GfxRenderingAPI *gfx_rapi;
|
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
|
// 4x4 pink-black checkerboard texture to indicate missing textures
|
||||||
#define MISSING_W 4
|
#define MISSING_W 4
|
||||||
#define MISSING_H 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) {
|
if (winv < 0.0f) {
|
||||||
winv = 32767.0f;
|
winv = 32767.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
z -= sDepthZSub;
|
||||||
|
z *= sDepthZMult;
|
||||||
|
z += sDepthZAdd;
|
||||||
|
|
||||||
float fog_z = z * winv * rsp.fog_mul + rsp.fog_offset;
|
float fog_z = z * winv * rsp.fog_mul + rsp.fog_offset;
|
||||||
|
|
||||||
if (fog_z < 0) fog_z = 0;
|
if (fog_z < 0) fog_z = 0;
|
||||||
if (fog_z > 255) fog_z = 255;
|
if (fog_z > 255) fog_z = 255;
|
||||||
d->color.a = fog_z; // Use alpha variable to store fog factor
|
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:
|
case G_MW_FOG:
|
||||||
rsp.fog_mul = (int16_t)(data >> 16);
|
rsp.fog_mul = (int16_t)(data >> 16);
|
||||||
rsp.fog_offset = (int16_t)data;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue