mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-29 15:32:54 +00:00
Merge branch 'master' of https://github.com/coelckers/gzdoom
This commit is contained in:
commit
af330e1c41
10 changed files with 65 additions and 27 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue