Move r_viewport variables into a class

This commit is contained in:
Magnus Norddahl 2017-02-01 16:02:21 +01:00
parent 4e45ea2300
commit e78e76a593
35 changed files with 336 additions and 277 deletions

View file

@ -48,7 +48,8 @@ void PolyDrawArgs::SetTexture(FTexture *texture)
{
textureWidth = texture->GetWidth();
textureHeight = texture->GetHeight();
if (swrenderer::r_swtruecolor)
auto viewport = swrenderer::RenderViewport::Instance();
if (viewport->r_swtruecolor)
texturePixels = (const uint8_t *)texture->GetPixelsBgra();
else
texturePixels = texture->GetPixels();
@ -62,7 +63,7 @@ void PolyDrawArgs::SetTexture(FTexture *texture, uint32_t translationID, bool fo
FRemapTable *table = TranslationToTable(translationID);
if (table != nullptr && !table->Inactive)
{
if (swrenderer::r_swtruecolor)
if (swrenderer::RenderViewport::Instance()->r_swtruecolor)
translation = (uint8_t*)table->Palette;
else
translation = table->Remap;

View file

@ -146,11 +146,12 @@ TriMatrix TriMatrix::worldToView()
TriMatrix TriMatrix::viewToClip()
{
auto viewport = swrenderer::RenderViewport::Instance();
float near = 5.0f;
float far = 65536.0f;
float width = (float)(FocalTangent * near);
float top = (float)(swrenderer::CenterY / swrenderer::InvZtoScale * near);
float bottom = (float)(top - viewheight / swrenderer::InvZtoScale * near);
float top = (float)(viewport->CenterY / viewport->InvZtoScale * near);
float bottom = (float)(top - viewheight / viewport->InvZtoScale * near);
return frustum(-width, width, bottom, top, near, far);
}

View file

@ -54,46 +54,50 @@ void PolyRenderer::RenderView(player_t *player)
{
using namespace swrenderer;
swrenderer::RenderTarget = screen;
auto viewport = RenderViewport::Instance();
bool saved_swtruecolor = r_swtruecolor;
r_swtruecolor = screen->IsBgra();
viewport->RenderTarget = screen;
bool saved_swtruecolor = viewport->r_swtruecolor;
viewport->r_swtruecolor = screen->IsBgra();
int width = SCREENWIDTH;
int height = SCREENHEIGHT;
int stHeight = gST_Y;
float trueratio;
ActiveRatio(width, height, &trueratio);
RenderViewport::Instance()->SetViewport(width, height, trueratio);
viewport->SetViewport(width, height, trueratio);
RenderActorView(player->mo, false);
// Apply special colormap if the target cannot do it
CameraLight *cameraLight = CameraLight::Instance();
if (cameraLight->realfixedcolormap && r_swtruecolor && !(r_shadercolormaps && screen->Accel2D))
if (cameraLight->realfixedcolormap && viewport->r_swtruecolor && !(r_shadercolormaps && screen->Accel2D))
{
R_BeginDrawerCommands();
DrawerCommandQueue::QueueCommand<ApplySpecialColormapRGBACommand>(cameraLight->realfixedcolormap, screen);
R_EndDrawerCommands();
}
r_swtruecolor = saved_swtruecolor;
viewport->r_swtruecolor = saved_swtruecolor;
}
void PolyRenderer::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int y, int width, int height, bool dontmaplines)
{
auto viewport = swrenderer::RenderViewport::Instance();
const bool savedviewactive = viewactive;
const bool savedoutputformat = swrenderer::r_swtruecolor;
const bool savedoutputformat = viewport->r_swtruecolor;
viewwidth = width;
swrenderer::RenderTarget = canvas;
swrenderer::bRenderingToCanvas = true;
viewport->RenderTarget = canvas;
viewport->bRenderingToCanvas = true;
R_SetWindow(12, width, height, height, true);
swrenderer::RenderViewport::Instance()->SetViewport(width, height, WidescreenRatio);
viewport->SetViewport(width, height, WidescreenRatio);
viewwindowx = x;
viewwindowy = y;
viewactive = true;
swrenderer::r_swtruecolor = canvas->IsBgra();
viewport->r_swtruecolor = canvas->IsBgra();
canvas->Lock(true);
@ -101,14 +105,14 @@ void PolyRenderer::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int
canvas->Unlock();
swrenderer::RenderTarget = screen;
swrenderer::bRenderingToCanvas = false;
viewport->RenderTarget = screen;
viewport->bRenderingToCanvas = false;
R_ExecuteSetViewSize();
float trueratio;
ActiveRatio(width, height, &trueratio);
swrenderer::RenderViewport::Instance()->SetViewport(width, height, WidescreenRatio);
viewport->SetViewport(width, height, WidescreenRatio);
viewactive = savedviewactive;
swrenderer::r_swtruecolor = savedoutputformat;
viewport->r_swtruecolor = savedoutputformat;
}
void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines)
@ -157,8 +161,9 @@ void PolyRenderer::RenderRemainingPlayerSprites()
void PolyRenderer::ClearBuffers()
{
PolyVertexBuffer::Clear();
PolyStencilBuffer::Instance()->Clear(swrenderer::RenderTarget->GetWidth(), swrenderer::RenderTarget->GetHeight(), 0);
PolySubsectorGBuffer::Instance()->Resize(swrenderer::RenderTarget->GetPitch(), swrenderer::RenderTarget->GetHeight());
auto viewport = swrenderer::RenderViewport::Instance();
PolyStencilBuffer::Instance()->Clear(viewport->RenderTarget->GetWidth(), viewport->RenderTarget->GetHeight(), 0);
PolySubsectorGBuffer::Instance()->Resize(viewport->RenderTarget->GetPitch(), viewport->RenderTarget->GetHeight());
NextStencilValue = 0;
SeenLinePortals.clear();
SeenMirrors.clear();
@ -168,7 +173,9 @@ void PolyRenderer::SetSceneViewport()
{
using namespace swrenderer;
if (RenderTarget == screen) // Rendering to screen
auto viewport = RenderViewport::Instance();
if (viewport->RenderTarget == screen) // Rendering to screen
{
int height;
if (screenblocks >= 10)
@ -177,11 +184,11 @@ void PolyRenderer::SetSceneViewport()
height = (screenblocks*SCREENHEIGHT / 10) & ~7;
int bottom = SCREENHEIGHT - (height + viewwindowy - ((height - viewheight) / 2));
PolyTriangleDrawer::set_viewport(viewwindowx, SCREENHEIGHT - bottom - height, viewwidth, height, RenderTarget);
PolyTriangleDrawer::set_viewport(viewwindowx, SCREENHEIGHT - bottom - height, viewwidth, height, viewport->RenderTarget);
}
else // Rendering to camera texture
{
PolyTriangleDrawer::set_viewport(0, 0, RenderTarget->GetWidth(), RenderTarget->GetHeight(), RenderTarget);
PolyTriangleDrawer::set_viewport(0, 0, viewport->RenderTarget->GetWidth(), viewport->RenderTarget->GetHeight(), viewport->RenderTarget);
}
}

View file

@ -151,7 +151,7 @@ void RenderPolyDecal::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
}
args.uniforms.subsectorDepth = subsectorDepth;
if (swrenderer::r_swtruecolor)
if (swrenderer::RenderViewport::Instance()->r_swtruecolor)
{
args.uniforms.color = 0xff000000 | decal->AlphaColor;
}

View file

@ -90,7 +90,7 @@ void RenderPolyParticle::Render(const TriMatrix &worldToClip, const Vec4f &clipP
uint32_t alpha = (uint32_t)clamp(particle->alpha * 255.0f + 0.5f, 0.0f, 255.0f);
if (swrenderer::r_swtruecolor)
if (swrenderer::RenderViewport::Instance()->r_swtruecolor)
{
args.uniforms.color = (alpha << 24) | (particle->color & 0xffffff);
}

View file

@ -141,22 +141,24 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
sy += wy;
}
auto viewport = swrenderer::RenderViewport::Instance();
double pspritexscale = centerxwide / 160.0;
double pspriteyscale = pspritexscale * swrenderer::YaspectMul;
double pspriteyscale = pspritexscale * viewport->YaspectMul;
double pspritexiscale = 1 / pspritexscale;
// calculate edges of the shape
double tx = sx - BaseXCenter;
tx -= tex->GetScaledLeftOffset();
int x1 = xs_RoundToInt(swrenderer::CenterX + tx * pspritexscale);
int x1 = xs_RoundToInt(viewport->CenterX + tx * pspritexscale);
// off the right side
if (x1 > viewwidth)
return;
tx += tex->GetScaledWidth();
int x2 = xs_RoundToInt(swrenderer::CenterX + tx * pspritexscale);
int x2 = xs_RoundToInt(viewport->CenterX + tx * pspritexscale);
// off the left side
if (x2 <= 0)
@ -165,12 +167,12 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
double texturemid = (BaseYCenter - sy) * tex->Scale.Y + tex->TopOffset;
// Adjust PSprite for fullscreen views
if (camera->player && (swrenderer::RenderTarget != screen || viewheight == swrenderer::RenderTarget->GetHeight() || (swrenderer::RenderTarget->GetWidth() > (BaseXCenter * 2) && !st_scale)))
if (camera->player && (viewport->RenderTarget != screen || viewheight == viewport->RenderTarget->GetHeight() || (viewport->RenderTarget->GetWidth() > (BaseXCenter * 2) && !st_scale)))
{
AWeapon *weapon = dyn_cast<AWeapon>(sprite->GetCaller());
if (weapon != nullptr && weapon->YAdjust != 0)
{
if (swrenderer::RenderTarget != screen || viewheight == swrenderer::RenderTarget->GetHeight())
if (viewport->RenderTarget != screen || viewheight == viewport->RenderTarget->GetHeight())
{
texturemid -= weapon->YAdjust;
}
@ -343,7 +345,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
// Check for hardware-assisted 2D. If it's available, and this sprite is not
// fuzzy, don't draw it until after the switch to 2D mode.
if (!noaccel && swrenderer::RenderTarget == screen && (DFrameBuffer *)screen->Accel2D)
if (!noaccel && swrenderer::RenderViewport::Instance()->RenderTarget == screen && (DFrameBuffer *)screen->Accel2D)
{
FRenderStyle style = RenderStyle;
style.CheckFuzz();

View file

@ -94,7 +94,7 @@ void PolySkyDome::RenderRow(PolyDrawArgs &args, int row, uint32_t capcolor)
void PolySkyDome::RenderCapColorRow(PolyDrawArgs &args, FTexture *skytex, int row, bool bottomCap)
{
uint32_t solid = skytex->GetSkyCapColor(bottomCap);
if (!swrenderer::r_swtruecolor)
if (!swrenderer::RenderViewport::Instance()->r_swtruecolor)
solid = RGB32k.RGB[(RPART(solid) >> 3)][(GPART(solid) >> 3)][(BPART(solid) >> 3)];
args.vinput = &mVertices[mPrimStart[row]];

View file

@ -250,7 +250,7 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const Vec4f &clipPla
args.SetTexture(tex, thing->Translation, true);
}
if (!swrenderer::r_swtruecolor)
if (!swrenderer::RenderViewport::Instance()->r_swtruecolor)
{
uint32_t r = (args.uniforms.color >> 16) & 0xff;
uint32_t g = (args.uniforms.color >> 8) & 0xff;

View file

@ -44,8 +44,6 @@ namespace swrenderer
#define PARTICLE_TEXTURE_SIZE 64
extern uint32_t particle_texture[PARTICLE_TEXTURE_SIZE * PARTICLE_TEXTURE_SIZE];
extern bool r_swtruecolor;
class SWPixelFormatDrawers
{
public:

View file

@ -106,7 +106,7 @@ namespace swrenderer
_dest = args.Dest();
_dest_y = args.DestY();
_fracbits = args.dc_wall_fracbits;
_pitch = dc_pitch;
_pitch = RenderViewport::Instance()->dc_pitch;
_srcblend = args.dc_srcblend;
_destblend = args.dc_destblend;
_dynlights = args.dc_lights;
@ -564,7 +564,7 @@ namespace swrenderer
_dest = args.Dest();
_dest_y = args.DestY();
_count = args.Count();
_pitch = dc_pitch;
_pitch = RenderViewport::Instance()->dc_pitch;
_source = args.FrontTexturePixels();
_source2 = args.BackTexturePixels();
_sourceheight[0] = args.FrontTextureHeight();
@ -870,7 +870,7 @@ namespace swrenderer
_count = args.dc_count;
_dest = args.Dest();
_dest_y = args.DestY();
_pitch = dc_pitch;
_pitch = RenderViewport::Instance()->dc_pitch;
_iscale = args.dc_iscale;
_texturefrac = args.dc_texturefrac;
_colormap = args.Colormap();
@ -1767,8 +1767,8 @@ namespace swrenderer
_yl = args.dc_yl;
_yh = args.dc_yh;
_x = args.dc_x;
_destorg = dc_destorg;
_pitch = dc_pitch;
_destorg = RenderViewport::Instance()->dc_destorg;
_pitch = RenderViewport::Instance()->dc_pitch;
_fuzzpos = fuzzpos;
_fuzzviewheight = fuzzviewheight;
}
@ -1858,7 +1858,7 @@ namespace swrenderer
_y = args.DestY();
_x1 = args.DestX1();
_x2 = args.DestX2();
_destorg = dc_destorg;
_destorg = RenderViewport::Instance()->dc_destorg;
_xstep = args.TextureUStep();
_ystep = args.TextureVStep();
_xbits = args.TextureWidthBits();
@ -2628,7 +2628,7 @@ namespace swrenderer
: y(y), x1(x1), x2(x2), plane_sz(plane_sz), plane_su(plane_su), plane_sv(plane_sv), plane_shade(plane_shade), planeshade(planeshade), planelightfloat(planelightfloat), pviewx(pviewx), pviewy(pviewy)
{
_colormap = args.Colormap();
_destorg = dc_destorg;
_destorg = RenderViewport::Instance()->dc_destorg;
_ybits = args.TextureHeightBits();
_xbits = args.TextureWidthBits();
_source = args.TexturePixels();
@ -2873,7 +2873,7 @@ namespace swrenderer
DrawColoredSpanPalCommand::DrawColoredSpanPalCommand(const SpanDrawerArgs &args, int y, int x1, int x2) : PalSpanCommand(args), y(y), x1(x1), x2(x2)
{
color = args.SolidColor();
destorg = dc_destorg;
destorg = RenderViewport::Instance()->dc_destorg;
}
void DrawColoredSpanPalCommand::Execute(DrawerThread *thread)
@ -2889,7 +2889,7 @@ namespace swrenderer
DrawFogBoundaryLinePalCommand::DrawFogBoundaryLinePalCommand(const SpanDrawerArgs &args, int y, int x1, int x2) : PalSpanCommand(args), y(y), x1(x1), x2(x2)
{
_colormap = args.Colormap();
_destorg = dc_destorg;
_destorg = RenderViewport::Instance()->dc_destorg;
}
void DrawFogBoundaryLinePalCommand::Execute(DrawerThread *thread)

View file

@ -72,8 +72,8 @@ namespace swrenderer
args.y = drawerargs.DestY();
args.xbits = drawerargs.TextureWidthBits();
args.ybits = drawerargs.TextureHeightBits();
args.destorg = (uint32_t*)dc_destorg;
args.destpitch = dc_pitch;
args.destorg = (uint32_t*)RenderViewport::Instance()->dc_destorg;
args.destpitch = RenderViewport::Instance()->dc_pitch;
args.source = (const uint32_t*)drawerargs.TexturePixels();
args.light = LightBgra::calc_light_multiplier(drawerargs.Light());
args.light_red = shade_constants.light_red;
@ -186,7 +186,7 @@ namespace swrenderer
auto shade_constants = drawerargs.ColormapConstants();
args.dest = (uint32_t*)drawerargs.Dest();
args.dest_y = drawerargs.DestY();
args.pitch = dc_pitch;
args.pitch = RenderViewport::Instance()->dc_pitch;
args.count = drawerargs.dc_count;
args.texturefrac[0] = drawerargs.dc_texturefrac;
args.texturefracx[0] = drawerargs.dc_texturefracx;
@ -256,7 +256,7 @@ namespace swrenderer
args.colormap = drawerargs.Colormap();
args.translation = drawerargs.TranslationMap();
args.basecolors = (const uint32_t *)GPalette.BaseColors;
args.pitch = dc_pitch;
args.pitch = RenderViewport::Instance()->dc_pitch;
args.count = drawerargs.dc_count;
args.dest_y = drawerargs.DestY();
args.iscale = drawerargs.dc_iscale;
@ -307,7 +307,7 @@ namespace swrenderer
args.dest = (uint32_t*)drawerargs.Dest();
args.dest_y = drawerargs.DestY();
args.count = drawerargs.Count();
args.pitch = dc_pitch;
args.pitch = RenderViewport::Instance()->dc_pitch;
args.texturefrac[0] = drawerargs.TextureVPos();
args.iscale[0] = drawerargs.TextureVStep();
args.source0[0] = (const uint32_t *)drawerargs.FrontTexturePixels();
@ -331,8 +331,8 @@ namespace swrenderer
_x = drawerargs.dc_x;
_yl = drawerargs.dc_yl;
_yh = drawerargs.dc_yh;
_destorg = dc_destorg;
_pitch = dc_pitch;
_destorg = RenderViewport::Instance()->dc_destorg;
_pitch = RenderViewport::Instance()->dc_pitch;
_fuzzpos = fuzzpos;
_fuzzviewheight = fuzzviewheight;
}
@ -439,7 +439,7 @@ namespace swrenderer
_x1 = drawerargs.DestX1();
_x2 = drawerargs.DestX2();
_y = drawerargs.DestY();
_destorg = dc_destorg;
_destorg = RenderViewport::Instance()->dc_destorg;
_light = drawerargs.Light();
_color = drawerargs.SolidColor();
}
@ -470,7 +470,7 @@ namespace swrenderer
_x = x;
_x2 = x2;
_destorg = dc_destorg;
_destorg = RenderViewport::Instance()->dc_destorg;
_light = drawerargs.Light();
_shade_constants = drawerargs.ColormapConstants();
}
@ -537,7 +537,7 @@ namespace swrenderer
_x1 = x1;
_x2 = x2;
_y = y;
_destorg = dc_destorg;
_destorg = RenderViewport::Instance()->dc_destorg;
_light = drawerargs.Light();
_shade_constants = drawerargs.ColormapConstants();
_plane_sz = plane_sz;
@ -672,7 +672,7 @@ namespace swrenderer
_x1 = x1;
_x2 = x2;
_destorg = dc_destorg;
_destorg = RenderViewport::Instance()->dc_destorg;
_light = drawerargs.Light();
_color = drawerargs.SolidColor();
}
@ -709,8 +709,8 @@ namespace swrenderer
_color = color;
_a = a;
_destorg = dc_destorg;
_pitch = dc_pitch;
_destorg = RenderViewport::Instance()->dc_destorg;
_pitch = RenderViewport::Instance()->dc_pitch;
}
void FillTransColumnRGBACommand::Execute(DrawerThread *thread)

View file

@ -41,7 +41,7 @@ namespace swrenderer
{
SWPixelFormatDrawers *DrawerArgs::Drawers()
{
if (r_swtruecolor)
if (RenderViewport::Instance()->r_swtruecolor)
{
static SWTruecolorDrawers tc_drawers;
return &tc_drawers;
@ -80,7 +80,7 @@ namespace swrenderer
{
if (mBaseColormap)
{
if (r_swtruecolor)
if (RenderViewport::Instance()->r_swtruecolor)
return mBaseColormap->Maps;
else
return mBaseColormap->Maps + (GETPALOOKUP(mLight, mShade) << COLORMAPSHIFT);
@ -137,14 +137,17 @@ namespace swrenderer
ds_ybits--;
}
ds_source = r_swtruecolor ? (const uint8_t*)tex->GetPixelsBgra() : tex->GetPixels();
auto viewport = RenderViewport::Instance();
ds_source = viewport->r_swtruecolor ? (const uint8_t*)tex->GetPixelsBgra() : tex->GetPixels();
ds_source_mipmapped = tex->Mipmapped() && tex->GetWidth() > 1 && tex->GetHeight() > 1;
}
void SpriteDrawerArgs::DrawMaskedColumn(int x, fixed_t iscale, FTexture *tex, fixed_t col, double spryscale, double sprtopscreen, bool sprflipvert, const short *mfloorclip, const short *mceilingclip, bool unmasked)
{
auto viewport = RenderViewport::Instance();
// Handle the linear filtered version in a different function to reduce chances of merge conflicts from zdoom.
if (r_swtruecolor && !drawer_needs_pal_input) // To do: add support to R_DrawColumnHoriz_rgba
if (viewport->r_swtruecolor && !drawer_needs_pal_input) // To do: add support to R_DrawColumnHoriz_rgba
{
DrawMaskedColumnBgra(x, iscale, tex, col, spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip, unmasked);
return;
@ -156,7 +159,7 @@ namespace swrenderer
const FTexture::Span *span;
const BYTE *column;
if (r_swtruecolor && !drawer_needs_pal_input)
if (viewport->r_swtruecolor && !drawer_needs_pal_input)
column = (const BYTE *)tex->GetColumnBgra(col >> FRACBITS, &span);
else
column = tex->GetColumn(col >> FRACBITS, &span);
@ -171,7 +174,7 @@ namespace swrenderer
unmaskedSpan[1].Length = 0;
}
int pixelsize = r_swtruecolor ? 4 : 1;
int pixelsize = viewport->r_swtruecolor ? 4 : 1;
while (span->Length != 0)
{
@ -501,6 +504,8 @@ namespace swrenderer
alpha = clamp<fixed_t>(alpha, 0, OPAQUE);
}
auto viewport = RenderViewport::Instance();
if (translation != -1)
{
SetTranslationMap(nullptr);
@ -509,7 +514,7 @@ namespace swrenderer
FRemapTable *table = TranslationToTable(translation);
if (table != NULL && !table->Inactive)
{
if (r_swtruecolor)
if (viewport->r_swtruecolor)
SetTranslationMap((uint8_t*)table->Palette);
else
SetTranslationMap(table->Remap);
@ -585,8 +590,9 @@ namespace swrenderer
void WallDrawerArgs::SetDest(int x, int y)
{
int pixelsize = r_swtruecolor ? 4 : 1;
dc_dest = dc_destorg + (ylookup[y] + x) * pixelsize;
auto viewport = RenderViewport::Instance();
int pixelsize = viewport->r_swtruecolor ? 4 : 1;
dc_dest = viewport->dc_destorg + (ylookup[y] + x) * pixelsize;
dc_dest_y = y;
}
@ -719,14 +725,15 @@ namespace swrenderer
void SkyDrawerArgs::SetDest(int x, int y)
{
int pixelsize = r_swtruecolor ? 4 : 1;
dc_dest = dc_destorg + (ylookup[y] + x) * pixelsize;
auto viewport = RenderViewport::Instance();
int pixelsize = viewport->r_swtruecolor ? 4 : 1;
dc_dest = viewport->dc_destorg + (ylookup[y] + x) * pixelsize;
dc_dest_y = y;
}
void SkyDrawerArgs::SetFrontTexture(FTexture *texture, uint32_t column)
{
if (r_swtruecolor)
if (RenderViewport::Instance()->r_swtruecolor)
{
dc_source = (const uint8_t *)texture->GetColumnBgra(column, nullptr);
dc_sourceheight = texture->GetHeight();
@ -745,7 +752,7 @@ namespace swrenderer
dc_source2 = nullptr;
dc_sourceheight2 = 1;
}
else if (r_swtruecolor)
else if (RenderViewport::Instance()->r_swtruecolor)
{
dc_source2 = (const uint8_t *)texture->GetColumnBgra(column, nullptr);
dc_sourceheight2 = texture->GetHeight();
@ -764,8 +771,9 @@ namespace swrenderer
void SpriteDrawerArgs::SetDest(int x, int y)
{
int pixelsize = r_swtruecolor ? 4 : 1;
dc_dest = dc_destorg + (ylookup[y] + x) * pixelsize;
auto viewport = RenderViewport::Instance();
int pixelsize = viewport->r_swtruecolor ? 4 : 1;
dc_dest = viewport->dc_destorg + (ylookup[y] + x) * pixelsize;
dc_dest_y = y;
}
}

View file

@ -1148,6 +1148,7 @@ namespace swrenderer
tright.Y = float(pt2.X * ViewTanCos + pt2.Y * ViewTanSin);
RenderPortal *renderportal = RenderPortal::Instance();
auto viewport = RenderViewport::Instance();
if (renderportal->MirrorFlags & RF_XFLIP)
{
@ -1161,7 +1162,7 @@ namespace swrenderer
{
if (tleft.X > tleft.Y) return true; // left edge is off the right side
if (tleft.Y == 0) return true;
sx1 = xs_RoundToInt(CenterX + tleft.X * CenterX / tleft.Y);
sx1 = xs_RoundToInt(viewport->CenterX + tleft.X * viewport->CenterX / tleft.Y);
sz1 = tleft.Y;
}
else
@ -1180,7 +1181,7 @@ namespace swrenderer
{
if (tright.X < -tright.Y) return true; // right edge is off the left side
if (tright.Y == 0) return true;
sx2 = xs_RoundToInt(CenterX + tright.X * CenterX / tright.Y);
sx2 = xs_RoundToInt(viewport->CenterX + tright.X * viewport->CenterX / tright.Y);
sz2 = tright.Y;
}
else

View file

@ -48,6 +48,7 @@ namespace swrenderer
{
void RenderDrawSegment::Render(DrawSegment *ds, int x1, int x2)
{
auto viewport = RenderViewport::Instance();
RenderFogBoundary renderfog;
float *MaskedSWall = nullptr, MaskedScaleY = 0, rw_scalestep = 0;
fixed_t *maskedtexturecol = nullptr;
@ -209,12 +210,12 @@ namespace swrenderer
}
// [RH] Don't bother drawing segs that are completely offscreen
if (globaldclip * ds->sz1 < -textop && globaldclip * ds->sz2 < -textop)
if (viewport->globaldclip * ds->sz1 < -textop && viewport->globaldclip * ds->sz2 < -textop)
{ // Texture top is below the bottom of the screen
goto clearfog;
}
if (globaluclip * ds->sz1 > texheight - textop && globaluclip * ds->sz2 > texheight - textop)
if (viewport->globaluclip * ds->sz1 > texheight - textop && viewport->globaluclip * ds->sz2 > texheight - textop)
{ // Texture bottom is above the top of the screen
goto clearfog;
}
@ -290,9 +291,9 @@ namespace swrenderer
fixed_t iscale = xs_Fix<16>::ToFix(MaskedSWall[x] * MaskedScaleY);
double sprtopscreen;
if (sprflipvert)
sprtopscreen = CenterY + texturemid * spryscale;
sprtopscreen = viewport->CenterY + texturemid * spryscale;
else
sprtopscreen = CenterY - texturemid * spryscale;
sprtopscreen = viewport->CenterY - texturemid * spryscale;
columndrawerargs.DrawMaskedColumn(x, iscale, tex, maskedtexturecol[x], spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip);

View file

@ -45,9 +45,11 @@ namespace swrenderer
{
WallSampler::WallSampler(int y1, double texturemid, float swal, double yrepeat, fixed_t xoffset, double xmagnitude, FTexture *texture)
{
auto viewport = RenderViewport::Instance();
xoffset += FLOAT2FIXED(xmagnitude * 0.5);
if (!r_swtruecolor)
if (!viewport->r_swtruecolor)
{
height = texture->GetHeight();
@ -59,7 +61,7 @@ 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 - CenterY + 0.5)) / height;
double v = (texturemid + uv_stepd * (y1 - viewport->CenterY + 0.5)) / height;
v = v - floor(v);
v *= height;
v *= (1 << uv_fracbits);
@ -86,7 +88,7 @@ namespace swrenderer
col = width + (col % width);
}
if (r_swtruecolor)
if (viewport->r_swtruecolor)
source = (const uint8_t *)texture->GetColumnBgra(col, nullptr);
else
source = texture->GetColumn(col, nullptr);
@ -98,7 +100,7 @@ namespace swrenderer
{
// Normalize to 0-1 range:
double uv_stepd = swal * yrepeat;
double v = (texturemid + uv_stepd * (y1 - CenterY + 0.5)) / texture->GetHeight();
double v = (texturemid + uv_stepd * (y1 - viewport->CenterY + 0.5)) / texture->GetHeight();
v = v - floor(v);
double v_step = uv_stepd / texture->GetHeight();
@ -172,16 +174,18 @@ namespace swrenderer
{
if (r_dynlights && light_list)
{
auto viewport = RenderViewport::Instance();
// Find column position in view space
float w1 = 1.0f / WallC.sz1;
float w2 = 1.0f / WallC.sz2;
float t = (x - WallC.sx1 + 0.5f) / (WallC.sx2 - WallC.sx1);
float wcol = w1 * (1.0f - t) + w2 * t;
float zcol = 1.0f / wcol;
drawerargs.dc_viewpos.X = (float)((x + 0.5 - CenterX) / CenterX * zcol);
drawerargs.dc_viewpos.X = (float)((x + 0.5 - viewport->CenterX) / viewport->CenterX * zcol);
drawerargs.dc_viewpos.Y = zcol;
drawerargs.dc_viewpos.Z = (float)((CenterY - y1 - 0.5) / InvZtoScale * zcol);
drawerargs.dc_viewpos_step.Z = (float)(-zcol / InvZtoScale);
drawerargs.dc_viewpos.Z = (float)((viewport->CenterY - y1 - 0.5) / viewport->InvZtoScale * zcol);
drawerargs.dc_viewpos_step.Z = (float)(-zcol / viewport->InvZtoScale);
static TriLight lightbuffer[64 * 1024];
static int nextlightindex = 0;
@ -236,7 +240,7 @@ namespace swrenderer
drawerargs.dc_num_lights = 0;
}
if (r_swtruecolor)
if (RenderViewport::Instance()->r_swtruecolor)
{
int count = y2 - y1;
@ -320,7 +324,7 @@ namespace swrenderer
texturemid = 0;
}
drawerargs.dc_wall_fracbits = r_swtruecolor ? FRACBITS : fracbits;
drawerargs.dc_wall_fracbits = RenderViewport::Instance()->r_swtruecolor ? FRACBITS : fracbits;
CameraLight *cameraLight = CameraLight::Instance();
bool fixed = (cameraLight->fixedcolormap != NULL || cameraLight->fixedlightlev >= 0);

View file

@ -34,8 +34,10 @@ namespace swrenderer
ProjectedWallCull ProjectedWallLine::Project(double z1, double z2, const FWallCoords *wallc)
{
float y1 = (float)(CenterY - z1 * InvZtoScale / wallc->sz1);
float y2 = (float)(CenterY - z2 * InvZtoScale / wallc->sz2);
auto viewport = RenderViewport::Instance();
float y1 = (float)(viewport->CenterY - z1 * viewport->InvZtoScale / wallc->sz1);
float y2 = (float)(viewport->CenterY - z2 * viewport->InvZtoScale / wallc->sz2);
if (y1 < 0 && y2 < 0) // entire line is above screen
{
@ -151,13 +153,15 @@ namespace swrenderer
void ProjectedWallTexcoords::Project(double walxrepeat, int x1, int x2, const FWallTmapVals &WallT)
{
float uOverZ = WallT.UoverZorg + WallT.UoverZstep * (float)(x1 + 0.5 - CenterX);
float invZ = WallT.InvZorg + WallT.InvZstep * (float)(x1 + 0.5 - CenterX);
auto viewport = RenderViewport::Instance();
float uOverZ = WallT.UoverZorg + WallT.UoverZstep * (float)(x1 + 0.5 - viewport->CenterX);
float invZ = WallT.InvZorg + WallT.InvZstep * (float)(x1 + 0.5 - viewport->CenterX);
float uGradient = WallT.UoverZstep;
float zGradient = WallT.InvZstep;
float xrepeat = (float)walxrepeat;
float depthScale = (float)(WallT.InvZstep * WallTMapScale2);
float depthOrg = (float)(-WallT.UoverZstep * WallTMapScale2);
float depthScale = (float)(WallT.InvZstep * viewport->WallTMapScale2);
float depthOrg = (float)(-WallT.UoverZstep * viewport->WallTMapScale2);
if (xrepeat < 0.0f)
{
@ -189,8 +193,10 @@ namespace swrenderer
void ProjectedWallTexcoords::ProjectPos(double walxrepeat, int x1, int x2, const FWallTmapVals &WallT)
{
float uOverZ = WallT.UoverZorg + WallT.UoverZstep * (float)(x1 + 0.5 - CenterX);
float invZ = WallT.InvZorg + WallT.InvZstep * (float)(x1 + 0.5 - CenterX);
auto viewport = RenderViewport::Instance();
float uOverZ = WallT.UoverZorg + WallT.UoverZstep * (float)(x1 + 0.5 - viewport->CenterX);
float invZ = WallT.InvZorg + WallT.InvZstep * (float)(x1 + 0.5 - viewport->CenterX);
float uGradient = WallT.UoverZstep;
float zGradient = WallT.InvZstep;
float xrepeat = (float)walxrepeat;

View file

@ -78,9 +78,11 @@ namespace swrenderer
// left to right mapping
planeang += (ViewAngle - 90).Radians();
auto viewport = RenderViewport::Instance();
// Scale will be unit scale at FocalLengthX (normally SCREENWIDTH/2) distance
xstep = cos(planeang) / FocalLengthX;
ystep = -sin(planeang) / FocalLengthX;
xstep = cos(planeang) / viewport->FocalLengthX;
ystep = -sin(planeang) / viewport->FocalLengthX;
// [RH] flip for mirrors
RenderPortal *renderportal = RenderPortal::Instance();
@ -171,11 +173,13 @@ namespace swrenderer
drawerargs.SetTextureVPos(0);
}
if (r_swtruecolor)
auto viewport = RenderViewport::Instance();
if (viewport->r_swtruecolor)
{
double distance2 = planeheight * yslope[(y + 1 < viewheight) ? y + 1 : y - 1];
double xmagnitude = fabs(ystepscale * (distance2 - distance) * FocalLengthX);
double ymagnitude = fabs(xstepscale * (distance2 - distance) * FocalLengthX);
double xmagnitude = fabs(ystepscale * (distance2 - distance) * viewport->FocalLengthX);
double ymagnitude = fabs(xstepscale * (distance2 - distance) * viewport->FocalLengthX);
double magnitude = MAX(ymagnitude, xmagnitude);
double min_lod = -1000.0;
drawerargs.SetTextureLOD(MAX(log2(magnitude) + r_lod_bias, min_lod));
@ -184,17 +188,17 @@ namespace swrenderer
if (plane_shade)
{
// Determine lighting based on the span's distance from the viewer.
drawerargs.SetColorMapLight(basecolormap, (float)(GlobVis * fabs(CenterY - y)), planeshade);
drawerargs.SetColorMapLight(basecolormap, (float)(GlobVis * fabs(viewport->CenterY - y)), planeshade);
}
if (r_dynlights)
{
// Find row position in view space
float zspan = (float)(planeheight / (fabs(y + 0.5 - CenterY) / InvZtoScale));
drawerargs.dc_viewpos.X = (float)((x1 + 0.5 - CenterX) / CenterX * zspan);
float zspan = (float)(planeheight / (fabs(y + 0.5 - viewport->CenterY) / viewport->InvZtoScale));
drawerargs.dc_viewpos.X = (float)((x1 + 0.5 - viewport->CenterX) / viewport->CenterX * zspan);
drawerargs.dc_viewpos.Y = zspan;
drawerargs.dc_viewpos.Z = (float)((CenterY - y - 0.5) / InvZtoScale * zspan);
drawerargs.dc_viewpos_step.X = (float)(zspan / CenterX);
drawerargs.dc_viewpos.Z = (float)((viewport->CenterY - y - 0.5) / viewport->InvZtoScale * zspan);
drawerargs.dc_viewpos_step.X = (float)(zspan / viewport->CenterX);
static TriLight lightbuffer[64 * 1024];
static int nextlightindex = 0;
@ -202,7 +206,7 @@ namespace swrenderer
// Plane normal
drawerargs.dc_normal.X = 0.0f;
drawerargs.dc_normal.Y = 0.0f;
drawerargs.dc_normal.Z = (y >= CenterY) ? 1.0f : -1.0f;
drawerargs.dc_normal.Z = (y >= viewport->CenterY) ? 1.0f : -1.0f;
// Setup lights for row
drawerargs.dc_num_lights = 0;
@ -266,13 +270,13 @@ namespace swrenderer
void RenderFlatPlane::SetupSlope()
{
int e, i;
auto viewport = RenderViewport::Instance();
i = 0;
e = viewheight;
float focus = float(FocalLengthY);
int i = 0;
int e = viewheight;
float focus = float(viewport->FocalLengthY);
float den;
float cy = float(CenterY);
float cy = float(viewport->CenterY);
if (i < centery)
{
den = cy - i - 0.5f;

View file

@ -169,11 +169,12 @@ namespace swrenderer
void RenderSkyPlane::DrawSkyColumnStripe(int start_x, int y1, int y2, double scale, double texturemid, double yrepeat)
{
RenderPortal *renderportal = RenderPortal::Instance();
auto viewport = RenderViewport::Instance();
uint32_t height = frontskytex->GetHeight();
double uv_stepd = skyiscale * yrepeat;
double v = (texturemid + uv_stepd * (y1 - CenterY + 0.5)) / height;
double v = (texturemid + uv_stepd * (y1 - viewport->CenterY + 0.5)) / height;
double v_step = uv_stepd / height;
uint32_t uv_pos = (uint32_t)(v * 0x01000000);
@ -192,7 +193,7 @@ namespace swrenderer
}
else
{
ang = (skyangle + xtoviewangle[x]) ^ skyflip;
ang = (skyangle + viewport->xtoviewangle[x]) ^ skyflip;
}
angle1 = (uint32_t)((UMulScale16(ang, frontcyl) + frontpos) >> FRACBITS);
angle2 = (uint32_t)((UMulScale16(ang, backcyl) + backpos) >> FRACBITS);
@ -222,13 +223,14 @@ namespace swrenderer
}
else
{
auto viewport = RenderViewport::Instance();
double yrepeat = frontskytex->Scale.Y;
double scale = frontskytex->Scale.Y * skyscale;
double iscale = 1 / scale;
short drawheight = short(frontskytex->GetHeight() * scale);
double topfrac = fmod(skymid + iscale * (1 - CenterY), frontskytex->GetHeight());
double topfrac = fmod(skymid + iscale * (1 - viewport->CenterY), frontskytex->GetHeight());
if (topfrac < 0) topfrac += frontskytex->GetHeight();
double texturemid = topfrac - iscale * (1 - CenterY);
double texturemid = topfrac - iscale * (1 - viewport->CenterY);
DrawSkyColumnStripe(start_x, y1, y2, scale, texturemid, yrepeat);
}
}

View file

@ -70,6 +70,8 @@ namespace swrenderer
return;
}
auto viewport = RenderViewport::Instance();
drawerargs.SetSolidColor(3);
drawerargs.SetTexture(texture);
@ -124,13 +126,13 @@ namespace swrenderer
plane_sv = p ^ n;
plane_sz = m ^ n;
plane_su.Z *= FocalLengthX;
plane_sv.Z *= FocalLengthX;
plane_sz.Z *= FocalLengthX;
plane_su.Z *= viewport->FocalLengthX;
plane_sv.Z *= viewport->FocalLengthX;
plane_sz.Z *= viewport->FocalLengthX;
plane_su.Y *= IYaspectMul;
plane_sv.Y *= IYaspectMul;
plane_sz.Y *= IYaspectMul;
plane_su.Y *= viewport->IYaspectMul;
plane_sv.Y *= viewport->IYaspectMul;
plane_sz.Y *= viewport->IYaspectMul;
// Premultiply the texture vectors with the scale factors
plane_su *= 4294967296.f;

View file

@ -89,7 +89,7 @@ void FSoftwareRenderer::Init()
{
gl_ParseDefs();
r_swtruecolor = screen->IsBgra();
RenderViewport::Instance()->r_swtruecolor = screen->IsBgra();
RenderScene::Instance()->Init();
}
@ -249,8 +249,10 @@ void FSoftwareRenderer::SetClearColor(int color)
void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov)
{
BYTE *Pixels = r_swtruecolor ? (BYTE*)tex->GetPixelsBgra() : (BYTE*)tex->GetPixels();
DSimpleCanvas *Canvas = r_swtruecolor ? tex->GetCanvasBgra() : tex->GetCanvas();
auto viewport = RenderViewport::Instance();
BYTE *Pixels = viewport->r_swtruecolor ? (BYTE*)tex->GetPixelsBgra() : (BYTE*)tex->GetPixels();
DSimpleCanvas *Canvas = viewport->r_swtruecolor ? tex->GetCanvasBgra() : tex->GetCanvas();
// curse Doom's overuse of global variables in the renderer.
// These get clobbered by rendering to a camera texture but they need to be preserved so the final rendering can be done with the correct palette.
@ -289,7 +291,7 @@ void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoin
}
}
if (r_swtruecolor)
if (viewport->r_swtruecolor)
{
// True color render still sometimes uses palette textures (for sprites, mostly).
// We need to make sure that both pixel buffers contain data:

View file

@ -59,7 +59,8 @@ namespace swrenderer
if (player->fixedcolormap >= 0 && player->fixedcolormap < (int)SpecialColormaps.Size())
{
realfixedcolormap = &SpecialColormaps[player->fixedcolormap];
if (RenderTarget == screen && (r_swtruecolor || ((DFrameBuffer *)screen->Accel2D && r_shadercolormaps)))
auto viewport = RenderViewport::Instance();
if (viewport->RenderTarget == screen && (viewport->r_swtruecolor || ((DFrameBuffer *)screen->Accel2D && r_shadercolormaps)))
{
// Render everything fullbright. The copy to video memory will
// apply the special colormap, so it won't be restricted to the
@ -105,7 +106,8 @@ namespace swrenderer
CurrentVisibility = vis;
if (FocalTangent == 0 || FocalLengthY == 0)
auto viewport = RenderViewport::Instance();
if (FocalTangent == 0 || viewport->FocalLengthY == 0)
{ // If r_visibility is called before the renderer is all set up, don't
// divide by zero. This will be called again later, and the proper
// values can be initialized then.
@ -114,9 +116,9 @@ namespace swrenderer
BaseVisibility = vis;
MaxVisForWall = (InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * FocalTangent));
MaxVisForWall = (viewport->InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * FocalTangent));
MaxVisForWall = 32767.0 / MaxVisForWall;
MaxVisForFloor = 32767.0 / (viewheight >> 2) * FocalLengthY / 160;
MaxVisForFloor = 32767.0 / (viewheight >> 2) * viewport->FocalLengthY / 160;
// Prevent overflow on walls
if (BaseVisibility < 0 && BaseVisibility < -MaxVisForWall)
@ -126,7 +128,7 @@ namespace swrenderer
else
WallVisibility = BaseVisibility;
WallVisibility = (InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) /
WallVisibility = (viewport->InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) /
(viewwidth*SCREENHEIGHT * 3)) * (WallVisibility * FocalTangent);
// Prevent overflow on floors/ceilings. Note that the calculation of
@ -140,7 +142,7 @@ namespace swrenderer
else
FloorVisibility = BaseVisibility;
FloorVisibility = 160.0 * FloorVisibility / FocalLengthY;
FloorVisibility = 160.0 * FloorVisibility / viewport->FocalLengthY;
TiltVisibility = float(vis * FocalTangent * (16.f * 320.f) / viewwidth);
}

View file

@ -84,7 +84,7 @@ namespace swrenderer
double WallVis(double screenZ) const { return WallGlobVis() / screenZ; }
double SpriteVis(double screenZ) const { return WallGlobVis() / screenZ; }
double ParticleVis(double screenZ) const { return WallGlobVis() / screenZ; }
double FlatPlaneVis(int screenY, double planeZ) const { return FlatPlaneGlobVis() / fabs(planeZ - ViewPos.Z) * fabs(CenterY - screenY); }
double FlatPlaneVis(int screenY, double planeZ) const { return FlatPlaneGlobVis() / fabs(planeZ - ViewPos.Z) * fabs(RenderViewport::Instance()->CenterY - screenY); }
private:
double BaseVisibility = 0.0;

View file

@ -349,11 +349,13 @@ namespace swrenderer
swapvalues(ry1, ry2);
}
auto viewport = RenderViewport::Instance();
if (rx1 >= -ry1)
{
if (rx1 > ry1) return false; // left edge is off the right side
if (ry1 == 0) return false;
sx1 = xs_RoundToInt(CenterX + rx1 * CenterX / ry1);
sx1 = xs_RoundToInt(viewport->CenterX + rx1 * viewport->CenterX / ry1);
}
else
{
@ -366,7 +368,7 @@ namespace swrenderer
{
if (rx2 < -ry2) return false; // right edge is off the left side
if (ry2 == 0) return false;
sx2 = xs_RoundToInt(CenterX + rx2 * CenterX / ry2);
sx2 = xs_RoundToInt(viewport->CenterX + rx2 * viewport->CenterX / ry2);
}
else
{
@ -810,9 +812,10 @@ namespace swrenderer
void RenderOpaquePass::ClearClip()
{
auto viewport = RenderViewport::Instance();
// clip ceiling to console bottom
fillshort(floorclip, viewwidth, viewheight);
fillshort(ceilingclip, viewwidth, !screen->Accel2D && ConBottom > viewwindowy && !bRenderingToCanvas ? (ConBottom - viewwindowy) : 0);
fillshort(ceilingclip, viewwidth, !screen->Accel2D && ConBottom > viewwindowy && !viewport->bRenderingToCanvas ? (ConBottom - viewwindowy) : 0);
}
void RenderOpaquePass::AddSprites(sector_t *sec, int lightlevel, WaterFakeSide fakeside, bool foggy, FDynamicColormap *basecolormap)

View file

@ -289,22 +289,24 @@ namespace swrenderer
void RenderPortal::RenderLinePortal(PortalDrawseg* pds, int depth)
{
auto viewport = RenderViewport::Instance();
// [ZZ] check depth. fill portal with black if it's exceeding the visual recursion limit, and continue like nothing happened.
if (depth >= r_portal_recursions)
{
BYTE color = (BYTE)BestColor((DWORD *)GPalette.BaseColors, 0, 0, 0, 0, 255);
int spacing = RenderTarget->GetPitch();
int spacing = viewport->RenderTarget->GetPitch();
for (int x = pds->x1; x < pds->x2; x++)
{
if (x < 0 || x >= RenderTarget->GetWidth())
if (x < 0 || x >= viewport->RenderTarget->GetWidth())
continue;
int Ytop = pds->ceilingclip[x - pds->x1];
int Ybottom = pds->floorclip[x - pds->x1];
if (r_swtruecolor)
if (viewport->r_swtruecolor)
{
uint32_t *dest = (uint32_t*)RenderTarget->GetBuffer() + x + Ytop * spacing;
uint32_t *dest = (uint32_t*)viewport->RenderTarget->GetBuffer() + x + Ytop * spacing;
uint32_t c = GPalette.BaseColors[color].d;
for (int y = Ytop; y <= Ybottom; y++)
@ -315,7 +317,7 @@ namespace swrenderer
}
else
{
BYTE *dest = RenderTarget->GetBuffer() + x + Ytop * spacing;
BYTE *dest = viewport->RenderTarget->GetBuffer() + x + Ytop * spacing;
for (int y = Ytop; y <= Ybottom; y++)
{
@ -483,16 +485,18 @@ namespace swrenderer
// [ZZ] NO OVERFLOW CHECKS HERE
// I believe it won't break. if it does, blame me. :(
if (r_swtruecolor) // Assuming this is just a debug function
auto viewport = RenderViewport::Instance();
if (viewport->r_swtruecolor) // Assuming this is just a debug function
return;
BYTE color = (BYTE)BestColor((DWORD *)GPalette.BaseColors, 255, 0, 0, 0, 255);
BYTE* pixels = RenderTarget->GetBuffer();
BYTE* pixels = viewport->RenderTarget->GetBuffer();
// top edge
for (int x = pds->x1; x < pds->x2; x++)
{
if (x < 0 || x >= RenderTarget->GetWidth())
if (x < 0 || x >= viewport->RenderTarget->GetWidth())
continue;
int p = x - pds->x1;
@ -501,7 +505,7 @@ namespace swrenderer
if (x == pds->x1 || x == pds->x2 - 1)
{
RenderTarget->DrawLine(x, Ytop, x, Ybottom + 1, color, 0);
viewport->RenderTarget->DrawLine(x, Ytop, x, Ybottom + 1, color, 0);
continue;
}
@ -509,12 +513,12 @@ namespace swrenderer
int YbottomPrev = pds->floorclip[p - 1];
if (abs(Ytop - YtopPrev) > 1)
RenderTarget->DrawLine(x, YtopPrev, x, Ytop, color, 0);
else *(pixels + Ytop * RenderTarget->GetPitch() + x) = color;
viewport->RenderTarget->DrawLine(x, YtopPrev, x, Ytop, color, 0);
else *(pixels + Ytop * viewport->RenderTarget->GetPitch() + x) = color;
if (abs(Ybottom - YbottomPrev) > 1)
RenderTarget->DrawLine(x, YbottomPrev, x, Ybottom, color, 0);
else *(pixels + Ybottom * RenderTarget->GetPitch() + x) = color;
viewport->RenderTarget->DrawLine(x, YbottomPrev, x, Ybottom, color, 0);
else *(pixels + Ybottom * viewport->RenderTarget->GetPitch() + x) = color;
}
}

View file

@ -68,30 +68,31 @@ namespace swrenderer
void RenderScene::RenderView(player_t *player)
{
RenderTarget = screen;
auto viewport = RenderViewport::Instance();
viewport->RenderTarget = screen;
int width = SCREENWIDTH;
int height = SCREENHEIGHT;
float trueratio;
ActiveRatio(width, height, &trueratio);
RenderViewport::Instance()->SetViewport(width, height, trueratio);
viewport->SetViewport(width, height, trueratio);
if (r_swtruecolor != screen->IsBgra())
if (viewport->r_swtruecolor != screen->IsBgra())
{
r_swtruecolor = screen->IsBgra();
viewport->r_swtruecolor = screen->IsBgra();
}
if (r_clearbuffer != 0)
{
if (!r_swtruecolor)
if (!viewport->r_swtruecolor)
{
memset(RenderTarget->GetBuffer(), clearcolor, RenderTarget->GetPitch() * RenderTarget->GetHeight());
memset(viewport->RenderTarget->GetBuffer(), clearcolor, viewport->RenderTarget->GetPitch() * viewport->RenderTarget->GetHeight());
}
else
{
uint32_t bgracolor = GPalette.BaseColors[clearcolor].d;
int size = RenderTarget->GetPitch() * RenderTarget->GetHeight();
uint32_t *dest = (uint32_t *)RenderTarget->GetBuffer();
int size = viewport->RenderTarget->GetPitch() * viewport->RenderTarget->GetHeight();
uint32_t *dest = (uint32_t *)viewport->RenderTarget->GetBuffer();
for (int i = 0; i < size; i++)
dest[i] = bgracolor;
}
@ -102,7 +103,7 @@ namespace swrenderer
RenderActorView(player->mo);
// Apply special colormap if the target cannot do it
if (CameraLight::Instance()->realfixedcolormap && r_swtruecolor && !(r_shadercolormaps && screen->Accel2D))
if (CameraLight::Instance()->realfixedcolormap && viewport->r_swtruecolor && !(r_shadercolormaps && screen->Accel2D))
{
DrawerCommandQueue::QueueCommand<ApplySpecialColormapRGBACommand>(CameraLight::Instance()->realfixedcolormap, screen);
}
@ -187,7 +188,7 @@ namespace swrenderer
// If we don't want shadered colormaps, NULL it now so that the
// copy to the screen does not use a special colormap shader.
if (!r_shadercolormaps && !r_swtruecolor)
if (!r_shadercolormaps && !RenderViewport::Instance()->r_swtruecolor)
{
CameraLight::Instance()->realfixedcolormap = NULL;
}
@ -195,53 +196,56 @@ namespace swrenderer
void RenderScene::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int y, int width, int height, bool dontmaplines)
{
const bool savedviewactive = viewactive;
const bool savedoutputformat = r_swtruecolor;
auto viewport = RenderViewport::Instance();
if (r_swtruecolor != canvas->IsBgra())
const bool savedviewactive = viewactive;
const bool savedoutputformat = viewport->r_swtruecolor;
if (viewport->r_swtruecolor != canvas->IsBgra())
{
r_swtruecolor = canvas->IsBgra();
viewport->r_swtruecolor = canvas->IsBgra();
}
R_BeginDrawerCommands();
viewwidth = width;
RenderTarget = canvas;
bRenderingToCanvas = true;
viewport->RenderTarget = canvas;
viewport->bRenderingToCanvas = true;
R_SetWindow(12, width, height, height, true);
viewwindowx = x;
viewwindowy = y;
viewactive = true;
RenderViewport::Instance()->SetViewport(width, height, WidescreenRatio);
viewport->SetViewport(width, height, WidescreenRatio);
RenderActorView(actor, dontmaplines);
R_EndDrawerCommands();
RenderTarget = screen;
bRenderingToCanvas = false;
viewport->RenderTarget = screen;
viewport->bRenderingToCanvas = false;
R_ExecuteSetViewSize();
float trueratio;
ActiveRatio(width, height, &trueratio);
screen->Lock(true);
RenderViewport::Instance()->SetViewport(width, height, trueratio);
viewport->SetViewport(width, height, trueratio);
screen->Unlock();
viewactive = savedviewactive;
r_swtruecolor = savedoutputformat;
viewport->r_swtruecolor = savedoutputformat;
}
void RenderScene::ScreenResized()
{
RenderTarget = screen;
auto viewport = RenderViewport::Instance();
viewport->RenderTarget = screen;
int width = SCREENWIDTH;
int height = SCREENHEIGHT;
float trueratio;
ActiveRatio(width, height, &trueratio);
screen->Lock(true);
RenderViewport::Instance()->SetViewport(SCREENWIDTH, SCREENHEIGHT, trueratio);
viewport->SetViewport(SCREENWIDTH, SCREENHEIGHT, trueratio);
screen->Unlock();
}

View file

@ -38,32 +38,6 @@ CVAR(String, r_viewsize, "", CVAR_NOSET)
namespace swrenderer
{
bool r_swtruecolor;
fixed_t viewingrangerecip;
double FocalLengthX;
double FocalLengthY;
DCanvas *RenderTarget;
bool bRenderingToCanvas;
double globaluclip, globaldclip;
double CenterX, CenterY;
double YaspectMul;
double BaseYaspectMul; // yaspectmul without a forced aspect ratio
double IYaspectMul;
double InvZtoScale;
double WallTMapScale2;
uint8_t *dc_destorg;
int dc_destheight;
int dc_pitch;
// The xtoviewangleangle[] table maps a screen pixel
// to the lowest viewangle that maps back to x ranges
// from clipangle to -clipangle.
angle_t xtoviewangle[MAXWIDTH + 1];
RenderViewport *RenderViewport::Instance()
{
static RenderViewport instance;

View file

@ -18,26 +18,6 @@
namespace swrenderer
{
extern DCanvas *RenderTarget;
extern bool bRenderingToCanvas;
extern fixed_t viewingrangerecip;
extern double FocalLengthX;
extern double FocalLengthY;
extern double InvZtoScale;
extern double WallTMapScale2;
extern double CenterX;
extern double CenterY;
extern double YaspectMul;
extern double IYaspectMul;
extern bool r_swtruecolor;
extern double globaluclip;
extern double globaldclip;
extern angle_t xtoviewangle[MAXWIDTH + 1];
extern uint8_t *dc_destorg;
extern int dc_destheight;
extern int dc_pitch;
class RenderViewport
{
public:
@ -46,8 +26,34 @@ namespace swrenderer
void SetViewport(int width, int height, float trueratio);
void SetupFreelook();
DCanvas *RenderTarget = nullptr;
bool bRenderingToCanvas = false;
fixed_t viewingrangerecip = 0;
double FocalLengthX = 0.0;
double FocalLengthY = 0.0;
double InvZtoScale = 0.0;
double WallTMapScale2 = 0.0;
double CenterX = 0.0;
double CenterY = 0.0;
double YaspectMul = 0.0;
double IYaspectMul = 0.0;
bool r_swtruecolor = false;
double globaluclip = 0.0;
double globaldclip = 0.0;
// The xtoviewangleangle[] table maps a screen pixel
// to the lowest viewangle that maps back to x ranges
// from clipangle to -clipangle.
angle_t xtoviewangle[MAXWIDTH + 1];
uint8_t *dc_destorg = nullptr;
int dc_destheight = 0;
int dc_pitch = 0;
private:
void InitTextureMapping();
void SetupBuffer();
double BaseYaspectMul = 0.0; // yaspectmul without a forced aspect ratio
};
}

View file

@ -317,13 +317,15 @@ namespace swrenderer
void RenderDecal::DrawColumn(SpriteDrawerArgs &drawerargs, int x, FTexture *WallSpriteTile, const ProjectedWallTexcoords &walltexcoords, double texturemid, float maskedScaleY, bool sprflipvert, const short *mfloorclip, const short *mceilingclip)
{
auto viewport = RenderViewport::Instance();
float iscale = walltexcoords.VStep[x] * maskedScaleY;
double spryscale = 1 / iscale;
double sprtopscreen;
if (sprflipvert)
sprtopscreen = CenterY + texturemid * spryscale;
sprtopscreen = viewport->CenterY + texturemid * spryscale;
else
sprtopscreen = CenterY - texturemid * spryscale;
sprtopscreen = viewport->CenterY - texturemid * spryscale;
drawerargs.DrawMaskedColumn(x, FLOAT2FIXED(iscale), WallSpriteTile, walltexcoords.UPos[x], spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip);
}

View file

@ -109,10 +109,12 @@ namespace swrenderer
if (x1 >= x2)
return;
auto viewport = RenderViewport::Instance();
yscale = xscale; // YaspectMul is not needed for particles as they should always be square
ty = particle->Pos.Z - ViewPos.Z;
y1 = xs_RoundToInt(CenterY - (ty + psize) * yscale);
y2 = xs_RoundToInt(CenterY - (ty - psize) * yscale);
y1 = xs_RoundToInt(viewport->CenterY - (ty + psize) * yscale);
y2 = xs_RoundToInt(viewport->CenterY - (ty - psize) * yscale);
// Clip the particle now. Because it's a point and projected as its subsector is
// entered, we don't need to clip it to drawsegs like a normal sprite.
@ -228,20 +230,22 @@ namespace swrenderer
fixed_t fglevel = ((vis->renderflags + 1) << 8) & ~0x3ff;
uint32_t alpha = fglevel * 256 / FRACUNIT;
spacing = RenderTarget->GetPitch();
auto viewport = RenderViewport::Instance();
spacing = viewport->RenderTarget->GetPitch();
uint32_t fracstepx = PARTICLE_TEXTURE_SIZE * FRACUNIT / countbase;
uint32_t fracposx = fracstepx / 2;
RenderTranslucentPass *translucentPass = RenderTranslucentPass::Instance();
if (r_swtruecolor)
if (viewport->r_swtruecolor)
{
for (int x = x1; x < (x1 + countbase); x++, fracposx += fracstepx)
{
if (translucentPass->ClipSpriteColumnWithPortals(x, vis))
continue;
uint32_t *dest = ylookup[yl] + x + (uint32_t*)dc_destorg;
uint32_t *dest = ylookup[yl] + x + (uint32_t*)viewport->dc_destorg;
DrawerCommandQueue::QueueCommand<DrawParticleColumnRGBACommand>(dest, yl, spacing, ycount, fg, alpha, fracposx);
}
}
@ -251,7 +255,7 @@ namespace swrenderer
{
if (translucentPass->ClipSpriteColumnWithPortals(x, vis))
continue;
uint8_t *dest = ylookup[yl] + x + dc_destorg;
uint8_t *dest = ylookup[yl] + x + viewport->dc_destorg;
DrawerCommandQueue::QueueCommand<DrawParticleColumnPalCommand>(dest, yl, spacing, ycount, fg, alpha, fracposx);
}
}

View file

@ -136,11 +136,13 @@ namespace swrenderer
if (camera->player != NULL)
{
double centerhack = CenterY;
auto viewport = RenderViewport::Instance();
double centerhack = viewport->CenterY;
double wx, wy;
float bobx, boby;
CenterY = viewheight / 2;
viewport->CenterY = viewheight / 2;
P_BobWeapon(camera->player, &bobx, &boby, r_TicFracF);
@ -181,7 +183,7 @@ namespace swrenderer
psp = psp->GetNext();
}
CenterY = centerhack;
viewport->CenterY = centerhack;
}
}
@ -242,22 +244,24 @@ namespace swrenderer
sy += wy;
}
auto viewport = RenderViewport::Instance();
double pspritexscale = centerxwide / 160.0;
double pspriteyscale = pspritexscale * YaspectMul;
double pspriteyscale = pspritexscale * viewport->YaspectMul;
double pspritexiscale = 1 / pspritexscale;
// calculate edges of the shape
tx = sx - BASEXCENTER;
tx -= tex->GetScaledLeftOffset();
x1 = xs_RoundToInt(CenterX + tx * pspritexscale);
x1 = xs_RoundToInt(viewport->CenterX + tx * pspritexscale);
// off the right side
if (x1 > viewwidth)
return;
tx += tex->GetScaledWidth();
x2 = xs_RoundToInt(CenterX + tx * pspritexscale);
x2 = xs_RoundToInt(viewport->CenterX + tx * pspritexscale);
// off the left side
if (x2 <= 0)
@ -270,14 +274,14 @@ namespace swrenderer
vis.texturemid = (BASEYCENTER - sy) * tex->Scale.Y + tex->TopOffset;
if (camera->player && (RenderTarget != screen ||
viewheight == RenderTarget->GetHeight() ||
(RenderTarget->GetWidth() > (BASEXCENTER * 2) && !st_scale)))
if (camera->player && (viewport->RenderTarget != screen ||
viewheight == viewport->RenderTarget->GetHeight() ||
(viewport->RenderTarget->GetWidth() > (BASEXCENTER * 2) && !st_scale)))
{ // Adjust PSprite for fullscreen views
AWeapon *weapon = dyn_cast<AWeapon>(pspr->GetCaller());
if (weapon != nullptr && weapon->YAdjust != 0)
{
if (RenderTarget != screen || viewheight == RenderTarget->GetHeight())
if (viewport->RenderTarget != screen || viewheight == viewport->RenderTarget->GetHeight())
{
vis.texturemid -= weapon->YAdjust;
}
@ -499,7 +503,7 @@ namespace swrenderer
// Check for hardware-assisted 2D. If it's available, and this sprite is not
// fuzzy, don't draw it until after the switch to 2D mode.
if (!noaccel && RenderTarget == screen && (DFrameBuffer *)screen->Accel2D)
if (!noaccel && viewport->RenderTarget == screen && (DFrameBuffer *)screen->Accel2D)
{
FRenderStyle style = vis.RenderStyle;
style.CheckFuzz();
@ -600,18 +604,20 @@ namespace swrenderer
bool sprflipvert = false;
fixed_t iscale = FLOAT2FIXED(1 / yscale);
auto viewport = RenderViewport::Instance();
double sprtopscreen;
if (renderflags & RF_YFLIP)
{
sprflipvert = true;
spryscale = -spryscale;
iscale = -iscale;
sprtopscreen = CenterY + (texturemid - pic->GetHeight()) * spryscale;
sprtopscreen = viewport->CenterY + (texturemid - pic->GetHeight()) * spryscale;
}
else
{
sprflipvert = false;
sprtopscreen = CenterY - texturemid * spryscale;
sprtopscreen = viewport->CenterY - texturemid * spryscale;
}
// clip to screen bounds

View file

@ -121,10 +121,12 @@ namespace swrenderer
}
}
double xscale = CenterX / tz;
auto viewport = RenderViewport::Instance();
double xscale = viewport->CenterX / tz;
// [RH] Reject sprites that are off the top or bottom of the screen
if (globaluclip * tz > ViewPos.Z - gzb || globaldclip * tz < ViewPos.Z - gzt)
if (viewport->globaluclip * tz > ViewPos.Z - gzb || viewport->globaldclip * tz < ViewPos.Z - gzt)
{
return;
}
@ -160,7 +162,7 @@ namespace swrenderer
vis->CurrentPortalUniq = renderportal->CurrentPortalUniq;
vis->xscale = FLOAT2FIXED(xscale);
vis->yscale = float(InvZtoScale * yscale / tz);
vis->yscale = float(viewport->InvZtoScale * yscale / tz);
vis->idepth = float(1 / tz);
vis->floorclip = thing->Floorclip / yscale;
vis->texturemid = tex->TopOffset - (ViewPos.Z - pos.Z + thing->Floorclip) / yscale;
@ -262,18 +264,20 @@ namespace swrenderer
xiscale = vis->xiscale;
double texturemid = vis->texturemid;
auto viewport = RenderViewport::Instance();
if (vis->renderflags & RF_YFLIP)
{
sprflipvert = true;
spryscale = -spryscale;
iscale = -iscale;
texturemid -= vis->pic->GetHeight();
sprtopscreen = CenterY + texturemid * spryscale;
sprtopscreen = viewport->CenterY + texturemid * spryscale;
}
else
{
sprflipvert = false;
sprtopscreen = CenterY - texturemid * spryscale;
sprtopscreen = viewport->CenterY - texturemid * spryscale;
}
int x = vis->x1;

View file

@ -150,7 +150,9 @@ namespace swrenderer
// Clip the sprite against deep water and/or fake ceilings.
// [RH] rewrote this to be based on which part of the sector is really visible
double scale = InvZtoScale * spr->idepth;
auto viewport = RenderViewport::Instance();
double scale = viewport->InvZtoScale * spr->idepth;
double hzb = DBL_MIN, hzt = DBL_MAX;
if (spr->IsVoxel() && spr->floorclip != 0)
@ -163,7 +165,7 @@ namespace swrenderer
if (spr->FakeFlatStat != WaterFakeSide::AboveCeiling)
{
double hz = spr->heightsec->floorplane.ZatPoint(spr->gpos);
int h = xs_RoundToInt(CenterY - (hz - ViewPos.Z) * scale);
int h = xs_RoundToInt(viewport->CenterY - (hz - ViewPos.Z) * scale);
if (spr->FakeFlatStat == WaterFakeSide::BelowFloor)
{ // seen below floor: clip top
@ -185,7 +187,7 @@ namespace swrenderer
if (spr->FakeFlatStat != WaterFakeSide::BelowFloor && !(spr->heightsec->MoreFlags & SECF_FAKEFLOORONLY))
{
double hz = spr->heightsec->ceilingplane.ZatPoint(spr->gpos);
int h = xs_RoundToInt(CenterY - (hz - ViewPos.Z) * scale);
int h = xs_RoundToInt(viewport->CenterY - (hz - ViewPos.Z) * scale);
if (spr->FakeFlatStat == WaterFakeSide::AboveCeiling)
{ // seen above ceiling: clip bottom
@ -209,7 +211,7 @@ namespace swrenderer
else if (!spr->IsVoxel() && spr->floorclip)
{ // [RH] Move floorclip stuff from R_DrawVisSprite to here
//int clip = ((FLOAT2FIXED(CenterY) - FixedMul (spr->texturemid - (spr->pic->GetHeight() << FRACBITS) + spr->floorclip, spr->yscale)) >> FRACBITS);
int clip = xs_RoundToInt(CenterY - (spr->texturemid - spr->pic->GetHeight() + spr->floorclip) * spr->yscale);
int clip = xs_RoundToInt(viewport->CenterY - (spr->texturemid - spr->pic->GetHeight() + spr->floorclip) * spr->yscale);
if (clip < botclip)
{
botclip = MAX<short>(0, clip);
@ -229,7 +231,7 @@ namespace swrenderer
hz = spr->fakefloor->bottom.plane->Zat0();
}
}
int h = xs_RoundToInt(CenterY - (hz - ViewPos.Z) * scale);
int h = xs_RoundToInt(viewport->CenterY - (hz - ViewPos.Z) * scale);
if (h < botclip)
{
botclip = MAX<short>(0, h);
@ -250,7 +252,7 @@ namespace swrenderer
hz = spr->fakeceiling->top.plane->Zat0();
}
}
int h = xs_RoundToInt(CenterY - (hz - ViewPos.Z) * scale);
int h = xs_RoundToInt(viewport->CenterY - (hz - ViewPos.Z) * scale);
if (h > topclip)
{
topclip = short(MIN(h, viewheight));

View file

@ -184,6 +184,7 @@ namespace swrenderer
void RenderVoxel::Render(short *cliptop, short *clipbottom, int minZ, int maxZ)
{
auto sprite = this;
auto viewport = RenderViewport::Instance();
FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(sprite->Light.BaseColormap);
@ -208,7 +209,7 @@ namespace swrenderer
double viewCos = view_angle.Sin();
double logmip = fabs((view_origin.X - sprite_origin.X) * viewCos - (view_origin.Y - sprite_origin.Y) * viewSin);
int miplevel = 0;
while (miplevel < voxel->NumMips - 1 && logmip >= FocalLengthX)
while (miplevel < voxel->NumMips - 1 && logmip >= viewport->FocalLengthX)
{
logmip *= 0.5;
miplevel++;
@ -313,6 +314,8 @@ namespace swrenderer
void RenderVoxel::FillBox(SpriteDrawerArgs &drawerargs, DVector3 origin, double extentX, double extentY, int color, short *cliptop, short *clipbottom, bool viewspace, bool pixelstretch)
{
auto viewport = RenderViewport::Instance();
double viewX, viewY, viewZ;
if (viewspace)
{
@ -333,17 +336,17 @@ namespace swrenderer
if (viewZ < 0.01f)
return;
double screenX = CenterX + viewX / viewZ * CenterX;
double screenY = CenterY - viewY / viewZ * InvZtoScale;
double screenExtentX = extentX / viewZ * CenterX;
double screenExtentY = pixelstretch ? screenExtentX * YaspectMul : screenExtentX;
double screenX = viewport->CenterX + viewX / viewZ * viewport->CenterX;
double screenY = viewport->CenterY - viewY / viewZ * viewport->InvZtoScale;
double screenExtentX = extentX / viewZ * viewport->CenterX;
double screenExtentY = pixelstretch ? screenExtentX * viewport->YaspectMul : screenExtentX;
int x1 = MAX((int)(screenX - screenExtentX), 0);
int x2 = MIN((int)(screenX + screenExtentX + 0.5f), viewwidth - 1);
int y1 = MAX((int)(screenY - screenExtentY), 0);
int y2 = MIN((int)(screenY + screenExtentY + 0.5f), viewheight - 1);
int pixelsize = r_swtruecolor ? 4 : 1;
int pixelsize = viewport->r_swtruecolor ? 4 : 1;
if (y1 < y2)
{

View file

@ -247,13 +247,15 @@ namespace swrenderer
void RenderWallSprite::DrawColumn(SpriteDrawerArgs &drawerargs, int x, FTexture *WallSpriteTile, const ProjectedWallTexcoords &walltexcoords, double texturemid, float maskedScaleY, bool sprflipvert, const short *mfloorclip, const short *mceilingclip)
{
auto viewport = RenderViewport::Instance();
float iscale = walltexcoords.VStep[x] * maskedScaleY;
double spryscale = 1 / iscale;
double sprtopscreen;
if (sprflipvert)
sprtopscreen = CenterY + texturemid * spryscale;
sprtopscreen = viewport->CenterY + texturemid * spryscale;
else
sprtopscreen = CenterY - texturemid * spryscale;
sprtopscreen = viewport->CenterY - texturemid * spryscale;
drawerargs.DrawMaskedColumn(x, FLOAT2FIXED(iscale), WallSpriteTile, walltexcoords.UPos[x], spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip);
}

View file

@ -147,7 +147,9 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
static short bottomclipper[MAXWIDTH], topclipper[MAXWIDTH];
const BYTE *translation = NULL;
r_swtruecolor = IsBgra();
auto viewport = RenderViewport::Instance();
viewport->r_swtruecolor = IsBgra();
if (APART(parms.colorOverlay) != 0)
{
@ -165,7 +167,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
parms.colorOverlay = PalEntry(parms.colorOverlay).InverseColor();
}
// Note that this overrides DTA_Translation in software, but not in hardware.
if (!r_swtruecolor)
if (!viewport->r_swtruecolor)
{
FDynamicColormap *colormap = GetSpecialLights(MAKERGB(255, 255, 255),
parms.colorOverlay & MAKEARGB(0, 255, 255, 255), 0);
@ -174,7 +176,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
}
else if (parms.remap != NULL)
{
if (r_swtruecolor)
if (viewport->r_swtruecolor)
translation = (const BYTE*)parms.remap->Palette;
else
translation = parms.remap->Remap;
@ -188,7 +190,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
}
else
{
if (r_swtruecolor)
if (viewport->r_swtruecolor)
drawerargs.SetTranslationMap(nullptr);
else
drawerargs.SetTranslationMap(identitymap);
@ -196,16 +198,16 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
bool visible;
FDynamicColormap *basecolormap = nullptr;
if (r_swtruecolor)
if (viewport->r_swtruecolor)
visible = drawerargs.SetPatchStyle(parms.style, parms.Alpha, -1, parms.fillcolor, basecolormap);
else
visible = drawerargs.SetPatchStyle(parms.style, parms.Alpha, 0, parms.fillcolor, basecolormap);
BYTE *destorgsave = dc_destorg;
int destheightsave = dc_destheight;
dc_destorg = screen->GetBuffer();
dc_destheight = screen->GetHeight();
if (dc_destorg == NULL)
BYTE *destorgsave = viewport->dc_destorg;
int destheightsave = viewport->dc_destheight;
viewport->dc_destorg = screen->GetBuffer();
viewport->dc_destheight = screen->GetHeight();
if (viewport->dc_destorg == NULL)
{
I_FatalError("Attempt to write to buffer of hardware canvas");
}
@ -215,8 +217,8 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
if (visible)
{
double centeryback = CenterY;
CenterY = 0;
double centeryback = viewport->CenterY;
viewport->CenterY = 0;
// There is not enough precision in the drawing routines to keep the full
// precision for y0. :(
@ -292,11 +294,11 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
frac += xiscale_i;
}
CenterY = centeryback;
viewport->CenterY = centeryback;
}
dc_destorg = destorgsave;
dc_destheight = destheightsave;
viewport->dc_destorg = destorgsave;
viewport->dc_destheight = destheightsave;
if (ticdup != 0 && menuactive == MENU_Off)
{
@ -1368,9 +1370,11 @@ void DCanvas::FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
return;
}
BYTE *destorgsave = dc_destorg;
dc_destorg = screen->GetBuffer();
if (dc_destorg == NULL)
auto viewport = RenderViewport::Instance();
BYTE *destorgsave = viewport->dc_destorg;
viewport->dc_destorg = screen->GetBuffer();
if (viewport->dc_destorg == NULL)
{
I_FatalError("Attempt to write to buffer of hardware canvas");
}
@ -1497,7 +1501,7 @@ void DCanvas::FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
pt1 = pt2;
pt2--; if (pt2 < 0) pt2 = npoints;
} while (pt1 != botpt);
dc_destorg = destorgsave;
viewport->dc_destorg = destorgsave;
#endif
}