From 3d67ac4630f7a3836c2ef667f937a80093330156 Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Thu, 11 Mar 2021 22:17:53 +0700 Subject: [PATCH] Fix clipping --- src/DepthBufferRender/ClipPolygon.cpp | 80 ++++++++++++++++++--------- src/DisplayWindow.h | 6 +- src/gSP.cpp | 6 +- 3 files changed, 61 insertions(+), 31 deletions(-) diff --git a/src/DepthBufferRender/ClipPolygon.cpp b/src/DepthBufferRender/ClipPolygon.cpp index b45a3cc1..5183f39e 100644 --- a/src/DepthBufferRender/ClipPolygon.cpp +++ b/src/DepthBufferRender/ClipPolygon.cpp @@ -28,6 +28,7 @@ #include "gSP.h" #include "Combiner.h" #include "ClipPolygon.h" +#include "DisplayWindow.h" /* * vbp is a pointer to a vertex array. The first 3 vertices in that @@ -289,6 +290,7 @@ void clipInHomogeneousSpace(SPVertex * _pVertices, std::vector & _vRes const bool usesColor = pCurrCmb->usesShade(); const bool usesTexture = pCurrCmb->usesTexture(); const float wScale = static_cast(gSP.clipRatio); + const float xScale = dwnd().getAdjustScale(); auto clipVertex = [usesColor, usesTexture](SPVertex const* src, SPVertex * dst, float t) { @@ -363,10 +365,10 @@ void clipInHomogeneousSpace(SPVertex * _pVertices, std::vector & _vRes switch (_clipPlane) { case 1: - visible = -pVertex->w * wScale <= pVertex->x; + visible = -pVertex->w * wScale <= pVertex->x * xScale; break; case 2: - visible = pVertex->x <= pVertex->w * wScale; + visible = pVertex->x * xScale <= pVertex->w * wScale; break; case 3: visible = -pVertex->w * wScale <= pVertex->y; @@ -402,36 +404,49 @@ void clipInHomogeneousSpace(SPVertex * _pVertices, std::vector & _vRes SPVertex *Vertex3 = _pVertices + fifocp; float t1, t2; + const float scaledW1 = Vertex1->w * wScale; + const float scaledW2 = Vertex2->w * wScale; + const float scaledW3 = Vertex3->w * wScale; switch (_clipPlane) { case 1: - t1 = (Vertex1->x + Vertex1->w * wScale) / (Vertex1->x - Vertex3->x + Vertex1->w * wScale - Vertex3->w * wScale); - t2 = (Vertex2->x + Vertex2->w * wScale) / (Vertex2->x - Vertex3->x + Vertex2->w * wScale - Vertex3->w * wScale); + { + const float scaledX1 = Vertex1->x * xScale; + const float scaledX2 = Vertex2->x * xScale; + const float scaledX3 = Vertex3->x * xScale; + t1 = (scaledX1 + scaledW1) / (scaledX1 - scaledX3 + scaledW1 - scaledW3); + t2 = (scaledX2 + scaledW2) / (scaledX2 - scaledX3 + scaledW2 - scaledW3); + } break; case 2: - t1 = (Vertex1->x - Vertex1->w * wScale) / (Vertex1->x - Vertex3->x - Vertex1->w * wScale + Vertex3->w * wScale); - t2 = (Vertex2->x - Vertex2->w * wScale) / (Vertex2->x - Vertex3->x - Vertex2->w * wScale + Vertex3->w * wScale); + { + const float scaledX1 = Vertex1->x * xScale; + const float scaledX2 = Vertex2->x * xScale; + const float scaledX3 = Vertex3->x * xScale; + t1 = (scaledX1 - scaledW1) / (scaledX1 - scaledX3 - scaledW1 + scaledW3); + t2 = (scaledX2 - scaledW2) / (scaledX2 - scaledX3 - scaledW2 + scaledW3); + } break; case 3: - t1 = (Vertex1->y + Vertex1->w * wScale) / (Vertex1->y - Vertex3->y + Vertex1->w * wScale - Vertex3->w * wScale); - t2 = (Vertex2->y + Vertex2->w * wScale) / (Vertex2->y - Vertex3->y + Vertex2->w * wScale - Vertex3->w * wScale); + t1 = (Vertex1->y + scaledW1) / (Vertex1->y - Vertex3->y + scaledW1 - scaledW3); + t2 = (Vertex2->y + scaledW2) / (Vertex2->y - Vertex3->y + scaledW2 - scaledW3); break; case 4: - t1 = (Vertex1->y - Vertex1->w * wScale) / (Vertex1->y - Vertex3->y - Vertex1->w * wScale + Vertex3->w * wScale); - t2 = (Vertex2->y - Vertex2->w * wScale) / (Vertex2->y - Vertex3->y - Vertex2->w * wScale + Vertex3->w * wScale); + t1 = (Vertex1->y - scaledW1) / (Vertex1->y - Vertex3->y - scaledW1 + scaledW3); + t2 = (Vertex2->y - scaledW2) / (Vertex2->y - Vertex3->y - scaledW2 + scaledW3); break; case 5: - t1 = (Vertex1->z + Vertex1->w * wScale) / (Vertex1->z - Vertex3->z + Vertex1->w * wScale - Vertex3->w * wScale); - t2 = (Vertex2->z + Vertex2->w * wScale) / (Vertex2->z - Vertex3->z + Vertex2->w * wScale - Vertex3->w * wScale); + t1 = (Vertex1->z + scaledW1) / (Vertex1->z - Vertex3->z + scaledW1 - scaledW3); + t2 = (Vertex2->z + scaledW2) / (Vertex2->z - Vertex3->z + scaledW2 - scaledW3); break; case 6: - t1 = (Vertex1->z - Vertex1->w * wScale) / (Vertex1->z - Vertex3->z - Vertex1->w * wScale + Vertex3->w * wScale); - t2 = (Vertex2->z - Vertex2->w * wScale) / (Vertex2->z - Vertex3->z - Vertex2->w * wScale + Vertex3->w * wScale); + t1 = (Vertex1->z - scaledW1) / (Vertex1->z - Vertex3->z - scaledW1 + scaledW3); + t2 = (Vertex2->z - scaledW2) / (Vertex2->z - Vertex3->z - scaledW2 + scaledW3); break; } @@ -453,36 +468,49 @@ void clipInHomogeneousSpace(SPVertex * _pVertices, std::vector & _vRes SPVertex *NewVertex3 = NewVertices + fbcp; float t1, t2; + const float scaledW1 = Vertex1->w * wScale; + const float scaledW2 = Vertex2->w * wScale; + const float scaledW3 = Vertex3->w * wScale; switch (_clipPlane) { case 1: - t1 = (Vertex3->x + Vertex3->w * wScale) / (Vertex3->x - Vertex1->x + Vertex3->w * wScale - Vertex1->w * wScale); - t2 = (Vertex3->x + Vertex3->w * wScale) / (Vertex3->x - Vertex2->x + Vertex3->w * wScale - Vertex2->w * wScale); + { + const float scaledX1 = Vertex1->x * xScale; + const float scaledX2 = Vertex2->x * xScale; + const float scaledX3 = Vertex3->x * xScale; + t1 = (scaledX3 + scaledW3) / (scaledX3 - scaledX1 + scaledW3 - scaledW1); + t2 = (scaledX3 + scaledW3) / (scaledX3 - scaledX2 + scaledW3 - scaledW2); + } break; case 2: - t1 = (Vertex3->x - Vertex3->w * wScale) / (Vertex3->x - Vertex1->x - Vertex3->w * wScale + Vertex1->w * wScale); - t2 = (Vertex3->x - Vertex3->w * wScale) / (Vertex3->x - Vertex2->x - Vertex3->w * wScale + Vertex2->w * wScale); + { + const float scaledX1 = Vertex1->x * xScale; + const float scaledX2 = Vertex2->x * xScale; + const float scaledX3 = Vertex3->x * xScale; + t1 = (scaledX3 - scaledW3) / (scaledX3 - scaledX1 - scaledW3 + scaledW1); + t2 = (scaledX3 - scaledW3) / (scaledX3 - scaledX2 - scaledW3 + scaledW2); + } break; case 3: - t1 = (Vertex3->y + Vertex3->w * wScale) / (Vertex3->y - Vertex1->y + Vertex3->w * wScale - Vertex1->w * wScale); - t2 = (Vertex3->y + Vertex3->w * wScale) / (Vertex3->y - Vertex2->y + Vertex3->w * wScale - Vertex2->w * wScale); + t1 = (Vertex3->y + scaledW3) / (Vertex3->y - Vertex1->y + scaledW3 - scaledW1); + t2 = (Vertex3->y + scaledW3) / (Vertex3->y - Vertex2->y + scaledW3 - scaledW2); break; case 4: - t1 = (Vertex3->y - Vertex3->w * wScale) / (Vertex3->y - Vertex1->y - Vertex3->w * wScale + Vertex1->w * wScale); - t2 = (Vertex3->y - Vertex3->w * wScale) / (Vertex3->y - Vertex2->y - Vertex3->w * wScale + Vertex2->w * wScale); + t1 = (Vertex3->y - scaledW3) / (Vertex3->y - Vertex1->y - scaledW3 + scaledW1); + t2 = (Vertex3->y - scaledW3) / (Vertex3->y - Vertex2->y - scaledW3 + scaledW2); break; case 5: - t1 = (Vertex3->z + Vertex3->w * wScale) / (Vertex3->z - Vertex1->z + Vertex3->w * wScale - Vertex1->w * wScale); - t2 = (Vertex3->z + Vertex3->w * wScale) / (Vertex3->z - Vertex2->z + Vertex3->w * wScale - Vertex2->w * wScale); + t1 = (Vertex3->z + scaledW3) / (Vertex3->z - Vertex1->z + scaledW3 - scaledW1); + t2 = (Vertex3->z + scaledW3) / (Vertex3->z - Vertex2->z + scaledW3 - scaledW2); break; case 6: - t1 = (Vertex3->z - Vertex3->w * wScale) / (Vertex3->z - Vertex1->z - Vertex3->w * wScale + Vertex1->w * wScale); - t2 = (Vertex3->z - Vertex3->w * wScale) / (Vertex3->z - Vertex2->z - Vertex3->w * wScale + Vertex2->w * wScale); + t1 = (Vertex3->z - scaledW3) / (Vertex3->z - Vertex1->z - scaledW3 + scaledW1); + t2 = (Vertex3->z - scaledW3) / (Vertex3->z - Vertex2->z - scaledW3 + scaledW2); break; } diff --git a/src/DisplayWindow.h b/src/DisplayWindow.h index 046339a3..6b7851f6 100644 --- a/src/DisplayWindow.h +++ b/src/DisplayWindow.h @@ -63,9 +63,9 @@ protected: u32 m_resizeWidth = 0; u32 m_resizeHeight = 0; u32 m_maxMsaa = 0; - f32 m_scaleX = 0; - f32 m_scaleY = 0; - f32 m_adjustScale = 0; + f32 m_scaleX = 0.0f; + f32 m_scaleY = 0.0f; + f32 m_adjustScale = 1.0f; wchar_t m_strScreenDirectory[PLUGIN_PATH_SIZE]; diff --git a/src/gSP.cpp b/src/gSP.cpp index 3d6a43bf..528ecfd4 100644 --- a/src/gSP.cpp +++ b/src/gSP.cpp @@ -763,11 +763,13 @@ void gSPBillboardVertex(u32 v, SPVertex * spVtx) template void gSPClipVertex(u32 v, SPVertex * spVtx) { + const f32 scale = dwnd().getAdjustScale(); for (u32 j = 0; j < VNUM; ++j) { SPVertex & vtx = spVtx[v+j]; vtx.clip = 0; - if (vtx.x > +vtx.w) vtx.clip |= CLIP_POSX; - if (vtx.x < -vtx.w) vtx.clip |= CLIP_NEGX; + const f32 scaledX = vtx.x * scale; + if (scaledX > +vtx.w) vtx.clip |= CLIP_POSX; + if (scaledX < -vtx.w) vtx.clip |= CLIP_NEGX; if (vtx.y > +vtx.w) vtx.clip |= CLIP_POSY; if (vtx.y < -vtx.w) vtx.clip |= CLIP_NEGY; if (vtx.w < 0.01f) vtx.clip |= CLIP_W;