Skip to content

Commit

Permalink
- g_visibility stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
coelckers committed Jan 10, 2022
1 parent ddcee4e commit 98c919f
Show file tree
Hide file tree
Showing 14 changed files with 399 additions and 70 deletions.
2 changes: 2 additions & 0 deletions source/CMakeLists.txt
Expand Up @@ -1071,6 +1071,8 @@ set (PCH_SOURCES
core/rendering/scene/hw_portal.cpp
core/rendering/scene/hw_skyportal.cpp
core/rendering/scene/hw_sky.cpp
core/rendering/scene/hw_setcolor.cpp
core/rendering/scene/hw_lighting.cpp

core/console/c_notifybuffer.cpp
core/console/d_event.cpp
Expand Down
2 changes: 2 additions & 0 deletions source/common/2d/v_draw.h
Expand Up @@ -325,3 +325,5 @@ class ScaleOverrider
CleanHeight = savedheight;
}
};

void Draw2D(F2DDrawer* drawer, FRenderState& state);
1 change: 0 additions & 1 deletion source/common/rendering/gl/gl_framebuffer.cpp
Expand Up @@ -69,7 +69,6 @@ EXTERN_CVAR(Int, gl_pipeline_depth);

void gl_LoadExtensions();
void gl_PrintStartupLog();
void Draw2D(F2DDrawer *drawer, FRenderState &state);

extern bool vid_hdr_active;

Expand Down
2 changes: 0 additions & 2 deletions source/common/rendering/gles/gles_framebuffer.cpp
Expand Up @@ -67,8 +67,6 @@ EXTERN_CVAR(Int, gl_pipeline_depth);

EXTERN_CVAR(Bool, gl_sort_textures);

void Draw2D(F2DDrawer *drawer, FRenderState &state);

extern bool vid_hdr_active;

namespace OpenGLESRenderer
Expand Down
2 changes: 0 additions & 2 deletions source/common/rendering/vulkan/system/vk_framebuffer.cpp
Expand Up @@ -57,8 +57,6 @@
#include "engineerrors.h"
#include "c_dispatch.h"

void Draw2D(F2DDrawer *drawer, FRenderState &state);

EXTERN_CVAR(Bool, r_drawvoxels)
EXTERN_CVAR(Int, gl_tonemap)
EXTERN_CVAR(Int, screenblocks)
Expand Down
37 changes: 16 additions & 21 deletions source/core/rendering/scene/hw_drawinfo.h
Expand Up @@ -10,6 +10,8 @@
#include "hw_bunchdrawer.h"
//#include "r_viewpoint.h"

EXTERN_CVAR(Int, hw_lightmode)

enum EDrawMode
{
DM_MAINVIEW,
Expand Down Expand Up @@ -133,6 +135,13 @@ struct HWDrawInfo
//void RenderThings(sectortype * sub, sectortype * sector);
//void RenderParticles(sectortype *sub, sectortype *front);
void SetColor(FRenderState &state, int sectorlightlevel, int rellight, bool fullbright, const FColormap &cm, float alpha, bool weapon = false);
int CalcLightLevel(int lightlevel, int rellight, bool weapon, int blendfactor);
PalEntry CalcLightColor(int light, PalEntry pe, int blendfactor);
void SetShaderLight(FRenderState& state, float level, float olight);
void SetFog(FRenderState& state, int lightlevel, int rellight, bool fullbright, const FColormap* cmap, bool isadditive);

float GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfogdensity, int blendfactor);

public:

void SetCameraPos(const DVector3 &pos)
Expand Down Expand Up @@ -187,36 +196,22 @@ struct HWDrawInfo
void AddSprite(HWSprite *sprite, bool translucent);


bool isSoftwareLighting() const
{
return true;// lightmode == ELightMode::ZDoomSoftware || lightmode == ELightMode::DoomSoftware || lightmode == ELightMode::Build;
}

