diff --git a/src/swrenderer/line/r_line.cpp b/src/swrenderer/line/r_line.cpp
index 11ce9dc193..9083f9ec48 100644
--- a/src/swrenderer/line/r_line.cpp
+++ b/src/swrenderer/line/r_line.cpp
@@ -858,7 +858,7 @@ namespace swrenderer
}
else
{
- mTopPart.TextureMid += rowoffset * mTopPart.Texture->GetPhysicalScale();
+ mTopPart.TextureMid += rowoffset;
}
}
@@ -918,7 +918,7 @@ namespace swrenderer
{
// rowoffset is added outside the multiply so that it positions the texture
// by texels instead of world units.
- mMiddlePart.TextureMid += rowoffset * mMiddlePart.Texture->GetPhysicalScale();
+ mMiddlePart.TextureMid += rowoffset;
}
}
@@ -983,7 +983,7 @@ namespace swrenderer
}
else
{
- mBottomPart.TextureMid += rowoffset * mBottomPart.Texture->GetPhysicalScale();
+ mBottomPart.TextureMid += rowoffset;
}
}
@@ -1158,7 +1158,7 @@ namespace swrenderer
}
else
{
- offset = mTopPart.TextureOffsetU * mTopPart.Texture->GetPhysicalScale();
+ offset = mTopPart.TextureOffsetU;
}
if (xscale < 0)
{
@@ -1205,7 +1205,7 @@ namespace swrenderer
}
else
{
- offset = mMiddlePart.TextureOffsetU * mMiddlePart.Texture->GetPhysicalScale();
+ offset = mMiddlePart.TextureOffsetU;
}
if (xscale < 0)
{
@@ -1253,7 +1253,7 @@ namespace swrenderer
}
else
{
- offset = mBottomPart.TextureOffsetU * mBottomPart.Texture->GetPhysicalScale();
+ offset = mBottomPart.TextureOffsetU;
}
if (xscale < 0)
{
diff --git a/src/swrenderer/line/r_walldraw.cpp b/src/swrenderer/line/r_walldraw.cpp
index 0dce2236ea..4b97bd8694 100644
--- a/src/swrenderer/line/r_walldraw.cpp
+++ b/src/swrenderer/line/r_walldraw.cpp
@@ -57,10 +57,11 @@ namespace swrenderer
WallSampler::WallSampler(RenderViewport *viewport, int y1, double texturemid, float swal, double yrepeat, fixed_t xoffset, double xmagnitude, FSoftwareTexture *texture)
{
xoffset += FLOAT2FIXED(xmagnitude * 0.5);
+ xoffset *= texture->GetPhysicalScale();
if (!viewport->RenderTarget->IsBgra())
{
- height = texture->GetHeight();
+ height = texture->GetPhysicalHeight();
int uv_fracbits = 32 - texture->GetHeightBits();
if (uv_fracbits != 32)
@@ -70,13 +71,13 @@ namespace swrenderer
// Find start uv in [0-base_height[ range.
// Not using xs_ToFixed because it rounds the result and we need something that always rounds down to stay within the range.
double uv_stepd = swal * yrepeat;
- double v = (texturemid + uv_stepd * (y1 - viewport->CenterY + 0.5)) / height;
+ double v = (texturemid + uv_stepd * (y1 - viewport->CenterY + 0.5)) / texture->GetHeight();
v = v - floor(v);
v *= height;
v *= (1 << uv_fracbits);
uv_pos = (uint32_t)(int64_t)v;
- uv_step = xs_ToFixed(uv_fracbits, uv_stepd);
+ uv_step = xs_ToFixed(uv_fracbits, uv_stepd * texture->GetPhysicalScale());
if (uv_step == 0) // To prevent divide by zero elsewhere
uv_step = 1;
}
@@ -92,7 +93,7 @@ namespace swrenderer
// If the texture's width isn't a power of 2, then we need to make it a
// positive offset for proper clamping.
int width;
- if (col < 0 && (width = texture->GetWidth()) != (1 << texture->GetWidthBits()))
+ if (col < 0 && (width = texture->GetPhysicalWidth()) != (1 << texture->GetWidthBits()))
{
col = width + (col % width);
}
@@ -129,8 +130,8 @@ namespace swrenderer
bool magnifying = lod < 0.0f;
int mipmap_offset = 0;
- int mip_width = texture->GetWidth();
- int mip_height = texture->GetHeight();
+ int mip_width = texture->GetPhysicalWidth();
+ int mip_height = texture->GetPhysicalHeight();
if (r_mipmap && texture->Mipmapped() && mip_width > 1 && mip_height > 1)
{
uint32_t xpos = (uint32_t)((((uint64_t)xoffset) << FRACBITS) / mip_width);
diff --git a/src/swrenderer/plane/r_flatplane.cpp b/src/swrenderer/plane/r_flatplane.cpp
index d826dbc566..7d27fdaf41 100644
--- a/src/swrenderer/plane/r_flatplane.cpp
+++ b/src/swrenderer/plane/r_flatplane.cpp
@@ -67,6 +67,8 @@ namespace swrenderer
return;
}
+ tex = texture;
+
drawerargs.SetSolidColor(3);
drawerargs.SetTexture(Thread, texture);
@@ -181,11 +183,11 @@ namespace swrenderer
float zbufferdepth = (float)(1.0 / fabs(planeheight / Thread->Viewport->ScreenToViewY(y, 1.0)));
- drawerargs.SetTextureUStep(distance * xstepscale / drawerargs.TextureWidth());
- drawerargs.SetTextureUPos((distance * curxfrac + pviewx) / drawerargs.TextureWidth());
+ drawerargs.SetTextureUStep(distance * xstepscale / tex->GetWidth());
+ drawerargs.SetTextureUPos((distance * curxfrac + pviewx) / tex->GetWidth());
- drawerargs.SetTextureVStep(distance * ystepscale / drawerargs.TextureHeight());
- drawerargs.SetTextureVPos((distance * curyfrac + pviewy) / drawerargs.TextureHeight());
+ drawerargs.SetTextureVStep(distance * ystepscale / tex->GetHeight());
+ drawerargs.SetTextureVPos((distance * curyfrac + pviewy) / tex->GetHeight());
if (viewport->RenderTarget->IsBgra())
{
diff --git a/src/swrenderer/plane/r_flatplane.h b/src/swrenderer/plane/r_flatplane.h
index 9e01afb949..fad5bdf8f7 100644
--- a/src/swrenderer/plane/r_flatplane.h
+++ b/src/swrenderer/plane/r_flatplane.h
@@ -51,6 +51,7 @@ namespace swrenderer
double xstepscale, ystepscale;
double basexfrac, baseyfrac;
VisiblePlaneLight *light_list;
+ FSoftwareTexture *tex;
SpanDrawerArgs drawerargs;
};
diff --git a/src/swrenderer/plane/r_skyplane.cpp b/src/swrenderer/plane/r_skyplane.cpp
index 4f444ece54..5b5c4894a2 100644
--- a/src/swrenderer/plane/r_skyplane.cpp
+++ b/src/swrenderer/plane/r_skyplane.cpp
@@ -248,11 +248,9 @@ namespace swrenderer
RenderPortal *renderportal = Thread->Portal.get();
auto viewport = Thread->Viewport.get();
- uint32_t height = frontskytex->GetHeight();
-
double uv_stepd = skyiscale * yrepeat;
- double v = (texturemid + uv_stepd * (y1 - viewport->CenterY + 0.5)) / height;
- double v_step = uv_stepd / height;
+ double v = (texturemid + uv_stepd * (y1 - viewport->CenterY + 0.5)) / frontskytex->GetHeight();
+ double v_step = uv_stepd / frontskytex->GetHeight();
uint32_t uv_pos = (uint32_t)(int32_t)(v * 0x01000000);
uint32_t uv_step = (uint32_t)(int32_t)(v_step * 0x01000000);
@@ -272,8 +270,8 @@ namespace swrenderer
{
ang = (skyangle + viewport->xtoviewangle[x]) ^ skyflip;
}
- angle1 = (uint32_t)((UMulScale16(ang, frontcyl) + frontpos) >> FRACBITS);
- angle2 = (uint32_t)((UMulScale16(ang, backcyl) + backpos) >> FRACBITS);
+ angle1 = UMulScale16(ang, frontcyl) + frontpos;
+ angle2 = UMulScale16(ang, backcyl) + backpos;
drawerargs.SetFrontTexture(Thread, frontskytex, angle1);
drawerargs.SetBackTexture(Thread, backskytex, angle2);
@@ -296,7 +294,7 @@ namespace swrenderer
void RenderSkyPlane::DrawSkyColumn(int start_x, int y1, int y2)
{
- if (1 << frontskytex->GetHeightBits() == frontskytex->GetHeight())
+ if (1 << frontskytex->GetHeightBits() == frontskytex->GetPhysicalHeight())
{
double texturemid = skymid * frontskytex->GetScale().Y + frontskytex->GetHeight();
DrawSkyColumnStripe(start_x, y1, y2, frontskytex->GetScale().Y, texturemid, frontskytex->GetScale().Y);
diff --git a/src/swrenderer/plane/r_slopeplane.cpp b/src/swrenderer/plane/r_slopeplane.cpp
index fb20f107eb..41a30db831 100644
--- a/src/swrenderer/plane/r_slopeplane.cpp
+++ b/src/swrenderer/plane/r_slopeplane.cpp
@@ -98,6 +98,9 @@ namespace swrenderer
drawerargs.SetSolidColor(3);
drawerargs.SetTexture(Thread, texture);
+ _xscale /= texture->GetPhysicalScale();
+ _yscale /= texture->GetPhysicalScale();
+
lxscale = _xscale * ifloatpow2[drawerargs.TextureWidthBits()];
lyscale = _yscale * ifloatpow2[drawerargs.TextureHeightBits()];
xscale = 64.f / lxscale;
diff --git a/src/swrenderer/textures/r_swtexture.cpp b/src/swrenderer/textures/r_swtexture.cpp
index 6b8814f398..a53e61d57e 100644
--- a/src/swrenderer/textures/r_swtexture.cpp
+++ b/src/swrenderer/textures/r_swtexture.cpp
@@ -68,7 +68,7 @@ FSoftwareTexture::FSoftwareTexture(FTexture *tex)
auto info = tex->CreateTexBuffer(0, CTF_CheckOnly| mBufferFlags);
mPhysicalWidth = info.mWidth;
mPhysicalHeight = info.mHeight;
- mPhysicalScale = mPhysicalWidth / tex->Width;;
+ mPhysicalScale = mPhysicalWidth / tex->Width;
CalcBitSize();
}
@@ -83,7 +83,7 @@ void FSoftwareTexture::CalcBitSize ()
// WidthBits is rounded down, and HeightBits is rounded up
int i;
- for (i = 0; (1 << i) < GetWidth(); ++i)
+ for (i = 0; (1 << i) < GetPhysicalWidth(); ++i)
{ }
WidthBits = i;
@@ -91,7 +91,7 @@ void FSoftwareTexture::CalcBitSize ()
// Having WidthBits that would allow for columns past the end of the
// texture is not allowed, even if it means the entire texture is
// not drawn.
- if (GetWidth() < (1 << WidthBits))
+ if (GetPhysicalWidth() < (1 << WidthBits))
{
WidthBits--;
}
@@ -99,7 +99,7 @@ void FSoftwareTexture::CalcBitSize ()
//
The minimum height is 2, because we cannot shift right 32 bits.
// Scratch that. Somebody actually made a 1x1 texture, so now we have to handle it.
- for (i = 0; (1 << i) < GetHeight(); ++i)
+ for (i = 0; (1 << i) < GetPhysicalHeight(); ++i)
{ }
HeightBits = i;
@@ -122,13 +122,13 @@ const uint8_t *FSoftwareTexture::GetPixels(int style)
else
{
auto tempbuffer = mTexture->CreateTexBuffer(0, mBufferFlags);
- Pixels.Resize(GetWidth()*GetHeight());
+ Pixels.Resize(GetPhysicalWidth()*GetPhysicalHeight());
PalEntry *pe = (PalEntry*)tempbuffer.mBuffer;
- for (int y = 0; y < GetHeight(); y++)
+ for (int y = 0; y < GetPhysicalHeight(); y++)
{
- for (int x = 0; x < GetWidth(); x++)
+ for (int x = 0; x < GetPhysicalWidth(); x++)
{
- Pixels[y + x * GetHeight()] = ImageHelpers::RGBToPalette(false, pe[x + y * GetWidth()], true);
+ Pixels[y + x * GetPhysicalHeight()] = ImageHelpers::RGBToPalette(false, pe[x + y * GetPhysicalWidth()], true);
}
}
}
@@ -156,11 +156,11 @@ const uint32_t *FSoftwareTexture::GetPixelsBgra()
auto tempbuffer = mTexture->CreateTexBuffer(0, mBufferFlags);
CreatePixelsBgraWithMipmaps();
PalEntry *pe = (PalEntry*)tempbuffer.mBuffer;
- for (int y = 0; y < GetHeight(); y++)
+ for (int y = 0; y < GetPhysicalHeight(); y++)
{
- for (int x = 0; x < GetWidth(); x++)
+ for (int x = 0; x < GetPhysicalWidth(); x++)
{
- PixelsBgra[y + x * GetHeight()] = pe[x + y * GetWidth()];
+ PixelsBgra[y + x * GetPhysicalHeight()] = pe[x + y * GetPhysicalWidth()];
}
}
GenerateBgraMipmaps();
@@ -178,15 +178,15 @@ const uint32_t *FSoftwareTexture::GetPixelsBgra()
const uint8_t *FSoftwareTexture::GetColumn(int index, unsigned int column, const FSoftwareTextureSpan **spans_out)
{
auto Pixeldata = GetPixels(index);
- if ((unsigned)column >= (unsigned)GetWidth())
+ if ((unsigned)column >= (unsigned)GetPhysicalWidth())
{
- if (WidthMask + 1 == GetWidth())
+ if (WidthMask + 1 == GetPhysicalWidth())
{
column &= WidthMask;
}
else
{
- column %= GetWidth();
+ column %= GetPhysicalWidth();
}
}
if (spans_out != nullptr)
@@ -197,7 +197,7 @@ const uint8_t *FSoftwareTexture::GetColumn(int index, unsigned int column, const
}
*spans_out = Spandata[index][column];
}
- return Pixeldata + column * GetHeight();
+ return Pixeldata + column * GetPhysicalHeight();
}
//==========================================================================
@@ -209,15 +209,15 @@ const uint8_t *FSoftwareTexture::GetColumn(int index, unsigned int column, const
const uint32_t *FSoftwareTexture::GetColumnBgra(unsigned int column, const FSoftwareTextureSpan **spans_out)
{
auto Pixeldata = GetPixelsBgra();
- if ((unsigned)column >= (unsigned)GetWidth())
+ if ((unsigned)column >= (unsigned)GetPhysicalWidth())
{
- if (WidthMask + 1 == GetWidth())
+ if (WidthMask + 1 == GetPhysicalWidth())
{
column &= WidthMask;
}
else
{
- column %= GetWidth();
+ column %= GetPhysicalWidth();
}
}
if (spans_out != nullptr)
@@ -228,7 +228,7 @@ const uint32_t *FSoftwareTexture::GetColumnBgra(unsigned int column, const FSoft
}
*spans_out = Spandata[2][column];
}
- return Pixeldata + column * GetHeight();
+ return Pixeldata + column * GetPhysicalHeight();
}
//==========================================================================
@@ -254,21 +254,21 @@ FSoftwareTextureSpan **FSoftwareTexture::CreateSpans (const T *pixels)
if (!mTexture->isMasked())
{ // Texture does not have holes, so it can use a simpler span structure
- spans = (FSoftwareTextureSpan **)M_Malloc (sizeof(FSoftwareTextureSpan*)*GetWidth() + sizeof(FSoftwareTextureSpan)*2);
- span = (FSoftwareTextureSpan *)&spans[GetWidth()];
- for (int x = 0; x < GetWidth(); ++x)
+ spans = (FSoftwareTextureSpan **)M_Malloc (sizeof(FSoftwareTextureSpan*)*GetPhysicalWidth() + sizeof(FSoftwareTextureSpan)*2);
+ span = (FSoftwareTextureSpan *)&spans[GetPhysicalWidth()];
+ for (int x = 0; x < GetPhysicalWidth(); ++x)
{
spans[x] = span;
}
- span[0].Length = GetHeight();
+ span[0].Length = GetPhysicalHeight();
span[0].TopOffset = 0;
span[1].Length = 0;
span[1].TopOffset = 0;
}
else
{ // Texture might have holes, so build a complete span structure
- int numcols = GetWidth();
- int numrows = GetHeight();
+ int numcols = GetPhysicalWidth();
+ int numrows = GetPhysicalHeight();
int numspans = numcols; // One span to terminate each column
const T *data_p;
bool newspan;
@@ -360,11 +360,11 @@ void FSoftwareTexture::GenerateBgraFromBitmap(const FBitmap &bitmap)
// Transpose
const uint32_t *src = (const uint32_t *)bitmap.GetPixels();
uint32_t *dest = PixelsBgra.Data();
- for (int x = 0; x < GetWidth(); x++)
+ for (int x = 0; x < GetPhysicalWidth(); x++)
{
- for (int y = 0; y < GetHeight(); y++)
+ for (int y = 0; y < GetPhysicalHeight(); y++)
{
- dest[y + x * GetHeight()] = src[x + y * GetWidth()];
+ dest[y + x * GetPhysicalHeight()] = src[x + y * GetPhysicalWidth()];
}
}
@@ -377,8 +377,8 @@ void FSoftwareTexture::CreatePixelsBgraWithMipmaps()
int buffersize = 0;
for (int i = 0; i < levels; i++)
{
- int w = MAX(GetWidth() >> i, 1);
- int h = MAX(GetHeight() >> i, 1);
+ int w = MAX(GetPhysicalWidth() >> i, 1);
+ int h = MAX(GetPhysicalHeight() >> i, 1);
buffersize += w * h;
}
PixelsBgra.Resize(buffersize);
@@ -387,10 +387,10 @@ void FSoftwareTexture::CreatePixelsBgraWithMipmaps()
int FSoftwareTexture::MipmapLevels()
{
int widthbits = 0;
- while ((GetWidth() >> widthbits) != 0) widthbits++;
+ while ((GetPhysicalWidth() >> widthbits) != 0) widthbits++;
int heightbits = 0;
- while ((GetHeight() >> heightbits) != 0) heightbits++;
+ while ((GetPhysicalHeight() >> heightbits) != 0) heightbits++;
return MAX(widthbits, heightbits);
}
@@ -421,32 +421,32 @@ void FSoftwareTexture::GenerateBgraMipmaps()
// Convert to normalized linear colorspace
{
- for (int x = 0; x < GetWidth(); x++)
+ for (int x = 0; x < GetPhysicalWidth(); x++)
{
- for (int y = 0; y < GetHeight(); y++)
+ for (int y = 0; y < GetPhysicalHeight(); y++)
{
- uint32_t c8 = PixelsBgra[x * GetHeight() + y];
+ uint32_t c8 = PixelsBgra[x * GetPhysicalHeight() + y];
Color4f c;
c.a = powf(APART(c8) * (1.0f / 255.0f), 2.2f);
c.r = powf(RPART(c8) * (1.0f / 255.0f), 2.2f);
c.g = powf(GPART(c8) * (1.0f / 255.0f), 2.2f);
c.b = powf(BPART(c8) * (1.0f / 255.0f), 2.2f);
- image[x * GetHeight() + y] = c;
+ image[x * GetPhysicalHeight() + y] = c;
}
}
}
// Generate mipmaps
{
- std::vector smoothed(GetWidth() * GetHeight());
+ std::vector smoothed(GetPhysicalWidth() * GetPhysicalHeight());
Color4f *src = image.data();
- Color4f *dest = src + GetWidth() * GetHeight();
+ Color4f *dest = src + GetPhysicalWidth() * GetPhysicalHeight();
for (int i = 1; i < levels; i++)
{
- int srcw = MAX(GetWidth() >> (i - 1), 1);
- int srch = MAX(GetHeight() >> (i - 1), 1);
- int w = MAX(GetWidth() >> i, 1);
- int h = MAX(GetHeight() >> i, 1);
+ int srcw = MAX(GetPhysicalWidth() >> (i - 1), 1);
+ int srch = MAX(GetPhysicalHeight() >> (i - 1), 1);
+ int w = MAX(GetPhysicalWidth() >> i, 1);
+ int h = MAX(GetPhysicalHeight() >> i, 1);
// Downscale
for (int x = 0; x < w; x++)
@@ -502,12 +502,12 @@ void FSoftwareTexture::GenerateBgraMipmaps()
// Convert to bgra8 sRGB colorspace
{
- Color4f *src = image.data() + GetWidth() * GetHeight();
- uint32_t *dest = PixelsBgra.Data() + GetWidth() * GetHeight();
+ Color4f *src = image.data() + GetPhysicalWidth() * GetPhysicalHeight();
+ uint32_t *dest = PixelsBgra.Data() + GetPhysicalWidth() * GetPhysicalHeight();
for (int i = 1; i < levels; i++)
{
- int w = MAX(GetWidth() >> i, 1);
- int h = MAX(GetHeight() >> i, 1);
+ int w = MAX(GetPhysicalWidth() >> i, 1);
+ int h = MAX(GetPhysicalHeight() >> i, 1);
for (int j = 0; j < w * h; j++)
{
uint32_t a = (uint32_t)clamp(powf(MAX(src[j].a, 0.0f), 1.0f / 2.2f) * 255.0f + 0.5f, 0.0f, 255.0f);
@@ -531,14 +531,14 @@ void FSoftwareTexture::GenerateBgraMipmaps()
void FSoftwareTexture::GenerateBgraMipmapsFast()
{
uint32_t *src = PixelsBgra.Data();
- uint32_t *dest = src + GetWidth() * GetHeight();
+ uint32_t *dest = src + GetPhysicalWidth() * GetPhysicalHeight();
int levels = MipmapLevels();
for (int i = 1; i < levels; i++)
{
- int srcw = MAX(GetWidth() >> (i - 1), 1);
- int srch = MAX(GetHeight() >> (i - 1), 1);
- int w = MAX(GetWidth() >> i, 1);
- int h = MAX(GetHeight() >> i, 1);
+ int srcw = MAX(GetPhysicalWidth() >> (i - 1), 1);
+ int srch = MAX(GetPhysicalHeight() >> (i - 1), 1);
+ int w = MAX(GetPhysicalWidth() >> i, 1);
+ int h = MAX(GetPhysicalHeight() >> i, 1);
for (int x = 0; x < w; x++)
{
diff --git a/src/swrenderer/textures/r_swtexture.h b/src/swrenderer/textures/r_swtexture.h
index 0ead864ce7..f4baeb21bd 100644
--- a/src/swrenderer/textures/r_swtexture.h
+++ b/src/swrenderer/textures/r_swtexture.h
@@ -58,8 +58,8 @@ public:
int GetSkyOffset() const { return mTexture->GetSkyOffset(); }
PalEntry GetSkyCapColor(bool bottom) const { return mTexture->GetSkyCapColor(bottom); }
- int GetWidth () { return mPhysicalWidth; }
- int GetHeight () { return mPhysicalHeight; }
+ int GetWidth () { return mTexture->GetWidth(); }
+ int GetHeight () { return mTexture->GetHeight(); }
int GetWidthBits() { return WidthBits; }
int GetHeightBits() { return HeightBits; }
@@ -69,12 +69,12 @@ public:
double GetScaledHeightDouble () { return mTexture->GetScaledHeightDouble(); }
// Now with improved offset adjustment.
- int GetLeftOffset(int adjusted) { return mTexture->GetLeftOffset(adjusted) * mPhysicalScale; }
- int GetTopOffset(int adjusted) { return mTexture->GetTopOffset(adjusted) * mPhysicalScale; }
- int GetScaledLeftOffset (int adjusted) { return mTexture->GetScaledLeftOffset(adjusted) * mPhysicalScale; }
- int GetScaledTopOffset (int adjusted) { return mTexture->GetScaledTopOffset(adjusted) * mPhysicalScale; }
- double GetScaledLeftOffsetDouble(int adjusted) { return mTexture->GetScaledLeftOffsetDouble(adjusted) * mPhysicalScale; }
- double GetScaledTopOffsetDouble(int adjusted) { return mTexture->GetScaledTopOffsetDouble(adjusted) * mPhysicalScale; }
+ int GetLeftOffset(int adjusted) { return mTexture->GetLeftOffset(adjusted); }
+ int GetTopOffset(int adjusted) { return mTexture->GetTopOffset(adjusted); }
+ int GetScaledLeftOffset (int adjusted) { return mTexture->GetScaledLeftOffset(adjusted); }
+ int GetScaledTopOffset (int adjusted) { return mTexture->GetScaledTopOffset(adjusted); }
+ double GetScaledLeftOffsetDouble(int adjusted) { return mTexture->GetScaledLeftOffsetDouble(adjusted); }
+ double GetScaledTopOffsetDouble(int adjusted) { return mTexture->GetScaledTopOffsetDouble(adjusted); }
// Interfaces for the different renderers. Everything that needs to check renderer-dependent offsets
// should use these, so that if changes are needed, this is the only place to edit.
@@ -91,7 +91,9 @@ public:
int GetScaledLeftOffsetPo() { return GetScaledLeftOffset(r_spriteadjustSW); }
int GetScaledTopOffsetPo() { return GetScaledTopOffset(r_spriteadjustSW); }
- DVector2 GetScale() const { return mTexture->Scale * mPhysicalScale; }
+ DVector2 GetScale() const { return mTexture->Scale; }
+ int GetPhysicalWidth() { return mPhysicalWidth; }
+ int GetPhysicalHeight() { return mPhysicalHeight; }
int GetPhysicalScale() const { return mPhysicalScale; }
virtual void Unload()
diff --git a/src/swrenderer/viewport/r_skydrawer.cpp b/src/swrenderer/viewport/r_skydrawer.cpp
index 2bbab5abf6..2f75e30e2c 100644
--- a/src/swrenderer/viewport/r_skydrawer.cpp
+++ b/src/swrenderer/viewport/r_skydrawer.cpp
@@ -47,21 +47,21 @@ namespace swrenderer
dc_viewport = viewport;
}
- void SkyDrawerArgs::SetFrontTexture(RenderThread *thread, FSoftwareTexture *texture, uint32_t column)
+ void SkyDrawerArgs::SetFrontTexture(RenderThread *thread, FSoftwareTexture *texture, fixed_t column)
{
if (thread->Viewport->RenderTarget->IsBgra())
{
- dc_source = (const uint8_t *)texture->GetColumnBgra(column, nullptr);
- dc_sourceheight = texture->GetHeight();
+ dc_source = (const uint8_t *)texture->GetColumnBgra((column * texture->GetPhysicalScale()) >> FRACBITS, nullptr);
+ dc_sourceheight = texture->GetPhysicalHeight();
}
else
{
- dc_source = texture->GetColumn(DefaultRenderStyle(), column, nullptr);
- dc_sourceheight = texture->GetHeight();
+ dc_source = texture->GetColumn(DefaultRenderStyle(), (column * texture->GetPhysicalScale()) >> FRACBITS, nullptr);
+ dc_sourceheight = texture->GetPhysicalHeight();
}
}
- void SkyDrawerArgs::SetBackTexture(RenderThread *thread, FSoftwareTexture *texture, uint32_t column)
+ void SkyDrawerArgs::SetBackTexture(RenderThread *thread, FSoftwareTexture *texture, fixed_t column)
{
if (texture == nullptr)
{
@@ -70,13 +70,13 @@ namespace swrenderer
}
else if (thread->Viewport->RenderTarget->IsBgra())
{
- dc_source2 = (const uint8_t *)texture->GetColumnBgra(column, nullptr);
- dc_sourceheight2 = texture->GetHeight();
+ dc_source2 = (const uint8_t *)texture->GetColumnBgra((column * texture->GetPhysicalScale()) >> FRACBITS, nullptr);
+ dc_sourceheight2 = texture->GetPhysicalHeight();
}
else
{
- dc_source2 = texture->GetColumn(DefaultRenderStyle(), column, nullptr);
- dc_sourceheight2 = texture->GetHeight();
+ dc_source2 = texture->GetColumn(DefaultRenderStyle(), (column * texture->GetPhysicalScale()) >> FRACBITS, nullptr);
+ dc_sourceheight2 = texture->GetPhysicalHeight();
}
}
}
diff --git a/src/swrenderer/viewport/r_skydrawer.h b/src/swrenderer/viewport/r_skydrawer.h
index 69ff04d9b7..2634c514f0 100644
--- a/src/swrenderer/viewport/r_skydrawer.h
+++ b/src/swrenderer/viewport/r_skydrawer.h
@@ -15,8 +15,8 @@ namespace swrenderer
public:
void SetDest(RenderViewport *viewport, int x, int y);
void SetCount(int count) { dc_count = count; }
- void SetFrontTexture(RenderThread *thread, FSoftwareTexture *texture, uint32_t column);
- void SetBackTexture(RenderThread *thread, FSoftwareTexture *texture, uint32_t column);
+ void SetFrontTexture(RenderThread *thread, FSoftwareTexture *texture, fixed_t column);
+ void SetBackTexture(RenderThread *thread, FSoftwareTexture *texture, fixed_t column);
void SetTextureVPos(uint32_t texturefrac) { dc_texturefrac = texturefrac; }
void SetTextureVStep(uint32_t iscale) { dc_iscale = iscale; }
void SetSolidTop(uint32_t color) { solid_top = color; }
diff --git a/src/swrenderer/viewport/r_spandrawer.cpp b/src/swrenderer/viewport/r_spandrawer.cpp
index 8c4bb26a73..665d18e890 100644
--- a/src/swrenderer/viewport/r_spandrawer.cpp
+++ b/src/swrenderer/viewport/r_spandrawer.cpp
@@ -34,21 +34,21 @@ namespace swrenderer
{
thread->PrepareTexture(tex, DefaultRenderStyle());
- ds_texwidth = tex->GetWidth();
- ds_texheight = tex->GetHeight();
+ ds_texwidth = tex->GetPhysicalWidth();
+ ds_texheight = tex->GetPhysicalHeight();
ds_xbits = tex->GetWidthBits();
ds_ybits = tex->GetHeightBits();
- if ((1 << ds_xbits) > tex->GetWidth())
+ if ((1 << ds_xbits) > tex->GetPhysicalWidth())
{
ds_xbits--;
}
- if ((1 << ds_ybits) > tex->GetHeight())
+ if ((1 << ds_ybits) > tex->GetPhysicalHeight())
{
ds_ybits--;
}
ds_source = thread->Viewport->RenderTarget->IsBgra() ? (const uint8_t*)tex->GetPixelsBgra() : tex->GetPixels(DefaultRenderStyle()); // Get correct render style? Shaded won't get here.
- ds_source_mipmapped = tex->Mipmapped() && tex->GetWidth() > 1 && tex->GetHeight() > 1;
+ ds_source_mipmapped = tex->Mipmapped() && tex->GetPhysicalWidth() > 1 && tex->GetPhysicalHeight() > 1;
}
void SpanDrawerArgs::SetStyle(bool masked, bool additive, fixed_t alpha)
diff --git a/src/swrenderer/viewport/r_spritedrawer.cpp b/src/swrenderer/viewport/r_spritedrawer.cpp
index f53fe70b24..f6d8709120 100644
--- a/src/swrenderer/viewport/r_spritedrawer.cpp
+++ b/src/swrenderer/viewport/r_spritedrawer.cpp
@@ -48,6 +48,10 @@ namespace swrenderer
if (x < thread->X1 || x >= thread->X2)
return;
+ col *= tex->GetPhysicalScale();
+ iscale *= tex->GetPhysicalScale();
+ spryscale /= tex->GetPhysicalScale();
+
auto viewport = thread->Viewport.get();
// Handle the linear filtered version in a different function to reduce chances of merge conflicts from zdoom.
@@ -60,7 +64,7 @@ namespace swrenderer
dc_viewport = viewport;
dc_x = x;
dc_iscale = iscale;
- dc_textureheight = tex->GetHeight();
+ dc_textureheight = tex->GetPhysicalHeight();
const FSoftwareTextureSpan *span;
const uint8_t *column;
@@ -74,7 +78,7 @@ namespace swrenderer
{
span = unmaskedSpan;
unmaskedSpan[0].TopOffset = 0;
- unmaskedSpan[0].Length = tex->GetHeight();
+ unmaskedSpan[0].Length = tex->GetPhysicalHeight();
unmaskedSpan[1].TopOffset = 0;
unmaskedSpan[1].Length = 0;
}
@@ -134,7 +138,7 @@ namespace swrenderer
// Normalize to 0-1 range:
double uv_stepd = FIXED2DBL(dc_iscale);
- double v_step = uv_stepd / tex->GetHeight();
+ double v_step = uv_stepd / tex->GetPhysicalHeight();
// Convert to uint32_t:
dc_iscale = (uint32_t)(v_step * (1 << 30));
@@ -150,8 +154,8 @@ namespace swrenderer
bool magnifying = lod < 0.0f;
int mipmap_offset = 0;
- int mip_width = tex->GetWidth();
- int mip_height = tex->GetHeight();
+ int mip_width = tex->GetPhysicalWidth();
+ int mip_height = tex->GetPhysicalHeight();
uint32_t xpos = (uint32_t)((((uint64_t)xoffset) << FRACBITS) / mip_width);
if (r_mipmap && tex->Mipmapped() && mip_width > 1 && mip_height > 1)
{
@@ -199,7 +203,7 @@ namespace swrenderer
{
span = unmaskedSpan;
unmaskedSpan[0].TopOffset = 0;
- unmaskedSpan[0].Length = tex->GetHeight();
+ unmaskedSpan[0].Length = tex->GetPhysicalHeight();
unmaskedSpan[1].TopOffset = 0;
unmaskedSpan[1].Length = 0;
}
@@ -233,7 +237,7 @@ namespace swrenderer
SetDest(dc_viewport, dc_x, dc_yl);
dc_count = dc_yh - dc_yl + 1;
- double v = ((dc_yl + 0.5 - sprtopscreen) / spryscale) / tex->GetHeight();
+ double v = ((dc_yl + 0.5 - sprtopscreen) / spryscale) / tex->GetPhysicalHeight();
dc_texturefrac = (uint32_t)(v * (1 << 30));
(thread->Drawers(dc_viewport)->*colfunc)(*this);