mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-11 15:22:15 +00:00
Move r_viewport variables into a class
This commit is contained in:
parent
4e45ea2300
commit
e78e76a593
35 changed files with 336 additions and 277 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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]];
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue