mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-23 12:32:34 +00:00
- Fix wall texture sampling to be done at pixel centers
This commit is contained in:
parent
8d3d271484
commit
ebd20daed8
1 changed files with 30 additions and 17 deletions
|
@ -478,9 +478,9 @@ namespace swrenderer
|
||||||
iend = 1 / iend;
|
iend = 1 / iend;
|
||||||
draw_segment->yscale = (float)yscale;
|
draw_segment->yscale = (float)yscale;
|
||||||
draw_segment->iscale = (float)istart;
|
draw_segment->iscale = (float)istart;
|
||||||
if (stop - start > 0)
|
if (stop - start > 1)
|
||||||
{
|
{
|
||||||
draw_segment->iscalestep = float((iend - istart) / (stop - start));
|
draw_segment->iscalestep = float((iend - istart) / (stop - start - 1));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1292,45 +1292,58 @@ namespace swrenderer
|
||||||
swapvalues(tleft.Y, tright.Y);
|
swapvalues(tleft.Y, tright.Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float fsx1, fsz1, fsx2, fsz2;
|
||||||
|
|
||||||
if (tleft.X >= -tleft.Y)
|
if (tleft.X >= -tleft.Y)
|
||||||
{
|
{
|
||||||
if (tleft.X > tleft.Y) return true; // left edge is off the right side
|
if (tleft.X > tleft.Y) return true; // left edge is off the right side
|
||||||
if (tleft.Y == 0) return true;
|
if (tleft.Y == 0) return true;
|
||||||
sx1 = xs_RoundToInt(viewport->CenterX + tleft.X * viewport->CenterX / tleft.Y);
|
fsx1 = viewport->CenterX + tleft.X * viewport->CenterX / tleft.Y;
|
||||||
sz1 = tleft.Y;
|
fsz1 = tleft.Y;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (tright.X < -tright.Y) return true; // wall is off the left side
|
if (tright.X < -tright.Y) return true; // wall is off the left side
|
||||||
float den = tleft.X - tright.X - tright.Y + tleft.Y;
|
float den = tleft.X - tright.X - tright.Y + tleft.Y;
|
||||||
if (den == 0) return true;
|
if (den == 0) return true;
|
||||||
sx1 = 0;
|
fsx1 = 0;
|
||||||
sz1 = tleft.Y + (tright.Y - tleft.Y) * (tleft.X + tleft.Y) / den;
|
fsz1 = tleft.Y + (tright.Y - tleft.Y) * (tleft.X + tleft.Y) / den;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sz1 < too_close)
|
if (fsz1 < too_close)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (tright.X <= tright.Y)
|
if (tright.X <= tright.Y)
|
||||||
{
|
{
|
||||||
if (tright.X < -tright.Y) return true; // right edge is off the left side
|
if (tright.X < -tright.Y) return true; // right edge is off the left side
|
||||||
if (tright.Y == 0) return true;
|
if (tright.Y == 0) return true;
|
||||||
sx2 = xs_RoundToInt(viewport->CenterX + tright.X * viewport->CenterX / tright.Y);
|
fsx2 = viewport->CenterX + tright.X * viewport->CenterX / tright.Y;
|
||||||
sz2 = tright.Y;
|
fsz2 = tright.Y;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (tleft.X > tleft.Y) return true; // wall is off the right side
|
if (tleft.X > tleft.Y) return true; // wall is off the right side
|
||||||
float den = tright.Y - tleft.Y - tright.X + tleft.X;
|
float den = tright.Y - tleft.Y - tright.X + tleft.X;
|
||||||
if (den == 0) return true;
|
if (den == 0) return true;
|
||||||
sx2 = viewwidth;
|
fsx2 = viewwidth;
|
||||||
sz2 = tleft.Y + (tright.Y - tleft.Y) * (tleft.X - tleft.Y) / den;
|
fsz2 = tleft.Y + (tright.Y - tleft.Y) * (tleft.X - tleft.Y) / den;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sz2 < too_close || sx2 <= sx1)
|
if (fsz2 < too_close)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
sx1 = xs_RoundToInt(fsx1);
|
||||||
|
sx2 = xs_RoundToInt(fsx2);
|
||||||
|
|
||||||
|
float delta = fsx2 - fsx1;
|
||||||
|
float t1 = (sx1 + 0.5f - fsx1) / delta;
|
||||||
|
float t2 = (sx2 + 0.5f - fsx1) / delta;
|
||||||
|
float invZ1 = 1.0f / fsz1;
|
||||||
|
float invZ2 = 1.0f / fsz2;
|
||||||
|
sz1 = 1.0f / (invZ1 * (1.0f - t1) + invZ2 * t1);
|
||||||
|
sz2 = 1.0f / (invZ1 * (1.0f - t2) + invZ2 * t2);
|
||||||
|
|
||||||
|
return sx2 <= sx1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -1346,9 +1359,9 @@ namespace swrenderer
|
||||||
{
|
{
|
||||||
swapvalues(left, right);
|
swapvalues(left, right);
|
||||||
}
|
}
|
||||||
UoverZorg = left->X * thread->Viewport->viewwindow.centerx;
|
UoverZorg = left->X * thread->Viewport->CenterX;
|
||||||
UoverZstep = -left->Y;
|
UoverZstep = -left->Y;
|
||||||
InvZorg = (left->X - right->X) * thread->Viewport->viewwindow.centerx;
|
InvZorg = (left->X - right->X) * thread->Viewport->CenterX;
|
||||||
InvZstep = right->Y - left->Y;
|
InvZstep = right->Y - left->Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1371,9 +1384,9 @@ namespace swrenderer
|
||||||
fullx2 = -fullx2;
|
fullx2 = -fullx2;
|
||||||
}
|
}
|
||||||
|
|
||||||
UoverZorg = float(fullx1 * viewport->viewwindow.centerx);
|
UoverZorg = float(fullx1 * viewport->CenterX);
|
||||||
UoverZstep = float(-fully1);
|
UoverZstep = float(-fully1);
|
||||||
InvZorg = float((fullx1 - fullx2) * viewport->viewwindow.centerx);
|
InvZorg = float((fullx1 - fullx2) * viewport->CenterX);
|
||||||
InvZstep = float(fully2 - fully1);
|
InvZstep = float(fully2 - fully1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue