diff options
| author | Garrett Cox <garrettjcox@gmail.com> | 2024-08-09 15:42:34 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-09 16:42:34 -0400 |
| commit | 4a57bdbc5f429feacad94c06e3a05967f374fb70 (patch) | |
| tree | aade9f7e13d6b60845361a52a6675b44b73b0888 /mm/src/code | |
| parent | 0ec23b34ba71f410c04a28fc89a255a23adceebe (diff) | |
Add widescreen actor culling option (#652)
Diffstat (limited to 'mm/src/code')
| -rw-r--r-- | mm/src/code/z_actor.c | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/mm/src/code/z_actor.c b/mm/src/code/z_actor.c index 2a967694b..8be769e81 100644 --- a/mm/src/code/z_actor.c +++ b/mm/src/code/z_actor.c @@ -23,6 +23,7 @@ #include <string.h> #include "2s2h/Enhancements/FrameInterpolation/FrameInterpolation.h" #include "2s2h/Enhancements/GameInteractor/GameInteractor.h" +#include "2s2h/BenPort.h" // bss // FaultClient sActorFaultClient; // 2 funcs @@ -3084,24 +3085,38 @@ void Ship_CalcShouldDrawAndUpdate(PlayState* play, Actor* actor, Vec3f* projecte (projectedPos->z < ((actor->uncullZoneForward * drawMulti) + (actor->uncullZoneScale * drawMulti))); if (updateCheck || drawCheck) { - f32 phi_f12; - f32 phi_f2 = CLAMP_MIN(projectedW, 1.0f); - f32 phi_f14; - f32 phi_f16; + // Ensure the projected W value is at least 1.0 + f32 clampedProjectedW = CLAMP_MIN(projectedW, 1.0f); + f32 uncullZoneScaleDiagonal; + f32 uncullZoneScaleVertical; + f32 uncullZoneDownwardAdjusted; + // Adjust calculations if the field of view is not the default 60 degrees if (play->view.fovy != 60.0f) { - phi_f12 = actor->uncullZoneScale * play->projectionMtxFDiagonal.x * 0.76980036f; // sqrt(16/27) + uncullZoneScaleDiagonal = + 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; + uncullZoneScaleVertical = play->projectionMtxFDiagonal.y * 0.57735026f; // 1 / sqrt(3) + uncullZoneDownwardAdjusted = actor->uncullZoneScale * uncullZoneScaleVertical; + uncullZoneScaleVertical *= actor->uncullZoneDownward; } else { - phi_f16 = phi_f12 = actor->uncullZoneScale; - phi_f14 = actor->uncullZoneDownward; + uncullZoneDownwardAdjusted = uncullZoneScaleDiagonal = actor->uncullZoneScale; + uncullZoneScaleVertical = actor->uncullZoneDownward; } - if (((fabsf(projectedPos->x) - phi_f12) < phi_f2) && ((-phi_f2 < (projectedPos->y + phi_f14))) && - ((projectedPos->y - phi_f16) < phi_f2)) { + if (CVarGetInteger("gEnhancements.Graphics.ActorCullingAccountsForWidescreen", 0)) { + float originalAspectRatio = 4.0f / 3.0f; + float currentAspectRatio = OTRGetAspectRatio(); + float aspectRatioMultiplier = MAX(currentAspectRatio / originalAspectRatio, 1.0f); + + clampedProjectedW *= aspectRatioMultiplier; + } + + bool isWithinHorizontalCullZone = ((fabsf(projectedPos->x) - uncullZoneScaleDiagonal) < clampedProjectedW); + bool isAboveBottomOfCullZone = ((-clampedProjectedW < (projectedPos->y + uncullZoneScaleVertical))); + bool isBelowTopOfCullZone = ((projectedPos->y - uncullZoneDownwardAdjusted) < clampedProjectedW); + + if (isWithinHorizontalCullZone && isAboveBottomOfCullZone && isBelowTopOfCullZone) { *shouldDraw = drawCheck; *shouldUpdate = updateCheck; } @@ -3148,7 +3163,8 @@ void Actor_DrawAll(PlayState* play, ActorContext* actorCtx) { bool shipShouldDraw = false; bool shipShouldUpdate = false; if (CVarGetInteger("gEnhancements.Graphics.IncreaseActorDrawDistance", 1) > 1 || - CVarGetInteger("gEnhancements.Graphics.IncreaseActorUpdateDistance", 1) > 1) { + CVarGetInteger("gEnhancements.Graphics.IncreaseActorUpdateDistance", 1) > 1 || + CVarGetInteger("gEnhancements.Graphics.ActorCullingAccountsForWidescreen", 0)) { Ship_CalcShouldDrawAndUpdate(play, actor, &actor->projectedPos, actor->projectedW, &shipShouldDraw, &shipShouldUpdate); |
