mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-24 13:01:48 +00:00
Move visibility stuff into LightVisibility
This commit is contained in:
parent
933f2d116a
commit
4bbf1ba11c
22 changed files with 121 additions and 109 deletions
|
@ -137,7 +137,7 @@ void RenderPolyDecal::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
||||||
args.uniforms.flags = 0;
|
args.uniforms.flags = 0;
|
||||||
args.SetColormap(front->ColorMap);
|
args.SetColormap(front->ColorMap);
|
||||||
args.SetTexture(tex, decal->Translation, true);
|
args.SetTexture(tex, decal->Translation, true);
|
||||||
args.uniforms.globvis = (float)swrenderer::r_WallVisibility;
|
args.uniforms.globvis = (float)swrenderer::LightVisibility::Instance()->WallGlobVis();
|
||||||
if (fullbrightSprite || swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
if (fullbrightSprite || swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
||||||
{
|
{
|
||||||
args.uniforms.light = 256;
|
args.uniforms.light = 256;
|
||||||
|
|
|
@ -73,7 +73,7 @@ void RenderPolyParticle::Render(const TriMatrix &worldToClip, const Vec4f &clipP
|
||||||
|
|
||||||
PolyDrawArgs args;
|
PolyDrawArgs args;
|
||||||
|
|
||||||
args.uniforms.globvis = (float)swrenderer::r_SpriteVisibility;
|
args.uniforms.globvis = (float)swrenderer::LightVisibility::Instance()->ParticleGlobVis();
|
||||||
|
|
||||||
if (fullbrightSprite || swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
if (fullbrightSprite || swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
||||||
{
|
{
|
||||||
|
|
|
@ -107,7 +107,7 @@ void RenderPolyPlane::Render3DFloor(const TriMatrix &worldToClip, const Vec4f &c
|
||||||
UVTransform xform(ceiling ? fakeFloor->top.model->planes[sector_t::ceiling].xform : fakeFloor->top.model->planes[sector_t::floor].xform, tex);
|
UVTransform xform(ceiling ? fakeFloor->top.model->planes[sector_t::ceiling].xform : fakeFloor->top.model->planes[sector_t::floor].xform, tex);
|
||||||
|
|
||||||
PolyDrawArgs args;
|
PolyDrawArgs args;
|
||||||
args.uniforms.globvis = (float)swrenderer::r_TiltVisibility * 48.0f;
|
args.uniforms.globvis = (float)swrenderer::LightVisibility::Instance()->SlopePlaneGlobVis() * 48.0f;
|
||||||
args.uniforms.light = (uint32_t)(lightlevel / 255.0f * 256.0f);
|
args.uniforms.light = (uint32_t)(lightlevel / 255.0f * 256.0f);
|
||||||
if (swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
if (swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
||||||
args.uniforms.light = 256;
|
args.uniforms.light = 256;
|
||||||
|
@ -301,7 +301,7 @@ void RenderPolyPlane::Render(const TriMatrix &worldToClip, const Vec4f &clipPlan
|
||||||
UVTransform transform(ceiling ? frontsector->planes[sector_t::ceiling].xform : frontsector->planes[sector_t::floor].xform, tex);
|
UVTransform transform(ceiling ? frontsector->planes[sector_t::ceiling].xform : frontsector->planes[sector_t::floor].xform, tex);
|
||||||
|
|
||||||
PolyDrawArgs args;
|
PolyDrawArgs args;
|
||||||
args.uniforms.globvis = (float)swrenderer::r_TiltVisibility * 48.0f;
|
args.uniforms.globvis = (float)swrenderer::LightVisibility::Instance()->SlopePlaneGlobVis() * 48.0f;
|
||||||
args.uniforms.light = (uint32_t)(frontsector->lightlevel / 255.0f * 256.0f);
|
args.uniforms.light = (uint32_t)(frontsector->lightlevel / 255.0f * 256.0f);
|
||||||
if (swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
if (swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
||||||
args.uniforms.light = 256;
|
args.uniforms.light = 256;
|
||||||
|
|
|
@ -223,7 +223,7 @@ void RenderPolyPlayerSprites::RenderSprite(DPSprite *sprite, AActor *owner, floa
|
||||||
int actualextralight = foggy ? 0 : extralight << 4;
|
int actualextralight = foggy ? 0 : extralight << 4;
|
||||||
int spriteshade = LIGHT2SHADE(owner->Sector->lightlevel + actualextralight);
|
int spriteshade = LIGHT2SHADE(owner->Sector->lightlevel + actualextralight);
|
||||||
double minz = double((2048 * 4) / double(1 << 20));
|
double minz = double((2048 * 4) / double(1 << 20));
|
||||||
ColormapNum = GETPALOOKUP(swrenderer::r_SpriteVisibility / minz, spriteshade);
|
ColormapNum = GETPALOOKUP(swrenderer::LightVisibility::Instance()->SpriteGlobVis() / minz, spriteshade);
|
||||||
|
|
||||||
if (sprite->GetID() < PSP_TARGETCENTER)
|
if (sprite->GetID() < PSP_TARGETCENTER)
|
||||||
{
|
{
|
||||||
|
|
|
@ -90,7 +90,7 @@ void PolyDrawSectorPortal::SaveGlobals()
|
||||||
savedextralight = extralight;
|
savedextralight = extralight;
|
||||||
savedpos = ViewPos;
|
savedpos = ViewPos;
|
||||||
savedangle = ViewAngle;
|
savedangle = ViewAngle;
|
||||||
savedvisibility = swrenderer::R_GetVisibility();
|
savedvisibility = swrenderer::LightVisibility::Instance()->GetVisibility();
|
||||||
savedcamera = camera;
|
savedcamera = camera;
|
||||||
savedsector = viewsector;
|
savedsector = viewsector;
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ void PolyDrawSectorPortal::SaveGlobals()
|
||||||
// Don't let gun flashes brighten the sky box
|
// Don't let gun flashes brighten the sky box
|
||||||
AActor *sky = Portal->mSkybox;
|
AActor *sky = Portal->mSkybox;
|
||||||
extralight = 0;
|
extralight = 0;
|
||||||
swrenderer::R_SetVisibility(sky->args[0] * 0.25f);
|
swrenderer::LightVisibility::Instance()->SetVisibility(sky->args[0] * 0.25f);
|
||||||
ViewPos = sky->InterpolatedPosition(r_TicFracF);
|
ViewPos = sky->InterpolatedPosition(r_TicFracF);
|
||||||
ViewAngle = savedangle + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_TicFracF);
|
ViewAngle = savedangle + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_TicFracF);
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ void PolyDrawSectorPortal::RestoreGlobals()
|
||||||
camera = savedcamera;
|
camera = savedcamera;
|
||||||
viewsector = savedsector;
|
viewsector = savedsector;
|
||||||
ViewPos = savedpos;
|
ViewPos = savedpos;
|
||||||
swrenderer::R_SetVisibility(savedvisibility);
|
swrenderer::LightVisibility::Instance()->SetVisibility(savedvisibility);
|
||||||
extralight = savedextralight;
|
extralight = savedextralight;
|
||||||
ViewAngle = savedangle;
|
ViewAngle = savedangle;
|
||||||
R_SetViewAngle();
|
R_SetViewAngle();
|
||||||
|
|
|
@ -241,7 +241,7 @@ void RenderPolyScene::RenderPortals(int portalDepth)
|
||||||
PolyDrawArgs args;
|
PolyDrawArgs args;
|
||||||
args.objectToClip = &WorldToClip;
|
args.objectToClip = &WorldToClip;
|
||||||
args.mode = TriangleDrawMode::Fan;
|
args.mode = TriangleDrawMode::Fan;
|
||||||
args.uniforms.globvis = (float)swrenderer::r_WallVisibility;
|
args.uniforms.globvis = (float)swrenderer::LightVisibility::Instance()->WallGlobVis();
|
||||||
args.uniforms.color = 0;
|
args.uniforms.color = 0;
|
||||||
args.uniforms.light = 256;
|
args.uniforms.light = 256;
|
||||||
args.uniforms.flags = TriUniforms::fixed_light;
|
args.uniforms.flags = TriUniforms::fixed_light;
|
||||||
|
|
|
@ -55,7 +55,7 @@ void PolySkyDome::Render(const TriMatrix &worldToClip)
|
||||||
int rc = mRows + 1;
|
int rc = mRows + 1;
|
||||||
|
|
||||||
PolyDrawArgs args;
|
PolyDrawArgs args;
|
||||||
args.uniforms.globvis = (float)swrenderer::r_WallVisibility;
|
args.uniforms.globvis = (float)swrenderer::LightVisibility::Instance()->WallGlobVis();
|
||||||
args.uniforms.light = 256;
|
args.uniforms.light = 256;
|
||||||
args.uniforms.flags = 0;
|
args.uniforms.flags = 0;
|
||||||
args.uniforms.subsectorDepth = RenderPolyScene::SkySubsectorDepth;
|
args.uniforms.subsectorDepth = RenderPolyScene::SkySubsectorDepth;
|
||||||
|
|
|
@ -138,7 +138,7 @@ void RenderPolySprite::Render(const TriMatrix &worldToClip, const Vec4f &clipPla
|
||||||
bool fullbrightSprite = ((thing->renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
bool fullbrightSprite = ((thing->renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
||||||
|
|
||||||
PolyDrawArgs args;
|
PolyDrawArgs args;
|
||||||
args.uniforms.globvis = (float)swrenderer::r_SpriteVisibility;
|
args.uniforms.globvis = (float)swrenderer::LightVisibility::Instance()->SpriteGlobVis();
|
||||||
args.uniforms.flags = 0;
|
args.uniforms.flags = 0;
|
||||||
if (fullbrightSprite || swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
if (fullbrightSprite || swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
||||||
{
|
{
|
||||||
|
|
|
@ -247,7 +247,7 @@ void RenderPolyWall::Render(const TriMatrix &worldToClip, const Vec4f &clipPlane
|
||||||
}
|
}
|
||||||
|
|
||||||
PolyDrawArgs args;
|
PolyDrawArgs args;
|
||||||
args.uniforms.globvis = (float)swrenderer::r_WallVisibility;
|
args.uniforms.globvis = (float)swrenderer::LightVisibility::Instance()->WallGlobVis();
|
||||||
args.uniforms.light = (uint32_t)(GetLightLevel() / 255.0f * 256.0f);
|
args.uniforms.light = (uint32_t)(GetLightLevel() / 255.0f * 256.0f);
|
||||||
args.uniforms.flags = 0;
|
args.uniforms.flags = 0;
|
||||||
args.uniforms.subsectorDepth = SubsectorDepth;
|
args.uniforms.subsectorDepth = SubsectorDepth;
|
||||||
|
|
|
@ -100,7 +100,7 @@ void RenderPolyWallSprite::Render(const TriMatrix &worldToClip, const Vec4f &cli
|
||||||
bool fullbrightSprite = ((thing->renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
bool fullbrightSprite = ((thing->renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
||||||
|
|
||||||
PolyDrawArgs args;
|
PolyDrawArgs args;
|
||||||
args.uniforms.globvis = (float)swrenderer::r_WallVisibility;
|
args.uniforms.globvis = (float)swrenderer::LightVisibility::Instance()->WallGlobVis();
|
||||||
if (fullbrightSprite || swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
if (fullbrightSprite || swrenderer::fixedlightlev >= 0 || swrenderer::fixedcolormap)
|
||||||
{
|
{
|
||||||
args.uniforms.light = 256;
|
args.uniforms.light = 256;
|
||||||
|
|
|
@ -904,7 +904,7 @@ namespace swrenderer
|
||||||
if (fixedcolormap == NULL && fixedlightlev < 0)
|
if (fixedcolormap == NULL && fixedlightlev < 0)
|
||||||
{
|
{
|
||||||
wallshade = LIGHT2SHADE(curline->sidedef->GetLightLevel(foggy, frontsector->lightlevel) + R_ActualExtraLight(foggy));
|
wallshade = LIGHT2SHADE(curline->sidedef->GetLightLevel(foggy, frontsector->lightlevel) + R_ActualExtraLight(foggy));
|
||||||
double GlobVis = r_WallVisibility;
|
double GlobVis = LightVisibility::Instance()->WallGlobVis();
|
||||||
rw_lightleft = float(GlobVis / WallC.sz1);
|
rw_lightleft = float(GlobVis / WallC.sz1);
|
||||||
rw_lightstep = float((GlobVis / WallC.sz2 - rw_lightleft) / (WallC.sx2 - WallC.sx1));
|
rw_lightstep = float((GlobVis / WallC.sz2 - rw_lightleft) / (WallC.sx2 - WallC.sx1));
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,7 +106,7 @@ namespace swrenderer
|
||||||
planeheight = fabs(pl->height.Zat0() - ViewPos.Z);
|
planeheight = fabs(pl->height.Zat0() - ViewPos.Z);
|
||||||
|
|
||||||
basecolormap = colormap;
|
basecolormap = colormap;
|
||||||
GlobVis = r_FloorVisibility / planeheight;
|
GlobVis = LightVisibility::Instance()->FlatPlaneGlobVis() / planeheight;
|
||||||
ds_light = 0;
|
ds_light = 0;
|
||||||
if (fixedlightlev >= 0)
|
if (fixedlightlev >= 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -143,7 +143,7 @@ namespace swrenderer
|
||||||
plane_sz[0] = -plane_sz[0];
|
plane_sz[0] = -plane_sz[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
planelightfloat = (r_TiltVisibility * lxscale * lyscale) / (fabs(pl->height.ZatPoint(ViewPos) - ViewPos.Z)) / 65536.f;
|
planelightfloat = (LightVisibility::Instance()->SlopePlaneGlobVis() * lxscale * lyscale) / (fabs(pl->height.ZatPoint(ViewPos) - ViewPos.Z)) / 65536.f;
|
||||||
|
|
||||||
if (pl->height.fC() > 0)
|
if (pl->height.fC() > 0)
|
||||||
planelightfloat = -planelightfloat;
|
planelightfloat = -planelightfloat;
|
||||||
|
|
|
@ -38,77 +38,10 @@ EXTERN_CVAR(Bool, r_fullbrightignoresectorcolor)
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
double r_BaseVisibility;
|
|
||||||
double r_WallVisibility;
|
|
||||||
double r_FloorVisibility;
|
|
||||||
float r_TiltVisibility;
|
|
||||||
double r_SpriteVisibility;
|
|
||||||
|
|
||||||
int fixedlightlev;
|
int fixedlightlev;
|
||||||
FSWColormap *fixedcolormap;
|
FSWColormap *fixedcolormap;
|
||||||
FSpecialColormap *realfixedcolormap;
|
FSpecialColormap *realfixedcolormap;
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
double CurrentVisibility = 8.f;
|
|
||||||
double MaxVisForWall;
|
|
||||||
double MaxVisForFloor;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Changes how rapidly things get dark with distance
|
|
||||||
void R_SetVisibility(double vis)
|
|
||||||
{
|
|
||||||
// Allow negative visibilities, just for novelty's sake
|
|
||||||
vis = clamp(vis, -204.7, 204.7); // (205 and larger do not work in 5:4 aspect ratio)
|
|
||||||
|
|
||||||
CurrentVisibility = vis;
|
|
||||||
|
|
||||||
if (FocalTangent == 0 || 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.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
r_BaseVisibility = vis;
|
|
||||||
|
|
||||||
MaxVisForWall = (InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * FocalTangent));
|
|
||||||
MaxVisForWall = 32767.0 / MaxVisForWall;
|
|
||||||
MaxVisForFloor = 32767.0 / (viewheight >> 2) * FocalLengthY / 160;
|
|
||||||
|
|
||||||
// Prevent overflow on walls
|
|
||||||
if (r_BaseVisibility < 0 && r_BaseVisibility < -MaxVisForWall)
|
|
||||||
r_WallVisibility = -MaxVisForWall;
|
|
||||||
else if (r_BaseVisibility > 0 && r_BaseVisibility > MaxVisForWall)
|
|
||||||
r_WallVisibility = MaxVisForWall;
|
|
||||||
else
|
|
||||||
r_WallVisibility = r_BaseVisibility;
|
|
||||||
|
|
||||||
r_WallVisibility = (InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) /
|
|
||||||
(viewwidth*SCREENHEIGHT * 3)) * (r_WallVisibility * FocalTangent);
|
|
||||||
|
|
||||||
// Prevent overflow on floors/ceilings. Note that the calculation of
|
|
||||||
// MaxVisForFloor means that planes less than two units from the player's
|
|
||||||
// view could still overflow, but there is no way to totally eliminate
|
|
||||||
// that while still using fixed point math.
|
|
||||||
if (r_BaseVisibility < 0 && r_BaseVisibility < -MaxVisForFloor)
|
|
||||||
r_FloorVisibility = -MaxVisForFloor;
|
|
||||||
else if (r_BaseVisibility > 0 && r_BaseVisibility > MaxVisForFloor)
|
|
||||||
r_FloorVisibility = MaxVisForFloor;
|
|
||||||
else
|
|
||||||
r_FloorVisibility = r_BaseVisibility;
|
|
||||||
|
|
||||||
r_FloorVisibility = 160.0 * r_FloorVisibility / FocalLengthY;
|
|
||||||
|
|
||||||
r_TiltVisibility = float(vis * FocalTangent * (16.f * 320.f) / viewwidth);
|
|
||||||
r_SpriteVisibility = r_WallVisibility;
|
|
||||||
}
|
|
||||||
|
|
||||||
double R_GetVisibility()
|
|
||||||
{
|
|
||||||
return CurrentVisibility;
|
|
||||||
}
|
|
||||||
|
|
||||||
void R_SetupColormap(AActor *actor)
|
void R_SetupColormap(AActor *actor)
|
||||||
{
|
{
|
||||||
player_t *player = actor->player;
|
player_t *player = actor->player;
|
||||||
|
@ -154,6 +87,62 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
LightVisibility *LightVisibility::Instance()
|
||||||
|
{
|
||||||
|
static LightVisibility instance;
|
||||||
|
return &instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Changes how rapidly things get dark with distance
|
||||||
|
void LightVisibility::SetVisibility(double vis)
|
||||||
|
{
|
||||||
|
// Allow negative visibilities, just for novelty's sake
|
||||||
|
vis = clamp(vis, -204.7, 204.7); // (205 and larger do not work in 5:4 aspect ratio)
|
||||||
|
|
||||||
|
CurrentVisibility = vis;
|
||||||
|
|
||||||
|
if (FocalTangent == 0 || 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.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseVisibility = vis;
|
||||||
|
|
||||||
|
MaxVisForWall = (InvZtoScale * (SCREENWIDTH*r_Yaspect) / (viewwidth*SCREENHEIGHT * FocalTangent));
|
||||||
|
MaxVisForWall = 32767.0 / MaxVisForWall;
|
||||||
|
MaxVisForFloor = 32767.0 / (viewheight >> 2) * FocalLengthY / 160;
|
||||||
|
|
||||||
|
// Prevent overflow on walls
|
||||||
|
if (BaseVisibility < 0 && BaseVisibility < -MaxVisForWall)
|
||||||
|
WallVisibility = -MaxVisForWall;
|
||||||
|
else if (BaseVisibility > 0 && BaseVisibility > MaxVisForWall)
|
||||||
|
WallVisibility = MaxVisForWall;
|
||||||
|
else
|
||||||
|
WallVisibility = BaseVisibility;
|
||||||
|
|
||||||
|
WallVisibility = (InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) /
|
||||||
|
(viewwidth*SCREENHEIGHT * 3)) * (WallVisibility * FocalTangent);
|
||||||
|
|
||||||
|
// Prevent overflow on floors/ceilings. Note that the calculation of
|
||||||
|
// MaxVisForFloor means that planes less than two units from the player's
|
||||||
|
// view could still overflow, but there is no way to totally eliminate
|
||||||
|
// that while still using fixed point math.
|
||||||
|
if (BaseVisibility < 0 && BaseVisibility < -MaxVisForFloor)
|
||||||
|
FloorVisibility = -MaxVisForFloor;
|
||||||
|
else if (BaseVisibility > 0 && BaseVisibility > MaxVisForFloor)
|
||||||
|
FloorVisibility = MaxVisForFloor;
|
||||||
|
else
|
||||||
|
FloorVisibility = BaseVisibility;
|
||||||
|
|
||||||
|
FloorVisibility = 160.0 * FloorVisibility / FocalLengthY;
|
||||||
|
|
||||||
|
TiltVisibility = float(vis * FocalTangent * (16.f * 320.f) / viewwidth);
|
||||||
|
}
|
||||||
|
|
||||||
// Controls how quickly light ramps across a 1/z range. Set this, and it
|
// Controls how quickly light ramps across a 1/z range. Set this, and it
|
||||||
// sets all the r_*Visibility variables (except r_SkyVisibilily, which is
|
// sets all the r_*Visibility variables (except r_SkyVisibilily, which is
|
||||||
// currently unused).
|
// currently unused).
|
||||||
|
@ -161,11 +150,11 @@ namespace swrenderer
|
||||||
{
|
{
|
||||||
if (argv.argc() < 2)
|
if (argv.argc() < 2)
|
||||||
{
|
{
|
||||||
Printf("Visibility is %g\n", R_GetVisibility());
|
Printf("Visibility is %g\n", LightVisibility::Instance()->GetVisibility());
|
||||||
}
|
}
|
||||||
else if (!netgame)
|
else if (!netgame)
|
||||||
{
|
{
|
||||||
R_SetVisibility(atof(argv[1]));
|
LightVisibility::Instance()->SetVisibility(atof(argv[1]));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "v_palette.h"
|
#include "v_palette.h"
|
||||||
#include "r_data/colormaps.h"
|
#include "r_data/colormaps.h"
|
||||||
#include "r_utility.h"
|
#include "r_utility.h"
|
||||||
|
#include "r_viewport.h"
|
||||||
|
|
||||||
// Lighting.
|
// Lighting.
|
||||||
//
|
//
|
||||||
|
@ -53,23 +54,43 @@ struct FSWColormap;
|
||||||
|
|
||||||
namespace swrenderer
|
namespace swrenderer
|
||||||
{
|
{
|
||||||
extern double r_BaseVisibility;
|
|
||||||
extern double r_WallVisibility;
|
|
||||||
extern double r_FloorVisibility;
|
|
||||||
extern float r_TiltVisibility;
|
|
||||||
extern double r_SpriteVisibility;
|
|
||||||
|
|
||||||
extern int fixedlightlev;
|
extern int fixedlightlev;
|
||||||
extern FSWColormap *fixedcolormap;
|
extern FSWColormap *fixedcolormap;
|
||||||
extern FSpecialColormap *realfixedcolormap;
|
extern FSpecialColormap *realfixedcolormap;
|
||||||
|
|
||||||
inline int R_ActualExtraLight(bool fog) { return fog ? 0 : extralight << 4; }
|
|
||||||
|
|
||||||
void R_SetVisibility(double visibility);
|
|
||||||
double R_GetVisibility();
|
|
||||||
|
|
||||||
void R_SetupColormap(AActor *actor);
|
void R_SetupColormap(AActor *actor);
|
||||||
|
|
||||||
|
class LightVisibility
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static LightVisibility *Instance();
|
||||||
|
|
||||||
|
void SetVisibility(double visibility);
|
||||||
|
double GetVisibility() const { return CurrentVisibility; }
|
||||||
|
|
||||||
|
double WallGlobVis() const { return WallVisibility; }
|
||||||
|
double SpriteGlobVis() const { return WallVisibility; }
|
||||||
|
double ParticleGlobVis() const { return WallVisibility * 0.5; }
|
||||||
|
double FlatPlaneGlobVis() const { return FloorVisibility; }
|
||||||
|
double SlopePlaneGlobVis() const { return TiltVisibility; }
|
||||||
|
|
||||||
|
// The vis value to pass into the GETPALOOKUP or LIGHTSCALE macros
|
||||||
|
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); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
double BaseVisibility = 0.0;
|
||||||
|
double WallVisibility = 0.0;
|
||||||
|
double FloorVisibility = 0.0;
|
||||||
|
float TiltVisibility = 0.0f;
|
||||||
|
|
||||||
|
double CurrentVisibility = 8.f;
|
||||||
|
double MaxVisForWall = 0.0;
|
||||||
|
double MaxVisForFloor = 0.0;
|
||||||
|
};
|
||||||
|
|
||||||
class ColormapLight
|
class ColormapLight
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -78,4 +99,6 @@ namespace swrenderer
|
||||||
|
|
||||||
void SetColormap(double visibility, int shade, FDynamicColormap *basecolormap, bool fullbright, bool invertColormap, bool fadeToBlack);
|
void SetColormap(double visibility, int shade, FDynamicColormap *basecolormap, bool fullbright, bool invertColormap, bool fadeToBlack);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline int R_ActualExtraLight(bool fog) { return fog ? 0 : extralight << 4; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,7 +106,7 @@ namespace swrenderer
|
||||||
DAngle savedangle = ViewAngle;
|
DAngle savedangle = ViewAngle;
|
||||||
ptrdiff_t savedds_p = drawseglist->ds_p - drawseglist->drawsegs;
|
ptrdiff_t savedds_p = drawseglist->ds_p - drawseglist->drawsegs;
|
||||||
size_t savedinteresting = drawseglist->FirstInterestingDrawseg;
|
size_t savedinteresting = drawseglist->FirstInterestingDrawseg;
|
||||||
double savedvisibility = R_GetVisibility();
|
double savedvisibility = LightVisibility::Instance()->GetVisibility();
|
||||||
AActor *savedcamera = camera;
|
AActor *savedcamera = camera;
|
||||||
sector_t *savedsector = viewsector;
|
sector_t *savedsector = viewsector;
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ namespace swrenderer
|
||||||
// Don't let gun flashes brighten the sky box
|
// Don't let gun flashes brighten the sky box
|
||||||
AActor *sky = port->mSkybox;
|
AActor *sky = port->mSkybox;
|
||||||
extralight = 0;
|
extralight = 0;
|
||||||
R_SetVisibility(sky->args[0] * 0.25f);
|
LightVisibility::Instance()->SetVisibility(sky->args[0] * 0.25f);
|
||||||
|
|
||||||
ViewPos = sky->InterpolatedPosition(r_TicFracF);
|
ViewPos = sky->InterpolatedPosition(r_TicFracF);
|
||||||
ViewAngle = savedangle + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_TicFracF);
|
ViewAngle = savedangle + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_TicFracF);
|
||||||
|
@ -141,7 +141,7 @@ namespace swrenderer
|
||||||
case PORTS_PORTAL:
|
case PORTS_PORTAL:
|
||||||
case PORTS_LINKEDPORTAL:
|
case PORTS_LINKEDPORTAL:
|
||||||
extralight = pl->extralight;
|
extralight = pl->extralight;
|
||||||
R_SetVisibility(pl->visibility);
|
LightVisibility::Instance()->SetVisibility(pl->visibility);
|
||||||
ViewPos.X = pl->viewpos.X + port->mDisplacement.X;
|
ViewPos.X = pl->viewpos.X + port->mDisplacement.X;
|
||||||
ViewPos.Y = pl->viewpos.Y + port->mDisplacement.Y;
|
ViewPos.Y = pl->viewpos.Y + port->mDisplacement.Y;
|
||||||
ViewPos.Z = pl->viewpos.Z;
|
ViewPos.Z = pl->viewpos.Z;
|
||||||
|
@ -260,7 +260,7 @@ namespace swrenderer
|
||||||
camera = savedcamera;
|
camera = savedcamera;
|
||||||
viewsector = savedsector;
|
viewsector = savedsector;
|
||||||
ViewPos = savedpos;
|
ViewPos = savedpos;
|
||||||
R_SetVisibility(savedvisibility);
|
LightVisibility::Instance()->SetVisibility(savedvisibility);
|
||||||
extralight = savedextralight;
|
extralight = savedextralight;
|
||||||
ViewAngle = savedangle;
|
ViewAngle = savedangle;
|
||||||
R_SetViewAngle();
|
R_SetViewAngle();
|
||||||
|
@ -523,7 +523,7 @@ namespace swrenderer
|
||||||
stacked_viewpos = ViewPos;
|
stacked_viewpos = ViewPos;
|
||||||
stacked_angle = ViewAngle;
|
stacked_angle = ViewAngle;
|
||||||
stacked_extralight = extralight;
|
stacked_extralight = extralight;
|
||||||
stacked_visibility = R_GetVisibility();
|
stacked_visibility = LightVisibility::Instance()->GetVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderPortal::SetMainPortal()
|
void RenderPortal::SetMainPortal()
|
||||||
|
|
|
@ -119,7 +119,8 @@ namespace swrenderer
|
||||||
InitTextureMapping();
|
InitTextureMapping();
|
||||||
|
|
||||||
// Reset r_*Visibility vars
|
// Reset r_*Visibility vars
|
||||||
R_SetVisibility(R_GetVisibility());
|
LightVisibility *visibility = LightVisibility::Instance();
|
||||||
|
visibility->SetVisibility(visibility->GetVisibility());
|
||||||
|
|
||||||
SetupBuffer();
|
SetupBuffer();
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,8 +201,7 @@ namespace swrenderer
|
||||||
vis->floorclip = 0;
|
vis->floorclip = 0;
|
||||||
vis->foggy = foggy;
|
vis->foggy = foggy;
|
||||||
|
|
||||||
// Particles are slightly more visible than regular sprites.
|
vis->Light.SetColormap(tiz * LightVisibility::Instance()->ParticleGlobVis(), shade, map, particle->bright != 0, false, false);
|
||||||
vis->Light.SetColormap(tiz * r_SpriteVisibility * 0.5, shade, map, particle->bright != 0, false, false);
|
|
||||||
|
|
||||||
VisibleSpriteList::Instance()->Push(vis);
|
VisibleSpriteList::Instance()->Push(vis);
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,7 +223,7 @@ namespace swrenderer
|
||||||
bool fullbright = !vis->foggy && ((renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
bool fullbright = !vis->foggy && ((renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
||||||
bool fadeToBlack = (vis->RenderStyle.Flags & STYLEF_FadeToBlack) != 0;
|
bool fadeToBlack = (vis->RenderStyle.Flags & STYLEF_FadeToBlack) != 0;
|
||||||
|
|
||||||
vis->Light.SetColormap(r_SpriteVisibility / MAX(tz, MINZ), spriteshade, basecolormap, fullbright, invertcolormap, fadeToBlack);
|
vis->Light.SetColormap(LightVisibility::Instance()->SpriteGlobVis() / MAX(tz, MINZ), spriteshade, basecolormap, fullbright, invertcolormap, fadeToBlack);
|
||||||
|
|
||||||
VisibleSpriteList::Instance()->Push(vis);
|
VisibleSpriteList::Instance()->Push(vis);
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,7 +135,7 @@ namespace swrenderer
|
||||||
|
|
||||||
int spriteshade = LIGHT2SHADE(sec->lightlevel + R_ActualExtraLight(spr->foggy));
|
int spriteshade = LIGHT2SHADE(sec->lightlevel + R_ActualExtraLight(spr->foggy));
|
||||||
|
|
||||||
Light.SetColormap(r_SpriteVisibility / MAX(MINZ, (double)spr->depth), spriteshade, mybasecolormap, isFullBright, invertcolormap, fadeToBlack);
|
Light.SetColormap(LightVisibility::Instance()->SpriteGlobVis() / MAX(MINZ, (double)spr->depth), spriteshade, mybasecolormap, isFullBright, invertcolormap, fadeToBlack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,7 +175,7 @@ namespace swrenderer
|
||||||
bool fullbright = !vis->foggy && ((renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
bool fullbright = !vis->foggy && ((renderflags & RF_FULLBRIGHT) || (thing->flags5 & MF5_BRIGHT));
|
||||||
bool fadeToBlack = (vis->RenderStyle.Flags & STYLEF_FadeToBlack) != 0;
|
bool fadeToBlack = (vis->RenderStyle.Flags & STYLEF_FadeToBlack) != 0;
|
||||||
|
|
||||||
vis->Light.SetColormap(r_SpriteVisibility / MAX(tz, MINZ), spriteshade, basecolormap, fullbright, invertcolormap, fadeToBlack);
|
vis->Light.SetColormap(LightVisibility::Instance()->SpriteGlobVis() / MAX(tz, MINZ), spriteshade, basecolormap, fullbright, invertcolormap, fadeToBlack);
|
||||||
|
|
||||||
VisibleSpriteList::Instance()->Push(vis, true);
|
VisibleSpriteList::Instance()->Push(vis, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,7 +132,7 @@ namespace swrenderer
|
||||||
vis->wallc = wallc;
|
vis->wallc = wallc;
|
||||||
vis->foggy = foggy;
|
vis->foggy = foggy;
|
||||||
|
|
||||||
vis->Light.SetColormap(r_SpriteVisibility / MAX(tz, MINZ), spriteshade, basecolormap, false, false, false);
|
vis->Light.SetColormap(LightVisibility::Instance()->SpriteGlobVis() / MAX(tz, MINZ), spriteshade, basecolormap, false, false, false);
|
||||||
|
|
||||||
VisibleSpriteList::Instance()->Push(vis);
|
VisibleSpriteList::Instance()->Push(vis);
|
||||||
}
|
}
|
||||||
|
@ -180,7 +180,7 @@ namespace swrenderer
|
||||||
}
|
}
|
||||||
|
|
||||||
int shade = LIGHT2SHADE(spr->sector->lightlevel + R_ActualExtraLight(spr->foggy));
|
int shade = LIGHT2SHADE(spr->sector->lightlevel + R_ActualExtraLight(spr->foggy));
|
||||||
double GlobVis = r_WallVisibility;
|
double GlobVis = LightVisibility::Instance()->WallGlobVis();
|
||||||
float lightleft = float(GlobVis / spr->wallc.sz1);
|
float lightleft = float(GlobVis / spr->wallc.sz1);
|
||||||
float lightstep = float((GlobVis / spr->wallc.sz2 - lightleft) / (spr->wallc.sx2 - spr->wallc.sx1));
|
float lightstep = float((GlobVis / spr->wallc.sz2 - lightleft) / (spr->wallc.sx2 - spr->wallc.sx1));
|
||||||
float light = lightleft + (x1 - spr->wallc.sx1) * lightstep;
|
float light = lightleft + (x1 - spr->wallc.sx1) * lightstep;
|
||||||
|
|
Loading…
Reference in a new issue