diff --git a/testmaps/q2_light_group.map b/testmaps/q2_light_group.map index 195c56c5..ed5101c7 100644 --- a/testmaps/q2_light_group.map +++ b/testmaps/q2_light_group.map @@ -79,11 +79,12 @@ } // entity 2 { -"classname" "light" +"classname" "light_mine2" "origin" "680 1176 1000" "light" "300" "_light_channel_mask" "2" "_shadow_channel_mask" "2" +"wait" ".5" } // entity 3 { @@ -91,11 +92,29 @@ "_object_channel_mask" "2" // brush 0 { +( 656 1280 944 ) ( 656 1281 944 ) ( 656 1280 945 ) e1u1/twall2_1 -32 0 0 1 1 +( 656 1280 944 ) ( 656 1280 945 ) ( 657 1280 944 ) e1u1/twall2_1 0 0 0 1 1 +( 656 1280 976 ) ( 657 1280 976 ) ( 656 1281 976 ) e1u1/twall2_1 0 32 0 1 1 +( 656 1280 1024 ) ( 656 1281 1024 ) ( 657 1280 1024 ) e1u1/twall2_1 0 32 0 1 1 +( 704 1296 960 ) ( 705 1296 960 ) ( 704 1296 961 ) e1u1/twall2_1 0 0 0 1 1 +( 704 1312 960 ) ( 704 1312 961 ) ( 704 1313 960 ) e1u1/twall2_1 -32 0 0 1 1 +} +// brush 1 +{ ( 656 1248 944 ) ( 656 1249 944 ) ( 656 1248 945 ) e1u1/twall2_1 0 0 0 1 1 ( 656 1248 944 ) ( 656 1248 945 ) ( 657 1248 944 ) e1u1/twall2_1 0 0 0 1 1 -( 656 1248 944 ) ( 657 1248 944 ) ( 656 1249 944 ) e1u1/twall2_1 0 0 0 1 1 +( 656 1248 960 ) ( 657 1248 960 ) ( 656 1249 960 ) e1u1/twall2_1 0 0 0 1 1 ( 704 1280 1040 ) ( 704 1281 1040 ) ( 705 1280 1040 ) e1u1/twall2_1 0 0 0 1 1 -( 704 1280 960 ) ( 705 1280 960 ) ( 704 1280 961 ) e1u1/twall2_1 0 0 0 1 1 +( 704 1264 960 ) ( 705 1264 960 ) ( 704 1264 961 ) e1u1/twall2_1 0 0 0 1 1 ( 704 1280 960 ) ( 704 1280 961 ) ( 704 1281 960 ) e1u1/twall2_1 0 0 0 1 1 } +// brush 2 +{ +( 656 1280 944 ) ( 656 1281 944 ) ( 656 1280 945 ) e1u1/twall2_1 -32 0 0 1 1 +( 656 1280 944 ) ( 656 1280 945 ) ( 657 1280 944 ) e1u1/twall2_1 0 0 0 1 1 +( 656 1280 1072 ) ( 657 1280 1072 ) ( 656 1281 1072 ) e1u1/twall2_1 0 32 0 1 1 +( 704 1312 1104 ) ( 704 1313 1104 ) ( 705 1312 1104 ) e1u1/twall2_1 0 32 0 1 1 +( 704 1296 960 ) ( 705 1296 960 ) ( 704 1296 961 ) e1u1/twall2_1 0 0 0 1 1 +( 704 1312 960 ) ( 704 1312 961 ) ( 704 1313 960 ) e1u1/twall2_1 -32 0 0 1 1 +} } diff --git a/tests/test_ltface.cc b/tests/test_ltface.cc index 2fe6e00b..152c7f8b 100644 --- a/tests/test_ltface.cc +++ b/tests/test_ltface.cc @@ -294,11 +294,12 @@ TEST_CASE("negative lights work") { } } -TEST_CASE("_light_group") { +TEST_CASE("light channel mask (_object_channel_mask, _light_channel_mask, _shadow_channel_mask)") { auto [bsp, bspx] = LoadTestmap("q2_light_group.map", {}); + REQUIRE(2 == bsp.dmodels.size()); { - INFO("world doesn't receive light from the light ent with '_light_group' 'pillar'"); + INFO("world doesn't receive light from the light ent with _light_channel_mask 2"); auto *face_under_light = BSP_FindFaceAtPoint(&bsp, &bsp.dmodels[0], {680, 1224, 944}); REQUIRE(face_under_light); @@ -309,7 +310,7 @@ TEST_CASE("_light_group") { } { - INFO("pillar with matching _light_group is receiving light"); + INFO("pillar with _object_channel_mask 2 is receiving light"); auto *face_on_pillar = BSP_FindFaceAtPoint(&bsp, &bsp.dmodels[1], {680, 1248, 1000}); REQUIRE(face_on_pillar); @@ -318,4 +319,26 @@ TEST_CASE("_light_group") { CHECK(sample[0] > 100); }); } + + { + INFO("_object_channel_mask 2 implicitly makes bmodels cast shadow in channel 2"); + + auto *occluded_face = BSP_FindFaceAtPoint(&bsp, &bsp.dmodels[1], {680, 1280, 1000}); + REQUIRE(occluded_face); + + CheckFaceLuxels(bsp, *occluded_face, [](qvec3b sample) { + CHECK(sample[0] == 0); + }); + } + + { + INFO("ensure AABB culling isn't breaking light channels"); + + auto *unoccluded_face = BSP_FindFaceAtPoint(&bsp, &bsp.dmodels[1], {680, 1280, 1088}); + REQUIRE(unoccluded_face); + + CheckFaceLuxels(bsp, *unoccluded_face, [](qvec3b sample) { + CHECK(sample[0] > 100); + }); + } }