light_dynamic: Focus/optimise for the use of static rtlights. This _should_ provide a significant speedup.

This commit is contained in:
Marco Cawthorne 2022-06-17 10:11:17 -07:00
parent 9ef275a2ac
commit d633e80846
Signed by: eukara
GPG key ID: CE2032F0A2882A22

View file

@ -81,15 +81,17 @@ class light_dynamic:NSPointTrigger
string m_strPattern; string m_strPattern;
int m_iState; int m_iState;
int m_iStartActive; int m_iStartActive;
float m_light; /* our light handle */
void(void) light_dynamic; void(void) light_dynamic;
virtual void(string, string) SpawnKey; virtual void(string, string) SpawnKey;
virtual void(void) Spawned;
#ifdef CLIENT #ifdef CLIENT
virtual void(void) OnRemoveEntity;
virtual void(float,float) ReceiveEntity; virtual void(float,float) ReceiveEntity;
virtual float(void) predraw; virtual float(void) predraw;
virtual void(void) RendererRestarted; virtual void(void) RendererRestarted;
virtual void(float) LightChanged;
#else #else
virtual void(entity, int) Trigger; virtual void(entity, int) Trigger;
@ -101,6 +103,14 @@ class light_dynamic:NSPointTrigger
}; };
#ifdef CLIENT #ifdef CLIENT
void
light_dynamic::OnRemoveEntity(void)
{
/* this tells the engine to re-use this for a later light */
dynamiclight_set(m_light, LFIELD_RADIUS, 0);
m_light = 0;
}
float float
light_dynamic::predraw(void) light_dynamic::predraw(void)
{ {
@ -116,17 +126,47 @@ light_dynamic::predraw(void)
R_EndPolygon(); R_EndPolygon();
} }
if (!m_iState) { return (PREDRAW_NEXT);
return (PREDRAW_NEXT); }
void
light_dynamic::LightChanged(float flFlags)
{
/* apply our changes to the static light */
if (flFlags & DLIGHTFL_CHANGED_ORIGIN) {
dynamiclight_set(m_light, LFIELD_ORIGIN, origin);
}
if (flFlags & DLIGHTFL_CHANGED_ANGLES) {
dynamiclight_set(m_light, LFIELD_ANGLES, angles);
}
if (flFlags & DLIGHTFL_CHANGED_RADIUS) {
dynamiclight_set(m_light, LFIELD_RADIUS, m_flDistance);
} }
float p = dynamiclight_add(origin, m_flDistance, m_vecLight, m_flStyle); /* did our state change? */
dynamiclight_set(p, LFIELD_ANGLES, angles); if (flFlags & DLIGHTFL_CHANGED_STYLE) {
/* only need to bother checking for style if state didn't change */
dynamiclight_set(m_light, LFIELD_STYLE, m_flStyle);
}
if (flFlags & DLIGHTFL_CHANGED_LIGHT) {
dynamiclight_set(m_light, LFIELD_COLOUR, m_vecLight);
}
/* we always want to refresh the state */
if (!m_iState) {
/* black skips rendering */
dynamiclight_set(m_light, LFIELD_STYLE, 254);
} else {
dynamiclight_set(m_light, LFIELD_STYLE, m_flStyle);
}
/* light style pattern change */
if (flFlags & DLIGHTFL_CHANGED_PATTERN)
if (m_strPattern) if (m_strPattern)
dynamiclight_set(p, LFIELD_STYLESTRING, m_strPattern); dynamiclight_set(m_light, LFIELD_STYLESTRING, m_strPattern);
else
return (PREDRAW_NEXT); dynamiclight_set(m_light, LFIELD_STYLESTRING, "m");
} }
void void
@ -136,6 +176,7 @@ light_dynamic::ReceiveEntity(float flNew, float flFlags)
origin[0] = readcoord(); origin[0] = readcoord();
origin[1] = readcoord(); origin[1] = readcoord();
origin[2] = readcoord(); origin[2] = readcoord();
setsize(this, [0,0,0], [0,0,0]);
setorigin(this, origin); setorigin(this, origin);
} }
@ -168,21 +209,21 @@ light_dynamic::ReceiveEntity(float flNew, float flFlags)
if (flFlags & DLIGHTFL_CHANGED_PATTERN) if (flFlags & DLIGHTFL_CHANGED_PATTERN)
m_strPattern = readstring(); m_strPattern = readstring();
if (flNew) {
RendererRestarted();
} else {
LightChanged(flFlags);
}
classname = "light_dynamic"; classname = "light_dynamic";
} }
void void
light_dynamic::RendererRestarted(void) light_dynamic::RendererRestarted(void)
{ {
#if 1 OnRemoveEntity();
float p = dynamiclight_spawnstatic(origin, m_flDistance, m_vecLight / 255); m_light = dynamiclight_spawnstatic(origin, m_flDistance, m_vecLight);
dynamiclight_set(p, LFIELD_ANGLES, angles); LightChanged(0xFFFFFFFF);
if (m_flStyle)
dynamiclight_set(p, LFIELD_STYLE, m_flStyle);
if (m_strPattern)
dynamiclight_set(p, LFIELD_STYLESTRING, m_strPattern);
#endif
} }
#else #else
void void
@ -317,7 +358,7 @@ void
light_dynamic::Respawn(void) light_dynamic::Respawn(void)
{ {
SetSolid(SOLID_NOT); SetSolid(SOLID_NOT);
SetSize([-16,-16,-16], [16,16,16]); SetSize([-0,-0,-0], [0,0,0]);
SetOrigin(GetSpawnOrigin()); SetOrigin(GetSpawnOrigin());
SetAngles(GetSpawnAngles()); SetAngles(GetSpawnAngles());
m_iState = (m_iStartActive == 1) ? 1 : 0; m_iState = (m_iStartActive == 1) ? 1 : 0;
@ -362,33 +403,16 @@ light_dynamic::SpawnKey(string strKey, string strValue)
} }
} }
void
light_dynamic::Spawned(void)
{
super::Spawned();
#ifdef CLIENT
/* we're meant to be a server controlled entity. cancel out and kill us ASAP */
if (isCSQC == true && targetname) {
Destroy();
return;
}
#else
/* the client-side will handle dlights without targetnames */
if (!targetname) {
think = Util_Destroy;
nextthink = time + 0.1f;
}
#endif
}
void void
light_dynamic::light_dynamic(void) light_dynamic::light_dynamic(void)
{ {
m_vecLight = [255,255,255]; m_vecLight = [255,255,255];
m_flDistance = 256; m_flDistance = 256;
m_iStartActive = 1; m_iStartActive = 1;
#ifdef CLIENT
lightstyle(254, "=0");
#endif
} }
/* compatibility for q3map users, stay safe out there */ /* compatibility for q3map users, stay safe out there */
@ -404,7 +428,6 @@ light_dynamic_ReadEntity(float new)
spawnfunc_light_dynamic(); spawnfunc_light_dynamic();
} }
dl.isCSQC = false;
dl.ReceiveEntity(new, readfloat()); dl.ReceiveEntity(new, readfloat());
dl.drawmask = MASK_GLOWS; dl.drawmask = MASK_GLOWS;
} }