bool isBuildSoftwareLighting() const
{
return true;// lightmode == ELightMode::Build;
}

bool isDoomSoftwareLighting() const
{
return false;// lightmode == ELightMode::ZDoomSoftware || lightmode == ELightMode::DoomSoftware;
return hw_lightmode == 0;
}

bool isDarkLightMode() const
{
return false;// lightmode == ELightMode::Doom || lightmode == ELightMode::DoomDark;
}

void SetFallbackLightMode()
{
//lightmode = ELightMode::Doom;
return hw_lightmode == 2;
}

};

void CleanSWDrawer();
//sectortype* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bounds, float fov, float ratio, float fovratio, bool mainview, bool toscreen);
//void WriteSavePic(player_t* player, FileWriter* file, int width, int height);
//sectortype* RenderView(player_t* player);

inline int hw_ClampLight(int lightlevel)
{
return clamp(lightlevel, 0, 255);
}


34 changes: 1 addition & 33 deletions source/core/rendering/scene/hw_drawstructs.h
Expand Up @@ -415,39 +415,7 @@ inline void SetSpriteTranslucency(const tspritetype* sprite, float& alpha, FRend
alpha *= 1.f - sprite->ownerActor->sprext.alpha;
}

//==========================================================================
//
//
//
//==========================================================================
extern PalEntry GlobalMapFog;
extern float GlobalFogDensity;

__forceinline void SetLightAndFog(FRenderState& state, PalEntry fade, int palette, int shade, float visibility, float alpha)
{
// Fog must be done before the texture so that the texture selector can override it.
bool foggy = (GlobalMapFog || (fade & 0xffffff));
auto ShadeDiv = lookups.tables[palette].ShadeFactor;
if (shade == 127) state.SetObjectColor(0xff000000); // 127 is generally used for shadow objects that must be black, even in foggy areas.

// Disable brightmaps if non-black fog is used.
if (ShadeDiv >= 1 / 1000.f && foggy)
{
state.EnableFog(1);
float density = GlobalMapFog ? GlobalFogDensity : 350.f - Scale(numshades - shade, 150, numshades);
state.SetFog((GlobalMapFog) ? GlobalMapFog : fade, density * hw_density);
state.SetSoftLightLevel(255);
state.SetLightParms(128.f, 1 / 1000.f);
}
else
{
state.EnableFog(0);
state.SetFog(0, 0);
state.SetSoftLightLevel(gl_fogmode != 0 && ShadeDiv >= 1 / 1000.f ? max(0, 255 - Scale(shade, 255, numshades)) : 255);
state.SetLightParms(visibility, ShadeDiv / (numshades - 2));
}

// The shade rgb from the tint is ignored here.
state.SetColor(globalr * (1 / 255.f), globalg * (1 / 255.f), globalb * (1 / 255.f), alpha);
}

void SetLightAndFog(HWDrawInfo* di, FRenderState& state, PalEntry fade, int palette, int shade, float visibility, float alpha);
2 changes: 1 addition & 1 deletion source/core/rendering/scene/hw_flats.cpp
Expand Up @@ -222,7 +222,7 @@ void HWFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent)
else state.SetNormal({ 0, -1, 0 });
}

SetLightAndFog(state, fade, palette, shade, visibility, alpha);
SetLightAndFog(di, state, fade, palette, shade, visibility, alpha);

