- moved the OpenGL fog properties to FLevelLocals to simplify their handling.

- added access to the glow properties for ZSCript and ACS.
This commit is contained in:
Christoph Oelckers 2017-03-14 13:54:24 +01:00
parent 72ecaba50a
commit 44a087554f
22 changed files with 248 additions and 200 deletions

View file

@ -187,7 +187,10 @@ void FS_EmulateCmd(char * string)
{ {
sc.MustGetNumber(); sc.MustGetNumber();
// Using this disables most MAPINFO fog options! // Using this disables most MAPINFO fog options!
Renderer->SetFogParams(sc.Number*70/400, 0xff000000, 0, 0); level.fogdensity = sc.Number * 70 / 400;
level.outsidefogdensity = 0;
level.skyfog = 0;
level.info->outsidefog = 0;
} }
else if (sc.Compare("gr_fogcolor")) else if (sc.Compare("gr_fogcolor"))
{ {

View file

@ -1467,6 +1467,11 @@ void G_InitLevelLocals ()
level.hazardcolor = info->hazardcolor; level.hazardcolor = info->hazardcolor;
level.hazardflash = info->hazardflash; level.hazardflash = info->hazardflash;
// GL fog stuff modifiable by SetGlobalFogParameter.
level.fogdensity = info->fogdensity;
level.outsidefogdensity = info->outsidefogdensity;
level.skyfog = info->skyfog;
compatflags.Callback(); compatflags.Callback();
compatflags2.Callback(); compatflags2.Callback();
@ -1935,6 +1940,9 @@ DEFINE_FIELD(FLevelLocals, aircontrol)
DEFINE_FIELD(FLevelLocals, airfriction) DEFINE_FIELD(FLevelLocals, airfriction)
DEFINE_FIELD(FLevelLocals, airsupply) DEFINE_FIELD(FLevelLocals, airsupply)
DEFINE_FIELD(FLevelLocals, teamdamage) DEFINE_FIELD(FLevelLocals, teamdamage)
DEFINE_FIELD(FLevelLocals, fogdensity)
DEFINE_FIELD(FLevelLocals, outsidefogdensity)
DEFINE_FIELD(FLevelLocals, skyfog)
DEFINE_FIELD_BIT(FLevelLocals, flags, monsterstelefrag, LEVEL_MONSTERSTELEFRAG) DEFINE_FIELD_BIT(FLevelLocals, flags, monsterstelefrag, LEVEL_MONSTERSTELEFRAG)
DEFINE_FIELD_BIT(FLevelLocals, flags, actownspecial, LEVEL_ACTOWNSPECIAL) DEFINE_FIELD_BIT(FLevelLocals, flags, actownspecial, LEVEL_ACTOWNSPECIAL)
DEFINE_FIELD_BIT(FLevelLocals, flags, sndseqtotalctrl, LEVEL_SNDSEQTOTALCTRL) DEFINE_FIELD_BIT(FLevelLocals, flags, sndseqtotalctrl, LEVEL_SNDSEQTOTALCTRL)
@ -1970,6 +1978,16 @@ CCMD(listmaps)
} }
} }
//==========================================================================
//
// For testing sky fog sheets
//
//==========================================================================
CCMD(skyfog)
{
if (argv.argc()>1)
{
level.skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0));
}
}

View file

@ -332,6 +332,9 @@ struct level_info_t
FName slideshow; FName slideshow;
uint32_t hazardcolor; uint32_t hazardcolor;
uint32_t hazardflash; uint32_t hazardflash;
int fogdensity;
int outsidefogdensity;
int skyfog;
// Redirection: If any player is carrying the specified item, then // Redirection: If any player is carrying the specified item, then
// you go to the RedirectMap instead of this one. // you go to the RedirectMap instead of this one.

View file

@ -81,6 +81,12 @@ struct FLevelLocals
double teamdamage; double teamdamage;
// former OpenGL-exclusive properties that should also be usable by the true color software renderer.
int fogdensity;
int outsidefogdensity;
int skyfog;
bool IsJumpingAllowed() const; bool IsJumpingAllowed() const;
bool IsCrouchingAllowed() const; bool IsCrouchingAllowed() const;
bool IsFreelookAllowed() const; bool IsFreelookAllowed() const;

