diff --git a/light/entities.cc b/light/entities.cc index 67549939..e7712682 100644 --- a/light/entities.cc +++ b/light/entities.cc @@ -391,8 +391,10 @@ static void AddSun(const settings::worldspawn_keys &cfg, const qvec3d &sunvec, v sun.dirt = Dirt_ResolveFlag(cfg, dirtInt); sun.style = style; sun.suntexture = suntexture; - sun.suntexture_value = img::find(suntexture); - + if (!suntexture.empty()) + sun.suntexture_value = img::find(suntexture); + else + sun.suntexture_value = nullptr; // fmt::print( "sun is using vector {} {} {} light {} color {} {} {} anglescale {} dirt {} resolved to {}\n", // sun->sunvec[0], sun->sunvec[1], sun->sunvec[2], sun->sunlight.light, // sun->sunlight.color[0], sun->sunlight.color[1], sun->sunlight.color[2], diff --git a/testmaps/q1_sunlight.map b/testmaps/q1_sunlight.map new file mode 100644 index 00000000..07402e5f --- /dev/null +++ b/testmaps/q1_sunlight.map @@ -0,0 +1,69 @@ +// Game: Quake +// Format: Valve +// entity 0 +{ +"classname" "worldspawn" +"_sunlight" "100" +"_sun_mangle" "0 -80 0" +"wad" "deprecated/free_wad.wad" +"light" "5" +// brush 0 +{ +( -112 -96 -32 ) ( -112 -95 -32 ) ( -112 -96 -31 ) skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -32 -112 -32 ) ( -32 -112 -31 ) ( -31 -112 -32 ) skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -32 -96 -32 ) ( -31 -96 -32 ) ( -32 -95 -32 ) skip [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 96 32 0 ) ( 96 33 0 ) ( 97 32 0 ) sbrick2b [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 96 80 0 ) ( 97 80 0 ) ( 96 80 1 ) skip [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 128 32 0 ) ( 128 32 1 ) ( 128 33 0 ) skip [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 1 +{ +( -128 64 0 ) ( -128 65 0 ) ( -128 64 1 ) sky3 [ 0 1 0 0 ] [ 0 0 -1 -16 ] 0 1 1 +( 304 -128 -32 ) ( 303 -128 -32 ) ( 304 -128 -31 ) sky3 [ 1 0 0 0 ] [ 0 0 -1 -16 ] 0 1 1 +( 176 64 192 ) ( 176 65 192 ) ( 175 64 192 ) sky3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 176 64 208 ) ( 175 64 208 ) ( 176 65 208 ) sky3 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 176 96 0 ) ( 176 96 1 ) ( 175 96 0 ) sky3 [ 1 0 0 0 ] [ 0 0 -1 -16 ] 0 1 1 +( 144 -64 -32 ) ( 144 -64 -31 ) ( 144 -63 -32 ) sky3 [ 0 1 0 0 ] [ 0 0 -1 -16 ] 0 1 1 +} +// brush 2 +{ +( -112 -288 -32 ) ( -112 -287 -32 ) ( -112 -288 -31 ) sbrick2b [ 0 0 -1.0000000000000002 -48 ] [ 0 -1.0000000000000002 0 0 ] 0 1 1 +( -32 -128 -32 ) ( -32 -128 -31 ) ( -31 -128 -32 ) sbrick2b [ 1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 0 ] 0 1 1 +( 96 -160 0 ) ( 97 -160 0 ) ( 96 -159 0 ) sbrick2b [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 96 -160 192 ) ( 96 -159 192 ) ( 97 -160 192 ) sbrick2b [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 96 -112 0 ) ( 97 -112 0 ) ( 96 -112 1 ) sbrick2b [ 1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 48 ] 0 1 1 +( 128 -160 0 ) ( 128 -160 1 ) ( 128 -159 0 ) sbrick2b [ 0 0 1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 0 1 1 +} +// brush 3 +{ +( 128 64 0 ) ( 128 65 0 ) ( 128 64 1 ) sbrick2b [ 0 0 -1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 0 1 1 +( 304 -128 -32 ) ( 303 -128 -32 ) ( 304 -128 -31 ) sbrick2b [ 1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 0 ] 0 1 1 +( 176 64 0 ) ( 176 65 0 ) ( 175 64 0 ) sbrick2b [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 176 64 192 ) ( 175 64 192 ) ( 176 65 192 ) sbrick2b [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 176 96 0 ) ( 176 96 1 ) ( 175 96 0 ) sbrick2b [ 1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 +( 144 -64 -32 ) ( 144 -64 -31 ) ( 144 -63 -32 ) sbrick2b [ 0 0 1.0000000000000002 16 ] [ 0 -1.0000000000000002 0 0 ] 0 1 1 +} +// brush 4 +{ +( -112 -80 -32 ) ( -112 -79 -32 ) ( -112 -80 -31 ) sbrick2b [ 0 0 -1.0000000000000002 -48 ] [ 0 -1.0000000000000002 0 0 ] 0 1 1 +( -32 80 -32 ) ( -32 80 -31 ) ( -31 80 -32 ) sbrick2b [ 1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 -16 ] 0 1 1 +( 96 48 0 ) ( 97 48 0 ) ( 96 49 0 ) sbrick2b [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 96 48 192 ) ( 96 49 192 ) ( 97 48 192 ) sbrick2b [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 96 96 0 ) ( 97 96 0 ) ( 96 96 1 ) sbrick2b [ 1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 +( 128 48 0 ) ( 128 48 1 ) ( 128 49 0 ) sbrick2b [ 0 0 1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 0 1 1 +} +// brush 5 +{ +( -128 64 0 ) ( -128 65 0 ) ( -128 64 1 ) sbrick2b [ 0 0 -1.0000000000000002 0 ] [ 0 -1.0000000000000002 0 0 ] 0 1 1 +( 48 -128 -32 ) ( 47 -128 -32 ) ( 48 -128 -31 ) sbrick2b [ 1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 0 ] 0 1 1 +( -80 64 0 ) ( -80 65 0 ) ( -81 64 0 ) sbrick2b [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -80 64 192 ) ( -81 64 192 ) ( -80 65 192 ) sbrick2b [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -80 96 0 ) ( -80 96 1 ) ( -81 96 0 ) sbrick2b [ 1.0000000000000002 0 0 0 ] [ 0 0 -1.0000000000000002 -32 ] 0 1 1 +( -112 -64 -32 ) ( -112 -64 -31 ) ( -112 -63 -32 ) sbrick2b [ 0 0 1.0000000000000002 -48 ] [ 0 -1.0000000000000002 0 0 ] 0 1 1 +} +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "0 0 24" +} diff --git a/tests/test_ltface.cc b/tests/test_ltface.cc index f2985863..3d0214b5 100644 --- a/tests/test_ltface.cc +++ b/tests/test_ltface.cc @@ -793,3 +793,9 @@ TEST_CASE("minlight doesn't bounce") auto [bsp, bspx, lit] = QbspVisLight_Q1("q1_minlight_nobounce.map", {"-lit"}); CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {50, 50, 50}, {0, 0, 0}, {0, 0, 1}, &lit); } + +TEST_CASE("q1_sunlight") +{ + auto [bsp, bspx, lit] = QbspVisLight_Q1("q1_sunlight.map", {"-lit"}); + CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {42, 42, 42}, {0, 0, 0}, {0, 0, 1}, &lit); +}