light: change switchable shadows to only block style 0

The interactions with switchable/flickering lights were bad, previously
(a switched-off light would become "on" after passing through a switched
off shadow)
This commit is contained in:
Eric Wasylishen 2020-08-04 18:14:01 -06:00
parent a0e7f1eccb
commit 263f6301a6
1 changed files with 10 additions and 13 deletions

View File

@ -1396,11 +1396,10 @@ GetDirectLighting(const mbsp_t *bsp, const globalconfig_t &cfg, raystream_t *rs,
continue; continue;
} }
int lightstyle; int lightstyle = entity.style.intValue();
if (hit.passedSwitchableShadowStyle != 0) { if (lightstyle == 0) {
lightstyle = hit.passedSwitchableShadowStyle; // switchable shadow takes precedence over the light's style // switchable shadow only blocks style 0 lights, otherwise switchable lights become always on when shadow is hidden
} else { lightstyle = hit.passedSwitchableShadowStyle;
lightstyle = entity.style.intValue(); // use the style number from the light entity
} }
result[lightstyle] += vec3_t_to_glm(color); result[lightstyle] += vec3_t_to_glm(color);
@ -1434,11 +1433,9 @@ GetDirectLighting(const mbsp_t *bsp, const globalconfig_t &cfg, raystream_t *rs,
continue; continue;
} }
int lightstyle; int lightstyle = sun.style;
if (hit.passedSwitchableShadowStyle != 0) { if (lightstyle == 0) {
lightstyle = hit.passedSwitchableShadowStyle; // switchable shadow takes precedence over the light's style lightstyle = hit.passedSwitchableShadowStyle; // switchable shadow only blocks style 0 suns
} else {
lightstyle = sun.style;
} }
// check if we hit the wrong texture // check if we hit the wrong texture
@ -1542,9 +1539,9 @@ LightFace_Entity(const mbsp_t *bsp,
int i = rs->getPushedRayPointIndex(j); int i = rs->getPushedRayPointIndex(j);
// check if we hit a dynamic shadow caster // check if we hit a dynamic shadow caster (only applies to style 0 lights)
int desired_style = entity->style.intValue(); int desired_style = entity->style.intValue();
if (rs->getPushedRayDynamicStyle(j) != 0) { if (desired_style == 0) {
desired_style = rs->getPushedRayDynamicStyle(j); desired_style = rs->getPushedRayDynamicStyle(j);
} }
@ -1655,7 +1652,7 @@ LightFace_Sky(const sun_t *sun, const lightsurf_t *lightsurf, lightmapdict_t *li
// check if we hit a dynamic shadow caster // check if we hit a dynamic shadow caster
int desired_style = sun->style; int desired_style = sun->style;
if (rs->getPushedRayDynamicStyle(j) != 0) { if (desired_style == 0) {
desired_style = rs->getPushedRayDynamicStyle(j); desired_style = rs->getPushedRayDynamicStyle(j);
} }