diff --git a/include/light/surflight.hh b/include/light/surflight.hh index d104ac5f..0ccd9e8b 100644 --- a/include/light/surflight.hh +++ b/include/light/surflight.hh @@ -64,6 +64,8 @@ struct surfacelight_t float intensity = 0; // Surface light strength for each point float totalintensity = 0; // Total surface light strength qvec3d color; // Surface color + + bool operator==(const per_style_t &other) const; }; // Light data per style diff --git a/light/ltface.cc b/light/ltface.cc index 1556b1de..6b636d36 100644 --- a/light/ltface.cc +++ b/light/ltface.cc @@ -1650,7 +1650,7 @@ static float Mottle(const qvec3d &position) * ============ */ static void LightFace_Min(const mbsp_t *bsp, const mface_t *face, const qvec3d &color, vec_t light, - lightsurf_t *lightsurf, lightmapdict_t *lightmaps, int32_t style) + lightsurf_t *lightsurf, lightmapdict_t *lightmaps, int32_t style, bool nomottle) { const settings::worldspawn_keys &cfg = *lightsurf->cfg; @@ -1675,7 +1675,7 @@ static void LightFace_Min(const mbsp_t *bsp, const mface_t *face, const qvec3d & sample.color += color * (value / 255.0); hit = true; } else { - if (lightsurf->minlightMottle) { + if (lightsurf->minlightMottle && !nomottle) { value += Mottle(surf_sample.point); } hit = Light_ClampMin(sample, value, color) || hit; @@ -1999,6 +1999,17 @@ LightFace_SurfaceLight(const mbsp_t *bsp, lightsurf_t *lightsurf, lightmapdict_t auto &vpl = *surf_ptr->vpl.get(); + // don't emit onto ourself + if (surf_ptr.get() == lightsurf) + continue; + + // if we are emissive, don't emit from other faces with matching emissive settings + if (auto &our_vpl_ptr = lightsurf->vpl) { + if (our_vpl_ptr->styles == vpl.styles) { + continue; + } + } + for (const auto &vpl_setting : surf_ptr->vpl->styles) { if (vpl_setting.bounce != bounce) @@ -3432,7 +3443,7 @@ void PostProcessLightFace(const mbsp_t *bsp, lightsurf_t &lightsurf, const setti } if (minlight) { - LightFace_Min(bsp, face, minlight_color, minlight, &lightsurf, lightmaps, 0); + LightFace_Min(bsp, face, minlight_color, minlight, &lightsurf, lightmaps, 0, false); } if (lightsurf.vpl) { @@ -3445,7 +3456,7 @@ void PostProcessLightFace(const mbsp_t *bsp, lightsurf_t &lightsurf, const setti minlight = std::get<0>(value.value()) * surface_minlight_scale; minlight_color = std::get<2>(value.value()); LightFace_Min( - bsp, face, minlight_color, minlight, &lightsurf, lightmaps, std::get<1>(value.value())); + bsp, face, minlight_color, minlight, &lightsurf, lightmaps, std::get<1>(value.value()), true); } } } diff --git a/light/surflight.cc b/light/surflight.cc index 65a19b64..1ae03566 100644 --- a/light/surflight.cc +++ b/light/surflight.cc @@ -34,6 +34,7 @@ See file, 'COPYING', for details. #include #include #include +#include #include @@ -42,6 +43,17 @@ using namespace polylib; static std::atomic_size_t total_surflight_points; +static auto as_tuple(const surfacelight_t::per_style_t &s) +{ + return std::make_tuple( + s.bounce, s.omnidirectional, s.rescale, s.style, /* s.intensity, s.totalintensity,*/ s.color); +} + +bool surfacelight_t::per_style_t::operator==(const per_style_t &other) const +{ + return as_tuple(*this) == as_tuple(other); +} + void ResetSurflight() { total_surflight_points = {}; diff --git a/testmaps/q2_light_selflight.map b/testmaps/q2_light_selflight.map new file mode 100644 index 00000000..e7b3f651 --- /dev/null +++ b/testmaps/q2_light_selflight.map @@ -0,0 +1,132 @@ +// Game: Quake 2 +// Format: Quake2 (Valve) +// entity 0 +{ +"mapversion" "220" +"classname" "worldspawn" +"_tb_textures" "textures/e1u1" +"_bounce" "0" +// brush 0 +{ +( -160 -256 16 ) ( -160 -255 16 ) ( -160 -256 17 ) e1u1/skip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 64 32 ) ( 240 64 32 ) ( 240 64 160 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -256 16 ) ( 81 -256 16 ) ( 80 -255 16 ) e1u1/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 496 -32 32 ) ( 496 -31 32 ) ( 497 -32 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 1.0000000000000002 0 0 ] 0 1 1 +( 496 176 32 ) ( 497 176 32 ) ( 496 176 33 ) e1u1/skip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 496 -32 32 ) ( 496 -32 33 ) ( 496 -31 32 ) e1u1/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 1 +{ +( 288 -256 16 ) ( 288 -255 16 ) ( 288 -256 17 ) e1u1/skip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -32 16 ) ( 80 -32 17 ) ( 81 -32 16 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -256 16 ) ( 81 -256 16 ) ( 80 -255 16 ) e1u1/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 496 -32 32 ) ( 496 -31 32 ) ( 497 -32 32 ) e1u1/baselt_5 [ 1.0000000000000002 0 0 0 ] [ 0 1.0000000000000002 0 32 ] 0 1 1 0 1 100 +( 288 64 32 ) ( 240 64 160 ) ( 240 64 32 ) e1u1/skip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 320 -32 32 ) ( 320 -32 33 ) ( 320 -31 32 ) e1u1/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 2 +{ +( 256 0 32 ) ( 256 -48 160 ) ( 256 -48 32 ) e1u1/skip [ -6.123233995736766e-17 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 512 0 16 ) ( 511 0 16 ) ( 512 0 17 ) e1u1/skip [ 1 -6.123233995736766e-17 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 512 -208 16 ) ( 512 -207 16 ) ( 511 -208 16 ) e1u1/skip [ -6.123233995736766e-17 -1 0 0 ] [ 1 -6.123233995736766e-17 0 0 ] 90 1 1 +( 288 208 32 ) ( 287 208 32 ) ( 288 209 32 ) e1u1/baselt_5 [ 1.0000000000000002 0 0 0 ] [ 0 1.0000000000000002 0 32 ] 0 1 1 0 1 100 +( 288 32 32 ) ( 288 32 33 ) ( 287 32 32 ) e1u1/skip [ -1 6.123233995736766e-17 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 -208 16 ) ( 288 -208 17 ) ( 288 -207 16 ) e1u1/skip [ 6.123233995736766e-17 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 3 +{ +( 320 -32 32 ) ( 320 -31 32 ) ( 320 -32 33 ) e1u1/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 32 32 ) ( 240 32 32 ) ( 240 32 160 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -256 16 ) ( 81 -256 16 ) ( 80 -255 16 ) e1u1/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 496 -32 32 ) ( 496 -31 32 ) ( 497 -32 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 1.0000000000000002 0 0 ] 0 1 1 +( 288 64 32 ) ( 240 64 160 ) ( 240 64 32 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 496 -32 32 ) ( 496 -32 33 ) ( 496 -31 32 ) e1u1/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 4 +{ +( 320 -32 32 ) ( 320 -31 32 ) ( 320 -32 33 ) e1u1/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 -32 32 ) ( 240 -32 32 ) ( 240 -32 160 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -256 16 ) ( 81 -256 16 ) ( 80 -255 16 ) e1u1/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 496 -32 32 ) ( 496 -31 32 ) ( 497 -32 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 1.0000000000000002 0 0 ] 0 1 1 +( 288 32 32 ) ( 240 32 160 ) ( 240 32 32 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 496 -32 32 ) ( 496 -32 33 ) ( 496 -31 32 ) e1u1/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 5 +{ +( -160 -256 16 ) ( -160 -255 16 ) ( -160 -256 17 ) e1u1/skip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 32 32 ) ( 240 32 32 ) ( 240 32 160 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -256 16 ) ( 81 -256 16 ) ( 80 -255 16 ) e1u1/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 496 -32 32 ) ( 496 -31 32 ) ( 497 -32 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 1.0000000000000002 0 0 ] 0 1 1 +( 288 64 32 ) ( 240 64 160 ) ( 240 64 32 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 -32 32 ) ( 288 -32 33 ) ( 288 -31 32 ) e1u1/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 6 +{ +( -160 -256 16 ) ( -160 -255 16 ) ( -160 -256 17 ) e1u1/skip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 0 32 ) ( 240 0 32 ) ( 240 0 160 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -256 16 ) ( 81 -256 16 ) ( 80 -255 16 ) e1u1/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 496 -32 32 ) ( 496 -31 32 ) ( 497 -32 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 1.0000000000000002 0 0 ] 0 1 1 +( 288 32 32 ) ( 240 32 160 ) ( 240 32 32 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 256 -32 32 ) ( 256 -32 33 ) ( 256 -31 32 ) e1u1/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 7 +{ +( -160 -320 16 ) ( -160 -319 16 ) ( -160 -320 17 ) e1u1/skip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 -32 32 ) ( 240 -32 32 ) ( 240 -32 160 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -320 16 ) ( 81 -320 16 ) ( 80 -319 16 ) e1u1/skip [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 496 -96 32 ) ( 496 -95 32 ) ( 497 -96 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 1.0000000000000002 0 0 ] 0 1 1 +( 288 0 32 ) ( 240 0 160 ) ( 240 0 32 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 288 -96 32 ) ( 288 -96 33 ) ( 288 -95 32 ) e1u1/skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 8 +{ +( -160 -464 16 ) ( -160 -463 16 ) ( -160 -464 17 ) e1u1/skip [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 1 1 +( 288 -144 32 ) ( 240 -144 32 ) ( 240 -144 160 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -464 16 ) ( 81 -464 16 ) ( 80 -463 16 ) e1u1/skip [ -1 0 0 0 ] [ 0 -1 0 16 ] 0 1 1 +( 496 -240 32 ) ( 496 -239 32 ) ( 497 -240 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 1.0000000000000002 0 16 ] 0 1 1 +( 496 -32 32 ) ( 497 -32 32 ) ( 496 -32 33 ) e1u1/skip [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 496 -240 32 ) ( 496 -240 33 ) ( 496 -239 32 ) e1u1/skip [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 9 +{ +( -160 -176 32 ) ( -160 -224 160 ) ( -160 -224 32 ) e1u1/skip [ -6.123233995736766e-17 -1 0 16 ] [ 0 0 -1 0 ] 0 1 1 +( 160 -272 16 ) ( 159 -272 16 ) ( 160 -272 17 ) e1u1/skip [ 1 -6.123233995736766e-17 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 160 -384 16 ) ( 160 -383 16 ) ( 159 -384 16 ) e1u1/skip [ -6.123233995736766e-17 -1 0 16 ] [ 1 -6.123233995736766e-17 0 0 ] 90 1 1 +( -64 32 32 ) ( -65 32 32 ) ( -64 33 32 ) e1u1/baselt_5 [ 6.123233995736767e-17 1.0000000000000002 0 -16 ] [ -1.0000000000000002 6.123233995736767e-17 0 -64 ] 270 1 1 0 1 150 +( -64 -144 32 ) ( -64 -144 33 ) ( -65 -144 32 ) e1u1/skip [ -1 6.123233995736766e-17 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 48 -384 16 ) ( 48 -384 17 ) ( 48 -383 16 ) e1u1/skip [ 6.123233995736766e-17 1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 10 +{ +( 48 -464 16 ) ( 48 -463 16 ) ( 48 -464 17 ) e1u1/skip [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 1 1 +( 288 -272 32 ) ( 240 -272 32 ) ( 240 -272 160 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 80 -464 16 ) ( 81 -464 16 ) ( 80 -463 16 ) e1u1/skip [ 0 1.0000000000000002 0 -16 ] [ 1.0000000000000002 0 0 0 ] 0 1 1 +( 496 -240 32 ) ( 496 -239 32 ) ( 497 -240 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 1.0000000000000002 0 16 ] 0 1 1 +( 288 -144 32 ) ( 240 -144 160 ) ( 240 -144 32 ) e1u1/skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 480 -240 32 ) ( 480 -240 33 ) ( 480 -239 32 ) e1u1/skip [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 11 +{ +( 480 -176 32 ) ( 480 -224 160 ) ( 480 -224 32 ) e1u1/color1_6 [ 0 0 1.0000000000000002 16 ] [ 0 1.0000000000000002 0 16 ] 0 1 1 +( 384 -256 32 ) ( 383 -256 32 ) ( 384 -256 33 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 0 1.0000000000000002 -16 ] 0 1 1 +( 608 -384 16 ) ( 608 -383 16 ) ( 607 -384 16 ) e1u1/skip [ 0 1.0000000000000002 0 -16 ] [ 1.0000000000000002 0 0 0 ] 0 1 1 +( 384 32 32 ) ( 383 32 32 ) ( 384 33 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 1.0000000000000002 0 16 ] 0 1 1 +( 384 -144 32 ) ( 384 -144 33 ) ( 383 -144 32 ) e1u1/color1_6 [ 1.0000000000000002 0 0 -48 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 +( 496 -384 16 ) ( 496 -384 17 ) ( 496 -383 16 ) e1u1/skip [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 12 +{ +( 480 -176 32 ) ( 480 -224 160 ) ( 480 -224 32 ) e1u1/skip [ -6.123233995736766e-17 -1 0 16 ] [ 0 0 -1 0 ] 0 1 1 +( 608 -272 16 ) ( 607 -272 16 ) ( 608 -272 17 ) e1u1/skip [ 1 -6.123233995736766e-17 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 608 -384 16 ) ( 608 -383 16 ) ( 607 -384 16 ) e1u1/skip [ -6.123233995736766e-17 -1 0 16 ] [ 1 -6.123233995736766e-17 0 0 ] 90 1 1 +( 384 32 32 ) ( 383 32 32 ) ( 384 33 32 ) e1u1/baselt_5 [ 6.123233995736767e-17 1.0000000000000002 0 -16 ] [ -1.0000000000000002 6.123233995736767e-17 0 0 ] 270 1 1 0 1 150 +( 384 -256 32 ) ( 384 -256 33 ) ( 383 -256 32 ) e1u1/skip [ -1 6.123233995736766e-17 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 496 -384 16 ) ( 496 -384 17 ) ( 496 -383 16 ) e1u1/skip [ 6.123233995736766e-17 1 0 -16 ] [ 0 0 -1 0 ] 0 1 1 +} +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "288 144 56" +"angle" "270" +}