mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-02-09 01:01:05 +00:00
Merged https://github.com/coelckers/gzdoom/pull/1253 (GL Light Flag Additions)
This commit is contained in:
parent
d995e1c4ae
commit
bd43013e8a
5 changed files with 53 additions and 5 deletions
|
@ -40,7 +40,9 @@ enum LightFlag
|
||||||
LF_ATTENUATE = 8,
|
LF_ATTENUATE = 8,
|
||||||
LF_NOSHADOWMAP = 16,
|
LF_NOSHADOWMAP = 16,
|
||||||
LF_DONTLIGHTACTORS = 32,
|
LF_DONTLIGHTACTORS = 32,
|
||||||
LF_SPOT = 64
|
LF_SPOT = 64,
|
||||||
|
LF_DONTLIGHTOTHERS = 128,
|
||||||
|
LF_DONTLIGHTMAP = 256
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef TFlags<LightFlag> LightFlags;
|
typedef TFlags<LightFlag> LightFlags;
|
||||||
|
@ -72,6 +74,8 @@ public:
|
||||||
void SetDontLightSelf(bool add) { if (add) m_lightFlags |= LF_DONTLIGHTSELF; else m_lightFlags &= ~LF_DONTLIGHTSELF; }
|
void SetDontLightSelf(bool add) { if (add) m_lightFlags |= LF_DONTLIGHTSELF; else m_lightFlags &= ~LF_DONTLIGHTSELF; }
|
||||||
void SetAttenuate(bool on) { m_attenuate = on; if (on) m_lightFlags |= LF_ATTENUATE; else m_lightFlags &= ~LF_ATTENUATE; }
|
void SetAttenuate(bool on) { m_attenuate = on; if (on) m_lightFlags |= LF_ATTENUATE; else m_lightFlags &= ~LF_ATTENUATE; }
|
||||||
void SetDontLightActors(bool on) { if (on) m_lightFlags |= LF_DONTLIGHTACTORS; else m_lightFlags &= ~LF_DONTLIGHTACTORS; }
|
void SetDontLightActors(bool on) { if (on) m_lightFlags |= LF_DONTLIGHTACTORS; else m_lightFlags &= ~LF_DONTLIGHTACTORS; }
|
||||||
|
void SetDontLightOthers(bool on) { if (on) m_lightFlags |= LF_DONTLIGHTOTHERS; else m_lightFlags &= ~LF_DONTLIGHTOTHERS; }
|
||||||
|
void SetDontLightMap(bool on) { if (on) m_lightFlags |= LF_DONTLIGHTMAP; else m_lightFlags &= ~LF_DONTLIGHTMAP; }
|
||||||
void SetNoShadowmap(bool on) { if (on) m_lightFlags |= LF_NOSHADOWMAP; else m_lightFlags &= ~LF_NOSHADOWMAP; }
|
void SetNoShadowmap(bool on) { if (on) m_lightFlags |= LF_NOSHADOWMAP; else m_lightFlags &= ~LF_NOSHADOWMAP; }
|
||||||
void SetSpot(bool spot) { if (spot) m_lightFlags |= LF_SPOT; else m_lightFlags &= ~LF_SPOT; }
|
void SetSpot(bool spot) { if (spot) m_lightFlags |= LF_SPOT; else m_lightFlags &= ~LF_SPOT; }
|
||||||
void SetSpotInnerAngle(double angle) { m_spotInnerAngle = angle; }
|
void SetSpotInnerAngle(double angle) { m_spotInnerAngle = angle; }
|
||||||
|
@ -86,6 +90,7 @@ public:
|
||||||
m_pitch = 0.;
|
m_pitch = 0.;
|
||||||
m_explicitPitch = false;
|
m_explicitPitch = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetType(ELightType type) { m_type = type; }
|
void SetType(ELightType type) { m_type = type; }
|
||||||
void CopyFrom(const FLightDefaults &other)
|
void CopyFrom(const FLightDefaults &other)
|
||||||
{
|
{
|
||||||
|
@ -201,7 +206,10 @@ struct FDynamicLight
|
||||||
|
|
||||||
bool ShouldLightActor(AActor *check)
|
bool ShouldLightActor(AActor *check)
|
||||||
{
|
{
|
||||||
return visibletoplayer && IsActive() && (!((*pLightFlags) & LF_DONTLIGHTSELF) || target != check) && !((*pLightFlags) & LF_DONTLIGHTACTORS);
|
return visibletoplayer && IsActive() &&
|
||||||
|
(!((*pLightFlags) & LF_DONTLIGHTSELF) || target != check) &&
|
||||||
|
(!((*pLightFlags) & LF_DONTLIGHTOTHERS) || target == check) &&
|
||||||
|
(!((*pLightFlags) & LF_DONTLIGHTACTORS));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetOffset(const DVector3 &pos)
|
void SetOffset(const DVector3 &pos)
|
||||||
|
@ -225,6 +233,8 @@ struct FDynamicLight
|
||||||
bool DontShadowmap() const { return !!((*pLightFlags) & LF_NOSHADOWMAP); }
|
bool DontShadowmap() const { return !!((*pLightFlags) & LF_NOSHADOWMAP); }
|
||||||
bool DontLightSelf() const { return !!((*pLightFlags) & (LF_DONTLIGHTSELF|LF_DONTLIGHTACTORS)); } // dontlightactors implies dontlightself.
|
bool DontLightSelf() const { return !!((*pLightFlags) & (LF_DONTLIGHTSELF|LF_DONTLIGHTACTORS)); } // dontlightactors implies dontlightself.
|
||||||
bool DontLightActors() const { return !!((*pLightFlags) & LF_DONTLIGHTACTORS); }
|
bool DontLightActors() const { return !!((*pLightFlags) & LF_DONTLIGHTACTORS); }
|
||||||
|
bool DontLightOthers() const { return !!((*pLightFlags) & (LF_DONTLIGHTOTHERS)); }
|
||||||
|
bool DontLightMap() const { return !!((*pLightFlags) & (LF_DONTLIGHTMAP)); }
|
||||||
void Deactivate() { m_active = false; }
|
void Deactivate() { m_active = false; }
|
||||||
void Activate();
|
void Activate();
|
||||||
|
|
||||||
|
|
|
@ -143,6 +143,8 @@ static const char *LightTags[]=
|
||||||
"dontlightactors",
|
"dontlightactors",
|
||||||
"spot",
|
"spot",
|
||||||
"noshadowmap",
|
"noshadowmap",
|
||||||
|
"dontlightothers",
|
||||||
|
"dontlightmap",
|
||||||
nullptr
|
nullptr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -167,6 +169,8 @@ enum {
|
||||||
LIGHTTAG_DONTLIGHTACTORS,
|
LIGHTTAG_DONTLIGHTACTORS,
|
||||||
LIGHTTAG_SPOT,
|
LIGHTTAG_SPOT,
|
||||||
LIGHTTAG_NOSHADOWMAP,
|
LIGHTTAG_NOSHADOWMAP,
|
||||||
|
LIGHTTAG_DONTLIGHTOTHERS,
|
||||||
|
LIGHTTAG_DONTLIGHTMAP,
|
||||||
};
|
};
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -467,6 +471,12 @@ class GLDefsParser
|
||||||
case LIGHTTAG_DONTLIGHTACTORS:
|
case LIGHTTAG_DONTLIGHTACTORS:
|
||||||
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
||||||
break;
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTOTHERS:
|
||||||
|
defaults->SetDontLightOthers(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTMAP:
|
||||||
|
defaults->SetDontLightMap(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
case LIGHTTAG_SPOT:
|
case LIGHTTAG_SPOT:
|
||||||
{
|
{
|
||||||
float innerAngle = ParseFloat(sc);
|
float innerAngle = ParseFloat(sc);
|
||||||
|
@ -563,6 +573,12 @@ class GLDefsParser
|
||||||
case LIGHTTAG_DONTLIGHTACTORS:
|
case LIGHTTAG_DONTLIGHTACTORS:
|
||||||
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
||||||
break;
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTOTHERS:
|
||||||
|
defaults->SetDontLightOthers(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTMAP:
|
||||||
|
defaults->SetDontLightMap(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
case LIGHTTAG_SPOT:
|
case LIGHTTAG_SPOT:
|
||||||
{
|
{
|
||||||
float innerAngle = ParseFloat(sc);
|
float innerAngle = ParseFloat(sc);
|
||||||
|
@ -662,6 +678,12 @@ class GLDefsParser
|
||||||
case LIGHTTAG_DONTLIGHTACTORS:
|
case LIGHTTAG_DONTLIGHTACTORS:
|
||||||
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
||||||
break;
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTOTHERS:
|
||||||
|
defaults->SetDontLightOthers(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTMAP:
|
||||||
|
defaults->SetDontLightMap(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
case LIGHTTAG_SPOT:
|
case LIGHTTAG_SPOT:
|
||||||
{
|
{
|
||||||
float innerAngle = ParseFloat(sc);
|
float innerAngle = ParseFloat(sc);
|
||||||
|
@ -760,6 +782,12 @@ class GLDefsParser
|
||||||
case LIGHTTAG_DONTLIGHTACTORS:
|
case LIGHTTAG_DONTLIGHTACTORS:
|
||||||
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
||||||
break;
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTOTHERS:
|
||||||
|
defaults->SetDontLightOthers(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTMAP:
|
||||||
|
defaults->SetDontLightMap(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
case LIGHTTAG_SPOT:
|
case LIGHTTAG_SPOT:
|
||||||
{
|
{
|
||||||
float innerAngle = ParseFloat(sc);
|
float innerAngle = ParseFloat(sc);
|
||||||
|
@ -855,6 +883,12 @@ class GLDefsParser
|
||||||
case LIGHTTAG_DONTLIGHTACTORS:
|
case LIGHTTAG_DONTLIGHTACTORS:
|
||||||
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
defaults->SetDontLightActors(ParseInt(sc) != 0);
|
||||||
break;
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTOTHERS:
|
||||||
|
defaults->SetDontLightOthers(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
|
case LIGHTTAG_DONTLIGHTMAP:
|
||||||
|
defaults->SetDontLightMap(ParseInt(sc) != 0);
|
||||||
|
break;
|
||||||
case LIGHTTAG_SPOT:
|
case LIGHTTAG_SPOT:
|
||||||
{
|
{
|
||||||
float innerAngle = ParseFloat(sc);
|
float innerAngle = ParseFloat(sc);
|
||||||
|
|
|
@ -161,7 +161,7 @@ void HWFlat::SetupLights(HWDrawInfo *di, FLightNode * node, FDynLightData &light
|
||||||
{
|
{
|
||||||
FDynamicLight * light = node->lightsource;
|
FDynamicLight * light = node->lightsource;
|
||||||
|
|
||||||
if (!light->IsActive())
|
if (!light->IsActive() || light->DontLightMap())
|
||||||
{
|
{
|
||||||
node = node->nextLight;
|
node = node->nextLight;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -420,7 +420,7 @@ void HWWall::SetupLights(HWDrawInfo *di, FDynLightData &lightdata)
|
||||||
// Iterate through all dynamic lights which touch this wall and render them
|
// Iterate through all dynamic lights which touch this wall and render them
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
if (node->lightsource->IsActive())
|
if (node->lightsource->IsActive() && !node->lightsource->DontLightMap())
|
||||||
{
|
{
|
||||||
iter_dlight++;
|
iter_dlight++;
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@ class DynamicLight : Actor
|
||||||
flagdef noshadowmap: lightflags, 4;
|
flagdef noshadowmap: lightflags, 4;
|
||||||
flagdef dontlightactors: lightflags, 5;
|
flagdef dontlightactors: lightflags, 5;
|
||||||
flagdef spot: lightflags, 6;
|
flagdef spot: lightflags, 6;
|
||||||
|
flagdef dontlightothers: lightflags, 7;
|
||||||
|
flagdef dontlightmap: lightflags, 8;
|
||||||
|
|
||||||
enum EArgs
|
enum EArgs
|
||||||
{
|
{
|
||||||
|
@ -35,7 +37,9 @@ class DynamicLight : Actor
|
||||||
LF_ATTENUATE = 8,
|
LF_ATTENUATE = 8,
|
||||||
LF_NOSHADOWMAP = 16,
|
LF_NOSHADOWMAP = 16,
|
||||||
LF_DONTLIGHTACTORS = 32,
|
LF_DONTLIGHTACTORS = 32,
|
||||||
LF_SPOT = 64
|
LF_SPOT = 64,
|
||||||
|
LF_DONTLIGHTOTHERS = 128,
|
||||||
|
LF_DONTLIGHTMAP = 256,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ELightType
|
enum ELightType
|
||||||
|
|
Loading…
Reference in a new issue