diff --git a/light/light.cc b/light/light.cc index acd95a33..0563b8a0 100644 --- a/light/light.cc +++ b/light/light.cc @@ -185,8 +185,9 @@ worldspawn_keys::worldspawn_keys() : sunlight3_color{this, {"sunlight3_color", "sunlight_color3"}, 255.0, 255.0, 255.0, &worldspawn_group}, sunlight_dirt{this, "sunlight_dirt", 0.0, &worldspawn_group}, sunlight2_dirt{this, "sunlight2_dirt", 0.0, &worldspawn_group}, - sunvec{this, {"sunlight_mangle", "sun_mangle", "sun_angle"}, 0.0, -90.0, 0.0, &worldspawn_group}, - sun2vec{this, "sun2_mangle", 0.0, -90.0, 0.0, &worldspawn_group}, + // NOTE: the default mangle needs to be in direction vector form, not euler angle + sunvec{this, {"sunlight_mangle", "sun_mangle", "sun_angle"}, 0.0, 0.0, -1.0, &worldspawn_group}, + sun2vec{this, "sun2_mangle", 0.0, 0.0, -1.0, &worldspawn_group}, sun_deviance{this, "sunlight_penumbra", 0.0, 0.0, 180.0, &worldspawn_group}, sky_surface{ this, {"sky_surface", "sun_surface"}, 0, 0, 0, &worldspawn_group}, surflight_radiosity{this, "surflight_radiosity", SURFLIGHT_Q1, &worldspawn_group, "whether to use Q1-style surface subdivision (0) or Q2-style surface radiosity"} diff --git a/testmaps/q2_light_sunlight_default_mangle.map b/testmaps/q2_light_sunlight_default_mangle.map new file mode 100644 index 00000000..f9d240e4 --- /dev/null +++ b/testmaps/q2_light_sunlight_default_mangle.map @@ -0,0 +1,78 @@ +// Game: Quake 2 +// Format: Quake2 +// entity 0 +{ +"classname" "worldspawn" +"_tb_textures" "textures/e1u1" +"_bounce" "0" +"_sunlight" "100" +// brush 0 +{ +( 480 1088 928 ) ( 480 1089 928 ) ( 480 1088 929 ) e1u1/twall2_1 0 32 0 1 1 +( 704 1088 928 ) ( 704 1088 929 ) ( 705 1088 928 ) e1u1/twall2_1 0 32 0 1 1 +( 704 1088 928 ) ( 705 1088 928 ) ( 704 1089 928 ) e1u1/twall2_1 0 0 0 1 1 +( 944 1472 944 ) ( 944 1473 944 ) ( 945 1472 944 ) e1u1/twall2_1 0 0 0 1 1 +( 944 1488 944 ) ( 945 1488 944 ) ( 944 1488 945 ) e1u1/twall2_1 0 32 0 1 1 +( 1440 1472 944 ) ( 1440 1472 945 ) ( 1440 1473 944 ) e1u1/twall2_1 0 32 0 1 1 +} +// brush 1 +{ +( 480 1088 1248 ) ( 480 1089 1248 ) ( 480 1088 1249 ) e1u1/sky1 0 96 0 1 1 +( 704 1072 1248 ) ( 704 1072 1249 ) ( 705 1072 1248 ) e1u1/sky1 0 96 0 1 1 +( 704 1088 1248 ) ( 705 1088 1248 ) ( 704 1089 1248 ) e1u1/sky1 0 0 0 1 1 +( 944 1472 1264 ) ( 944 1473 1264 ) ( 945 1472 1264 ) e1u1/sky1 0 0 0 1 1 +( 944 1488 1264 ) ( 945 1488 1264 ) ( 944 1488 1265 ) e1u1/sky1 0 96 0 1 1 +( 1440 1472 1264 ) ( 1440 1472 1265 ) ( 1440 1473 1264 ) e1u1/sky1 0 96 0 1 1 +} +// brush 2 +{ +( 480 1072 928 ) ( 480 1073 928 ) ( 480 1072 929 ) e1u1/sky1 0 0 0 1 1 +( 704 1072 928 ) ( 704 1072 929 ) ( 705 1072 928 ) e1u1/sky1 0 0 0 1 1 +( 704 1072 928 ) ( 705 1072 928 ) ( 704 1073 928 ) e1u1/sky1 0 0 0 1 1 +( 944 1456 1248 ) ( 944 1457 1248 ) ( 945 1456 1248 ) e1u1/sky1 0 0 0 1 1 +( 944 1088 944 ) ( 945 1088 944 ) ( 944 1088 945 ) e1u1/sky1 0 0 0 1 1 +( 1456 1456 944 ) ( 1456 1456 945 ) ( 1456 1457 944 ) e1u1/sky1 0 0 0 1 1 +} +// brush 3 +{ +( 480 1392 928 ) ( 480 1393 928 ) ( 480 1392 929 ) e1u1/sky1 0 0 0 1 1 +( 832 1488 928 ) ( 832 1488 929 ) ( 833 1488 928 ) e1u1/sky1 0 0 0 1 1 +( 832 1392 928 ) ( 833 1392 928 ) ( 832 1393 928 ) e1u1/sky1 0 0 0 1 1 +( 1072 1776 1248 ) ( 1072 1777 1248 ) ( 1073 1776 1248 ) e1u1/sky1 0 0 0 1 1 +( 1072 1504 944 ) ( 1073 1504 944 ) ( 1072 1504 945 ) e1u1/sky1 0 0 0 1 1 +( 1440 1392 928 ) ( 1440 1392 929 ) ( 1440 1393 928 ) e1u1/sky1 0 0 0 1 1 +} +// brush 4 +{ +( 1440 1088 1056 ) ( 1440 1089 1056 ) ( 1440 1088 1057 ) e1u1/sky1 0 0 0 1 1 +( 1120 1088 1056 ) ( 1120 1088 1057 ) ( 1121 1088 1056 ) e1u1/sky1 0 0 0 1 1 +( 1120 1088 928 ) ( 1121 1088 928 ) ( 1120 1089 928 ) e1u1/sky1 0 0 0 1 1 +( 1360 1472 1248 ) ( 1360 1473 1248 ) ( 1361 1472 1248 ) e1u1/sky1 0 0 0 1 1 +( 1360 1488 1072 ) ( 1361 1488 1072 ) ( 1360 1488 1073 ) e1u1/sky1 0 0 0 1 1 +( 1456 1472 1072 ) ( 1456 1472 1073 ) ( 1456 1473 1072 ) e1u1/sky1 0 0 0 1 1 +} +// brush 5 +{ +( 464 1088 1056 ) ( 464 1089 1056 ) ( 464 1088 1057 ) e1u1/sky1 0 0 0 1 1 +( 144 1072 1056 ) ( 144 1072 1057 ) ( 145 1072 1056 ) e1u1/sky1 0 0 0 1 1 +( 144 1088 928 ) ( 145 1088 928 ) ( 144 1089 928 ) e1u1/sky1 0 0 0 1 1 +( 384 1472 1248 ) ( 384 1473 1248 ) ( 385 1472 1248 ) e1u1/sky1 0 0 0 1 1 +( 384 1488 1072 ) ( 385 1488 1072 ) ( 384 1488 1073 ) e1u1/sky1 0 0 0 1 1 +( 480 1472 1072 ) ( 480 1472 1073 ) ( 480 1473 1072 ) e1u1/sky1 0 0 0 1 1 +} +// brush 6 +{ +( 1088 1216 1072 ) ( 1088 1217 1072 ) ( 1088 1216 1073 ) e1u1/twall2_1 0 0 0 1 1 +( 1088 1224 1072 ) ( 1088 1224 1073 ) ( 1089 1224 1072 ) e1u1/twall2_1 0 0 0 1 1 +( 1088 1216 1080 ) ( 1089 1216 1080 ) ( 1088 1217 1080 ) e1u1/twall2_1 0 0 0 1 1 +( 1152 1280 1088 ) ( 1152 1281 1088 ) ( 1153 1280 1088 ) e1u1/twall2_1 0 0 0 1 1 +( 1152 1272 1088 ) ( 1153 1272 1088 ) ( 1152 1272 1089 ) e1u1/twall2_1 0 0 0 1 1 +( 1136 1280 1088 ) ( 1136 1280 1089 ) ( 1136 1281 1088 ) e1u1/twall2_1 0 0 0 1 1 +} +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "1232 1160 968" +"angle" "90" +} diff --git a/tests/test_ltface.cc b/tests/test_ltface.cc index bb0a6f96..f343ea44 100644 --- a/tests/test_ltface.cc +++ b/tests/test_ltface.cc @@ -531,3 +531,14 @@ TEST_CASE("q2_light_cone") { CheckSpotCutoff(bsp, {1092, 1472, 952}); CheckSpotCutoff(bsp, {1236, 1472, 952}); } + +TEST_CASE("q2_light_sunlight_default_mangle") { + auto [bsp, bspx] = QbspVisLight_Q2("q2_light_sunlight_default_mangle.map", {}); + + INFO("sunlight should be shining directly down if unspecified"); + const qvec3d shadow_pos {1112, 1248, 944}; + CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {0, 0, 0}, shadow_pos); + + CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {100, 100, 100}, shadow_pos + qvec3d{48, 0, 0}); + CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {100, 100, 100}, shadow_pos + qvec3d{-48, 0, 0}); +}