diff --git a/testmaps/q2_light_low_luxel_res2.map b/testmaps/q2_light_low_luxel_res2.map new file mode 100644 index 00000000..1d9ca44c --- /dev/null +++ b/testmaps/q2_light_low_luxel_res2.map @@ -0,0 +1,98 @@ +// Game: Quake 2 +// Format: Quake2 (Valve) +// entity 0 +{ +"classname" "worldspawn" +"_tb_textures" "textures/e1u1" +"_minlightMottle" "0" +"_minlight" "0" +// brush 0 +{ +( 2960 1064 -656 ) ( 2960 1048 -656 ) ( 2960 1048 -672 ) e1u1/color1_2 [ 0 1 0 -8 ] [ 0 0 -1 0 ] 0 1 1 +( 2960 1048 -656 ) ( 2968 1048 -656 ) ( 2968 1048 -672 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2968 1048 -672 ) ( 2968 1064 -672 ) ( 2960 1064 -672 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 8 ] 0 1 1 +( 2960 1064 -656 ) ( 2968 1064 -656 ) ( 2968 1048 -656 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 8 ] 0 1 1 +( 2968 1064 -672 ) ( 2968 1064 -656 ) ( 2960 1064 -656 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2968 1048 -656 ) ( 2968 1064 -656 ) ( 2968 1064 -672 ) e1u1/color1_2 [ 0 1 0 -8 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 1 +{ +( 2960 1064 -696 ) ( 2960 1048 -696 ) ( 2960 1048 -712 ) e1u1/color1_2 [ 0 1 0 -8 ] [ 0 0 -1 0 ] 0 1 1 +( 2960 1048 -696 ) ( 2968 1048 -696 ) ( 2968 1048 -712 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2968 1048 -712 ) ( 2968 1064 -712 ) ( 2960 1064 -712 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 8 ] 0 1 1 +( 2960 1064 -696 ) ( 2968 1064 -696 ) ( 2968 1048 -696 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 8 ] 0 1 1 +( 2968 1064 -712 ) ( 2968 1064 -696 ) ( 2960 1064 -696 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2968 1048 -696 ) ( 2968 1064 -696 ) ( 2968 1064 -712 ) e1u1/color1_2 [ 0 1 0 -8 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 2 +{ +( 2964 1128 -544 ) ( 2964 980 -544 ) ( 2964 1128 -760 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2968 980 -760 ) ( 2964 980 -760 ) ( 2968 980 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2968 1128 -760 ) ( 2964 1128 -760 ) ( 2968 980 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2968 980 -544 ) ( 2964 980 -544 ) ( 2968 1128 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2968 1128 -544 ) ( 2964 1128 -544 ) ( 2968 1128 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2968 980 -544 ) ( 2968 1128 -544 ) ( 2968 980 -760 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 3 +{ +( 2744 980 -760 ) ( 2744 1128 -760 ) ( 2744 980 -544 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2744 980 -544 ) ( 2748 980 -544 ) ( 2744 980 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2744 980 -760 ) ( 2748 980 -760 ) ( 2744 1128 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2744 1128 -544 ) ( 2748 1128 -544 ) ( 2744 980 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2744 1128 -760 ) ( 2748 1128 -760 ) ( 2744 1128 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2748 980 -760 ) ( 2748 980 -544 ) ( 2748 1128 -760 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 4 +{ +( 2748 1128 -544 ) ( 2748 1124 -544 ) ( 2748 1128 -760 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2964 1124 -544 ) ( 2964 1124 -760 ) ( 2748 1124 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2748 1128 -760 ) ( 2748 1124 -760 ) ( 2964 1128 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2964 1128 -544 ) ( 2964 1124 -544 ) ( 2748 1128 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2964 1128 -544 ) ( 2748 1128 -544 ) ( 2964 1128 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2964 1128 -760 ) ( 2964 1124 -760 ) ( 2964 1128 -544 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 5 +{ +( 2748 980 -760 ) ( 2748 984 -760 ) ( 2748 980 -544 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2964 980 -760 ) ( 2748 980 -760 ) ( 2964 980 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2964 980 -760 ) ( 2964 984 -760 ) ( 2748 980 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2748 980 -544 ) ( 2748 984 -544 ) ( 2964 980 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2748 984 -760 ) ( 2964 984 -760 ) ( 2748 984 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2964 980 -544 ) ( 2964 984 -544 ) ( 2964 980 -760 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 6 +{ +( 2748 984 -544 ) ( 2748 984 -548 ) ( 2748 1124 -544 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2964 984 -544 ) ( 2964 984 -548 ) ( 2748 984 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2964 1124 -548 ) ( 2748 1124 -548 ) ( 2964 984 -548 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2964 1124 -544 ) ( 2964 984 -544 ) ( 2748 1124 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2748 1124 -544 ) ( 2748 1124 -548 ) ( 2964 1124 -544 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2964 1124 -544 ) ( 2964 1124 -548 ) ( 2964 984 -544 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 7 +{ +( 2748 1124 -760 ) ( 2748 1124 -756 ) ( 2748 984 -760 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2748 984 -760 ) ( 2748 984 -756 ) ( 2964 984 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2748 1124 -760 ) ( 2748 984 -760 ) ( 2964 1124 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2748 984 -756 ) ( 2748 1124 -756 ) ( 2964 984 -756 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 2964 1124 -760 ) ( 2964 1124 -756 ) ( 2748 1124 -760 ) e1u1/color1_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2964 984 -760 ) ( 2964 984 -756 ) ( 2964 1124 -760 ) e1u1/color1_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "2888 1058 -712" +} +// entity 2 +{ +"classname" "light" +"origin" "2936 1044 -702" +"light" "100" +} +// entity 3 +{ +"classname" "light" +"origin" "2936 1044 -666" +"light" "100" +} diff --git a/tests/test_ltface.cc b/tests/test_ltface.cc index b9191428..699621a0 100644 --- a/tests/test_ltface.cc +++ b/tests/test_ltface.cc @@ -260,10 +260,13 @@ static void CheckFaceLuxelAtPoint(const mbsp_t *bsp, const dmodelh2_t *model, co } const auto coord = extents.worldToLMCoord(point); + const auto int_coord = qvec2i(round(coord[0]), round(coord[1])); - const qvec3b sample = LM_Sample(bsp, lit, extents, offset, qvec2i(coord)); + const qvec3b sample = LM_Sample(bsp, lit, extents, offset, int_coord); INFO("world point: ", point); INFO("lm coord: ", coord[0], ", ", coord[1]); + INFO("lm int_coord: ", int_coord[0], ", ", int_coord[1]); + INFO("face num: ", Face_GetNum(bsp, face)); CHECK(sample == expected_color); } @@ -517,7 +520,7 @@ TEST_CASE("light channel mask / dirt interaction") CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {26, 26, 26}, {1432, 1480, 944}); INFO("worldspawn not receiving dirt from func_wall on different channel"); - CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {62, 62, 62}, {1212, 1272, 1014}); + CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {60, 60, 60}, {1212, 1272, 1014}); INFO("func_wall on different channel not receiving dirt from worldspawn"); CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[1], {64, 64, 64}, {1216, 1266, 1014}); @@ -667,4 +670,15 @@ TEST_CASE("q2_light_low_luxel_res") INFO("sloped cube"); CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {232, 185, 0}, {2164, 712, -968}, {0, 1, 0}, nullptr, &bspx); } +} + +TEST_CASE("q2_light_low_luxel_res2" * doctest::may_fail()) +{ + auto [bsp, bspx] = QbspVisLight_Q2( + "q2_light_low_luxel_res2.map", {"-world_units_per_luxel", "32", "-debugface", "2964", "1020", "-696"}); + + INFO("should be a smooth transition across these points"); + CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {49, 49, 49}, {2964, 1046, -694}, {-1, 0, 0}, nullptr, &bspx); + CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {25, 25, 25}, {2964, 1046, -706}, {-1, 0, 0}, nullptr, &bspx); + CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {1, 1, 1}, {2964, 1046, -716}, {-1, 0, 0}, nullptr, &bspx); } \ No newline at end of file