This commit is contained in:
Rachael Alexanderson 2016-12-06 13:55:46 -05:00
commit af330e1c41
10 changed files with 65 additions and 27 deletions

View file

@ -59,6 +59,7 @@ long gl_frameCount;
EXTERN_CVAR(Int, gl_lightmode) EXTERN_CVAR(Int, gl_lightmode)
EXTERN_CVAR(Bool, gl_brightfog) EXTERN_CVAR(Bool, gl_brightfog)
EXTERN_CVAR(Bool, gl_lightadditivesurfaces)
CUSTOM_CVAR(Float, maxviewpitch, 90.f, CVAR_ARCHIVE|CVAR_SERVERINFO) CUSTOM_CVAR(Float, maxviewpitch, 90.f, CVAR_ARCHIVE|CVAR_SERVERINFO)
{ {
@ -210,6 +211,7 @@ struct FGLROptions : public FOptionalMapinfoData
skyrotatevector = FVector3(0,0,1); skyrotatevector = FVector3(0,0,1);
skyrotatevector2 = FVector3(0,0,1); skyrotatevector2 = FVector3(0,0,1);
pixelstretch = 1.2f; pixelstretch = 1.2f;
lightadditivesurfaces = false;
} }
virtual FOptionalMapinfoData *Clone() const virtual FOptionalMapinfoData *Clone() const
{ {
@ -224,6 +226,7 @@ struct FGLROptions : public FOptionalMapinfoData
newopt->skyrotatevector = skyrotatevector; newopt->skyrotatevector = skyrotatevector;
newopt->skyrotatevector2 = skyrotatevector2; newopt->skyrotatevector2 = skyrotatevector2;
newopt->pixelstretch = pixelstretch; newopt->pixelstretch = pixelstretch;
newopt->lightadditivesurfaces = lightadditivesurfaces;
return newopt; return newopt;
} }
int fogdensity; int fogdensity;
@ -231,8 +234,9 @@ struct FGLROptions : public FOptionalMapinfoData
int skyfog; int skyfog;
int lightmode; int lightmode;
int brightfog; int brightfog;
SBYTE nocoloredspritelighting; int8_t lightadditivesurfaces;
SBYTE notexturefill; int8_t nocoloredspritelighting;
int8_t notexturefill;
FVector3 skyrotatevector; FVector3 skyrotatevector;
FVector3 skyrotatevector2; FVector3 skyrotatevector2;
float pixelstretch; float pixelstretch;
@ -306,6 +310,20 @@ DEFINE_MAP_OPTION(notexturefill, false)
} }
} }
DEFINE_MAP_OPTION(lightadditivesurfaces, false)
{
FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer");
if (parse.CheckAssign())
{
parse.sc.MustGetNumber();
opt->lightadditivesurfaces = !!parse.sc.Number;
}
else
{
opt->lightadditivesurfaces = true;
}
}
DEFINE_MAP_OPTION(skyrotate, false) DEFINE_MAP_OPTION(skyrotate, false)
{ {
FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer"); FGLROptions *opt = info->GetOptData<FGLROptions>("gl_renderer");
@ -360,6 +378,7 @@ void InitGLRMapinfoData()
{ {
gl_SetFogParams(opt->fogdensity, level.info->outsidefog, opt->outsidefogdensity, opt->skyfog); gl_SetFogParams(opt->fogdensity, level.info->outsidefog, opt->outsidefogdensity, opt->skyfog);
glset.map_lightmode = opt->lightmode; glset.map_lightmode = opt->lightmode;
glset.map_lightadditivesurfaces = opt->lightadditivesurfaces;
glset.map_brightfog = opt->brightfog; glset.map_brightfog = opt->brightfog;
glset.map_nocoloredspritelighting = opt->nocoloredspritelighting; glset.map_nocoloredspritelighting = opt->nocoloredspritelighting;
glset.map_notexturefill = opt->notexturefill; glset.map_notexturefill = opt->notexturefill;
@ -371,6 +390,7 @@ void InitGLRMapinfoData()
{ {
gl_SetFogParams(0, level.info->outsidefog, 0, 0); gl_SetFogParams(0, level.info->outsidefog, 0, 0);
glset.map_lightmode = -1; glset.map_lightmode = -1;
glset.map_lightadditivesurfaces = -1;
glset.map_brightfog = -1; glset.map_brightfog = -1;
glset.map_nocoloredspritelighting = -1; glset.map_nocoloredspritelighting = -1;
glset.map_notexturefill = -1; glset.map_notexturefill = -1;
@ -387,6 +407,8 @@ void InitGLRMapinfoData()
else glset.notexturefill = !!glset.map_notexturefill; else glset.notexturefill = !!glset.map_notexturefill;
if (glset.map_brightfog == -1) glset.brightfog = gl_brightfog; if (glset.map_brightfog == -1) glset.brightfog = gl_brightfog;
else glset.brightfog = !!glset.map_brightfog; else glset.brightfog = !!glset.map_brightfog;
if (glset.map_lightadditivesurfaces == -1) glset.brightfog = gl_brightfog;
else glset.lightadditivesurfaces = !!glset.map_lightadditivesurfaces;
} }
CCMD(gl_resetmap) CCMD(gl_resetmap)

View file

@ -12,11 +12,13 @@ struct GLRenderSettings
bool nocoloredspritelighting; bool nocoloredspritelighting;
bool notexturefill; bool notexturefill;
bool brightfog; bool brightfog;
bool lightadditivesurfaces;
SBYTE map_lightmode; int8_t map_lightmode;
SBYTE map_nocoloredspritelighting; int8_t map_nocoloredspritelighting;
SBYTE map_notexturefill; int8_t map_notexturefill;
SBYTE map_brightfog; int8_t map_brightfog;
int8_t map_lightadditivesurfaces;
FVector3 skyrotatevector; FVector3 skyrotatevector;
FVector3 skyrotatevector2; FVector3 skyrotatevector2;

View file

@ -67,6 +67,7 @@
#include "templates.h" #include "templates.h"
#include "doomdata.h" #include "doomdata.h"
#include "r_utility.h" #include "r_utility.h"
#include "p_local.h"
#include "portal.h" #include "portal.h"
#include "doomstat.h" #include "doomstat.h"
#include "serializer.h" #include "serializer.h"
@ -192,6 +193,7 @@ void ADynamicLight::BeginPlay()
m_Radius[0] = args[LIGHT_INTENSITY]; m_Radius[0] = args[LIGHT_INTENSITY];
m_Radius[1] = args[LIGHT_SECONDARY_INTENSITY]; m_Radius[1] = args[LIGHT_SECONDARY_INTENSITY];
specialf1 = DAngle(double(SpawnAngle)).Normalized360().Degrees;
visibletoplayer = true; visibletoplayer = true;
} }
@ -228,7 +230,7 @@ void ADynamicLight::Activate(AActor *activator)
if (lighttype == PulseLight) if (lighttype == PulseLight)
{ {
float pulseTime = Angles.Yaw.Degrees / TICRATE; float pulseTime = specialf1 / TICRATE;
m_lastUpdate = level.maptime; m_lastUpdate = level.maptime;
m_cycler.SetParams(float(m_Radius[1]), float(m_Radius[0]), pulseTime); m_cycler.SetParams(float(m_Radius[1]), float(m_Radius[0]), pulseTime);
@ -293,7 +295,7 @@ void ADynamicLight::Tick()
case FlickerLight: case FlickerLight:
{ {
BYTE rnd = randLight(); BYTE rnd = randLight();
float pct = Angles.Yaw.Degrees / 360.f; float pct = specialf1 / 360.f;
m_currentRadius = float(m_Radius[rnd >= pct * 255]); m_currentRadius = float(m_Radius[rnd >= pct * 255]);
break; break;
@ -304,12 +306,13 @@ void ADynamicLight::Tick()
int flickerRange = m_Radius[1] - m_Radius[0]; int flickerRange = m_Radius[1] - m_Radius[0];
float amt = randLight() / 255.f; float amt = randLight() / 255.f;
m_tickCount++; if (m_tickCount > specialf1)
{
if (m_tickCount > Angles.Yaw.Degrees) m_tickCount = 0;
}
if (m_tickCount++ == 0 || m_currentRadius > m_Radius[1])
{ {
m_currentRadius = float(m_Radius[0] + (amt * flickerRange)); m_currentRadius = float(m_Radius[0] + (amt * flickerRange));
m_tickCount = 0;
} }
break; break;
} }
@ -319,7 +322,7 @@ void ADynamicLight::Tick()
case ColorFlickerLight: case ColorFlickerLight:
{ {
BYTE rnd = randLight(); BYTE rnd = randLight();
float pct = Angles.Yaw.Degrees/360.f; float pct = specialf1/360.f;
m_currentRadius = m_Radius[rnd >= pct * 255]; m_currentRadius = m_Radius[rnd >= pct * 255];
break; break;
@ -332,7 +335,7 @@ void ADynamicLight::Tick()
m_tickCount++; m_tickCount++;
if (m_tickCount > Angles.Yaw.Degrees) if (m_tickCount > specialf1)
{ {
m_currentRadius = m_Radius[0] + (amt * flickerRange); m_currentRadius = m_Radius[0] + (amt * flickerRange);
m_tickCount = 0; m_tickCount = 0;
@ -359,7 +362,6 @@ void ADynamicLight::Tick()
m_currentRadius = float(m_Radius[0]); m_currentRadius = float(m_Radius[0]);
break; break;
} }
UpdateLocation(); UpdateLocation();
} }
@ -416,6 +418,7 @@ void ADynamicLight::UpdateLocation()
intensity = m_currentRadius; intensity = m_currentRadius;
} }
radius = intensity * 2.0f; radius = intensity * 2.0f;
assert(radius >= m_currentRadius * 2);
if (X() != oldx || Y() != oldy || radius != oldradius) if (X() != oldx || Y() != oldy || radius != oldradius)
{ {

View file

@ -164,7 +164,7 @@ FLightDefaults::FLightDefaults(FName name, ELightType type)
void FLightDefaults::ApplyProperties(ADynamicLight * light) const void FLightDefaults::ApplyProperties(ADynamicLight * light) const
{ {
light->lighttype = m_type; light->lighttype = m_type;
light->Angles.Yaw.Degrees = m_Param; light->specialf1 = m_Param;
light->SetOffset(m_Pos); light->SetOffset(m_Pos);
light->halo = m_halo; light->halo = m_halo;
for (int a = 0; a < 3; a++) light->args[a] = clamp<int>((int)(m_Args[a]), 0, 255); for (int a = 0; a < 3; a++) light->args[a] = clamp<int>((int)(m_Args[a]), 0, 255);
@ -174,6 +174,7 @@ void FLightDefaults::ApplyProperties(ADynamicLight * light) const
if (m_subtractive) light->flags4 |= MF4_SUBTRACTIVE; if (m_subtractive) light->flags4 |= MF4_SUBTRACTIVE;
if (m_additive) light->flags4 |= MF4_ADDITIVE; if (m_additive) light->flags4 |= MF4_ADDITIVE;
if (m_dontlightself) light->flags4 |= MF4_DONTLIGHTSELF; if (m_dontlightself) light->flags4 |= MF4_DONTLIGHTSELF;
light->m_tickCount = 0;
} }
@ -431,6 +432,14 @@ void gl_ParsePulseLight(FScanner &sc)
sc.ScriptError("Unknown tag: %s\n", sc.String); sc.ScriptError("Unknown tag: %s\n", sc.String);
} }
} }
if (defaults->GetArg(LIGHT_INTENSITY) > defaults->GetArg(LIGHT_SECONDARY_INTENSITY))
{
auto i = defaults->GetArg(LIGHT_INTENSITY);
auto j = defaults->GetArg(LIGHT_SECONDARY_INTENSITY);
defaults->SetArg(LIGHT_INTENSITY, j);
defaults->SetArg(LIGHT_SECONDARY_INTENSITY, i);
}
gl_AddLightDefaults(defaults); gl_AddLightDefaults(defaults);
} }
else else
@ -1082,7 +1091,7 @@ void gl_AttachLight(AActor *actor, unsigned int count, const FLightDefaults *lig
light->target = actor; light->target = actor;
light->owned = true; light->owned = true;
light->ObjectFlags |= OF_Transient; light->ObjectFlags |= OF_Transient;
light->flags4 |= MF4_ATTENUATE; //light->flags4 |= MF4_ATTENUATE;
actor->dynamiclights.Push(light); actor->dynamiclights.Push(light);
} }
light->flags2&=~MF2_DORMANT; light->flags2&=~MF2_DORMANT;