View file

@ -1216,6 +1216,28 @@ DEFINE_MAP_OPTION(hazardflash, true)
info->hazardflash = V_GetColor(NULL, parse.sc); info->hazardflash = V_GetColor(NULL, parse.sc);
} }
DEFINE_MAP_OPTION(fogdensity, false)
{
parse.ParseAssign();
parse.sc.MustGetNumber();
info->fogdensity = clamp(parse.sc.Number, 0, 512) >> 1;
}
DEFINE_MAP_OPTION(outsidefogdensity, false)
{
parse.ParseAssign();
parse.sc.MustGetNumber();
info->outsidefogdensity = clamp(parse.sc.Number, 0, 512) >> 1;
}
DEFINE_MAP_OPTION(skyfog, false)
{
parse.ParseAssign();
parse.sc.MustGetNumber();
info->skyfog = parse.sc.Number;
}
//========================================================================== //==========================================================================
// //
// All flag based map options // All flag based map options

View file

@ -39,6 +39,7 @@
#include "r_utility.h" #include "r_utility.h"
#include "g_levellocals.h" #include "g_levellocals.h"
#include "actorinlines.h" #include "actorinlines.h"
#include "g_levellocals.h"
#include "gl/dynlights/gl_dynlight.h" #include "gl/dynlights/gl_dynlight.h"
#include "gl/utility/gl_geometric.h" #include "gl/utility/gl_geometric.h"
#include "gl/renderer/gl_renderer.h" #include "gl/renderer/gl_renderer.h"
@ -464,6 +465,39 @@ bool gl_SetupLightTexture()
return true; return true;
} }
//==========================================================================
//
// Check fog in current sector for placing into the proper draw list.
//
//==========================================================================
static bool gl_CheckFog(FColormap *cm, int lightlevel)
{
bool frontfog;
PalEntry fogcolor = cm->FadeColor;
if ((fogcolor.d & 0xffffff) == 0)
{
frontfog = false;
}
else if (level.outsidefogdensity != 0 && APART(level.info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (level.info->outsidefog & 0xffffff))
{
frontfog = true;
}
else if (level.fogdensity != 0 || (glset.lightmode & 4) || cm->fogdensity > 0)
{
// case 3: level has fog density set
frontfog = true;
}
else
{
// case 4: use light level
frontfog = lightlevel < 248;
}
return frontfog;
}
//========================================================================== //==========================================================================
// //
// //

View file

@ -172,50 +172,6 @@ void AdjustSpriteOffsets()
// Normally this would be better placed in p_lnspec.cpp.
// But I have accidentally overwritten that file several times
// so I'd rather place it here.
int LS_Sector_SetPlaneReflection (line_t *ln, AActor *it, bool backSide,
int arg0, int arg1, int arg2, int arg3, int arg4)
{
// Sector_SetPlaneReflection (tag, floor, ceiling)
int secnum;
FSectorTagIterator itr(arg0);
while ((secnum = itr.Next()) >= 0)
{
sector_t * s = &level.sectors[secnum];
if (!s->floorplane.isSlope()) s->reflect[sector_t::floor] = arg1/255.f;
if (!s->ceilingplane.isSlope()) level.sectors[secnum].reflect[sector_t::ceiling] = arg2/255.f;
}
return true;
}
int LS_SetGlobalFogParameter (line_t *ln, AActor *it, bool backSide,
int arg0, int arg1, int arg2, int arg3, int arg4)
{
// SetGlobalFogParameter (type, value)
switch(arg0)
{
case 0:
fogdensity = arg1>>1;
return true;
case 1:
outsidefogdensity = arg1>>1;
return true;
case 2:
skyfog = arg1;
return true;
default:
return false;
}
}
//========================================================================== //==========================================================================
// //
// Portal identifier lists // Portal identifier lists
@ -234,9 +190,6 @@ struct FGLROptions : public FOptionalMapinfoData
FGLROptions() FGLROptions()
{ {
identifier = "gl_renderer"; identifier = "gl_renderer";
fogdensity = 0;
outsidefogdensity = 0;
skyfog = 0;
brightfog = false; brightfog = false;
lightmode = -1; lightmode = -1;
nocoloredspritelighting = -1; nocoloredspritelighting = -1;
@ -251,9 +204,6 @@ struct FGLROptions : public FOptionalMapinfoData
{ {
FGLROptions *newopt = new FGLROptions; FGLROptions *newopt = new FGLROptions;
newopt->identifier = identifier; newopt->identifier = identifier;
newopt->fogdensity = fogdensity;
newopt->outsidefogdensity = outsidefogdensity;
newopt->skyfog = skyfog;
newopt->lightmode = lightmode; newopt->lightmode = lightmode;
newopt->nocoloredspritelighting = nocoloredspritelighting; newopt->nocoloredspritelighting = nocoloredspritelighting;
newopt->nolightfade = nolightfade; newopt->nolightfade = nolightfade;
@ -264,9 +214,6 @@ struct FGLROptions : public FOptionalMapinfoData
newopt->lightadditivesurfaces = lightadditivesurfaces; newopt->lightadditivesurfaces = lightadditivesurfaces;
return newopt; return newopt;
} }
int fogdensity;
int outsidefogdensity;
int skyfog;
int lightmode; int lightmode;
int brightfog; int brightfog;
int8_t lightadditivesurfaces; int8_t lightadditivesurfaces;
@ -278,14 +225,6 @@ struct FGLROptions : public FOptionalMapinfoData
float pixelstretch; float pixelstretch;
}; };
DEFINE_MAP_OPTION(fogdensity, false)
{
FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer");
parse.ParseAssign();
parse.sc.MustGetNumber();
opt->fogdensity = parse.sc.Number;
}
DEFINE_MAP_OPTION(brightfog, false) DEFINE_MAP_OPTION(brightfog, false)
{ {
FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer"); FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer");
@ -294,22 +233,6 @@ DEFINE_MAP_OPTION(brightfog, false)
opt->brightfog = parse.sc.Number; opt->brightfog = parse.sc.Number;
} }
DEFINE_MAP_OPTION(outsidefogdensity, false)
{
FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer");
parse.ParseAssign();
parse.sc.MustGetNumber();
opt->outsidefogdensity = parse.sc.Number;
}
DEFINE_MAP_OPTION(skyfog, false)
{
FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer");
parse.ParseAssign();
parse.sc.MustGetNumber();
opt->skyfog = parse.sc.Number;
}
DEFINE_MAP_OPTION(lightmode, false) DEFINE_MAP_OPTION(lightmode, false)
{ {
FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer"); FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer");
@ -440,7 +363,6 @@ void InitGLRMapinfoData()
if (opt != NULL) if (opt != NULL)
{ {
gl_SetFogParams(clamp(opt->fogdensity, 0, 255), level.info->outsidefog, clamp(opt->outsidefogdensity, 0, 255), opt->skyfog);
glset.map_lightmode = opt->lightmode; glset.map_lightmode = opt->lightmode;
glset.map_lightadditivesurfaces = opt->lightadditivesurfaces; glset.map_lightadditivesurfaces = opt->lightadditivesurfaces;
glset.map_brightfog = opt->brightfog; glset.map_brightfog = opt->brightfog;
@ -453,7 +375,6 @@ void InitGLRMapinfoData()
} }
else else
{ {
gl_SetFogParams(0, level.info->outsidefog, 0, 0);
glset.map_lightmode = -1; glset.map_lightmode = -1;
glset.map_lightadditivesurfaces = -1; glset.map_lightadditivesurfaces = -1;
glset.map_brightfog = -1; glset.map_brightfog = -1;

View file

@ -206,12 +206,3 @@ bool gl_GetWallGlow(sector_t *sector, float *topglowcolor, float *bottomglowcolo
return ret; return ret;
} }
#include "c_dispatch.h"
#include "d_player.h"
CCMD(setglow)
{
auto s = players[0].mo->Sector;
s->planes[sector_t::floor].GlowHeight = 128;
s->planes[sector_t::floor].GlowColor = 0xff0000;
}

View file

@ -42,10 +42,6 @@
// externally settable lighting properties // externally settable lighting properties
static float distfogtable[2][256]; // light to fog conversion table for black fog static float distfogtable[2][256]; // light to fog conversion table for black fog
static PalEntry outsidefogcolor;
int fogdensity;
int outsidefogdensity;
int skyfog;
CVAR(Int, gl_weaponlight, 8, CVAR_ARCHIVE); CVAR(Int, gl_weaponlight, 8, CVAR_ARCHIVE);
CUSTOM_CVAR(Bool, gl_enhanced_nightvision, true, CVAR_ARCHIVE|CVAR_NOINITCALL) CUSTOM_CVAR(Bool, gl_enhanced_nightvision, true, CVAR_ARCHIVE|CVAR_NOINITCALL)
@ -165,23 +161,6 @@ void gl_GetRenderStyle(FRenderStyle style, bool drawopaque, bool allowcolorblend
} }
//==========================================================================
//
// Set fog parameters for the level
//
//==========================================================================
void gl_SetFogParams(int _fogdensity, PalEntry _outsidefogcolor, int _outsidefogdensity, int _skyfog)
{
fogdensity=_fogdensity;
outsidefogcolor=_outsidefogcolor;
outsidefogdensity=_outsidefogdensity;
skyfog=_skyfog;
outsidefogdensity>>=1;
fogdensity>>=1;
}
//========================================================================== //==========================================================================
// //
// Get current light level // Get current light level
@ -301,7 +280,7 @@ float gl_GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfogdensity)
if (glset.lightmode & 4) if (glset.lightmode & 4)
{ {
// uses approximations of Legacy's default settings. // uses approximations of Legacy's default settings.
density = fogdensity ? fogdensity : 18; density = level.fogdensity ? level.fogdensity : 18;
} }
else if (sectorfogdensity != 0) else if (sectorfogdensity != 0)
{ {
@ -320,15 +299,15 @@ float gl_GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfogdensity)
density = 0; density = 0;
} }
} }
else if (outsidefogdensity != 0 && outsidefogcolor.a != 0xff && (fogcolor.d & 0xffffff) == (outsidefogcolor.d & 0xffffff)) 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 // case 3. outsidefogdensity has already been set as needed
density = outsidefogdensity; density = level.outsidefogdensity;
} }
else if (fogdensity != 0) else if (level.fogdensity != 0)
{ {
// case 4: level has fog density set // case 4: level has fog density set
density = fogdensity; density = level.fogdensity;
} }
else if (lightlevel < 248) else if (lightlevel < 248)
{ {
@ -343,40 +322,6 @@ float gl_GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfogdensity)
} }
//==========================================================================
//
// Check fog by current lighting info
//
//==========================================================================
bool gl_CheckFog(FColormap *cm, int lightlevel)
{
// Check for fog boundaries. This needs a few more checks for the sectors
bool frontfog;
PalEntry fogcolor = cm->FadeColor;
if ((fogcolor.d & 0xffffff) == 0)
{
frontfog = false;
}
else if (outsidefogdensity != 0 && outsidefogcolor.a!=0xff && (fogcolor.d & 0xffffff) == (outsidefogcolor.d & 0xffffff))
{
frontfog = true;
}
else if (fogdensity!=0 || (glset.lightmode & 4))
{
// case 3: level has fog density set
frontfog = true;
}
else
{
// case 4: use light level
frontfog = lightlevel < 248;
}
return frontfog;
}
//========================================================================== //==========================================================================
// //
// Check if the current linedef is a candidate for a fog boundary // Check if the current linedef is a candidate for a fog boundary
@ -400,10 +345,13 @@ bool gl_CheckFog(sector_t *frontsector, sector_t *backsector)
{ {
return false; return false;
} }
else if (outsidefogdensity != 0 && outsidefogcolor.a!=0xff && (fogcolor.d & 0xffffff) == (outsidefogcolor.d & 0xffffff)) else if (fogcolor.a != 0)
{ {
} }
else if (fogdensity!=0 || (glset.lightmode & 4)) else if (level.outsidefogdensity != 0 && APART(level.info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (level.info->outsidefog & 0xffffff))
{
}
else if (level.fogdensity!=0 || (glset.lightmode & 4))
{ {
// case 3: level has fog density set // case 3: level has fog density set
} }
@ -418,11 +366,11 @@ bool gl_CheckFog(sector_t *frontsector, sector_t *backsector)
if ((fogcolor.d & 0xffffff) == 0) if ((fogcolor.d & 0xffffff) == 0)
{ {
} }
else if (outsidefogdensity != 0 && outsidefogcolor.a!=0xff && (fogcolor.d & 0xffffff) == (outsidefogcolor.d & 0xffffff)) else if (level.outsidefogdensity != 0 && APART(level.info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (level.info->outsidefog & 0xffffff))
{ {
return false; return false;
} }
else if (fogdensity!=0 || (glset.lightmode & 4)) else if (level.fogdensity!=0 || (glset.lightmode & 4))
{ {
// case 3: level has fog density set // case 3: level has fog density set
return false; return false;
@ -539,18 +487,3 @@ void gl_SetFog(int lightlevel, int rellight, bool fullbright, const FColormap *c
} }
} }
} }
//==========================================================================
//
// For testing sky fog sheets
//
//==========================================================================
CCMD(skyfog)
{
if (argv.argc()>1)
{
skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0));
}
}

