From e3892617eda9118e52e7f26c9bd476726b4681fd Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Fri, 3 Jun 2022 20:13:06 -0600 Subject: [PATCH] testqbsp: add testmap for q2 lava intersecting clip (fails currently) --- qbsp/test_qbsp.cc | 35 +++++++++++++++++++++++++++++++++++ testmaps/qbsp_q2_lavaclip.map | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 testmaps/qbsp_q2_lavaclip.map diff --git a/qbsp/test_qbsp.cc b/qbsp/test_qbsp.cc index b697ef4a..45ef6ca3 100644 --- a/qbsp/test_qbsp.cc +++ b/qbsp/test_qbsp.cc @@ -1119,6 +1119,41 @@ TEST_CASE("base1leak", "[testmaps_q2]") CHECK(3 == plus_y_wall_leaf->numleafbrushes); } +/** + * e1u1/brlava brush intersecting e1u1/clip + **/ +TEST_CASE("lavaclip", "[testmaps_q2]") { + const mbsp_t bsp = LoadTestmap("qbsp_q2_lavaclip.map", {"-q2bsp"}); + + CHECK(GAME_QUAKE_II == bsp.loadversion->game->id); + + // not touching the lava, but inside the clip + const qvec3d playerclip_outside1 { -88, -32, 8}; + const qvec3d playerclip_outside2 { 88, -32, 8}; + + // inside both clip and lava + const qvec3d playerclip_inside_lava { 0, -32, 8}; + + const qvec3d in_lava_only {0, 32, 8}; + + // near the player start's feet. There should be a lava face here + const qvec3d lava_top_face_in_playerclip { 0, -32, 16}; + + // check leaf contents + CHECK((Q2_CONTENTS_PLAYERCLIP | Q2_CONTENTS_MONSTERCLIP | Q2_CONTENTS_DETAIL) == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], playerclip_outside1)->contents); + CHECK((Q2_CONTENTS_PLAYERCLIP | Q2_CONTENTS_MONSTERCLIP | Q2_CONTENTS_DETAIL) == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], playerclip_outside2)->contents); + CHECK((Q2_CONTENTS_PLAYERCLIP | Q2_CONTENTS_MONSTERCLIP | Q2_CONTENTS_DETAIL | Q2_CONTENTS_LAVA) == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], playerclip_inside_lava)->contents); + CHECK(Q2_CONTENTS_LAVA == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], in_lava_only)->contents); + + // search for face + auto *topface = BSP_FindFaceAtPoint(&bsp, &bsp.dmodels[0], lava_top_face_in_playerclip, {0, 0, 1}); + REQUIRE(nullptr != topface); + + auto *texinfo = Face_Texinfo(&bsp, topface); + CHECK(std::string(texinfo->texture.data()) == "e1u1/brlava"); + CHECK(texinfo->flags.native == (Q2_SURF_LIGHT | Q2_SURF_WARP)); +} + TEST_CASE("winding", "[benchmark]") { ankerl::nanobench::Bench bench; diff --git a/testmaps/qbsp_q2_lavaclip.map b/testmaps/qbsp_q2_lavaclip.map new file mode 100644 index 00000000..63a72147 --- /dev/null +++ b/testmaps/qbsp_q2_lavaclip.map @@ -0,0 +1,35 @@ +// Game: Quake 2 +// Format: Quake2 +// entity 0 +{ +"classname" "worldspawn" +"_tb_textures" "textures/e1u1" +// brush 0 +{ +( -64 -64 -16 ) ( -64 -63 -16 ) ( -64 -64 -15 ) e1u1/brlava 0 0 0 1 1 8 9 700 +( -64 -64 -16 ) ( -64 -64 -15 ) ( -63 -64 -16 ) e1u1/brlava 0 0 0 1 1 8 9 700 +( -64 -64 -16 ) ( -63 -64 -16 ) ( -64 -63 -16 ) e1u1/brlava 0 0 0 1 1 8 9 700 +( 64 64 16 ) ( 64 65 16 ) ( 65 64 16 ) e1u1/brlava 0 0 0 1 1 8 9 700 +( 64 64 16 ) ( 65 64 16 ) ( 64 64 17 ) e1u1/brlava 0 0 0 1 1 8 9 700 +( 64 64 16 ) ( 64 64 17 ) ( 64 65 16 ) e1u1/brlava 0 0 0 1 1 8 9 700 +} +// brush 1 +{ +( -112 -64 0 ) ( -112 -63 0 ) ( -112 -64 1 ) e1u1/clip 0 0 0 1 1 196608 128 0 +( -112 -64 0 ) ( -112 -64 1 ) ( -111 -64 0 ) e1u1/clip 0 0 0 1 1 196608 128 0 +( -112 -64 0 ) ( -111 -64 0 ) ( -112 -63 0 ) e1u1/clip 0 0 0 1 1 196608 128 0 +( 112 0 16 ) ( 112 1 16 ) ( 113 0 16 ) e1u1/clip 0 0 0 1 1 196608 128 0 +( 112 0 16 ) ( 113 0 16 ) ( 112 0 17 ) e1u1/clip 0 0 0 1 1 196608 128 0 +( 112 0 16 ) ( 112 0 17 ) ( 112 1 16 ) e1u1/clip 0 0 0 1 1 196608 128 0 +} +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "-16 -32 40" +} +// entity 2 +{ +"classname" "info_notnull" +"origin" "0 32 8" +}