View file

@ -128,12 +128,12 @@ private:
protected: protected:
DVector3 m_off; DVector3 m_off;
float m_currentRadius; float m_currentRadius;
int m_tickCount;
unsigned int m_lastUpdate; unsigned int m_lastUpdate;
FCycler m_cycler; FCycler m_cycler;
subsector_t * subsector; subsector_t * subsector;
public: public:
int m_tickCount;
int m_Radius[2]; int m_Radius[2];
BYTE lightflags; BYTE lightflags;
BYTE lighttype; BYTE lighttype;
@ -143,11 +143,6 @@ public:
bool visibletoplayer; bool visibletoplayer;
int bufferindex; int bufferindex;
// intermediate texture coordinate data
// this is stored in the light object to avoid recalculating it
// several times during rendering of a flat
Vector nearPt, up, right;
float scale;
}; };

View file

@ -63,6 +63,7 @@ CUSTOM_CVAR(Bool, gl_enhanced_nightvision, true, CVAR_ARCHIVE|CVAR_NOINITCALL)
} }
} }
CVAR(Bool, gl_brightfog, false, CVAR_ARCHIVE); CVAR(Bool, gl_brightfog, false, CVAR_ARCHIVE);
CVAR(Bool, lightadditivesurfaces, false, CVAR_ARCHIVE);