View file

@ -13,14 +13,12 @@ inline int gl_ClampLight(int lightlevel)
void gl_GetRenderStyle(FRenderStyle style, bool drawopaque, bool allowcolorblending, void gl_GetRenderStyle(FRenderStyle style, bool drawopaque, bool allowcolorblending,
int *tm, int *sb, int *db, int *be); int *tm, int *sb, int *db, int *be);
void gl_SetFogParams(int _fogdensity, PalEntry _outsidefogcolor, int _outsidefogdensity, int _skyfog);
int gl_CalcLightLevel(int lightlevel, int rellight, bool weapon); int gl_CalcLightLevel(int lightlevel, int rellight, bool weapon);
void gl_SetColor(int light, int rellight, bool fullbright, const FColormap &cm, float alpha, bool weapon=false); void gl_SetColor(int light, int rellight, bool fullbright, const FColormap &cm, float alpha, bool weapon=false);
float gl_GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfogdensity); float gl_GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfogdensity);
struct sector_t; struct sector_t;
bool gl_CheckFog(FColormap *cm, int lightlevel);
bool gl_CheckFog(sector_t *frontsector, sector_t *backsector); bool gl_CheckFog(sector_t *frontsector, sector_t *backsector);
void gl_SetFog(int lightlevel, int rellight, bool fullbright, const FColormap *cm, bool isadditive); void gl_SetFog(int lightlevel, int rellight, bool fullbright, const FColormap *cm, bool isadditive);
@ -35,11 +33,6 @@ inline bool gl_isWhite(PalEntry color)
return color.r + color.g + color.b == 3*0xff; return color.r + color.g + color.b == 3*0xff;
} }
extern int fogdensity;
extern int outsidefogdensity;
extern int skyfog;
inline void FColormap::CopyFrom3DLight(lightlist_t *light) inline void FColormap::CopyFrom3DLight(lightlist_t *light)
{ {
LightColor = light->extra_colormap->Color; LightColor = light->extra_colormap->Color;

View file

@ -991,7 +991,6 @@ struct FGLInterface : public FRenderer
void StartSerialize(FSerializer &arc) override; void StartSerialize(FSerializer &arc) override;
void EndSerialize(FSerializer &arc) override; void EndSerialize(FSerializer &arc) override;
void RenderTextureView (FCanvasTexture *self, AActor *viewpoint, int fov) override; void RenderTextureView (FCanvasTexture *self, AActor *viewpoint, int fov) override;
void SetFogParams(int _fogdensity, PalEntry _outsidefogcolor, int _outsidefogdensity, int _skyfog) override;
void PreprocessLevel() override; void PreprocessLevel() override;
void CleanLevelData() override; void CleanLevelData() override;
bool RequireGLNodes() override; bool RequireGLNodes() override;
@ -1033,19 +1032,13 @@ void FGLInterface::Precache(uint8_t *texhitlist, TMap<PClassActor*, bool> &actor
void FGLInterface::StartSerialize(FSerializer &arc) void FGLInterface::StartSerialize(FSerializer &arc)
{ {
if (arc.BeginObject("glinfo"))
{
arc("fogdensity", fogdensity)
("outsidefogdensity", outsidefogdensity)
("skyfog", skyfog)
.EndObject();
}
} }
void FGLInterface::EndSerialize(FSerializer &arc) void FGLInterface::EndSerialize(FSerializer &arc)
{ {
if (arc.isReading()) if (arc.isReading())
{ {
// The portal data needs to be recreated after reading a savegame.
gl_InitPortals(); gl_InitPortals();
} }
} }
@ -1170,11 +1163,6 @@ void FGLInterface::RenderTextureView (FCanvasTexture *tex, AActor *Viewpoint, in
// //
//=========================================================================== //===========================================================================
void FGLInterface::SetFogParams(int _fogdensity, PalEntry _outsidefogcolor, int _outsidefogdensity, int _skyfog)
{
gl_SetFogParams(_fogdensity, _outsidefogcolor, _outsidefogdensity, _skyfog);
}
void FGLInterface::PreprocessLevel() void FGLInterface::PreprocessLevel()
{ {
gl_PreprocessLevel(); gl_PreprocessLevel();

View file

@ -39,7 +39,6 @@
#include "gl/utility/gl_convert.h" #include "gl/utility/gl_convert.h"
CVAR(Bool,gl_noskyboxes, false, 0) CVAR(Bool,gl_noskyboxes, false, 0)
extern int skyfog;
//========================================================================== //==========================================================================
// //
@ -98,7 +97,7 @@ void GLSkyInfo::init(int sky1, PalEntry FadeColor)
x_offset[0] = GLRenderer->mSky1Pos; x_offset[0] = GLRenderer->mSky1Pos;
} }
} }
if (skyfog > 0) if (level.skyfog > 0)
{ {
fadecolor = FadeColor; fadecolor = FadeColor;
fadecolor.a = 0; fadecolor.a = 0;

View file

@ -86,8 +86,6 @@
CVAR(Float, skyoffset, 0, 0) // for testing CVAR(Float, skyoffset, 0, 0) // for testing
extern int skyfog;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
// //
@ -545,10 +543,10 @@ void GLSkyPortal::DrawContents()
RenderDome(origin->texture[1], origin->x_offset[1], origin->y_offset, false, FSkyVertexBuffer::SKYMODE_SECONDLAYER); RenderDome(origin->texture[1], origin->x_offset[1], origin->y_offset, false, FSkyVertexBuffer::SKYMODE_SECONDLAYER);
} }
if (skyfog>0 && drawer->FixedColormap == CM_DEFAULT && (origin->fadecolor & 0xffffff) != 0) if (::level.skyfog>0 && drawer->FixedColormap == CM_DEFAULT && (origin->fadecolor & 0xffffff) != 0)
{ {
PalEntry FadeColor = origin->fadecolor; PalEntry FadeColor = origin->fadecolor;
FadeColor.a = clamp<int>(skyfog, 0, 255); FadeColor.a = clamp<int>(::level.skyfog, 0, 255);
gl_RenderState.EnableTexture(false); gl_RenderState.EnableTexture(false);
gl_RenderState.SetObjectColor(FadeColor); gl_RenderState.SetObjectColor(FadeColor);

View file

@ -1649,7 +1649,7 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector)
bool isportal = seg->linedef->isVisualPortal() && seg->sidedef == seg->linedef->sidedef[0]; bool isportal = seg->linedef->isVisualPortal() && seg->sidedef == seg->linedef->sidedef[0];
sector_t *backsec = isportal? seg->linedef->getPortalDestination()->frontsector : backsector; sector_t *backsec = isportal? seg->linedef->getPortalDestination()->frontsector : backsector;
bool drawfogboundary = gl_CheckFog(frontsector, backsec); bool drawfogboundary = mDrawer->FixedColormap != CM_DEFAULT && gl_CheckFog(frontsector, backsec);
FTexture *tex = TexMan(seg->sidedef->GetTexture(side_t::mid)); FTexture *tex = TexMan(seg->sidedef->GetTexture(side_t::mid));
if (tex != NULL) if (tex != NULL)
{ {

View file

@ -3350,6 +3350,79 @@ FUNC(LS_Line_SetPortalTarget)
return P_ChangePortal(ln, arg0, arg1); return P_ChangePortal(ln, arg0, arg1);
} }
FUNC(LS_Sector_SetPlaneReflection)
// Sector_SetPlaneReflection (tag, floor, ceiling)
{
int secnum;
FSectorTagIterator itr(arg0);
while ((secnum = itr.Next()) >= 0)
{
sector_t * s = &level.sectors[secnum];
if (!s->floorplane.isSlope()) s->reflect[sector_t::floor] = arg1 / 255.f;
if (!s->ceilingplane.isSlope()) level.sectors[secnum].reflect[sector_t::ceiling] = arg2 / 255.f;
}
return true;
}
FUNC(LS_SetGlobalFogParameter)
// SetGlobalFogParameter (type, value)
{
switch (arg0)
{
case 0:
level.fogdensity = arg1 >> 1;
return true;
case 1:
level.outsidefogdensity = arg1 >> 1;
return true;
case 2:
level.skyfog = arg1;
return true;
default:
return false;
}
}
FUNC(LS_Sector_SetFloorGlow)
// Sector_SetFloorGlow(tag, height, r, g, b)
{
int secnum;
PalEntry color(arg2, arg3, arg4);
if (arg1 < 0) color = -1; // negative height invalidates the glow.
FSectorTagIterator itr(arg0);
while ((secnum = itr.Next()) >= 0)
{
sector_t * s = &level.sectors[secnum];
s->SetGlowColor(sector_t::floor, color);
s->SetGlowHeight(sector_t::floor, float(arg1));
}
return true;
}
FUNC(LS_Sector_SetCeilingGlow)
// Sector_SetCeilingGlow(tag, height, r, g, b)
{
int secnum;
PalEntry color(arg2, arg3, arg4);
if (arg1 < 0) color = -1; // negative height invalidates the glow.
FSectorTagIterator itr(arg0);
while ((secnum = itr.Next()) >= 0)
{
sector_t * s = &level.sectors[secnum];
s->SetGlowColor(sector_t::ceiling, color);
s->SetGlowHeight(sector_t::ceiling, float(arg1));
}
return true;
}
static lnSpecFunc LineSpecials[] = static lnSpecFunc LineSpecials[] =
{ {
/* 0 */ LS_NOP, /* 0 */ LS_NOP,
@ -3630,6 +3703,9 @@ static lnSpecFunc LineSpecials[] =
/* 274 */ LS_Door_AnimatedClose, /* 274 */ LS_Door_AnimatedClose,
/* 275 */ LS_Floor_Stop, /* 275 */ LS_Floor_Stop,
/* 276 */ LS_Ceiling_Stop, /* 276 */ LS_Ceiling_Stop,
/* 277 */ LS_Sector_SetFloorGlow,
/* 278 */ LS_Sector_SetCeilingGlow,
}; };

View file

@ -944,7 +944,10 @@ void G_SerializeLevel(FSerializer &arc, bool hubload)
("level.maptime", level.maptime) ("level.maptime", level.maptime)
("level.totaltime", i) ("level.totaltime", i)
("level.skytexture1", level.skytexture1) ("level.skytexture1", level.skytexture1)
("level.skytexture2", level.skytexture2); ("level.skytexture2", level.skytexture2)
("level.fogdensity", level.fogdensity)
("level.outsidefogdensity", level.outsidefogdensity)
("level.skyfog", level.skyfog);
// Hub transitions must keep the current total time // Hub transitions must keep the current total time
if (!hubload) if (!hubload)

View file

@ -1847,6 +1847,38 @@ DEFINE_ACTION_FUNCTION(_Sector, NextLowestFloorAt)
return 0; return 0;
} }
DEFINE_ACTION_FUNCTION(_Sector, GetGlowHeight)
{
PARAM_SELF_STRUCT_PROLOGUE(sector_t);
PARAM_INT(pos);
ACTION_RETURN_FLOAT(self->GetGlowHeight(pos));
}
DEFINE_ACTION_FUNCTION(_Sector, GetGlowColor)
{
PARAM_SELF_STRUCT_PROLOGUE(sector_t);
PARAM_INT(pos);
ACTION_RETURN_INT(self->GetGlowColor(pos));
}
DEFINE_ACTION_FUNCTION(_Sector, SetGlowHeight)
{
PARAM_SELF_STRUCT_PROLOGUE(sector_t);
PARAM_INT(pos);
PARAM_FLOAT(o);
self->SetGlowHeight(pos, float(o));
return 0;
}
DEFINE_ACTION_FUNCTION(_Sector, SetGlowColor)
{
PARAM_SELF_STRUCT_PROLOGUE(sector_t);
PARAM_INT(pos);
PARAM_COLOR(o);
self->SetGlowColor(pos, o);
return 0;
}
//=========================================================================== //===========================================================================
// //
// line_t exports // line_t exports
@ -2034,6 +2066,7 @@ DEFINE_ACTION_FUNCTION(_Sector, NextLowestFloorAt)
ACTION_RETURN_INT(self->Index()); ACTION_RETURN_INT(self->Index());
} }
//=========================================================================== //===========================================================================
// //
// //

