Fix broken fixed camera light for walls

This commit is contained in:
Magnus Norddahl 2020-01-17 01:15:44 +01:00
parent 1f011cda7f
commit 3b336a1476
5 changed files with 37 additions and 27 deletions

View file

@ -232,8 +232,6 @@ namespace swrenderer
WallColumnDrawerArgs& drawerargs = *thread->columndrawer.get(); WallColumnDrawerArgs& drawerargs = *thread->columndrawer.get();
drawerargs.wallargs = &wallargs; drawerargs.wallargs = &wallargs;
bool fixed = wallargs.fixedlight;
bool haslights = r_dynlights && wallargs.lightlist; bool haslights = r_dynlights && wallargs.lightlist;
if (haslights) if (haslights)
{ {
@ -249,7 +247,13 @@ namespace swrenderer
float curlight = wallargs.lightpos; float curlight = wallargs.lightpos;
float lightstep = wallargs.lightstep; float lightstep = wallargs.lightstep;
int shade = wallargs.mShade; int shade = wallargs.Shade();
if (wallargs.fixedlight)
{
curlight = wallargs.FixedLight();
lightstep = 0;
}
float upos = wallargs.texcoords.upos, ustepX = wallargs.texcoords.ustepX, ustepY = wallargs.texcoords.ustepY; float upos = wallargs.texcoords.upos, ustepX = wallargs.texcoords.ustepX, ustepY = wallargs.texcoords.ustepY;
float vpos = wallargs.texcoords.vpos, vstepX = wallargs.texcoords.vstepX, vstepY = wallargs.texcoords.vstepY; float vpos = wallargs.texcoords.vpos, vstepX = wallargs.texcoords.vstepX, vstepY = wallargs.texcoords.vstepY;
@ -274,7 +278,7 @@ namespace swrenderer
int y2 = dwal[x]; int y2 = dwal[x];
if (y2 > y1) if (y2 > y1)
{ {
if (!fixed) drawerargs.SetLight(curlight, shade); drawerargs.SetLight(curlight, shade);
if (haslights) if (haslights)
SetLights(drawerargs, x, y1); SetLights(drawerargs, x, y1);
else else

View file

@ -52,6 +52,8 @@
#include "swrenderer/r_renderthread.h" #include "swrenderer/r_renderthread.h"
#include "swrenderer/r_memory.h" #include "swrenderer/r_memory.h"
EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor)
namespace swrenderer namespace swrenderer
{ {
RenderWallPart::RenderWallPart(RenderThread* thread) RenderWallPart::RenderWallPart(RenderThread* thread)
@ -130,11 +132,30 @@ namespace swrenderer
// Textures that aren't masked can use the faster opaque drawer // Textures that aren't masked can use the faster opaque drawer
if (!pic->GetTexture()->isMasked() && mask && alpha >= OPAQUE && !additive) if (!pic->GetTexture()->isMasked() && mask && alpha >= OPAQUE && !additive)
{ {
drawerargs.SetStyle(true, false, OPAQUE, mLight.GetBaseColormap(), light_list); drawerargs.SetStyle(true, false, OPAQUE, light_list);
} }
else else
{ {
drawerargs.SetStyle(mask, additive, alpha, mLight.GetBaseColormap(), light_list); drawerargs.SetStyle(mask, additive, alpha, light_list);
}
if (cameraLight->FixedLightLevel() >= 0)
{
drawerargs.SetBaseColormap((r_fullbrightignoresectorcolor) ? &FullNormalLight : mLight.GetBaseColormap());
drawerargs.SetLight(0.0f, cameraLight->FixedLightLevelShade());
drawerargs.fixedlight = true;
}
else if (cameraLight->FixedColormap())
{
drawerargs.SetBaseColormap(cameraLight->FixedColormap());
drawerargs.SetLight(0.0f, 0);
drawerargs.fixedlight = true;
}
else
{
drawerargs.SetBaseColormap(mLight.GetBaseColormap());
drawerargs.SetLight(0.0f, mLight.GetLightLevel(), mLight.GetFoggy(), viewport);
drawerargs.fixedlight = false;
} }
int count = x2 - x1; int count = x2 - x1;
@ -151,7 +172,7 @@ namespace swrenderer
drawerargs.lightpos = mLight.GetLightPos(x1); drawerargs.lightpos = mLight.GetLightPos(x1);
drawerargs.lightstep = mLight.GetLightStep(); drawerargs.lightstep = mLight.GetLightStep();
drawerargs.mShade = LightVisibility::LightLevelToShade(mLight.GetLightLevel(), mLight.GetFoggy(), viewport);
drawerargs.lightlist = light_list; drawerargs.lightlist = light_list;
drawerargs.texwidth = pic->GetPhysicalWidth(); drawerargs.texwidth = pic->GetPhysicalWidth();
@ -183,7 +204,6 @@ namespace swrenderer
drawerargs.TanCos = Thread->Viewport->viewpoint.TanCos; drawerargs.TanCos = Thread->Viewport->viewpoint.TanCos;
drawerargs.TanSin = Thread->Viewport->viewpoint.TanSin; drawerargs.TanSin = Thread->Viewport->viewpoint.TanSin;
drawerargs.PortalMirrorFlags = Thread->Portal->MirrorFlags; drawerargs.PortalMirrorFlags = Thread->Portal->MirrorFlags;
drawerargs.fixedlight = (cameraLight->FixedColormap() || cameraLight->FixedLightLevel() >= 0);
drawerargs.DrawWall(Thread); drawerargs.DrawWall(Thread);
} }

View file

@ -43,6 +43,9 @@ namespace swrenderer
ShadeConstants ColormapConstants() const; ShadeConstants ColormapConstants() const;
fixed_t Light() const { return LIGHTSCALE(mLight, mShade); } fixed_t Light() const { return LIGHTSCALE(mLight, mShade); }
float FixedLight() const { return mLight; }
int Shade() const { return mShade; }
protected: protected:
void SetLight(const ColormapLight &light); void SetLight(const ColormapLight &light);

View file

@ -35,7 +35,7 @@ namespace swrenderer
(thread->Drawers(dc_viewport)->*wallfunc)(*this); (thread->Drawers(dc_viewport)->*wallfunc)(*this);
} }
void WallDrawerArgs::SetStyle(bool masked, bool additive, fixed_t alpha, FDynamicColormap *basecolormap, bool dynlights) void WallDrawerArgs::SetStyle(bool masked, bool additive, fixed_t alpha, bool dynlights)
{ {
if (alpha < OPAQUE || additive) if (alpha < OPAQUE || additive)
{ {
@ -72,21 +72,5 @@ namespace swrenderer
{ {
wallfunc = &SWPixelFormatDrawers::DrawWall; wallfunc = &SWPixelFormatDrawers::DrawWall;
} }
CameraLight *cameraLight = CameraLight::Instance();
if (cameraLight->FixedLightLevel() >= 0)
{
SetBaseColormap((r_fullbrightignoresectorcolor) ? &FullNormalLight : basecolormap);
SetLight(0.0f, cameraLight->FixedLightLevelShade());
}
else if (cameraLight->FixedColormap() != nullptr)
{
SetBaseColormap(cameraLight->FixedColormap());
SetLight(0.0f, 0);
}
else
{
SetBaseColormap(basecolormap);
}
} }
} }

View file

@ -15,7 +15,7 @@ namespace swrenderer
class WallDrawerArgs : public DrawerArgs class WallDrawerArgs : public DrawerArgs
{ {
public: public:
void SetStyle(bool masked, bool additive, fixed_t alpha, FDynamicColormap *basecolormap, bool dynlights); void SetStyle(bool masked, bool additive, fixed_t alpha, bool dynlights);
void SetDest(RenderViewport *viewport); void SetDest(RenderViewport *viewport);
void DrawWall(RenderThread *thread); void DrawWall(RenderThread *thread);
@ -35,7 +35,6 @@ namespace swrenderer
float lightpos; float lightpos;
float lightstep; float lightstep;
int mShade;
int texwidth; int texwidth;
int texheight; int texheight;