View file

@ -109,7 +109,7 @@ void GLFlat::SetupSubsectorLights(int pass, subsector_t * sub, int *dli)
{ {
Plane p; Plane p;
if (renderstyle == STYLE_Add) return; // no lights on additively blended surfaces. if (renderstyle == STYLE_Add && !glset.lightadditivesurfaces) return; // no lights on additively blended surfaces.
if (dli != NULL && *dli != -1) if (dli != NULL && *dli != -1)
{ {

View file

@ -142,6 +142,9 @@ void GLSprite::CalculateVertices(FVector3 *v)
v[1] = mat * FVector3(x1, z, y2); v[1] = mat * FVector3(x1, z, y2);
v[2] = mat * FVector3(x2, z, y1); v[2] = mat * FVector3(x2, z, y1);
v[3] = mat * FVector3(x1, z, y1); v[3] = mat * FVector3(x1, z, y1);
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(-1.0f, -128.0f);
return; return;
} }
@ -445,6 +448,11 @@ void GLSprite::Draw(int pass)
gl_RenderState.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gl_RenderState.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
gl_RenderState.BlendEquation(GL_FUNC_ADD); gl_RenderState.BlendEquation(GL_FUNC_ADD);
gl_RenderState.SetTextureMode(TM_MODULATE); gl_RenderState.SetTextureMode(TM_MODULATE);
if (actor != nullptr && (actor->renderflags & RF_SPRITETYPEMASK) == RF_FLATSPRITE)
{
glPolygonOffset(0.0f, 0.0f);
glDisable(GL_POLYGON_OFFSET_FILL);
}
} }
else if (modelframe == nullptr) else if (modelframe == nullptr)
{ {

View file

@ -56,7 +56,7 @@ FDynLightData lightdata;
void GLWall::SetupLights() void GLWall::SetupLights()
{ {
if (RenderStyle == STYLE_Add) return; // no lights on additively blended surfaces. if (RenderStyle == STYLE_Add && !glset.lightadditivesurfaces) return; // no lights on additively blended surfaces.
// check for wall types which cannot have dynamic lights on them (portal types never get here so they don't need to be checked.) // check for wall types which cannot have dynamic lights on them (portal types never get here so they don't need to be checked.)
switch (type) switch (type)

View file

@ -188,8 +188,6 @@ static bool isBright(DPSprite *psp)
// //
//========================================================================== //==========================================================================
EXTERN_CVAR(Bool, gl_brightfog)
void FGLRenderer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep) void FGLRenderer::DrawPlayerSprites(sector_t * viewsector, bool hudModelStep)
{ {
bool brightflash = false; bool brightflash = false;