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

View file

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

View file

@ -53,47 +53,51 @@ PolyRenderer *PolyRenderer::Instance()
void PolyRenderer::RenderView(player_t *player) void PolyRenderer::RenderView(player_t *player)
{ {
using namespace swrenderer; using namespace swrenderer;
auto viewport = RenderViewport::Instance();
swrenderer::RenderTarget = screen; viewport->RenderTarget = screen;
bool saved_swtruecolor = r_swtruecolor; bool saved_swtruecolor = viewport->r_swtruecolor;
r_swtruecolor = screen->IsBgra(); viewport->r_swtruecolor = screen->IsBgra();
int width = SCREENWIDTH; int width = SCREENWIDTH;
int height = SCREENHEIGHT; int height = SCREENHEIGHT;
int stHeight = gST_Y; int stHeight = gST_Y;
float trueratio; float trueratio;
ActiveRatio(width, height, &trueratio); ActiveRatio(width, height, &trueratio);
RenderViewport::Instance()->SetViewport(width, height, trueratio); viewport->SetViewport(width, height, trueratio);
RenderActorView(player->mo, false); RenderActorView(player->mo, false);
// Apply special colormap if the target cannot do it // Apply special colormap if the target cannot do it
CameraLight *cameraLight = CameraLight::Instance(); 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(); R_BeginDrawerCommands();
DrawerCommandQueue::QueueCommand<ApplySpecialColormapRGBACommand>(cameraLight->realfixedcolormap, screen); DrawerCommandQueue::QueueCommand<ApplySpecialColormapRGBACommand>(cameraLight->realfixedcolormap, screen);
R_EndDrawerCommands(); 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) 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 savedviewactive = viewactive;
const bool savedoutputformat = swrenderer::r_swtruecolor; const bool savedoutputformat = viewport->r_swtruecolor;
viewwidth = width; viewwidth = width;
swrenderer::RenderTarget = canvas; viewport->RenderTarget = canvas;
swrenderer::bRenderingToCanvas = true; viewport->bRenderingToCanvas = true;
R_SetWindow(12, width, height, height, true); R_SetWindow(12, width, height, height, true);
swrenderer::RenderViewport::Instance()->SetViewport(width, height, WidescreenRatio); viewport->SetViewport(width, height, WidescreenRatio);
viewwindowx = x; viewwindowx = x;
viewwindowy = y; viewwindowy = y;
viewactive = true; viewactive = true;
swrenderer::r_swtruecolor = canvas->IsBgra(); viewport->r_swtruecolor = canvas->IsBgra();
canvas->Lock(true); canvas->Lock(true);
@ -101,14 +105,14 @@ void PolyRenderer::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int
canvas->Unlock(); canvas->Unlock();
swrenderer::RenderTarget = screen; viewport->RenderTarget = screen;
swrenderer::bRenderingToCanvas = false; viewport->bRenderingToCanvas = false;
R_ExecuteSetViewSize(); R_ExecuteSetViewSize();
float trueratio; float trueratio;
ActiveRatio(width, height, &trueratio); ActiveRatio(width, height, &trueratio);
swrenderer::RenderViewport::Instance()->SetViewport(width, height, WidescreenRatio); viewport->SetViewport(width, height, WidescreenRatio);
viewactive = savedviewactive; viewactive = savedviewactive;
swrenderer::r_swtruecolor = savedoutputformat; viewport->r_swtruecolor = savedoutputformat;
} }
void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines) void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines)
@ -157,8 +161,9 @@ void PolyRenderer::RenderRemainingPlayerSprites()
void PolyRenderer::ClearBuffers() void PolyRenderer::ClearBuffers()
{ {
PolyVertexBuffer::Clear(); PolyVertexBuffer::Clear();
PolyStencilBuffer::Instance()->Clear(swrenderer::RenderTarget->GetWidth(), swrenderer::RenderTarget->GetHeight(), 0); auto viewport = swrenderer::RenderViewport::Instance();
PolySubsectorGBuffer::Instance()->Resize(swrenderer::RenderTarget->GetPitch(), swrenderer::RenderTarget->GetHeight()); PolyStencilBuffer::Instance()->Clear(viewport->RenderTarget->GetWidth(), viewport->RenderTarget->GetHeight(), 0);
PolySubsectorGBuffer::Instance()->Resize(viewport->RenderTarget->GetPitch(), viewport->RenderTarget->GetHeight());
NextStencilValue = 0; NextStencilValue = 0;
SeenLinePortals.clear(); SeenLinePortals.clear();
SeenMirrors.clear(); SeenMirrors.clear();
@ -167,8 +172,10 @@ void PolyRenderer::ClearBuffers()
void PolyRenderer::SetSceneViewport() void PolyRenderer::SetSceneViewport()
{ {
using namespace swrenderer; using namespace swrenderer;
auto viewport = RenderViewport::Instance();
if (RenderTarget == screen) // Rendering to screen if (viewport->RenderTarget == screen) // Rendering to screen
{ {
int height; int height;
if (screenblocks >= 10) if (screenblocks >= 10)
@ -177,11 +184,11 @@ void PolyRenderer::SetSceneViewport()
height = (screenblocks*SCREENHEIGHT / 10) & ~7; height = (screenblocks*SCREENHEIGHT / 10) & ~7;
int bottom = SCREENHEIGHT - (height + viewwindowy - ((height - viewheight) / 2)); 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 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; args.uniforms.subsectorDepth = subsectorDepth;
if (swrenderer::r_swtruecolor) if (swrenderer::RenderViewport::Instance()->r_swtruecolor)
{ {
args.uniforms.color = 0xff000000 | decal->AlphaColor; 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); 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); args.uniforms.color = (alpha << 24) | (particle->color & 0xffffff);
} }

View file

@ -140,23 +140,25 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
sx += wx; sx += wx;
sy += wy; sy += wy;
} }
auto viewport = swrenderer::RenderViewport::Instance();
double pspritexscale = centerxwide / 160.0; double pspritexscale = centerxwide / 160.0;
double pspriteyscale = pspritexscale * swrenderer::YaspectMul; double pspriteyscale = pspritexscale * viewport->YaspectMul;
double pspritexiscale = 1 / pspritexscale; double pspritexiscale = 1 / pspritexscale;
// calculate edges of the shape // calculate edges of the shape
double tx = sx - BaseXCenter; double tx = sx - BaseXCenter;
tx -= tex->GetScaledLeftOffset(); tx -= tex->GetScaledLeftOffset();
int x1 = xs_RoundToInt(swrenderer::CenterX + tx * pspritexscale); int x1 = xs_RoundToInt(viewport->CenterX + tx * pspritexscale);
// off the right side // off the right side
if (x1 > viewwidth) if (x1 > viewwidth)
return; return;
tx += tex->GetScaledWidth(); tx += tex->GetScaledWidth();
int x2 = xs_RoundToInt(swrenderer::CenterX + tx * pspritexscale); int x2 = xs_RoundToInt(viewport->CenterX + tx * pspritexscale);
// off the left side // off the left side
if (x2 <= 0) if (x2 <= 0)
@ -165,12 +167,12 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
double texturemid = (BaseYCenter - sy) * tex->Scale.Y + tex->TopOffset; double texturemid = (BaseYCenter - sy) * tex->Scale.Y + tex->TopOffset;
// Adjust PSprite for fullscreen views // 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()); AWeapon *weapon = dyn_cast<AWeapon>(sprite->GetCaller());
if (weapon != nullptr && weapon->YAdjust != 0) 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; 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 // 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. // 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; FRenderStyle style = RenderStyle;
style.CheckFuzz(); 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) void PolySkyDome::RenderCapColorRow(PolyDrawArgs &args, FTexture *skytex, int row, bool bottomCap)
{ {
uint32_t solid = skytex->GetSkyCapColor(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)]; solid = RGB32k.RGB[(RPART(solid) >> 3)][(GPART(solid) >> 3)][(BPART(solid) >> 3)];
args.vinput = &mVertices[mPrimStart[row]]; 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); 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 r = (args.uniforms.color >> 16) & 0xff;
uint32_t g = (args.uniforms.color >> 8) & 0xff; uint32_t g = (args.uniforms.color >> 8) & 0xff;

View file

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

View file

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

View file

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

View file

@ -41,7 +41,7 @@ namespace swrenderer
{ {
SWPixelFormatDrawers *DrawerArgs::Drawers() SWPixelFormatDrawers *DrawerArgs::Drawers()
{ {
if (r_swtruecolor) if (RenderViewport::Instance()->r_swtruecolor)
{ {
static SWTruecolorDrawers tc_drawers; static SWTruecolorDrawers tc_drawers;
return &tc_drawers; return &tc_drawers;
@ -80,7 +80,7 @@ namespace swrenderer
{ {
if (mBaseColormap) if (mBaseColormap)
{ {
if (r_swtruecolor) if (RenderViewport::Instance()->r_swtruecolor)
return mBaseColormap->Maps; return mBaseColormap->Maps;
else else
return mBaseColormap->Maps + (GETPALOOKUP(mLight, mShade) << COLORMAPSHIFT); return mBaseColormap->Maps + (GETPALOOKUP(mLight, mShade) << COLORMAPSHIFT);
@ -137,14 +137,17 @@ namespace swrenderer
ds_ybits--; 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; 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) 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. // 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); DrawMaskedColumnBgra(x, iscale, tex, col, spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip, unmasked);
return; return;
@ -156,7 +159,7 @@ namespace swrenderer
const FTexture::Span *span; const FTexture::Span *span;
const BYTE *column; 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); column = (const BYTE *)tex->GetColumnBgra(col >> FRACBITS, &span);
else else
column = tex->GetColumn(col >> FRACBITS, &span); column = tex->GetColumn(col >> FRACBITS, &span);
@ -171,7 +174,7 @@ namespace swrenderer
unmaskedSpan[1].Length = 0; unmaskedSpan[1].Length = 0;
} }
int pixelsize = r_swtruecolor ? 4 : 1; int pixelsize = viewport->r_swtruecolor ? 4 : 1;
while (span->Length != 0) while (span->Length != 0)
{ {
@ -500,6 +503,8 @@ namespace swrenderer
{ {
alpha = clamp<fixed_t>(alpha, 0, OPAQUE); alpha = clamp<fixed_t>(alpha, 0, OPAQUE);
} }
auto viewport = RenderViewport::Instance();
if (translation != -1) if (translation != -1)
{ {
@ -509,7 +514,7 @@ namespace swrenderer
FRemapTable *table = TranslationToTable(translation); FRemapTable *table = TranslationToTable(translation);
if (table != NULL && !table->Inactive) if (table != NULL && !table->Inactive)
{ {
if (r_swtruecolor) if (viewport->r_swtruecolor)
SetTranslationMap((uint8_t*)table->Palette); SetTranslationMap((uint8_t*)table->Palette);
else else
SetTranslationMap(table->Remap); SetTranslationMap(table->Remap);
@ -585,8 +590,9 @@ namespace swrenderer
void WallDrawerArgs::SetDest(int x, int y) void WallDrawerArgs::SetDest(int x, int y)
{ {
int pixelsize = r_swtruecolor ? 4 : 1; auto viewport = RenderViewport::Instance();
dc_dest = dc_destorg + (ylookup[y] + x) * pixelsize; int pixelsize = viewport->r_swtruecolor ? 4 : 1;
dc_dest = viewport->dc_destorg + (ylookup[y] + x) * pixelsize;
dc_dest_y = y; dc_dest_y = y;
} }
@ -719,14 +725,15 @@ namespace swrenderer
void SkyDrawerArgs::SetDest(int x, int y) void SkyDrawerArgs::SetDest(int x, int y)
{ {
int pixelsize = r_swtruecolor ? 4 : 1; auto viewport = RenderViewport::Instance();
dc_dest = dc_destorg + (ylookup[y] + x) * pixelsize; int pixelsize = viewport->r_swtruecolor ? 4 : 1;
dc_dest = viewport->dc_destorg + (ylookup[y] + x) * pixelsize;
dc_dest_y = y; dc_dest_y = y;
} }
void SkyDrawerArgs::SetFrontTexture(FTexture *texture, uint32_t column) 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_source = (const uint8_t *)texture->GetColumnBgra(column, nullptr);
dc_sourceheight = texture->GetHeight(); dc_sourceheight = texture->GetHeight();
@ -745,7 +752,7 @@ namespace swrenderer
dc_source2 = nullptr; dc_source2 = nullptr;
dc_sourceheight2 = 1; dc_sourceheight2 = 1;
} }
else if (r_swtruecolor) else if (RenderViewport::Instance()->r_swtruecolor)
{ {
dc_source2 = (const uint8_t *)texture->GetColumnBgra(column, nullptr); dc_source2 = (const uint8_t *)texture->GetColumnBgra(column, nullptr);
dc_sourceheight2 = texture->GetHeight(); dc_sourceheight2 = texture->GetHeight();
@ -764,8 +771,9 @@ namespace swrenderer
void SpriteDrawerArgs::SetDest(int x, int y) void SpriteDrawerArgs::SetDest(int x, int y)
{ {
int pixelsize = r_swtruecolor ? 4 : 1; auto viewport = RenderViewport::Instance();
dc_dest = dc_destorg + (ylookup[y] + x) * pixelsize; int pixelsize = viewport->r_swtruecolor ? 4 : 1;
dc_dest = viewport->dc_destorg + (ylookup[y] + x) * pixelsize;
dc_dest_y = y; dc_dest_y = y;
} }
} }

View file

@ -1148,6 +1148,7 @@ namespace swrenderer
tright.Y = float(pt2.X * ViewTanCos + pt2.Y * ViewTanSin); tright.Y = float(pt2.X * ViewTanCos + pt2.Y * ViewTanSin);
RenderPortal *renderportal = RenderPortal::Instance(); RenderPortal *renderportal = RenderPortal::Instance();
auto viewport = RenderViewport::Instance();
if (renderportal->MirrorFlags & RF_XFLIP) 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.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(CenterX + tleft.X * CenterX / tleft.Y); sx1 = xs_RoundToInt(viewport->CenterX + tleft.X * viewport->CenterX / tleft.Y);
sz1 = tleft.Y; sz1 = tleft.Y;
} }
else else
@ -1180,7 +1181,7 @@ namespace swrenderer
{ {
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(CenterX + tright.X * CenterX / tright.Y); sx2 = xs_RoundToInt(viewport->CenterX + tright.X * viewport->CenterX / tright.Y);
sz2 = tright.Y; sz2 = tright.Y;
} }
else else

View file

@ -48,6 +48,7 @@ namespace swrenderer
{ {
void RenderDrawSegment::Render(DrawSegment *ds, int x1, int x2) void RenderDrawSegment::Render(DrawSegment *ds, int x1, int x2)
{ {
auto viewport = RenderViewport::Instance();
RenderFogBoundary renderfog; RenderFogBoundary renderfog;
float *MaskedSWall = nullptr, MaskedScaleY = 0, rw_scalestep = 0; float *MaskedSWall = nullptr, MaskedScaleY = 0, rw_scalestep = 0;
fixed_t *maskedtexturecol = nullptr; fixed_t *maskedtexturecol = nullptr;
@ -209,12 +210,12 @@ namespace swrenderer
} }
// [RH] Don't bother drawing segs that are completely offscreen // [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 { // Texture top is below the bottom of the screen
goto clearfog; 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 { // Texture bottom is above the top of the screen
goto clearfog; goto clearfog;
} }
@ -290,9 +291,9 @@ namespace swrenderer
fixed_t iscale = xs_Fix<16>::ToFix(MaskedSWall[x] * MaskedScaleY); fixed_t iscale = xs_Fix<16>::ToFix(MaskedSWall[x] * MaskedScaleY);
double sprtopscreen; double sprtopscreen;
if (sprflipvert) if (sprflipvert)
sprtopscreen = CenterY + texturemid * spryscale; sprtopscreen = viewport->CenterY + texturemid * spryscale;
else else
sprtopscreen = CenterY - texturemid * spryscale; sprtopscreen = viewport->CenterY - texturemid * spryscale;
columndrawerargs.DrawMaskedColumn(x, iscale, tex, maskedtexturecol[x], spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip); 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) 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); xoffset += FLOAT2FIXED(xmagnitude * 0.5);
if (!r_swtruecolor) if (!viewport->r_swtruecolor)
{ {
height = texture->GetHeight(); height = texture->GetHeight();
@ -59,7 +61,7 @@ namespace swrenderer
// Find start uv in [0-base_height[ range. // 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. // 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 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 = v - floor(v);
v *= height; v *= height;
v *= (1 << uv_fracbits); v *= (1 << uv_fracbits);
@ -86,7 +88,7 @@ namespace swrenderer
col = width + (col % width); col = width + (col % width);
} }
if (r_swtruecolor) if (viewport->r_swtruecolor)
source = (const uint8_t *)texture->GetColumnBgra(col, nullptr); source = (const uint8_t *)texture->GetColumnBgra(col, nullptr);
else else
source = texture->GetColumn(col, nullptr); source = texture->GetColumn(col, nullptr);
@ -98,7 +100,7 @@ namespace swrenderer
{ {
// Normalize to 0-1 range: // Normalize to 0-1 range:
double uv_stepd = swal * yrepeat; 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); v = v - floor(v);
double v_step = uv_stepd / texture->GetHeight(); double v_step = uv_stepd / texture->GetHeight();
@ -172,16 +174,18 @@ namespace swrenderer
{ {
if (r_dynlights && light_list) if (r_dynlights && light_list)
{ {
auto viewport = RenderViewport::Instance();
// Find column position in view space // Find column position in view space
float w1 = 1.0f / WallC.sz1; float w1 = 1.0f / WallC.sz1;
float w2 = 1.0f / WallC.sz2; float w2 = 1.0f / WallC.sz2;
float t = (x - WallC.sx1 + 0.5f) / (WallC.sx2 - WallC.sx1); float t = (x - WallC.sx1 + 0.5f) / (WallC.sx2 - WallC.sx1);
float wcol = w1 * (1.0f - t) + w2 * t; float wcol = w1 * (1.0f - t) + w2 * t;
float zcol = 1.0f / wcol; 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.Y = zcol;
drawerargs.dc_viewpos.Z = (float)((CenterY - y1 - 0.5) / InvZtoScale * zcol); drawerargs.dc_viewpos.Z = (float)((viewport->CenterY - y1 - 0.5) / viewport->InvZtoScale * zcol);
drawerargs.dc_viewpos_step.Z = (float)(-zcol / InvZtoScale); drawerargs.dc_viewpos_step.Z = (float)(-zcol / viewport->InvZtoScale);
static TriLight lightbuffer[64 * 1024]; static TriLight lightbuffer[64 * 1024];
static int nextlightindex = 0; static int nextlightindex = 0;
@ -236,7 +240,7 @@ namespace swrenderer
drawerargs.dc_num_lights = 0; drawerargs.dc_num_lights = 0;
} }
if (r_swtruecolor) if (RenderViewport::Instance()->r_swtruecolor)
{ {
int count = y2 - y1; int count = y2 - y1;
@ -320,7 +324,7 @@ namespace swrenderer
texturemid = 0; texturemid = 0;
} }
drawerargs.dc_wall_fracbits = r_swtruecolor ? FRACBITS : fracbits; drawerargs.dc_wall_fracbits = RenderViewport::Instance()->r_swtruecolor ? FRACBITS : fracbits;
CameraLight *cameraLight = CameraLight::Instance(); CameraLight *cameraLight = CameraLight::Instance();
bool fixed = (cameraLight->fixedcolormap != NULL || cameraLight->fixedlightlev >= 0); 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) ProjectedWallCull ProjectedWallLine::Project(double z1, double z2, const FWallCoords *wallc)
{ {
float y1 = (float)(CenterY - z1 * InvZtoScale / wallc->sz1); auto viewport = RenderViewport::Instance();
float y2 = (float)(CenterY - z2 * InvZtoScale / wallc->sz2);
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 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) void ProjectedWallTexcoords::Project(double walxrepeat, int x1, int x2, const FWallTmapVals &WallT)
{ {
float uOverZ = WallT.UoverZorg + WallT.UoverZstep * (float)(x1 + 0.5 - CenterX); auto viewport = RenderViewport::Instance();
float invZ = WallT.InvZorg + WallT.InvZstep * (float)(x1 + 0.5 - CenterX);
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 uGradient = WallT.UoverZstep;
float zGradient = WallT.InvZstep; float zGradient = WallT.InvZstep;
float xrepeat = (float)walxrepeat; float xrepeat = (float)walxrepeat;
float depthScale = (float)(WallT.InvZstep * WallTMapScale2); float depthScale = (float)(WallT.InvZstep * viewport->WallTMapScale2);
float depthOrg = (float)(-WallT.UoverZstep * WallTMapScale2); float depthOrg = (float)(-WallT.UoverZstep * viewport->WallTMapScale2);
if (xrepeat < 0.0f) if (xrepeat < 0.0f)
{ {
@ -189,8 +193,10 @@ namespace swrenderer
void ProjectedWallTexcoords::ProjectPos(double walxrepeat, int x1, int x2, const FWallTmapVals &WallT) void ProjectedWallTexcoords::ProjectPos(double walxrepeat, int x1, int x2, const FWallTmapVals &WallT)
{ {
float uOverZ = WallT.UoverZorg + WallT.UoverZstep * (float)(x1 + 0.5 - CenterX); auto viewport = RenderViewport::Instance();
float invZ = WallT.InvZorg + WallT.InvZstep * (float)(x1 + 0.5 - CenterX);
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 uGradient = WallT.UoverZstep;
float zGradient = WallT.InvZstep; float zGradient = WallT.InvZstep;
float xrepeat = (float)walxrepeat; float xrepeat = (float)walxrepeat;

View file

@ -78,9 +78,11 @@ namespace swrenderer
// left to right mapping // left to right mapping
planeang += (ViewAngle - 90).Radians(); planeang += (ViewAngle - 90).Radians();
auto viewport = RenderViewport::Instance();
// Scale will be unit scale at FocalLengthX (normally SCREENWIDTH/2) distance // Scale will be unit scale at FocalLengthX (normally SCREENWIDTH/2) distance
xstep = cos(planeang) / FocalLengthX; xstep = cos(planeang) / viewport->FocalLengthX;
ystep = -sin(planeang) / FocalLengthX; ystep = -sin(planeang) / viewport->FocalLengthX;
// [RH] flip for mirrors // [RH] flip for mirrors
RenderPortal *renderportal = RenderPortal::Instance(); RenderPortal *renderportal = RenderPortal::Instance();
@ -170,12 +172,14 @@ namespace swrenderer
drawerargs.SetTextureVStep(0); drawerargs.SetTextureVStep(0);
drawerargs.SetTextureVPos(0); drawerargs.SetTextureVPos(0);
} }
auto viewport = RenderViewport::Instance();
if (r_swtruecolor) if (viewport->r_swtruecolor)
{ {
double distance2 = planeheight * yslope[(y + 1 < viewheight) ? y + 1 : y - 1]; double distance2 = planeheight * yslope[(y + 1 < viewheight) ? y + 1 : y - 1];
double xmagnitude = fabs(ystepscale * (distance2 - distance) * FocalLengthX); double xmagnitude = fabs(ystepscale * (distance2 - distance) * viewport->FocalLengthX);
double ymagnitude = fabs(xstepscale * (distance2 - distance) * FocalLengthX); double ymagnitude = fabs(xstepscale * (distance2 - distance) * viewport->FocalLengthX);
double magnitude = MAX(ymagnitude, xmagnitude); double magnitude = MAX(ymagnitude, xmagnitude);
double min_lod = -1000.0; double min_lod = -1000.0;
drawerargs.SetTextureLOD(MAX(log2(magnitude) + r_lod_bias, min_lod)); drawerargs.SetTextureLOD(MAX(log2(magnitude) + r_lod_bias, min_lod));
@ -184,17 +188,17 @@ namespace swrenderer
if (plane_shade) if (plane_shade)
{ {
// Determine lighting based on the span's distance from the viewer. // 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) if (r_dynlights)
{ {
// Find row position in view space // Find row position in view space
float zspan = (float)(planeheight / (fabs(y + 0.5 - CenterY) / InvZtoScale)); float zspan = (float)(planeheight / (fabs(y + 0.5 - viewport->CenterY) / viewport->InvZtoScale));
drawerargs.dc_viewpos.X = (float)((x1 + 0.5 - CenterX) / CenterX * zspan); drawerargs.dc_viewpos.X = (float)((x1 + 0.5 - viewport->CenterX) / viewport->CenterX * zspan);
drawerargs.dc_viewpos.Y = zspan; drawerargs.dc_viewpos.Y = zspan;
drawerargs.dc_viewpos.Z = (float)((CenterY - y - 0.5) / InvZtoScale * zspan); drawerargs.dc_viewpos.Z = (float)((viewport->CenterY - y - 0.5) / viewport->InvZtoScale * zspan);
drawerargs.dc_viewpos_step.X = (float)(zspan / CenterX); drawerargs.dc_viewpos_step.X = (float)(zspan / viewport->CenterX);
static TriLight lightbuffer[64 * 1024]; static TriLight lightbuffer[64 * 1024];
static int nextlightindex = 0; static int nextlightindex = 0;
@ -202,7 +206,7 @@ namespace swrenderer
// Plane normal // Plane normal
drawerargs.dc_normal.X = 0.0f; drawerargs.dc_normal.X = 0.0f;
drawerargs.dc_normal.Y = 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 // Setup lights for row
drawerargs.dc_num_lights = 0; drawerargs.dc_num_lights = 0;
@ -266,13 +270,13 @@ namespace swrenderer
void RenderFlatPlane::SetupSlope() void RenderFlatPlane::SetupSlope()
{ {
int e, i; auto viewport = RenderViewport::Instance();
i = 0; int i = 0;
e = viewheight; int e = viewheight;
float focus = float(FocalLengthY); float focus = float(viewport->FocalLengthY);
float den; float den;
float cy = float(CenterY); float cy = float(viewport->CenterY);
if (i < centery) if (i < centery)
{ {
den = cy - i - 0.5f; 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) void RenderSkyPlane::DrawSkyColumnStripe(int start_x, int y1, int y2, double scale, double texturemid, double yrepeat)
{ {
RenderPortal *renderportal = RenderPortal::Instance(); RenderPortal *renderportal = RenderPortal::Instance();
auto viewport = RenderViewport::Instance();
uint32_t height = frontskytex->GetHeight(); uint32_t height = frontskytex->GetHeight();
double uv_stepd = skyiscale * yrepeat; 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; double v_step = uv_stepd / height;
uint32_t uv_pos = (uint32_t)(v * 0x01000000); uint32_t uv_pos = (uint32_t)(v * 0x01000000);
@ -192,7 +193,7 @@ namespace swrenderer
} }
else else
{ {
ang = (skyangle + xtoviewangle[x]) ^ skyflip; ang = (skyangle + viewport->xtoviewangle[x]) ^ skyflip;
} }
angle1 = (uint32_t)((UMulScale16(ang, frontcyl) + frontpos) >> FRACBITS); angle1 = (uint32_t)((UMulScale16(ang, frontcyl) + frontpos) >> FRACBITS);
angle2 = (uint32_t)((UMulScale16(ang, backcyl) + backpos) >> FRACBITS); angle2 = (uint32_t)((UMulScale16(ang, backcyl) + backpos) >> FRACBITS);
@ -222,13 +223,14 @@ namespace swrenderer
} }
else else
{ {
auto viewport = RenderViewport::Instance();
double yrepeat = frontskytex->Scale.Y; double yrepeat = frontskytex->Scale.Y;
double scale = frontskytex->Scale.Y * skyscale; double scale = frontskytex->Scale.Y * skyscale;
double iscale = 1 / scale; double iscale = 1 / scale;
short drawheight = short(frontskytex->GetHeight() * 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(); 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); DrawSkyColumnStripe(start_x, y1, y2, scale, texturemid, yrepeat);
} }
} }

View file

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

View file

@ -89,7 +89,7 @@ void FSoftwareRenderer::Init()
{ {
gl_ParseDefs(); gl_ParseDefs();
r_swtruecolor = screen->IsBgra(); RenderViewport::Instance()->r_swtruecolor = screen->IsBgra();
RenderScene::Instance()->Init(); RenderScene::Instance()->Init();
} }
@ -249,8 +249,10 @@ void FSoftwareRenderer::SetClearColor(int color)
void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov) void FSoftwareRenderer::RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov)
{ {
BYTE *Pixels = r_swtruecolor ? (BYTE*)tex->GetPixelsBgra() : (BYTE*)tex->GetPixels(); auto viewport = RenderViewport::Instance();
DSimpleCanvas *Canvas = r_swtruecolor ? tex->GetCanvasBgra() : tex->GetCanvas();
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. // 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. // 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). // True color render still sometimes uses palette textures (for sprites, mostly).
// We need to make sure that both pixel buffers contain data: // 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()) if (player->fixedcolormap >= 0 && player->fixedcolormap < (int)SpecialColormaps.Size())
{ {
realfixedcolormap = &SpecialColormaps[player->fixedcolormap]; 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 // Render everything fullbright. The copy to video memory will
// apply the special colormap, so it won't be restricted to the // apply the special colormap, so it won't be restricted to the
@ -105,7 +106,8 @@ namespace swrenderer
CurrentVisibility = vis; 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 { // 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 // divide by zero. This will be called again later, and the proper
// values can be initialized then. // values can be initialized then.
@ -114,9 +116,9 @@ namespace swrenderer
BaseVisibility = vis; BaseVisibility = vis;
MaxVisForWall = (InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * FocalTangent)); MaxVisForWall = (viewport->InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * FocalTangent));
MaxVisForWall = 32767.0 / MaxVisForWall; MaxVisForWall = 32767.0 / MaxVisForWall;
MaxVisForFloor = 32767.0 / (viewheight >> 2) * FocalLengthY / 160; MaxVisForFloor = 32767.0 / (viewheight >> 2) * viewport->FocalLengthY / 160;
// Prevent overflow on walls // Prevent overflow on walls
if (BaseVisibility < 0 && BaseVisibility < -MaxVisForWall) if (BaseVisibility < 0 && BaseVisibility < -MaxVisForWall)
@ -126,7 +128,7 @@ namespace swrenderer
else else
WallVisibility = BaseVisibility; WallVisibility = BaseVisibility;
WallVisibility = (InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) / WallVisibility = (viewport->InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) /
(viewwidth*SCREENHEIGHT * 3)) * (WallVisibility * FocalTangent); (viewwidth*SCREENHEIGHT * 3)) * (WallVisibility * FocalTangent);
// Prevent overflow on floors/ceilings. Note that the calculation of // Prevent overflow on floors/ceilings. Note that the calculation of
@ -140,7 +142,7 @@ namespace swrenderer
else else
FloorVisibility = BaseVisibility; FloorVisibility = BaseVisibility;
FloorVisibility = 160.0 * FloorVisibility / FocalLengthY; FloorVisibility = 160.0 * FloorVisibility / viewport->FocalLengthY;
TiltVisibility = float(vis * FocalTangent * (16.f * 320.f) / viewwidth); 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 WallVis(double screenZ) const { return WallGlobVis() / screenZ; }
double SpriteVis(double screenZ) const { return WallGlobVis() / screenZ; } double SpriteVis(double screenZ) const { return WallGlobVis() / screenZ; }
double ParticleVis(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: private:
double BaseVisibility = 0.0; double BaseVisibility = 0.0;

View file

@ -348,12 +348,14 @@ namespace swrenderer
rx2 = t; rx2 = t;
swapvalues(ry1, ry2); swapvalues(ry1, ry2);
} }
auto viewport = RenderViewport::Instance();
if (rx1 >= -ry1) if (rx1 >= -ry1)
{ {
if (rx1 > ry1) return false; // left edge is off the right side if (rx1 > ry1) return false; // left edge is off the right side
if (ry1 == 0) return false; if (ry1 == 0) return false;
sx1 = xs_RoundToInt(CenterX + rx1 * CenterX / ry1); sx1 = xs_RoundToInt(viewport->CenterX + rx1 * viewport->CenterX / ry1);
} }
else else
{ {
@ -366,7 +368,7 @@ namespace swrenderer
{ {
if (rx2 < -ry2) return false; // right edge is off the left side if (rx2 < -ry2) return false; // right edge is off the left side
if (ry2 == 0) return false; if (ry2 == 0) return false;
sx2 = xs_RoundToInt(CenterX + rx2 * CenterX / ry2); sx2 = xs_RoundToInt(viewport->CenterX + rx2 * viewport->CenterX / ry2);
} }
else else
{ {
@ -810,9 +812,10 @@ namespace swrenderer
void RenderOpaquePass::ClearClip() void RenderOpaquePass::ClearClip()
{ {
auto viewport = RenderViewport::Instance();
// clip ceiling to console bottom // clip ceiling to console bottom
fillshort(floorclip, viewwidth, viewheight); 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) 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) 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. // [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) if (depth >= r_portal_recursions)
{ {
BYTE color = (BYTE)BestColor((DWORD *)GPalette.BaseColors, 0, 0, 0, 0, 255); 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++) for (int x = pds->x1; x < pds->x2; x++)
{ {
if (x < 0 || x >= RenderTarget->GetWidth()) if (x < 0 || x >= viewport->RenderTarget->GetWidth())
continue; continue;
int Ytop = pds->ceilingclip[x - pds->x1]; int Ytop = pds->ceilingclip[x - pds->x1];
int Ybottom = pds->floorclip[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; uint32_t c = GPalette.BaseColors[color].d;
for (int y = Ytop; y <= Ybottom; y++) for (int y = Ytop; y <= Ybottom; y++)
@ -315,7 +317,7 @@ namespace swrenderer
} }
else else
{ {
BYTE *dest = RenderTarget->GetBuffer() + x + Ytop * spacing; BYTE *dest = viewport->RenderTarget->GetBuffer() + x + Ytop * spacing;
for (int y = Ytop; y <= Ybottom; y++) for (int y = Ytop; y <= Ybottom; y++)
{ {
@ -483,16 +485,18 @@ namespace swrenderer
// [ZZ] NO OVERFLOW CHECKS HERE // [ZZ] NO OVERFLOW CHECKS HERE
// I believe it won't break. if it does, blame me. :( // 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; return;
BYTE color = (BYTE)BestColor((DWORD *)GPalette.BaseColors, 255, 0, 0, 0, 255); BYTE color = (BYTE)BestColor((DWORD *)GPalette.BaseColors, 255, 0, 0, 0, 255);
BYTE* pixels = RenderTarget->GetBuffer(); BYTE* pixels = viewport->RenderTarget->GetBuffer();
// top edge // top edge
for (int x = pds->x1; x < pds->x2; x++) for (int x = pds->x1; x < pds->x2; x++)
{ {
if (x < 0 || x >= RenderTarget->GetWidth()) if (x < 0 || x >= viewport->RenderTarget->GetWidth())
continue; continue;
int p = x - pds->x1; int p = x - pds->x1;
@ -501,7 +505,7 @@ namespace swrenderer
if (x == pds->x1 || x == pds->x2 - 1) 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; continue;
} }
@ -509,12 +513,12 @@ namespace swrenderer
int YbottomPrev = pds->floorclip[p - 1]; int YbottomPrev = pds->floorclip[p - 1];
if (abs(Ytop - YtopPrev) > 1) if (abs(Ytop - YtopPrev) > 1)
RenderTarget->DrawLine(x, YtopPrev, x, Ytop, color, 0); viewport->RenderTarget->DrawLine(x, YtopPrev, x, Ytop, color, 0);
else *(pixels + Ytop * RenderTarget->GetPitch() + x) = color; else *(pixels + Ytop * viewport->RenderTarget->GetPitch() + x) = color;
if (abs(Ybottom - YbottomPrev) > 1) if (abs(Ybottom - YbottomPrev) > 1)
RenderTarget->DrawLine(x, YbottomPrev, x, Ybottom, color, 0); viewport->RenderTarget->DrawLine(x, YbottomPrev, x, Ybottom, color, 0);
else *(pixels + Ybottom * RenderTarget->GetPitch() + x) = color; else *(pixels + Ybottom * viewport->RenderTarget->GetPitch() + x) = color;
} }
} }

View file

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

View file

@ -38,32 +38,6 @@ CVAR(String, r_viewsize, "", CVAR_NOSET)
namespace swrenderer 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() RenderViewport *RenderViewport::Instance()
{ {
static RenderViewport instance; static RenderViewport instance;

View file

@ -18,26 +18,6 @@
namespace swrenderer 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 class RenderViewport
{ {
public: public:
@ -45,9 +25,35 @@ namespace swrenderer
void SetViewport(int width, int height, float trueratio); void SetViewport(int width, int height, float trueratio);
void SetupFreelook(); 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: private:
void InitTextureMapping(); void InitTextureMapping();
void SetupBuffer(); 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) 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; float iscale = walltexcoords.VStep[x] * maskedScaleY;
double spryscale = 1 / iscale; double spryscale = 1 / iscale;
double sprtopscreen; double sprtopscreen;
if (sprflipvert) if (sprflipvert)
sprtopscreen = CenterY + texturemid * spryscale; sprtopscreen = viewport->CenterY + texturemid * spryscale;
else else
sprtopscreen = CenterY - texturemid * spryscale; sprtopscreen = viewport->CenterY - texturemid * spryscale;
drawerargs.DrawMaskedColumn(x, FLOAT2FIXED(iscale), WallSpriteTile, walltexcoords.UPos[x], spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip); drawerargs.DrawMaskedColumn(x, FLOAT2FIXED(iscale), WallSpriteTile, walltexcoords.UPos[x], spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip);
} }

View file

@ -108,11 +108,13 @@ namespace swrenderer
if (x1 >= x2) if (x1 >= x2)
return; return;
auto viewport = RenderViewport::Instance();
yscale = xscale; // YaspectMul is not needed for particles as they should always be square yscale = xscale; // YaspectMul is not needed for particles as they should always be square
ty = particle->Pos.Z - ViewPos.Z; ty = particle->Pos.Z - ViewPos.Z;
y1 = xs_RoundToInt(CenterY - (ty + psize) * yscale); y1 = xs_RoundToInt(viewport->CenterY - (ty + psize) * yscale);
y2 = xs_RoundToInt(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 // 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. // entered, we don't need to clip it to drawsegs like a normal sprite.
@ -227,21 +229,23 @@ namespace swrenderer
// vis->renderflags holds translucency level (0-255) // vis->renderflags holds translucency level (0-255)
fixed_t fglevel = ((vis->renderflags + 1) << 8) & ~0x3ff; fixed_t fglevel = ((vis->renderflags + 1) << 8) & ~0x3ff;
uint32_t alpha = fglevel * 256 / FRACUNIT; uint32_t alpha = fglevel * 256 / FRACUNIT;
auto viewport = RenderViewport::Instance();
spacing = RenderTarget->GetPitch(); spacing = viewport->RenderTarget->GetPitch();
uint32_t fracstepx = PARTICLE_TEXTURE_SIZE * FRACUNIT / countbase; uint32_t fracstepx = PARTICLE_TEXTURE_SIZE * FRACUNIT / countbase;
uint32_t fracposx = fracstepx / 2; uint32_t fracposx = fracstepx / 2;
RenderTranslucentPass *translucentPass = RenderTranslucentPass::Instance(); RenderTranslucentPass *translucentPass = RenderTranslucentPass::Instance();
if (r_swtruecolor) if (viewport->r_swtruecolor)
{ {
for (int x = x1; x < (x1 + countbase); x++, fracposx += fracstepx) for (int x = x1; x < (x1 + countbase); x++, fracposx += fracstepx)
{ {
if (translucentPass->ClipSpriteColumnWithPortals(x, vis)) if (translucentPass->ClipSpriteColumnWithPortals(x, vis))
continue; 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); DrawerCommandQueue::QueueCommand<DrawParticleColumnRGBACommand>(dest, yl, spacing, ycount, fg, alpha, fracposx);
} }
} }
@ -251,7 +255,7 @@ namespace swrenderer
{ {
if (translucentPass->ClipSpriteColumnWithPortals(x, vis)) if (translucentPass->ClipSpriteColumnWithPortals(x, vis))
continue; 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); DrawerCommandQueue::QueueCommand<DrawParticleColumnPalCommand>(dest, yl, spacing, ycount, fg, alpha, fracposx);
} }
} }

View file

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

View file

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

View file

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

View file

@ -184,6 +184,7 @@ namespace swrenderer
void RenderVoxel::Render(short *cliptop, short *clipbottom, int minZ, int maxZ) void RenderVoxel::Render(short *cliptop, short *clipbottom, int minZ, int maxZ)
{ {
auto sprite = this; auto sprite = this;
auto viewport = RenderViewport::Instance();
FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(sprite->Light.BaseColormap); FDynamicColormap *basecolormap = static_cast<FDynamicColormap*>(sprite->Light.BaseColormap);
@ -208,7 +209,7 @@ namespace swrenderer
double viewCos = view_angle.Sin(); double viewCos = view_angle.Sin();
double logmip = fabs((view_origin.X - sprite_origin.X) * viewCos - (view_origin.Y - sprite_origin.Y) * viewSin); double logmip = fabs((view_origin.X - sprite_origin.X) * viewCos - (view_origin.Y - sprite_origin.Y) * viewSin);
int miplevel = 0; int miplevel = 0;
while (miplevel < voxel->NumMips - 1 && logmip >= FocalLengthX) while (miplevel < voxel->NumMips - 1 && logmip >= viewport->FocalLengthX)
{ {
logmip *= 0.5; logmip *= 0.5;
miplevel++; 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) 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; double viewX, viewY, viewZ;
if (viewspace) if (viewspace)
{ {
@ -333,17 +336,17 @@ namespace swrenderer
if (viewZ < 0.01f) if (viewZ < 0.01f)
return; return;
double screenX = CenterX + viewX / viewZ * CenterX; double screenX = viewport->CenterX + viewX / viewZ * viewport->CenterX;
double screenY = CenterY - viewY / viewZ * InvZtoScale; double screenY = viewport->CenterY - viewY / viewZ * viewport->InvZtoScale;
double screenExtentX = extentX / viewZ * CenterX; double screenExtentX = extentX / viewZ * viewport->CenterX;
double screenExtentY = pixelstretch ? screenExtentX * YaspectMul : screenExtentX; double screenExtentY = pixelstretch ? screenExtentX * viewport->YaspectMul : screenExtentX;
int x1 = MAX((int)(screenX - screenExtentX), 0); int x1 = MAX((int)(screenX - screenExtentX), 0);
int x2 = MIN((int)(screenX + screenExtentX + 0.5f), viewwidth - 1); int x2 = MIN((int)(screenX + screenExtentX + 0.5f), viewwidth - 1);
int y1 = MAX((int)(screenY - screenExtentY), 0); int y1 = MAX((int)(screenY - screenExtentY), 0);
int y2 = MIN((int)(screenY + screenExtentY + 0.5f), viewheight - 1); 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) 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) 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; float iscale = walltexcoords.VStep[x] * maskedScaleY;
double spryscale = 1 / iscale; double spryscale = 1 / iscale;
double sprtopscreen; double sprtopscreen;
if (sprflipvert) if (sprflipvert)
sprtopscreen = CenterY + texturemid * spryscale; sprtopscreen = viewport->CenterY + texturemid * spryscale;
else else
sprtopscreen = CenterY - texturemid * spryscale; sprtopscreen = viewport->CenterY - texturemid * spryscale;
drawerargs.DrawMaskedColumn(x, FLOAT2FIXED(iscale), WallSpriteTile, walltexcoords.UPos[x], spryscale, sprtopscreen, sprflipvert, mfloorclip, mceilingclip); 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]; static short bottomclipper[MAXWIDTH], topclipper[MAXWIDTH];
const BYTE *translation = NULL; const BYTE *translation = NULL;
r_swtruecolor = IsBgra(); auto viewport = RenderViewport::Instance();
viewport->r_swtruecolor = IsBgra();
if (APART(parms.colorOverlay) != 0) if (APART(parms.colorOverlay) != 0)
{ {
@ -165,7 +167,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
parms.colorOverlay = PalEntry(parms.colorOverlay).InverseColor(); parms.colorOverlay = PalEntry(parms.colorOverlay).InverseColor();
} }
// Note that this overrides DTA_Translation in software, but not in hardware. // 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), FDynamicColormap *colormap = GetSpecialLights(MAKERGB(255, 255, 255),
parms.colorOverlay & MAKEARGB(0, 255, 255, 255), 0); parms.colorOverlay & MAKEARGB(0, 255, 255, 255), 0);
@ -174,7 +176,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
} }
else if (parms.remap != NULL) else if (parms.remap != NULL)
{ {
if (r_swtruecolor) if (viewport->r_swtruecolor)
translation = (const BYTE*)parms.remap->Palette; translation = (const BYTE*)parms.remap->Palette;
else else
translation = parms.remap->Remap; translation = parms.remap->Remap;
@ -188,7 +190,7 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
} }
else else
{ {
if (r_swtruecolor) if (viewport->r_swtruecolor)
drawerargs.SetTranslationMap(nullptr); drawerargs.SetTranslationMap(nullptr);
else else
drawerargs.SetTranslationMap(identitymap); drawerargs.SetTranslationMap(identitymap);
@ -196,16 +198,16 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
bool visible; bool visible;
FDynamicColormap *basecolormap = nullptr; FDynamicColormap *basecolormap = nullptr;
if (r_swtruecolor) if (viewport->r_swtruecolor)
visible = drawerargs.SetPatchStyle(parms.style, parms.Alpha, -1, parms.fillcolor, basecolormap); visible = drawerargs.SetPatchStyle(parms.style, parms.Alpha, -1, parms.fillcolor, basecolormap);
else else
visible = drawerargs.SetPatchStyle(parms.style, parms.Alpha, 0, parms.fillcolor, basecolormap); visible = drawerargs.SetPatchStyle(parms.style, parms.Alpha, 0, parms.fillcolor, basecolormap);
BYTE *destorgsave = dc_destorg; BYTE *destorgsave = viewport->dc_destorg;
int destheightsave = dc_destheight; int destheightsave = viewport->dc_destheight;
dc_destorg = screen->GetBuffer(); viewport->dc_destorg = screen->GetBuffer();
dc_destheight = screen->GetHeight(); viewport->dc_destheight = screen->GetHeight();
if (dc_destorg == NULL) if (viewport->dc_destorg == NULL)
{ {
I_FatalError("Attempt to write to buffer of hardware canvas"); I_FatalError("Attempt to write to buffer of hardware canvas");
} }
@ -215,8 +217,8 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
if (visible) if (visible)
{ {
double centeryback = CenterY; double centeryback = viewport->CenterY;
CenterY = 0; viewport->CenterY = 0;
// There is not enough precision in the drawing routines to keep the full // There is not enough precision in the drawing routines to keep the full
// precision for y0. :( // precision for y0. :(
@ -292,11 +294,11 @@ void DCanvas::DrawTextureParms(FTexture *img, DrawParms &parms)
frac += xiscale_i; frac += xiscale_i;
} }
CenterY = centeryback; viewport->CenterY = centeryback;
} }
dc_destorg = destorgsave; viewport->dc_destorg = destorgsave;
dc_destheight = destheightsave; viewport->dc_destheight = destheightsave;
if (ticdup != 0 && menuactive == MENU_Off) if (ticdup != 0 && menuactive == MENU_Off)
{ {
@ -1367,10 +1369,12 @@ void DCanvas::FillSimplePoly(FTexture *tex, FVector2 *points, int npoints,
{ {
return; return;
} }
auto viewport = RenderViewport::Instance();
BYTE *destorgsave = dc_destorg; BYTE *destorgsave = viewport->dc_destorg;
dc_destorg = screen->GetBuffer(); viewport->dc_destorg = screen->GetBuffer();
if (dc_destorg == NULL) if (viewport->dc_destorg == NULL)
{ {
I_FatalError("Attempt to write to buffer of hardware canvas"); 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; pt1 = pt2;
pt2--; if (pt2 < 0) pt2 = npoints; pt2--; if (pt2 < 0) pt2 = npoints;
} while (pt1 != botpt); } while (pt1 != botpt);
dc_destorg = destorgsave; viewport->dc_destorg = destorgsave;
#endif #endif
} }