light: use the minlight codepath for self-illumination of emissive surfs. wip

This commit is contained in:
Eric Wasylishen 2023-06-27 01:14:35 -06:00
parent 5616fd97f4
commit feeaae6a09
4 changed files with 161 additions and 4 deletions

View File

@ -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

View File

@ -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);
}
}
}

View File

@ -34,6 +34,7 @@ See file, 'COPYING', for details.
#include <vector>
#include <map>
#include <mutex>
#include <tuple>
#include <common/qvec.hh>
@ -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 = {};

View File

@ -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"
}