From 590dd47890fc3774c06d6dcec767c4923e082ab4 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Mon, 4 Oct 2021 18:17:52 -0600 Subject: [PATCH 1/4] bspinfo: export more lumps to JSON (faces, edges, leaffaces, surfedges) --- bspinfo/bspinfo.cc | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/bspinfo/bspinfo.cc b/bspinfo/bspinfo.cc index 1c5246a5..390b2280 100644 --- a/bspinfo/bspinfo.cc +++ b/bspinfo/bspinfo.cc @@ -197,6 +197,23 @@ static void serialize_bsp(const bspdata_t &bspdata, const char *name) { texinfo.push_back({ "nexttexinfo", src_texinfo.nexttexinfo }); } } + + if (bsp.numfaces) { + json &faces = (j.emplace("faces", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numfaces; i++) { + json &face = faces.insert(faces.end(), json::object()).value(); + auto &src_face = bsp.dfaces[i]; + + face.push_back({ "planenum", src_face.planenum }); + face.push_back({ "side", src_face.side }); + face.push_back({ "firstedge", src_face.firstedge }); + face.push_back({ "numedges", src_face.numedges }); + face.push_back({ "texinfo", src_face.texinfo }); + face.push_back({ "styles", json::array({ src_face.styles[0], src_face.styles[1], src_face.styles[2], src_face.styles[3] }) }); + face.push_back({ "lightofs", src_face.lightofs }); + } + } if (bsp.numclipnodes) { json &clipnodes = (j.emplace("clipnodes", json::array())).first.value(); @@ -210,6 +227,32 @@ static void serialize_bsp(const bspdata_t &bspdata, const char *name) { } } + if (bsp.numedges) { + json &edges = (j.emplace("edges", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numedges; i++) { + auto &src_edge = bsp.dedges[i]; + + edges.insert(edges.end(), json::array({src_edge.v[0], src_edge.v[1]})); + } + } + + if (bsp.numleaffaces) { + json &leaffaces = (j.emplace("leaffaces", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numleaffaces; i++) { + leaffaces.insert(leaffaces.end(), bsp.dleaffaces[i]); + } + } + + if (bsp.numsurfedges) { + json &surfedges = (j.emplace("surfedges", json::array())).first.value(); + + for (int32_t i = 0; i < bsp.numsurfedges; i++) { + surfedges.insert(surfedges.end(), bsp.dsurfedges[i]); + } + } + if (bsp.numbrushsides) { json &brushsides = (j.emplace("brushsides", json::array())).first.value(); From a7c3e7076697228ffa4ec2463b9f9dacb415c3d2 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Mon, 4 Oct 2021 19:27:24 -0600 Subject: [PATCH 2/4] testmaps: add qbsp_func_detail_illusionary_plus_water.map --- testmaps/automatated_tests.sh | 3 + testmaps/qbsp-vis.sha256sum | 1 + testmaps/qbsp.sha256sum | 2 + ...bsp_func_detail_illusionary_plus_water.map | 96 +++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 testmaps/qbsp_func_detail_illusionary_plus_water.map diff --git a/testmaps/automatated_tests.sh b/testmaps/automatated_tests.sh index 6d7df2bc..764c868e 100755 --- a/testmaps/automatated_tests.sh +++ b/testmaps/automatated_tests.sh @@ -36,6 +36,7 @@ light invalid_texture_axes.map || exit 1 # work in game at the same time. HASH_CHECK_BSPS="qbsp_func_detail.bsp \ +qbsp_func_detail_illusionary_plus_water.bsp \ e1m1-bsp29.bsp \ e1m1-bsp2.bsp \ e1m1-2psb.bsp \ @@ -49,7 +50,9 @@ qbspfeatures.bsp" HASH_CHECK_PRTS=${HASH_CHECK_BSPS//.bsp/.prt} +# smaller test maps for specific features/combinations qbsp -noverbose qbsp_func_detail.map || exit 1 +qbsp -noverbose qbsp_func_detail_illusionary_plus_water.bsp || exit 1 qbsp -noverbose quake_map_source/E1M1.map e1m1-bsp29.bsp || exit 1 qbsp -noverbose -bsp2 quake_map_source/E1M1.map e1m1-bsp2.bsp || exit 1 diff --git a/testmaps/qbsp-vis.sha256sum b/testmaps/qbsp-vis.sha256sum index d45229b0..f530c84e 100644 --- a/testmaps/qbsp-vis.sha256sum +++ b/testmaps/qbsp-vis.sha256sum @@ -1,4 +1,5 @@ 416e68cd92c817f206c11006db21bd6b0cbc330eee63bdfc66afc5152b406760 *qbsp_func_detail.bsp +7668a50293c531bc2ba15d649f992800e124601963d08d00a8ee8e961c0dcde9 *qbsp_func_detail_illusionary_plus_water.bsp c9683e945bb01528a768653cdb79584dfbc8be6f76b712cbf0d24482a4ae3cc3 *e1m1-bsp29.bsp a8024b07d48abc0553ff3628d6d4cb62138f67808b425b833e5643068231c2e4 *e1m1-bsp2.bsp cb11d4f40d92c9d349fd11f9e4901e9cd9aa82db9971181a615c197f75f4b4a6 *e1m1-2psb.bsp diff --git a/testmaps/qbsp.sha256sum b/testmaps/qbsp.sha256sum index ceeb104c..1e529e31 100644 --- a/testmaps/qbsp.sha256sum +++ b/testmaps/qbsp.sha256sum @@ -1,4 +1,5 @@ 45d60368c37ee3523f9a1dbc140f34ae7728fc13d3cb8a43e7b22caefe46edb1 *qbsp_func_detail.bsp +9e8793633fee26410df78892170ba95c51ce676e4059d9b78e1c67dbdcf2002b *qbsp_func_detail_illusionary_plus_water.bsp d289427e3c8a7046dce509a83401f6732a9c5f8194f8beb3eee431e33215656c *e1m1-bsp29.bsp 85002a12afa023d850199e205f01fc58de2743f97aea9b2a22a3b0ac3ce8f7ad *e1m1-bsp2.bsp 832ec9aff302ddfcc5ab4fe0911afec0b4d57c60e02dc1c8f61e1edbf8f53eda *e1m1-2psb.bsp @@ -10,6 +11,7 @@ d289427e3c8a7046dce509a83401f6732a9c5f8194f8beb3eee431e33215656c *e1m1-bsp29.bsp af7bc468d76aa1b11d1881a3378877059c6fd33fb37bea555d332e17d0e1e23c *e1m1-bsp29-onlyents.bsp 9f6db65a0c8a3eaa369deb3bb3168b5da69f23eb80a12788ff50d3c30b8a469a *qbspfeatures.bsp abf3633d5a6d0e167ce9bacec476d3408c8240df5f3d72d14867cd201d4e3674 *qbsp_func_detail.prt +94b264fe21d6ecf9b26820039373c9fe5e30f18c4d26f0d60ba23ca79e7ee7e2 *qbsp_func_detail_illusionary_plus_water.prt 08349ab23c97120c41493d8fb00b9a6c41553aba64b1710ba11cc5bdfbe51e45 *e1m1-bsp29.prt 08349ab23c97120c41493d8fb00b9a6c41553aba64b1710ba11cc5bdfbe51e45 *e1m1-bsp2.prt 08349ab23c97120c41493d8fb00b9a6c41553aba64b1710ba11cc5bdfbe51e45 *e1m1-2psb.prt diff --git a/testmaps/qbsp_func_detail_illusionary_plus_water.map b/testmaps/qbsp_func_detail_illusionary_plus_water.map new file mode 100644 index 00000000..220a24ed --- /dev/null +++ b/testmaps/qbsp_func_detail_illusionary_plus_water.map @@ -0,0 +1,96 @@ +// Game: Quake +// Format: Valve +// entity 0 +{ +"mapversion" "220" +"classname" "worldspawn" +"wad" "deprecated/fence.wad;deprecated/free_wad.wad" +// brush 0 +{ +( -160 -256 80 ) ( -160 64 16 ) ( -160 64 80 ) *swater4 [ 0 -1 0 -16 ] [ 0 0 -1 0 ] 0 6 6 +( 192 -432 80 ) ( -64 -432 16 ) ( -64 -432 80 ) *swater4 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 6 6 +( 192 64 16 ) ( -64 -256 16 ) ( 192 -256 16 ) *swater4 [ -1 0 0 0 ] [ 0 -1 0 0 ] 0 6 6 +( 192 64 80 ) ( -64 -256 80 ) ( -64 64 80 ) *swater4 [ 1 0 0 0 ] [ 0 -1 0 -16 ] 0 6 6 +( 192 176 80 ) ( -64 176 16 ) ( 192 176 16 ) *swater4 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 6 6 +( 288 64 80 ) ( 288 -256 16 ) ( 288 -256 80 ) *swater4 [ 0 -1 0 -16 ] [ 0 0 -1 0 ] 0 6 6 +} +// brush 1 +{ +( -176 -256 -16 ) ( -176 -255 -16 ) ( -176 -256 -15 ) tsl_wall1 [ 0 -1 0 0 ] [ 0 0 -1 16 ] 0 6 6 +( -176 -432 -16 ) ( -176 -432 -15 ) ( -175 -432 -16 ) tsl_wall1 [ 1 0 0 16 ] [ 0 0 -1 16 ] 0 6 6 +( -176 -256 16 ) ( -175 -256 16 ) ( -176 -255 16 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 -1 0 0 ] 0 6 6 +( -160 192 272 ) ( -160 193 272 ) ( -159 192 272 ) tsl_wall1 [ 1 0 0 16 ] [ 0 -1 0 0 ] 0 6 6 +( -160 176 0 ) ( -159 176 0 ) ( -160 176 1 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 16 ] 0 6 6 +( -160 192 0 ) ( -160 192 1 ) ( -160 193 0 ) tsl_wall1 [ 0 1 0 0 ] [ 0 0 -1 16 ] 0 6 6 +} +// brush 2 +{ +( -160 176 8 ) ( -160 177 8 ) ( -160 176 9 ) tsl_wall1 [ 0 1.0000000000000002 0 -32 ] [ 0 0 -1.0000000000000002 16 ] 0 6 6 +( -160 176 8 ) ( -160 176 9 ) ( -159 176 8 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 16 ] 0 6 6 +( -160 176 16 ) ( -159 176 16 ) ( -160 177 16 ) tsl_wall1 [ -1.0000000000000002 0 0 -16 ] [ 0 1.0000000000000002 0 -40 ] 0 6 6 +( 288 192 272 ) ( 288 193 272 ) ( 289 192 272 ) tsl_wall1 [ -1.0000000000000002 0 0 -16 ] [ 0 -1.0000000000000002 0 48 ] 0 6 6 +( 288 192 16 ) ( 289 192 16 ) ( 288 192 17 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 16 ] 0 6 6 +( 288 192 16 ) ( 288 192 17 ) ( 288 193 16 ) tsl_wall1 [ 0 -1.0000000000000002 0 0 ] [ 0 0 -1.0000000000000002 16 ] 0 6 6 +} +// brush 3 +{ +( -160 -112 16 ) ( -160 -111 16 ) ( -160 -112 17 ) orangestuff8 [ 0 1 0 -16 ] [ 0 0 -1 -16 ] 0 6 6 +( -80 -432 0 ) ( -81 -432 0 ) ( -80 -432 1 ) orangestuff8 [ -1 0 0 16 ] [ 0 0 -1 -16 ] 180 6 6 +( -80 -432 0 ) ( -80 -431 0 ) ( -81 -432 0 ) orangestuff8 [ 1 0 0 -16 ] [ 0 -1 0 16 ] 180 6 6 +( -160 -112 16 ) ( -161 -112 16 ) ( -160 -111 16 ) orangestuff8 [ -1 0 0 16 ] [ 0 -1 0 16 ] 180 6 6 +( -160 176 16 ) ( -160 176 17 ) ( -161 176 16 ) orangestuff8 [ 1 0 0 -16 ] [ 0 0 -1 -16 ] 180 6 6 +( 288 -432 0 ) ( 288 -432 1 ) ( 288 -431 0 ) orangestuff8 [ 0 -1 0 16 ] [ 0 0 -1 -16 ] 0 6 6 +} +// brush 4 +{ +( -160 -448 8 ) ( -160 -447 8 ) ( -160 -448 9 ) tsl_wall1 [ 0 1.0000000000000002 0 80 ] [ 0 0 -1.0000000000000002 16 ] 0 6 6 +( -160 -448 8 ) ( -160 -448 9 ) ( -159 -448 8 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 16 ] 0 6 6 +( -160 -448 16 ) ( -159 -448 16 ) ( -160 -447 16 ) tsl_wall1 [ -1.0000000000000002 0 0 -16 ] [ 0 1.0000000000000002 0 72 ] 0 6 6 +( 288 -432 272 ) ( 288 -431 272 ) ( 289 -432 272 ) tsl_wall1 [ -1.0000000000000002 0 0 -16 ] [ 0 -1.0000000000000002 0 -64 ] 0 6 6 +( 288 -432 16 ) ( 289 -432 16 ) ( 288 -432 17 ) tsl_wall1 [ -1 0 0 -16 ] [ 0 0 -1 16 ] 0 6 6 +( 288 -432 16 ) ( 288 -432 17 ) ( 288 -431 16 ) tsl_wall1 [ 0 -1.0000000000000002 0 -112 ] [ 0 0 -1.0000000000000002 16 ] 0 6 6 +} +// brush 5 +{ +( -160 -256 272 ) ( -160 -255 272 ) ( -160 -256 273 ) orangestuff8 [ 0 0 -1.0000000000000002 -16 ] [ 0 -1.0000000000000002 0 0 ] 180 6 6 +( 288 -432 280 ) ( 288 -432 281 ) ( 289 -432 280 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 0 ] 180 6 6 +( -160 -256 272 ) ( -159 -256 272 ) ( -160 -255 272 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 6 6 +( 288 176 288 ) ( 288 177 288 ) ( 289 176 288 ) orangestuff8 [ -1 0 0 0 ] [ 0 -1 0 0 ] 180 6 6 +( 288 176 280 ) ( 289 176 280 ) ( 288 176 281 ) orangestuff8 [ -1.0000000000000002 0 0 0 ] [ 0 0 1.0000000000000002 0 ] 180 6 6 +( 288 176 280 ) ( 288 176 281 ) ( 288 177 280 ) orangestuff8 [ 0 0 1.0000000000000002 16 ] [ 0 -1.0000000000000002 0 0 ] 180 6 6 +} +// brush 6 +{ +( 288 192 0 ) ( 288 193 0 ) ( 288 192 1 ) tsl_wall1 [ 0 1 0 0 ] [ 0 0 -1 16 ] 0 6 6 +( 304 -432 -16 ) ( 303 -432 -16 ) ( 304 -432 -15 ) tsl_wall1 [ -1 0 0 16 ] [ 0 0 -1 16 ] 180 6 6 +( 304 -256 16 ) ( 304 -255 16 ) ( 303 -256 16 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 6 6 +( 304 -256 272 ) ( 303 -256 272 ) ( 304 -255 272 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 -1 0 0 ] 180 6 6 +( 288 176 0 ) ( 288 176 1 ) ( 287 176 0 ) tsl_wall1 [ 1 0 0 -16 ] [ 0 0 -1 16 ] 180 6 6 +( 304 -256 -16 ) ( 304 -256 -15 ) ( 304 -255 -16 ) tsl_wall1 [ 0 -1 0 0 ] [ 0 0 -1 16 ] 0 6 6 +} +} +// entity 1 +{ +"classname" "func_detail_illusionary" +"_mirrorinside" "1" +// brush 0 +{ +( 16 -144 48 ) ( 16 -143 48 ) ( 16 -144 49 ) {trigger [ 0 1.0000000000000002 0 42.666664 ] [ 0 0 -1.0000000000000002 -32 ] 0 6 6 +( 16 -104 48 ) ( 16 -104 49 ) ( 17 -104 48 ) {trigger [ -1 0 0 32 ] [ 0 0 -1 -32 ] 0 6 6 +( 16 -144 16 ) ( 17 -144 16 ) ( 16 -143 16 ) {trigger [ -1.0000000000000002 0 0 32 ] [ 0 1.0000000000000002 0 -21.333336 ] 0 6 6 +( 96 -128 128 ) ( 96 -127 128 ) ( 97 -128 128 ) {trigger [ -1.0000000000000002 0 0 32 ] [ 0 -1.0000000000000002 0 -8 ] 0 6 6 +( 96 -80 64 ) ( 97 -80 64 ) ( 96 -80 65 ) {trigger [ -1 0 0 32 ] [ 0 0 -1 -32 ] 0 6 6 +( 40 -128 64 ) ( 40 -128 65 ) ( 40 -127 64 ) {trigger [ 0 -1.0000000000000002 0 12.000002 ] [ 0 0 -1.0000000000000002 -32 ] 0 6 6 +} +} +// entity 2 +{ +"classname" "light" +"origin" "72 -136 168" +"light" "3000" +} +// entity 3 +{ +"classname" "info_player_start" +"origin" "-88 -64 120" +} From 60d9d4daf4b9aa71ad7335a2abfef72ee4d911f3 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Mon, 4 Oct 2021 19:53:03 -0600 Subject: [PATCH 3/4] bspinfo: also output face vertices --- bspinfo/bspinfo.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bspinfo/bspinfo.cc b/bspinfo/bspinfo.cc index 390b2280..7d72c1f7 100644 --- a/bspinfo/bspinfo.cc +++ b/bspinfo/bspinfo.cc @@ -212,6 +212,16 @@ static void serialize_bsp(const bspdata_t &bspdata, const char *name) { face.push_back({ "texinfo", src_face.texinfo }); face.push_back({ "styles", json::array({ src_face.styles[0], src_face.styles[1], src_face.styles[2], src_face.styles[3] }) }); face.push_back({ "lightofs", src_face.lightofs }); + + // for readibility, also output the actual vertices + auto verts = json::array(); + for (int32_t k = 0; k < src_face.numedges; ++k) { + auto se = bsp.dsurfedges[src_face.firstedge + k]; + uint32_t v = (se < 0) ? bsp.dedges[-se].v[1] : bsp.dedges[se].v[0]; + auto dv = bsp.dvertexes[v]; + verts.push_back(json::array({ dv.point[0], dv.point[1], dv.point[2] })); + } + face.push_back({ "vertices", verts }); } } From a79772d9880214ebbbc969831cde64e41e85a472 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Mon, 4 Oct 2021 20:25:26 -0600 Subject: [PATCH 4/4] testmaps: fix stale hash for qbsp_func_detail_illusionary_plus_water.map --- testmaps/qbsp-vis.sha256sum | 2 +- testmaps/qbsp.sha256sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/testmaps/qbsp-vis.sha256sum b/testmaps/qbsp-vis.sha256sum index f530c84e..d56a413b 100644 --- a/testmaps/qbsp-vis.sha256sum +++ b/testmaps/qbsp-vis.sha256sum @@ -1,5 +1,5 @@ 416e68cd92c817f206c11006db21bd6b0cbc330eee63bdfc66afc5152b406760 *qbsp_func_detail.bsp -7668a50293c531bc2ba15d649f992800e124601963d08d00a8ee8e961c0dcde9 *qbsp_func_detail_illusionary_plus_water.bsp +c338b813b6529e5cd790720e3bc6a9e8f74e02e3348db04756174403f3331b8c *qbsp_func_detail_illusionary_plus_water.bsp c9683e945bb01528a768653cdb79584dfbc8be6f76b712cbf0d24482a4ae3cc3 *e1m1-bsp29.bsp a8024b07d48abc0553ff3628d6d4cb62138f67808b425b833e5643068231c2e4 *e1m1-bsp2.bsp cb11d4f40d92c9d349fd11f9e4901e9cd9aa82db9971181a615c197f75f4b4a6 *e1m1-2psb.bsp diff --git a/testmaps/qbsp.sha256sum b/testmaps/qbsp.sha256sum index 1e529e31..3ae8cee3 100644 --- a/testmaps/qbsp.sha256sum +++ b/testmaps/qbsp.sha256sum @@ -1,5 +1,5 @@ 45d60368c37ee3523f9a1dbc140f34ae7728fc13d3cb8a43e7b22caefe46edb1 *qbsp_func_detail.bsp -9e8793633fee26410df78892170ba95c51ce676e4059d9b78e1c67dbdcf2002b *qbsp_func_detail_illusionary_plus_water.bsp +565e9aef399341eef99fc37212d7ab314df8f6dd850a8ca5a471661088d7d3bc *qbsp_func_detail_illusionary_plus_water.bsp d289427e3c8a7046dce509a83401f6732a9c5f8194f8beb3eee431e33215656c *e1m1-bsp29.bsp 85002a12afa023d850199e205f01fc58de2743f97aea9b2a22a3b0ac3ce8f7ad *e1m1-bsp2.bsp 832ec9aff302ddfcc5ab4fe0911afec0b4d57c60e02dc1c8f61e1edbf8f53eda *e1m1-2psb.bsp @@ -11,7 +11,7 @@ d289427e3c8a7046dce509a83401f6732a9c5f8194f8beb3eee431e33215656c *e1m1-bsp29.bsp af7bc468d76aa1b11d1881a3378877059c6fd33fb37bea555d332e17d0e1e23c *e1m1-bsp29-onlyents.bsp 9f6db65a0c8a3eaa369deb3bb3168b5da69f23eb80a12788ff50d3c30b8a469a *qbspfeatures.bsp abf3633d5a6d0e167ce9bacec476d3408c8240df5f3d72d14867cd201d4e3674 *qbsp_func_detail.prt -94b264fe21d6ecf9b26820039373c9fe5e30f18c4d26f0d60ba23ca79e7ee7e2 *qbsp_func_detail_illusionary_plus_water.prt +c0995c6b92256fa048c1a755ebe7e07f5fae33cb64e3c53adc234380fe44f267 *qbsp_func_detail_illusionary_plus_water.prt 08349ab23c97120c41493d8fb00b9a6c41553aba64b1710ba11cc5bdfbe51e45 *e1m1-bsp29.prt 08349ab23c97120c41493d8fb00b9a6c41553aba64b1710ba11cc5bdfbe51e45 *e1m1-bsp2.prt 08349ab23c97120c41493d8fb00b9a6c41553aba64b1710ba11cc5bdfbe51e45 *e1m1-2psb.prt