diff --git a/testmaps/q1_water_subdivision.map b/testmaps/q1_water_subdivision.map new file mode 100644 index 00000000..b6dd4e4e --- /dev/null +++ b/testmaps/q1_water_subdivision.map @@ -0,0 +1,78 @@ +// Game: Quake +// Format: Valve +// entity 0 +{ +"mapversion" "220" +"classname" "worldspawn" +"wad" "deprecated/free_wad.wad;deprecated/fence.wad;deprecated/origin.wad;deprecated/hintskip.wad" +"_wateralpha" "0.5" +"_tb_def" "builtin:Quake.fgd" +// brush 0 +{ +( -112 -112 96 ) ( -112 -111 96 ) ( -112 -112 97 ) orangestuff8 [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 2 2 +( -80 -96 80 ) ( -81 -96 80 ) ( -80 -96 81 ) orangestuff8 [ -1 0 0 16 ] [ 0 0 -1 0 ] 180 2 2 +( -80 -432 80 ) ( -80 -431 80 ) ( -81 -432 80 ) orangestuff8 [ 1 0 0 -16 ] [ 0 -1 0 16 ] 180 2 2 +( -160 -112 96 ) ( -161 -112 96 ) ( -160 -111 96 ) orangestuff8 [ -1 0 0 16 ] [ 0 -1 0 16 ] 180 2 2 +( -160 1024 96 ) ( -160 1024 97 ) ( -161 1024 96 ) orangestuff8 [ 1 0 0 -16 ] [ 0 0 -1 0 ] 180 2 2 +( 592 -432 80 ) ( 592 -432 81 ) ( 592 -431 80 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 2 2 +} +// brush 1 +{ +( -112 928 96 ) ( -112 929 96 ) ( -112 928 97 ) orangestuff8 [ 0 1 0 48 ] [ 0 0 -1 0 ] 0 2 2 +( -80 1024 80 ) ( -81 1024 80 ) ( -80 1024 81 ) orangestuff8 [ -1 0 0 -48 ] [ 0 0 -1 0 ] 180 2 2 +( -80 608 80 ) ( -80 609 80 ) ( -81 608 80 ) orangestuff8 [ 1 0 0 48 ] [ 0 -1 0 -48 ] 180 2 2 +( -160 928 320 ) ( -161 928 320 ) ( -160 929 320 ) orangestuff8 [ -1 0 0 -48 ] [ 0 -1 0 -48 ] 180 2 2 +( -160 1040 96 ) ( -160 1040 97 ) ( -161 1040 96 ) orangestuff8 [ 1 0 0 48 ] [ 0 0 -1 0 ] 180 2 2 +( 592 608 80 ) ( 592 608 81 ) ( 592 609 80 ) orangestuff8 [ 0 -1 0 -48 ] [ 0 0 -1 0 ] 0 2 2 +} +// brush 2 +{ +( -112 -208 96 ) ( -112 -207 96 ) ( -112 -208 97 ) orangestuff8 [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 2 2 +( -80 -112 80 ) ( -81 -112 80 ) ( -80 -112 81 ) orangestuff8 [ -1 0 0 16 ] [ 0 0 -1 0 ] 180 2 2 +( -80 -528 80 ) ( -80 -527 80 ) ( -81 -528 80 ) orangestuff8 [ 1 0 0 -16 ] [ 0 -1 0 16 ] 180 2 2 +( -160 -208 320 ) ( -161 -208 320 ) ( -160 -207 320 ) orangestuff8 [ -1 0 0 16 ] [ 0 -1 0 16 ] 180 2 2 +( -160 -96 96 ) ( -160 -96 97 ) ( -161 -96 96 ) orangestuff8 [ 1 0 0 -16 ] [ 0 0 -1 0 ] 180 2 2 +( 592 -528 80 ) ( 592 -528 81 ) ( 592 -527 80 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 2 2 +} +// brush 3 +{ +( -128 -112 96 ) ( -128 -111 96 ) ( -128 -112 97 ) orangestuff8 [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 2 2 +( -256 -96 80 ) ( -257 -96 80 ) ( -256 -96 81 ) orangestuff8 [ -1 0 0 16 ] [ 0 0 -1 0 ] 180 2 2 +( -256 -432 80 ) ( -256 -431 80 ) ( -257 -432 80 ) orangestuff8 [ 1 0 0 -16 ] [ 0 -1 0 16 ] 180 2 2 +( -336 -112 320 ) ( -337 -112 320 ) ( -336 -111 320 ) orangestuff8 [ -1 0 0 16 ] [ 0 -1 0 16 ] 180 2 2 +( -336 1024 96 ) ( -336 1024 97 ) ( -337 1024 96 ) orangestuff8 [ 1 0 0 -16 ] [ 0 0 -1 0 ] 180 2 2 +( -112 -432 80 ) ( -112 -432 81 ) ( -112 -431 80 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 2 2 +} +// brush 4 +{ +( 592 -112 96 ) ( 592 -111 96 ) ( 592 -112 97 ) orangestuff8 [ 0 1 0 -16 ] [ 0 0 -1 0 ] 0 2 2 +( 464 -96 80 ) ( 463 -96 80 ) ( 464 -96 81 ) orangestuff8 [ -1 0 0 24 ] [ 0 0 -1 0 ] 180 2 2 +( 464 -432 80 ) ( 464 -431 80 ) ( 463 -432 80 ) orangestuff8 [ 1 0 0 -24 ] [ 0 -1 0 16 ] 180 2 2 +( 384 -112 320 ) ( 383 -112 320 ) ( 384 -111 320 ) orangestuff8 [ -1 0 0 24 ] [ 0 -1 0 16 ] 180 2 2 +( 384 1024 96 ) ( 384 1024 97 ) ( 383 1024 96 ) orangestuff8 [ 1 0 0 -24 ] [ 0 0 -1 0 ] 180 2 2 +( 608 -432 80 ) ( 608 -432 81 ) ( 608 -431 80 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 0 ] 0 2 2 +} +// brush 5 +{ +( -112 -112 336 ) ( -112 -111 336 ) ( -112 -112 337 ) orangestuff8 [ 0 1 0 -16 ] [ 0 0 -1 48 ] 0 2 2 +( -80 -96 320 ) ( -81 -96 320 ) ( -80 -96 321 ) orangestuff8 [ -1 0 0 16 ] [ 0 0 -1 48 ] 180 2 2 +( -80 -432 320 ) ( -80 -431 320 ) ( -81 -432 320 ) orangestuff8 [ 1 0 0 -16 ] [ 0 -1 0 16 ] 180 2 2 +( -160 -112 336 ) ( -161 -112 336 ) ( -160 -111 336 ) orangestuff8 [ -1 0 0 16 ] [ 0 -1 0 16 ] 180 2 2 +( -160 1024 336 ) ( -160 1024 337 ) ( -161 1024 336 ) orangestuff8 [ 1 0 0 -16 ] [ 0 0 -1 48 ] 180 2 2 +( 592 -432 320 ) ( 592 -432 321 ) ( 592 -431 320 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 48 ] 0 2 2 +} +// brush 6 +{ +( -112 -112 108 ) ( -112 -111 108 ) ( -112 -112 109 ) *swater5 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -80 -96 92 ) ( -81 -96 92 ) ( -80 -96 93 ) *swater5 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -80 -432 96 ) ( -80 -431 96 ) ( -81 -432 96 ) *swater5 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 -112 112 ) ( -161 -112 112 ) ( -160 -111 112 ) *swater5 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -160 1024 108 ) ( -160 1024 109 ) ( -161 1024 108 ) *swater5 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 592 -432 92 ) ( 592 -432 93 ) ( 592 -431 92 ) *swater5 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "24 0 120" +} diff --git a/tests/test_qbsp.cc b/tests/test_qbsp.cc index 2a6884cd..49d41e16 100644 --- a/tests/test_qbsp.cc +++ b/tests/test_qbsp.cc @@ -1619,3 +1619,29 @@ TEST_CASE("BrushFromBounds") { } CHECK(found == 2); } + +TEST_CASE("q1_water_subdivision with lit water off") { + INFO("-litwater 0 should suppress water subdivision"); + + const auto [bsp, bspx, prt] = LoadTestmapQ1("q1_water_subdivision.map", {"-litwater", "0"}); + + auto faces = FacesWithTextureName(bsp, "*swater5"); + CHECK(2 == faces.size()); + + for (auto* face : faces) { + auto *texinfo = BSP_GetTexinfo(&bsp, face->texinfo); + CHECK(texinfo->flags.native == TEX_SPECIAL); + } +} + +TEST_CASE("q1_water_subdivision with defaults") { + const auto [bsp, bspx, prt] = LoadTestmapQ1("q1_water_subdivision.map"); + + auto faces = FacesWithTextureName(bsp, "*swater5"); + CHECK(faces.size() > 2); + + for (auto* face : faces) { + auto *texinfo = BSP_GetTexinfo(&bsp, face->texinfo); + CHECK(texinfo->flags.native == 0); + } +}