From fe1e040cd16faf4e3b070fd9ff35ed2a960f92f3 Mon Sep 17 00:00:00 2001 From: MaxED Date: Wed, 9 Aug 2017 13:52:10 +0300 Subject: [PATCH] Added "_falloff" light property. Allows to set light falloff in map units. --- include/light/entities.hh | 3 + light/entities.cc | 4 + light/ltface.cc | 19 +++++ man/light.1 | 8 ++ testmaps/falloff.map | 161 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 195 insertions(+) create mode 100644 testmaps/falloff.map diff --git a/include/light/entities.hh b/include/light/entities.hh index b92d0126..41e8f241 100644 --- a/include/light/entities.hh +++ b/include/light/entities.hh @@ -76,6 +76,7 @@ public: lockable_vec_t dirtscale, dirtgain, dirt, deviance, samples, projfov, bouncescale; lockable_vec_t dirt_off_radius, dirt_on_radius; lockable_vec_t sun; //mxd + lockable_vec_t falloff; //mxd lockable_bool_t bleed; lockable_vec3_t origin, color, mangle, projangle; lockable_string_t project_texture; @@ -113,6 +114,7 @@ public: dirt_off_radius { "dirt_off_radius", 0.0f }, dirt_on_radius { "dirt_on_radius", 0.0f }, sun { "sun", 0 }, //mxd + falloff{ "falloff", 0.0f }, //mxd bleed { "bleed", false }, origin { "origin", 0, 0, 0 }, color { "color", 255.0f, 255.0f, 255.0f, vec3_transformer_t::NORMALIZE_COLOR_TO_255 }, @@ -133,6 +135,7 @@ public: &dirtscale, &dirtgain, &dirt, &deviance, &samples, &projfov, &bouncescale, &dirt_off_radius, &dirt_on_radius, &sun, //mxd + &falloff, //mxd &origin, &color, &mangle, &projangle, &project_texture }}; } diff --git a/light/entities.cc b/light/entities.cc index d606aebe..8ef924ba 100644 --- a/light/entities.cc +++ b/light/entities.cc @@ -329,6 +329,10 @@ CheckEntityFields(const globalconfig_t &cfg, light_t *entity) if (entity->anglescale.floatValue() < 0 || entity->anglescale.floatValue() > 1.0) entity->anglescale.setFloatValue(cfg.global_anglescale.floatValue()); + //mxd. No negative falloffs pls. + if(entity->falloff.floatValue() < 0.0f) + entity->falloff.setFloatValue(0.0f); + if (entity->getFormula() < LF_LINEAR || entity->getFormula() >= LF_COUNT) { static qboolean warned_once = true; if (!warned_once) { diff --git a/light/ltface.cc b/light/ltface.cc index d6ec5a47..a4f0e632 100644 --- a/light/ltface.cc +++ b/light/ltface.cc @@ -865,10 +865,29 @@ GetLightValue(const globalconfig_t &cfg, const light_t *entity, vec_t dist) const float light = entity->light.floatValue(); vec_t value; + //mxd. Apply falloff? + const float lightdistance = entity->falloff.floatValue(); + if (lightdistance > 0.0f) { + if (entity->getFormula() != LF_LINEAR) { + logprint("WARNING: _falloff is currently only supported on linear (delay 0): light at (%f %f %f)\n", + (*entity->origin.vec3Value())[0], + (*entity->origin.vec3Value())[1], + (*entity->origin.vec3Value())[2]); + // ignore _falloff key + } else { + // Light can affect surface? + if (lightdistance > dist) + return light * (1.0f - (dist / lightdistance)); + else + return 0.0f; // Surface is unaffected + } + } + if (entity->getFormula() == LF_INFINITE || entity->getFormula() == LF_LOCALMIN) return light; value = cfg.scaledist.floatValue() * entity->atten.floatValue() * dist; + switch (entity->getFormula()) { case LF_INVERSE: return light / (value / LF_SCALE); diff --git a/man/light.1 b/man/light.1 index 1d906127..ca862035 100644 --- a/man/light.1 +++ b/man/light.1 @@ -296,6 +296,14 @@ Select an attenuation formaula for the light: near the source. .fi +.IP "\fB""_falloff"" ""n""\fP" +Sets the distance at which the light drops to 0, in map units. + +In this mode, "wait" is ignored and "light" only controls the brightness at the center +of the light, and no longer affects the falloff distance. + +Only supported on linear attenuation (delay 0) lights currently. + .IP "\fB""_color"" ""r g b""\fP" Specify red(r), green(g) and blue(b) components for the colour of the light. RGB component values are between 0 and 255 (between 0 and 1 is also diff --git a/testmaps/falloff.map b/testmaps/falloff.map new file mode 100644 index 00000000..389aa6ab --- /dev/null +++ b/testmaps/falloff.map @@ -0,0 +1,161 @@ +// Game: Quake +// Format: Standard +// entity 0 +{ +"classname" "worldspawn" +"wad" "free_wad.wad" +"_sunlight" "100" +"_sun_mangle" "0 -45 0" +// brush 0 +{ +( -192 128 240 ) ( -192 129 240 ) ( -192 128 241 ) brownwirewall -0 64 -0 1 1 +( 896 256 272 ) ( 896 256 273 ) ( 896 257 272 ) brownwirewall -0 64 -0 1 1 +( -64 -192 240 ) ( -64 -192 241 ) ( -63 -192 240 ) brownwirewall -0 64 -0 1 1 +( 64 992 272 ) ( 65 992 272 ) ( 64 992 273 ) brownwirewall -0 64 -0 1 1 +( 64 256 288 ) ( 64 257 288 ) ( 65 256 288 ) brownwirewall -0 64 -0 1 1 +( -64 128 240 ) ( -63 128 240 ) ( -64 129 240 ) brownwirewall -0 64 -0 1 1 +} +// brush 1 +{ +( -192 96 208 ) ( -192 97 208 ) ( -192 96 209 ) brownwirewall -0 64 -0 1 1 +( -160 224 240 ) ( -160 224 241 ) ( -160 225 240 ) brownwirewall -0 64 -0 1 1 +( -64 -160 208 ) ( -64 -160 209 ) ( -63 -160 208 ) brownwirewall -0 64 -0 1 1 +( 64 960 240 ) ( 65 960 240 ) ( 64 960 241 ) brownwirewall -0 64 -0 1 1 +( 64 224 240 ) ( 64 225 240 ) ( 65 224 240 ) brownwirewall -0 64 -0 1 1 +( -64 96 -480 ) ( -63 96 -480 ) ( -64 97 -480 ) brownwirewall -0 64 -0 1 1 +} +// brush 2 +{ +( -192 128 208 ) ( -192 129 208 ) ( -192 128 209 ) brownwirewall -0 64 -0 1 1 +( 896 256 240 ) ( 896 256 241 ) ( 896 257 240 ) brownwirewall -0 64 -0 1 1 +( -64 960 208 ) ( -64 960 209 ) ( -63 960 208 ) brownwirewall -0 64 -0 1 1 +( 64 992 240 ) ( 65 992 240 ) ( 64 992 241 ) brownwirewall -0 64 -0 1 1 +( 64 256 240 ) ( 64 257 240 ) ( 65 256 240 ) brownwirewall -0 64 -0 1 1 +( -64 128 -480 ) ( -63 128 -480 ) ( -64 129 -480 ) brownwirewall -0 64 -0 1 1 +} +// brush 3 +{ +( -192 128 208 ) ( -192 129 208 ) ( -192 128 209 ) brownwirewall -0 64 -0 1 1 +( 896 256 240 ) ( 896 256 241 ) ( 896 257 240 ) brownwirewall -0 64 -0 1 1 +( -64 -192 208 ) ( -64 -192 209 ) ( -63 -192 208 ) brownwirewall -0 64 -0 1 1 +( 64 -160 240 ) ( 65 -160 240 ) ( 64 -160 241 ) brownwirewall -0 64 -0 1 1 +( 64 256 240 ) ( 64 257 240 ) ( 65 256 240 ) brownwirewall -0 64 -0 1 1 +( -64 128 -480 ) ( -63 128 -480 ) ( -64 129 -480 ) brownwirewall -0 64 -0 1 1 +} +// brush 4 +{ +( 864 96 208 ) ( 864 97 208 ) ( 864 96 209 ) brownwirewall -0 64 -0 1 1 +( 896 224 240 ) ( 896 224 241 ) ( 896 225 240 ) brownwirewall -0 64 -0 1 1 +( 992 -160 208 ) ( 992 -160 209 ) ( 993 -160 208 ) brownwirewall -0 64 -0 1 1 +( 1120 960 240 ) ( 1121 960 240 ) ( 1120 960 241 ) brownwirewall -0 64 -0 1 1 +( 1120 224 240 ) ( 1120 225 240 ) ( 1121 224 240 ) brownwirewall -0 64 -0 1 1 +( 992 96 -480 ) ( 993 96 -480 ) ( 992 97 -480 ) brownwirewall -0 64 -0 1 1 +} +// brush 5 +{ +( -192 128 -528 ) ( -192 129 -528 ) ( -192 128 -527 ) brownwirewall -192 -0 -0 1 1 +( 896 256 -496 ) ( 896 256 -495 ) ( 896 257 -496 ) brownwirewall -192 -0 -0 1 1 +( -64 -192 -528 ) ( -64 -192 -527 ) ( -63 -192 -528 ) brownwirewall -0 -0 -0 1 1 +( 64 992 -496 ) ( 65 992 -496 ) ( 64 992 -495 ) brownwirewall -0 -0 -0 1 1 +( 64 256 -480 ) ( 64 257 -480 ) ( 65 256 -480 ) brownwirewall -0 64 -0 1 1 +( -64 128 -528 ) ( -63 128 -528 ) ( -64 129 -528 ) brownwirewall -0 64 -0 1 1 +} +// brush 6 +{ +( 792 696 -480 ) ( 856 696 -448 ) ( 856 696 -480 ) brownwirewall -88 -0 -0 1 1 +( 728 576 -480 ) ( 728 704 -448 ) ( 728 576 -448 ) brownwirewall -0 -0 -0 1 1 +( 792 576 -480 ) ( 856 704 -480 ) ( 792 704 -480 ) brownwirewall -88 -0 -0 1 1 +( 792 576 -320 ) ( 856 704 -320 ) ( 856 576 -320 ) brownwirewall -88 -0 -0 1 1 +( 792 704 -480 ) ( 856 704 -448 ) ( 792 704 -448 ) brownwirewall -88 -0 -0 1 1 +( 856 576 -480 ) ( 856 704 -448 ) ( 856 704 -480 ) brownwirewall -0 -0 -0 1 1 +} +// brush 7 +{ +( 792 440 -480 ) ( 856 440 -448 ) ( 856 440 -480 ) brownwirewall -88 -0 -0 1 1 +( 728 320 -480 ) ( 728 448 -448 ) ( 728 320 -448 ) brownwirewall -0 -0 -0 1 1 +( 792 320 -480 ) ( 856 448 -480 ) ( 792 448 -480 ) brownwirewall -88 -0 -0 1 1 +( 792 320 -320 ) ( 856 448 -320 ) ( 856 320 -320 ) brownwirewall -88 -0 -0 1 1 +( 792 448 -480 ) ( 856 448 -448 ) ( 792 448 -448 ) brownwirewall -88 -0 -0 1 1 +( 856 320 -480 ) ( 856 448 -448 ) ( 856 448 -480 ) brownwirewall -0 -0 -0 1 1 +} +// brush 8 +{ +( 792 184 -480 ) ( 856 184 -448 ) ( 856 184 -480 ) brownwirewall -88 -0 -0 1 1 +( 728 64 -480 ) ( 728 192 -448 ) ( 728 64 -448 ) brownwirewall -0 -0 -0 1 1 +( 792 64 -480 ) ( 856 192 -480 ) ( 792 192 -480 ) brownwirewall -88 -0 -0 1 1 +( 792 64 -320 ) ( 856 192 -320 ) ( 856 64 -320 ) brownwirewall -88 -0 -0 1 1 +( 792 192 -480 ) ( 856 192 -448 ) ( 792 192 -448 ) brownwirewall -88 -0 -0 1 1 +( 856 64 -480 ) ( 856 192 -448 ) ( 856 192 -480 ) brownwirewall -0 -0 -0 1 1 +} +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "144 560 -456" +"angle" "-0" +} +// entity 2 +{ +"classname" "light" +"origin" "792 832 -472" +"angle" "-0" +"_falloff" "128" +} +// entity 3 +{ +"classname" "light" +"origin" "792 576 -472" +"angle" "-0" +"_falloff" "128" +"light" "50" +} +// entity 4 +{ +"classname" "light" +"origin" "792 320 -472" +"angle" "-0" +"_falloff" "128" +"light" "1000" +} +// entity 5 +{ +"classname" "trigger_multiple" +"message" "falloff 128, default light" +// brush 0 +{ +( 704 736 -480 ) ( 736 736 -448 ) ( 736 736 -480 ) trigger 0 0 0 1 1 +( 704 736 -480 ) ( 704 928 -448 ) ( 704 736 -448 ) trigger 0 0 0 1 1 +( 704 736 -480 ) ( 736 928 -480 ) ( 704 928 -480 ) trigger 0 0 0 1 1 +( 704 736 -448 ) ( 736 928 -448 ) ( 736 736 -448 ) trigger 0 0 0 1 1 +( 704 928 -480 ) ( 736 928 -448 ) ( 704 928 -448 ) trigger 0 0 0 1 1 +( 736 736 -480 ) ( 736 928 -448 ) ( 736 928 -480 ) trigger 0 0 0 1 1 +} +} +// entity 6 +{ +"classname" "trigger_multiple" +"message" "falloff 128, light 50" +// brush 0 +{ +( 704 480 -480 ) ( 736 480 -448 ) ( 736 480 -480 ) trigger -0 -0 -0 1 1 +( 704 480 -480 ) ( 704 672 -448 ) ( 704 480 -448 ) trigger -0 -0 -0 1 1 +( 704 480 -480 ) ( 736 672 -480 ) ( 704 672 -480 ) trigger -0 -0 -0 1 1 +( 704 480 -448 ) ( 736 672 -448 ) ( 736 480 -448 ) trigger -0 -0 -0 1 1 +( 704 672 -480 ) ( 736 672 -448 ) ( 704 672 -448 ) trigger -0 -0 -0 1 1 +( 736 480 -480 ) ( 736 672 -448 ) ( 736 672 -480 ) trigger -0 -0 -0 1 1 +} +} +// entity 7 +{ +"classname" "trigger_multiple" +"message" "falloff 128, light 1000" +// brush 0 +{ +( 704 224 -480 ) ( 736 224 -448 ) ( 736 224 -480 ) trigger -0 -0 -0 1 1 +( 704 224 -480 ) ( 704 416 -448 ) ( 704 224 -448 ) trigger -0 -0 -0 1 1 +( 704 224 -480 ) ( 736 416 -480 ) ( 704 416 -480 ) trigger -0 -0 -0 1 1 +( 704 224 -448 ) ( 736 416 -448 ) ( 736 224 -448 ) trigger -0 -0 -0 1 1 +( 704 416 -480 ) ( 736 416 -448 ) ( 704 416 -448 ) trigger -0 -0 -0 1 1 +( 736 224 -480 ) ( 736 416 -448 ) ( 736 416 -480 ) trigger -0 -0 -0 1 1 +} +}