View file

@ -794,6 +794,26 @@ public:
planes[pos].Light = level; planes[pos].Light = level;
} }
double GetGlowHeight(int pos)
{
return planes[pos].GlowHeight;
}
PalEntry GetGlowColor(int pos)
{
return planes[pos].GlowColor;
}
void SetGlowHeight(int pos, float height)
{
planes[pos].GlowHeight = height;
}
void SetGlowColor(int pos, PalEntry color)
{
planes[pos].GlowColor = color;
}
FTextureID GetTexture(int pos) const FTextureID GetTexture(int pos) const
{ {
return planes[pos].Texture; return planes[pos].Texture;

View file

@ -53,7 +53,6 @@ struct FRenderer
virtual void SetClearColor(int color) = 0; virtual void SetClearColor(int color) = 0;
virtual void Init() = 0; virtual void Init() = 0;
virtual void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov) = 0; virtual void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov) = 0;
virtual void SetFogParams(int _fogdensity, PalEntry _outsidefogcolor, int _outsidefogdensity, int _skyfog) {}
virtual void PreprocessLevel() {} virtual void PreprocessLevel() {}
virtual void CleanLevelData() {} virtual void CleanLevelData() {}
virtual bool RequireGLNodes() { return false; } virtual bool RequireGLNodes() { return false; }

