1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Fix clipping

This commit is contained in:
Sergey Lipskiy 2021-03-11 22:17:53 +07:00
parent e2e0214719
commit 3d67ac4630
3 changed files with 61 additions and 31 deletions

View File

@ -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<SPVertex> & _vRes
const bool usesColor = pCurrCmb->usesShade();
const bool usesTexture = pCurrCmb->usesTexture();
const float wScale = static_cast<float>(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<SPVertex> & _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<SPVertex> & _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<SPVertex> & _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;
}

View File

@ -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];

View File

@ -763,11 +763,13 @@ void gSPBillboardVertex(u32 v, SPVertex * spVtx)
template <u32 VNUM>
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;