diff --git a/testmaps/q2_ladder.map b/testmaps/q2_ladder.map new file mode 100644 index 00000000..7bfdba6e --- /dev/null +++ b/testmaps/q2_ladder.map @@ -0,0 +1,77 @@ +// Game: Quake 2 +// Format: Quake2 (Valve) +// entity 0 +{ +"mapversion" "220" +"classname" "worldspawn" +"_tb_textures" "textures/e1u1" +// brush 0 +{ +( 144 208 192 ) ( 144 -208 192 ) ( 144 208 -16 ) e1u1/c_met11_2 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 160 -208 -16 ) ( 144 -208 -16 ) ( 160 -208 192 ) e1u1/c_met11_2 [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 1 1 +( 160 208 -16 ) ( 144 208 -16 ) ( 160 -208 -16 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 160 -208 192 ) ( 144 -208 192 ) ( 160 208 192 ) e1u1/c_met11_2 [ 1 0 -0 0 ] [ 0 -1 -0 0 ] 0 1 1 +( 160 208 192 ) ( 144 208 192 ) ( 160 208 -16 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 160 -208 192 ) ( 160 208 192 ) ( 160 -208 -16 ) e1u1/c_met11_2 [ 0 1 -0 0 ] [ 0 -0 -1 0 ] 0 1 1 +} +// brush 1 +{ +( -160 -208 -16 ) ( -160 208 -16 ) ( -160 -208 192 ) e1u1/c_met11_2 [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 1 1 +( -160 -208 192 ) ( -144 -208 192 ) ( -160 -208 -16 ) e1u1/c_met11_2 [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 1 1 +( -160 -208 -16 ) ( -144 -208 -16 ) ( -160 208 -16 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 1 1 +( -160 208 192 ) ( -144 208 192 ) ( -160 -208 192 ) e1u1/c_met11_2 [ 1 -0 0 0 ] [ -0 -1 0 0 ] 0 1 1 +( -160 208 -16 ) ( -144 208 -16 ) ( -160 208 192 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -144 -208 -16 ) ( -144 -208 192 ) ( -144 208 -16 ) e1u1/c_met11_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 2 +{ +( -144 208 192 ) ( -144 192 192 ) ( -144 208 -16 ) e1u1/c_met11_2 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 144 192 192 ) ( 144 192 -16 ) ( -144 192 192 ) e1u1/c_met11_2 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -144 208 -16 ) ( -144 192 -16 ) ( 144 208 -16 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 1 1 +( 144 208 192 ) ( 144 192 192 ) ( -144 208 192 ) e1u1/c_met11_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 144 208 192 ) ( -144 208 192 ) ( 144 208 -16 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 144 208 -16 ) ( 144 192 -16 ) ( 144 208 192 ) e1u1/c_met11_2 [ -0 1 0 0 ] [ -0 0 -1 0 ] 0 1 1 +} +// brush 3 +{ +( -144 -208 -16 ) ( -144 -192 -16 ) ( -144 -208 192 ) e1u1/c_met11_2 [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 1 1 +( 144 -208 -16 ) ( -144 -208 -16 ) ( 144 -208 192 ) e1u1/c_met11_2 [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 1 1 +( 144 -208 -16 ) ( 144 -192 -16 ) ( -144 -208 -16 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 1 1 +( -144 -208 192 ) ( -144 -192 192 ) ( 144 -208 192 ) e1u1/c_met11_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( -144 -192 -16 ) ( 144 -192 -16 ) ( -144 -192 192 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 144 -208 192 ) ( 144 -192 192 ) ( 144 -208 -16 ) e1u1/c_met11_2 [ 0 1 -0 0 ] [ 0 -0 -1 0 ] 0 1 1 +} +// brush 4 +{ +( -144 -192 192 ) ( -144 -192 176 ) ( -144 192 192 ) e1u1/sky1 [ 0 0.30769230769230776 0 0 ] [ 0 0 -1 0 ] 0 1 1 0 132 0 +( 144 -192 192 ) ( 144 -192 176 ) ( -144 -192 192 ) e1u1/sky1 [ -0.4 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 0 132 0 +( 144 192 176 ) ( -144 192 176 ) ( 144 -192 176 ) e1u1/sky1 [ -0.4 0 0 0 ] [ 0 -0.30769230769230776 0 0 ] 180 1 1 0 132 0 +( 144 192 192 ) ( 144 -192 192 ) ( -144 192 192 ) e1u1/sky1 [ -0.4 0 0 0 ] [ 0 -0.30769230769230776 0 0 ] 180 1 1 0 132 0 +( -144 192 192 ) ( -144 192 176 ) ( 144 192 192 ) e1u1/sky1 [ 0.4 0 0 0 ] [ 0 0 -1 0 ] 180 1 1 0 132 0 +( 144 192 192 ) ( 144 192 176 ) ( 144 -192 192 ) e1u1/sky1 [ 0 -0.30769230769230776 0 0 ] [ 0 0 -1 0 ] 0 1 1 0 132 0 +} +// brush 5 +{ +( -144 192 -16 ) ( -144 192 0 ) ( -144 -192 -16 ) e1u1/c_met11_2 [ 0 -1 0 0 ] [ -0 -0 -1 0 ] 0 1 1 +( -144 -192 -16 ) ( -144 -192 0 ) ( 144 -192 -16 ) e1u1/c_met11_2 [ 1 0 -0 0 ] [ 0 -0 -1 0 ] 0 1 1 +( -144 192 -16 ) ( -144 -192 -16 ) ( 144 192 -16 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ -0 -1 -0 0 ] 0 1 1 +( -144 -192 0 ) ( -144 192 0 ) ( 144 -192 0 ) e1u1/c_met11_2 [ 1 0 0 0 ] [ 0 -1 0 0 ] 0 1 1 +( 144 192 -16 ) ( 144 192 0 ) ( -144 192 -16 ) e1u1/c_met11_2 [ -1 0 0 0 ] [ -0 0 -1 0 ] 0 1 1 +( 144 -192 -16 ) ( 144 -192 0 ) ( 144 192 -16 ) e1u1/c_met11_2 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +// brush 6 +{ +( -16 176 0 ) ( -16 177 0 ) ( -16 176 1 ) e1u1/color1_2 [ 0 -1 0 48 ] [ 0 0 -1 0 ] 0 1 1 671088640 0 0 +( -16 176 0 ) ( -16 176 1 ) ( -15 176 0 ) e1u1/color1_2 [ 1 0 0 16 ] [ 0 0 -1 0 ] 0 1 1 671088640 0 0 +( -16 176 0 ) ( -15 176 0 ) ( -16 177 0 ) e1u1/color1_2 [ -1 0 0 -16 ] [ 0 -1 0 48 ] 0 1 1 671088640 0 0 +( 0 192 176 ) ( 0 193 176 ) ( 1 192 176 ) e1u1/color1_2 [ 1 0 0 16 ] [ 0 -1 0 48 ] 0 1 1 671088640 0 0 +( 0 192 16 ) ( 1 192 16 ) ( 0 192 17 ) e1u1/color1_2 [ -1 0 0 -16 ] [ 0 0 -1 0 ] 0 1 1 671088640 0 0 +( 0 192 16 ) ( 0 192 17 ) ( 0 193 16 ) e1u1/color1_2 [ 0 1 0 -48 ] [ 0 0 -1 0 ] 0 1 1 671088640 0 0 +} +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "16 -16 24" +"angle" "90" +} diff --git a/tests/test_qbsp_q2.cc b/tests/test_qbsp_q2.cc index ebff24c8..b155a1b9 100644 --- a/tests/test_qbsp_q2.cc +++ b/tests/test_qbsp_q2.cc @@ -598,3 +598,20 @@ TEST_CASE("q2_missing_faces" * doctest::test_suite("testmaps_q2") * doctest::may CHECK(BSP_FindFaceAtPoint(&bsp, &bsp.dmodels[0], point_on_missing_face2)); CHECK(BSP_FindFaceAtPoint(&bsp, &bsp.dmodels[0], point_on_present_face)); } + +TEST_CASE("q2_ladder" * doctest::test_suite("testmaps_q2")) +{ + const auto [bsp, bspx, prt] = LoadTestmapQ2("q2_ladder.map"); + + const qvec3d point_in_ladder {-8, 184, 24}; + + CheckFilled(bsp); + + auto *leaf = BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], point_in_ladder); + + // the brush lacked a visible contents, so it became solid. solid leafs wipe out any other content bits + CHECK(leaf->contents == (Q2_CONTENTS_SOLID)); + + CHECK(1 == Leaf_Brushes(&bsp, leaf).size()); + CHECK((Q2_CONTENTS_SOLID | Q2_CONTENTS_LADDER | Q2_CONTENTS_DETAIL) == Leaf_Brushes(&bsp, leaf).at(0)->contents); +}