View file

@ -323,7 +323,7 @@ void ReadPalette(int lumpnum, uint8_t *buffer)
{ {
FScanner sc; FScanner sc;
sc.OpenMem(Wads.GetLumpFullName(lumpnum), (char*)lumpmem, lump.GetSize()); sc.OpenMem(Wads.GetLumpFullName(lumpnum), (char*)lumpmem, int(lump.GetSize()));
sc.MustGetString(); sc.MustGetString();
sc.MustGetNumber(); // version - ignore sc.MustGetNumber(); // version - ignore
sc.MustGetNumber(); sc.MustGetNumber();

View file

@ -485,6 +485,9 @@ struct LevelLocals native
native bool frozen; native bool frozen;
native readonly bool infinite_flight; native readonly bool infinite_flight;
native readonly bool no_dlg_freeze; native readonly bool no_dlg_freeze;
native readonly int fogdensity;
native readonly int outsidefogdensity;
native readonly int skyfog;
// level_info_t *info cannot be done yet. // level_info_t *info cannot be done yet.
native String GetUDMFString(int type, int index, Name key); native String GetUDMFString(int type, int index, Name key);

View file

@ -360,6 +360,11 @@ struct Sector native play
native void ChangeFlags(int pos, int And, int Or); native void ChangeFlags(int pos, int And, int Or);
native int GetPlaneLight(int pos); native int GetPlaneLight(int pos);
native void SetPlaneLight(int pos, int level); native void SetPlaneLight(int pos, int level);
native double GetGlowHeight(int pos);
native color GetGlowColor(int pos);
native void SetGlowHeight(int pos, double height);
native void SetGlowColor(int pos, color color);
native TextureID GetTexture(int pos); native TextureID GetTexture(int pos);
native void SetTexture(int pos, TextureID tex, bool floorclip = true); native void SetTexture(int pos, TextureID tex, bool floorclip = true);
native double GetPlaneTexZ(int pos); native double GetPlaneTexZ(int pos);