if (translucent)
{
Expand Down
185 changes: 185 additions & 0 deletions source/core/rendering/scene/hw_lighting.cpp
@@ -0,0 +1,185 @@
//
//---------------------------------------------------------------------------
//
// Copyright(C) 2002-2018 Christoph Oelckers
// All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see http://www.gnu.org/licenses/
//
//--------------------------------------------------------------------------
//
/*
** gl_light.cpp
** Light level / fog management / dynamic lights
**
**/

#include "c_cvars.h"
#include "hw_drawinfo.h"

// externally settable lighting properties
static float distfogtable[2][256]; // light to fog conversion table for black fog

CVAR(Int, hw_weaponlight, 8, CVAR_ARCHIVE);

//==========================================================================
//
// Sets up the fog tables
//
//==========================================================================

CUSTOM_CVAR(Int, gl_distfog, 70, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
{
for (int i = 0; i < 256; i++)
{

if (i < 164)
{
distfogtable[0][i] = (float)((gl_distfog >> 1) + (gl_distfog)*(164 - i) / 164);
}
else if (i < 230)
{
distfogtable[0][i] = (float)((gl_distfog >> 1) - (gl_distfog >> 1)*(i - 164) / (230 - 164));
}
else distfogtable[0][i] = 0;

if (i < 128)
{
distfogtable[1][i] = 6.f + (float)((gl_distfog >> 1) + (gl_distfog)*(128 - i) / 48);
}
else if (i < 216)
{
distfogtable[1][i] = (216.f - i) / ((216.f - 128.f)) * gl_distfog / 10;
}
else distfogtable[1][i] = 0;
}
}

//==========================================================================
//
// Get current light level
//
//==========================================================================

int HWDrawInfo::CalcLightLevel(int lightlevel, int rellight, bool weapon, int blendfactor)
{
int light;

if (lightlevel <= 0) return 0;

bool darklightmode = isDarkLightMode();

if (darklightmode && lightlevel < 192 && !weapon)
{
if (lightlevel > 100)
{
light = xs_CRoundToInt(192.f - (192 - lightlevel)* 1.87f);
if (light + rellight < 20)
{
light = 20 + (light + rellight - 20) / 5;
}
else
{
light += rellight;
}
}
else
{
light = (lightlevel + rellight) / 5;
}

}
else
{
light=lightlevel+rellight;
}

// Fake contrast should never turn a positive value into 0.
return clamp(light, 1, 255);
}

//==========================================================================
//
// Get current light color
//
//==========================================================================

PalEntry HWDrawInfo::CalcLightColor(int light, PalEntry pe, int blendfactor)
{
int r,g,b;

if (blendfactor == 0)
{
r = pe.r * light / 255;
g = pe.g * light / 255;
b = pe.b * light / 255;
}
else
{
// This is what Legacy does with colored light in 3D volumes. No, it doesn't really make sense...
// It also doesn't translate well to software style lighting.
int mixlight = light * (255 - blendfactor);

r = (mixlight + pe.r * blendfactor) / 255;
g = (mixlight + pe.g * blendfactor) / 255;
b = (mixlight + pe.b * blendfactor) / 255;
}
return PalEntry(255, uint8_t(r), uint8_t(g), uint8_t(b));
}

//==========================================================================
//
// calculates the current fog density
//
//==========================================================================

float HWDrawInfo::GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfogdensity, int blendfactor)
{
float density;

if (sectorfogdensity != 0)
{
// case 1: Sector has an explicit fog density set.
density = (float)sectorfogdensity;
}
else if ((fogcolor.d & 0xffffff) == 0)
{
// case 2: black fog
density = distfogtable[0][hw_ClampLight(lightlevel)];
//density = distfogtable[lightmode != ELightMode::LinearStandard][hw_ClampLight(lightlevel)];
}
#if 0
else if (Level->outsidefogdensity != 0 && APART(Level->info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (Level->info->outsidefog & 0xffffff))
{
// case 3. outsidefogdensity has already been set as needed
density = (float)Level->outsidefogdensity;
}
else if (Level->fogdensity != 0)
{
// case 4: level has fog density set
density = (float)Level->fogdensity;
}
#endif
else if (lightlevel < 248)
{
// case 5: use light level
density = (float)clamp<int>(255 - lightlevel, 30, 255);
}
else
{
density = 0.f;
}
return density;
}

0 comments on commit 98c919f

Please sign in to comment.