From 61b0c276c3332d9ec2edb0fab90a94f39e3bfd22 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 14:01:54 -0600 Subject: [PATCH 01/19] automated_tests.sh: wip new testing system --- testmaps/automatated_tests.sh | 46 +++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/testmaps/automatated_tests.sh b/testmaps/automatated_tests.sh index 58ce205d..f88cea02 100755 --- a/testmaps/automatated_tests.sh +++ b/testmaps/automatated_tests.sh @@ -1,7 +1,53 @@ #!/bin/bash +# usage: +# - qbsp, vis, light need to be in PATH before running +# - returns exit status 1 if any tests failed, otherwise 0 + +# print statements as they are executed set -x +# checking for lack of crashes + qbsp -noverbose invalid_texture_axes.map || exit 1 light invalid_texture_axes.map || exit 1 +# hash checks + +# Compiles Quake E1M1 under all supported output formats, +# then compare the hashes with what's been committed to the repo. +# Then vis all of the bsp's, and check the hashes again. +# Then light them, and check the hashes again. +# +# This check will naturally fail if any changes are made to the +# tools that alter the .bsp output - the idea is you would just +# regenerate the expected hashes, but check that the .bsp's still +# work in game at the same time. + +HASH_CHECK_BSPS="e1m1-bsp29.bsp \ +e1m1-bsp2.bsp \ +e1m1-2psb.bsp \ +e1m1-hexen2.bsp \ +e1m1-hexen2-bsp2.bsp \ +e1m1-hexen2-2psb.bsp" + +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 +qbsp -noverbose -2psb quake_map_source/E1M1.map e1m1-2psb.bsp || exit 1 +qbsp -noverbose -hexen2 quake_map_source/E1M1.map e1m1-hexen2.bsp || exit 1 +qbsp -noverbose -hexen2 -bsp2 quake_map_source/E1M1.map e1m1-hexen2-bsp2.bsp || exit 1 +qbsp -noverbose -hexen2 -2psb quake_map_source/E1M1.map e1m1-hexen2-2psb.bsp || exit 1 + +sha256sum ${HASH_CHECK_BSPS} + +# now run vis + +for bsp in ${HASH_CHECK_BSPS}; do + vis -nostate ${bsp} || exit 1 +done + +# now run light + +for bsp in ${HASH_CHECK_BSPS}; do + light ${bsp} || exit 1 +done From ff8b2e34464ec55e47174f073ac3497a935a3b33 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 14:03:36 -0600 Subject: [PATCH 02/19] gitignore: ignore bsp/log/prt/vis files in test dirs --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index 8d94a7cd..a3a177f9 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,11 @@ build*/ CMakeFiles/ *.xcodeproj .*/ +testmaps/*.bsp +testmaps/*.log +testmaps/*.prt +testmaps/*.vis +testmaps/quake_map_source/*.bsp +testmaps/quake_map_source/*.log +testmaps/quake_map_source/*.prt +testmaps/quake_map_source/*.vis From 5465ab4ff648d1cdaf1b8f0d842d51ef5d24b54c Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 14:56:25 -0600 Subject: [PATCH 03/19] Revert "Q2bsp VIS support (#315)" This reverts commit 90973e1198aafc299aa6ec762b16942fc852b926. --- common/bspfile.cc | 229 +------------------------------------- common/cmdlib.cc | 2 +- include/common/bspfile.hh | 12 +- light/trace_embree.cc | 4 +- qbsp3/common/bspfile.cc | 72 ++++++++++++ qbsp3/common/bspfile.h | 3 + vis/vis.cc | 121 +++++++++----------- 7 files changed, 139 insertions(+), 304 deletions(-) diff --git a/common/bspfile.cc b/common/bspfile.cc index 560a6928..9f96e755 100644 --- a/common/bspfile.cc +++ b/common/bspfile.cc @@ -964,36 +964,6 @@ Q2BSPtoM_Models(const q2_dmodel_t *dmodelsq2, int nummodels) { return newdata; } -static uint8_t * -Q2BSPtoM_CopyVisData(const dvis_t *dvisq2, int vissize, int *outvissize, mleaf_t *leafs, int numleafs) { - - if (!*outvissize) { - return ((uint8_t *) dvisq2); - } - - // FIXME: assumes PHS always follows PVS. - int32_t phs_start = INT_MAX, pvs_start = INT_MAX; - size_t header_offset = sizeof(dvis_t) + (sizeof(int32_t) * dvisq2->numclusters * 2); - - for (int32_t i = 0; i < dvisq2->numclusters; i++) { - pvs_start = std::min(pvs_start, (int32_t) (dvisq2->bitofs[i][DVIS_PVS])); - phs_start = std::min(phs_start, (int32_t) (dvisq2->bitofs[i][DVIS_PHS] - header_offset)); - - for (int32_t l = 0; l < numleafs; l++) { - if (leafs[l].cluster == i) { - leafs[l].visofs = dvisq2->bitofs[i][DVIS_PVS] - header_offset; - } - } - } - - // cut off the PHS and header - *outvissize -= header_offset + ((*outvissize - header_offset) - phs_start); - - uint8_t *vis = (uint8_t *) calloc(1, *outvissize); - memcpy(vis, ((uint8_t *) dvisq2) + pvs_start, *outvissize); - return vis; -} - static q2_dmodel_t * MBSPtoQ2_Models(const dmodelh2_t *dmodelsh2, int nummodels) { const dmodelh2_t *dmodelh2 = dmodelsh2; @@ -1016,128 +986,6 @@ MBSPtoQ2_Models(const dmodelh2_t *dmodelsh2, int nummodels) { return newdata; } - -/* -================ -CalcPHS - -Calculate the PHS (Potentially Hearable Set) -by ORing together all the PVS visible from a leaf -================ -*/ -static std::vector CalcPHS(int32_t portalclusters, const uint8_t *visdata, int *visdatasize, int32_t bitofs[][2]) -{ - const int32_t leafbytes = (portalclusters + 7) >> 3; - const int32_t leaflongs = leafbytes / sizeof(long); - std::vector compressed_phs; - uint8_t *uncompressed = (uint8_t *) calloc(1, leafbytes); - uint8_t *uncompressed_2 = (uint8_t *) calloc(1, leafbytes); - uint8_t *compressed = (uint8_t *) calloc(1, leafbytes * 2); - uint8_t *uncompressed_orig = (uint8_t *) calloc(1, leafbytes); - - printf ("Building PHS...\n"); - - int32_t count = 0; - for (int32_t i = 0; i < portalclusters; i++) - { - const uint8_t *scan = &visdata[bitofs[i][DVIS_PVS]]; - - DecompressRow(scan, leafbytes, uncompressed); - memset(uncompressed_orig, 0, leafbytes); - memcpy(uncompressed_orig, uncompressed, leafbytes); - - scan = uncompressed_orig; - - for (int32_t j = 0; j < leafbytes; j++) - { - uint8_t bitbyte = scan[j]; - if (!bitbyte) - continue; - for (int32_t k = 0; k < 8; k++) - { - if (! (bitbyte & (1<= portalclusters) - Error ("Bad bit in PVS"); // pad bits should be 0 - const uint8_t *src_compressed = &visdata[bitofs[index][DVIS_PVS]]; - DecompressRow(src_compressed, leafbytes, uncompressed_2); - const long *src = (long *) uncompressed_2; - long *dest = (long *) uncompressed; - for (int32_t l = 0; l < leaflongs; l++) - ((long *)uncompressed)[l] |= src[l]; - } - } - for (int32_t j = 0; j < portalclusters; j++) - if (uncompressed[j>>3] & (1<<(j&7)) ) - count++; - - // - // compress the bit string - // - int32_t j = CompressRow (uncompressed, leafbytes, compressed); - - bitofs[i][DVIS_PHS] = compressed_phs.size(); - - compressed_phs.insert(compressed_phs.end(), compressed, compressed + j); - } - - free(uncompressed); - free(uncompressed_2); - free(compressed); - free(uncompressed_orig); - - printf ("Average clusters hearable: %i\n", count / portalclusters); - - return compressed_phs; -} - -static dvis_t * -MBSPtoQ2_CopyVisData(const uint8_t *visdata, int *visdatasize, int numleafs, const mleaf_t *leafs) { - int32_t num_clusters = 0; - - for (int32_t i = 0; i < numleafs; i++) { - num_clusters = std::max(num_clusters, leafs[i].cluster + 1); - } - - size_t vis_offset = sizeof(dvis_t) + (sizeof(int32_t) * num_clusters * 2); - dvis_t *vis = (dvis_t *)calloc(1, vis_offset + *visdatasize); - - vis->numclusters = num_clusters; - - // the leaves are already using a per-cluster visofs, so just find one matching - // cluster and note it down under bitofs. - // we're also not worrying about PHS currently. - for (int32_t i = 0; i < num_clusters; i++) { - for (int32_t l = 0; l < numleafs; l++) { - if (leafs[l].cluster == i) { - // copy PVS visofs - vis->bitofs[i][DVIS_PVS] = leafs[l].visofs; - break; - } - } - } - - std::vector phs = CalcPHS(num_clusters, visdata, visdatasize, vis->bitofs); - - vis = (dvis_t *) realloc(vis, vis_offset + *visdatasize + phs.size()); - - // offset the pvs/phs properly - for (int32_t i = 0; i < num_clusters; i++) { - vis->bitofs[i][DVIS_PVS] += vis_offset; - vis->bitofs[i][DVIS_PHS] += vis_offset + *visdatasize; - } - - memcpy(((uint8_t *) vis) + vis_offset, visdata, *visdatasize); - *visdatasize += vis_offset; - - memcpy(((uint8_t *) vis) + *visdatasize, phs.data(), phs.size()); - *visdatasize += phs.size(); - - return vis; -} - static mleaf_t * Q2BSPtoM_Leafs(const q2_dleaf_t *dleafsq2, int numleafs) { const q2_dleaf_t *dleafq2 = dleafsq2; @@ -2092,7 +1940,7 @@ static void FreeMBSP(mbsp_t *bsp) inline void ConvertBSPToMFormatComplete(const bspversion_t **mbsp_loadversion, const bspversion_t *version, bspdata_t *bspdata) { - bspdata->loadversion = *mbsp_loadversion = bspdata->version; + *mbsp_loadversion = bspdata->version; bspdata->version = version; } @@ -2188,6 +2036,7 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) // copy or convert data mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); + mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); mbsp->dleafs = Q2BSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); @@ -2200,8 +2049,6 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) mbsp->dleaffaces = BSP29to2_Marksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); mbsp->dleafbrushes = Q2BSPtoM_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); - - mbsp->dvisdata = Q2BSPtoM_CopyVisData(q2bsp->dvis, q2bsp->visdatasize, &mbsp->visdatasize, mbsp->dleafs, mbsp->numleafs); mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); @@ -2244,6 +2091,7 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) // copy or convert data mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); + mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); mbsp->dleafs = Q2BSP_QBSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); @@ -2256,8 +2104,6 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) mbsp->dleaffaces = BSP2_CopyMarksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); mbsp->dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); - - mbsp->dvisdata = Q2BSPtoM_CopyVisData(q2bsp->dvis, q2bsp->visdatasize, &mbsp->visdatasize, mbsp->dleafs, mbsp->numleafs); mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); @@ -2451,7 +2297,7 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) // copy or convert data q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); - q2bsp->dvis = MBSPtoQ2_CopyVisData(mbsp->dvisdata, &q2bsp->visdatasize, mbsp->numleafs, mbsp->dleafs); + q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); q2bsp->dleafs = MBSPtoQ2_Leafs(mbsp->dleafs, mbsp->numleafs); @@ -2506,7 +2352,7 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) // copy or convert data q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); - q2bsp->dvis = MBSPtoQ2_CopyVisData(mbsp->dvisdata, &q2bsp->visdatasize, mbsp->numleafs, mbsp->dleafs); + q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); q2bsp->dleafs = MBSPtoQ2_Qbism_Leafs(mbsp->dleafs, mbsp->numleafs); @@ -3564,68 +3410,3 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); } } - -/* - =============== - CompressRow - =============== -*/ -int -CompressRow(const uint8_t *vis, const int numbytes, uint8_t *out) -{ - int i, rep; - uint8_t *dst; - - dst = out; - for (i = 0; i < numbytes; i++) { - *dst++ = vis[i]; - if (vis[i]) - continue; - - rep = 1; - for (i++; i < numbytes; i++) - if (vis[i] || rep == 255) - break; - else - rep++; - *dst++ = rep; - i--; - } - - return dst - out; -} - -/* -=================== -DecompressRow -=================== -*/ -void -DecompressRow (const uint8_t *in, const int numbytes, uint8_t *decompressed) -{ - int c; - uint8_t *out; - int row; - - row = numbytes; - out = decompressed; - - do - { - if (*in) - { - *out++ = *in++; - continue; - } - - c = in[1]; - if (!c) - Error ("DecompressVis: 0 repeat"); - in += 2; - while (c) - { - *out++ = 0; - c--; - } - } while (out - decompressed < row); -} diff --git a/common/cmdlib.cc b/common/cmdlib.cc index 2ed0e081..5b482183 100644 --- a/common/cmdlib.cc +++ b/common/cmdlib.cc @@ -217,7 +217,7 @@ SetQdirFromPath(const char *basedirname, const char *path) } if (pos == -1) { - logprint("SetQ2dirFromPath: failed to find %s in '%s'\n", basedir, path); + logprint("SetQ2dirFromPath: failed to find %s in '%s'", basedir, path); ClearQdir(); return; } diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index 68463364..9183755b 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -575,10 +575,10 @@ typedef struct { // compressed bit vectors #define DVIS_PVS 0 #define DVIS_PHS 1 -struct dvis_t { +typedef struct { int32_t numclusters; - int32_t bitofs[][2]; // bitofs[numclusters][2] -}; + int32_t bitofs[8][2]; // bitofs[numclusters][2] +} dvis_t; // each area has a list of portals that lead into other areas // when portals are closed, other areas may not be visible or @@ -965,10 +965,4 @@ void ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version); void BSPX_AddLump(bspdata_t *bspdata, const char *xname, const void *xdata, size_t xsize); const void *BSPX_GetLump(bspdata_t *bspdata, const char *xname, size_t *xsize); -void -DecompressRow (const uint8_t *in, const int numbytes, uint8_t *decompressed); - -int -CompressRow(const uint8_t *vis, const int numbytes, uint8_t *out); - #endif /* __COMMON_BSPFILE_H__ */ diff --git a/light/trace_embree.cc b/light/trace_embree.cc index 0575f804..f9a5322e 100644 --- a/light/trace_embree.cc +++ b/light/trace_embree.cc @@ -657,8 +657,8 @@ Embree_TraceInit(const mbsp_t *bsp) // Q2: arghrad compat: sky faces only emit sunlight if: // sky flag set, light flag set, value nonzero if ((contents & Q2_SURF_SKY) != 0 - && (!arghradcompat || ((contents & Q2_SURF_LIGHT) != 0 - && texinfo->value != 0))) + && (contents & Q2_SURF_LIGHT) != 0 + && texinfo->value != 0) { skyfaces.push_back(face); continue; diff --git a/qbsp3/common/bspfile.cc b/qbsp3/common/bspfile.cc index 6f01ea62..61997668 100644 --- a/qbsp3/common/bspfile.cc +++ b/qbsp3/common/bspfile.cc @@ -86,6 +86,78 @@ dareaportal_t dareaportals[MAX_MAP_AREAPORTALS]; uint8_t dpop[256]; +/* +=============== +CompressVis + +=============== +*/ +int CompressVis (uint8_t *vis, uint8_t *dest) +{ + int j; + int rep; + int visrow; + uint8_t *dest_p; + + dest_p = dest; +// visrow = (r_numvisleafs + 7)>>3; + visrow = (dvis->numclusters + 7)>>3; + + for (j=0 ; j>3; + row = (dvis->numclusters+7)>>3; + out = decompressed; + + do + { + if (*in) + { + *out++ = *in++; + continue; + } + + c = in[1]; + if (!c) + Error ("DecompressVis: 0 repeat"); + in += 2; + while (c) + { + *out++ = 0; + c--; + } + } while (out - decompressed < row); +} + //============================================================================= /* diff --git a/qbsp3/common/bspfile.h b/qbsp3/common/bspfile.h index 02f11053..7e388a4b 100644 --- a/qbsp3/common/bspfile.h +++ b/qbsp3/common/bspfile.h @@ -80,6 +80,9 @@ extern dbrushside_t dbrushsides[MAX_MAP_BRUSHSIDES]; extern uint8_t dpop[256]; +void DecompressVis (uint8_t *in, uint8_t *decompressed); +int CompressVis (uint8_t *vis, uint8_t *dest); + void LoadBSPFile (char *filename); void LoadBSPFileTexinfo (char *filename); // just for qdata void WriteBSPFile (char *filename); diff --git a/vis/vis.cc b/vis/vis.cc index 84c1813f..afe29eaf 100644 --- a/vis/vis.cc +++ b/vis/vis.cc @@ -31,12 +31,10 @@ static uint8_t *vismap; static uint8_t *vismap_p; static uint8_t *vismap_end; // past visfile -uint32_t originalvismapsize; +int originalvismapsize; uint8_t *uncompressed; // [leafbytes_real*portalleafs] -uint8_t *uncompressed_q2; // [leafbytes*portalleafs] - int leafbytes; // (portalleafs+63)>>3 int leaflongs; int leafbytes_real; // (portalleafs_real+63)>>3 @@ -547,6 +545,36 @@ LeafThread(void *arg) return NULL; } +/* + =============== + CompressRow + =============== +*/ +static int +CompressRow(const uint8_t *vis, const int numbytes, uint8_t *out) +{ + int i, rep; + uint8_t *dst; + + dst = out; + for (i = 0; i < numbytes; i++) { + *dst++ = vis[i]; + if (vis[i]) + continue; + + rep = 1; + for (i++; i < numbytes; i++) + if (vis[i] || rep == 255) + break; + else + rep++; + *dst++ = rep; + i--; + } + + return dst - out; +} + /* =============== @@ -558,7 +586,7 @@ LeafThread(void *arg) int64_t totalvis; static void -LeafFlow(int leafnum, mleaf_t *dleaf, const mbsp_t *bsp) +LeafFlow(int leafnum, mleaf_t *dleaf) { leaf_t *leaf; uint8_t *outbuffer; @@ -571,7 +599,7 @@ LeafFlow(int leafnum, mleaf_t *dleaf, const mbsp_t *bsp) /* * flow through all portals, collecting visible bits */ - outbuffer = (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism ? uncompressed_q2 : uncompressed) + leafnum * leafbytes; + outbuffer = uncompressed + leafnum * leafbytes; leaf = &leafs[leafnum]; for (i = 0; i < leaf->numportals; i++) { p = leaf->portals[i]; @@ -617,8 +645,8 @@ LeafFlow(int leafnum, mleaf_t *dleaf, const mbsp_t *bsp) } -static void -ClusterFlow(int clusternum, leafbits_t *buffer, const mbsp_t *bsp) +void +ClusterFlow(int clusternum, leafbits_t *buffer) { leaf_t *leaf; uint8_t *outbuffer; @@ -652,22 +680,11 @@ ClusterFlow(int clusternum, leafbits_t *buffer, const mbsp_t *bsp) * Now expand the clusters into the full leaf visibility map */ numvis = 0; - - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { - outbuffer = uncompressed_q2 + clusternum * leafbytes; - for (i = 0; i < portalleafs; i++) { - if (TestLeafBit(buffer, i)) { - outbuffer[i >> 3] |= (1 << (i & 7)); - numvis++; - } - } - } else { - outbuffer = uncompressed + clusternum * leafbytes_real; - for (i = 0; i < portalleafs_real; i++) { - if (TestLeafBit(buffer, clustermap[i])) { - outbuffer[i >> 3] |= (1 << (i & 7)); - numvis++; - } + outbuffer = uncompressed + clusternum * leafbytes_real; + for (i = 0; i < portalleafs_real; i++) { + if (TestLeafBit(buffer, clustermap[i])) { + outbuffer[i >> 3] |= (1 << (i & 7)); + numvis++; } } @@ -688,13 +705,8 @@ ClusterFlow(int clusternum, leafbits_t *buffer, const mbsp_t *bsp) } /* Allocate for worst case where RLE might grow the data (unlikely) */ - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { - compressed = static_cast(malloc(portalleafs * 2 / 8)); - len = CompressRow(outbuffer, (portalleafs + 7) >> 3, compressed); - } else { - compressed = static_cast(malloc(portalleafs_real * 2 / 8)); - len = CompressRow(outbuffer, (portalleafs_real + 7) >> 3, compressed); - } + compressed = static_cast(malloc(portalleafs_real * 2 / 8)); + len = CompressRow(outbuffer, (portalleafs_real + 7) >> 3, compressed); dest = vismap_p; vismap_p += len; @@ -739,8 +751,6 @@ CalcPortalVis(const mbsp_t *bsp) } RunThreadsOn(startcount, numportals * 2, LeafThread, NULL); - SaveVisState(); - if (verbose) { logprint("portalcheck: %i portaltest: %i portalpass: %i\n", c_portalcheck, c_portaltest, c_portalpass); @@ -775,7 +785,7 @@ CalcVis(const mbsp_t *bsp) // if (portalleafs == portalleafs_real) { for (i = 0; i < portalleafs; i++) - LeafFlow(i, &bsp->dleafs[i + 1], bsp); + LeafFlow(i, &bsp->dleafs[i + 1]); } else { leafbits_t *buffer; @@ -783,7 +793,7 @@ CalcVis(const mbsp_t *bsp) buffer = static_cast(malloc(LeafbitsSize(portalleafs))); for (i = 0; i < portalleafs; i++) { memset(buffer, 0, LeafbitsSize(portalleafs)); - ClusterFlow(i, buffer, bsp); + ClusterFlow(i, buffer); } free(buffer); @@ -1060,17 +1070,9 @@ LoadPortals(char *name, mbsp_t *bsp) count = fscanf(f, "%i\n%i\n", &portalleafs, &numportals); if (count != 2) Error("%s: unable to parse %s HEADER\n", __func__, PORTALFILE); - - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { - portalleafs_real = bsp->numleafs; - logprint("%6d leafs\n", portalleafs_real); - logprint("%6d clusters\n", portalleafs); - logprint("%6d portals\n", numportals); - } else { - portalleafs_real = portalleafs; - logprint("%6d leafs\n", portalleafs); - logprint("%6d portals\n", numportals); - } + portalleafs_real = portalleafs; + logprint("%6d leafs\n", portalleafs); + logprint("%6d portals\n", numportals); } else if (!strcmp(magic, PORTALFILE2)) { count = fscanf(f, "%i\n%i\n%i\n", &portalleafs_real, &portalleafs, &numportals); @@ -1101,11 +1103,7 @@ LoadPortals(char *name, mbsp_t *bsp) leafs = static_cast(malloc(portalleafs * sizeof(leaf_t))); memset(leafs, 0, portalleafs * sizeof(leaf_t)); - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { - originalvismapsize = portalleafs * ((portalleafs + 7) / 8); - } else { - originalvismapsize = portalleafs_real * ((portalleafs_real + 7) / 8); - } + originalvismapsize = portalleafs_real * ((portalleafs_real + 7) / 8); // FIXME - more intelligent allocation? bsp->dvisdata = static_cast(malloc(MAX_MAP_VISIBILITY)); @@ -1180,13 +1178,7 @@ LoadPortals(char *name, mbsp_t *bsp) } /* Load the cluster expansion map if needed */ - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { - clustermap = static_cast(malloc(portalleafs_real * sizeof(int))); - - for (int32_t i = 0; i < bsp->numleafs; i++) { - clustermap[i] = bsp->dleafs[i + 1].cluster; - } - } else if (portalleafs != portalleafs_real) { + if (portalleafs != portalleafs_real) { clustermap = static_cast(malloc(portalleafs_real * sizeof(int))); if (!strcmp(magic, PORTALFILE2)) { for (i = 0; i < portalleafs; i++) { @@ -1333,11 +1325,7 @@ main(int argc, char **argv) StripExtension(statetmpfile); DefaultExtension(statetmpfile, ".vi0"); - if (bsp->loadversion != &bspver_q2 && bsp->loadversion != &bspver_qbism) { - uncompressed = static_cast(calloc(portalleafs, leafbytes_real)); - } else { - uncompressed_q2 = static_cast(calloc(portalleafs, leafbytes)); - } + uncompressed = static_cast(calloc(portalleafs, leafbytes_real)); // CalcPassages (); @@ -1347,13 +1335,10 @@ main(int argc, char **argv) logprint("c_chains: %lu\n", c_chains); bsp->visdatasize = vismap_p - bsp->dvisdata; - logprint("visdatasize:%i compressed from %u\n", + logprint("visdatasize:%i compressed from %i\n", bsp->visdatasize, originalvismapsize); - - // no ambient sounds for Q2 - if (bsp->loadversion != &bspver_q2 && bsp->loadversion != &bspver_qbism) { - CalcAmbientSounds(bsp); - } + + CalcAmbientSounds(bsp); /* Convert data format back if necessary */ ConvertBSPFormat(&bspdata, loadversion); From e9052f3002d1444186b20a8e94ccb25ba9c46c97 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 14:58:34 -0600 Subject: [PATCH 04/19] Revert "Q2BSP + QBSP (#313)" This reverts commit eaa86c71c638a7cc2feb85ba3702209c11d8d1e1. --- bsputil/bsputil.cc | 32 +- common/bspfile.cc | 1863 +++++++++++++------------------------ common/bsputils.cc | 13 +- include/common/bspfile.hh | 147 +-- light/entities.cc | 2 +- light/imglib.cc | 6 +- light/light.cc | 18 +- light/ltface.cc | 6 +- light/trace.cc | 2 +- light/trace_embree.cc | 11 +- vis/vis.cc | 6 +- 11 files changed, 716 insertions(+), 1390 deletions(-) diff --git a/bsputil/bsputil.cc b/bsputil/bsputil.cc index 926b2c07..987b8341 100644 --- a/bsputil/bsputil.cc +++ b/bsputil/bsputil.cc @@ -541,7 +541,7 @@ main(int argc, char **argv) LoadBSPFile(source, &bspdata); - ConvertBSPFormat(&bspdata, &bspver_generic); + ConvertBSPFormat(GENERIC_BSP, &bspdata); for (i = 0; i < argc - 1; i++) { if (!strcmp(argv[i], "--compare")) { @@ -556,7 +556,7 @@ main(int argc, char **argv) strcpy(refbspname, argv[i]); DefaultExtension(refbspname, ".bsp"); LoadBSPFile(refbspname, &refbspdata); - ConvertBSPFormat(&refbspdata, &bspver_generic); + ConvertBSPFormat(GENERIC_BSP, &refbspdata); printf("comparing reference bsp %s with test bsp %s\n", refbspname, source); @@ -569,21 +569,21 @@ main(int argc, char **argv) if (!(i < argc - 1)) { Error("--convert requires an argument"); } - - const bspversion_t *fmt = nullptr; - - for (const bspversion_t *bspver : bspversions) { - if (!strcmp(argv[i], bspver->short_name)) { - fmt = bspver; - break; - } - } - - if (!fmt) { + + int fmt; + if (!strcmp(argv[i], "bsp29")) { + fmt = BSPVERSION; + } else if (!strcmp(argv[i], "bsp2")) { + fmt = BSP2VERSION; + } else if (!strcmp(argv[i], "bsp2rmq")) { + fmt = BSP2RMQVERSION; + } else if (!strcmp(argv[i], "q2bsp")) { + fmt = Q2_BSPVERSION; + } else { Error("Unsupported format %s", argv[i]); } - - ConvertBSPFormat(&bspdata, fmt); + + ConvertBSPFormat(fmt, &bspdata); StripExtension(source); strcat(source, "-"); @@ -672,7 +672,7 @@ main(int argc, char **argv) bsp2_dface_t* face = BSP_GetFace(bsp, fnum); face->texinfo = texinfonum; - ConvertBSPFormat(&bspdata, bspdata.loadversion); + ConvertBSPFormat(bspdata.loadversion, &bspdata); // Overwrite source bsp! WriteBSPFile(source, &bspdata); diff --git a/common/bspfile.cc b/common/bspfile.cc index 9f96e755..364f0e2a 100644 --- a/common/bspfile.cc +++ b/common/bspfile.cc @@ -23,45 +23,43 @@ #include -const bspversion_t bspver_generic { NO_VERSION, NO_VERSION, "mbsp", "generic BSP" }; -const bspversion_t bspver_q1 { BSPVERSION, NO_VERSION, "bsp29", "Quake BSP" }; -/* Hexen II doesn't use a separate version, but we can still use a separate tag/name for it */ -const bspversion_t bspver_h2 { BSPVERSION, NO_VERSION, "hexen2", "Hexen II BSP" }; -const bspversion_t bspver_bsp2 { BSP2VERSION, NO_VERSION, "bsp2", "Quake BSP2" }; -const bspversion_t bspver_bsp2rmq { BSP2RMQVERSION, NO_VERSION, "bsp2rmq", "Quake BSP2-RMQ" }; -const bspversion_t bspver_hl { BSPHLVERSION, NO_VERSION, "hl", "Half-Life BSP" }; -const bspversion_t bspver_q2 { Q2_BSPIDENT, Q2_BSPVERSION, "q2bsp", "Quake II BSP" }; -const bspversion_t bspver_qbism { Q2_QBISMIDENT, Q2_BSPVERSION, "qbism", "Quake II Qbism BSP" }; - static const char * -BSPVersionString(const bspversion_t *version) +BSPVersionString(int32_t version) { - if (version->name) { - return version->name; - } - static char buffers[2][20]; static int index; - char *buffer = buffers[1 & ++index]; - if (version->version != NO_VERSION) { - q_snprintf(buffer, sizeof(buffers[0]), "%d:%d", version->version, version->ident); - } else { - q_snprintf(buffer, sizeof(buffers[0]), "%d", version->version); + char *buffer; + + switch (version) { + case BSP2RMQVERSION: + return "BSP2rmq"; + case BSP2VERSION: + return "BSP2"; + case BSPHLVERSION: + return "HLBSP"; + case Q2_BSPVERSION: + return "Q2BSP"; + default: + buffer = buffers[1 & ++index]; + q_snprintf(buffer, sizeof(buffers[0]), "%d", version); + return buffer; } - return buffer; } static qboolean -BSPVersionSupported(int32_t ident, int32_t version, const bspversion_t **out_version) +BSPVersionSupported(int32_t version) { - for (const bspversion_t *bspver : bspversions) { - if (bspver->ident == ident && bspver->version == version) { - *out_version = bspver; - return true; - } + switch (version) { + case BSPVERSION: + case BSP2VERSION: + case BSP2RMQVERSION: + case BSPHLVERSION: + return true; + case Q2_BSPVERSION: + return true; + default: + return false; } - - return false; } /* @@ -570,200 +568,6 @@ void Q2_SwapBSPFile (q2bsp_t *bsp, qboolean todisk) } } -/* -============= -Q2_Qbism_SwapBSPFile - -Byte swaps all data in a bsp file. -============= -*/ -void Q2_Qbism_SwapBSPFile (q2bsp_qbism_t *bsp, qboolean todisk) -{ - int i, j; - q2_dmodel_t *d; - - - // models - for (i=0 ; inummodels ; i++) - { - d = &bsp->dmodels[i]; - - d->firstface = LittleLong (d->firstface); - d->numfaces = LittleLong (d->numfaces); - d->headnode = LittleLong (d->headnode); - - for (j=0 ; j<3 ; j++) - { - d->mins[j] = LittleFloat(d->mins[j]); - d->maxs[j] = LittleFloat(d->maxs[j]); - d->origin[j] = LittleFloat(d->origin[j]); - } - } - - // - // vertexes - // - for (i=0 ; inumvertexes ; i++) - { - for (j=0 ; j<3 ; j++) - bsp->dvertexes[i].point[j] = LittleFloat (bsp->dvertexes[i].point[j]); - } - - // - // planes - // - for (i=0 ; inumplanes ; i++) - { - for (j=0 ; j<3 ; j++) - bsp->dplanes[i].normal[j] = LittleFloat (bsp->dplanes[i].normal[j]); - bsp->dplanes[i].dist = LittleFloat (bsp->dplanes[i].dist); - bsp->dplanes[i].type = LittleLong (bsp->dplanes[i].type); - } - - // - // texinfos - // - for (i=0 ; inumtexinfo ; i++) - { - for (j=0 ; j<4 ; j++) - { - bsp->texinfo[i].vecs[0][j] = LittleFloat(bsp->texinfo[i].vecs[0][j]); - bsp->texinfo[i].vecs[1][j] = LittleFloat(bsp->texinfo[i].vecs[1][j]); - } - bsp->texinfo[i].flags = LittleLong (bsp->texinfo[i].flags); - bsp->texinfo[i].value = LittleLong (bsp->texinfo[i].value); - bsp->texinfo[i].nexttexinfo = LittleLong (bsp->texinfo[i].nexttexinfo); - } - - // - // faces - // - for (i=0 ; inumfaces ; i++) - { - bsp->dfaces[i].texinfo = LittleLong (bsp->dfaces[i].texinfo); - bsp->dfaces[i].planenum = LittleLong (bsp->dfaces[i].planenum); - bsp->dfaces[i].side = LittleLong (bsp->dfaces[i].side); - bsp->dfaces[i].lightofs = LittleLong (bsp->dfaces[i].lightofs); - bsp->dfaces[i].firstedge = LittleLong (bsp->dfaces[i].firstedge); - bsp->dfaces[i].numedges = LittleLong (bsp->dfaces[i].numedges); - } - - // - // nodes - // - for (i=0 ; inumnodes ; i++) - { - bsp->dnodes[i].planenum = LittleLong (bsp->dnodes[i].planenum); - for (j=0 ; j<3 ; j++) - { - bsp->dnodes[i].mins[j] = LittleFloat (bsp->dnodes[i].mins[j]); - bsp->dnodes[i].maxs[j] = LittleFloat (bsp->dnodes[i].maxs[j]); - } - bsp->dnodes[i].children[0] = LittleLong (bsp->dnodes[i].children[0]); - bsp->dnodes[i].children[1] = LittleLong (bsp->dnodes[i].children[1]); - bsp->dnodes[i].firstface = LittleLong (bsp->dnodes[i].firstface); - bsp->dnodes[i].numfaces = LittleLong (bsp->dnodes[i].numfaces); - } - - // - // leafs - // - for (i=0 ; inumleafs ; i++) - { - bsp->dleafs[i].contents = LittleLong (bsp->dleafs[i].contents); - bsp->dleafs[i].cluster = LittleLong (bsp->dleafs[i].cluster); - bsp->dleafs[i].area = LittleLong (bsp->dleafs[i].area); - for (j=0 ; j<3 ; j++) - { - bsp->dleafs[i].mins[j] = LittleFloat (bsp->dleafs[i].mins[j]); - bsp->dleafs[i].maxs[j] = LittleFloat (bsp->dleafs[i].maxs[j]); - } - - bsp->dleafs[i].firstleafface = LittleLong (bsp->dleafs[i].firstleafface); - bsp->dleafs[i].numleaffaces = LittleLong (bsp->dleafs[i].numleaffaces); - bsp->dleafs[i].firstleafbrush = LittleLong (bsp->dleafs[i].firstleafbrush); - bsp->dleafs[i].numleafbrushes = LittleLong (bsp->dleafs[i].numleafbrushes); - } - - // - // leaffaces - // - for (i=0 ; inumleaffaces ; i++) - bsp->dleaffaces[i] = LittleLong (bsp->dleaffaces[i]); - - // - // leafbrushes - // - for (i=0 ; inumleafbrushes ; i++) - bsp->dleafbrushes[i] = LittleLong (bsp->dleafbrushes[i]); - - // - // surfedges - // - for (i=0 ; inumsurfedges ; i++) - bsp->dsurfedges[i] = LittleLong (bsp->dsurfedges[i]); - - // - // edges - // - for (i=0 ; inumedges ; i++) - { - bsp->dedges[i].v[0] = LittleLong (bsp->dedges[i].v[0]); - bsp->dedges[i].v[1] = LittleLong (bsp->dedges[i].v[1]); - } - - // - // brushes - // - for (i=0 ; inumbrushes ; i++) - { - bsp->dbrushes[i].firstside = LittleLong (bsp->dbrushes[i].firstside); - bsp->dbrushes[i].numsides = LittleLong (bsp->dbrushes[i].numsides); - bsp->dbrushes[i].contents = LittleLong (bsp->dbrushes[i].contents); - } - - // - // areas - // - for (i=0 ; inumareas ; i++) - { - bsp->dareas[i].numareaportals = LittleLong (bsp->dareas[i].numareaportals); - bsp->dareas[i].firstareaportal = LittleLong (bsp->dareas[i].firstareaportal); - } - - // - // areasportals - // - for (i=0 ; inumareaportals ; i++) - { - bsp->dareaportals[i].portalnum = LittleLong (bsp->dareaportals[i].portalnum); - bsp->dareaportals[i].otherarea = LittleLong (bsp->dareaportals[i].otherarea); - } - - // - // brushsides - // - for (i=0 ; inumbrushsides ; i++) - { - bsp->dbrushsides[i].planenum = LittleLong (bsp->dbrushsides[i].planenum); - bsp->dbrushsides[i].texinfo = LittleLong (bsp->dbrushsides[i].texinfo); - } - - // - // visibility - // - if (todisk) - j = bsp->dvis->numclusters; - else - j = LittleLong(bsp->dvis->numclusters); - bsp->dvis->numclusters = LittleLong (bsp->dvis->numclusters); - for (i=0 ; idvis->bitofs[i][0] = LittleLong (bsp->dvis->bitofs[i][0]); - bsp->dvis->bitofs[i][1] = LittleLong (bsp->dvis->bitofs[i][1]); - } -} - /* * ============= * SwapBSPFile @@ -773,17 +577,15 @@ void Q2_Qbism_SwapBSPFile (q2bsp_qbism_t *bsp, qboolean todisk) static void SwapBSPFile(bspdata_t *bspdata, swaptype_t swap) { - if (bspdata->version == &bspver_q2) { + if (bspdata->version == Q2_BSPVERSION) { q2bsp_t *bsp = &bspdata->data.q2bsp; + Q2_SwapBSPFile(bsp, swap == TO_DISK); - return; - } else if (bspdata->version == &bspver_qbism) { - q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; - Q2_Qbism_SwapBSPFile(bsp, swap == TO_DISK); + return; } - if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { + if (bspdata->version == BSPVERSION || bspdata->version == BSPHLVERSION) { bsp29_t *bsp = &bspdata->data.bsp29; SwapBSPVertexes(bsp->numvertexes, bsp->dvertexes); @@ -802,7 +604,7 @@ SwapBSPFile(bspdata_t *bspdata, swaptype_t swap) return; } - if (bspdata->version == &bspver_bsp2rmq) { + if (bspdata->version == BSP2RMQVERSION) { bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; SwapBSPVertexes(bsp->numvertexes, bsp->dvertexes); @@ -821,7 +623,7 @@ SwapBSPFile(bspdata_t *bspdata, swaptype_t swap) return; } - if (bspdata->version == &bspver_bsp2) { + if (bspdata->version == BSP2VERSION) { bsp2_t *bsp = &bspdata->data.bsp2; SwapBSPVertexes(bsp->numvertexes, bsp->dvertexes); @@ -1013,33 +815,6 @@ Q2BSPtoM_Leafs(const q2_dleaf_t *dleafsq2, int numleafs) { return newdata; } -static mleaf_t * -Q2BSP_QBSPtoM_Leafs(const q2_dleaf_qbism_t *dleafsq2, int numleafs) { - const q2_dleaf_qbism_t *dleafq2 = dleafsq2; - mleaf_t *newdata, *mleaf; - int i, j; - - newdata = mleaf = (mleaf_t *)calloc(numleafs, sizeof(*mleaf)); - - for (i = 0; i < numleafs; i++, dleafq2++, mleaf++) { - mleaf->contents = dleafq2->contents; - mleaf->cluster = dleafq2->cluster; - mleaf->area = dleafq2->area; - - for (j = 0; j < 3; j++) { - mleaf->mins[j] = dleafq2->mins[j]; - mleaf->maxs[j] = dleafq2->maxs[j]; - } - mleaf->firstmarksurface = dleafq2->firstleafface; - mleaf->nummarksurfaces = dleafq2->numleaffaces; - - mleaf->firstleafbrush = dleafq2->firstleafbrush; - mleaf->numleafbrushes = dleafq2->numleafbrushes; - } - - return newdata; -} - static q2_dleaf_t * MBSPtoQ2_Leafs(const mleaf_t *mleafs, int numleafs) { const mleaf_t *mleaf = mleafs; @@ -1067,33 +842,6 @@ MBSPtoQ2_Leafs(const mleaf_t *mleafs, int numleafs) { return newdata; } -static q2_dleaf_qbism_t * -MBSPtoQ2_Qbism_Leafs(const mleaf_t *mleafs, int numleafs) { - const mleaf_t *mleaf = mleafs; - q2_dleaf_qbism_t *newdata, *dleafq2; - int i, j; - - newdata = dleafq2 = (q2_dleaf_qbism_t *)calloc(numleafs, sizeof(*dleafq2)); - - for (i = 0; i < numleafs; i++, mleaf++, dleafq2++) { - dleafq2->contents = mleaf->contents; - dleafq2->cluster = mleaf->cluster; - dleafq2->area = mleaf->area; - - for (j = 0; j < 3; j++) { - dleafq2->mins[j] = mleaf->mins[j]; - dleafq2->maxs[j] = mleaf->maxs[j]; - } - dleafq2->firstleafface = mleaf->firstmarksurface; - dleafq2->numleaffaces = mleaf->nummarksurfaces; - - dleafq2->firstleafbrush = mleaf->firstleafbrush; - dleafq2->numleafbrushes = mleaf->numleafbrushes; - } - - return newdata; -} - static bsp2_dnode_t * Q2BSPto2_Nodes(const q2_dnode_t *dnodesq2, int numnodes) { const q2_dnode_t *dnodeq2 = dnodesq2; @@ -1162,28 +910,6 @@ Q2BSPto2_Faces(const q2_dface_t *dfacesq2, int numfaces) { return newdata; } -static bsp2_dface_t * -Q2BSP_QBSPto2_Faces(const q2_dface_qbism_t *dfacesq2, int numfaces) { - const q2_dface_qbism_t *dfaceq2 = dfacesq2; - bsp2_dface_t *newdata, *dface2; - int i, j; - - newdata = dface2 = static_cast(malloc(numfaces * sizeof(*dface2))); - - for (i = 0; i < numfaces; i++, dfaceq2++, dface2++) { - dface2->planenum = dfaceq2->planenum; - dface2->side = dfaceq2->side; - dface2->firstedge = dfaceq2->firstedge; - dface2->numedges = dfaceq2->numedges; - dface2->texinfo = dfaceq2->texinfo; - for (j = 0; j < MAXLIGHTMAPS; j++) - dface2->styles[j] = dfaceq2->styles[j]; - dface2->lightofs = dfaceq2->lightofs; - } - - return newdata; -} - static q2_dface_t * BSP2toQ2_Faces(const bsp2_dface_t *dfaces2, int numfaces) { const bsp2_dface_t *dface2 = dfaces2; @@ -1206,28 +932,6 @@ BSP2toQ2_Faces(const bsp2_dface_t *dfaces2, int numfaces) { return newdata; } -static q2_dface_qbism_t * -BSP2toQ2_Qbism_Faces(const bsp2_dface_t *dfaces2, int numfaces) { - const bsp2_dface_t *dface2 = dfaces2; - q2_dface_qbism_t *newdata, *dfaceq2; - int i, j; - - newdata = dfaceq2 = static_cast(malloc(numfaces * sizeof(*dfaceq2))); - - for (i = 0; i < numfaces; i++, dface2++, dfaceq2++) { - dfaceq2->planenum = dface2->planenum; - dfaceq2->side = dface2->side; - dfaceq2->firstedge = dface2->firstedge; - dfaceq2->numedges = dface2->numedges; - dfaceq2->texinfo = dface2->texinfo; - for (j = 0; j < MAXLIGHTMAPS; j++) - dfaceq2->styles[j] = dface2->styles[j]; - dfaceq2->lightofs = dface2->lightofs; - } - - return newdata; -} - static gtexinfo_t * Q2BSPtoM_Texinfo(const q2_texinfo_t *dtexinfosq2, int numtexinfos) { const q2_texinfo_t *dtexinfoq2 = dtexinfosq2; @@ -1713,37 +1417,9 @@ static bsp2_dnode_t *BSP2_CopyNodes(const bsp2_dnode_t *dnodes, int numnodes) return (bsp2_dnode_t *)CopyArray(dnodes, numnodes, sizeof(*dnodes)); } -static uint32_t *Q2BSPtoM_CopyLeafBrushes(const uint16_t *leafbrushes, int count) +static uint16_t *Q2BSP_CopyLeafBrushes(const uint16_t *leafbrushes, int count) { - const uint16_t *leafbrush = leafbrushes; - uint32_t *newdata, *leafbrushes2; - int i; - - newdata = leafbrushes2 = static_cast(malloc(count * sizeof(*leafbrushes2))); - - for (i = 0; i < count; i++, leafbrush++, leafbrushes2++) - *leafbrushes2 = *leafbrush; - - return newdata; -} - -static uint16_t *MBSPtoQ2_CopyLeafBrushes(const uint32_t *leafbrushes, int count) -{ - const uint32_t *leafbrush = leafbrushes; - uint16_t *newdata, *leafbrushes2; - int i; - - newdata = leafbrushes2 = static_cast(malloc(count * sizeof(*leafbrushes2))); - - for (i = 0; i < count; i++, leafbrush++, leafbrushes2++) - *leafbrushes2 = *leafbrush; - - return newdata; -} - -static uint32_t *Q2BSP_Qbism_CopyLeafBrushes(const uint32_t *leafbrushes, int count) -{ - return (uint32_t *)CopyArray(leafbrushes, count, sizeof(*leafbrushes)); + return (uint16_t *)CopyArray(leafbrushes, count, sizeof(*leafbrushes)); } static darea_t *Q2BSP_CopyAreas(const darea_t *areas, int count) @@ -1761,41 +1437,9 @@ static dbrush_t *Q2BSP_CopyBrushes(const dbrush_t *brushes, int count) return (dbrush_t *)CopyArray(brushes, count, sizeof(*brushes)); } -static q2_dbrushside_qbism_t *Q2BSPtoM_CopyBrushSides(const dbrushside_t *dbrushsides, int count) +static dbrushside_t *Q2BSP_CopyBrushSides(const dbrushside_t *dbrushsides, int count) { - const dbrushside_t *brushside = dbrushsides; - q2_dbrushside_qbism_t *newdata, *brushsides2; - int i; - - newdata = brushsides2 = static_cast(malloc(count * sizeof(*brushsides2))); - - for (i = 0; i < count; i++, brushside++, brushsides2++) { - brushsides2->planenum = brushside->planenum; - brushsides2->texinfo = brushside->texinfo; - } - - return newdata; -} - -static q2_dbrushside_qbism_t *Q2BSP_Qbism_CopyBrushSides(const q2_dbrushside_qbism_t *brushsides, int count) -{ - return (q2_dbrushside_qbism_t *)CopyArray(brushsides, count, sizeof(*brushsides)); -} - -static dbrushside_t *MBSPtoQ2_CopyBrushSides(const q2_dbrushside_qbism_t *dbrushsides, int count) -{ - const q2_dbrushside_qbism_t *brushside = dbrushsides; - dbrushside_t *newdata, *brushsides2; - int i; - - newdata = brushsides2 = static_cast(malloc(count * sizeof(*brushsides2))); - - for (i = 0; i < count; i++, brushside++, brushsides2++) { - brushsides2->planenum = brushside->planenum; - brushsides2->texinfo = brushside->texinfo; - } - - return newdata; + return (dbrushside_t *)CopyArray(dbrushsides, count, sizeof(*dbrushsides)); } @@ -1888,29 +1532,6 @@ static void FreeQ2BSP(q2bsp_t *bsp) memset(bsp, 0, sizeof(*bsp)); } -static void FreeQ2BSP_QBSP(q2bsp_qbism_t *bsp) -{ - free(bsp->dmodels); - free(bsp->dvis); - free(bsp->dlightdata); - free(bsp->dentdata); - free(bsp->dleafs); - free(bsp->dplanes); - free(bsp->dvertexes); - free(bsp->dnodes); - free(bsp->texinfo); - free(bsp->dfaces); - free(bsp->dedges); - free(bsp->dleaffaces); - free(bsp->dleafbrushes); - free(bsp->dsurfedges); - free(bsp->dareas); - free(bsp->dareaportals); - free(bsp->dbrushes); - free(bsp->dbrushsides); - memset(bsp, 0, sizeof(*bsp)); -} - static void FreeMBSP(mbsp_t *bsp) { free(bsp->dmodels); @@ -1937,13 +1558,6 @@ static void FreeMBSP(mbsp_t *bsp) memset(bsp, 0, sizeof(*bsp)); } -inline void -ConvertBSPToMFormatComplete(const bspversion_t **mbsp_loadversion, const bspversion_t *version, bspdata_t *bspdata) -{ - *mbsp_loadversion = bspdata->version; - bspdata->version = version; -} - /* * ========================================================================= * ConvertBSPFormat @@ -1952,547 +1566,440 @@ ConvertBSPToMFormatComplete(const bspversion_t **mbsp_loadversion, const bspvers * ========================================================================= */ void -ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) +ConvertBSPFormat(int32_t version, bspdata_t *bspdata) { - if (bspdata->version == to_version) + if (bspdata->version == version) return; // conversions to GENERIC_BSP - if (to_version == &bspver_generic) { - if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { - const bsp29_t *bsp29 = &bspdata->data.bsp29; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); - - // copy counts - mbsp->nummodels = bsp29->nummodels; - mbsp->visdatasize = bsp29->visdatasize; - mbsp->lightdatasize = bsp29->lightdatasize; - mbsp->texdatasize = bsp29->texdatasize; - mbsp->entdatasize = bsp29->entdatasize; - mbsp->numleafs = bsp29->numleafs; - mbsp->numplanes = bsp29->numplanes; - mbsp->numvertexes = bsp29->numvertexes; - mbsp->numnodes = bsp29->numnodes; - mbsp->numtexinfo = bsp29->numtexinfo; - mbsp->numfaces = bsp29->numfaces; - mbsp->numclipnodes = bsp29->numclipnodes; - mbsp->numedges = bsp29->numedges; - mbsp->numleaffaces = bsp29->nummarksurfaces; - mbsp->numsurfedges = bsp29->numsurfedges; - - // copy or convert data - mbsp->dmodels = BSP29_CopyModels(bsp29->dmodels, bsp29->nummodels); - mbsp->dvisdata = BSP29_CopyVisData(bsp29->dvisdata, bsp29->visdatasize); - mbsp->dlightdata = BSP29_CopyLightData(bsp29->dlightdata, bsp29->lightdatasize); - mbsp->dtexdata = BSP29_CopyTexData(bsp29->dtexdata, bsp29->texdatasize); - mbsp->dentdata = BSP29_CopyEntData(bsp29->dentdata, bsp29->entdatasize); - mbsp->dleafs = BSP29toM_Leafs(bsp29->dleafs, bsp29->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(bsp29->dplanes, bsp29->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(bsp29->dvertexes, bsp29->numvertexes); - mbsp->dnodes = BSP29to2_Nodes(bsp29->dnodes, bsp29->numnodes); - mbsp->texinfo = BSP29toM_Texinfo(bsp29->texinfo, bsp29->numtexinfo); - mbsp->dfaces = BSP29to2_Faces(bsp29->dfaces, bsp29->numfaces); - mbsp->dclipnodes = BSP29to2_Clipnodes(bsp29->dclipnodes, bsp29->numclipnodes); - mbsp->dedges = BSP29to2_Edges(bsp29->dedges, bsp29->numedges); - mbsp->dleaffaces = BSP29to2_Marksurfaces(bsp29->dmarksurfaces, bsp29->nummarksurfaces); - mbsp->dsurfedges = BSP29_CopySurfedges(bsp29->dsurfedges, bsp29->numsurfedges); - - /* Free old data */ - FreeBSP29((bsp29_t *)bsp29); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return; - } - else if (bspdata->version == &bspver_q2) { - const q2bsp_t *q2bsp = &bspdata->data.q2bsp; - mbsp_t *mbsp = &bspdata->data.mbsp; + if ((bspdata->version == BSPVERSION || bspdata->version == BSPHLVERSION) && version == GENERIC_BSP) { + const bsp29_t *bsp29 = &bspdata->data.bsp29; + mbsp_t *mbsp = &bspdata->data.mbsp; - memset(mbsp, 0, sizeof(*mbsp)); + memset(mbsp, 0, sizeof(*mbsp)); - // copy counts - mbsp->nummodels = q2bsp->nummodels; - mbsp->visdatasize = q2bsp->visdatasize; - mbsp->lightdatasize = q2bsp->lightdatasize; - mbsp->entdatasize = q2bsp->entdatasize; - mbsp->numleafs = q2bsp->numleafs; - mbsp->numplanes = q2bsp->numplanes; - mbsp->numvertexes = q2bsp->numvertexes; - mbsp->numnodes = q2bsp->numnodes; - mbsp->numtexinfo = q2bsp->numtexinfo; - mbsp->numfaces = q2bsp->numfaces; - mbsp->numedges = q2bsp->numedges; - mbsp->numleaffaces = q2bsp->numleaffaces; - mbsp->numleafbrushes = q2bsp->numleafbrushes; - mbsp->numsurfedges = q2bsp->numsurfedges; - mbsp->numareas = q2bsp->numareas; - mbsp->numareaportals = q2bsp->numareaportals; - mbsp->numbrushes = q2bsp->numbrushes; - mbsp->numbrushsides = q2bsp->numbrushsides; + // copy counts + mbsp->nummodels = bsp29->nummodels; + mbsp->visdatasize = bsp29->visdatasize; + mbsp->lightdatasize = bsp29->lightdatasize; + mbsp->texdatasize = bsp29->texdatasize; + mbsp->entdatasize = bsp29->entdatasize; + mbsp->numleafs = bsp29->numleafs; + mbsp->numplanes = bsp29->numplanes; + mbsp->numvertexes = bsp29->numvertexes; + mbsp->numnodes = bsp29->numnodes; + mbsp->numtexinfo = bsp29->numtexinfo; + mbsp->numfaces = bsp29->numfaces; + mbsp->numclipnodes = bsp29->numclipnodes; + mbsp->numedges = bsp29->numedges; + mbsp->numleaffaces = bsp29->nummarksurfaces; + mbsp->numsurfedges = bsp29->numsurfedges; - // copy or convert data - mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); - mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); - mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); - mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); - mbsp->dleafs = Q2BSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(q2bsp->dplanes, q2bsp->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(q2bsp->dvertexes, q2bsp->numvertexes); - mbsp->dnodes = Q2BSPto2_Nodes(q2bsp->dnodes, q2bsp->numnodes); - mbsp->texinfo = Q2BSPtoM_Texinfo(q2bsp->texinfo, q2bsp->numtexinfo); - mbsp->dfaces = Q2BSPto2_Faces(q2bsp->dfaces, q2bsp->numfaces); - mbsp->dedges = BSP29to2_Edges(q2bsp->dedges, q2bsp->numedges); - mbsp->dleaffaces = BSP29to2_Marksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); - mbsp->dleafbrushes = Q2BSPtoM_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); - mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); + // copy or convert data + mbsp->dmodels = BSP29_CopyModels(bsp29->dmodels, bsp29->nummodels); + mbsp->dvisdata = BSP29_CopyVisData(bsp29->dvisdata, bsp29->visdatasize); + mbsp->dlightdata = BSP29_CopyLightData(bsp29->dlightdata, bsp29->lightdatasize); + mbsp->dtexdata = BSP29_CopyTexData(bsp29->dtexdata, bsp29->texdatasize); + mbsp->dentdata = BSP29_CopyEntData(bsp29->dentdata, bsp29->entdatasize); + mbsp->dleafs = BSP29toM_Leafs(bsp29->dleafs, bsp29->numleafs); + mbsp->dplanes = BSP29_CopyPlanes(bsp29->dplanes, bsp29->numplanes); + mbsp->dvertexes = BSP29_CopyVertexes(bsp29->dvertexes, bsp29->numvertexes); + mbsp->dnodes = BSP29to2_Nodes(bsp29->dnodes, bsp29->numnodes); + mbsp->texinfo = BSP29toM_Texinfo(bsp29->texinfo, bsp29->numtexinfo); + mbsp->dfaces = BSP29to2_Faces(bsp29->dfaces, bsp29->numfaces); + mbsp->dclipnodes = BSP29to2_Clipnodes(bsp29->dclipnodes, bsp29->numclipnodes); + mbsp->dedges = BSP29to2_Edges(bsp29->dedges, bsp29->numedges); + mbsp->dleaffaces = BSP29to2_Marksurfaces(bsp29->dmarksurfaces, bsp29->nummarksurfaces); + mbsp->dsurfedges = BSP29_CopySurfedges(bsp29->dsurfedges, bsp29->numsurfedges); - mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); - mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); + /* Free old data */ + FreeBSP29((bsp29_t *)bsp29); - mbsp->dbrushes = Q2BSP_CopyBrushes(q2bsp->dbrushes, q2bsp->numbrushes); - mbsp->dbrushsides = Q2BSPtoM_CopyBrushSides(q2bsp->dbrushsides, q2bsp->numbrushsides); + /* Conversion complete! */ + mbsp->loadversion = bspdata->version; + bspdata->version = version; - /* Free old data */ - FreeQ2BSP((q2bsp_t *)q2bsp); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return; - } else if (bspdata->version == &bspver_qbism) { - const q2bsp_qbism_t *q2bsp = &bspdata->data.q2bsp_qbism; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); - - // copy counts - mbsp->nummodels = q2bsp->nummodels; - mbsp->visdatasize = q2bsp->visdatasize; - mbsp->lightdatasize = q2bsp->lightdatasize; - mbsp->entdatasize = q2bsp->entdatasize; - mbsp->numleafs = q2bsp->numleafs; - mbsp->numplanes = q2bsp->numplanes; - mbsp->numvertexes = q2bsp->numvertexes; - mbsp->numnodes = q2bsp->numnodes; - mbsp->numtexinfo = q2bsp->numtexinfo; - mbsp->numfaces = q2bsp->numfaces; - mbsp->numedges = q2bsp->numedges; - mbsp->numleaffaces = q2bsp->numleaffaces; - mbsp->numleafbrushes = q2bsp->numleafbrushes; - mbsp->numsurfedges = q2bsp->numsurfedges; - mbsp->numareas = q2bsp->numareas; - mbsp->numareaportals = q2bsp->numareaportals; - mbsp->numbrushes = q2bsp->numbrushes; - mbsp->numbrushsides = q2bsp->numbrushsides; - - // copy or convert data - mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); - mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); - mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); - mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); - mbsp->dleafs = Q2BSP_QBSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(q2bsp->dplanes, q2bsp->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(q2bsp->dvertexes, q2bsp->numvertexes); - mbsp->dnodes = BSP2_CopyNodes(q2bsp->dnodes, q2bsp->numnodes); - mbsp->texinfo = Q2BSPtoM_Texinfo(q2bsp->texinfo, q2bsp->numtexinfo); - mbsp->dfaces = Q2BSP_QBSPto2_Faces(q2bsp->dfaces, q2bsp->numfaces); - mbsp->dedges = BSP2_CopyEdges(q2bsp->dedges, q2bsp->numedges); - mbsp->dleaffaces = BSP2_CopyMarksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); - mbsp->dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); - mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); - - mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); - mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); - - mbsp->dbrushes = Q2BSP_CopyBrushes(q2bsp->dbrushes, q2bsp->numbrushes); - mbsp->dbrushsides = Q2BSP_Qbism_CopyBrushSides(q2bsp->dbrushsides, q2bsp->numbrushsides); - - /* Free old data */ - FreeQ2BSP_QBSP((q2bsp_qbism_t *)q2bsp); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return; - } - - else if (bspdata->version == &bspver_bsp2rmq) { - const bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); - - // copy counts - mbsp->nummodels = bsp2rmq->nummodels; - mbsp->visdatasize = bsp2rmq->visdatasize; - mbsp->lightdatasize = bsp2rmq->lightdatasize; - mbsp->texdatasize = bsp2rmq->texdatasize; - mbsp->entdatasize = bsp2rmq->entdatasize; - mbsp->numleafs = bsp2rmq->numleafs; - mbsp->numplanes = bsp2rmq->numplanes; - mbsp->numvertexes = bsp2rmq->numvertexes; - mbsp->numnodes = bsp2rmq->numnodes; - mbsp->numtexinfo = bsp2rmq->numtexinfo; - mbsp->numfaces = bsp2rmq->numfaces; - mbsp->numclipnodes = bsp2rmq->numclipnodes; - mbsp->numedges = bsp2rmq->numedges; - mbsp->numleaffaces = bsp2rmq->nummarksurfaces; - mbsp->numsurfedges = bsp2rmq->numsurfedges; - - // copy or convert data - mbsp->dmodels = BSP29_CopyModels(bsp2rmq->dmodels, bsp2rmq->nummodels); - mbsp->dvisdata = BSP29_CopyVisData(bsp2rmq->dvisdata, bsp2rmq->visdatasize); - mbsp->dlightdata = BSP29_CopyLightData(bsp2rmq->dlightdata, bsp2rmq->lightdatasize); - mbsp->dtexdata = BSP29_CopyTexData(bsp2rmq->dtexdata, bsp2rmq->texdatasize); - mbsp->dentdata = BSP29_CopyEntData(bsp2rmq->dentdata, bsp2rmq->entdatasize); - mbsp->dleafs = BSP2rmqtoM_Leafs(bsp2rmq->dleafs, bsp2rmq->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(bsp2rmq->dplanes, bsp2rmq->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(bsp2rmq->dvertexes, bsp2rmq->numvertexes); - mbsp->dnodes = BSP2rmqto2_Nodes(bsp2rmq->dnodes, bsp2rmq->numnodes); - mbsp->texinfo = BSP29toM_Texinfo(bsp2rmq->texinfo, bsp2rmq->numtexinfo); - mbsp->dfaces = BSP2_CopyFaces(bsp2rmq->dfaces, bsp2rmq->numfaces); - mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2rmq->dclipnodes, bsp2rmq->numclipnodes); - mbsp->dedges = BSP2_CopyEdges(bsp2rmq->dedges, bsp2rmq->numedges); - mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2rmq->dmarksurfaces, bsp2rmq->nummarksurfaces); - mbsp->dsurfedges = BSP29_CopySurfedges(bsp2rmq->dsurfedges, bsp2rmq->numsurfedges); - - /* Free old data */ - FreeBSP2RMQ((bsp2rmq_t *)bsp2rmq); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return; - } - - else if (bspdata->version == &bspver_bsp2) { - const bsp2_t *bsp2 = &bspdata->data.bsp2; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); - - // copy counts - mbsp->nummodels = bsp2->nummodels; - mbsp->visdatasize = bsp2->visdatasize; - mbsp->lightdatasize = bsp2->lightdatasize; - mbsp->texdatasize = bsp2->texdatasize; - mbsp->entdatasize = bsp2->entdatasize; - mbsp->numleafs = bsp2->numleafs; - mbsp->numplanes = bsp2->numplanes; - mbsp->numvertexes = bsp2->numvertexes; - mbsp->numnodes = bsp2->numnodes; - mbsp->numtexinfo = bsp2->numtexinfo; - mbsp->numfaces = bsp2->numfaces; - mbsp->numclipnodes = bsp2->numclipnodes; - mbsp->numedges = bsp2->numedges; - mbsp->numleaffaces = bsp2->nummarksurfaces; - mbsp->numsurfedges = bsp2->numsurfedges; - - // copy or convert data - mbsp->dmodels = BSP29_CopyModels(bsp2->dmodels, bsp2->nummodels); - mbsp->dvisdata = BSP29_CopyVisData(bsp2->dvisdata, bsp2->visdatasize); - mbsp->dlightdata = BSP29_CopyLightData(bsp2->dlightdata, bsp2->lightdatasize); - mbsp->dtexdata = BSP29_CopyTexData(bsp2->dtexdata, bsp2->texdatasize); - mbsp->dentdata = BSP29_CopyEntData(bsp2->dentdata, bsp2->entdatasize); - mbsp->dleafs = BSP2toM_Leafs(bsp2->dleafs, bsp2->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(bsp2->dplanes, bsp2->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(bsp2->dvertexes, bsp2->numvertexes); - mbsp->dnodes = BSP2_CopyNodes(bsp2->dnodes, bsp2->numnodes); - mbsp->texinfo = BSP29toM_Texinfo(bsp2->texinfo, bsp2->numtexinfo); - mbsp->dfaces = BSP2_CopyFaces(bsp2->dfaces, bsp2->numfaces); - mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2->dclipnodes, bsp2->numclipnodes); - mbsp->dedges = BSP2_CopyEdges(bsp2->dedges, bsp2->numedges); - mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2->dmarksurfaces, bsp2->nummarksurfaces); - mbsp->dsurfedges = BSP29_CopySurfedges(bsp2->dsurfedges, bsp2->numsurfedges); - - /* Free old data */ - FreeBSP2((bsp2_t *)bsp2); - - /* Conversion complete! */ - ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - - return; - } + return; } + + if (bspdata->version == Q2_BSPVERSION && version == GENERIC_BSP) { + const q2bsp_t *q2bsp = &bspdata->data.q2bsp; + mbsp_t *mbsp = &bspdata->data.mbsp; + + memset(mbsp, 0, sizeof(*mbsp)); + + // copy counts + mbsp->nummodels = q2bsp->nummodels; + mbsp->visdatasize = q2bsp->visdatasize; + mbsp->lightdatasize = q2bsp->lightdatasize; + mbsp->entdatasize = q2bsp->entdatasize; + mbsp->numleafs = q2bsp->numleafs; + mbsp->numplanes = q2bsp->numplanes; + mbsp->numvertexes = q2bsp->numvertexes; + mbsp->numnodes = q2bsp->numnodes; + mbsp->numtexinfo = q2bsp->numtexinfo; + mbsp->numfaces = q2bsp->numfaces; + mbsp->numedges = q2bsp->numedges; + mbsp->numleaffaces = q2bsp->numleaffaces; + mbsp->numleafbrushes = q2bsp->numleafbrushes; + mbsp->numsurfedges = q2bsp->numsurfedges; + mbsp->numareas = q2bsp->numareas; + mbsp->numareaportals = q2bsp->numareaportals; + mbsp->numbrushes = q2bsp->numbrushes; + mbsp->numbrushsides = q2bsp->numbrushsides; + + // copy or convert data + mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); + mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); + mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); + mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); + mbsp->dleafs = Q2BSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); + mbsp->dplanes = BSP29_CopyPlanes(q2bsp->dplanes, q2bsp->numplanes); + mbsp->dvertexes = BSP29_CopyVertexes(q2bsp->dvertexes, q2bsp->numvertexes); + mbsp->dnodes = Q2BSPto2_Nodes(q2bsp->dnodes, q2bsp->numnodes); + mbsp->texinfo = Q2BSPtoM_Texinfo(q2bsp->texinfo, q2bsp->numtexinfo); + mbsp->dfaces = Q2BSPto2_Faces(q2bsp->dfaces, q2bsp->numfaces); + mbsp->dedges = BSP29to2_Edges(q2bsp->dedges, q2bsp->numedges); + mbsp->dleaffaces = BSP29to2_Marksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); + mbsp->dleafbrushes = Q2BSP_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); + mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); + + mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); + mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); + + mbsp->dbrushes = Q2BSP_CopyBrushes(q2bsp->dbrushes, q2bsp->numbrushes); + mbsp->dbrushsides = Q2BSP_CopyBrushSides(q2bsp->dbrushsides, q2bsp->numbrushsides); + + /* Free old data */ + FreeQ2BSP((q2bsp_t *)q2bsp); + + /* Conversion complete! */ + mbsp->loadversion = bspdata->version; + bspdata->version = version; + + return; + } + + if (bspdata->version == BSP2RMQVERSION && version == GENERIC_BSP) { + const bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; + mbsp_t *mbsp = &bspdata->data.mbsp; + + memset(mbsp, 0, sizeof(*mbsp)); + + // copy counts + mbsp->nummodels = bsp2rmq->nummodels; + mbsp->visdatasize = bsp2rmq->visdatasize; + mbsp->lightdatasize = bsp2rmq->lightdatasize; + mbsp->texdatasize = bsp2rmq->texdatasize; + mbsp->entdatasize = bsp2rmq->entdatasize; + mbsp->numleafs = bsp2rmq->numleafs; + mbsp->numplanes = bsp2rmq->numplanes; + mbsp->numvertexes = bsp2rmq->numvertexes; + mbsp->numnodes = bsp2rmq->numnodes; + mbsp->numtexinfo = bsp2rmq->numtexinfo; + mbsp->numfaces = bsp2rmq->numfaces; + mbsp->numclipnodes = bsp2rmq->numclipnodes; + mbsp->numedges = bsp2rmq->numedges; + mbsp->numleaffaces = bsp2rmq->nummarksurfaces; + mbsp->numsurfedges = bsp2rmq->numsurfedges; + + // copy or convert data + mbsp->dmodels = BSP29_CopyModels(bsp2rmq->dmodels, bsp2rmq->nummodels); + mbsp->dvisdata = BSP29_CopyVisData(bsp2rmq->dvisdata, bsp2rmq->visdatasize); + mbsp->dlightdata = BSP29_CopyLightData(bsp2rmq->dlightdata, bsp2rmq->lightdatasize); + mbsp->dtexdata = BSP29_CopyTexData(bsp2rmq->dtexdata, bsp2rmq->texdatasize); + mbsp->dentdata = BSP29_CopyEntData(bsp2rmq->dentdata, bsp2rmq->entdatasize); + mbsp->dleafs = BSP2rmqtoM_Leafs(bsp2rmq->dleafs, bsp2rmq->numleafs); + mbsp->dplanes = BSP29_CopyPlanes(bsp2rmq->dplanes, bsp2rmq->numplanes); + mbsp->dvertexes = BSP29_CopyVertexes(bsp2rmq->dvertexes, bsp2rmq->numvertexes); + mbsp->dnodes = BSP2rmqto2_Nodes(bsp2rmq->dnodes, bsp2rmq->numnodes); + mbsp->texinfo = BSP29toM_Texinfo(bsp2rmq->texinfo, bsp2rmq->numtexinfo); + mbsp->dfaces = BSP2_CopyFaces(bsp2rmq->dfaces, bsp2rmq->numfaces); + mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2rmq->dclipnodes, bsp2rmq->numclipnodes); + mbsp->dedges = BSP2_CopyEdges(bsp2rmq->dedges, bsp2rmq->numedges); + mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2rmq->dmarksurfaces, bsp2rmq->nummarksurfaces); + mbsp->dsurfedges = BSP29_CopySurfedges(bsp2rmq->dsurfedges, bsp2rmq->numsurfedges); + + /* Free old data */ + FreeBSP2RMQ((bsp2rmq_t *)bsp2rmq); + + /* Conversion complete! */ + mbsp->loadversion = bspdata->version; + bspdata->version = version; + + return; + } + + if (bspdata->version == BSP2VERSION && version == GENERIC_BSP) { + const bsp2_t *bsp2 = &bspdata->data.bsp2; + mbsp_t *mbsp = &bspdata->data.mbsp; + + memset(mbsp, 0, sizeof(*mbsp)); + + // copy counts + mbsp->nummodels = bsp2->nummodels; + mbsp->visdatasize = bsp2->visdatasize; + mbsp->lightdatasize = bsp2->lightdatasize; + mbsp->texdatasize = bsp2->texdatasize; + mbsp->entdatasize = bsp2->entdatasize; + mbsp->numleafs = bsp2->numleafs; + mbsp->numplanes = bsp2->numplanes; + mbsp->numvertexes = bsp2->numvertexes; + mbsp->numnodes = bsp2->numnodes; + mbsp->numtexinfo = bsp2->numtexinfo; + mbsp->numfaces = bsp2->numfaces; + mbsp->numclipnodes = bsp2->numclipnodes; + mbsp->numedges = bsp2->numedges; + mbsp->numleaffaces = bsp2->nummarksurfaces; + mbsp->numsurfedges = bsp2->numsurfedges; + + // copy or convert data + mbsp->dmodels = BSP29_CopyModels(bsp2->dmodels, bsp2->nummodels); + mbsp->dvisdata = BSP29_CopyVisData(bsp2->dvisdata, bsp2->visdatasize); + mbsp->dlightdata = BSP29_CopyLightData(bsp2->dlightdata, bsp2->lightdatasize); + mbsp->dtexdata = BSP29_CopyTexData(bsp2->dtexdata, bsp2->texdatasize); + mbsp->dentdata = BSP29_CopyEntData(bsp2->dentdata, bsp2->entdatasize); + mbsp->dleafs = BSP2toM_Leafs(bsp2->dleafs, bsp2->numleafs); + mbsp->dplanes = BSP29_CopyPlanes(bsp2->dplanes, bsp2->numplanes); + mbsp->dvertexes = BSP29_CopyVertexes(bsp2->dvertexes, bsp2->numvertexes); + mbsp->dnodes = BSP2_CopyNodes(bsp2->dnodes, bsp2->numnodes); + mbsp->texinfo = BSP29toM_Texinfo(bsp2->texinfo, bsp2->numtexinfo); + mbsp->dfaces = BSP2_CopyFaces(bsp2->dfaces, bsp2->numfaces); + mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2->dclipnodes, bsp2->numclipnodes); + mbsp->dedges = BSP2_CopyEdges(bsp2->dedges, bsp2->numedges); + mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2->dmarksurfaces, bsp2->nummarksurfaces); + mbsp->dsurfedges = BSP29_CopySurfedges(bsp2->dsurfedges, bsp2->numsurfedges); + + /* Free old data */ + FreeBSP2((bsp2_t *)bsp2); + + /* Conversion complete! */ + mbsp->loadversion = bspdata->version; + bspdata->version = version; + + return; + } + // conversions from GENERIC_BSP - else if (bspdata->version == &bspver_generic) { - if (to_version == &bspver_q1 || to_version == &bspver_h2 || to_version == &bspver_hl) { - bsp29_t *bsp29 = &bspdata->data.bsp29; - const mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(bsp29, 0, sizeof(*bsp29)); - - // copy counts - bsp29->nummodels = mbsp->nummodels; - bsp29->visdatasize = mbsp->visdatasize; - bsp29->lightdatasize = mbsp->lightdatasize; - bsp29->texdatasize = mbsp->texdatasize; - bsp29->entdatasize = mbsp->entdatasize; - bsp29->numleafs = mbsp->numleafs; - bsp29->numplanes = mbsp->numplanes; - bsp29->numvertexes = mbsp->numvertexes; - bsp29->numnodes = mbsp->numnodes; - bsp29->numtexinfo = mbsp->numtexinfo; - bsp29->numfaces = mbsp->numfaces; - bsp29->numclipnodes = mbsp->numclipnodes; - bsp29->numedges = mbsp->numedges; - bsp29->nummarksurfaces = mbsp->numleaffaces; - bsp29->numsurfedges = mbsp->numsurfedges; - - // copy or convert data - bsp29->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); - bsp29->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); - bsp29->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - bsp29->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); - bsp29->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - bsp29->dleafs = MBSPto29_Leafs(mbsp->dleafs, mbsp->numleafs); - bsp29->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - bsp29->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - bsp29->dnodes = BSP2to29_Nodes(mbsp->dnodes, mbsp->numnodes); - bsp29->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - bsp29->dfaces = BSP2to29_Faces(mbsp->dfaces, mbsp->numfaces); - bsp29->dclipnodes = BSP2to29_Clipnodes(mbsp->dclipnodes, mbsp->numclipnodes); - bsp29->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); - bsp29->dmarksurfaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - bsp29->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - - /* Free old data */ - FreeMBSP((mbsp_t *)mbsp); - - /* Conversion complete! */ - bspdata->version = to_version; - - return; - } - else if (to_version == &bspver_q2) { - const mbsp_t *mbsp = &bspdata->data.mbsp; - q2bsp_t *q2bsp = &bspdata->data.q2bsp; + if (bspdata->version == GENERIC_BSP && (version == BSPVERSION || version == BSPHLVERSION)) { + bsp29_t *bsp29 = &bspdata->data.bsp29; + const mbsp_t *mbsp = &bspdata->data.mbsp; - memset(q2bsp, 0, sizeof(*q2bsp)); + memset(bsp29, 0, sizeof(*bsp29)); - // copy counts - q2bsp->nummodels = mbsp->nummodels; - q2bsp->visdatasize = mbsp->visdatasize; - q2bsp->lightdatasize = mbsp->lightdatasize; - q2bsp->entdatasize = mbsp->entdatasize; - q2bsp->numleafs = mbsp->numleafs; - q2bsp->numplanes = mbsp->numplanes; - q2bsp->numvertexes = mbsp->numvertexes; - q2bsp->numnodes = mbsp->numnodes; - q2bsp->numtexinfo = mbsp->numtexinfo; - q2bsp->numfaces = mbsp->numfaces; - q2bsp->numedges = mbsp->numedges; - q2bsp->numleaffaces = mbsp->numleaffaces; - q2bsp->numleafbrushes = mbsp->numleafbrushes; - q2bsp->numsurfedges = mbsp->numsurfedges; - q2bsp->numareas = mbsp->numareas; - q2bsp->numareaportals = mbsp->numareaportals; - q2bsp->numbrushes = mbsp->numbrushes; - q2bsp->numbrushsides = mbsp->numbrushsides; + // copy counts + bsp29->nummodels = mbsp->nummodels; + bsp29->visdatasize = mbsp->visdatasize; + bsp29->lightdatasize = mbsp->lightdatasize; + bsp29->texdatasize = mbsp->texdatasize; + bsp29->entdatasize = mbsp->entdatasize; + bsp29->numleafs = mbsp->numleafs; + bsp29->numplanes = mbsp->numplanes; + bsp29->numvertexes = mbsp->numvertexes; + bsp29->numnodes = mbsp->numnodes; + bsp29->numtexinfo = mbsp->numtexinfo; + bsp29->numfaces = mbsp->numfaces; + bsp29->numclipnodes = mbsp->numclipnodes; + bsp29->numedges = mbsp->numedges; + bsp29->nummarksurfaces = mbsp->numleaffaces; + bsp29->numsurfedges = mbsp->numsurfedges; - // copy or convert data - q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); - q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); - q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - q2bsp->dleafs = MBSPtoQ2_Leafs(mbsp->dleafs, mbsp->numleafs); - q2bsp->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - q2bsp->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - q2bsp->dnodes = BSP2toQ2_Nodes(mbsp->dnodes, mbsp->numnodes); - q2bsp->texinfo = MBSPtoQ2_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - q2bsp->dfaces = BSP2toQ2_Faces(mbsp->dfaces, mbsp->numfaces); - q2bsp->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); - q2bsp->dleaffaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - q2bsp->dleafbrushes = MBSPtoQ2_CopyLeafBrushes(mbsp->dleafbrushes, mbsp->numleafbrushes); - q2bsp->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + // copy or convert data + bsp29->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); + bsp29->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); + bsp29->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); + bsp29->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); + bsp29->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); + bsp29->dleafs = MBSPto29_Leafs(mbsp->dleafs, mbsp->numleafs); + bsp29->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); + bsp29->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); + bsp29->dnodes = BSP2to29_Nodes(mbsp->dnodes, mbsp->numnodes); + bsp29->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); + bsp29->dfaces = BSP2to29_Faces(mbsp->dfaces, mbsp->numfaces); + bsp29->dclipnodes = BSP2to29_Clipnodes(mbsp->dclipnodes, mbsp->numclipnodes); + bsp29->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); + bsp29->dmarksurfaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); + bsp29->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - q2bsp->dareas = Q2BSP_CopyAreas(mbsp->dareas, mbsp->numareas); - q2bsp->dareaportals = Q2BSP_CopyAreaPortals(mbsp->dareaportals, mbsp->numareaportals); + /* Free old data */ + FreeMBSP((mbsp_t *)mbsp); - q2bsp->dbrushes = Q2BSP_CopyBrushes(mbsp->dbrushes, mbsp->numbrushes); - q2bsp->dbrushsides = MBSPtoQ2_CopyBrushSides(mbsp->dbrushsides, mbsp->numbrushsides); + /* Conversion complete! */ + bspdata->version = version; - /* Free old data */ - FreeMBSP((mbsp_t *)mbsp); - - /* Conversion complete! */ - bspdata->version = to_version; - - return; - } else if (to_version == &bspver_qbism) { - const mbsp_t *mbsp = &bspdata->data.mbsp; - q2bsp_qbism_t *q2bsp = &bspdata->data.q2bsp_qbism; - - memset(q2bsp, 0, sizeof(*q2bsp)); - - // copy counts - q2bsp->nummodels = mbsp->nummodels; - q2bsp->visdatasize = mbsp->visdatasize; - q2bsp->lightdatasize = mbsp->lightdatasize; - q2bsp->entdatasize = mbsp->entdatasize; - q2bsp->numleafs = mbsp->numleafs; - q2bsp->numplanes = mbsp->numplanes; - q2bsp->numvertexes = mbsp->numvertexes; - q2bsp->numnodes = mbsp->numnodes; - q2bsp->numtexinfo = mbsp->numtexinfo; - q2bsp->numfaces = mbsp->numfaces; - q2bsp->numedges = mbsp->numedges; - q2bsp->numleaffaces = mbsp->numleaffaces; - q2bsp->numleafbrushes = mbsp->numleafbrushes; - q2bsp->numsurfedges = mbsp->numsurfedges; - q2bsp->numareas = mbsp->numareas; - q2bsp->numareaportals = mbsp->numareaportals; - q2bsp->numbrushes = mbsp->numbrushes; - q2bsp->numbrushsides = mbsp->numbrushsides; - - // copy or convert data - q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); - q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); - q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - q2bsp->dleafs = MBSPtoQ2_Qbism_Leafs(mbsp->dleafs, mbsp->numleafs); - q2bsp->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - q2bsp->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - q2bsp->dnodes = BSP2_CopyNodes(mbsp->dnodes, mbsp->numnodes); - q2bsp->texinfo = MBSPtoQ2_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - q2bsp->dfaces = BSP2toQ2_Qbism_Faces(mbsp->dfaces, mbsp->numfaces); - q2bsp->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); - q2bsp->dleaffaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - q2bsp->dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(mbsp->dleafbrushes, mbsp->numleafbrushes); - q2bsp->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - - q2bsp->dareas = Q2BSP_CopyAreas(mbsp->dareas, mbsp->numareas); - q2bsp->dareaportals = Q2BSP_CopyAreaPortals(mbsp->dareaportals, mbsp->numareaportals); - - q2bsp->dbrushes = Q2BSP_CopyBrushes(mbsp->dbrushes, mbsp->numbrushes); - q2bsp->dbrushsides = Q2BSP_Qbism_CopyBrushSides(mbsp->dbrushsides, mbsp->numbrushsides); - - /* Free old data */ - FreeMBSP((mbsp_t *)mbsp); - - /* Conversion complete! */ - bspdata->version = to_version; - - return; - } + return; + } - else if (to_version == &bspver_bsp2rmq) { - bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; - const mbsp_t *mbsp = &bspdata->data.mbsp; + if (bspdata->version == GENERIC_BSP && version == Q2_BSPVERSION) { + const mbsp_t *mbsp = &bspdata->data.mbsp; + q2bsp_t *q2bsp = &bspdata->data.q2bsp; - memset(bsp2rmq, 0, sizeof(*bsp2rmq)); + memset(q2bsp, 0, sizeof(*q2bsp)); - // copy counts - bsp2rmq->nummodels = mbsp->nummodels; - bsp2rmq->visdatasize = mbsp->visdatasize; - bsp2rmq->lightdatasize = mbsp->lightdatasize; - bsp2rmq->texdatasize = mbsp->texdatasize; - bsp2rmq->entdatasize = mbsp->entdatasize; - bsp2rmq->numleafs = mbsp->numleafs; - bsp2rmq->numplanes = mbsp->numplanes; - bsp2rmq->numvertexes = mbsp->numvertexes; - bsp2rmq->numnodes = mbsp->numnodes; - bsp2rmq->numtexinfo = mbsp->numtexinfo; - bsp2rmq->numfaces = mbsp->numfaces; - bsp2rmq->numclipnodes = mbsp->numclipnodes; - bsp2rmq->numedges = mbsp->numedges; - bsp2rmq->nummarksurfaces = mbsp->numleaffaces; - bsp2rmq->numsurfedges = mbsp->numsurfedges; + // copy counts + q2bsp->nummodels = mbsp->nummodels; + q2bsp->visdatasize = mbsp->visdatasize; + q2bsp->lightdatasize = mbsp->lightdatasize; + q2bsp->entdatasize = mbsp->entdatasize; + q2bsp->numleafs = mbsp->numleafs; + q2bsp->numplanes = mbsp->numplanes; + q2bsp->numvertexes = mbsp->numvertexes; + q2bsp->numnodes = mbsp->numnodes; + q2bsp->numtexinfo = mbsp->numtexinfo; + q2bsp->numfaces = mbsp->numfaces; + q2bsp->numedges = mbsp->numedges; + q2bsp->numleaffaces = mbsp->numleaffaces; + q2bsp->numleafbrushes = mbsp->numleafbrushes; + q2bsp->numsurfedges = mbsp->numsurfedges; + q2bsp->numareas = mbsp->numareas; + q2bsp->numareaportals = mbsp->numareaportals; + q2bsp->numbrushes = mbsp->numbrushes; + q2bsp->numbrushsides = mbsp->numbrushsides; - // copy or convert data - bsp2rmq->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); - bsp2rmq->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); - bsp2rmq->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - bsp2rmq->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); - bsp2rmq->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - bsp2rmq->dleafs = MBSPto2rmq_Leafs(mbsp->dleafs, mbsp->numleafs); - bsp2rmq->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - bsp2rmq->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - bsp2rmq->dnodes = BSP2to2rmq_Nodes(mbsp->dnodes, mbsp->numnodes); - bsp2rmq->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - bsp2rmq->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); - bsp2rmq->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); - bsp2rmq->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); - bsp2rmq->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - bsp2rmq->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + // copy or convert data + q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); + q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); + q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); + q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); + q2bsp->dleafs = MBSPtoQ2_Leafs(mbsp->dleafs, mbsp->numleafs); + q2bsp->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); + q2bsp->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); + q2bsp->dnodes = BSP2toQ2_Nodes(mbsp->dnodes, mbsp->numnodes); + q2bsp->texinfo = MBSPtoQ2_Texinfo(mbsp->texinfo, mbsp->numtexinfo); + q2bsp->dfaces = BSP2toQ2_Faces(mbsp->dfaces, mbsp->numfaces); + q2bsp->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); + q2bsp->dleaffaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); + q2bsp->dleafbrushes = Q2BSP_CopyLeafBrushes(mbsp->dleafbrushes, mbsp->numleafbrushes); + q2bsp->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - /* Free old data */ - FreeMBSP((mbsp_t *)mbsp); + q2bsp->dareas = Q2BSP_CopyAreas(mbsp->dareas, mbsp->numareas); + q2bsp->dareaportals = Q2BSP_CopyAreaPortals(mbsp->dareaportals, mbsp->numareaportals); - /* Conversion complete! */ - bspdata->version = to_version; + q2bsp->dbrushes = Q2BSP_CopyBrushes(mbsp->dbrushes, mbsp->numbrushes); + q2bsp->dbrushsides = Q2BSP_CopyBrushSides(mbsp->dbrushsides, mbsp->numbrushsides); - return; - } + /* Free old data */ + FreeMBSP((mbsp_t *)mbsp); + + /* Conversion complete! */ + bspdata->version = version; + + return; + } - else if (to_version == &bspver_bsp2) { - bsp2_t *bsp2 = &bspdata->data.bsp2; - const mbsp_t *mbsp = &bspdata->data.mbsp; + if (bspdata->version == GENERIC_BSP && version == BSP2RMQVERSION) { + bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; + const mbsp_t *mbsp = &bspdata->data.mbsp; - memset(bsp2, 0, sizeof(*bsp2)); + memset(bsp2rmq, 0, sizeof(*bsp2rmq)); - // copy counts - bsp2->nummodels = mbsp->nummodels; - bsp2->visdatasize = mbsp->visdatasize; - bsp2->lightdatasize = mbsp->lightdatasize; - bsp2->texdatasize = mbsp->texdatasize; - bsp2->entdatasize = mbsp->entdatasize; - bsp2->numleafs = mbsp->numleafs; - bsp2->numplanes = mbsp->numplanes; - bsp2->numvertexes = mbsp->numvertexes; - bsp2->numnodes = mbsp->numnodes; - bsp2->numtexinfo = mbsp->numtexinfo; - bsp2->numfaces = mbsp->numfaces; - bsp2->numclipnodes = mbsp->numclipnodes; - bsp2->numedges = mbsp->numedges; - bsp2->nummarksurfaces = mbsp->numleaffaces; - bsp2->numsurfedges = mbsp->numsurfedges; + // copy counts + bsp2rmq->nummodels = mbsp->nummodels; + bsp2rmq->visdatasize = mbsp->visdatasize; + bsp2rmq->lightdatasize = mbsp->lightdatasize; + bsp2rmq->texdatasize = mbsp->texdatasize; + bsp2rmq->entdatasize = mbsp->entdatasize; + bsp2rmq->numleafs = mbsp->numleafs; + bsp2rmq->numplanes = mbsp->numplanes; + bsp2rmq->numvertexes = mbsp->numvertexes; + bsp2rmq->numnodes = mbsp->numnodes; + bsp2rmq->numtexinfo = mbsp->numtexinfo; + bsp2rmq->numfaces = mbsp->numfaces; + bsp2rmq->numclipnodes = mbsp->numclipnodes; + bsp2rmq->numedges = mbsp->numedges; + bsp2rmq->nummarksurfaces = mbsp->numleaffaces; + bsp2rmq->numsurfedges = mbsp->numsurfedges; - // copy or convert data - bsp2->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); - bsp2->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); - bsp2->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - bsp2->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); - bsp2->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - bsp2->dleafs = MBSPto2_Leafs(mbsp->dleafs, mbsp->numleafs); - bsp2->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - bsp2->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - bsp2->dnodes = BSP2_CopyNodes(mbsp->dnodes, mbsp->numnodes); - bsp2->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - bsp2->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); - bsp2->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); - bsp2->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); - bsp2->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - bsp2->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + // copy or convert data + bsp2rmq->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); + bsp2rmq->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); + bsp2rmq->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); + bsp2rmq->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); + bsp2rmq->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); + bsp2rmq->dleafs = MBSPto2rmq_Leafs(mbsp->dleafs, mbsp->numleafs); + bsp2rmq->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); + bsp2rmq->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); + bsp2rmq->dnodes = BSP2to2rmq_Nodes(mbsp->dnodes, mbsp->numnodes); + bsp2rmq->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); + bsp2rmq->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); + bsp2rmq->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); + bsp2rmq->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); + bsp2rmq->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); + bsp2rmq->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - /* Free old data */ - FreeMBSP((mbsp_t *)mbsp); + /* Free old data */ + FreeMBSP((mbsp_t *)mbsp); - /* Conversion complete! */ - bspdata->version = to_version; + /* Conversion complete! */ + bspdata->version = version; - return; - } + return; + } + + if (bspdata->version == GENERIC_BSP && version == BSP2VERSION) { + bsp2_t *bsp2 = &bspdata->data.bsp2; + const mbsp_t *mbsp = &bspdata->data.mbsp; + + memset(bsp2, 0, sizeof(*bsp2)); + + // copy counts + bsp2->nummodels = mbsp->nummodels; + bsp2->visdatasize = mbsp->visdatasize; + bsp2->lightdatasize = mbsp->lightdatasize; + bsp2->texdatasize = mbsp->texdatasize; + bsp2->entdatasize = mbsp->entdatasize; + bsp2->numleafs = mbsp->numleafs; + bsp2->numplanes = mbsp->numplanes; + bsp2->numvertexes = mbsp->numvertexes; + bsp2->numnodes = mbsp->numnodes; + bsp2->numtexinfo = mbsp->numtexinfo; + bsp2->numfaces = mbsp->numfaces; + bsp2->numclipnodes = mbsp->numclipnodes; + bsp2->numedges = mbsp->numedges; + bsp2->nummarksurfaces = mbsp->numleaffaces; + bsp2->numsurfedges = mbsp->numsurfedges; + + // copy or convert data + bsp2->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); + bsp2->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); + bsp2->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); + bsp2->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); + bsp2->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); + bsp2->dleafs = MBSPto2_Leafs(mbsp->dleafs, mbsp->numleafs); + bsp2->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); + bsp2->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); + bsp2->dnodes = BSP2_CopyNodes(mbsp->dnodes, mbsp->numnodes); + bsp2->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); + bsp2->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); + bsp2->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); + bsp2->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); + bsp2->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); + bsp2->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + + /* Free old data */ + FreeMBSP((mbsp_t *)mbsp); + + /* Conversion complete! */ + bspdata->version = version; + + return; } Error("Don't know how to convert BSP version %s to %s", - BSPVersionString(bspdata->version), BSPVersionString(to_version)); + BSPVersionString(bspdata->version), BSPVersionString(version)); } static int isHexen2(const dheader_t *header) { - /* + /* the world should always have some face. however, if the sizes are wrong then we're actually reading headnode[6]. hexen2 only used 5 hulls, so this should be 0 in hexen2, and not in quake. - */ - const dmodelq1_t *modelsq1 = (const dmodelq1_t*)((const uint8_t *)header + header->lumps[LUMP_MODELS].fileofs); - return !modelsq1->numfaces; + */ + const dmodelq1_t *modelsq1 = (const dmodelq1_t*)((const uint8_t *)header + header->lumps[LUMP_MODELS].fileofs); + return !modelsq1->numfaces; } /* @@ -2577,30 +2084,8 @@ const lumpspec_t lumpspec_q2bsp[] = { { "areaportals", sizeof(dareaportal_t) }, }; -const lumpspec_t lumpspec_qbism[] = { - { "entities", sizeof(char) }, - { "planes", sizeof(dplane_t) }, - { "vertexes", sizeof(dvertex_t) }, - { "visibility", sizeof(uint8_t) }, - { "nodes", sizeof(q2_dnode_qbism_t) }, - { "texinfos", sizeof(q2_texinfo_t) }, - { "faces", sizeof(q2_dface_qbism_t) }, - { "lighting", sizeof(uint8_t) }, - { "leafs", sizeof(q2_dleaf_qbism_t) }, - { "leaffaces", sizeof(uint32_t) }, - { "leafbrushes", sizeof(uint32_t) }, - { "edges", sizeof(q2_dedge_qbism_t) }, - { "surfedges", sizeof(int32_t) }, - { "models", sizeof(q2_dmodel_t) }, - { "brushes", sizeof(dbrush_t) }, - { "brushsides", sizeof(q2_dbrushside_qbism_t) }, - { "pop", sizeof(uint8_t) }, - { "areas", sizeof(darea_t) }, - { "areaportals", sizeof(dareaportal_t) }, -}; - static int -CopyLump(const void *header, const bspversion_t *version, const lump_t *lumps, int lumpnum, void *destptr) +CopyLump(const dheader_t *header, int lumpnum, void *destptr) { const lumpspec_t *lumpspec; uint8_t **bufferptr = static_cast(destptr); @@ -2608,29 +2093,29 @@ CopyLump(const void *header, const bspversion_t *version, const lump_t *lumps, i int length; int ofs; - if (version == &bspver_q1 || version == &bspver_h2 || version == &bspver_hl) { + switch (header->version) { + case BSPVERSION: + case BSPHLVERSION: lumpspec = &lumpspec_bsp29[lumpnum]; - } else if (version == &bspver_bsp2rmq) { + break; + case BSP2RMQVERSION: lumpspec = &lumpspec_bsp2rmq[lumpnum]; - } else if (version == &bspver_bsp2) { + break; + case BSP2VERSION: lumpspec = &lumpspec_bsp2[lumpnum]; - } else if (version == &bspver_q2) { - lumpspec = &lumpspec_q2bsp[lumpnum]; - } else if (version == &bspver_qbism) { - lumpspec = &lumpspec_qbism[lumpnum]; - } else { - Error("Unsupported BSP version: %s", BSPVersionString(version)); + break; + default: + Error("Unsupported BSP version: %d", header->version); throw; //mxd. Fixes "Uninitialized variable" warning } - length = lumps[lumpnum].filelen; - ofs = lumps[lumpnum].fileofs; + length = header->lumps[lumpnum].filelen; + ofs = header->lumps[lumpnum].fileofs; if (buffer) free(buffer); - // convert non-Hexen II BSP model hulls over to Hexen II ones - if (lumpnum == LUMP_MODELS && (version == &bspver_q1 || version == &bspver_hl)) + if (lumpnum == LUMP_MODELS && !isHexen2(header)) { /*convert in-place. no need to care about endian here.*/ const dmodelq1_t *in = (const dmodelq1_t*)((const uint8_t *)header + ofs); dmodel_t *out; @@ -2677,6 +2162,45 @@ CopyLump(const void *header, const bspversion_t *version, const lump_t *lumps, i } } +// FIXME: Could merge this with CopyLump once the hexen 2 hack is moved elsewhere +static int +Q2_CopyLump(const q2_dheader_t *header, int lumpnum, void *destptr) +{ + const lumpspec_t *lumpspec; + uint8_t **bufferptr = static_cast(destptr); + uint8_t *buffer = *bufferptr; + int length; + int ofs; + + switch (header->version) { + case Q2_BSPVERSION: + lumpspec = &lumpspec_q2bsp[lumpnum]; + break; + default: + Error("Unsupported BSP version: %d", header->version); + throw; //mxd. Fixes "Uninitialized variable" warning + } + + length = header->lumps[lumpnum].filelen; + ofs = header->lumps[lumpnum].fileofs; + + if (buffer) + free(buffer); + + if (length % lumpspec->size) + Error("%s: odd %s lump size", __func__, lumpspec->name); + + buffer = *bufferptr = static_cast(malloc(length + 1)); + if (!buffer) + Error("%s: allocation of %i bytes failed.", __func__, length); + + memcpy(buffer, (const uint8_t *)header + ofs, length); + buffer[length] = 0; /* In case of corrupt entity lump */ + + return length / lumpspec->size; +} + + void BSPX_AddLump(bspdata_t *bspdata, const char *xname, const void *xdata, size_t xsize) { bspxentry_t *e; @@ -2762,37 +2286,32 @@ LoadBSPFile(char *filename, bspdata_t *bspdata) /* transfer the header data to these variables */ int numlumps; + int32_t version; lump_t *lumps; /* check for IBSP */ - bspversion_t temp_version { LittleLong(((int *)file_data)[0]) }; - - if (temp_version.ident == Q2_BSPIDENT || - temp_version.ident == Q2_QBISMIDENT) { + if (LittleLong(((int *)file_data)[0]) == Q2_BSPIDENT) { q2_dheader_t *q2header = (q2_dheader_t *)file_data; q2header->version = LittleLong(q2header->version); numlumps = Q2_HEADER_LUMPS; - temp_version.version = q2header->version; + version = q2header->version; lumps = q2header->lumps; } else { dheader_t *q1header = (dheader_t *)file_data; q1header->version = LittleLong(q1header->version); numlumps = BSP_LUMPS; + version = q1header->version; lumps = q1header->lumps; - - // not useful for Q1BSP, but we'll initialize it to -1 - temp_version.version = NO_VERSION; } + bspdata->loadversion = version; + /* check the file version */ - if (!BSPVersionSupported(temp_version.ident, temp_version.version, &bspdata->version)) { - logprint("BSP is version %s\n", BSPVersionString(&temp_version)); + logprint("BSP is version %s\n", BSPVersionString(version)); + if (!BSPVersionSupported(version)) Error("Sorry, this bsp version is not supported."); - } else { - logprint("BSP is version %s\n", BSPVersionString(bspdata->version)); - } /* swap the lump headers */ for (i = 0; i < numlumps; i++) { @@ -2800,175 +2319,152 @@ LoadBSPFile(char *filename, bspdata_t *bspdata) lumps[i].filelen = LittleLong(lumps[i].filelen); } + if (isHexen2((dheader_t *)file_data)) + { + logprint("BSP appears to be from hexen2\n"); + bspdata->hullcount = MAX_MAP_HULLS_H2; + } + else + bspdata->hullcount = MAX_MAP_HULLS_Q1; + /* copy the data */ - if (bspdata->version == &bspver_q2) { + if (version == Q2_BSPVERSION) { q2_dheader_t *header = (q2_dheader_t *)file_data; q2bsp_t *bsp = &bspdata->data.q2bsp; - + memset(bsp, 0, sizeof(*bsp)); - - bsp->nummodels = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_TEXINFO, &bsp->texinfo); - bsp->numfaces = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_FACES, &bsp->dfaces); - bsp->numleaffaces = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFFACES, &bsp->dleaffaces); - bsp->numleafbrushes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFBRUSHES, &bsp->dleafbrushes); - bsp->numsurfedges = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_EDGES, &bsp->dedges); - bsp->numbrushes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_BRUSHES, &bsp->dbrushes); - bsp->numbrushsides = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_BRUSHSIDES, &bsp->dbrushsides); - bsp->numareas = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_AREAS, &bsp->dareas); - bsp->numareaportals = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_AREAPORTALS, &bsp->dareaportals); + bspdata->version = header->version; - bsp->visdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_VISIBILITY, &bsp->dvis); - bsp->lightdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_ENTITIES, &bsp->dentdata); + bsp->nummodels = Q2_CopyLump (header, Q2_LUMP_MODELS, &bsp->dmodels); + bsp->numvertexes = Q2_CopyLump (header, Q2_LUMP_VERTEXES, &bsp->dvertexes); + bsp->numplanes = Q2_CopyLump (header, Q2_LUMP_PLANES, &bsp->dplanes); + bsp->numleafs = Q2_CopyLump (header, Q2_LUMP_LEAFS, &bsp->dleafs); + bsp->numnodes = Q2_CopyLump (header, Q2_LUMP_NODES, &bsp->dnodes); + bsp->numtexinfo = Q2_CopyLump (header, Q2_LUMP_TEXINFO, &bsp->texinfo); + bsp->numfaces = Q2_CopyLump (header, Q2_LUMP_FACES, &bsp->dfaces); + bsp->numleaffaces = Q2_CopyLump (header, Q2_LUMP_LEAFFACES, &bsp->dleaffaces); + bsp->numleafbrushes = Q2_CopyLump (header, Q2_LUMP_LEAFBRUSHES, &bsp->dleafbrushes); + bsp->numsurfedges = Q2_CopyLump (header, Q2_LUMP_SURFEDGES, &bsp->dsurfedges); + bsp->numedges = Q2_CopyLump (header, Q2_LUMP_EDGES, &bsp->dedges); + bsp->numbrushes = Q2_CopyLump (header, Q2_LUMP_BRUSHES, &bsp->dbrushes); + bsp->numbrushsides = Q2_CopyLump (header, Q2_LUMP_BRUSHSIDES, &bsp->dbrushsides); + bsp->numareas = Q2_CopyLump (header, Q2_LUMP_AREAS, &bsp->dareas); + bsp->numareaportals = Q2_CopyLump (header, Q2_LUMP_AREAPORTALS, &bsp->dareaportals); - CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_POP, &bsp->dpop); - } else if (bspdata->version == &bspver_qbism) { - q2_dheader_t *header = (q2_dheader_t *)file_data; - q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; - - memset(bsp, 0, sizeof(*bsp)); - - bsp->nummodels = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_TEXINFO, &bsp->texinfo); - bsp->numfaces = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_FACES, &bsp->dfaces); - bsp->numleaffaces = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFFACES, &bsp->dleaffaces); - bsp->numleafbrushes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFBRUSHES, &bsp->dleafbrushes); - bsp->numsurfedges = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_EDGES, &bsp->dedges); - bsp->numbrushes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_BRUSHES, &bsp->dbrushes); - bsp->numbrushsides = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_BRUSHSIDES, &bsp->dbrushsides); - bsp->numareas = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_AREAS, &bsp->dareas); - bsp->numareaportals = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_AREAPORTALS, &bsp->dareaportals); + bsp->visdatasize = Q2_CopyLump (header, Q2_LUMP_VISIBILITY, &bsp->dvis); + bsp->lightdatasize = Q2_CopyLump (header, Q2_LUMP_LIGHTING, &bsp->dlightdata); + bsp->entdatasize = Q2_CopyLump (header, Q2_LUMP_ENTITIES, &bsp->dentdata); - bsp->visdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_VISIBILITY, &bsp->dvis); - bsp->lightdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_ENTITIES, &bsp->dentdata); - - CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_POP, &bsp->dpop); - } else { - // Only Q1-like maps need hullcount - if (isHexen2((dheader_t *)file_data)) { - logprint("BSP appears to be from hexen2\n"); - // swap version over to H2 - bspdata->version = &bspver_h2; - bspdata->hullcount = MAX_MAP_HULLS_H2; - } else { - bspdata->hullcount = MAX_MAP_HULLS_Q1; - } + Q2_CopyLump (header, Q2_LUMP_POP, &bsp->dpop); } - if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { + if (version == BSPVERSION || version == BSPHLVERSION) { dheader_t *header = (dheader_t *)file_data; bsp29_t *bsp = &bspdata->data.bsp29; memset(bsp, 0, sizeof(*bsp)); + bspdata->version = header->version; + bsp->nummodels = CopyLump(header, LUMP_MODELS, &bsp->dmodels); + bsp->numvertexes = CopyLump(header, LUMP_VERTEXES, &bsp->dvertexes); + bsp->numplanes = CopyLump(header, LUMP_PLANES, &bsp->dplanes); + bsp->numleafs = CopyLump(header, LUMP_LEAFS, &bsp->dleafs); + bsp->numnodes = CopyLump(header, LUMP_NODES, &bsp->dnodes); + bsp->numtexinfo = CopyLump(header, LUMP_TEXINFO, &bsp->texinfo); + bsp->numclipnodes = CopyLump(header, LUMP_CLIPNODES, &bsp->dclipnodes); + bsp->numfaces = CopyLump(header, LUMP_FACES, &bsp->dfaces); + bsp->nummarksurfaces = CopyLump(header, LUMP_MARKSURFACES, &bsp->dmarksurfaces); + bsp->numsurfedges = CopyLump(header, LUMP_SURFEDGES, &bsp->dsurfedges); + bsp->numedges = CopyLump(header, LUMP_EDGES, &bsp->dedges); - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp->texinfo); - bsp->numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp->dclipnodes); - bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp->dfaces); - bsp->nummarksurfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp->dmarksurfaces); - bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp->dedges); + bsp->texdatasize = CopyLump(header, LUMP_TEXTURES, &bsp->dtexdata); + bsp->visdatasize = CopyLump(header, LUMP_VISIBILITY, &bsp->dvisdata); + bsp->lightdatasize = CopyLump(header, LUMP_LIGHTING, &bsp->dlightdata); + bsp->entdatasize = CopyLump(header, LUMP_ENTITIES, &bsp->dentdata); + } - bsp->texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp->dtexdata); - bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp->dentdata); - } else if (bspdata->version == &bspver_bsp2rmq) { + if (version == BSP2RMQVERSION) { dheader_t *header = (dheader_t *)file_data; bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; memset(bsp, 0, sizeof(*bsp)); + bspdata->version = header->version; + bsp->nummodels = CopyLump(header, LUMP_MODELS, &bsp->dmodels); + bsp->numvertexes = CopyLump(header, LUMP_VERTEXES, &bsp->dvertexes); + bsp->numplanes = CopyLump(header, LUMP_PLANES, &bsp->dplanes); + bsp->numleafs = CopyLump(header, LUMP_LEAFS, &bsp->dleafs); + bsp->numnodes = CopyLump(header, LUMP_NODES, &bsp->dnodes); + bsp->numtexinfo = CopyLump(header, LUMP_TEXINFO, &bsp->texinfo); + bsp->numclipnodes = CopyLump(header, LUMP_CLIPNODES, &bsp->dclipnodes); + bsp->numfaces = CopyLump(header, LUMP_FACES, &bsp->dfaces); + bsp->nummarksurfaces = CopyLump(header, LUMP_MARKSURFACES, &bsp->dmarksurfaces); + bsp->numsurfedges = CopyLump(header, LUMP_SURFEDGES, &bsp->dsurfedges); + bsp->numedges = CopyLump(header, LUMP_EDGES, &bsp->dedges); - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp->texinfo); - bsp->numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp->dclipnodes); - bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp->dfaces); - bsp->nummarksurfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp->dmarksurfaces); - bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp->dedges); + bsp->texdatasize = CopyLump(header, LUMP_TEXTURES, &bsp->dtexdata); + bsp->visdatasize = CopyLump(header, LUMP_VISIBILITY, &bsp->dvisdata); + bsp->lightdatasize = CopyLump(header, LUMP_LIGHTING, &bsp->dlightdata); + bsp->entdatasize = CopyLump(header, LUMP_ENTITIES, &bsp->dentdata); + } - bsp->texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp->dtexdata); - bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp->dentdata); - } else if (bspdata->version == &bspver_bsp2) { + if (version == BSP2VERSION) { dheader_t *header = (dheader_t *)file_data; bsp2_t *bsp = &bspdata->data.bsp2; memset(bsp, 0, sizeof(*bsp)); + bspdata->version = header->version; + bsp->nummodels = CopyLump(header, LUMP_MODELS, &bsp->dmodels); + bsp->numvertexes = CopyLump(header, LUMP_VERTEXES, &bsp->dvertexes); + bsp->numplanes = CopyLump(header, LUMP_PLANES, &bsp->dplanes); + bsp->numleafs = CopyLump(header, LUMP_LEAFS, &bsp->dleafs); + bsp->numnodes = CopyLump(header, LUMP_NODES, &bsp->dnodes); + bsp->numtexinfo = CopyLump(header, LUMP_TEXINFO, &bsp->texinfo); + bsp->numclipnodes = CopyLump(header, LUMP_CLIPNODES, &bsp->dclipnodes); + bsp->numfaces = CopyLump(header, LUMP_FACES, &bsp->dfaces); + bsp->nummarksurfaces = CopyLump(header, LUMP_MARKSURFACES, &bsp->dmarksurfaces); + bsp->numsurfedges = CopyLump(header, LUMP_SURFEDGES, &bsp->dsurfedges); + bsp->numedges = CopyLump(header, LUMP_EDGES, &bsp->dedges); - bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp->texinfo); - bsp->numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp->dclipnodes); - bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp->dfaces); - bsp->nummarksurfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp->dmarksurfaces); - bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp->dedges); - - bsp->texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp->dtexdata); - bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp->dentdata); + bsp->texdatasize = CopyLump(header, LUMP_TEXTURES, &bsp->dtexdata); + bsp->visdatasize = CopyLump(header, LUMP_VISIBILITY, &bsp->dvisdata); + bsp->lightdatasize = CopyLump(header, LUMP_LIGHTING, &bsp->dlightdata); + bsp->entdatasize = CopyLump(header, LUMP_ENTITIES, &bsp->dentdata); } - // detect BSPX - dheader_t *header = (dheader_t *)file_data; + if (version != Q2_BSPVERSION) { + dheader_t *header = (dheader_t *)file_data; - /*bspx header is positioned exactly+4align at the end of the last lump position (regardless of order)*/ - for (i = 0, bspxofs = 0; i < BSP_LUMPS; i++) - { - if (bspxofs < header->lumps[i].fileofs + header->lumps[i].filelen) - bspxofs = header->lumps[i].fileofs + header->lumps[i].filelen; - } - bspxofs = (bspxofs+3) & ~3; - /*okay, so that's where it *should* be if it exists */ - if (bspxofs + sizeof(*bspx) <= flen) - { - int xlumps; - const bspx_lump_t *xlump; - bspx = (const bspx_header_t*)((const uint8_t*)header + bspxofs); - xlump = (const bspx_lump_t*)(bspx+1); - xlumps = LittleLong(bspx->numlumps); - if (!memcmp(&bspx->id,"BSPX",4) && xlumps >= 0 && bspxofs+sizeof(*bspx)+sizeof(*xlump)*xlumps <= flen) + /*bspx header is positioned exactly+4align at the end of the last lump position (regardless of order)*/ + for (i = 0, bspxofs = 0; i < BSP_LUMPS; i++) { - /*header seems valid so far. just add the lumps as we normally would if we were generating them, ensuring that they get written out anew*/ - while(xlumps --> 0) - { - uint32_t ofs = LittleLong(xlump[xlumps].fileofs); - uint32_t len = LittleLong(xlump[xlumps].filelen); - void *lumpdata = malloc(len); - memcpy(lumpdata, (const uint8_t*)header + ofs, len); - BSPX_AddLump(bspdata, xlump[xlumps].lumpname, lumpdata, len); - } + if (bspxofs < header->lumps[i].fileofs + header->lumps[i].filelen) + bspxofs = header->lumps[i].fileofs + header->lumps[i].filelen; } - else + bspxofs = (bspxofs+3) & ~3; + /*okay, so that's where it *should* be if it exists */ + if (bspxofs + sizeof(*bspx) <= flen) { - if (!memcmp(&bspx->id,"BSPX",4)) - printf("invalid bspx header\n"); + int xlumps; + const bspx_lump_t *xlump; + bspx = (const bspx_header_t*)((const uint8_t*)header + bspxofs); + xlump = (const bspx_lump_t*)(bspx+1); + xlumps = LittleLong(bspx->numlumps); + if (!memcmp(&bspx->id,"BSPX",4) && xlumps >= 0 && bspxofs+sizeof(*bspx)+sizeof(*xlump)*xlumps <= flen) + { + /*header seems valid so far. just add the lumps as we normally would if we were generating them, ensuring that they get written out anew*/ + while(xlumps --> 0) + { + uint32_t ofs = LittleLong(xlump[xlumps].fileofs); + uint32_t len = LittleLong(xlump[xlumps].filelen); + void *lumpdata = malloc(len); + memcpy(lumpdata, (const uint8_t*)header + ofs, len); + BSPX_AddLump(bspdata, xlump[xlumps].lumpname, lumpdata, len); + } + } + else + { + if (!memcmp(&bspx->id,"BSPX",4)) + printf("invalid bspx header\n"); + } } } @@ -2982,13 +2478,11 @@ LoadBSPFile(char *filename, bspdata_t *bspdata) /* ========================================================================= */ typedef struct { - const bspversion_t *version; + int version; // which one is used depends on version - union { - dheader_t q1header; - q2_dheader_t q2header; - }; + dheader_t q1header; + q2_dheader_t q2header; FILE *file; } bspfile_t; @@ -2998,33 +2492,33 @@ AddLump(bspfile_t *bspfile, int lumpnum, const void *data, int count) { bool q2 = false; size_t size; - const lumpspec_t *lumpspec; - lump_t *lumps; - - if (bspfile->version == &bspver_q1 || bspfile->version == &bspver_h2 || bspfile->version == &bspver_hl) { - lumpspec = &lumpspec_bsp29[lumpnum]; - lumps = bspfile->q1header.lumps; - } else if (bspfile->version == &bspver_bsp2rmq) { - lumpspec = &lumpspec_bsp2rmq[lumpnum]; - lumps = bspfile->q1header.lumps; - } else if (bspfile->version == &bspver_bsp2) { - lumpspec = &lumpspec_bsp2[lumpnum]; - lumps = bspfile->q1header.lumps; - } else if (bspfile->version == &bspver_q2) { - lumpspec = &lumpspec_q2bsp[lumpnum]; - lumps = bspfile->q2header.lumps; - } else if (bspfile->version == &bspver_qbism) { - lumpspec = &lumpspec_qbism[lumpnum]; - lumps = bspfile->q2header.lumps; - } else { - Error("Unsupported BSP version: %s", BSPVersionString(bspfile->version)); + + switch (bspfile->version) { + case BSPVERSION: + case BSPHLVERSION: + size = lumpspec_bsp29[lumpnum].size * count; + break; + case BSP2RMQVERSION: + size = lumpspec_bsp2rmq[lumpnum].size * count; + break; + case BSP2VERSION: + size = lumpspec_bsp2[lumpnum].size * count; + break; + case Q2_BSPVERSION: + size = lumpspec_q2bsp[lumpnum].size * count; + q2 = true; + break; + default: + Error("Unsupported BSP version: %d", LittleLong(bspfile->version)); throw; //mxd. Fixes "Uninitialized variable" warning } - size = lumpspec->size * count; - uint8_t pad[4] = {0}; - lump_t *lump = &lumps[lumpnum]; + lump_t *lump; + if (q2) + lump = &bspfile->q2header.lumps[lumpnum]; + else + lump = &bspfile->q1header.lumps[lumpnum]; lump->fileofs = LittleLong(ftell(bspfile->file)); lump->filelen = LittleLong(size); @@ -3081,27 +2575,25 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) SwapBSPFile(bspdata, TO_DISK); bspfile.version = bspdata->version; - - // headers are union'd, so this sets both - bspfile.q2header.ident = LittleLong(bspfile.version->ident); - - if (bspfile.version->version != NO_VERSION) { - bspfile.q2header.version = LittleLong(bspfile.version->version); + if (bspfile.version == Q2_BSPVERSION) { + bspfile.q2header.ident = LittleLong(Q2_BSPIDENT); + bspfile.q2header.version = LittleLong(Q2_BSPVERSION); + } else { + bspfile.q1header.version = LittleLong(bspfile.version); } logprint("Writing %s as BSP version %s\n", filename, BSPVersionString(bspdata->version)); bspfile.file = SafeOpenWrite(filename); /* Save header space, updated after adding the lumps */ - if (bspfile.version->version != NO_VERSION) { + if (bspfile.version == Q2_BSPVERSION) { SafeWrite(bspfile.file, &bspfile.q2header, sizeof(bspfile.q2header)); } else { SafeWrite(bspfile.file, &bspfile.q1header, sizeof(bspfile.q1header)); } - if (bspdata->version == &bspver_q1 || - bspdata->version == &bspver_h2 || - bspdata->version == &bspver_hl) { + if (bspdata->version == BSPVERSION || + bspdata->version == BSPHLVERSION) { bsp29_t *bsp = &bspdata->data.bsp29; AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes); @@ -3120,7 +2612,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize); AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize); - } else if (bspdata->version == &bspver_bsp2rmq) { + } else if (bspdata->version == BSP2RMQVERSION) { bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes); @@ -3139,7 +2631,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize); AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize); - } else if (bspdata->version == &bspver_bsp2) { + } else if (bspdata->version == BSP2VERSION) { bsp2_t *bsp = &bspdata->data.bsp2; AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes); @@ -3158,7 +2650,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize); AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize); - } else if (bspdata->version == &bspver_q2) { + } else if (bspdata->version == Q2_BSPVERSION) { q2bsp_t *bsp = &bspdata->data.q2bsp; AddLump(&bspfile, Q2_LUMP_MODELS, bsp->dmodels, bsp->nummodels); @@ -3177,29 +2669,6 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) AddLump(&bspfile, Q2_LUMP_AREAS, bsp->dareas, bsp->numareas); AddLump(&bspfile, Q2_LUMP_AREAPORTALS, bsp->dareaportals, bsp->numareaportals); - AddLump(&bspfile, Q2_LUMP_VISIBILITY, bsp->dvis, bsp->visdatasize); - AddLump(&bspfile, Q2_LUMP_LIGHTING, bsp->dlightdata, bsp->lightdatasize); - AddLump(&bspfile, Q2_LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); - AddLump(&bspfile, Q2_LUMP_POP, bsp->dpop, sizeof(bsp->dpop)); - } else if (bspdata->version == &bspver_qbism) { - q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; - - AddLump(&bspfile, Q2_LUMP_MODELS, bsp->dmodels, bsp->nummodels); - AddLump(&bspfile, Q2_LUMP_VERTEXES, bsp->dvertexes, bsp->numvertexes); - AddLump(&bspfile, Q2_LUMP_PLANES, bsp->dplanes, bsp->numplanes); - AddLump(&bspfile, Q2_LUMP_LEAFS, bsp->dleafs, bsp->numleafs); - AddLump(&bspfile, Q2_LUMP_NODES, bsp->dnodes, bsp->numnodes); - AddLump(&bspfile, Q2_LUMP_TEXINFO, bsp->texinfo, bsp->numtexinfo); - AddLump(&bspfile, Q2_LUMP_FACES, bsp->dfaces, bsp->numfaces); - AddLump(&bspfile, Q2_LUMP_LEAFFACES, bsp->dleaffaces, bsp->numleaffaces); - AddLump(&bspfile, Q2_LUMP_LEAFBRUSHES, bsp->dleafbrushes, bsp->numleafbrushes); - AddLump(&bspfile, Q2_LUMP_SURFEDGES, bsp->dsurfedges, bsp->numsurfedges); - AddLump(&bspfile, Q2_LUMP_EDGES, bsp->dedges, bsp->numedges); - AddLump(&bspfile, Q2_LUMP_BRUSHES, bsp->dbrushes, bsp->numbrushes); - AddLump(&bspfile, Q2_LUMP_BRUSHSIDES, bsp->dbrushsides, bsp->numbrushsides); - AddLump(&bspfile, Q2_LUMP_AREAS, bsp->dareas, bsp->numareas); - AddLump(&bspfile, Q2_LUMP_AREAPORTALS, bsp->dareaportals, bsp->numareaportals); - AddLump(&bspfile, Q2_LUMP_VISIBILITY, bsp->dvis, bsp->visdatasize); AddLump(&bspfile, Q2_LUMP_LIGHTING, bsp->dlightdata, bsp->lightdatasize); AddLump(&bspfile, Q2_LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); @@ -3251,7 +2720,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) fseek(bspfile.file, 0, SEEK_SET); // write the real header - if (bspfile.version->version != NO_VERSION) { + if (bspfile.version == Q2_BSPVERSION) { SafeWrite(bspfile.file, &bspfile.q2header, sizeof(bspfile.q2header)); } else { SafeWrite(bspfile.file, &bspfile.q1header, sizeof(bspfile.q1header)); @@ -3280,7 +2749,7 @@ PrintBSPFileSizes(const bspdata_t *bspdata) { int numtextures = 0; - if (bspdata->version == &bspver_q2) { + if (bspdata->version == Q2_BSPVERSION) { const q2bsp_t *bsp = &bspdata->data.q2bsp; const lumpspec_t *lumpspec = lumpspec_q2bsp; @@ -3304,31 +2773,9 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); - } else if (bspdata->version == &bspver_qbism) { - const q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; - const lumpspec_t *lumpspec = lumpspec_qbism; - - logprint("%7i %-12s\n", bsp->nummodels, "models"); - - PrintLumpSize(lumpspec, Q2_LUMP_PLANES, bsp->numplanes); - PrintLumpSize(lumpspec, Q2_LUMP_VERTEXES, bsp->numvertexes); - PrintLumpSize(lumpspec, Q2_LUMP_NODES, bsp->numnodes); - PrintLumpSize(lumpspec, Q2_LUMP_TEXINFO, bsp->numtexinfo); - PrintLumpSize(lumpspec, Q2_LUMP_FACES, bsp->numfaces); - PrintLumpSize(lumpspec, Q2_LUMP_LEAFS, bsp->numleafs); - PrintLumpSize(lumpspec, Q2_LUMP_LEAFFACES, bsp->numleaffaces); - PrintLumpSize(lumpspec, Q2_LUMP_LEAFBRUSHES, bsp->numleafbrushes); - PrintLumpSize(lumpspec, Q2_LUMP_EDGES, bsp->numedges); - PrintLumpSize(lumpspec, Q2_LUMP_SURFEDGES, bsp->numsurfedges); - PrintLumpSize(lumpspec, Q2_LUMP_BRUSHES, bsp->numbrushes); - PrintLumpSize(lumpspec, Q2_LUMP_BRUSHSIDES, bsp->numbrushsides); - PrintLumpSize(lumpspec, Q2_LUMP_AREAS, bsp->numareas); - PrintLumpSize(lumpspec, Q2_LUMP_AREAPORTALS, bsp->numareaportals); - - logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); - logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); - logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); - } else if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { + } + + if (bspdata->version == BSPVERSION || bspdata->version == BSPHLVERSION) { const bsp29_t *bsp = &bspdata->data.bsp29; const lumpspec_t *lumpspec = lumpspec_bsp29; @@ -3352,15 +2799,9 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); + } - if (bspdata->bspxentries) - { - bspxentry_t *x; - for (x = bspdata->bspxentries; x; x = x->next) { - logprint("%7s %-12s %10i\n", "BSPX", x->lumpname, (int)x->lumpsize); - } - } - } else if (bspdata->version == &bspver_bsp2rmq) { + if (bspdata->version == BSP2RMQVERSION) { const bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; const lumpspec_t *lumpspec = lumpspec_bsp2rmq; @@ -3384,7 +2825,9 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); - } else if (bspdata->version == &bspver_bsp2) { + } + + if (bspdata->version == BSP2VERSION) { const bsp2_t *bsp = &bspdata->data.bsp2; const lumpspec_t *lumpspec = lumpspec_bsp2; @@ -3409,4 +2852,12 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); } + + if (bspdata->bspxentries) + { + bspxentry_t *x; + for (x = bspdata->bspxentries; x; x = x->next) { + logprint("%7s %-12s %10i\n", "BSPX", x->lumpname, (int)x->lumpsize); + } + } } diff --git a/common/bsputils.cc b/common/bsputils.cc index 53be82bf..b49cdeec 100644 --- a/common/bsputils.cc +++ b/common/bsputils.cc @@ -188,7 +188,7 @@ bool Face_IsLightmapped(const mbsp_t *bsp, const bsp2_dface_t *face) if (texinfo == nullptr) return false; - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { + if (bsp->loadversion == Q2_BSPVERSION) { if (texinfo->flags & (Q2_SURF_WARP|Q2_SURF_SKY|Q2_SURF_NODRAW)) { //mxd. +Q2_SURF_NODRAW return false; } @@ -223,7 +223,7 @@ TextureName_Contents(const char *texname) bool //mxd Contents_IsTranslucent(const mbsp_t *bsp, const int contents) { - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) + if (bsp->loadversion == Q2_BSPVERSION) return (contents & Q2_SURF_TRANSLUCENT) && ((contents & Q2_SURF_TRANSLUCENT) != Q2_SURF_TRANSLUCENT); // Don't count KMQ2 fence flags combo as translucent else return contents == CONTENTS_WATER || contents == CONTENTS_LAVA || contents == CONTENTS_SLIME; @@ -238,7 +238,7 @@ Face_IsTranslucent(const mbsp_t *bsp, const bsp2_dface_t *face) int //mxd. Returns CONTENTS_ value for Q1, Q2_SURF_ bitflags for Q2... Face_Contents(const mbsp_t *bsp, const bsp2_dface_t *face) { - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { + if (bsp->loadversion == Q2_BSPVERSION) { const gtexinfo_t *info = Face_Texinfo(bsp, face); return info->flags; } else { @@ -281,13 +281,8 @@ static bool Light_PointInSolid_r(const mbsp_t *bsp, const int nodenum, const vec { if (nodenum < 0) { const mleaf_t *leaf = BSP_GetLeafFromNodeNum(bsp, nodenum); - - //mxd - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { - return leaf->contents & Q2_CONTENTS_SOLID; - } - return (leaf->contents == CONTENTS_SOLID || leaf->contents == CONTENTS_SKY); + return (bsp->loadversion == Q2_BSPVERSION ? leaf->contents & Q2_CONTENTS_SOLID : (leaf->contents == CONTENTS_SOLID || leaf->contents == CONTENTS_SKY)); //mxd } const bsp2_dnode_t *node = &bsp->dnodes[nodenum]; diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index 9183755b..7a6cb51c 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -52,41 +52,17 @@ #define MAX_ENT_KEY 32 #define MAX_ENT_VALUE 1024 -struct bspversion_t -{ - /* identifier value, the first int32_t in the header */ - int32_t ident; - /* version value, if supported; use NO_VERSION if a version is not required */ - int32_t version; - /* short name used for command line args, etc */ - const char *short_name; - /* full display name for printing */ - const char *name; -}; - -#define NO_VERSION -1 - #define BSPVERSION 29 #define BSP2RMQVERSION (('B' << 24) | ('S' << 16) | ('P' << 8) | '2') #define BSP2VERSION ('B' | ('S' << 8) | ('P' << 16) | ('2' << 24)) #define BSPHLVERSION 30 //24bit lighting, and private palettes in the textures lump. #define Q2_BSPIDENT (('P'<<24)+('S'<<16)+('B'<<8)+'I') #define Q2_BSPVERSION 38 -#define Q2_QBISMIDENT (('P'<<24)+('S'<<16)+('B'<<8)+'Q') -extern const bspversion_t bspver_generic, bspver_q1, bspver_h2, bspver_bsp2, bspver_bsp2rmq, bspver_hl, bspver_q2, bspver_qbism; - -/* table of supported versions */ -constexpr const bspversion_t *const bspversions[] = { - &bspver_generic, - &bspver_q1, - &bspver_h2, - &bspver_bsp2, - &bspver_bsp2rmq, - &bspver_hl, - &bspver_q2, - &bspver_qbism -}; +/* Not an actual file format, but the mbsp_t struct */ +/* TODO: Should probably separate the type tag for bspdata_t from the file + version numbers */ +#define GENERIC_BSP 99 typedef struct { int32_t fileofs; @@ -314,8 +290,6 @@ struct q2_dnode_t { uint16_t numfaces; // counting both sides }; -using q2_dnode_qbism_t = bsp2_dnode_t; - /* * Note that children are interpreted as unsigned values now, so that we can * handle > 32k clipnodes. Values > 0xFFF0 can be assumed to be CONTENTS @@ -413,8 +387,6 @@ typedef struct { uint32_t v[2]; /* vertex numbers */ } bsp2_dedge_t; -using q2_dedge_qbism_t = bsp2_dedge_t; - #define MAXLIGHTMAPS 4 typedef struct { int16_t planenum; @@ -452,18 +424,6 @@ typedef struct { int32_t lightofs; // start of [numstyles*surfsize] samples } q2_dface_t; -typedef struct { - uint32_t planenum; // NOTE: only difference from bsp2_dface_t - int32_t side; - int32_t firstedge; // we must support > 64k edges - int32_t numedges; - int32_t texinfo; - - // lighting info - uint8_t styles[MAXLIGHTMAPS]; - int32_t lightofs; // start of [numstyles*surfsize] samples -} q2_dface_qbism_t; - /* Ambient Sounds */ #define AMBIENT_WATER 0 #define AMBIENT_SKY 1 @@ -521,22 +481,6 @@ typedef struct { uint16_t numleafbrushes; } q2_dleaf_t; -typedef struct { - int32_t contents; // OR of all brushes (not needed?) - - int32_t cluster; - int32_t area; - - float mins[3]; // for frustum culling - float maxs[3]; - - uint32_t firstleafface; - uint32_t numleaffaces; - - uint32_t firstleafbrush; - uint32_t numleafbrushes; -} q2_dleaf_qbism_t; - typedef struct { // bsp2_dleaf_t int32_t contents; @@ -548,10 +492,10 @@ typedef struct { uint8_t ambient_level[NUM_AMBIENTS]; // q2 extras - int32_t cluster; - int32_t area; - uint32_t firstleafbrush; - uint32_t numleafbrushes; + int16_t cluster; + int16_t area; + uint16_t firstleafbrush; + uint16_t numleafbrushes; } mleaf_t; typedef struct { @@ -559,11 +503,6 @@ typedef struct { int16_t texinfo; } dbrushside_t; -typedef struct { - uint32_t planenum; // facing out of the leaf - int32_t texinfo; -} q2_dbrushside_qbism_t; - typedef struct { int32_t firstside; int32_t numsides; @@ -803,66 +742,8 @@ typedef struct { uint8_t dpop[256]; } q2bsp_t; -typedef struct { - int nummodels; - q2_dmodel_t *dmodels; - - int visdatasize; - dvis_t *dvis; - - int lightdatasize; - uint8_t *dlightdata; - - int entdatasize; - char *dentdata; - - int numleafs; - q2_dleaf_qbism_t *dleafs; - - int numplanes; - dplane_t *dplanes; - - int numvertexes; - dvertex_t *dvertexes; - - int numnodes; - q2_dnode_qbism_t *dnodes; - - int numtexinfo; - q2_texinfo_t *texinfo; - - int numfaces; - q2_dface_qbism_t *dfaces; - - int numedges; - q2_dedge_qbism_t *dedges; - - int numleaffaces; - uint32_t *dleaffaces; - - int numleafbrushes; - uint32_t *dleafbrushes; - - int numsurfedges; - int32_t *dsurfedges; - - int numareas; - darea_t *dareas; - - int numareaportals; - dareaportal_t *dareaportals; - - int numbrushes; - dbrush_t *dbrushes; - - int numbrushsides; - q2_dbrushside_qbism_t *dbrushsides; - - uint8_t dpop[256]; -} q2bsp_qbism_t; - struct mbsp_t { - const bspversion_t *loadversion; + int32_t loadversion; int nummodels; dmodelh2_t *dmodels; @@ -911,7 +792,7 @@ struct mbsp_t { uint32_t *dleaffaces; int numleafbrushes; - uint32_t *dleafbrushes; + uint16_t *dleafbrushes; int numsurfedges; int32_t *dsurfedges; @@ -926,7 +807,7 @@ struct mbsp_t { dbrush_t *dbrushes; int numbrushsides; - q2_dbrushside_qbism_t *dbrushsides; + dbrushside_t *dbrushsides; uint8_t dpop[256]; }; // "generic" bsp - superset of all other supported types @@ -943,7 +824,8 @@ typedef struct { } q2_dheader_t; typedef struct { - const bspversion_t *version, *loadversion; + int32_t loadversion; + int32_t version; int hullcount; struct { @@ -952,7 +834,6 @@ typedef struct { bsp2_t bsp2; q2bsp_t q2bsp; mbsp_t mbsp; - q2bsp_qbism_t q2bsp_qbism; } data; bspxentry_t *bspxentries; @@ -961,7 +842,7 @@ typedef struct { void LoadBSPFile(char *filename, bspdata_t *bspdata); //returns the filename as contained inside a bsp void WriteBSPFile(const char *filename, bspdata_t *bspdata); void PrintBSPFileSizes(const bspdata_t *bspdata); -void ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version); +void ConvertBSPFormat(int32_t version, bspdata_t *bspdata); void BSPX_AddLump(bspdata_t *bspdata, const char *xname, const void *xdata, size_t xsize); const void *BSPX_GetLump(bspdata_t *bspdata, const char *xname, size_t *xsize); diff --git a/light/entities.cc b/light/entities.cc index 5ee1e76e..be2fd378 100644 --- a/light/entities.cc +++ b/light/entities.cc @@ -1579,7 +1579,7 @@ static void MakeSurfaceLights(const mbsp_t *bsp) for (int i = 0; i < bsp->numleafs; i++) { const mleaf_t *leaf = bsp->dleafs + i; - const qboolean underwater = ((bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) ? leaf->contents & Q2_CONTENTS_LIQUID : leaf->contents != CONTENTS_EMPTY); //mxd + const qboolean underwater = (bsp->loadversion == Q2_BSPVERSION ? leaf->contents & Q2_CONTENTS_LIQUID : leaf->contents != CONTENTS_EMPTY); //mxd for (int k = 0; k < leaf->nummarksurfaces; k++) { const int facenum = bsp->dleaffaces[leaf->firstmarksurface + k]; diff --git a/light/imglib.cc b/light/imglib.cc index 37e9abac..3093db64 100644 --- a/light/imglib.cc +++ b/light/imglib.cc @@ -44,7 +44,7 @@ void // WHO TOUCHED MY PALET? LoadPalette(bspdata_t *bspdata) { // Load Quake 2 palette - if (bspdata->loadversion == &bspver_q2 || bspdata->loadversion == &bspver_qbism) { + if (bspdata->loadversion == Q2_BSPVERSION) { uint8_t *palette; char path[1024]; char colormap[] = "pics/colormap.pcx"; @@ -66,7 +66,7 @@ LoadPalette(bspdata_t *bspdata) for (int i = 0; i < 768; i++) thepalette[i] = palette[i]; - } else if (bspdata->loadversion == &bspver_h2) { + } else if (bspdata->hullcount == MAX_MAP_HULLS_H2) { // Gross hacks // Copy Hexen 2 palette for (int i = 0; i < 768; i++) thepalette[i] = hexen2palette[i]; @@ -721,7 +721,7 @@ void // Expects correct palette and game/mod paths to be set LoadOrConvertTextures(mbsp_t *bsp) { // Load or convert textures... - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) + if (bsp->loadversion == Q2_BSPVERSION) LoadTextures(bsp); else if (bsp->texdatasize > 0) ConvertTextures(bsp); diff --git a/light/light.cc b/light/light.cc index 4c4c0a90..2851c2b2 100644 --- a/light/light.cc +++ b/light/light.cc @@ -439,7 +439,7 @@ LightWorld(bspdata_t *bspdata, qboolean forcedscale) CalcualateVertexNormals(bsp); const qboolean bouncerequired = cfg_static.bounce.boolValue() && (debugmode == debugmode_none || debugmode == debugmode_bounce || debugmode == debugmode_bouncelights); //mxd - const qboolean isQuake2map = (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism); //mxd + const qboolean isQuake2map = (bsp->loadversion == Q2_BSPVERSION); //mxd if (bouncerequired || isQuake2map) { MakeTextureColors(bsp); @@ -470,7 +470,7 @@ LightWorld(bspdata_t *bspdata, qboolean forcedscale) // Transfer greyscale lightmap (or color lightmap for Q2/HL) to the bsp and update lightdatasize if (!litonly) { free(bsp->dlightdata); - if (isQuake2map || bsp->loadversion == &bspver_hl) { + if (bsp->loadversion == Q2_BSPVERSION || bsp->loadversion == BSPHLVERSION) { bsp->lightdatasize = lit_file_p; bsp->dlightdata = (uint8_t *)malloc(bsp->lightdatasize); memcpy(bsp->dlightdata, lit_filebase, bsp->lightdatasize); @@ -545,9 +545,9 @@ LoadExtendedTexinfoFlags(const char *sourcefilename, const mbsp_t *bsp) static const char* //mxd GetBaseDirName(bspdata_t *bspdata) { - if (bspdata->loadversion == &bspver_q2 || bspdata->loadversion == &bspver_qbism) + if (bspdata->loadversion == Q2_BSPVERSION) return "BASEQ2"; - if (bspdata->loadversion == &bspver_h2) + if (bspdata->hullcount == MAX_MAP_HULLS_H2) return "DATA1"; return "ID1"; } @@ -951,7 +951,7 @@ light_main(int argc, const char **argv) { bspdata_t bspdata; mbsp_t *const bsp = &bspdata.data.mbsp; - const bspversion_t *loadversion; + int32_t loadversion; int i; double start; double end; @@ -1199,10 +1199,10 @@ light_main(int argc, const char **argv) LoadBSPFile(source, &bspdata); loadversion = bspdata.version; - ConvertBSPFormat(&bspdata, &bspver_generic); + ConvertBSPFormat(GENERIC_BSP, &bspdata); //mxd. Use 1.0 rangescale as a default to better match with qrad3/arghrad - if ((loadversion == &bspver_q2 || loadversion == &bspver_qbism) && !cfg.rangescale.isChanged()) + if (loadversion == Q2_BSPVERSION && !cfg.rangescale.isChanged()) { const auto rs = new lockable_vec_t(cfg.rangescale.primaryName(), 1.0f, 0.0f, 100.0f); cfg.rangescale = *rs; // Gross hacks to avoid displaying this in OptionsSummary... @@ -1242,7 +1242,7 @@ light_main(int argc, const char **argv) if (!onlyents) { - if (loadversion != &bspver_q2 && loadversion != &bspver_qbism && bsp->loadversion != &bspver_hl) //mxd. No lit for Quake 2 + if (loadversion != Q2_BSPVERSION && bsp->loadversion != BSPHLVERSION) //mxd. No lit for Quake 2 CheckLitNeeded(cfg); SetupDirt(cfg); @@ -1281,7 +1281,7 @@ light_main(int argc, const char **argv) WriteEntitiesToString(cfg, bsp); /* Convert data format back if necessary */ - ConvertBSPFormat(&bspdata, loadversion); + ConvertBSPFormat(loadversion, &bspdata); if (!litonly) { WriteBSPFile(source, &bspdata); diff --git a/light/ltface.cc b/light/ltface.cc index 365663f5..6c964877 100644 --- a/light/ltface.cc +++ b/light/ltface.cc @@ -1034,7 +1034,7 @@ GetLightContrib(const globalconfig_t &cfg, const light_t *entity, const vec3_t s if (dist < 0.1) { // Catch 0 distance between sample point and light (produces infinite brightness / nan's) and causes // problems later - dist = 0.1f; + dist = 0.1; VectorSet(surfpointToLightDir_out, 0, 0, 1); } const float add = GetLightValueWithAngle(cfg, entity, surfnorm, surfpointToLightDir_out, dist, twosided); @@ -3081,7 +3081,7 @@ WriteLightmaps(const mbsp_t *bsp, bsp2_dface_t *face, facesup_t *facesup, const continue; // skip lightmaps where all samples have brightness below 1 - if (bsp->loadversion != &bspver_q2 && bsp->loadversion != &bspver_qbism) { // HACK: don't do this on Q2. seems if all styles are 0xff, the face is drawn fullbright instead of black (Q1) + if (bsp->loadversion != Q2_BSPVERSION) { // HACK: don't do this on Q2. seems if all styles are 0xff, the face is drawn fullbright instead of black (Q1) const float maxb = Lightmap_MaxBrightness(&lightmap, lightsurf); if (maxb < 1) continue; @@ -3146,7 +3146,7 @@ WriteLightmaps(const mbsp_t *bsp, bsp2_dface_t *face, facesup_t *facesup, const // q2 support int lightofs; - if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism || bsp->loadversion == &bspver_hl) { + if (bsp->loadversion == Q2_BSPVERSION || bsp->loadversion == BSPHLVERSION) { lightofs = lit - lit_filebase; } else { lightofs = out - filebase; diff --git a/light/trace.cc b/light/trace.cc index 4bcf6174..3828cca3 100644 --- a/light/trace.cc +++ b/light/trace.cc @@ -716,7 +716,7 @@ TraceFaces (traceinfo_t *ti, int node, const vec3_t start, const vec3_t end) // only solid and sky faces stop the trace. bool issolid, issky; //mxd - if(bsp_static->loadversion == &bspver_q2 || bsp_static->loadversion == &bspver_qbism) { + if(bsp_static->loadversion == Q2_BSPVERSION) { issolid = !(fi->content & Q2_SURF_TRANSLUCENT); issky = (fi->content & Q2_SURF_SKY); } else { diff --git a/light/trace_embree.cc b/light/trace_embree.cc index f9a5322e..811fe4bc 100644 --- a/light/trace_embree.cc +++ b/light/trace_embree.cc @@ -354,7 +354,7 @@ Embree_FilterFuncN(const struct RTCFilterFunctionNArguments* args) //mxd bool isFence, isGlass; - if(bsp_static->loadversion == &bspver_q2 || bsp_static->loadversion == &bspver_qbism) { + if(bsp_static->loadversion == Q2_BSPVERSION) { const int contents = Face_Contents(bsp_static, face); isFence = ((contents & Q2_SURF_TRANSLUCENT) == Q2_SURF_TRANSLUCENT); // KMQuake 2-specific. Use texture alpha chanel when both flags are set. isGlass = !isFence && (contents & Q2_SURF_TRANSLUCENT); @@ -559,7 +559,7 @@ MakeFaces_r(const mbsp_t *bsp, const int nodenum, std::vector *planes, const int leafnum = -nodenum - 1; const mleaf_t *leaf = &bsp->dleafs[leafnum]; - if ((bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) ? leaf->contents & Q2_CONTENTS_SOLID : leaf->contents == CONTENTS_SOLID) { + if (bsp->loadversion == Q2_BSPVERSION ? leaf->contents & Q2_CONTENTS_SOLID : leaf->contents == CONTENTS_SOLID) { std::vector leaf_windings = Leaf_MakeFaces(bsp, leaf, *planes); for (winding_t *w : leaf_windings) { result->push_back(w); @@ -631,16 +631,15 @@ Embree_TraceInit(const mbsp_t *bsp) const int contents = Face_Contents(bsp, face); //mxd const gtexinfo_t *texinfo = Face_Texinfo(bsp, face); - const bool is_q2 = bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism; //mxd. Skip NODRAW faces, but not SKY ones (Q2's sky01.wal has both flags set) - if(is_q2 && (contents & Q2_SURF_NODRAW) && !(contents & Q2_SURF_SKY)) + if(bsp->loadversion == Q2_BSPVERSION && (contents & Q2_SURF_NODRAW) && !(contents & Q2_SURF_SKY)) continue; // handle glass / water const float alpha = Face_Alpha(model, face); if (alpha < 1.0f - || (is_q2 && (contents & Q2_SURF_TRANSLUCENT))) { //mxd. Both fence and transparent textures are done using SURF_TRANS flags in Q2 + || (bsp->loadversion == Q2_BSPVERSION && (contents & Q2_SURF_TRANSLUCENT))) { //mxd. Both fence and transparent textures are done using SURF_TRANS flags in Q2 filterfaces.push_back(face); continue; } @@ -653,7 +652,7 @@ Embree_TraceInit(const mbsp_t *bsp) } // handle sky - if (is_q2) { + if (bsp->loadversion == Q2_BSPVERSION) { // Q2: arghrad compat: sky faces only emit sunlight if: // sky flag set, light flag set, value nonzero if ((contents & Q2_SURF_SKY) != 0 diff --git a/vis/vis.cc b/vis/vis.cc index afe29eaf..64daa1b8 100644 --- a/vis/vis.cc +++ b/vis/vis.cc @@ -1234,7 +1234,7 @@ main(int argc, char **argv) { bspdata_t bspdata; mbsp_t *const bsp = &bspdata.data.mbsp; - const bspversion_t *loadversion; + int32_t loadversion; int i; init_log("vis.log"); @@ -1309,7 +1309,7 @@ main(int argc, char **argv) LoadBSPFile(sourcefile, &bspdata); loadversion = bspdata.version; - ConvertBSPFormat(&bspdata, &bspver_generic); + ConvertBSPFormat(GENERIC_BSP, &bspdata); strcpy(portalfile, argv[i]); StripExtension(portalfile); @@ -1341,7 +1341,7 @@ main(int argc, char **argv) CalcAmbientSounds(bsp); /* Convert data format back if necessary */ - ConvertBSPFormat(&bspdata, loadversion); + ConvertBSPFormat(loadversion, &bspdata); WriteBSPFile(sourcefile, &bspdata); From e0cce38d55a3f12feeb6728929e0b1c7768796d6 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 15:24:46 -0600 Subject: [PATCH 05/19] tests: add vis to path before running regression tests move leaktest invocation to automated_tests.sh --- build-linux-64.sh | 8 ++------ build-osx.sh | 8 ++------ testmaps/automatated_tests.sh | 4 ++++ 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/build-linux-64.sh b/build-linux-64.sh index 5b0a9828..c0879f74 100755 --- a/build-linux-64.sh +++ b/build-linux-64.sh @@ -35,12 +35,8 @@ readelf -d ./light/light unzip -X ericw-tools-*.zip readelf -d ./ericw-tools-*/bin/light -# coarse tests on real maps (only checks success/failure exit status of tool) +# run regression tests cd .. -export PATH="$(pwd)/$BUILD_DIR/qbsp:$(pwd)/$BUILD_DIR/light:$PATH" +export PATH="$(pwd)/$BUILD_DIR/qbsp:$(pwd)/$BUILD_DIR/light:$(pwd)/$BUILD_DIR/vis:$PATH" cd testmaps ./automatated_tests.sh || exit 1 - -# test id1 maps for leaks -cd quake_map_source -./leaktest.sh || exit 1 diff --git a/build-osx.sh b/build-osx.sh index f26104ed..115da8d1 100755 --- a/build-osx.sh +++ b/build-osx.sh @@ -46,12 +46,8 @@ otool -L ./bsputil/bsputil ./light/testlight || exit 1 ./qbsp/testqbsp || exit 1 -# coarse tests on real maps (only checks success/failure exit status of tool) +# run regression tests cd .. -export PATH="$(pwd)/$BUILD_DIR/qbsp:$(pwd)/$BUILD_DIR/light:$PATH" +export PATH="$(pwd)/$BUILD_DIR/qbsp:$(pwd)/$BUILD_DIR/light:$(pwd)/$BUILD_DIR/vis:$PATH" cd testmaps ./automatated_tests.sh || exit 1 - -# test id1 maps for leaks -cd quake_map_source -./leaktest.sh || exit 1 diff --git a/testmaps/automatated_tests.sh b/testmaps/automatated_tests.sh index f88cea02..80c21dcd 100755 --- a/testmaps/automatated_tests.sh +++ b/testmaps/automatated_tests.sh @@ -51,3 +51,7 @@ done for bsp in ${HASH_CHECK_BSPS}; do light ${bsp} || exit 1 done + +# leak tests on all id1 maps +cd quake_map_source +./leaktest.sh || exit 1 From a8a564300cf4238403eaff99280f97e400b60f3c Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 15:26:48 -0600 Subject: [PATCH 06/19] tests: move unused tests to deprecated folder --- testmaps/{ => deprecated}/alignment.map | 0 testmaps/{ => deprecated}/badoffset.map | 0 testmaps/{ => deprecated}/badshearrotate.map | 0 testmaps/{ => deprecated}/badshearscale.map | 0 .../{ => deprecated}/bouncecolorscaletest.map | 0 testmaps/{ => deprecated}/calcpointstest.map | 0 testmaps/{ => deprecated}/csg_fail.map | 0 testmaps/{ => deprecated}/csg_fail.txt | 0 testmaps/{ => deprecated}/detailwall.map | 0 testmaps/{ => deprecated}/dirttest.map | 0 testmaps/{ => deprecated}/dirttest2.map | 0 testmaps/{ => deprecated}/falloff.map | 0 testmaps/{ => deprecated}/fence.wad | Bin testmaps/{ => deprecated}/free_wad.wad | Bin testmaps/{ => deprecated}/glasstest.map | 0 testmaps/{ => deprecated}/h2rotate.map | 0 testmaps/{ => deprecated}/light_near_wall.map | 0 testmaps/{ => deprecated}/lightstest1.map | 0 testmaps/{ => deprecated}/make_screenshot.sh | 0 testmaps/{ => deprecated}/make_screenshots.sh | 0 .../{ => deprecated}/missing_face_simple.map | 0 testmaps/{ => deprecated}/nobounce.map | 0 testmaps/{ => deprecated}/offgrid_after.map | 0 testmaps/{ => deprecated}/offgrid_before.map | 0 testmaps/{ => deprecated}/origin.wad | Bin testmaps/{ => deprecated}/phongtest.map | 0 testmaps/{ => deprecated}/qbsp_faces.map | 2092 ++++++++--------- .../{ => deprecated}/shadowself_shadow.map | 0 testmaps/{ => deprecated}/shearedcube.map | 0 testmaps/{ => deprecated}/stairsteptest.map | 0 testmaps/{ => deprecated}/suntest.map | 0 testmaps/{ => deprecated}/swtest.map | 0 testmaps/{ => deprecated}/test.sh | 0 .../{ => deprecated}/test_face_splits.map | 0 testmaps/{ => deprecated}/test_tjunc01.map | 674 +++--- .../{ => deprecated}/testblockedmidpoint.map | 0 testmaps/{ => deprecated}/testlightonface.map | 0 testmaps/{ => deprecated}/testminlight.map | 0 testmaps/{ => deprecated}/testphongtjunc.map | 0 testmaps/{ => deprecated}/testphongtjunc2.map | 0 testmaps/{ => deprecated}/testrotators.map | 0 .../{ => deprecated}/testrotators_bmodel.map | 0 testmaps/{ => deprecated}/testshadows.map | 0 testmaps/{ => deprecated}/testslime.map | 0 .../{ => deprecated}/testsurfacelight.map | 0 45 files changed, 1383 insertions(+), 1383 deletions(-) rename testmaps/{ => deprecated}/alignment.map (100%) rename testmaps/{ => deprecated}/badoffset.map (100%) rename testmaps/{ => deprecated}/badshearrotate.map (100%) rename testmaps/{ => deprecated}/badshearscale.map (100%) rename testmaps/{ => deprecated}/bouncecolorscaletest.map (100%) rename testmaps/{ => deprecated}/calcpointstest.map (100%) rename testmaps/{ => deprecated}/csg_fail.map (100%) rename testmaps/{ => deprecated}/csg_fail.txt (100%) rename testmaps/{ => deprecated}/detailwall.map (100%) rename testmaps/{ => deprecated}/dirttest.map (100%) rename testmaps/{ => deprecated}/dirttest2.map (100%) rename testmaps/{ => deprecated}/falloff.map (100%) rename testmaps/{ => deprecated}/fence.wad (100%) rename testmaps/{ => deprecated}/free_wad.wad (100%) rename testmaps/{ => deprecated}/glasstest.map (100%) rename testmaps/{ => deprecated}/h2rotate.map (100%) rename testmaps/{ => deprecated}/light_near_wall.map (100%) rename testmaps/{ => deprecated}/lightstest1.map (100%) rename testmaps/{ => deprecated}/make_screenshot.sh (100%) mode change 100755 => 100644 rename testmaps/{ => deprecated}/make_screenshots.sh (100%) mode change 100755 => 100644 rename testmaps/{ => deprecated}/missing_face_simple.map (100%) rename testmaps/{ => deprecated}/nobounce.map (100%) rename testmaps/{ => deprecated}/offgrid_after.map (100%) rename testmaps/{ => deprecated}/offgrid_before.map (100%) rename testmaps/{ => deprecated}/origin.wad (100%) rename testmaps/{ => deprecated}/phongtest.map (100%) rename testmaps/{ => deprecated}/qbsp_faces.map (98%) rename testmaps/{ => deprecated}/shadowself_shadow.map (100%) rename testmaps/{ => deprecated}/shearedcube.map (100%) rename testmaps/{ => deprecated}/stairsteptest.map (100%) rename testmaps/{ => deprecated}/suntest.map (100%) rename testmaps/{ => deprecated}/swtest.map (100%) rename testmaps/{ => deprecated}/test.sh (100%) mode change 100755 => 100644 rename testmaps/{ => deprecated}/test_face_splits.map (100%) rename testmaps/{ => deprecated}/test_tjunc01.map (97%) rename testmaps/{ => deprecated}/testblockedmidpoint.map (100%) rename testmaps/{ => deprecated}/testlightonface.map (100%) rename testmaps/{ => deprecated}/testminlight.map (100%) rename testmaps/{ => deprecated}/testphongtjunc.map (100%) rename testmaps/{ => deprecated}/testphongtjunc2.map (100%) rename testmaps/{ => deprecated}/testrotators.map (100%) rename testmaps/{ => deprecated}/testrotators_bmodel.map (100%) rename testmaps/{ => deprecated}/testshadows.map (100%) rename testmaps/{ => deprecated}/testslime.map (100%) rename testmaps/{ => deprecated}/testsurfacelight.map (100%) diff --git a/testmaps/alignment.map b/testmaps/deprecated/alignment.map similarity index 100% rename from testmaps/alignment.map rename to testmaps/deprecated/alignment.map diff --git a/testmaps/badoffset.map b/testmaps/deprecated/badoffset.map similarity index 100% rename from testmaps/badoffset.map rename to testmaps/deprecated/badoffset.map diff --git a/testmaps/badshearrotate.map b/testmaps/deprecated/badshearrotate.map similarity index 100% rename from testmaps/badshearrotate.map rename to testmaps/deprecated/badshearrotate.map diff --git a/testmaps/badshearscale.map b/testmaps/deprecated/badshearscale.map similarity index 100% rename from testmaps/badshearscale.map rename to testmaps/deprecated/badshearscale.map diff --git a/testmaps/bouncecolorscaletest.map b/testmaps/deprecated/bouncecolorscaletest.map similarity index 100% rename from testmaps/bouncecolorscaletest.map rename to testmaps/deprecated/bouncecolorscaletest.map diff --git a/testmaps/calcpointstest.map b/testmaps/deprecated/calcpointstest.map similarity index 100% rename from testmaps/calcpointstest.map rename to testmaps/deprecated/calcpointstest.map diff --git a/testmaps/csg_fail.map b/testmaps/deprecated/csg_fail.map similarity index 100% rename from testmaps/csg_fail.map rename to testmaps/deprecated/csg_fail.map diff --git a/testmaps/csg_fail.txt b/testmaps/deprecated/csg_fail.txt similarity index 100% rename from testmaps/csg_fail.txt rename to testmaps/deprecated/csg_fail.txt diff --git a/testmaps/detailwall.map b/testmaps/deprecated/detailwall.map similarity index 100% rename from testmaps/detailwall.map rename to testmaps/deprecated/detailwall.map diff --git a/testmaps/dirttest.map b/testmaps/deprecated/dirttest.map similarity index 100% rename from testmaps/dirttest.map rename to testmaps/deprecated/dirttest.map diff --git a/testmaps/dirttest2.map b/testmaps/deprecated/dirttest2.map similarity index 100% rename from testmaps/dirttest2.map rename to testmaps/deprecated/dirttest2.map diff --git a/testmaps/falloff.map b/testmaps/deprecated/falloff.map similarity index 100% rename from testmaps/falloff.map rename to testmaps/deprecated/falloff.map diff --git a/testmaps/fence.wad b/testmaps/deprecated/fence.wad similarity index 100% rename from testmaps/fence.wad rename to testmaps/deprecated/fence.wad diff --git a/testmaps/free_wad.wad b/testmaps/deprecated/free_wad.wad similarity index 100% rename from testmaps/free_wad.wad rename to testmaps/deprecated/free_wad.wad diff --git a/testmaps/glasstest.map b/testmaps/deprecated/glasstest.map similarity index 100% rename from testmaps/glasstest.map rename to testmaps/deprecated/glasstest.map diff --git a/testmaps/h2rotate.map b/testmaps/deprecated/h2rotate.map similarity index 100% rename from testmaps/h2rotate.map rename to testmaps/deprecated/h2rotate.map diff --git a/testmaps/light_near_wall.map b/testmaps/deprecated/light_near_wall.map similarity index 100% rename from testmaps/light_near_wall.map rename to testmaps/deprecated/light_near_wall.map diff --git a/testmaps/lightstest1.map b/testmaps/deprecated/lightstest1.map similarity index 100% rename from testmaps/lightstest1.map rename to testmaps/deprecated/lightstest1.map diff --git a/testmaps/make_screenshot.sh b/testmaps/deprecated/make_screenshot.sh old mode 100755 new mode 100644 similarity index 100% rename from testmaps/make_screenshot.sh rename to testmaps/deprecated/make_screenshot.sh diff --git a/testmaps/make_screenshots.sh b/testmaps/deprecated/make_screenshots.sh old mode 100755 new mode 100644 similarity index 100% rename from testmaps/make_screenshots.sh rename to testmaps/deprecated/make_screenshots.sh diff --git a/testmaps/missing_face_simple.map b/testmaps/deprecated/missing_face_simple.map similarity index 100% rename from testmaps/missing_face_simple.map rename to testmaps/deprecated/missing_face_simple.map diff --git a/testmaps/nobounce.map b/testmaps/deprecated/nobounce.map similarity index 100% rename from testmaps/nobounce.map rename to testmaps/deprecated/nobounce.map diff --git a/testmaps/offgrid_after.map b/testmaps/deprecated/offgrid_after.map similarity index 100% rename from testmaps/offgrid_after.map rename to testmaps/deprecated/offgrid_after.map diff --git a/testmaps/offgrid_before.map b/testmaps/deprecated/offgrid_before.map similarity index 100% rename from testmaps/offgrid_before.map rename to testmaps/deprecated/offgrid_before.map diff --git a/testmaps/origin.wad b/testmaps/deprecated/origin.wad similarity index 100% rename from testmaps/origin.wad rename to testmaps/deprecated/origin.wad diff --git a/testmaps/phongtest.map b/testmaps/deprecated/phongtest.map similarity index 100% rename from testmaps/phongtest.map rename to testmaps/deprecated/phongtest.map diff --git a/testmaps/qbsp_faces.map b/testmaps/deprecated/qbsp_faces.map similarity index 98% rename from testmaps/qbsp_faces.map rename to testmaps/deprecated/qbsp_faces.map index 47084711..491d40c5 100644 --- a/testmaps/qbsp_faces.map +++ b/testmaps/deprecated/qbsp_faces.map @@ -1,1046 +1,1046 @@ -// Game: Quake -// Format: Valve -// entity 0 -{ -"classname" "worldspawn" -"mapversion" "220" -"wad" "quake.wad" -"message" "Tjunk" -// brush 0 -{ -( 2032 -2032 2048 ) ( 2032 -2032 -2048 ) ( 2032 -2048 2048 ) egypt04 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( -3328 -2032 -2048 ) ( -3328 -2032 2048 ) ( -3328 -2048 -2048 ) egypt04 [ 0 -1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( -2032 -2032 -2048 ) ( 2032 -2032 -2048 ) ( -2032 -2032 2048 ) skyaop [ 1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( -2032 -2048 -2048 ) ( -2032 -2048 2048 ) ( 2032 -2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( -2032 -2032 2048 ) ( 2032 -2032 2048 ) ( -2032 -2048 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -( 2032 -2032 -2048 ) ( -2032 -2032 -2048 ) ( 2032 -2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 1 -{ -( -3312 -2048 -2048 ) ( -3312 -2048 2048 ) ( -3312 2048 -2048 ) skyaop [ 0 -1 0 -128 ] [ 0 0 -1 -0 ] -0 1 1 -( -3328 -2048 -2048 ) ( -3328 2048 -2048 ) ( -3328 -2048 2048 ) skyaop [ 0 -1 0 -128 ] [ 0 0 -1 -0 ] -0 1 1 -( -3312 3200 -2048 ) ( -3312 3200 2048 ) ( -3328 3200 -2048 ) skyaop [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( -3312 -2048 2048 ) ( -3312 -2048 -2048 ) ( -3328 -2048 2048 ) skyaop [ 1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( -3312 2048 2048 ) ( -3312 -2048 2048 ) ( -3328 2048 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -( -3312 -2048 -2048 ) ( -3312 2048 -2048 ) ( -3328 -2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 2 -{ -( 2048 2048 -2048 ) ( 2048 -2048 -2048 ) ( 2048 2048 2048 ) skyaop [ 0 1 0 128 ] [ 0 0 -1 -0 ] -0 1 1 -( 2032 2048 2048 ) ( 2032 -2048 2048 ) ( 2032 2048 -2048 ) skyaop [ 0 1 0 128 ] [ 0 0 -1 -0 ] -0 1 1 -( 2032 3200 2048 ) ( 2032 3200 -2048 ) ( 2048 3200 2048 ) skyaop [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( 2032 -2048 -2048 ) ( 2032 -2048 2048 ) ( 2048 -2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( 2032 -2048 2048 ) ( 2032 2048 2048 ) ( 2048 -2048 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -( 2032 2048 -2048 ) ( 2032 -2048 -2048 ) ( 2048 2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 3 -{ -( 2032 3184 -2048 ) ( 2032 3184 2048 ) ( 2032 3200 -2048 ) egypt04 [ 0 1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( -3328 3184 2048 ) ( -3328 3184 -2048 ) ( -3328 3200 2048 ) egypt04 [ 0 -1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( -2032 3200 2048 ) ( -2032 3200 -2048 ) ( 2032 3200 2048 ) skyaop [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( 2032 3184 2048 ) ( 2032 3184 -2048 ) ( -2032 3184 2048 ) skyaop [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( 2032 3184 2048 ) ( -2032 3184 2048 ) ( 2032 3200 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -( -2032 3184 -2048 ) ( 2032 3184 -2048 ) ( -2032 3200 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 4 -{ -( 2032 2032 2032 ) ( 2032 -2032 2032 ) ( 2032 2032 2048 ) egypt04 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( -3328 -2032 2032 ) ( -3328 2032 2032 ) ( -3328 -2032 2048 ) egypt04 [ 0 -1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( -2032 3200 2032 ) ( 2032 3200 2032 ) ( -2032 3200 2048 ) egypt04 [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( 2032 -2032 2032 ) ( -2032 -2032 2032 ) ( 2032 -2032 2048 ) egypt04 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 2032 -2032 2048 ) ( -2032 -2032 2048 ) ( 2032 2032 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -( 2032 2032 2032 ) ( -2032 2032 2032 ) ( 2032 -2032 2032 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 5 -{ -( 2032 -2032 -2032 ) ( 2032 2032 -2032 ) ( 2032 -2032 -2048 ) skyaop [ 0 -1 0 -128 ] [ 0 0 -1 0 ] 0 1 1 -( -3328 2032 -2032 ) ( -3328 -2032 -2032 ) ( -3328 2032 -2048 ) skyaop [ 0 -1 0 -128 ] [ 0 0 -1 -0 ] -0 1 1 -( 2032 3200 -2032 ) ( -2032 3200 -2032 ) ( 2032 3200 -2048 ) skyaop [ 1 -2.22045e-16 0 -128 ] [ 0 0 -1 -0 ] -0 1 1 -( -2032 -2032 -2032 ) ( 2032 -2032 -2032 ) ( -2032 -2032 -2048 ) skyaop [ -1 -2.22045e-16 0 -128 ] [ 0 0 -1 -0 ] 0 1 1 -( -2032 -2032 -2032 ) ( -2032 2032 -2032 ) ( 2032 -2032 -2032 ) skyaop [ 0 -1 0 -128 ] [ 1 0 -2.22045e-16 96 ] -0 1 1 -( -2032 -2032 -2048 ) ( 2032 -2032 -2048 ) ( -2032 2032 -2048 ) skyaop [ 0 -1 0 -128 ] [ -1 0 -2.22045e-16 16 ] -0 1 1 -} -// brush 6 -{ -( 432 -1312 208 ) ( 432 -1328 208 ) ( 432 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 224 -1312 224 ) ( 224 -1328 224 ) ( 224 -1312 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 224 -1312 224 ) ( 224 -1312 208 ) ( 432 -1312 224 ) rome01 [ -1 0 0 -80 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1328 224 ) ( 432 -1328 208 ) ( 224 -1328 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 224 -1328 224 ) ( 224 -1312 224 ) ( 432 -1328 224 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -( 224 -1312 192 ) ( 224 -1328 192 ) ( 432 -1312 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 7 -{ -( 448 -1168 208 ) ( 448 -1312 208 ) ( 448 -1168 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1168 224 ) ( 432 -1312 224 ) ( 432 -1168 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1168 224 ) ( 432 -1168 208 ) ( 448 -1168 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 448 -1312 224 ) ( 448 -1312 208 ) ( 432 -1312 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1312 224 ) ( 432 -1168 224 ) ( 448 -1312 224 ) rome01 [ 0 -1 0 -32 ] [ -1 0 0 -80 ] 90 1 1 -( 432 -1168 192 ) ( 432 -1312 192 ) ( 448 -1168 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 8 -{ -( 448 -1312 208 ) ( 448 -1328 208 ) ( 448 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 448 -1328 224 ) ( 448 -1328 208 ) ( 432 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 448 -1312 224 ) ( 432 -1312 224 ) ( 448 -1312 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 448 -1312 224 ) ( 448 -1328 224 ) ( 432 -1312 224 ) rome01 [ 0 -1 0 -32 ] [ -1 0 0 -80 ] 90 1 1 -( 448 -1312 192 ) ( 432 -1312 192 ) ( 448 -1328 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 9 -{ -( 432 -1312 224 ) ( 432 -1312 208 ) ( 448 -1328 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1328 208 ) ( 432 -1312 208 ) ( 432 -1328 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1328 224 ) ( 448 -1328 224 ) ( 432 -1328 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1328 224 ) ( 432 -1312 224 ) ( 448 -1328 224 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -( 432 -1312 192 ) ( 432 -1328 192 ) ( 448 -1328 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 10 -{ -( 432 -1168 192 ) ( 432 -1312 192 ) ( 432 -1168 208 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 224 -1168 208 ) ( 224 -1312 208 ) ( 224 -1168 192 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 224 -1168 208 ) ( 224 -1168 192 ) ( 432 -1168 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 -( 432 -1312 208 ) ( 432 -1312 192 ) ( 224 -1312 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 -( 224 -1312 208 ) ( 224 -1168 208 ) ( 432 -1312 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 32 ] -0 1 1 -( 224 -1168 192 ) ( 224 -1312 192 ) ( 432 -1168 192 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 32 ] -0 1 1 -} -// brush 11 -{ -( 320 -1264 224 ) ( 320 -1264 208 ) ( 320 -1312 216 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1264 220 ) ( 320 -1312 216 ) ( 240 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1264 208 ) ( 320 -1264 208 ) ( 240 -1264 220 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1264 220 ) ( 320 -1264 224 ) ( 320 -1312 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -( 320 -1264 208 ) ( 240 -1264 208 ) ( 320 -1312 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 12 -{ -( 432 -1312 208 ) ( 320 -1264 224 ) ( 432 -1184 216 ) egypt14 [ 0.992278 0 -0.124035 15.861 ] [ 0 -1 0 -32 ] -0 1 1 -( 320 -1264 208 ) ( 432 -1184 216 ) ( 320 -1264 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1417.5999999999999 198.39999999999998 ) ( 320 -1264 208 ) ( 320 -1264 224 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1417.5999999999999 198.39999999999998 ) ( 320 -1264 224 ) ( 432 -1312 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -( 320 -1264 208 ) ( 320 -1417.5999999999999 198.39999999999998 ) ( 432 -1184 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 13 -{ -( 320 -1312 216 ) ( 240 -1264 220 ) ( 240 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1312 208 ) ( 240 -1264 208 ) ( 240 -1264 220 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1312 208 ) ( 240 -1264 220 ) ( 320 -1312 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -( 240 -1312 208 ) ( 320 -1312 216 ) ( 240 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 14 -{ -( 320 -1264 224 ) ( 432 -1184 216 ) ( 320 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1184 224 ) ( 320 -1264 224 ) ( 320 -1184 208 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1184 208 ) ( 432 -1184 216 ) ( 320 -1184 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1264 224 ) ( 320 -1184 224 ) ( 432 -1184 216 ) egypt14 [ 0.992278 0 -0.124035 15.861 ] [ 0 -1 0 -32 ] -0 1 1 -( 320 -1184 208 ) ( 320 -1264 208 ) ( 432 -1184 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 15 -{ -( 320 -1184 208 ) ( 320 -1264 208 ) ( 320 -1184 224 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1264 224 ) ( 320 -1264 208 ) ( 240 -1232 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1184 224 ) ( 240 -1232 224 ) ( 240 -1184 208 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1184 224 ) ( 240 -1184 208 ) ( 320 -1184 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1232 224 ) ( 240 -1184 224 ) ( 320 -1264 224 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -( 240 -1184 208 ) ( 240 -1232 208 ) ( 320 -1184 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 16 -{ -( 240 -1232 208 ) ( 320 -1264 208 ) ( 240 -1232 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1264 208 ) ( 240 -1232 208 ) ( 240 -1264 220 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1264 220 ) ( 240 -1232 224 ) ( 320 -1264 224 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -( 240 -1264 220 ) ( 320 -1264 224 ) ( 240 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1232 208 ) ( 240 -1264 208 ) ( 320 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 17 -{ -( 504 -1184 352 ) ( 504 -1168 352 ) ( 504 -1184 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1168 352 ) ( 240 -1184 352 ) ( 240 -1168 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 504 -1168 352 ) ( 240 -1168 352 ) ( 504 -1168 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1184 352 ) ( 504 -1184 352 ) ( 240 -1184 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1168 352 ) ( 504 -1168 352 ) ( 240 -1184 352 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -( 240 -1184 208 ) ( 504 -1184 208 ) ( 240 -1168 208 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 18 -{ -( 128 -1312 208 ) ( 128 -1328 208 ) ( 128 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( -80 -1312 224 ) ( -80 -1328 224 ) ( -80 -1312 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( -80 -1312 224 ) ( -80 -1312 208 ) ( 128 -1312 224 ) rome01 [ -1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1328 224 ) ( 128 -1328 208 ) ( -80 -1328 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -80 -1328 224 ) ( -80 -1312 224 ) ( 128 -1328 224 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -( -80 -1312 192 ) ( -80 -1328 192 ) ( 128 -1312 192 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 19 -{ -( 144 -1168 208 ) ( 144 -1312 208 ) ( 144 -1168 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1168 224 ) ( 128 -1312 224 ) ( 128 -1168 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1168 224 ) ( 128 -1168 208 ) ( 144 -1168 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 144 -1312 224 ) ( 144 -1312 208 ) ( 128 -1312 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1312 224 ) ( 128 -1168 224 ) ( 144 -1312 224 ) rome01 [ 0 -1 0 -32 ] [ -1 0 0 -0 ] 90 1 1 -( 128 -1168 192 ) ( 128 -1312 192 ) ( 144 -1168 192 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 20 -{ -( 144 -1312 208 ) ( 144 -1328 208 ) ( 144 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 144 -1328 224 ) ( 144 -1328 208 ) ( 128 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 144 -1312 224 ) ( 128 -1312 224 ) ( 144 -1312 208 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 144 -1312 224 ) ( 144 -1328 224 ) ( 128 -1312 224 ) rome01 [ 0 -1 0 -32 ] [ -1 0 0 -128 ] 90 1 1 -( 144 -1312 192 ) ( 128 -1312 192 ) ( 144 -1328 192 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 21 -{ -( 128 -1312 224 ) ( 128 -1312 208 ) ( 144 -1328 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1328 208 ) ( 128 -1312 208 ) ( 128 -1328 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1328 224 ) ( 144 -1328 224 ) ( 128 -1328 208 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1328 224 ) ( 128 -1312 224 ) ( 144 -1328 224 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 -( 128 -1312 192 ) ( 128 -1328 192 ) ( 144 -1328 192 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 22 -{ -( 128 -1168 192 ) ( 128 -1312 192 ) ( 128 -1168 208 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( -80 -1168 208 ) ( -80 -1312 208 ) ( -80 -1168 192 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( -80 -1168 208 ) ( -80 -1168 192 ) ( 128 -1168 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 128 -1312 208 ) ( 128 -1312 192 ) ( -80 -1312 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( -80 -1312 208 ) ( -80 -1168 208 ) ( 128 -1312 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 -1 0 32 ] -0 1 1 -( -80 -1168 192 ) ( -80 -1312 192 ) ( 128 -1168 192 ) afloor1_3 [ 1 0 0 -0 ] [ 0 -1 0 32 ] -0 1 1 -} -// brush 23 -{ -( 16 -1264 224 ) ( 16 -1264 208 ) ( 16 -1312 216 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1264 220 ) ( 16 -1312 216 ) ( -64 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1264 208 ) ( 16 -1264 208 ) ( -64 -1264 220 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1264 220 ) ( 16 -1264 224 ) ( 16 -1312 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 -( 16 -1264 208 ) ( -64 -1264 208 ) ( 16 -1312 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 24 -{ -( 128 -1312 208 ) ( 16 -1264 224 ) ( 128 -1184 216 ) egypt14 [ 0.992278 0 -0.124035 61.5135 ] [ 0 -1 0 -32 ] -0 1 1 -( 16 -1264 208 ) ( 128 -1184 216 ) ( 16 -1264 224 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 96 ] -0 1 1 -( 16 -1417.5999999999999 198.39999999999998 ) ( 16 -1264 208 ) ( 16 -1264 224 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 16 -1417.5999999999999 198.39999999999998 ) ( 16 -1264 224 ) ( 128 -1312 208 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 -( 16 -1264 208 ) ( 16 -1417.5999999999999 198.39999999999998 ) ( 128 -1184 216 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 25 -{ -( 16 -1312 216 ) ( -64 -1264 220 ) ( -64 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1312 208 ) ( -64 -1264 208 ) ( -64 -1264 220 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1312 208 ) ( -64 -1264 220 ) ( 16 -1312 216 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -( -64 -1312 208 ) ( 16 -1312 216 ) ( -64 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 26 -{ -( 16 -1264 224 ) ( 128 -1184 216 ) ( 16 -1264 208 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 96 ] -0 1 1 -( 16 -1184 224 ) ( 16 -1264 224 ) ( 16 -1184 208 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 16 -1184 208 ) ( 128 -1184 216 ) ( 16 -1184 224 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 96 ] -0 1 1 -( 16 -1264 224 ) ( 16 -1184 224 ) ( 128 -1184 216 ) egypt14 [ 0.992278 0 -0.124035 61.5135 ] [ 0 -1 0 -32 ] -0 1 1 -( 16 -1184 208 ) ( 16 -1264 208 ) ( 128 -1184 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 27 -{ -( 16 -1184 208 ) ( 16 -1264 208 ) ( 16 -1184 224 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 16 -1264 224 ) ( 16 -1264 208 ) ( -64 -1232 224 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1184 224 ) ( -64 -1232 224 ) ( -64 -1184 208 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1184 224 ) ( -64 -1184 208 ) ( 16 -1184 224 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1232 224 ) ( -64 -1184 224 ) ( 16 -1264 224 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -( -64 -1184 208 ) ( -64 -1232 208 ) ( 16 -1184 208 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 28 -{ -( -64 -1232 208 ) ( 16 -1264 208 ) ( -64 -1232 224 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1264 208 ) ( -64 -1232 208 ) ( -64 -1264 220 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1264 220 ) ( -64 -1232 224 ) ( 16 -1264 224 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -( -64 -1264 220 ) ( 16 -1264 224 ) ( -64 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1232 208 ) ( -64 -1264 208 ) ( 16 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 -} -// brush 29 -{ -( 432 -1600 208 ) ( 432 -1616 208 ) ( 432 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 224 -1600 224 ) ( 224 -1616 224 ) ( 224 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 224 -1600 224 ) ( 224 -1600 208 ) ( 432 -1600 224 ) rome01 [ -1 0 0 -80 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1616 224 ) ( 432 -1616 208 ) ( 224 -1616 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 224 -1616 224 ) ( 224 -1600 224 ) ( 432 -1616 224 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -( 224 -1600 192 ) ( 224 -1616 192 ) ( 432 -1600 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 30 -{ -( 448 -1456 208 ) ( 448 -1600 208 ) ( 448 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1456 224 ) ( 432 -1600 224 ) ( 432 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1456 224 ) ( 432 -1456 208 ) ( 448 -1456 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 448 -1600 224 ) ( 448 -1600 208 ) ( 432 -1600 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1600 224 ) ( 432 -1456 224 ) ( 448 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -80 ] 90 1 1 -( 432 -1456 192 ) ( 432 -1600 192 ) ( 448 -1456 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 31 -{ -( 448 -1600 208 ) ( 448 -1616 208 ) ( 448 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 448 -1616 224 ) ( 448 -1616 208 ) ( 432 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 448 -1600 224 ) ( 432 -1600 224 ) ( 448 -1600 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 448 -1600 224 ) ( 448 -1616 224 ) ( 432 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -80 ] 90 1 1 -( 448 -1600 192 ) ( 432 -1600 192 ) ( 448 -1616 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 32 -{ -( 432 -1600 224 ) ( 432 -1600 208 ) ( 448 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1616 208 ) ( 432 -1600 208 ) ( 432 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1616 224 ) ( 448 -1616 224 ) ( 432 -1616 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 432 -1616 224 ) ( 432 -1600 224 ) ( 448 -1616 224 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -( 432 -1600 192 ) ( 432 -1616 192 ) ( 448 -1616 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 33 -{ -( 432 -1456 192 ) ( 432 -1600 192 ) ( 432 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 224 -1456 208 ) ( 224 -1600 208 ) ( 224 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 224 -1456 208 ) ( 224 -1456 192 ) ( 432 -1456 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 -( 432 -1600 208 ) ( 432 -1600 192 ) ( 224 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 -( 224 -1600 208 ) ( 224 -1456 208 ) ( 432 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 -( 224 -1456 192 ) ( 224 -1600 192 ) ( 432 -1456 192 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 34 -{ -( 320 -1552 224 ) ( 320 -1552 208 ) ( 320 -1600 216 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1552 220 ) ( 320 -1600 216 ) ( 240 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1552 208 ) ( 320 -1552 208 ) ( 240 -1552 220 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1552 220 ) ( 320 -1552 224 ) ( 320 -1600 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -( 320 -1552 208 ) ( 240 -1552 208 ) ( 320 -1600 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 35 -{ -( 320 -1600 216 ) ( 240 -1552 220 ) ( 240 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1600 208 ) ( 240 -1552 208 ) ( 240 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1600 208 ) ( 240 -1552 220 ) ( 320 -1600 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -( 240 -1600 208 ) ( 320 -1600 216 ) ( 240 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 36 -{ -( 320 -1552 224 ) ( 432 -1472 216 ) ( 320 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1472 224 ) ( 320 -1552 224 ) ( 320 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1472 208 ) ( 432 -1472 216 ) ( 320 -1472 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1552 224 ) ( 320 -1472 224 ) ( 432 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 15.861 ] [ 0 -1 0 -64 ] -0 1 1 -( 320 -1472 208 ) ( 320 -1552 208 ) ( 432 -1472 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 37 -{ -( 320 -1472 208 ) ( 320 -1552 208 ) ( 320 -1472 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1552 224 ) ( 320 -1552 208 ) ( 240 -1520 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1472 224 ) ( 240 -1520 224 ) ( 240 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1472 224 ) ( 240 -1472 208 ) ( 320 -1472 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1520 224 ) ( 240 -1472 224 ) ( 320 -1552 224 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -( 240 -1472 208 ) ( 240 -1520 208 ) ( 320 -1472 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 38 -{ -( 240 -1520 208 ) ( 320 -1552 208 ) ( 240 -1520 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1552 208 ) ( 240 -1520 208 ) ( 240 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1552 220 ) ( 240 -1520 224 ) ( 320 -1552 224 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -( 240 -1552 220 ) ( 320 -1552 224 ) ( 240 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1520 208 ) ( 240 -1552 208 ) ( 320 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 39 -{ -( 504 -1472 352 ) ( 504 -1456 352 ) ( 504 -1472 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1456 352 ) ( 240 -1472 352 ) ( 240 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 504 -1456 352 ) ( 240 -1456 352 ) ( 504 -1456 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1472 352 ) ( 504 -1472 352 ) ( 240 -1472 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 240 -1456 352 ) ( 504 -1456 352 ) ( 240 -1472 352 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -( 240 -1472 208 ) ( 504 -1472 208 ) ( 240 -1456 208 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 40 -{ -( 432 -1600 208 ) ( 320 -1552 224 ) ( 432 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 15.861 ] [ 0 -1 0 -64 ] -0 1 1 -( 320 -1552 208 ) ( 432 -1472 216 ) ( 320 -1552 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1705.5999999999999 198.39999999999998 ) ( 320 -1552 208 ) ( 320 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 320 -1705.5999999999999 198.39999999999998 ) ( 320 -1552 224 ) ( 432 -1600 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -( 320 -1552 208 ) ( 320 -1705.5999999999999 198.39999999999998 ) ( 432 -1472 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 -( 224 -1600 224 ) ( 432 -1600 224 ) ( 224 -1600 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 -64 ] 0 1 1 -} -// brush 41 -{ -( 128 -1600 208 ) ( 128 -1616 208 ) ( 128 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -80 -1600 224 ) ( -80 -1616 224 ) ( -80 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -80 -1600 224 ) ( -80 -1600 208 ) ( 128 -1600 224 ) rome01 [ -1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1616 224 ) ( 128 -1616 208 ) ( -80 -1616 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -80 -1616 224 ) ( -80 -1600 224 ) ( 128 -1616 224 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 -( -80 -1600 192 ) ( -80 -1616 192 ) ( 128 -1600 192 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 42 -{ -( 128 -1456 192 ) ( 128 -1600 192 ) ( 128 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( -80 -1456 208 ) ( -80 -1600 208 ) ( -80 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( -80 -1456 208 ) ( -80 -1456 192 ) ( 128 -1456 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 128 -1600 208 ) ( 128 -1600 192 ) ( -80 -1600 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( -80 -1600 208 ) ( -80 -1456 208 ) ( 128 -1600 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -( -80 -1456 192 ) ( -80 -1600 192 ) ( 128 -1456 192 ) afloor1_3 [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 43 -{ -( 16 -1552 224 ) ( 16 -1552 208 ) ( 16 -1600 216 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1552 220 ) ( 16 -1600 216 ) ( -64 -1552 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1552 208 ) ( 16 -1552 208 ) ( -64 -1552 220 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1552 220 ) ( 16 -1552 224 ) ( 16 -1600 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 -( 16 -1552 208 ) ( -64 -1552 208 ) ( 16 -1600 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 44 -{ -( 16 -1600 216 ) ( -64 -1552 220 ) ( -64 -1552 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1600 208 ) ( -64 -1552 208 ) ( -64 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -64 -1600 208 ) ( -64 -1552 220 ) ( 16 -1600 216 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 -( -64 -1600 208 ) ( 16 -1600 216 ) ( -64 -1552 208 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 45 -{ -( 128 -1600 224 ) ( 128 -1600 208 ) ( 144 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1616 208 ) ( 128 -1600 208 ) ( 128 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1616 224 ) ( 144 -1616 224 ) ( 128 -1616 208 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1616 224 ) ( 128 -1600 224 ) ( 144 -1616 224 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 -( 128 -1600 192 ) ( 128 -1616 192 ) ( 144 -1616 192 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 46 -{ -( 144 -1600 208 ) ( 144 -1616 208 ) ( 144 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 144 -1616 224 ) ( 144 -1616 208 ) ( 128 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 144 -1600 224 ) ( 128 -1600 224 ) ( 144 -1600 208 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 144 -1600 224 ) ( 144 -1616 224 ) ( 128 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -128 ] 90 1 1 -( 144 -1600 192 ) ( 128 -1600 192 ) ( 144 -1616 192 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 47 -{ -( 144 -1456 208 ) ( 144 -1600 208 ) ( 144 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1456 224 ) ( 128 -1600 224 ) ( 128 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1456 224 ) ( 128 -1456 208 ) ( 144 -1456 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 144 -1600 224 ) ( 144 -1600 208 ) ( 128 -1600 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 128 -1600 224 ) ( 128 -1456 224 ) ( 144 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -0 ] 90 1 1 -( 128 -1456 192 ) ( 128 -1600 192 ) ( 144 -1456 192 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 48 -{ -( 128 -1600 208 ) ( 16 -1552 224 ) ( 128 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 61.5135 ] [ 0 -1 0 -64 ] -0 1 1 -( 16 -1552 208 ) ( 128 -1472 216 ) ( 16 -1552 224 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 96 ] -0 1 1 -( 16 -1705.5999999999999 198.39999999999998 ) ( 16 -1552 208 ) ( 16 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 16 -1705.5999999999999 198.39999999999998 ) ( 16 -1552 224 ) ( 128 -1600 208 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 -( 16 -1552 208 ) ( 16 -1705.5999999999999 198.39999999999998 ) ( 128 -1472 216 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 -( -80 -1600 224 ) ( 128 -1600 224 ) ( -80 -1600 208 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 49 -{ -( -256 -1600 216 ) ( -336 -1552 220 ) ( -336 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 -( -336 -1600 208 ) ( -336 -1552 208 ) ( -336 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -336 -1600 208 ) ( -336 -1552 220 ) ( -256 -1600 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -( -336 -1600 208 ) ( -256 -1600 216 ) ( -336 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 50 -{ -( -256 -1552 224 ) ( -256 -1552 208 ) ( -256 -1600 216 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -336 -1552 220 ) ( -256 -1600 216 ) ( -336 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 -( -336 -1552 208 ) ( -256 -1552 208 ) ( -336 -1552 220 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 -( -336 -1552 220 ) ( -256 -1552 224 ) ( -256 -1600 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -( -256 -1552 208 ) ( -336 -1552 208 ) ( -256 -1600 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 51 -{ -( -144 -1600 208 ) ( -256 -1552 224 ) ( -144 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 75.4131 ] [ 0 -1 0 -64 ] -0 1 1 -( -256 -1552 208 ) ( -144 -1472 216 ) ( -256 -1552 224 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 -( -256 -1705.5999999999999 198.39999999999998 ) ( -256 -1552 208 ) ( -256 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -256 -1705.5999999999999 198.39999999999998 ) ( -256 -1552 224 ) ( -144 -1600 208 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -( -256 -1552 208 ) ( -256 -1705.5999999999999 198.39999999999998 ) ( -144 -1472 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -( -352 -1600 224 ) ( -144 -1600 224 ) ( -352 -1600 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 52 -{ -( -144 -1600 208 ) ( -144 -1616 208 ) ( -144 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -352 -1600 224 ) ( -352 -1616 224 ) ( -352 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -352 -1600 224 ) ( -352 -1600 208 ) ( -144 -1600 224 ) rome01 [ -1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 -( -144 -1616 224 ) ( -144 -1616 208 ) ( -352 -1616 224 ) rome01 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 -( -352 -1616 224 ) ( -352 -1600 224 ) ( -144 -1616 224 ) rome01 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -( -352 -1600 192 ) ( -352 -1616 192 ) ( -144 -1600 192 ) rome01 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 53 -{ -( -144 -1456 192 ) ( -144 -1600 192 ) ( -144 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( -352 -1456 208 ) ( -352 -1600 208 ) ( -352 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( -352 -1456 208 ) ( -352 -1456 192 ) ( -144 -1456 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 -( -144 -1600 208 ) ( -144 -1600 192 ) ( -352 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 -( -352 -1600 208 ) ( -352 -1456 208 ) ( -144 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 -( -352 -1456 192 ) ( -352 -1600 192 ) ( -144 -1456 192 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 54 -{ -( -512 -1600 216 ) ( -592 -1552 220 ) ( -592 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 -( -592 -1600 208 ) ( -592 -1552 208 ) ( -592 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -592 -1600 208 ) ( -592 -1552 220 ) ( -512 -1600 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -( -592 -1600 208 ) ( -512 -1600 216 ) ( -592 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 55 -{ -( -400 -1600 208 ) ( -512 -1552 224 ) ( -400 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 73.4363 ] [ 0 -1 0 -64 ] -0 1 1 -( -512 -1552 208 ) ( -400 -1472 216 ) ( -512 -1552 224 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 -( -512 -1705.5999999999999 198.39999999999998 ) ( -512 -1552 208 ) ( -512 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -512 -1705.5999999999999 198.39999999999998 ) ( -512 -1552 224 ) ( -400 -1600 208 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -( -512 -1552 208 ) ( -512 -1705.5999999999999 198.39999999999998 ) ( -400 -1472 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -( -608 -1600 224 ) ( -400 -1600 224 ) ( -608 -1600 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 56 -{ -( -400 -1600 208 ) ( -400 -1616 208 ) ( -400 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -608 -1600 224 ) ( -608 -1616 224 ) ( -608 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( -608 -1600 224 ) ( -608 -1600 208 ) ( -400 -1600 224 ) rome01 [ -1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 -( -400 -1616 224 ) ( -400 -1616 208 ) ( -608 -1616 224 ) rome01 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 -( -608 -1616 224 ) ( -608 -1600 224 ) ( -400 -1616 224 ) rome01 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -( -608 -1600 192 ) ( -608 -1616 192 ) ( -400 -1600 192 ) rome01 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 57 -{ -( -400 -1456 192 ) ( -400 -1600 192 ) ( -400 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( -608 -1456 208 ) ( -608 -1600 208 ) ( -608 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( -608 -1456 208 ) ( -608 -1456 192 ) ( -400 -1456 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 -( -400 -1600 208 ) ( -400 -1600 192 ) ( -608 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 -( -608 -1600 208 ) ( -608 -1456 208 ) ( -400 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 -( -608 -1456 192 ) ( -608 -1600 192 ) ( -400 -1456 192 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 58 -{ -( 856 -1472 352 ) ( 856 -1456 352 ) ( 856 -1472 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 592 -1456 352 ) ( 592 -1472 352 ) ( 592 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 856 -1456 352 ) ( 592 -1456 352 ) ( 856 -1456 208 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 -( 592 -1472 352 ) ( 856 -1472 352 ) ( 592 -1472 208 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 -( 592 -1456 352 ) ( 856 -1456 352 ) ( 592 -1472 352 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 -( 592 -1472 208 ) ( 856 -1472 208 ) ( 592 -1456 208 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 59 -{ -( 784 -1600 208 ) ( 672 -1552 224 ) ( 784 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -77.4209 ] [ 0 -1 0 -64 ] -0 1 1 -( 672 -1552 208 ) ( 784 -1472 216 ) ( 672 -1552 224 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 0 -1 96 ] -0 1 1 -( 672 -1705.5999999999999 198.39999999999998 ) ( 672 -1552 208 ) ( 672 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 672 -1705.5999999999999 198.39999999999998 ) ( 672 -1552 224 ) ( 784 -1600 208 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 -1 0 -64 ] -0 1 1 -( 672 -1552 208 ) ( 672 -1705.5999999999999 198.39999999999998 ) ( 784 -1472 216 ) egypt14 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 -( 576 -1600 224 ) ( 784 -1600 224 ) ( 576 -1600 208 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 60 -{ -( 672 -1552 224 ) ( 784 -1472 216 ) ( 672 -1552 208 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 0 -1 96 ] -0 1 1 -( 672 -1472 224 ) ( 672 -1552 224 ) ( 672 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 672 -1472 208 ) ( 784 -1472 216 ) ( 672 -1472 224 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 0 -1 96 ] -0 1 1 -( 672 -1552 224 ) ( 672 -1472 224 ) ( 784 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -77.4209 ] [ 0 -1 0 -64 ] -0 1 1 -( 672 -1472 208 ) ( 672 -1552 208 ) ( 784 -1472 216 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 61 -{ -( 800 -1456 208 ) ( 800 -1600 208 ) ( 800 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 784 -1456 224 ) ( 784 -1600 224 ) ( 784 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 784 -1456 224 ) ( 784 -1456 208 ) ( 800 -1456 224 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 -( 800 -1600 224 ) ( 800 -1600 208 ) ( 784 -1600 224 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 -( 784 -1600 224 ) ( 784 -1456 224 ) ( 800 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 16 ] 90 1 1 -( 784 -1456 192 ) ( 784 -1600 192 ) ( 800 -1456 192 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 62 -{ -( 800 -1600 208 ) ( 800 -1616 208 ) ( 800 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 800 -1616 224 ) ( 800 -1616 208 ) ( 784 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 800 -1600 224 ) ( 784 -1600 224 ) ( 800 -1600 208 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 -( 800 -1600 224 ) ( 800 -1616 224 ) ( 784 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 16 ] 90 1 1 -( 800 -1600 192 ) ( 784 -1600 192 ) ( 800 -1616 192 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 63 -{ -( 784 -1600 224 ) ( 784 -1600 208 ) ( 800 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 784 -1616 208 ) ( 784 -1600 208 ) ( 784 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 784 -1616 224 ) ( 800 -1616 224 ) ( 784 -1616 208 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 -( 784 -1616 224 ) ( 784 -1600 224 ) ( 800 -1616 224 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 -( 784 -1600 192 ) ( 784 -1616 192 ) ( 800 -1616 192 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 64 -{ -( 784 -1600 208 ) ( 784 -1616 208 ) ( 784 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 576 -1600 224 ) ( 576 -1616 224 ) ( 576 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 576 -1600 224 ) ( 576 -1600 208 ) ( 784 -1600 224 ) rome01 [ -1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 -( 784 -1616 224 ) ( 784 -1616 208 ) ( 576 -1616 224 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 -( 576 -1616 224 ) ( 576 -1600 224 ) ( 784 -1616 224 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 -( 576 -1600 192 ) ( 576 -1616 192 ) ( 784 -1600 192 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 65 -{ -( 784 -1456 192 ) ( 784 -1600 192 ) ( 784 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 576 -1456 208 ) ( 576 -1600 208 ) ( 576 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 576 -1456 208 ) ( 576 -1456 192 ) ( 784 -1456 208 ) afloor1_3 [ 1 0 0 -16 ] [ 0 0 -1 16 ] -0 1 1 -( 784 -1600 208 ) ( 784 -1600 192 ) ( 576 -1600 208 ) afloor1_3 [ 1 0 0 -16 ] [ 0 0 -1 16 ] -0 1 1 -( 576 -1600 208 ) ( 576 -1456 208 ) ( 784 -1600 208 ) afloor1_3 [ 1 0 0 -16 ] [ 0 -1 0 -0 ] -0 1 1 -( 576 -1456 192 ) ( 576 -1600 192 ) ( 784 -1456 192 ) afloor1_3 [ 1 0 0 -16 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 66 -{ -( 1120 -1600 208 ) ( 1008 -1552 224 ) ( 1120 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -26.8263 ] [ 0 -1 0 -64 ] -0 1 1 -( 1008 -1552 208 ) ( 1120 -1472 216 ) ( 1008 -1552 224 ) egypt14 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1705.5999999999999 198.39999999999998 ) ( 1008 -1552 208 ) ( 1008 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1705.5999999999999 198.39999999999998 ) ( 1008 -1552 224 ) ( 1120 -1600 208 ) egypt14 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 -( 1008 -1552 208 ) ( 1008 -1705.5999999999999 198.39999999999998 ) ( 1120 -1472 216 ) egypt14 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 -( 912 -1600 224 ) ( 1120 -1600 224 ) ( 912 -1600 208 ) egypt14 [ 1 0 0 -96 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 67 -{ -( 1008 -1552 224 ) ( 1120 -1472 216 ) ( 1008 -1552 208 ) egypt14 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1472 224 ) ( 1008 -1552 224 ) ( 1008 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1472 208 ) ( 1120 -1472 216 ) ( 1008 -1472 224 ) egypt14 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1552 224 ) ( 1008 -1472 224 ) ( 1120 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -26.8263 ] [ 0 -1 0 -64 ] -0 1 1 -( 1008 -1472 208 ) ( 1008 -1552 208 ) ( 1120 -1472 216 ) egypt14 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 68 -{ -( 1136 -1456 208 ) ( 1136 -1600 208 ) ( 1136 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1456 224 ) ( 1120 -1600 224 ) ( 1120 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1456 224 ) ( 1120 -1456 208 ) ( 1136 -1456 224 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 -( 1136 -1600 224 ) ( 1136 -1600 208 ) ( 1120 -1600 224 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1600 224 ) ( 1120 -1456 224 ) ( 1136 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 96 ] 90 1 1 -( 1120 -1456 192 ) ( 1120 -1600 192 ) ( 1136 -1456 192 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 69 -{ -( 1120 -1600 208 ) ( 1120 -1616 208 ) ( 1120 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 912 -1600 224 ) ( 912 -1616 224 ) ( 912 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 912 -1600 224 ) ( 912 -1600 208 ) ( 1120 -1600 224 ) rome01 [ -1 0 0 96 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1616 224 ) ( 1120 -1616 208 ) ( 912 -1616 224 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 -( 912 -1616 224 ) ( 912 -1600 224 ) ( 1120 -1616 224 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 -( 912 -1600 192 ) ( 912 -1616 192 ) ( 1120 -1600 192 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 70 -{ -( 1192 -1472 352 ) ( 1192 -1456 352 ) ( 1192 -1472 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1456 352 ) ( 928 -1472 352 ) ( 928 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1192 -1456 352 ) ( 928 -1456 352 ) ( 1192 -1456 208 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1472 352 ) ( 1192 -1472 352 ) ( 928 -1472 208 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1456 352 ) ( 1192 -1456 352 ) ( 928 -1472 352 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 -( 928 -1472 208 ) ( 1192 -1472 208 ) ( 928 -1456 208 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 71 -{ -( 1120 -1456 192 ) ( 1120 -1600 192 ) ( 1120 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1456 208 ) ( 912 -1600 208 ) ( 912 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1456 208 ) ( 912 -1456 192 ) ( 1120 -1456 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 1120 -1600 208 ) ( 1120 -1600 192 ) ( 912 -1600 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1600 208 ) ( 912 -1456 208 ) ( 1120 -1600 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -( 912 -1456 192 ) ( 912 -1600 192 ) ( 1120 -1456 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 72 -{ -( 1440 -1600 208 ) ( 1328 -1552 224 ) ( 1440 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -88.3552 ] [ 0 -1 0 -64 ] -0 1 1 -( 1328 -1552 208 ) ( 1440 -1472 216 ) ( 1328 -1552 224 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1328 -1705.5999999999999 198.39999999999998 ) ( 1328 -1552 208 ) ( 1328 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1328 -1705.5999999999999 198.39999999999998 ) ( 1328 -1552 224 ) ( 1440 -1600 208 ) egypt14 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 -( 1328 -1552 208 ) ( 1328 -1705.5999999999999 198.39999999999998 ) ( 1440 -1472 216 ) egypt14 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 -( 1232 -1600 224 ) ( 1440 -1600 224 ) ( 1232 -1600 208 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 73 -{ -( 1328 -1552 224 ) ( 1440 -1472 216 ) ( 1328 -1552 208 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1328 -1472 224 ) ( 1328 -1552 224 ) ( 1328 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1328 -1472 208 ) ( 1440 -1472 216 ) ( 1328 -1472 224 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1328 -1552 224 ) ( 1328 -1472 224 ) ( 1440 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -88.3552 ] [ 0 -1 0 -64 ] -0 1 1 -( 1328 -1472 208 ) ( 1328 -1552 208 ) ( 1440 -1472 216 ) egypt14 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 74 -{ -( 1456 -1456 208 ) ( 1456 -1600 208 ) ( 1456 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1440 -1456 224 ) ( 1440 -1600 224 ) ( 1440 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1440 -1456 224 ) ( 1440 -1456 208 ) ( 1456 -1456 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1456 -1600 224 ) ( 1456 -1600 208 ) ( 1440 -1600 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1440 -1600 224 ) ( 1440 -1456 224 ) ( 1456 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 32 ] 90 1 1 -( 1440 -1456 192 ) ( 1440 -1600 192 ) ( 1456 -1456 192 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 75 -{ -( 1512 -1472 352 ) ( 1512 -1456 352 ) ( 1512 -1472 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1248 -1456 352 ) ( 1248 -1472 352 ) ( 1248 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1512 -1456 352 ) ( 1248 -1456 352 ) ( 1512 -1456 208 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1248 -1472 352 ) ( 1512 -1472 352 ) ( 1248 -1472 208 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1248 -1456 352 ) ( 1512 -1456 352 ) ( 1248 -1472 352 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 -( 1248 -1472 208 ) ( 1512 -1472 208 ) ( 1248 -1456 208 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 76 -{ -( 1440 -1600 208 ) ( 1440 -1616 208 ) ( 1440 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1232 -1600 224 ) ( 1232 -1616 224 ) ( 1232 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1232 -1600 224 ) ( 1232 -1600 208 ) ( 1440 -1600 224 ) rome01 [ -1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1440 -1616 224 ) ( 1440 -1616 208 ) ( 1232 -1616 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1232 -1616 224 ) ( 1232 -1600 224 ) ( 1440 -1616 224 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 -( 1232 -1600 192 ) ( 1232 -1616 192 ) ( 1440 -1600 192 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 77 -{ -( 1120 -1648 192 ) ( 1120 -1792 192 ) ( 1120 -1648 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1648 208 ) ( 912 -1792 208 ) ( 912 -1648 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1648 208 ) ( 912 -1648 192 ) ( 1120 -1648 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 1120 -1792 208 ) ( 1120 -1792 192 ) ( 912 -1792 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1792 208 ) ( 912 -1648 208 ) ( 1120 -1792 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -( 912 -1648 192 ) ( 912 -1792 192 ) ( 1120 -1648 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 78 -{ -( 1120 -1792 208 ) ( 1008 -1744 224 ) ( 1120 -1664 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 -0 ] -0 1 1 -( 1008 -1744 208 ) ( 1120 -1664 216 ) ( 1008 -1744 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1897.5999999999999 198.39999999999998 ) ( 1008 -1744 208 ) ( 1008 -1744 224 ) egypt14 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1897.5999999999999 198.39999999999998 ) ( 1008 -1744 224 ) ( 1120 -1792 208 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -( 1008 -1744 208 ) ( 1008 -1897.5999999999999 198.39999999999998 ) ( 1120 -1664 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -( 912 -1792 224 ) ( 1120 -1792 224 ) ( 912 -1792 208 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 79 -{ -( 1136 -1648 208 ) ( 1136 -1792 208 ) ( 1136 -1648 224 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1648 224 ) ( 1120 -1792 224 ) ( 1120 -1648 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1648 224 ) ( 1120 -1648 208 ) ( 1136 -1648 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1136 -1792 224 ) ( 1136 -1792 208 ) ( 1120 -1792 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1792 224 ) ( 1120 -1648 224 ) ( 1136 -1792 224 ) rome01 [ 0 -1 0 -0 ] [ -1 0 0 -32 ] 90 1 1 -( 1120 -1648 192 ) ( 1120 -1792 192 ) ( 1136 -1648 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 80 -{ -( 1008 -1744 224 ) ( 1120 -1664 216 ) ( 1008 -1744 208 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1664 224 ) ( 1008 -1744 224 ) ( 1008 -1664 208 ) egypt14 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1664 208 ) ( 1120 -1664 216 ) ( 1008 -1664 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1744 224 ) ( 1008 -1664 224 ) ( 1120 -1664 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 -0 ] -0 1 1 -( 1008 -1664 208 ) ( 1008 -1744 208 ) ( 1120 -1664 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 81 -{ -( 1192 -1664 352 ) ( 1192 -1648 352 ) ( 1192 -1664 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1648 352 ) ( 928 -1664 352 ) ( 928 -1648 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1192 -1648 352 ) ( 928 -1648 352 ) ( 1192 -1648 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1664 352 ) ( 1192 -1664 352 ) ( 928 -1664 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1648 352 ) ( 1192 -1648 352 ) ( 928 -1664 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -( 928 -1664 208 ) ( 1192 -1664 208 ) ( 928 -1648 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 82 -{ -( 1120 -1984 208 ) ( 1008 -1936 224 ) ( 1120 -1856 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 -64 ] -0 1 1 -( 1008 -1936 208 ) ( 1120 -1856 216 ) ( 1008 -1936 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -2089.5999999999999 198.39999999999998 ) ( 1008 -1936 208 ) ( 1008 -1936 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -2089.5999999999999 198.39999999999998 ) ( 1008 -1936 224 ) ( 1120 -1984 208 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 -( 1008 -1936 208 ) ( 1008 -2089.5999999999999 198.39999999999998 ) ( 1120 -1856 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 -( 912 -1984 224 ) ( 1120 -1984 224 ) ( 912 -1984 208 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 83 -{ -( 1136 -1840 208 ) ( 1136 -1984 208 ) ( 1136 -1840 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1840 224 ) ( 1120 -1984 224 ) ( 1120 -1840 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1840 224 ) ( 1120 -1840 208 ) ( 1136 -1840 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1136 -1984 224 ) ( 1136 -1984 208 ) ( 1120 -1984 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1984 224 ) ( 1120 -1840 224 ) ( 1136 -1984 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -32 ] 90 1 1 -( 1120 -1840 192 ) ( 1120 -1984 192 ) ( 1136 -1840 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 84 -{ -( 1192 -1856 352 ) ( 1192 -1840 352 ) ( 1192 -1856 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1840 352 ) ( 928 -1856 352 ) ( 928 -1840 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 -( 1192 -1840 352 ) ( 928 -1840 352 ) ( 1192 -1840 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1856 352 ) ( 1192 -1856 352 ) ( 928 -1856 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1840 352 ) ( 1192 -1840 352 ) ( 928 -1856 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 -( 928 -1856 208 ) ( 1192 -1856 208 ) ( 928 -1840 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 -} -// brush 85 -{ -( 1120 -1840 192 ) ( 1120 -1984 192 ) ( 1120 -1840 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1840 208 ) ( 912 -1984 208 ) ( 912 -1840 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1840 208 ) ( 912 -1840 192 ) ( 1120 -1840 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 1120 -1984 208 ) ( 1120 -1984 192 ) ( 912 -1984 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1984 208 ) ( 912 -1840 208 ) ( 1120 -1984 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -( 912 -1840 192 ) ( 912 -1984 192 ) ( 1120 -1840 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 86 -{ -( 1328 -1744 224 ) ( 1440 -1664 216 ) ( 1328 -1744 208 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1328 -1664 224 ) ( 1328 -1744 224 ) ( 1328 -1664 208 ) egypt14 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1328 -1664 208 ) ( 1440 -1664 216 ) ( 1328 -1664 224 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1328 -1744 224 ) ( 1328 -1664 224 ) ( 1440 -1664 216 ) egypt14 [ 0.992278 0 -0.124035 -88.3552 ] [ 0 -1 0 -0 ] -0 1 1 -( 1328 -1664 208 ) ( 1328 -1744 208 ) ( 1440 -1664 216 ) egypt14 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 87 -{ -( 1512 -1664 352 ) ( 1512 -1648 352 ) ( 1512 -1664 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1248 -1648 352 ) ( 1248 -1664 352 ) ( 1248 -1648 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1512 -1648 352 ) ( 1248 -1648 352 ) ( 1512 -1648 208 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1248 -1664 352 ) ( 1512 -1664 352 ) ( 1248 -1664 208 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1248 -1648 352 ) ( 1512 -1648 352 ) ( 1248 -1664 352 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -( 1248 -1664 208 ) ( 1512 -1664 208 ) ( 1248 -1648 208 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 88 -{ -( 1456 -1648 208 ) ( 1456 -1792 208 ) ( 1456 -1648 224 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1440 -1648 224 ) ( 1440 -1792 224 ) ( 1440 -1648 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1440 -1648 224 ) ( 1440 -1648 208 ) ( 1456 -1648 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1456 -1792 224 ) ( 1456 -1792 208 ) ( 1440 -1792 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1440 -1792 224 ) ( 1440 -1648 224 ) ( 1456 -1792 224 ) rome01 [ 0 -1 0 -0 ] [ -1 0 0 32 ] 90 1 1 -( 1440 -1648 192 ) ( 1440 -1792 192 ) ( 1456 -1648 192 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 89 -{ -( 1440 -1648 192 ) ( 1440 -1792 192 ) ( 1440 -1648 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 1232 -1648 208 ) ( 1232 -1792 208 ) ( 1232 -1648 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 1232 -1648 208 ) ( 1232 -1648 192 ) ( 1440 -1648 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 1440 -1792 208 ) ( 1440 -1792 192 ) ( 1232 -1792 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 1232 -1792 208 ) ( 1232 -1648 208 ) ( 1440 -1792 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -( 1232 -1648 192 ) ( 1232 -1792 192 ) ( 1440 -1648 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 90 -{ -( 1120 -1232 192 ) ( 1120 -1376 192 ) ( 1120 -1232 208 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1232 208 ) ( 912 -1376 208 ) ( 912 -1232 192 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1232 208 ) ( 912 -1232 192 ) ( 1120 -1232 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 1120 -1376 208 ) ( 1120 -1376 192 ) ( 912 -1376 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1376 208 ) ( 912 -1232 208 ) ( 1120 -1376 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 -( 912 -1232 192 ) ( 912 -1376 192 ) ( 1120 -1232 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 -} -// brush 91 -{ -( 1136 -1232 208 ) ( 1136 -1376 208 ) ( 1136 -1232 224 ) rome01 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1232 224 ) ( 1120 -1376 224 ) ( 1120 -1232 208 ) rome01 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1232 224 ) ( 1120 -1232 208 ) ( 1136 -1232 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1136 -1376 224 ) ( 1136 -1376 208 ) ( 1120 -1376 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1376 224 ) ( 1120 -1232 224 ) ( 1136 -1376 224 ) rome01 [ 0 -1 0 32 ] [ -1 0 0 -32 ] 90 1 1 -( 1120 -1232 192 ) ( 1120 -1376 192 ) ( 1136 -1232 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 -} -// brush 92 -{ -( 1192 -1248 352 ) ( 1192 -1232 352 ) ( 1192 -1248 208 ) rome01 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1232 352 ) ( 928 -1248 352 ) ( 928 -1232 208 ) rome01 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -( 1192 -1232 352 ) ( 928 -1232 352 ) ( 1192 -1232 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1248 352 ) ( 1192 -1248 352 ) ( 928 -1248 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1232 352 ) ( 1192 -1232 352 ) ( 928 -1248 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 -( 928 -1248 208 ) ( 1192 -1248 208 ) ( 928 -1232 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 -} -// brush 93 -{ -( 1008 -1248 208 ) ( 1120 -1376 208 ) ( 1120 -1248 216 ) egypt14 [ 0 1 0 -48 ] [ 1 0 -2.22045e-16 -68.1846 ] 0 1 1 -( 1008 -1248 208 ) ( 1008 -1376 205 ) ( 1120 -1376 208 ) egypt14 [ 0 1 0 -48 ] [ 1 0 -2.22045e-16 -64.5706 ] 0 1 1 -( 1120 -1376 208 ) ( 1008 -1328 224 ) ( 1120 -1248 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 32 ] -0 1 1 -( 1120 -1376 208 ) ( 1008 -1376 216 ) ( 1008 -1328 224 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 -( 1120 -1376 208 ) ( 1008 -1376 205 ) ( 1008 -1376 216 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 -( 1008 -1248 224 ) ( 1120 -1248 216 ) ( 1008 -1328 224 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 32 ] -0 1 1 -( 1008 -1248 224 ) ( 1008 -1248 208 ) ( 1120 -1248 216 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1008 -1248 224 ) ( 1008 -1376 205 ) ( 1008 -1248 208 ) egypt14 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 -} -// brush 94 -{ -( 1008 -1040 208 ) ( 1120 -1168 208 ) ( 1120 -1040 216 ) egypt14 [ 0 1 0 -48 ] [ 1 0 -2.22045e-16 -67.145 ] -0 1 1 -( 1008 -1040 208 ) ( 1008 -1168 205 ) ( 1120 -1168 208 ) egypt14 [ 0 1 0 -48 ] [ 1 0 -2.22045e-16 -63.7144 ] -0 1 1 -( 1120 -1168 208 ) ( 1008 -1120 224 ) ( 1120 -1040 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 112 ] -0 1 1 -( 1120 -1168 208 ) ( 1008 -1168 216 ) ( 1008 -1120 224 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 -( 1120 -1168 208 ) ( 1008 -1168 205 ) ( 1008 -1168 216 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 -( 1008 -1040 224 ) ( 1120 -1040 216 ) ( 1008 -1120 224 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 112 ] -0 1 1 -( 1008 -1040 224 ) ( 1008 -1040 208 ) ( 1120 -1040 216 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1104 -1040 224 ) ( 1104 -1168 205 ) ( 1104 -1040 208 ) egypt14 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 -} -// brush 95 -{ -( 1136 -1024 208 ) ( 1136 -1168 208 ) ( 1136 -1024 224 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1024 224 ) ( 1120 -1168 224 ) ( 1120 -1024 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1024 224 ) ( 1120 -1024 208 ) ( 1136 -1024 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1136 -1168 224 ) ( 1136 -1168 208 ) ( 1120 -1168 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -1168 224 ) ( 1120 -1024 224 ) ( 1136 -1168 224 ) rome01 [ 0 -1 0 112 ] [ -1 0 0 -32 ] 90 1 1 -( 1120 -1024 192 ) ( 1120 -1168 192 ) ( 1136 -1024 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 -} -// brush 96 -{ -( 1192 -1040 352 ) ( 1192 -1024 352 ) ( 1192 -1040 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1024 352 ) ( 928 -1040 352 ) ( 928 -1024 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 -( 1192 -1024 352 ) ( 928 -1024 352 ) ( 1192 -1024 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1040 352 ) ( 1192 -1040 352 ) ( 928 -1040 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -1024 352 ) ( 1192 -1024 352 ) ( 928 -1040 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 -( 928 -1040 208 ) ( 1192 -1040 208 ) ( 928 -1024 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 -} -// brush 97 -{ -( 1120 -1024 192 ) ( 1120 -1168 192 ) ( 1120 -1024 208 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1024 208 ) ( 912 -1168 208 ) ( 912 -1024 192 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1024 208 ) ( 912 -1024 192 ) ( 1120 -1024 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 1120 -1168 208 ) ( 1120 -1168 192 ) ( 912 -1168 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -1168 208 ) ( 912 -1024 208 ) ( 1120 -1168 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 -( 912 -1024 192 ) ( 912 -1168 192 ) ( 1120 -1024 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 -} -// brush 98 -{ -( 1120 -848 216 ) ( 1088 -928 224 ) ( 1088 -848 224 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 47.9999 ] -0 1 1 -( 1088 -848 224 ) ( 1088 -928 224 ) ( 1088 -976 216 ) egypt14 [ 0 1 0 -47.9999 ] [ 0 0 -1 96 ] -0 1 1 -( 1088 -848 208 ) ( 1120 -848 216 ) ( 1088 -848 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1088 -976 205 ) ( 1120 -976 208 ) ( 1088 -848 208 ) egypt14 [ 0 1 0 -64 ] [ 1 0 -2.22045e-16 -64.5706 ] -0 1 1 -( 1088 -848 208 ) ( 1120 -976 208 ) ( 1120 -848 216 ) egypt14 [ 0 1 0 -63.9999 ] [ 1 0 -2.22045e-16 -68.1846 ] -0 1 1 -( 1120 -848 216 ) ( 1120 -976 208 ) ( 1088 -928 224 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 48 ] -0 1 1 -( 1088 -928 224 ) ( 1120 -976 208 ) ( 1088 -976 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 -( 1088 -976 216 ) ( 1120 -976 208 ) ( 1088 -976 205 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 99 -{ -( 1136 -832 208 ) ( 1136 -976 208 ) ( 1136 -832 224 ) rome01 [ 0 1 0 -48 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -832 224 ) ( 1120 -976 224 ) ( 1120 -832 208 ) rome01 [ 0 1 0 -48 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -832 224 ) ( 1120 -832 208 ) ( 1136 -832 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1136 -976 224 ) ( 1136 -976 208 ) ( 1120 -976 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -976 224 ) ( 1120 -832 224 ) ( 1136 -976 224 ) rome01 [ 0 -1 0 48 ] [ -1 0 0 -32 ] 90 1 1 -( 1120 -832 192 ) ( 1120 -976 192 ) ( 1136 -832 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 -} -// brush 100 -{ -( 1192 -848 352 ) ( 1192 -832 352 ) ( 1192 -848 208 ) rome01 [ 0 1 0 -48 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -832 352 ) ( 928 -848 352 ) ( 928 -832 208 ) rome01 [ 0 1 0 -48 ] [ 0 0 -1 96 ] -0 1 1 -( 1192 -832 352 ) ( 928 -832 352 ) ( 1192 -832 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -848 352 ) ( 1192 -848 352 ) ( 928 -848 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -832 352 ) ( 1192 -832 352 ) ( 928 -848 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 -( 928 -848 208 ) ( 1192 -848 208 ) ( 928 -832 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 -} -// brush 101 -{ -( 1120 -832 192 ) ( 1120 -976 192 ) ( 1120 -832 208 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -832 208 ) ( 912 -976 208 ) ( 912 -832 192 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -832 208 ) ( 912 -832 192 ) ( 1120 -832 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 1120 -976 208 ) ( 1120 -976 192 ) ( 912 -976 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -976 208 ) ( 912 -832 208 ) ( 1120 -976 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 -( 912 -832 192 ) ( 912 -976 192 ) ( 1120 -832 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 -} -// brush 102 -{ -( 1136 -624 208 ) ( 1136 -768 208 ) ( 1136 -624 224 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -624 224 ) ( 1120 -768 224 ) ( 1120 -624 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -624 224 ) ( 1120 -624 208 ) ( 1136 -624 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1136 -768 224 ) ( 1136 -768 208 ) ( 1120 -768 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -768 224 ) ( 1120 -624 224 ) ( 1136 -768 224 ) rome01 [ 0 -1 0 -0 ] [ -1 0 0 -32 ] 90 1 1 -( 1120 -624 192 ) ( 1120 -768 192 ) ( 1136 -624 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 103 -{ -( 1192 -640 352 ) ( 1192 -624 352 ) ( 1192 -640 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -624 352 ) ( 928 -640 352 ) ( 928 -624 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 -( 1192 -624 352 ) ( 928 -624 352 ) ( 1192 -624 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -640 352 ) ( 1192 -640 352 ) ( 928 -640 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -624 224 ) ( 1192 -624 224 ) ( 928 -640 224 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -( 928 -640 208 ) ( 1192 -640 208 ) ( 928 -624 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 104 -{ -( 1120 -624 192 ) ( 1120 -768 192 ) ( 1120 -624 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -624 208 ) ( 912 -768 208 ) ( 912 -624 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -624 208 ) ( 912 -624 192 ) ( 1120 -624 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 1120 -768 208 ) ( 1120 -768 192 ) ( 912 -768 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -768 208 ) ( 912 -624 208 ) ( 1120 -768 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -( 912 -624 192 ) ( 912 -768 192 ) ( 1120 -624 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 105 -{ -( 1120 -640 216 ) ( 1088 -720 224 ) ( 1088 -640 224 ) egypt14 [ 0.992278 0 -0.124035 -26.8262 ] [ 0 -1 0 -0 ] -0 1 1 -( 1088 -640 224 ) ( 1088 -720 224 ) ( 1088 -768 216 ) egypt14 [ 0 1 0 0 ] [ 0 0 -1 96 ] -0 1 1 -( 1088 -640 208 ) ( 1120 -640 216 ) ( 1088 -640 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1088 -768 205 ) ( 1120 -768 208 ) ( 1088 -640 208 ) egypt14 [ 0 1 0 -16 ] [ 1 0 -2.22045e-16 -64.5706 ] -0 1 1 -( 1088 -640 208 ) ( 1120 -768 208 ) ( 1120 -640 216 ) egypt14 [ 0 1 0 -15.9999 ] [ 1 0 -2.22045e-16 -68.1846 ] -0 1 1 -( 1120 -640 216 ) ( 1120 -768 208 ) ( 1088 -720 224 ) egypt14 [ 0.992278 0 -0.124035 -26.8263 ] [ 0 -1 0 -0 ] -0 1 1 -( 1088 -720 224 ) ( 1120 -768 208 ) ( 1088 -768 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 -( 1088 -768 216 ) ( 1120 -768 208 ) ( 1088 -768 205 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 106 -{ -( 1120 -448 352 ) ( 1120 -432 352 ) ( 1120 -448 208 ) rome01 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 -( 1056 -432 352 ) ( 1056 -448 352 ) ( 1056 -432 208 ) rome01 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 -( 1192 -432 352 ) ( 928 -432 352 ) ( 1192 -432 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -448 352 ) ( 1192 -448 352 ) ( 928 -448 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -432 224 ) ( 1192 -432 224 ) ( 928 -448 224 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 64 ] -0 1 1 -( 928 -448 208 ) ( 1192 -448 208 ) ( 928 -432 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 64 ] -0 1 1 -} -// brush 107 -{ -( 1136 -432 208 ) ( 1136 -576 208 ) ( 1136 -432 224 ) rome01 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -432 224 ) ( 1120 -576 224 ) ( 1120 -432 208 ) rome01 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -432 224 ) ( 1120 -432 208 ) ( 1136 -432 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1136 -576 224 ) ( 1136 -576 208 ) ( 1120 -576 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -576 224 ) ( 1120 -432 224 ) ( 1136 -576 224 ) rome01 [ 0 -1 0 64 ] [ -1 0 0 -32 ] 90 1 1 -( 1120 -432 192 ) ( 1120 -576 192 ) ( 1136 -432 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 64 ] -0 1 1 -} -// brush 108 -{ -( 1120 -448 216 ) ( 1088 -528 224 ) ( 1088 -448 224 ) egypt14 [ 0.992278 0 -0.124035 -26.8262 ] [ 0 -1 0 64 ] -0 1 1 -( 1088 -448 224 ) ( 1088 -528 224 ) ( 1088 -576 216 ) egypt14 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 -( 1088 -448 208 ) ( 1120 -448 216 ) ( 1088 -448 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1088 -576 205 ) ( 1120 -576 208 ) ( 1088 -448 208 ) egypt14 [ 0 1 0 -80 ] [ 1 0 -2.22045e-16 -64.5706 ] -0 1 1 -( 1088 -448 208 ) ( 1120 -576 208 ) ( 1120 -448 216 ) egypt14 [ 0 1 0 -80 ] [ 1 0 -2.22045e-16 -68.1846 ] -0 1 1 -( 1120 -448 216 ) ( 1120 -576 208 ) ( 1088 -528 224 ) egypt14 [ 0.992278 0 -0.124035 -26.8263 ] [ 0 -1 0 64 ] -0 1 1 -( 1088 -528 224 ) ( 1120 -576 208 ) ( 1088 -576 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 64 ] -0 1 1 -( 1088 -576 216 ) ( 1120 -576 208 ) ( 1088 -576 205 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 -} -// brush 109 -{ -( 1120 -432 192 ) ( 1120 -576 192 ) ( 1120 -432 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 1056 -432 208 ) ( 1056 -576 208 ) ( 1056 -432 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -432 208 ) ( 912 -432 192 ) ( 1120 -432 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 1120 -576 208 ) ( 1120 -576 192 ) ( 912 -576 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -576 208 ) ( 912 -432 208 ) ( 1120 -576 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -( 912 -432 192 ) ( 912 -576 192 ) ( 1120 -432 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 -} -// brush 110 -{ -( 1120 -256 192 ) ( 1120 -400 192 ) ( 1120 -256 208 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 -( 1056 -256 208 ) ( 1056 -400 208 ) ( 1056 -256 192 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -256 208 ) ( 912 -256 192 ) ( 1120 -256 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 1120 -400 208 ) ( 1120 -400 192 ) ( 912 -400 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 -( 912 -400 208 ) ( 912 -256 208 ) ( 1120 -400 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 48 ] -0 1 1 -( 912 -256 192 ) ( 912 -400 192 ) ( 1120 -256 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 48 ] -0 1 1 -} -// brush 111 -{ -( 1120 -272 352 ) ( 1120 -256 352 ) ( 1120 -272 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 -( 1056 -256 352 ) ( 1056 -272 352 ) ( 1056 -256 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 -( 1192 -256 352 ) ( 928 -256 352 ) ( 1192 -256 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -272 352 ) ( 1192 -272 352 ) ( 928 -272 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 928 -256 224 ) ( 1192 -256 224 ) ( 928 -272 224 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 -( 928 -272 208 ) ( 1192 -272 208 ) ( 928 -256 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 -} -// brush 112 -{ -( 1136 -256 208 ) ( 1136 -400 208 ) ( 1136 -256 224 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -256 224 ) ( 1120 -400 224 ) ( 1120 -256 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -256 224 ) ( 1120 -256 208 ) ( 1136 -256 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1136 -400 224 ) ( 1136 -400 208 ) ( 1120 -400 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 -( 1120 -400 224 ) ( 1120 -256 224 ) ( 1136 -400 224 ) rome01 [ 0 -1 0 112 ] [ -1 0 0 -32 ] 90 1 1 -( 1120 -256 192 ) ( 1120 -400 192 ) ( 1136 -256 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 -} -// brush 113 -{ -( 1120 -272 216 ) ( 1088 -400 224 ) ( 1088 -272 224 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -0 ] 0 1 1 -( 1088 -272 224 ) ( 1088 -400 224 ) ( 1088 -400 208 ) egypt14 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 1120 -272 216 ) ( 1088 -272 224 ) ( 1088 -272 208 ) egypt14 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 -( 1088 -400 208 ) ( 1120 -400 208 ) ( 1088 -272 208 ) egypt14 [ -1 0 0 -0 ] [ 0 -1 0 -0 ] 0 1 1 -( 1088 -272 208 ) ( 1120 -400 208 ) ( 1120 -272 216 ) egypt14 [ -1 0 0 -0 ] [ 0 -1 0 -0 ] 0 1 1 -( 1120 -272 216 ) ( 1120 -400 208 ) ( 1088 -400 224 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -0 ] 0 1 1 -( 1088 -400 224 ) ( 1120 -400 208 ) ( 1088 -400 208 ) egypt14 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 -} -} -// entity 1 -{ -"classname" "trigger_void" -// brush 0 -{ -( 2048 880 -2000 ) ( 2048 880 -2016 ) ( 2048 -1392 -2000 ) trigger [ 0 1 0 -128 ] [ 0 0 -1 -96 ] -0 1 1 -( -3328 -1392 -2000 ) ( -3328 -1392 -2016 ) ( -3328 880 -2000 ) trigger [ 0 -1 0 -0 ] [ 0 0 -1 -32 ] -0 1 1 -( -1008 3200 -2000 ) ( -1008 3200 -2016 ) ( 1264 3200 -2000 ) trigger [ -1 0 0 -0 ] [ 0 0 -1 -32 ] -0 1 1 -( 1264 -2048 -2000 ) ( 1264 -2048 -2016 ) ( -1008 -2048 -2000 ) trigger [ 1 0 0 -0 ] [ 0 0 -1 -96 ] -0 1 1 -( -1008 -1392 -2000 ) ( -1008 880 -2000 ) ( 1264 -1392 -2000 ) trigger [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -( -1008 880 -2016 ) ( -1008 -1392 -2016 ) ( 1264 880 -2016 ) trigger [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -} -} -// entity 2 -{ -"classname" "trigger_teleport" -"target" "teletarget1" -// brush 0 -{ -( 2048 880 -1968 ) ( 2048 880 -1984 ) ( 2048 -1392 -1968 ) trigger [ 0 1 0 -128 ] [ 0 0 -1 -64 ] -0 1 1 -( -3328 -1392 -1968 ) ( -3328 -1392 -1984 ) ( -3328 880 -1968 ) trigger [ 0 -1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( -1008 3200 -1968 ) ( -1008 3200 -1984 ) ( 1264 3200 -1968 ) trigger [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 -( 1264 -2048 -1968 ) ( 1264 -2048 -1984 ) ( -1008 -2048 -1968 ) trigger [ 1 0 0 -0 ] [ 0 0 -1 -64 ] -0 1 1 -( -1008 -1392 -1952 ) ( -1008 880 -1952 ) ( 1264 -1392 -1952 ) trigger [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -( -1008 880 -1984 ) ( -1008 -1392 -1984 ) ( 1264 880 -1984 ) trigger [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 -} -} -// entity 3 -{ -"classname" "info_player_start" -"origin" "-16 -1264 296" -"angle" "-0" -} -// entity 4 -{ -"classname" "info_teleport_destination" -"origin" "-32 -1264 296" -"angle" "-0" -"targetname" "teletarget1" -} +// Game: Quake +// Format: Valve +// entity 0 +{ +"classname" "worldspawn" +"mapversion" "220" +"wad" "quake.wad" +"message" "Tjunk" +// brush 0 +{ +( 2032 -2032 2048 ) ( 2032 -2032 -2048 ) ( 2032 -2048 2048 ) egypt04 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -3328 -2032 -2048 ) ( -3328 -2032 2048 ) ( -3328 -2048 -2048 ) egypt04 [ 0 -1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( -2032 -2032 -2048 ) ( 2032 -2032 -2048 ) ( -2032 -2032 2048 ) skyaop [ 1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( -2032 -2048 -2048 ) ( -2032 -2048 2048 ) ( 2032 -2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( -2032 -2032 2048 ) ( 2032 -2032 2048 ) ( -2032 -2048 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +( 2032 -2032 -2048 ) ( -2032 -2032 -2048 ) ( 2032 -2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 1 +{ +( -3312 -2048 -2048 ) ( -3312 -2048 2048 ) ( -3312 2048 -2048 ) skyaop [ 0 -1 0 -128 ] [ 0 0 -1 -0 ] -0 1 1 +( -3328 -2048 -2048 ) ( -3328 2048 -2048 ) ( -3328 -2048 2048 ) skyaop [ 0 -1 0 -128 ] [ 0 0 -1 -0 ] -0 1 1 +( -3312 3200 -2048 ) ( -3312 3200 2048 ) ( -3328 3200 -2048 ) skyaop [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( -3312 -2048 2048 ) ( -3312 -2048 -2048 ) ( -3328 -2048 2048 ) skyaop [ 1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( -3312 2048 2048 ) ( -3312 -2048 2048 ) ( -3328 2048 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +( -3312 -2048 -2048 ) ( -3312 2048 -2048 ) ( -3328 -2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 2 +{ +( 2048 2048 -2048 ) ( 2048 -2048 -2048 ) ( 2048 2048 2048 ) skyaop [ 0 1 0 128 ] [ 0 0 -1 -0 ] -0 1 1 +( 2032 2048 2048 ) ( 2032 -2048 2048 ) ( 2032 2048 -2048 ) skyaop [ 0 1 0 128 ] [ 0 0 -1 -0 ] -0 1 1 +( 2032 3200 2048 ) ( 2032 3200 -2048 ) ( 2048 3200 2048 ) skyaop [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( 2032 -2048 -2048 ) ( 2032 -2048 2048 ) ( 2048 -2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( 2032 -2048 2048 ) ( 2032 2048 2048 ) ( 2048 -2048 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +( 2032 2048 -2048 ) ( 2032 -2048 -2048 ) ( 2048 2048 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 3 +{ +( 2032 3184 -2048 ) ( 2032 3184 2048 ) ( 2032 3200 -2048 ) egypt04 [ 0 1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( -3328 3184 2048 ) ( -3328 3184 -2048 ) ( -3328 3200 2048 ) egypt04 [ 0 -1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( -2032 3200 2048 ) ( -2032 3200 -2048 ) ( 2032 3200 2048 ) skyaop [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( 2032 3184 2048 ) ( 2032 3184 -2048 ) ( -2032 3184 2048 ) skyaop [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( 2032 3184 2048 ) ( -2032 3184 2048 ) ( 2032 3200 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +( -2032 3184 -2048 ) ( 2032 3184 -2048 ) ( -2032 3200 -2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 4 +{ +( 2032 2032 2032 ) ( 2032 -2032 2032 ) ( 2032 2032 2048 ) egypt04 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( -3328 -2032 2032 ) ( -3328 2032 2032 ) ( -3328 -2032 2048 ) egypt04 [ 0 -1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( -2032 3200 2032 ) ( 2032 3200 2032 ) ( -2032 3200 2048 ) egypt04 [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( 2032 -2032 2032 ) ( -2032 -2032 2032 ) ( 2032 -2032 2048 ) egypt04 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 2032 -2032 2048 ) ( -2032 -2032 2048 ) ( 2032 2032 2048 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +( 2032 2032 2032 ) ( -2032 2032 2032 ) ( 2032 -2032 2032 ) skyaop [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 5 +{ +( 2032 -2032 -2032 ) ( 2032 2032 -2032 ) ( 2032 -2032 -2048 ) skyaop [ 0 -1 0 -128 ] [ 0 0 -1 0 ] 0 1 1 +( -3328 2032 -2032 ) ( -3328 -2032 -2032 ) ( -3328 2032 -2048 ) skyaop [ 0 -1 0 -128 ] [ 0 0 -1 -0 ] -0 1 1 +( 2032 3200 -2032 ) ( -2032 3200 -2032 ) ( 2032 3200 -2048 ) skyaop [ 1 -2.22045e-16 0 -128 ] [ 0 0 -1 -0 ] -0 1 1 +( -2032 -2032 -2032 ) ( 2032 -2032 -2032 ) ( -2032 -2032 -2048 ) skyaop [ -1 -2.22045e-16 0 -128 ] [ 0 0 -1 -0 ] 0 1 1 +( -2032 -2032 -2032 ) ( -2032 2032 -2032 ) ( 2032 -2032 -2032 ) skyaop [ 0 -1 0 -128 ] [ 1 0 -2.22045e-16 96 ] -0 1 1 +( -2032 -2032 -2048 ) ( 2032 -2032 -2048 ) ( -2032 2032 -2048 ) skyaop [ 0 -1 0 -128 ] [ -1 0 -2.22045e-16 16 ] -0 1 1 +} +// brush 6 +{ +( 432 -1312 208 ) ( 432 -1328 208 ) ( 432 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 224 -1312 224 ) ( 224 -1328 224 ) ( 224 -1312 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 224 -1312 224 ) ( 224 -1312 208 ) ( 432 -1312 224 ) rome01 [ -1 0 0 -80 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1328 224 ) ( 432 -1328 208 ) ( 224 -1328 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 224 -1328 224 ) ( 224 -1312 224 ) ( 432 -1328 224 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +( 224 -1312 192 ) ( 224 -1328 192 ) ( 432 -1312 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 7 +{ +( 448 -1168 208 ) ( 448 -1312 208 ) ( 448 -1168 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1168 224 ) ( 432 -1312 224 ) ( 432 -1168 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1168 224 ) ( 432 -1168 208 ) ( 448 -1168 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 448 -1312 224 ) ( 448 -1312 208 ) ( 432 -1312 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1312 224 ) ( 432 -1168 224 ) ( 448 -1312 224 ) rome01 [ 0 -1 0 -32 ] [ -1 0 0 -80 ] 90 1 1 +( 432 -1168 192 ) ( 432 -1312 192 ) ( 448 -1168 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 8 +{ +( 448 -1312 208 ) ( 448 -1328 208 ) ( 448 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 448 -1328 224 ) ( 448 -1328 208 ) ( 432 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 448 -1312 224 ) ( 432 -1312 224 ) ( 448 -1312 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 448 -1312 224 ) ( 448 -1328 224 ) ( 432 -1312 224 ) rome01 [ 0 -1 0 -32 ] [ -1 0 0 -80 ] 90 1 1 +( 448 -1312 192 ) ( 432 -1312 192 ) ( 448 -1328 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 9 +{ +( 432 -1312 224 ) ( 432 -1312 208 ) ( 448 -1328 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1328 208 ) ( 432 -1312 208 ) ( 432 -1328 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1328 224 ) ( 448 -1328 224 ) ( 432 -1328 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1328 224 ) ( 432 -1312 224 ) ( 448 -1328 224 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +( 432 -1312 192 ) ( 432 -1328 192 ) ( 448 -1328 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 10 +{ +( 432 -1168 192 ) ( 432 -1312 192 ) ( 432 -1168 208 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 224 -1168 208 ) ( 224 -1312 208 ) ( 224 -1168 192 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 224 -1168 208 ) ( 224 -1168 192 ) ( 432 -1168 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 +( 432 -1312 208 ) ( 432 -1312 192 ) ( 224 -1312 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 +( 224 -1312 208 ) ( 224 -1168 208 ) ( 432 -1312 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 32 ] -0 1 1 +( 224 -1168 192 ) ( 224 -1312 192 ) ( 432 -1168 192 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 32 ] -0 1 1 +} +// brush 11 +{ +( 320 -1264 224 ) ( 320 -1264 208 ) ( 320 -1312 216 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1264 220 ) ( 320 -1312 216 ) ( 240 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1264 208 ) ( 320 -1264 208 ) ( 240 -1264 220 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1264 220 ) ( 320 -1264 224 ) ( 320 -1312 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +( 320 -1264 208 ) ( 240 -1264 208 ) ( 320 -1312 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 12 +{ +( 432 -1312 208 ) ( 320 -1264 224 ) ( 432 -1184 216 ) egypt14 [ 0.992278 0 -0.124035 15.861 ] [ 0 -1 0 -32 ] -0 1 1 +( 320 -1264 208 ) ( 432 -1184 216 ) ( 320 -1264 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1417.5999999999999 198.39999999999998 ) ( 320 -1264 208 ) ( 320 -1264 224 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1417.5999999999999 198.39999999999998 ) ( 320 -1264 224 ) ( 432 -1312 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +( 320 -1264 208 ) ( 320 -1417.5999999999999 198.39999999999998 ) ( 432 -1184 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 13 +{ +( 320 -1312 216 ) ( 240 -1264 220 ) ( 240 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1312 208 ) ( 240 -1264 208 ) ( 240 -1264 220 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1312 208 ) ( 240 -1264 220 ) ( 320 -1312 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +( 240 -1312 208 ) ( 320 -1312 216 ) ( 240 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 14 +{ +( 320 -1264 224 ) ( 432 -1184 216 ) ( 320 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1184 224 ) ( 320 -1264 224 ) ( 320 -1184 208 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1184 208 ) ( 432 -1184 216 ) ( 320 -1184 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1264 224 ) ( 320 -1184 224 ) ( 432 -1184 216 ) egypt14 [ 0.992278 0 -0.124035 15.861 ] [ 0 -1 0 -32 ] -0 1 1 +( 320 -1184 208 ) ( 320 -1264 208 ) ( 432 -1184 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 15 +{ +( 320 -1184 208 ) ( 320 -1264 208 ) ( 320 -1184 224 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1264 224 ) ( 320 -1264 208 ) ( 240 -1232 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1184 224 ) ( 240 -1232 224 ) ( 240 -1184 208 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1184 224 ) ( 240 -1184 208 ) ( 320 -1184 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1232 224 ) ( 240 -1184 224 ) ( 320 -1264 224 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +( 240 -1184 208 ) ( 240 -1232 208 ) ( 320 -1184 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 16 +{ +( 240 -1232 208 ) ( 320 -1264 208 ) ( 240 -1232 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1264 208 ) ( 240 -1232 208 ) ( 240 -1264 220 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1264 220 ) ( 240 -1232 224 ) ( 320 -1264 224 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +( 240 -1264 220 ) ( 320 -1264 224 ) ( 240 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1232 208 ) ( 240 -1264 208 ) ( 320 -1264 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 17 +{ +( 504 -1184 352 ) ( 504 -1168 352 ) ( 504 -1184 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1168 352 ) ( 240 -1184 352 ) ( 240 -1168 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 504 -1168 352 ) ( 240 -1168 352 ) ( 504 -1168 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1184 352 ) ( 504 -1184 352 ) ( 240 -1184 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1168 352 ) ( 504 -1168 352 ) ( 240 -1184 352 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +( 240 -1184 208 ) ( 504 -1184 208 ) ( 240 -1168 208 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 18 +{ +( 128 -1312 208 ) ( 128 -1328 208 ) ( 128 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( -80 -1312 224 ) ( -80 -1328 224 ) ( -80 -1312 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( -80 -1312 224 ) ( -80 -1312 208 ) ( 128 -1312 224 ) rome01 [ -1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1328 224 ) ( 128 -1328 208 ) ( -80 -1328 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -80 -1328 224 ) ( -80 -1312 224 ) ( 128 -1328 224 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +( -80 -1312 192 ) ( -80 -1328 192 ) ( 128 -1312 192 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 19 +{ +( 144 -1168 208 ) ( 144 -1312 208 ) ( 144 -1168 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1168 224 ) ( 128 -1312 224 ) ( 128 -1168 208 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1168 224 ) ( 128 -1168 208 ) ( 144 -1168 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 144 -1312 224 ) ( 144 -1312 208 ) ( 128 -1312 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1312 224 ) ( 128 -1168 224 ) ( 144 -1312 224 ) rome01 [ 0 -1 0 -32 ] [ -1 0 0 -0 ] 90 1 1 +( 128 -1168 192 ) ( 128 -1312 192 ) ( 144 -1168 192 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 20 +{ +( 144 -1312 208 ) ( 144 -1328 208 ) ( 144 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 144 -1328 224 ) ( 144 -1328 208 ) ( 128 -1312 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 144 -1312 224 ) ( 128 -1312 224 ) ( 144 -1312 208 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 144 -1312 224 ) ( 144 -1328 224 ) ( 128 -1312 224 ) rome01 [ 0 -1 0 -32 ] [ -1 0 0 -128 ] 90 1 1 +( 144 -1312 192 ) ( 128 -1312 192 ) ( 144 -1328 192 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 21 +{ +( 128 -1312 224 ) ( 128 -1312 208 ) ( 144 -1328 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1328 208 ) ( 128 -1312 208 ) ( 128 -1328 224 ) rome01 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1328 224 ) ( 144 -1328 224 ) ( 128 -1328 208 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1328 224 ) ( 128 -1312 224 ) ( 144 -1328 224 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 +( 128 -1312 192 ) ( 128 -1328 192 ) ( 144 -1328 192 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 22 +{ +( 128 -1168 192 ) ( 128 -1312 192 ) ( 128 -1168 208 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( -80 -1168 208 ) ( -80 -1312 208 ) ( -80 -1168 192 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( -80 -1168 208 ) ( -80 -1168 192 ) ( 128 -1168 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 128 -1312 208 ) ( 128 -1312 192 ) ( -80 -1312 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( -80 -1312 208 ) ( -80 -1168 208 ) ( 128 -1312 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 -1 0 32 ] -0 1 1 +( -80 -1168 192 ) ( -80 -1312 192 ) ( 128 -1168 192 ) afloor1_3 [ 1 0 0 -0 ] [ 0 -1 0 32 ] -0 1 1 +} +// brush 23 +{ +( 16 -1264 224 ) ( 16 -1264 208 ) ( 16 -1312 216 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1264 220 ) ( 16 -1312 216 ) ( -64 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1264 208 ) ( 16 -1264 208 ) ( -64 -1264 220 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1264 220 ) ( 16 -1264 224 ) ( 16 -1312 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 +( 16 -1264 208 ) ( -64 -1264 208 ) ( 16 -1312 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 24 +{ +( 128 -1312 208 ) ( 16 -1264 224 ) ( 128 -1184 216 ) egypt14 [ 0.992278 0 -0.124035 61.5135 ] [ 0 -1 0 -32 ] -0 1 1 +( 16 -1264 208 ) ( 128 -1184 216 ) ( 16 -1264 224 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 96 ] -0 1 1 +( 16 -1417.5999999999999 198.39999999999998 ) ( 16 -1264 208 ) ( 16 -1264 224 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 16 -1417.5999999999999 198.39999999999998 ) ( 16 -1264 224 ) ( 128 -1312 208 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 +( 16 -1264 208 ) ( 16 -1417.5999999999999 198.39999999999998 ) ( 128 -1184 216 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 25 +{ +( 16 -1312 216 ) ( -64 -1264 220 ) ( -64 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1312 208 ) ( -64 -1264 208 ) ( -64 -1264 220 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1312 208 ) ( -64 -1264 220 ) ( 16 -1312 216 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +( -64 -1312 208 ) ( 16 -1312 216 ) ( -64 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 26 +{ +( 16 -1264 224 ) ( 128 -1184 216 ) ( 16 -1264 208 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 96 ] -0 1 1 +( 16 -1184 224 ) ( 16 -1264 224 ) ( 16 -1184 208 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 16 -1184 208 ) ( 128 -1184 216 ) ( 16 -1184 224 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 96 ] -0 1 1 +( 16 -1264 224 ) ( 16 -1184 224 ) ( 128 -1184 216 ) egypt14 [ 0.992278 0 -0.124035 61.5135 ] [ 0 -1 0 -32 ] -0 1 1 +( 16 -1184 208 ) ( 16 -1264 208 ) ( 128 -1184 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 27 +{ +( 16 -1184 208 ) ( 16 -1264 208 ) ( 16 -1184 224 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 16 -1264 224 ) ( 16 -1264 208 ) ( -64 -1232 224 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1184 224 ) ( -64 -1232 224 ) ( -64 -1184 208 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1184 224 ) ( -64 -1184 208 ) ( 16 -1184 224 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1232 224 ) ( -64 -1184 224 ) ( 16 -1264 224 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +( -64 -1184 208 ) ( -64 -1232 208 ) ( 16 -1184 208 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 28 +{ +( -64 -1232 208 ) ( 16 -1264 208 ) ( -64 -1232 224 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1264 208 ) ( -64 -1232 208 ) ( -64 -1264 220 ) egypt14 [ 0 1 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1264 220 ) ( -64 -1232 224 ) ( 16 -1264 224 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +( -64 -1264 220 ) ( 16 -1264 224 ) ( -64 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1232 208 ) ( -64 -1264 208 ) ( 16 -1264 208 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -32 ] -0 1 1 +} +// brush 29 +{ +( 432 -1600 208 ) ( 432 -1616 208 ) ( 432 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 224 -1600 224 ) ( 224 -1616 224 ) ( 224 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 224 -1600 224 ) ( 224 -1600 208 ) ( 432 -1600 224 ) rome01 [ -1 0 0 -80 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1616 224 ) ( 432 -1616 208 ) ( 224 -1616 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 224 -1616 224 ) ( 224 -1600 224 ) ( 432 -1616 224 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +( 224 -1600 192 ) ( 224 -1616 192 ) ( 432 -1600 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 30 +{ +( 448 -1456 208 ) ( 448 -1600 208 ) ( 448 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1456 224 ) ( 432 -1600 224 ) ( 432 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1456 224 ) ( 432 -1456 208 ) ( 448 -1456 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 448 -1600 224 ) ( 448 -1600 208 ) ( 432 -1600 224 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1600 224 ) ( 432 -1456 224 ) ( 448 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -80 ] 90 1 1 +( 432 -1456 192 ) ( 432 -1600 192 ) ( 448 -1456 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 31 +{ +( 448 -1600 208 ) ( 448 -1616 208 ) ( 448 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 448 -1616 224 ) ( 448 -1616 208 ) ( 432 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 448 -1600 224 ) ( 432 -1600 224 ) ( 448 -1600 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 448 -1600 224 ) ( 448 -1616 224 ) ( 432 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -80 ] 90 1 1 +( 448 -1600 192 ) ( 432 -1600 192 ) ( 448 -1616 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 32 +{ +( 432 -1600 224 ) ( 432 -1600 208 ) ( 448 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1616 208 ) ( 432 -1600 208 ) ( 432 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1616 224 ) ( 448 -1616 224 ) ( 432 -1616 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 432 -1616 224 ) ( 432 -1600 224 ) ( 448 -1616 224 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +( 432 -1600 192 ) ( 432 -1616 192 ) ( 448 -1616 192 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 33 +{ +( 432 -1456 192 ) ( 432 -1600 192 ) ( 432 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 224 -1456 208 ) ( 224 -1600 208 ) ( 224 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 224 -1456 208 ) ( 224 -1456 192 ) ( 432 -1456 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 +( 432 -1600 208 ) ( 432 -1600 192 ) ( 224 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 +( 224 -1600 208 ) ( 224 -1456 208 ) ( 432 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 +( 224 -1456 192 ) ( 224 -1600 192 ) ( 432 -1456 192 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 34 +{ +( 320 -1552 224 ) ( 320 -1552 208 ) ( 320 -1600 216 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1552 220 ) ( 320 -1600 216 ) ( 240 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1552 208 ) ( 320 -1552 208 ) ( 240 -1552 220 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1552 220 ) ( 320 -1552 224 ) ( 320 -1600 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +( 320 -1552 208 ) ( 240 -1552 208 ) ( 320 -1600 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 35 +{ +( 320 -1600 216 ) ( 240 -1552 220 ) ( 240 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1600 208 ) ( 240 -1552 208 ) ( 240 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1600 208 ) ( 240 -1552 220 ) ( 320 -1600 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +( 240 -1600 208 ) ( 320 -1600 216 ) ( 240 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 36 +{ +( 320 -1552 224 ) ( 432 -1472 216 ) ( 320 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1472 224 ) ( 320 -1552 224 ) ( 320 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1472 208 ) ( 432 -1472 216 ) ( 320 -1472 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1552 224 ) ( 320 -1472 224 ) ( 432 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 15.861 ] [ 0 -1 0 -64 ] -0 1 1 +( 320 -1472 208 ) ( 320 -1552 208 ) ( 432 -1472 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 37 +{ +( 320 -1472 208 ) ( 320 -1552 208 ) ( 320 -1472 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1552 224 ) ( 320 -1552 208 ) ( 240 -1520 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1472 224 ) ( 240 -1520 224 ) ( 240 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1472 224 ) ( 240 -1472 208 ) ( 320 -1472 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1520 224 ) ( 240 -1472 224 ) ( 320 -1552 224 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +( 240 -1472 208 ) ( 240 -1520 208 ) ( 320 -1472 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 38 +{ +( 240 -1520 208 ) ( 320 -1552 208 ) ( 240 -1520 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1552 208 ) ( 240 -1520 208 ) ( 240 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1552 220 ) ( 240 -1520 224 ) ( 320 -1552 224 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +( 240 -1552 220 ) ( 320 -1552 224 ) ( 240 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1520 208 ) ( 240 -1552 208 ) ( 320 -1552 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 39 +{ +( 504 -1472 352 ) ( 504 -1456 352 ) ( 504 -1472 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1456 352 ) ( 240 -1472 352 ) ( 240 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 504 -1456 352 ) ( 240 -1456 352 ) ( 504 -1456 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1472 352 ) ( 504 -1472 352 ) ( 240 -1472 208 ) rome01 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 240 -1456 352 ) ( 504 -1456 352 ) ( 240 -1472 352 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +( 240 -1472 208 ) ( 504 -1472 208 ) ( 240 -1456 208 ) rome01 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 40 +{ +( 432 -1600 208 ) ( 320 -1552 224 ) ( 432 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 15.861 ] [ 0 -1 0 -64 ] -0 1 1 +( 320 -1552 208 ) ( 432 -1472 216 ) ( 320 -1552 224 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1705.5999999999999 198.39999999999998 ) ( 320 -1552 208 ) ( 320 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 320 -1705.5999999999999 198.39999999999998 ) ( 320 -1552 224 ) ( 432 -1600 208 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +( 320 -1552 208 ) ( 320 -1705.5999999999999 198.39999999999998 ) ( 432 -1472 216 ) egypt14 [ 1 0 0 80 ] [ 0 -1 0 -64 ] -0 1 1 +( 224 -1600 224 ) ( 432 -1600 224 ) ( 224 -1600 208 ) egypt14 [ 1 0 0 80 ] [ 0 0 -1 -64 ] 0 1 1 +} +// brush 41 +{ +( 128 -1600 208 ) ( 128 -1616 208 ) ( 128 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -80 -1600 224 ) ( -80 -1616 224 ) ( -80 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -80 -1600 224 ) ( -80 -1600 208 ) ( 128 -1600 224 ) rome01 [ -1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1616 224 ) ( 128 -1616 208 ) ( -80 -1616 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -80 -1616 224 ) ( -80 -1600 224 ) ( 128 -1616 224 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 +( -80 -1600 192 ) ( -80 -1616 192 ) ( 128 -1600 192 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 42 +{ +( 128 -1456 192 ) ( 128 -1600 192 ) ( 128 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( -80 -1456 208 ) ( -80 -1600 208 ) ( -80 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( -80 -1456 208 ) ( -80 -1456 192 ) ( 128 -1456 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 128 -1600 208 ) ( 128 -1600 192 ) ( -80 -1600 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( -80 -1600 208 ) ( -80 -1456 208 ) ( 128 -1600 208 ) afloor1_3 [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +( -80 -1456 192 ) ( -80 -1600 192 ) ( 128 -1456 192 ) afloor1_3 [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 43 +{ +( 16 -1552 224 ) ( 16 -1552 208 ) ( 16 -1600 216 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1552 220 ) ( 16 -1600 216 ) ( -64 -1552 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1552 208 ) ( 16 -1552 208 ) ( -64 -1552 220 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1552 220 ) ( 16 -1552 224 ) ( 16 -1600 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 +( 16 -1552 208 ) ( -64 -1552 208 ) ( 16 -1600 216 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 44 +{ +( 16 -1600 216 ) ( -64 -1552 220 ) ( -64 -1552 208 ) egypt14 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1600 208 ) ( -64 -1552 208 ) ( -64 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -64 -1600 208 ) ( -64 -1552 220 ) ( 16 -1600 216 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 +( -64 -1600 208 ) ( 16 -1600 216 ) ( -64 -1552 208 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 45 +{ +( 128 -1600 224 ) ( 128 -1600 208 ) ( 144 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1616 208 ) ( 128 -1600 208 ) ( 128 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1616 224 ) ( 144 -1616 224 ) ( 128 -1616 208 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1616 224 ) ( 128 -1600 224 ) ( 144 -1616 224 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 +( 128 -1600 192 ) ( 128 -1616 192 ) ( 144 -1616 192 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 46 +{ +( 144 -1600 208 ) ( 144 -1616 208 ) ( 144 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 144 -1616 224 ) ( 144 -1616 208 ) ( 128 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 144 -1600 224 ) ( 128 -1600 224 ) ( 144 -1600 208 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 144 -1600 224 ) ( 144 -1616 224 ) ( 128 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -128 ] 90 1 1 +( 144 -1600 192 ) ( 128 -1600 192 ) ( 144 -1616 192 ) rome01 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 47 +{ +( 144 -1456 208 ) ( 144 -1600 208 ) ( 144 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1456 224 ) ( 128 -1600 224 ) ( 128 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1456 224 ) ( 128 -1456 208 ) ( 144 -1456 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 144 -1600 224 ) ( 144 -1600 208 ) ( 128 -1600 224 ) rome01 [ 1 0 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 128 -1600 224 ) ( 128 -1456 224 ) ( 144 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -0 ] 90 1 1 +( 128 -1456 192 ) ( 128 -1600 192 ) ( 144 -1456 192 ) rome01 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 48 +{ +( 128 -1600 208 ) ( 16 -1552 224 ) ( 128 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 61.5135 ] [ 0 -1 0 -64 ] -0 1 1 +( 16 -1552 208 ) ( 128 -1472 216 ) ( 16 -1552 224 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 96 ] -0 1 1 +( 16 -1705.5999999999999 198.39999999999998 ) ( 16 -1552 208 ) ( 16 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 16 -1705.5999999999999 198.39999999999998 ) ( 16 -1552 224 ) ( 128 -1600 208 ) egypt14 [ 1 0 0 128 ] [ 0 -1 0 -64 ] -0 1 1 +( 16 -1552 208 ) ( 16 -1705.5999999999999 198.39999999999998 ) ( 128 -1472 216 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -64 ] -0 1 1 +( -80 -1600 224 ) ( 128 -1600 224 ) ( -80 -1600 208 ) egypt14 [ 1 0 0 128 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 49 +{ +( -256 -1600 216 ) ( -336 -1552 220 ) ( -336 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 +( -336 -1600 208 ) ( -336 -1552 208 ) ( -336 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -336 -1600 208 ) ( -336 -1552 220 ) ( -256 -1600 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +( -336 -1600 208 ) ( -256 -1600 216 ) ( -336 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 50 +{ +( -256 -1552 224 ) ( -256 -1552 208 ) ( -256 -1600 216 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -336 -1552 220 ) ( -256 -1600 216 ) ( -336 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 +( -336 -1552 208 ) ( -256 -1552 208 ) ( -336 -1552 220 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 +( -336 -1552 220 ) ( -256 -1552 224 ) ( -256 -1600 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +( -256 -1552 208 ) ( -336 -1552 208 ) ( -256 -1600 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 51 +{ +( -144 -1600 208 ) ( -256 -1552 224 ) ( -144 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 75.4131 ] [ 0 -1 0 -64 ] -0 1 1 +( -256 -1552 208 ) ( -144 -1472 216 ) ( -256 -1552 224 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 +( -256 -1705.5999999999999 198.39999999999998 ) ( -256 -1552 208 ) ( -256 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -256 -1705.5999999999999 198.39999999999998 ) ( -256 -1552 224 ) ( -144 -1600 208 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +( -256 -1552 208 ) ( -256 -1705.5999999999999 198.39999999999998 ) ( -144 -1472 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +( -352 -1600 224 ) ( -144 -1600 224 ) ( -352 -1600 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 52 +{ +( -144 -1600 208 ) ( -144 -1616 208 ) ( -144 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -352 -1600 224 ) ( -352 -1616 224 ) ( -352 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -352 -1600 224 ) ( -352 -1600 208 ) ( -144 -1600 224 ) rome01 [ -1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 +( -144 -1616 224 ) ( -144 -1616 208 ) ( -352 -1616 224 ) rome01 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 +( -352 -1616 224 ) ( -352 -1600 224 ) ( -144 -1616 224 ) rome01 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +( -352 -1600 192 ) ( -352 -1616 192 ) ( -144 -1600 192 ) rome01 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 53 +{ +( -144 -1456 192 ) ( -144 -1600 192 ) ( -144 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( -352 -1456 208 ) ( -352 -1600 208 ) ( -352 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( -352 -1456 208 ) ( -352 -1456 192 ) ( -144 -1456 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 +( -144 -1600 208 ) ( -144 -1600 192 ) ( -352 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 +( -352 -1600 208 ) ( -352 -1456 208 ) ( -144 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 +( -352 -1456 192 ) ( -352 -1600 192 ) ( -144 -1456 192 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 54 +{ +( -512 -1600 216 ) ( -592 -1552 220 ) ( -592 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 +( -592 -1600 208 ) ( -592 -1552 208 ) ( -592 -1552 220 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -592 -1600 208 ) ( -592 -1552 220 ) ( -512 -1600 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +( -592 -1600 208 ) ( -512 -1600 216 ) ( -592 -1552 208 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 55 +{ +( -400 -1600 208 ) ( -512 -1552 224 ) ( -400 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 73.4363 ] [ 0 -1 0 -64 ] -0 1 1 +( -512 -1552 208 ) ( -400 -1472 216 ) ( -512 -1552 224 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 +( -512 -1705.5999999999999 198.39999999999998 ) ( -512 -1552 208 ) ( -512 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -512 -1705.5999999999999 198.39999999999998 ) ( -512 -1552 224 ) ( -400 -1600 208 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +( -512 -1552 208 ) ( -512 -1705.5999999999999 198.39999999999998 ) ( -400 -1472 216 ) egypt14 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +( -608 -1600 224 ) ( -400 -1600 224 ) ( -608 -1600 208 ) egypt14 [ 1 0 0 16 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 56 +{ +( -400 -1600 208 ) ( -400 -1616 208 ) ( -400 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -608 -1600 224 ) ( -608 -1616 224 ) ( -608 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( -608 -1600 224 ) ( -608 -1600 208 ) ( -400 -1600 224 ) rome01 [ -1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 +( -400 -1616 224 ) ( -400 -1616 208 ) ( -608 -1616 224 ) rome01 [ 1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 +( -608 -1616 224 ) ( -608 -1600 224 ) ( -400 -1616 224 ) rome01 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +( -608 -1600 192 ) ( -608 -1616 192 ) ( -400 -1600 192 ) rome01 [ 1 0 0 16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 57 +{ +( -400 -1456 192 ) ( -400 -1600 192 ) ( -400 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( -608 -1456 208 ) ( -608 -1600 208 ) ( -608 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( -608 -1456 208 ) ( -608 -1456 192 ) ( -400 -1456 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 +( -400 -1600 208 ) ( -400 -1600 192 ) ( -608 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 0 -1 16 ] -0 1 1 +( -608 -1600 208 ) ( -608 -1456 208 ) ( -400 -1600 208 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 +( -608 -1456 192 ) ( -608 -1600 192 ) ( -400 -1456 192 ) afloor1_3 [ 1 0 0 16 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 58 +{ +( 856 -1472 352 ) ( 856 -1456 352 ) ( 856 -1472 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 592 -1456 352 ) ( 592 -1472 352 ) ( 592 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 856 -1456 352 ) ( 592 -1456 352 ) ( 856 -1456 208 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 +( 592 -1472 352 ) ( 856 -1472 352 ) ( 592 -1472 208 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 +( 592 -1456 352 ) ( 856 -1456 352 ) ( 592 -1472 352 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 +( 592 -1472 208 ) ( 856 -1472 208 ) ( 592 -1456 208 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 59 +{ +( 784 -1600 208 ) ( 672 -1552 224 ) ( 784 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -77.4209 ] [ 0 -1 0 -64 ] -0 1 1 +( 672 -1552 208 ) ( 784 -1472 216 ) ( 672 -1552 224 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 0 -1 96 ] -0 1 1 +( 672 -1705.5999999999999 198.39999999999998 ) ( 672 -1552 208 ) ( 672 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 672 -1705.5999999999999 198.39999999999998 ) ( 672 -1552 224 ) ( 784 -1600 208 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 -1 0 -64 ] -0 1 1 +( 672 -1552 208 ) ( 672 -1705.5999999999999 198.39999999999998 ) ( 784 -1472 216 ) egypt14 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 +( 576 -1600 224 ) ( 784 -1600 224 ) ( 576 -1600 208 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 60 +{ +( 672 -1552 224 ) ( 784 -1472 216 ) ( 672 -1552 208 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 0 -1 96 ] -0 1 1 +( 672 -1472 224 ) ( 672 -1552 224 ) ( 672 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 672 -1472 208 ) ( 784 -1472 216 ) ( 672 -1472 224 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 0 -1 96 ] -0 1 1 +( 672 -1552 224 ) ( 672 -1472 224 ) ( 784 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -77.4209 ] [ 0 -1 0 -64 ] -0 1 1 +( 672 -1472 208 ) ( 672 -1552 208 ) ( 784 -1472 216 ) egypt14 [ 1 0 0 -15.9999 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 61 +{ +( 800 -1456 208 ) ( 800 -1600 208 ) ( 800 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 784 -1456 224 ) ( 784 -1600 224 ) ( 784 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 784 -1456 224 ) ( 784 -1456 208 ) ( 800 -1456 224 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 +( 800 -1600 224 ) ( 800 -1600 208 ) ( 784 -1600 224 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 +( 784 -1600 224 ) ( 784 -1456 224 ) ( 800 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 16 ] 90 1 1 +( 784 -1456 192 ) ( 784 -1600 192 ) ( 800 -1456 192 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 62 +{ +( 800 -1600 208 ) ( 800 -1616 208 ) ( 800 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 800 -1616 224 ) ( 800 -1616 208 ) ( 784 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 800 -1600 224 ) ( 784 -1600 224 ) ( 800 -1600 208 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 +( 800 -1600 224 ) ( 800 -1616 224 ) ( 784 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 16 ] 90 1 1 +( 800 -1600 192 ) ( 784 -1600 192 ) ( 800 -1616 192 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 63 +{ +( 784 -1600 224 ) ( 784 -1600 208 ) ( 800 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 784 -1616 208 ) ( 784 -1600 208 ) ( 784 -1616 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 784 -1616 224 ) ( 800 -1616 224 ) ( 784 -1616 208 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 +( 784 -1616 224 ) ( 784 -1600 224 ) ( 800 -1616 224 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 +( 784 -1600 192 ) ( 784 -1616 192 ) ( 800 -1616 192 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 64 +{ +( 784 -1600 208 ) ( 784 -1616 208 ) ( 784 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 576 -1600 224 ) ( 576 -1616 224 ) ( 576 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 576 -1600 224 ) ( 576 -1600 208 ) ( 784 -1600 224 ) rome01 [ -1 0 0 16 ] [ 0 0 -1 96 ] -0 1 1 +( 784 -1616 224 ) ( 784 -1616 208 ) ( 576 -1616 224 ) rome01 [ 1 0 0 -16 ] [ 0 0 -1 96 ] -0 1 1 +( 576 -1616 224 ) ( 576 -1600 224 ) ( 784 -1616 224 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 +( 576 -1600 192 ) ( 576 -1616 192 ) ( 784 -1600 192 ) rome01 [ 1 0 0 -16 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 65 +{ +( 784 -1456 192 ) ( 784 -1600 192 ) ( 784 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 576 -1456 208 ) ( 576 -1600 208 ) ( 576 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 576 -1456 208 ) ( 576 -1456 192 ) ( 784 -1456 208 ) afloor1_3 [ 1 0 0 -16 ] [ 0 0 -1 16 ] -0 1 1 +( 784 -1600 208 ) ( 784 -1600 192 ) ( 576 -1600 208 ) afloor1_3 [ 1 0 0 -16 ] [ 0 0 -1 16 ] -0 1 1 +( 576 -1600 208 ) ( 576 -1456 208 ) ( 784 -1600 208 ) afloor1_3 [ 1 0 0 -16 ] [ 0 -1 0 -0 ] -0 1 1 +( 576 -1456 192 ) ( 576 -1600 192 ) ( 784 -1456 192 ) afloor1_3 [ 1 0 0 -16 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 66 +{ +( 1120 -1600 208 ) ( 1008 -1552 224 ) ( 1120 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -26.8263 ] [ 0 -1 0 -64 ] -0 1 1 +( 1008 -1552 208 ) ( 1120 -1472 216 ) ( 1008 -1552 224 ) egypt14 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1705.5999999999999 198.39999999999998 ) ( 1008 -1552 208 ) ( 1008 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1705.5999999999999 198.39999999999998 ) ( 1008 -1552 224 ) ( 1120 -1600 208 ) egypt14 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 +( 1008 -1552 208 ) ( 1008 -1705.5999999999999 198.39999999999998 ) ( 1120 -1472 216 ) egypt14 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 +( 912 -1600 224 ) ( 1120 -1600 224 ) ( 912 -1600 208 ) egypt14 [ 1 0 0 -96 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 67 +{ +( 1008 -1552 224 ) ( 1120 -1472 216 ) ( 1008 -1552 208 ) egypt14 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1472 224 ) ( 1008 -1552 224 ) ( 1008 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1472 208 ) ( 1120 -1472 216 ) ( 1008 -1472 224 ) egypt14 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1552 224 ) ( 1008 -1472 224 ) ( 1120 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -26.8263 ] [ 0 -1 0 -64 ] -0 1 1 +( 1008 -1472 208 ) ( 1008 -1552 208 ) ( 1120 -1472 216 ) egypt14 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 68 +{ +( 1136 -1456 208 ) ( 1136 -1600 208 ) ( 1136 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1456 224 ) ( 1120 -1600 224 ) ( 1120 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1456 224 ) ( 1120 -1456 208 ) ( 1136 -1456 224 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 +( 1136 -1600 224 ) ( 1136 -1600 208 ) ( 1120 -1600 224 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1600 224 ) ( 1120 -1456 224 ) ( 1136 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 96 ] 90 1 1 +( 1120 -1456 192 ) ( 1120 -1600 192 ) ( 1136 -1456 192 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 69 +{ +( 1120 -1600 208 ) ( 1120 -1616 208 ) ( 1120 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 912 -1600 224 ) ( 912 -1616 224 ) ( 912 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 912 -1600 224 ) ( 912 -1600 208 ) ( 1120 -1600 224 ) rome01 [ -1 0 0 96 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1616 224 ) ( 1120 -1616 208 ) ( 912 -1616 224 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 +( 912 -1616 224 ) ( 912 -1600 224 ) ( 1120 -1616 224 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 +( 912 -1600 192 ) ( 912 -1616 192 ) ( 1120 -1600 192 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 70 +{ +( 1192 -1472 352 ) ( 1192 -1456 352 ) ( 1192 -1472 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1456 352 ) ( 928 -1472 352 ) ( 928 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1192 -1456 352 ) ( 928 -1456 352 ) ( 1192 -1456 208 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1472 352 ) ( 1192 -1472 352 ) ( 928 -1472 208 ) rome01 [ 1 0 0 -96 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1456 352 ) ( 1192 -1456 352 ) ( 928 -1472 352 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 +( 928 -1472 208 ) ( 1192 -1472 208 ) ( 928 -1456 208 ) rome01 [ 1 0 0 -96 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 71 +{ +( 1120 -1456 192 ) ( 1120 -1600 192 ) ( 1120 -1456 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1456 208 ) ( 912 -1600 208 ) ( 912 -1456 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1456 208 ) ( 912 -1456 192 ) ( 1120 -1456 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 1120 -1600 208 ) ( 1120 -1600 192 ) ( 912 -1600 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1600 208 ) ( 912 -1456 208 ) ( 1120 -1600 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +( 912 -1456 192 ) ( 912 -1600 192 ) ( 1120 -1456 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 72 +{ +( 1440 -1600 208 ) ( 1328 -1552 224 ) ( 1440 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -88.3552 ] [ 0 -1 0 -64 ] -0 1 1 +( 1328 -1552 208 ) ( 1440 -1472 216 ) ( 1328 -1552 224 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1328 -1705.5999999999999 198.39999999999998 ) ( 1328 -1552 208 ) ( 1328 -1552 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1328 -1705.5999999999999 198.39999999999998 ) ( 1328 -1552 224 ) ( 1440 -1600 208 ) egypt14 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 +( 1328 -1552 208 ) ( 1328 -1705.5999999999999 198.39999999999998 ) ( 1440 -1472 216 ) egypt14 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 +( 1232 -1600 224 ) ( 1440 -1600 224 ) ( 1232 -1600 208 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 73 +{ +( 1328 -1552 224 ) ( 1440 -1472 216 ) ( 1328 -1552 208 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1328 -1472 224 ) ( 1328 -1552 224 ) ( 1328 -1472 208 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1328 -1472 208 ) ( 1440 -1472 216 ) ( 1328 -1472 224 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1328 -1552 224 ) ( 1328 -1472 224 ) ( 1440 -1472 216 ) egypt14 [ 0.992278 0 -0.124035 -88.3552 ] [ 0 -1 0 -64 ] -0 1 1 +( 1328 -1472 208 ) ( 1328 -1552 208 ) ( 1440 -1472 216 ) egypt14 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 74 +{ +( 1456 -1456 208 ) ( 1456 -1600 208 ) ( 1456 -1456 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1440 -1456 224 ) ( 1440 -1600 224 ) ( 1440 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1440 -1456 224 ) ( 1440 -1456 208 ) ( 1456 -1456 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1456 -1600 224 ) ( 1456 -1600 208 ) ( 1440 -1600 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1440 -1600 224 ) ( 1440 -1456 224 ) ( 1456 -1600 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 32 ] 90 1 1 +( 1440 -1456 192 ) ( 1440 -1600 192 ) ( 1456 -1456 192 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 75 +{ +( 1512 -1472 352 ) ( 1512 -1456 352 ) ( 1512 -1472 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1248 -1456 352 ) ( 1248 -1472 352 ) ( 1248 -1456 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1512 -1456 352 ) ( 1248 -1456 352 ) ( 1512 -1456 208 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1248 -1472 352 ) ( 1512 -1472 352 ) ( 1248 -1472 208 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1248 -1456 352 ) ( 1512 -1456 352 ) ( 1248 -1472 352 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 +( 1248 -1472 208 ) ( 1512 -1472 208 ) ( 1248 -1456 208 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 76 +{ +( 1440 -1600 208 ) ( 1440 -1616 208 ) ( 1440 -1600 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1232 -1600 224 ) ( 1232 -1616 224 ) ( 1232 -1600 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1232 -1600 224 ) ( 1232 -1600 208 ) ( 1440 -1600 224 ) rome01 [ -1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1440 -1616 224 ) ( 1440 -1616 208 ) ( 1232 -1616 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1232 -1616 224 ) ( 1232 -1600 224 ) ( 1440 -1616 224 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 +( 1232 -1600 192 ) ( 1232 -1616 192 ) ( 1440 -1600 192 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 77 +{ +( 1120 -1648 192 ) ( 1120 -1792 192 ) ( 1120 -1648 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1648 208 ) ( 912 -1792 208 ) ( 912 -1648 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1648 208 ) ( 912 -1648 192 ) ( 1120 -1648 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 1120 -1792 208 ) ( 1120 -1792 192 ) ( 912 -1792 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1792 208 ) ( 912 -1648 208 ) ( 1120 -1792 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +( 912 -1648 192 ) ( 912 -1792 192 ) ( 1120 -1648 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 78 +{ +( 1120 -1792 208 ) ( 1008 -1744 224 ) ( 1120 -1664 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 -0 ] -0 1 1 +( 1008 -1744 208 ) ( 1120 -1664 216 ) ( 1008 -1744 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1897.5999999999999 198.39999999999998 ) ( 1008 -1744 208 ) ( 1008 -1744 224 ) egypt14 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1897.5999999999999 198.39999999999998 ) ( 1008 -1744 224 ) ( 1120 -1792 208 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +( 1008 -1744 208 ) ( 1008 -1897.5999999999999 198.39999999999998 ) ( 1120 -1664 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +( 912 -1792 224 ) ( 1120 -1792 224 ) ( 912 -1792 208 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 79 +{ +( 1136 -1648 208 ) ( 1136 -1792 208 ) ( 1136 -1648 224 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1648 224 ) ( 1120 -1792 224 ) ( 1120 -1648 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1648 224 ) ( 1120 -1648 208 ) ( 1136 -1648 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1136 -1792 224 ) ( 1136 -1792 208 ) ( 1120 -1792 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1792 224 ) ( 1120 -1648 224 ) ( 1136 -1792 224 ) rome01 [ 0 -1 0 -0 ] [ -1 0 0 -32 ] 90 1 1 +( 1120 -1648 192 ) ( 1120 -1792 192 ) ( 1136 -1648 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 80 +{ +( 1008 -1744 224 ) ( 1120 -1664 216 ) ( 1008 -1744 208 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1664 224 ) ( 1008 -1744 224 ) ( 1008 -1664 208 ) egypt14 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1664 208 ) ( 1120 -1664 216 ) ( 1008 -1664 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1744 224 ) ( 1008 -1664 224 ) ( 1120 -1664 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 -0 ] -0 1 1 +( 1008 -1664 208 ) ( 1008 -1744 208 ) ( 1120 -1664 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 81 +{ +( 1192 -1664 352 ) ( 1192 -1648 352 ) ( 1192 -1664 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1648 352 ) ( 928 -1664 352 ) ( 928 -1648 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1192 -1648 352 ) ( 928 -1648 352 ) ( 1192 -1648 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1664 352 ) ( 1192 -1664 352 ) ( 928 -1664 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1648 352 ) ( 1192 -1648 352 ) ( 928 -1664 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +( 928 -1664 208 ) ( 1192 -1664 208 ) ( 928 -1648 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 82 +{ +( 1120 -1984 208 ) ( 1008 -1936 224 ) ( 1120 -1856 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 -64 ] -0 1 1 +( 1008 -1936 208 ) ( 1120 -1856 216 ) ( 1008 -1936 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -2089.5999999999999 198.39999999999998 ) ( 1008 -1936 208 ) ( 1008 -1936 224 ) egypt14 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -2089.5999999999999 198.39999999999998 ) ( 1008 -1936 224 ) ( 1120 -1984 208 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 +( 1008 -1936 208 ) ( 1008 -2089.5999999999999 198.39999999999998 ) ( 1120 -1856 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 +( 912 -1984 224 ) ( 1120 -1984 224 ) ( 912 -1984 208 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 83 +{ +( 1136 -1840 208 ) ( 1136 -1984 208 ) ( 1136 -1840 224 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1840 224 ) ( 1120 -1984 224 ) ( 1120 -1840 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1840 224 ) ( 1120 -1840 208 ) ( 1136 -1840 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1136 -1984 224 ) ( 1136 -1984 208 ) ( 1120 -1984 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1984 224 ) ( 1120 -1840 224 ) ( 1136 -1984 224 ) rome01 [ 0 -1 0 -64 ] [ -1 0 0 -32 ] 90 1 1 +( 1120 -1840 192 ) ( 1120 -1984 192 ) ( 1136 -1840 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 84 +{ +( 1192 -1856 352 ) ( 1192 -1840 352 ) ( 1192 -1856 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1840 352 ) ( 928 -1856 352 ) ( 928 -1840 208 ) rome01 [ 0 1 0 64 ] [ 0 0 -1 96 ] -0 1 1 +( 1192 -1840 352 ) ( 928 -1840 352 ) ( 1192 -1840 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1856 352 ) ( 1192 -1856 352 ) ( 928 -1856 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1840 352 ) ( 1192 -1840 352 ) ( 928 -1856 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 +( 928 -1856 208 ) ( 1192 -1856 208 ) ( 928 -1840 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -64 ] -0 1 1 +} +// brush 85 +{ +( 1120 -1840 192 ) ( 1120 -1984 192 ) ( 1120 -1840 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1840 208 ) ( 912 -1984 208 ) ( 912 -1840 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1840 208 ) ( 912 -1840 192 ) ( 1120 -1840 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 1120 -1984 208 ) ( 1120 -1984 192 ) ( 912 -1984 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1984 208 ) ( 912 -1840 208 ) ( 1120 -1984 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +( 912 -1840 192 ) ( 912 -1984 192 ) ( 1120 -1840 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 86 +{ +( 1328 -1744 224 ) ( 1440 -1664 216 ) ( 1328 -1744 208 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1328 -1664 224 ) ( 1328 -1744 224 ) ( 1328 -1664 208 ) egypt14 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1328 -1664 208 ) ( 1440 -1664 216 ) ( 1328 -1664 224 ) egypt14 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1328 -1744 224 ) ( 1328 -1664 224 ) ( 1440 -1664 216 ) egypt14 [ 0.992278 0 -0.124035 -88.3552 ] [ 0 -1 0 -0 ] -0 1 1 +( 1328 -1664 208 ) ( 1328 -1744 208 ) ( 1440 -1664 216 ) egypt14 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 87 +{ +( 1512 -1664 352 ) ( 1512 -1648 352 ) ( 1512 -1664 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1248 -1648 352 ) ( 1248 -1664 352 ) ( 1248 -1648 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1512 -1648 352 ) ( 1248 -1648 352 ) ( 1512 -1648 208 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1248 -1664 352 ) ( 1512 -1664 352 ) ( 1248 -1664 208 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1248 -1648 352 ) ( 1512 -1648 352 ) ( 1248 -1664 352 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +( 1248 -1664 208 ) ( 1512 -1664 208 ) ( 1248 -1648 208 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 88 +{ +( 1456 -1648 208 ) ( 1456 -1792 208 ) ( 1456 -1648 224 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1440 -1648 224 ) ( 1440 -1792 224 ) ( 1440 -1648 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1440 -1648 224 ) ( 1440 -1648 208 ) ( 1456 -1648 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1456 -1792 224 ) ( 1456 -1792 208 ) ( 1440 -1792 224 ) rome01 [ 1 0 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1440 -1792 224 ) ( 1440 -1648 224 ) ( 1456 -1792 224 ) rome01 [ 0 -1 0 -0 ] [ -1 0 0 32 ] 90 1 1 +( 1440 -1648 192 ) ( 1440 -1792 192 ) ( 1456 -1648 192 ) rome01 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 89 +{ +( 1440 -1648 192 ) ( 1440 -1792 192 ) ( 1440 -1648 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 1232 -1648 208 ) ( 1232 -1792 208 ) ( 1232 -1648 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 1232 -1648 208 ) ( 1232 -1648 192 ) ( 1440 -1648 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 1440 -1792 208 ) ( 1440 -1792 192 ) ( 1232 -1792 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 1232 -1792 208 ) ( 1232 -1648 208 ) ( 1440 -1792 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +( 1232 -1648 192 ) ( 1232 -1792 192 ) ( 1440 -1648 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 90 +{ +( 1120 -1232 192 ) ( 1120 -1376 192 ) ( 1120 -1232 208 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1232 208 ) ( 912 -1376 208 ) ( 912 -1232 192 ) afloor1_3 [ 0 1 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1232 208 ) ( 912 -1232 192 ) ( 1120 -1232 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 1120 -1376 208 ) ( 1120 -1376 192 ) ( 912 -1376 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1376 208 ) ( 912 -1232 208 ) ( 1120 -1376 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 +( 912 -1232 192 ) ( 912 -1376 192 ) ( 1120 -1232 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 +} +// brush 91 +{ +( 1136 -1232 208 ) ( 1136 -1376 208 ) ( 1136 -1232 224 ) rome01 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1232 224 ) ( 1120 -1376 224 ) ( 1120 -1232 208 ) rome01 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1232 224 ) ( 1120 -1232 208 ) ( 1136 -1232 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1136 -1376 224 ) ( 1136 -1376 208 ) ( 1120 -1376 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1376 224 ) ( 1120 -1232 224 ) ( 1136 -1376 224 ) rome01 [ 0 -1 0 32 ] [ -1 0 0 -32 ] 90 1 1 +( 1120 -1232 192 ) ( 1120 -1376 192 ) ( 1136 -1232 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 +} +// brush 92 +{ +( 1192 -1248 352 ) ( 1192 -1232 352 ) ( 1192 -1248 208 ) rome01 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1232 352 ) ( 928 -1248 352 ) ( 928 -1232 208 ) rome01 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +( 1192 -1232 352 ) ( 928 -1232 352 ) ( 1192 -1232 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1248 352 ) ( 1192 -1248 352 ) ( 928 -1248 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1232 352 ) ( 1192 -1232 352 ) ( 928 -1248 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 +( 928 -1248 208 ) ( 1192 -1248 208 ) ( 928 -1232 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 +} +// brush 93 +{ +( 1008 -1248 208 ) ( 1120 -1376 208 ) ( 1120 -1248 216 ) egypt14 [ 0 1 0 -48 ] [ 1 0 -2.22045e-16 -68.1846 ] 0 1 1 +( 1008 -1248 208 ) ( 1008 -1376 205 ) ( 1120 -1376 208 ) egypt14 [ 0 1 0 -48 ] [ 1 0 -2.22045e-16 -64.5706 ] 0 1 1 +( 1120 -1376 208 ) ( 1008 -1328 224 ) ( 1120 -1248 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 32 ] -0 1 1 +( 1120 -1376 208 ) ( 1008 -1376 216 ) ( 1008 -1328 224 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 32 ] -0 1 1 +( 1120 -1376 208 ) ( 1008 -1376 205 ) ( 1008 -1376 216 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 +( 1008 -1248 224 ) ( 1120 -1248 216 ) ( 1008 -1328 224 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 32 ] -0 1 1 +( 1008 -1248 224 ) ( 1008 -1248 208 ) ( 1120 -1248 216 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1008 -1248 224 ) ( 1008 -1376 205 ) ( 1008 -1248 208 ) egypt14 [ 0 1 0 -32 ] [ 0 0 -1 96 ] -0 1 1 +} +// brush 94 +{ +( 1008 -1040 208 ) ( 1120 -1168 208 ) ( 1120 -1040 216 ) egypt14 [ 0 1 0 -48 ] [ 1 0 -2.22045e-16 -67.145 ] -0 1 1 +( 1008 -1040 208 ) ( 1008 -1168 205 ) ( 1120 -1168 208 ) egypt14 [ 0 1 0 -48 ] [ 1 0 -2.22045e-16 -63.7144 ] -0 1 1 +( 1120 -1168 208 ) ( 1008 -1120 224 ) ( 1120 -1040 216 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 112 ] -0 1 1 +( 1120 -1168 208 ) ( 1008 -1168 216 ) ( 1008 -1120 224 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 +( 1120 -1168 208 ) ( 1008 -1168 205 ) ( 1008 -1168 216 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 +( 1008 -1040 224 ) ( 1120 -1040 216 ) ( 1008 -1120 224 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 112 ] -0 1 1 +( 1008 -1040 224 ) ( 1008 -1040 208 ) ( 1120 -1040 216 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1104 -1040 224 ) ( 1104 -1168 205 ) ( 1104 -1040 208 ) egypt14 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 +} +// brush 95 +{ +( 1136 -1024 208 ) ( 1136 -1168 208 ) ( 1136 -1024 224 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1024 224 ) ( 1120 -1168 224 ) ( 1120 -1024 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1024 224 ) ( 1120 -1024 208 ) ( 1136 -1024 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1136 -1168 224 ) ( 1136 -1168 208 ) ( 1120 -1168 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -1168 224 ) ( 1120 -1024 224 ) ( 1136 -1168 224 ) rome01 [ 0 -1 0 112 ] [ -1 0 0 -32 ] 90 1 1 +( 1120 -1024 192 ) ( 1120 -1168 192 ) ( 1136 -1024 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 +} +// brush 96 +{ +( 1192 -1040 352 ) ( 1192 -1024 352 ) ( 1192 -1040 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1024 352 ) ( 928 -1040 352 ) ( 928 -1024 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 +( 1192 -1024 352 ) ( 928 -1024 352 ) ( 1192 -1024 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1040 352 ) ( 1192 -1040 352 ) ( 928 -1040 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -1024 352 ) ( 1192 -1024 352 ) ( 928 -1040 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 +( 928 -1040 208 ) ( 1192 -1040 208 ) ( 928 -1024 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 +} +// brush 97 +{ +( 1120 -1024 192 ) ( 1120 -1168 192 ) ( 1120 -1024 208 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1024 208 ) ( 912 -1168 208 ) ( 912 -1024 192 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1024 208 ) ( 912 -1024 192 ) ( 1120 -1024 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 1120 -1168 208 ) ( 1120 -1168 192 ) ( 912 -1168 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -1168 208 ) ( 912 -1024 208 ) ( 1120 -1168 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 +( 912 -1024 192 ) ( 912 -1168 192 ) ( 1120 -1024 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 +} +// brush 98 +{ +( 1120 -848 216 ) ( 1088 -928 224 ) ( 1088 -848 224 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 47.9999 ] -0 1 1 +( 1088 -848 224 ) ( 1088 -928 224 ) ( 1088 -976 216 ) egypt14 [ 0 1 0 -47.9999 ] [ 0 0 -1 96 ] -0 1 1 +( 1088 -848 208 ) ( 1120 -848 216 ) ( 1088 -848 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1088 -976 205 ) ( 1120 -976 208 ) ( 1088 -848 208 ) egypt14 [ 0 1 0 -64 ] [ 1 0 -2.22045e-16 -64.5706 ] -0 1 1 +( 1088 -848 208 ) ( 1120 -976 208 ) ( 1120 -848 216 ) egypt14 [ 0 1 0 -63.9999 ] [ 1 0 -2.22045e-16 -68.1846 ] -0 1 1 +( 1120 -848 216 ) ( 1120 -976 208 ) ( 1088 -928 224 ) egypt14 [ 0.992278 0 -0.124035 101.174 ] [ 0 -1 0 48 ] -0 1 1 +( 1088 -928 224 ) ( 1120 -976 208 ) ( 1088 -976 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 +( 1088 -976 216 ) ( 1120 -976 208 ) ( 1088 -976 205 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 99 +{ +( 1136 -832 208 ) ( 1136 -976 208 ) ( 1136 -832 224 ) rome01 [ 0 1 0 -48 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -832 224 ) ( 1120 -976 224 ) ( 1120 -832 208 ) rome01 [ 0 1 0 -48 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -832 224 ) ( 1120 -832 208 ) ( 1136 -832 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1136 -976 224 ) ( 1136 -976 208 ) ( 1120 -976 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -976 224 ) ( 1120 -832 224 ) ( 1136 -976 224 ) rome01 [ 0 -1 0 48 ] [ -1 0 0 -32 ] 90 1 1 +( 1120 -832 192 ) ( 1120 -976 192 ) ( 1136 -832 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 +} +// brush 100 +{ +( 1192 -848 352 ) ( 1192 -832 352 ) ( 1192 -848 208 ) rome01 [ 0 1 0 -48 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -832 352 ) ( 928 -848 352 ) ( 928 -832 208 ) rome01 [ 0 1 0 -48 ] [ 0 0 -1 96 ] -0 1 1 +( 1192 -832 352 ) ( 928 -832 352 ) ( 1192 -832 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -848 352 ) ( 1192 -848 352 ) ( 928 -848 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -832 352 ) ( 1192 -832 352 ) ( 928 -848 352 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 +( 928 -848 208 ) ( 1192 -848 208 ) ( 928 -832 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 +} +// brush 101 +{ +( 1120 -832 192 ) ( 1120 -976 192 ) ( 1120 -832 208 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -832 208 ) ( 912 -976 208 ) ( 912 -832 192 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -832 208 ) ( 912 -832 192 ) ( 1120 -832 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 1120 -976 208 ) ( 1120 -976 192 ) ( 912 -976 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -976 208 ) ( 912 -832 208 ) ( 1120 -976 208 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 +( 912 -832 192 ) ( 912 -976 192 ) ( 1120 -832 192 ) afloor1_3 [ 1 0 0 32 ] [ 0 -1 0 48 ] -0 1 1 +} +// brush 102 +{ +( 1136 -624 208 ) ( 1136 -768 208 ) ( 1136 -624 224 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -624 224 ) ( 1120 -768 224 ) ( 1120 -624 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -624 224 ) ( 1120 -624 208 ) ( 1136 -624 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1136 -768 224 ) ( 1136 -768 208 ) ( 1120 -768 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -768 224 ) ( 1120 -624 224 ) ( 1136 -768 224 ) rome01 [ 0 -1 0 -0 ] [ -1 0 0 -32 ] 90 1 1 +( 1120 -624 192 ) ( 1120 -768 192 ) ( 1136 -624 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 103 +{ +( 1192 -640 352 ) ( 1192 -624 352 ) ( 1192 -640 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -624 352 ) ( 928 -640 352 ) ( 928 -624 208 ) rome01 [ 0 1 0 -0 ] [ 0 0 -1 96 ] -0 1 1 +( 1192 -624 352 ) ( 928 -624 352 ) ( 1192 -624 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -640 352 ) ( 1192 -640 352 ) ( 928 -640 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -624 224 ) ( 1192 -624 224 ) ( 928 -640 224 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +( 928 -640 208 ) ( 1192 -640 208 ) ( 928 -624 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 104 +{ +( 1120 -624 192 ) ( 1120 -768 192 ) ( 1120 -624 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -624 208 ) ( 912 -768 208 ) ( 912 -624 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -624 208 ) ( 912 -624 192 ) ( 1120 -624 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 1120 -768 208 ) ( 1120 -768 192 ) ( 912 -768 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -768 208 ) ( 912 -624 208 ) ( 1120 -768 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +( 912 -624 192 ) ( 912 -768 192 ) ( 1120 -624 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 105 +{ +( 1120 -640 216 ) ( 1088 -720 224 ) ( 1088 -640 224 ) egypt14 [ 0.992278 0 -0.124035 -26.8262 ] [ 0 -1 0 -0 ] -0 1 1 +( 1088 -640 224 ) ( 1088 -720 224 ) ( 1088 -768 216 ) egypt14 [ 0 1 0 0 ] [ 0 0 -1 96 ] -0 1 1 +( 1088 -640 208 ) ( 1120 -640 216 ) ( 1088 -640 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1088 -768 205 ) ( 1120 -768 208 ) ( 1088 -640 208 ) egypt14 [ 0 1 0 -16 ] [ 1 0 -2.22045e-16 -64.5706 ] -0 1 1 +( 1088 -640 208 ) ( 1120 -768 208 ) ( 1120 -640 216 ) egypt14 [ 0 1 0 -15.9999 ] [ 1 0 -2.22045e-16 -68.1846 ] -0 1 1 +( 1120 -640 216 ) ( 1120 -768 208 ) ( 1088 -720 224 ) egypt14 [ 0.992278 0 -0.124035 -26.8263 ] [ 0 -1 0 -0 ] -0 1 1 +( 1088 -720 224 ) ( 1120 -768 208 ) ( 1088 -768 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 -0 ] -0 1 1 +( 1088 -768 216 ) ( 1120 -768 208 ) ( 1088 -768 205 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 106 +{ +( 1120 -448 352 ) ( 1120 -432 352 ) ( 1120 -448 208 ) rome01 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 +( 1056 -432 352 ) ( 1056 -448 352 ) ( 1056 -432 208 ) rome01 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 +( 1192 -432 352 ) ( 928 -432 352 ) ( 1192 -432 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -448 352 ) ( 1192 -448 352 ) ( 928 -448 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -432 224 ) ( 1192 -432 224 ) ( 928 -448 224 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 64 ] -0 1 1 +( 928 -448 208 ) ( 1192 -448 208 ) ( 928 -432 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 64 ] -0 1 1 +} +// brush 107 +{ +( 1136 -432 208 ) ( 1136 -576 208 ) ( 1136 -432 224 ) rome01 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -432 224 ) ( 1120 -576 224 ) ( 1120 -432 208 ) rome01 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -432 224 ) ( 1120 -432 208 ) ( 1136 -432 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1136 -576 224 ) ( 1136 -576 208 ) ( 1120 -576 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -576 224 ) ( 1120 -432 224 ) ( 1136 -576 224 ) rome01 [ 0 -1 0 64 ] [ -1 0 0 -32 ] 90 1 1 +( 1120 -432 192 ) ( 1120 -576 192 ) ( 1136 -432 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 64 ] -0 1 1 +} +// brush 108 +{ +( 1120 -448 216 ) ( 1088 -528 224 ) ( 1088 -448 224 ) egypt14 [ 0.992278 0 -0.124035 -26.8262 ] [ 0 -1 0 64 ] -0 1 1 +( 1088 -448 224 ) ( 1088 -528 224 ) ( 1088 -576 216 ) egypt14 [ 0 1 0 -64 ] [ 0 0 -1 96 ] -0 1 1 +( 1088 -448 208 ) ( 1120 -448 216 ) ( 1088 -448 224 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1088 -576 205 ) ( 1120 -576 208 ) ( 1088 -448 208 ) egypt14 [ 0 1 0 -80 ] [ 1 0 -2.22045e-16 -64.5706 ] -0 1 1 +( 1088 -448 208 ) ( 1120 -576 208 ) ( 1120 -448 216 ) egypt14 [ 0 1 0 -80 ] [ 1 0 -2.22045e-16 -68.1846 ] -0 1 1 +( 1120 -448 216 ) ( 1120 -576 208 ) ( 1088 -528 224 ) egypt14 [ 0.992278 0 -0.124035 -26.8263 ] [ 0 -1 0 64 ] -0 1 1 +( 1088 -528 224 ) ( 1120 -576 208 ) ( 1088 -576 216 ) egypt14 [ 1 0 0 32 ] [ 0 -1 0 64 ] -0 1 1 +( 1088 -576 216 ) ( 1120 -576 208 ) ( 1088 -576 205 ) egypt14 [ 1 0 0 32 ] [ 0 0 -1 -64 ] -0 1 1 +} +// brush 109 +{ +( 1120 -432 192 ) ( 1120 -576 192 ) ( 1120 -432 208 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 1056 -432 208 ) ( 1056 -576 208 ) ( 1056 -432 192 ) afloor1_3 [ 0 1 0 -0 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -432 208 ) ( 912 -432 192 ) ( 1120 -432 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 1120 -576 208 ) ( 1120 -576 192 ) ( 912 -576 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -576 208 ) ( 912 -432 208 ) ( 1120 -576 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +( 912 -432 192 ) ( 912 -576 192 ) ( 1120 -432 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 -0 ] -0 1 1 +} +// brush 110 +{ +( 1120 -256 192 ) ( 1120 -400 192 ) ( 1120 -256 208 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 +( 1056 -256 208 ) ( 1056 -400 208 ) ( 1056 -256 192 ) afloor1_3 [ 0 1 0 -48 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -256 208 ) ( 912 -256 192 ) ( 1120 -256 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 1120 -400 208 ) ( 1120 -400 192 ) ( 912 -400 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 0 -1 16 ] -0 1 1 +( 912 -400 208 ) ( 912 -256 208 ) ( 1120 -400 208 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 48 ] -0 1 1 +( 912 -256 192 ) ( 912 -400 192 ) ( 1120 -256 192 ) afloor1_3 [ 1 0 0 -32 ] [ 0 -1 0 48 ] -0 1 1 +} +// brush 111 +{ +( 1120 -272 352 ) ( 1120 -256 352 ) ( 1120 -272 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 +( 1056 -256 352 ) ( 1056 -272 352 ) ( 1056 -256 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 +( 1192 -256 352 ) ( 928 -256 352 ) ( 1192 -256 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -272 352 ) ( 1192 -272 352 ) ( 928 -272 208 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 928 -256 224 ) ( 1192 -256 224 ) ( 928 -272 224 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 +( 928 -272 208 ) ( 1192 -272 208 ) ( 928 -256 208 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 +} +// brush 112 +{ +( 1136 -256 208 ) ( 1136 -400 208 ) ( 1136 -256 224 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -256 224 ) ( 1120 -400 224 ) ( 1120 -256 208 ) rome01 [ 0 1 0 -112 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -256 224 ) ( 1120 -256 208 ) ( 1136 -256 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1136 -400 224 ) ( 1136 -400 208 ) ( 1120 -400 224 ) rome01 [ 1 0 0 32 ] [ 0 0 -1 96 ] -0 1 1 +( 1120 -400 224 ) ( 1120 -256 224 ) ( 1136 -400 224 ) rome01 [ 0 -1 0 112 ] [ -1 0 0 -32 ] 90 1 1 +( 1120 -256 192 ) ( 1120 -400 192 ) ( 1136 -256 192 ) rome01 [ 1 0 0 32 ] [ 0 -1 0 112 ] -0 1 1 +} +// brush 113 +{ +( 1120 -272 216 ) ( 1088 -400 224 ) ( 1088 -272 224 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -0 ] 0 1 1 +( 1088 -272 224 ) ( 1088 -400 224 ) ( 1088 -400 208 ) egypt14 [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 1120 -272 216 ) ( 1088 -272 224 ) ( 1088 -272 208 ) egypt14 [ -1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +( 1088 -400 208 ) ( 1120 -400 208 ) ( 1088 -272 208 ) egypt14 [ -1 0 0 -0 ] [ 0 -1 0 -0 ] 0 1 1 +( 1088 -272 208 ) ( 1120 -400 208 ) ( 1120 -272 216 ) egypt14 [ -1 0 0 -0 ] [ 0 -1 0 -0 ] 0 1 1 +( 1120 -272 216 ) ( 1120 -400 208 ) ( 1088 -400 224 ) egypt14 [ 1 0 0 -0 ] [ 0 -1 0 -0 ] 0 1 1 +( 1088 -400 224 ) ( 1120 -400 208 ) ( 1088 -400 208 ) egypt14 [ 1 0 0 0 ] [ 0 0 -1 0 ] 0 1 1 +} +} +// entity 1 +{ +"classname" "trigger_void" +// brush 0 +{ +( 2048 880 -2000 ) ( 2048 880 -2016 ) ( 2048 -1392 -2000 ) trigger [ 0 1 0 -128 ] [ 0 0 -1 -96 ] -0 1 1 +( -3328 -1392 -2000 ) ( -3328 -1392 -2016 ) ( -3328 880 -2000 ) trigger [ 0 -1 0 -0 ] [ 0 0 -1 -32 ] -0 1 1 +( -1008 3200 -2000 ) ( -1008 3200 -2016 ) ( 1264 3200 -2000 ) trigger [ -1 0 0 -0 ] [ 0 0 -1 -32 ] -0 1 1 +( 1264 -2048 -2000 ) ( 1264 -2048 -2016 ) ( -1008 -2048 -2000 ) trigger [ 1 0 0 -0 ] [ 0 0 -1 -96 ] -0 1 1 +( -1008 -1392 -2000 ) ( -1008 880 -2000 ) ( 1264 -1392 -2000 ) trigger [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +( -1008 880 -2016 ) ( -1008 -1392 -2016 ) ( 1264 880 -2016 ) trigger [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +} +} +// entity 2 +{ +"classname" "trigger_teleport" +"target" "teletarget1" +// brush 0 +{ +( 2048 880 -1968 ) ( 2048 880 -1984 ) ( 2048 -1392 -1968 ) trigger [ 0 1 0 -128 ] [ 0 0 -1 -64 ] -0 1 1 +( -3328 -1392 -1968 ) ( -3328 -1392 -1984 ) ( -3328 880 -1968 ) trigger [ 0 -1 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( -1008 3200 -1968 ) ( -1008 3200 -1984 ) ( 1264 3200 -1968 ) trigger [ -1 0 0 -0 ] [ 0 0 -1 -0 ] -0 1 1 +( 1264 -2048 -1968 ) ( 1264 -2048 -1984 ) ( -1008 -2048 -1968 ) trigger [ 1 0 0 -0 ] [ 0 0 -1 -64 ] -0 1 1 +( -1008 -1392 -1952 ) ( -1008 880 -1952 ) ( 1264 -1392 -1952 ) trigger [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +( -1008 880 -1984 ) ( -1008 -1392 -1984 ) ( 1264 880 -1984 ) trigger [ 1 0 0 -0 ] [ 0 -1 0 -0 ] -0 1 1 +} +} +// entity 3 +{ +"classname" "info_player_start" +"origin" "-16 -1264 296" +"angle" "-0" +} +// entity 4 +{ +"classname" "info_teleport_destination" +"origin" "-32 -1264 296" +"angle" "-0" +"targetname" "teletarget1" +} diff --git a/testmaps/shadowself_shadow.map b/testmaps/deprecated/shadowself_shadow.map similarity index 100% rename from testmaps/shadowself_shadow.map rename to testmaps/deprecated/shadowself_shadow.map diff --git a/testmaps/shearedcube.map b/testmaps/deprecated/shearedcube.map similarity index 100% rename from testmaps/shearedcube.map rename to testmaps/deprecated/shearedcube.map diff --git a/testmaps/stairsteptest.map b/testmaps/deprecated/stairsteptest.map similarity index 100% rename from testmaps/stairsteptest.map rename to testmaps/deprecated/stairsteptest.map diff --git a/testmaps/suntest.map b/testmaps/deprecated/suntest.map similarity index 100% rename from testmaps/suntest.map rename to testmaps/deprecated/suntest.map diff --git a/testmaps/swtest.map b/testmaps/deprecated/swtest.map similarity index 100% rename from testmaps/swtest.map rename to testmaps/deprecated/swtest.map diff --git a/testmaps/test.sh b/testmaps/deprecated/test.sh old mode 100755 new mode 100644 similarity index 100% rename from testmaps/test.sh rename to testmaps/deprecated/test.sh diff --git a/testmaps/test_face_splits.map b/testmaps/deprecated/test_face_splits.map similarity index 100% rename from testmaps/test_face_splits.map rename to testmaps/deprecated/test_face_splits.map diff --git a/testmaps/test_tjunc01.map b/testmaps/deprecated/test_tjunc01.map similarity index 97% rename from testmaps/test_tjunc01.map rename to testmaps/deprecated/test_tjunc01.map index 42f995b0..d3019b15 100644 --- a/testmaps/test_tjunc01.map +++ b/testmaps/deprecated/test_tjunc01.map @@ -1,337 +1,337 @@ -// Game: Quake -// Format: Standard -// entity 0 -{ -"classname" "worldspawn" -"wad" "quake.wad" -"message" "Missing Faces TJunc BspStd" -// brush 0 -{ -( -128 -128 -32 ) ( -128 -127 -32 ) ( -128 -128 -31 ) afloor1_3 -0 -16 -0 1 1 -( -0 -0 -0 ) ( -0 -0 1 ) ( -0 1 -0 ) afloor1_3 -0 -16 -0 1 1 -( -128 -128 -32 ) ( -128 -128 -31 ) ( -127 -128 -32 ) afloor1_3 -0 -16 -0 1 1 -( -0 -0 -0 ) ( 1 -0 -0 ) ( -0 -0 1 ) afloor1_3 -0 -16 -0 1 1 -( -0 -0 -0 ) ( -0 1 -0 ) ( 1 -0 -0 ) afloor1_3 -0 -0 -0 1 1 -( -128 -128 -32 ) ( -127 -128 -32 ) ( -128 -127 -32 ) afloor1_3 -0 -0 -0 1 1 -} -// brush 1 -{ -( -16 -128 -0 ) ( -16 -127 -0 ) ( -16 -128 1 ) city1_4 -0 48 -0 1 1 -( -0 80 16 ) ( -0 80 17 ) ( -0 81 16 ) city1_4 -0 48 -0 1 1 -( -16 -128 -0 ) ( -16 -128 1 ) ( -15 -128 -0 ) city1_4 16 48 -0 1 1 -( -0 -0 16 ) ( 1 -0 16 ) ( -0 -0 17 ) city1_4 16 48 -0 1 1 -( -0 80 16 ) ( -0 81 16 ) ( 1 80 16 ) city1_4 16 -0 -0 1 1 -( -16 -128 -0 ) ( -15 -128 -0 ) ( -16 -127 -0 ) city1_4 16 -0 -0 1 1 -} -// brush 2 -{ -( -128 -128 -0 ) ( -128 -127 -0 ) ( -128 -128 1 ) city1_4 -0 48 -0 1 1 -( -16 80 16 ) ( -16 80 17 ) ( -16 81 16 ) city1_4 -0 48 -0 1 1 -( -32 -16 -0 ) ( -32 -16 1 ) ( -31 -16 -0 ) city1_4 32 48 -0 1 1 -( -16 -0 16 ) ( -15 -0 16 ) ( -16 -0 17 ) city1_4 32 48 -0 1 1 -( -16 80 16 ) ( -16 81 16 ) ( -15 80 16 ) city1_4 32 -0 -0 1 1 -( -32 -128 -0 ) ( -31 -128 -0 ) ( -32 -127 -0 ) city1_4 32 -0 -0 1 1 -} -// brush 3 -{ -( -16 -16 8 ) ( -48 -128 16 ) ( -48 -16 16 ) maya2_2 -0 -0 0 1 1 -( -48 -16 16 ) ( -48 -128 16 ) ( -48 -128 -0 ) maya2_2 0 0 0 1 1 -( -16 -16 8 ) ( -48 -16 16 ) ( -48 -16 -0 ) maya2_2 0 0 0 1 1 -( -48 -128 -0 ) ( -16 -128 -0 ) ( -48 -16 -0 ) maya2_2 -0 -0 0 1 1 -( -48 -16 -0 ) ( -16 -128 -0 ) ( -16 -16 8 ) maya2_2 -0 -0 0 1 1 -( -16 -16 8 ) ( -16 -128 -0 ) ( -48 -128 16 ) maya2_2 -0 -0 0 1 1 -( -48 -128 16 ) ( -16 -128 -0 ) ( -48 -128 -0 ) maya2_2 0 0 0 1 1 -} -// brush 4 -{ -( 312 272 -48 ) ( 312 -416 -48 ) ( 312 272 264 ) sky4 -16 16 -0 1 1 -( 304 -416 -48 ) ( 304 -416 264 ) ( 312 -416 -48 ) sky4 40 16 -0 1 1 -( 304 272 264 ) ( 304 272 -48 ) ( 312 272 264 ) sky4 40 16 -0 1 1 -( 304 -416 264 ) ( 304 272 264 ) ( 312 -416 264 ) sky4 40 16 -0 1 1 -( 304 272 -48 ) ( 304 -416 -48 ) ( 312 272 -48 ) sky4 40 16 -0 1 1 -( 304 272 264 ) ( 304 -416 264 ) ( 304 272 -48 ) sky4 -16 16 -0 1 1 -} -// brush 5 -{ -( -424 -416 -48 ) ( -424 272 -48 ) ( -424 -416 264 ) sky4 -16 16 -0 1 1 -( -416 -416 264 ) ( -416 -416 -48 ) ( -424 -416 264 ) sky4 40 16 -0 1 1 -( -416 272 -48 ) ( -416 272 264 ) ( -424 272 -48 ) sky4 40 16 -0 1 1 -( -416 272 264 ) ( -416 -416 264 ) ( -424 272 264 ) sky4 40 16 -0 1 1 -( -416 -416 -48 ) ( -416 272 -48 ) ( -424 -416 -48 ) sky4 40 16 -0 1 1 -( -416 -416 -48 ) ( -416 -416 264 ) ( -416 272 -48 ) sky4 -16 16 -0 1 1 -} -// brush 6 -{ -( -416 272 264 ) ( -416 272 -48 ) ( 304 272 264 ) sky4 40 16 -0 1 1 -( 304 264 264 ) ( -416 264 264 ) ( 304 272 264 ) sky4 40 16 -0 1 1 -( -416 264 -48 ) ( 304 264 -48 ) ( -416 272 -48 ) sky4 40 16 -0 1 1 -( 304 264 -48 ) ( 304 264 264 ) ( 304 272 -48 ) sky4 0 0 0 1 1 -( -416 264 264 ) ( -416 264 -48 ) ( -416 272 264 ) sky4 0 0 0 1 1 -( 304 264 264 ) ( 304 264 -48 ) ( -416 264 264 ) sky4 40 16 -0 1 1 -} -// brush 7 -{ -( -416 -416 -48 ) ( -416 -416 264 ) ( 304 -416 -48 ) sky4 40 16 -0 1 1 -( -416 -408 264 ) ( 304 -408 264 ) ( -416 -416 264 ) sky4 40 16 -0 1 1 -( 304 -408 -48 ) ( -416 -408 -48 ) ( 304 -416 -48 ) sky4 40 16 -0 1 1 -( 304 -408 264 ) ( 304 -408 -48 ) ( 304 -416 264 ) sky4 0 0 0 1 1 -( -416 -408 -48 ) ( -416 -408 264 ) ( -416 -416 -48 ) sky4 0 0 0 1 1 -( -416 -408 -48 ) ( 304 -408 -48 ) ( -416 -408 264 ) sky4 40 16 -0 1 1 -} -// brush 8 -{ -( 304 -408 264 ) ( -416 -408 264 ) ( 304 264 264 ) sky4 40 16 -0 1 1 -( 304 264 256 ) ( 304 -408 256 ) ( 304 264 264 ) sky4 0 0 0 1 1 -( -416 -408 256 ) ( -416 264 256 ) ( -416 -408 264 ) sky4 0 0 0 1 1 -( -416 264 256 ) ( 304 264 256 ) ( -416 264 264 ) sky4 0 0 0 1 1 -( 304 -408 256 ) ( -416 -408 256 ) ( 304 -408 264 ) sky4 0 0 0 1 1 -( 304 264 256 ) ( -416 264 256 ) ( 304 -408 256 ) sky4 40 16 -0 1 1 -} -// brush 9 -{ -( -416 -408 -48 ) ( 304 -408 -48 ) ( -416 264 -48 ) sky4 40 16 -0 1 1 -( 304 -408 -40 ) ( 304 264 -40 ) ( 304 -408 -48 ) sky4 0 0 0 1 1 -( -416 264 -40 ) ( -416 -408 -40 ) ( -416 264 -48 ) sky4 0 0 0 1 1 -( 304 264 -40 ) ( -416 264 -40 ) ( 304 264 -48 ) sky4 0 0 0 1 1 -( -416 -408 -40 ) ( 304 -408 -40 ) ( -416 -408 -48 ) sky4 0 0 0 1 1 -( -416 -408 -40 ) ( -416 264 -40 ) ( 304 -408 -40 ) sky4 40 16 -0 1 1 -} -// brush 10 -{ -( -48 -168 16 ) ( -48 -168 -0 ) ( -16 -168 8 ) maya2_2 -0 -0 -0 1 1 -( -16 -168 8 ) ( -48 -168 -0 ) ( -16 -200 -0 ) maya2_2 -0 -24 -0 1 1 -( -16 -168 8 ) ( -48 -200 16 ) ( -48 -168 16 ) maya2_2 -0 -24 -0 1 1 -( -16 -168 8 ) ( -16 -200 -0 ) ( -48 -200 16 ) maya2_2 -0 -24 -0 1 1 -( -48 -200 16 ) ( -48 -200 -0 ) ( -48 -168 -0 ) maya2_2 24 -0 -0 1 1 -( -48 -168 -0 ) ( -48 -200 -0 ) ( -16 -200 -0 ) maya2_2 -0 -24 -0 1 1 -( -16 -200 -0 ) ( -48 -200 -0 ) ( -48 -200 16 ) maya2_2 -0 -0 -0 1 1 -} -// brush 11 -{ -( -0 -152 16 ) ( -0 -152 -0 ) ( -0 -200 -0 ) city1_4 24 48 -0 1 1 -( -0 -152 16 ) ( -16 -152 16 ) ( -16 -152 -0 ) city1_4 16 48 -0 1 1 -( -16 -200 16 ) ( -16 -152 16 ) ( -0 -152 16 ) city1_4 16 -24 -0 1 1 -( -16 -152 -0 ) ( -16 -200 -0 ) ( -0 -200 -0 ) city1_4 16 -24 -0 1 1 -( -0 -200 -0 ) ( -16 -200 -0 ) ( -16 -200 16 ) city1_4 16 48 -0 1 1 -( -16 -200 16 ) ( -16 -200 -0 ) ( -16 -152 -0 ) city1_4 24 48 -0 1 1 -} -// brush 12 -{ -( -128 -280 -0 ) ( -128 -279 -0 ) ( -128 -280 1 ) city1_4 24 48 -0 1 1 -( -16 -72 16 ) ( -16 -72 17 ) ( -16 -71 16 ) city1_4 24 48 -0 1 1 -( -32 -168 -0 ) ( -32 -168 1 ) ( -31 -168 -0 ) city1_4 32 48 -0 1 1 -( -16 -152 16 ) ( -15 -152 16 ) ( -16 -152 17 ) city1_4 32 48 -0 1 1 -( -16 -72 16 ) ( -16 -71 16 ) ( -15 -72 16 ) city1_4 32 -24 -0 1 1 -( -32 -280 -0 ) ( -31 -280 -0 ) ( -32 -279 -0 ) city1_4 32 -24 -0 1 1 -} -// brush 13 -{ -( -0 -152 -0 ) ( -0 -152 -32 ) ( -0 -200 -32 ) afloor1_3 24 -16 -0 1 1 -( -0 -152 -0 ) ( -128 -152 -0 ) ( -128 -152 -32 ) afloor1_3 -0 -16 -0 1 1 -( -128 -200 -0 ) ( -128 -152 -0 ) ( -0 -152 -0 ) afloor1_3 -0 -24 -0 1 1 -( -128 -152 -32 ) ( -128 -200 -32 ) ( -0 -200 -32 ) afloor1_3 -0 -24 -0 1 1 -( -0 -200 -32 ) ( -128 -200 -32 ) ( -128 -200 -0 ) afloor1_3 -0 -16 -0 1 1 -( -128 -200 -0 ) ( -128 -200 -32 ) ( -128 -152 -32 ) afloor1_3 24 -16 -0 1 1 -} -// brush 14 -{ -( -0 -216 16 ) ( -0 -216 -0 ) ( -0 -264 -0 ) city1_4 24 48 -0 1 1 -( -0 -216 16 ) ( -16 -216 16 ) ( -16 -216 -0 ) city1_4 16 48 -0 1 1 -( -16 -264 16 ) ( -16 -216 16 ) ( -0 -216 16 ) city1_4 16 -24 -0 1 1 -( -16 -216 -0 ) ( -16 -264 -0 ) ( -0 -264 -0 ) city1_4 16 -24 -0 1 1 -( -0 -304 -0 ) ( -16 -304 -0 ) ( -16 -304 16 ) city1_4 16 48 -0 1 1 -( -16 -264 16 ) ( -16 -264 -0 ) ( -16 -216 -0 ) city1_4 24 48 -0 1 1 -} -// brush 15 -{ -( -128 -344 -0 ) ( -128 -343 -0 ) ( -128 -344 1 ) city1_4 24 48 -0 1 1 -( -16 -136 16 ) ( -16 -136 17 ) ( -16 -135 16 ) city1_4 24 48 -0 1 1 -( -32 -232 -0 ) ( -32 -232 1 ) ( -31 -232 -0 ) city1_4 32 48 -0 1 1 -( -16 -216 16 ) ( -15 -216 16 ) ( -16 -216 17 ) city1_4 32 48 -0 1 1 -( -16 -136 16 ) ( -16 -135 16 ) ( -15 -136 16 ) city1_4 32 -24 -0 1 1 -( -32 -344 -0 ) ( -31 -344 -0 ) ( -32 -343 -0 ) city1_4 32 -24 -0 1 1 -} -// brush 16 -{ -( -48 -232 16 ) ( -48 -232 -0 ) ( -16 -232 8 ) maya2_2 -0 -0 -0 1 1 -( -16 -232 8 ) ( -48 -232 -0 ) ( -16 -264 -0 ) maya2_2 -0 -88 -0 1 1 -( -16 -232 8 ) ( -48 -264 16 ) ( -48 -232 16 ) maya2_2 -0 -88 -0 1 1 -( -16 -232 8 ) ( -16 -264 -0 ) ( -48 -264 16 ) maya2_2 -0 -88 -0 1 1 -( -48 -264 16 ) ( -48 -264 -0 ) ( -48 -232 -0 ) maya2_2 88 -0 -0 1 1 -( -48 -232 -0 ) ( -48 -264 -0 ) ( -16 -264 -0 ) maya2_2 -0 -88 -0 1 1 -( -16 -264 -0 ) ( -48 -264 -0 ) ( -48 -264 16 ) maya2_2 -0 -0 -0 1 1 -} -// brush 17 -{ -( -0 -216 -0 ) ( -0 -216 -32 ) ( -0 -264 -32 ) afloor1_3 24 -16 -0 1 1 -( -0 -216 -0 ) ( -128 -216 -0 ) ( -128 -216 -32 ) afloor1_3 -0 -16 -0 1 1 -( -128 -264 -0 ) ( -128 -216 -0 ) ( -0 -216 -0 ) afloor1_3 -0 -24 -0 1 1 -( -128 -216 -32 ) ( -128 -264 -32 ) ( -0 -264 -32 ) afloor1_3 -0 -24 -0 1 1 -( -0 -304 -32 ) ( -128 -304 -32 ) ( -128 -304 -0 ) afloor1_3 -0 -16 -0 1 1 -( -128 -264 -0 ) ( -128 -264 -32 ) ( -128 -216 -32 ) afloor1_3 24 -16 -0 1 1 -} -// brush 18 -{ -( -0 120 -0 ) ( -0 120 -32 ) ( -0 72 -32 ) afloor1_3 -56 -16 -0 1 1 -( -0 120 -0 ) ( -128 120 -0 ) ( -128 120 -32 ) afloor1_3 -0 -16 -0 1 1 -( -128 72 -0 ) ( -128 120 -0 ) ( -0 120 -0 ) afloor1_3 -0 56 -0 1 1 -( -128 120 -32 ) ( -128 72 -32 ) ( -0 72 -32 ) afloor1_3 -0 56 -0 1 1 -( -0 72 -32 ) ( -128 72 -32 ) ( -128 72 -0 ) afloor1_3 -0 -16 -0 1 1 -( -48 72 -0 ) ( -48 72 -32 ) ( -48 120 -32 ) afloor1_3 -56 -16 -0 1 1 -} -// brush 19 -{ -( -48 -8 -0 ) ( -48 -7 -0 ) ( -48 -8 1 ) city1_4 -56 48 -0 1 1 -( -16 200 16 ) ( -16 200 17 ) ( -16 201 16 ) city1_4 -56 48 -0 1 1 -( -32 104 -0 ) ( -32 104 1 ) ( -31 104 -0 ) city1_4 32 48 -0 1 1 -( -16 120 16 ) ( -15 120 16 ) ( -16 120 17 ) city1_4 32 48 -0 1 1 -( -16 200 16 ) ( -16 201 16 ) ( -15 200 16 ) city1_4 32 56 -0 1 1 -( -32 -8 -0 ) ( -31 -8 -0 ) ( -32 -7 -0 ) city1_4 32 56 -0 1 1 -} -// brush 20 -{ -( -48 104 16 ) ( -48 104 -0 ) ( -16 104 8 ) maya2_2 -0 -0 -0 1 1 -( -16 104 8 ) ( -48 104 -0 ) ( -16 72 -0 ) maya2_2 -0 120 -0 1 1 -( -16 104 8 ) ( -48 72 16 ) ( -48 104 16 ) maya2_2 -0 120 -0 1 1 -( -16 104 8 ) ( -16 72 -0 ) ( -48 72 16 ) maya2_2 -0 120 -0 1 1 -( -48 72 16 ) ( -48 72 -0 ) ( -48 104 -0 ) maya2_2 -120 -0 -0 1 1 -( -48 104 -0 ) ( -48 72 -0 ) ( -16 72 -0 ) maya2_2 -0 120 -0 1 1 -( -16 72 -0 ) ( -48 72 -0 ) ( -48 72 16 ) maya2_2 -0 -0 -0 1 1 -} -// brush 21 -{ -( -0 120 16 ) ( -0 120 -0 ) ( -0 72 -0 ) city1_4 -56 48 -0 1 1 -( -0 120 16 ) ( -16 120 16 ) ( -16 120 -0 ) city1_4 16 48 -0 1 1 -( -16 72 16 ) ( -16 120 16 ) ( -0 120 16 ) city1_4 16 56 -0 1 1 -( -16 120 -0 ) ( -16 72 -0 ) ( -0 72 -0 ) city1_4 16 56 -0 1 1 -( -0 72 -0 ) ( -16 72 -0 ) ( -16 72 16 ) city1_4 16 48 -0 1 1 -( -16 72 16 ) ( -16 72 -0 ) ( -16 120 -0 ) city1_4 -56 48 -0 1 1 -} -// brush 22 -{ -( -120 -8 -0 ) ( -120 -7 -0 ) ( -120 -8 1 ) city1_4 8 48 -0 1 1 -( -88 200 16 ) ( -88 200 17 ) ( -88 201 16 ) city1_4 8 48 -0 1 1 -( -104 104 -0 ) ( -104 104 1 ) ( -103 104 -0 ) city1_4 40 48 -0 1 1 -( -88 120 16 ) ( -87 120 16 ) ( -88 120 17 ) city1_4 40 48 -0 1 1 -( -88 200 16 ) ( -88 201 16 ) ( -87 200 16 ) city1_4 40 -8 -0 1 1 -( -104 -8 -0 ) ( -103 -8 -0 ) ( -104 -7 -0 ) city1_4 40 -8 -0 1 1 -} -// brush 23 -{ -( -72 120 16 ) ( -72 120 -0 ) ( -72 72 -0 ) city1_4 8 48 -0 1 1 -( -72 120 16 ) ( -88 120 16 ) ( -88 120 -0 ) city1_4 24 48 -0 1 1 -( -88 72 16 ) ( -88 120 16 ) ( -72 120 16 ) city1_4 24 -8 -0 1 1 -( -88 120 -0 ) ( -88 72 -0 ) ( -72 72 -0 ) city1_4 24 -8 -0 1 1 -( -72 72 -0 ) ( -88 72 -0 ) ( -88 72 16 ) city1_4 24 48 -0 1 1 -( -88 72 16 ) ( -88 72 -0 ) ( -88 120 -0 ) city1_4 8 48 -0 1 1 -} -// brush 24 -{ -( -72 120 -0 ) ( -72 120 -32 ) ( -72 72 -32 ) afloor1_3 8 -16 -0 1 1 -( -72 120 -0 ) ( -200 120 -0 ) ( -200 120 -32 ) afloor1_3 8 -16 -0 1 1 -( -200 72 -0 ) ( -200 120 -0 ) ( -72 120 -0 ) afloor1_3 8 -8 -0 1 1 -( -200 120 -32 ) ( -200 72 -32 ) ( -72 72 -32 ) afloor1_3 8 -8 -0 1 1 -( -72 72 -32 ) ( -200 72 -32 ) ( -200 72 -0 ) afloor1_3 8 -16 -0 1 1 -( -120 72 -0 ) ( -120 72 -32 ) ( -120 120 -32 ) afloor1_3 8 -16 -0 1 1 -} -// brush 25 -{ -( -88 104 8 ) ( -120 104 -0 ) ( -88 72 -0 ) maya2_2 72 -8 -0 1 1 -( -88 104 8 ) ( -88 72 -0 ) ( -120 72 16 ) maya2_2 72 -8 -0 1 1 -( -120 104 -0 ) ( -120 72 -0 ) ( -88 72 -0 ) maya2_2 72 -8 -0 1 1 -( -88 72 -0 ) ( -120 72 -0 ) ( -120 72 16 ) maya2_2 72 -0 -0 1 1 -( -120 72 16 ) ( -88 104 16 ) ( -88 104 144 ) maya2_2 72 0 0 1 1 -} -// brush 26 -{ -( -120 104 16 ) ( -120 104 -0 ) ( -88 104 8 ) maya2_2 72 -0 -0 1 1 -( -88 104 8 ) ( -120 104 -0 ) ( -88 72 -0 ) maya2_2 72 -8 -0 1 1 -( -88 104 8 ) ( -120 72 16 ) ( -120 104 16 ) maya2_2 72 -8 -0 1 1 -( -120 72 16 ) ( -120 72 -0 ) ( -120 104 -0 ) maya2_2 8 -0 -0 1 1 -( -120 104 -0 ) ( -120 72 -0 ) ( -88 72 -0 ) maya2_2 72 -8 -0 1 1 -( -120 72 16 ) ( -88 104 144 ) ( -88 104 16 ) maya2_2 72 0 0 1 1 -} -// brush 27 -{ -( -72 192 -0 ) ( -72 192 -32 ) ( -72 144 -32 ) afloor1_3 -0 -16 -0 1 1 -( -72 192 -0 ) ( -200 192 -0 ) ( -200 192 -32 ) afloor1_3 8 -16 -0 1 1 -( -200 144 -0 ) ( -200 192 -0 ) ( -72 192 -0 ) afloor1_3 8 -0 -0 1 1 -( -200 192 -32 ) ( -200 144 -32 ) ( -72 144 -32 ) afloor1_3 8 -0 -0 1 1 -( -72 144 -32 ) ( -200 144 -32 ) ( -200 144 -0 ) afloor1_3 8 -16 -0 1 1 -( -120 144 -0 ) ( -120 144 -32 ) ( -120 192 -32 ) afloor1_3 -0 -16 -0 1 1 -} -// brush 28 -{ -( -120 176 16 ) ( -120 176 -0 ) ( -88 176 8 ) maya2_2 72 -0 -0 1 1 -( -88 176 8 ) ( -120 176 -0 ) ( -88 144 -0 ) maya2_2 72 64 -0 1 1 -( -88 176 8 ) ( -120 144 16 ) ( -120 176 16 ) maya2_2 72 64 -0 1 1 -( -120 144 16 ) ( -120 144 -0 ) ( -120 176 -0 ) maya2_2 -64 -0 -0 1 1 -( -120 176 -0 ) ( -120 144 -0 ) ( -88 144 -0 ) maya2_2 72 64 -0 1 1 -( -120 144 16 ) ( -88 176 144 ) ( -88 176 16 ) maya2_2 -0 -0 -0 1 1 -} -// brush 29 -{ -( -88 176 8 ) ( -120 176 -0 ) ( -88 144 -0 ) maya2_2 72 64 -0 1 1 -( -88 176 8 ) ( -88 144 -0 ) ( -120 144 16 ) maya2_2 72 64 -0 1 1 -( -120 176 -0 ) ( -120 144 -0 ) ( -88 144 -0 ) maya2_2 72 64 -0 1 1 -( -88 144 -0 ) ( -120 144 -0 ) ( -120 144 16 ) maya2_2 72 -0 -0 1 1 -( -120 144 16 ) ( -88 176 16 ) ( -88 176 144 ) maya2_2 -0 -0 -0 1 1 -} -// brush 30 -{ -( -72 192 16 ) ( -72 192 -0 ) ( -72 144 -0 ) city1_4 -0 48 -0 1 1 -( -72 192 16 ) ( -88 192 16 ) ( -88 192 -0 ) city1_4 24 48 -0 1 1 -( -88 144 16 ) ( -88 192 16 ) ( -72 192 16 ) city1_4 24 -0 -0 1 1 -( -88 192 -0 ) ( -88 144 -0 ) ( -72 144 -0 ) city1_4 24 -0 -0 1 1 -( -72 144 -0 ) ( -88 144 -0 ) ( -88 144 16 ) city1_4 24 48 -0 1 1 -( -88 144 16 ) ( -88 144 -0 ) ( -88 192 -0 ) city1_4 -0 48 -0 1 1 -} -// brush 31 -{ -( -88 240 -0 ) ( -88 208 -0 ) ( -88 240 8 ) maya2_2 -32 -0 -0 1 1 -( -88 240 -0 ) ( -120 208 -0 ) ( -88 208 -0 ) maya2_2 -0 32 -0 1 1 -( -88 240 8 ) ( -120 208 16 ) ( -120 208 -0 ) maya2_2 -32 -0 -0 1 1 -( -120 208 -0 ) ( -120 208 16 ) ( -88 208 -0 ) maya2_2 -0 -0 -0 1 1 -( -88 208 -0 ) ( -120 208 16 ) ( -88 240 8 ) maya2_2 -0 32 -0 1 1 -} -// brush 32 -{ -( -120 240 -0 ) ( -120 208 -0 ) ( -88 240 -0 ) maya2_2 -0 32 -0 1 1 -( -120 240 16 ) ( -120 208 16 ) ( -120 208 -0 ) maya2_2 -32 -0 -0 1 1 -( -120 240 16 ) ( -88 240 8 ) ( -120 208 16 ) maya2_2 -0 32 -0 1 1 -( -120 208 16 ) ( -88 240 8 ) ( -88 240 -0 ) maya2_2 -32 -0 -0 1 1 -( -88 240 -0 ) ( -88 240 8 ) ( -120 240 16 ) maya2_2 -0 -0 -0 1 1 -} -// brush 33 -{ -( -120 128 -0 ) ( -120 129 -0 ) ( -120 128 1 ) city1_4 -0 48 -0 1 1 -( -88 336 16 ) ( -88 336 17 ) ( -88 337 16 ) city1_4 -0 48 -0 1 1 -( -104 240 -0 ) ( -104 240 1 ) ( -103 240 -0 ) city1_4 40 48 -0 1 1 -( -88 256 16 ) ( -87 256 16 ) ( -88 256 17 ) city1_4 40 48 -0 1 1 -( -88 336 16 ) ( -88 337 16 ) ( -87 336 16 ) city1_4 40 -0 -0 1 1 -( -104 128 -0 ) ( -103 128 -0 ) ( -104 129 -0 ) city1_4 40 -0 -0 1 1 -} -// brush 34 -{ -( -72 256 16 ) ( -72 256 -0 ) ( -72 208 -0 ) city1_4 -0 48 -0 1 1 -( -72 256 16 ) ( -88 256 16 ) ( -88 256 -0 ) city1_4 24 48 -0 1 1 -( -88 208 16 ) ( -88 256 16 ) ( -72 256 16 ) city1_4 24 -0 -0 1 1 -( -88 256 -0 ) ( -88 208 -0 ) ( -72 208 -0 ) city1_4 24 -0 -0 1 1 -( -72 208 -0 ) ( -88 208 -0 ) ( -88 208 16 ) city1_4 24 48 -0 1 1 -( -88 208 16 ) ( -88 208 -0 ) ( -88 256 -0 ) city1_4 -0 48 -0 1 1 -} -// brush 35 -{ -( -72 256 -0 ) ( -72 256 -32 ) ( -72 208 -32 ) afloor1_3 -0 -16 -0 1 1 -( -72 256 -0 ) ( -200 256 -0 ) ( -200 256 -32 ) afloor1_3 8 -16 -0 1 1 -( -200 208 -0 ) ( -200 256 -0 ) ( -72 256 -0 ) afloor1_3 8 -0 -0 1 1 -( -200 256 -32 ) ( -200 208 -32 ) ( -72 208 -32 ) afloor1_3 8 -0 -0 1 1 -( -72 208 -32 ) ( -200 208 -32 ) ( -200 208 -0 ) afloor1_3 8 -16 -0 1 1 -( -120 208 -0 ) ( -120 208 -32 ) ( -120 256 -32 ) afloor1_3 -0 -16 -0 1 1 -} -} -// entity 1 -{ -"classname" "info_player_start" -"origin" "-96 -64 24" -} +// Game: Quake +// Format: Standard +// entity 0 +{ +"classname" "worldspawn" +"wad" "quake.wad" +"message" "Missing Faces TJunc BspStd" +// brush 0 +{ +( -128 -128 -32 ) ( -128 -127 -32 ) ( -128 -128 -31 ) afloor1_3 -0 -16 -0 1 1 +( -0 -0 -0 ) ( -0 -0 1 ) ( -0 1 -0 ) afloor1_3 -0 -16 -0 1 1 +( -128 -128 -32 ) ( -128 -128 -31 ) ( -127 -128 -32 ) afloor1_3 -0 -16 -0 1 1 +( -0 -0 -0 ) ( 1 -0 -0 ) ( -0 -0 1 ) afloor1_3 -0 -16 -0 1 1 +( -0 -0 -0 ) ( -0 1 -0 ) ( 1 -0 -0 ) afloor1_3 -0 -0 -0 1 1 +( -128 -128 -32 ) ( -127 -128 -32 ) ( -128 -127 -32 ) afloor1_3 -0 -0 -0 1 1 +} +// brush 1 +{ +( -16 -128 -0 ) ( -16 -127 -0 ) ( -16 -128 1 ) city1_4 -0 48 -0 1 1 +( -0 80 16 ) ( -0 80 17 ) ( -0 81 16 ) city1_4 -0 48 -0 1 1 +( -16 -128 -0 ) ( -16 -128 1 ) ( -15 -128 -0 ) city1_4 16 48 -0 1 1 +( -0 -0 16 ) ( 1 -0 16 ) ( -0 -0 17 ) city1_4 16 48 -0 1 1 +( -0 80 16 ) ( -0 81 16 ) ( 1 80 16 ) city1_4 16 -0 -0 1 1 +( -16 -128 -0 ) ( -15 -128 -0 ) ( -16 -127 -0 ) city1_4 16 -0 -0 1 1 +} +// brush 2 +{ +( -128 -128 -0 ) ( -128 -127 -0 ) ( -128 -128 1 ) city1_4 -0 48 -0 1 1 +( -16 80 16 ) ( -16 80 17 ) ( -16 81 16 ) city1_4 -0 48 -0 1 1 +( -32 -16 -0 ) ( -32 -16 1 ) ( -31 -16 -0 ) city1_4 32 48 -0 1 1 +( -16 -0 16 ) ( -15 -0 16 ) ( -16 -0 17 ) city1_4 32 48 -0 1 1 +( -16 80 16 ) ( -16 81 16 ) ( -15 80 16 ) city1_4 32 -0 -0 1 1 +( -32 -128 -0 ) ( -31 -128 -0 ) ( -32 -127 -0 ) city1_4 32 -0 -0 1 1 +} +// brush 3 +{ +( -16 -16 8 ) ( -48 -128 16 ) ( -48 -16 16 ) maya2_2 -0 -0 0 1 1 +( -48 -16 16 ) ( -48 -128 16 ) ( -48 -128 -0 ) maya2_2 0 0 0 1 1 +( -16 -16 8 ) ( -48 -16 16 ) ( -48 -16 -0 ) maya2_2 0 0 0 1 1 +( -48 -128 -0 ) ( -16 -128 -0 ) ( -48 -16 -0 ) maya2_2 -0 -0 0 1 1 +( -48 -16 -0 ) ( -16 -128 -0 ) ( -16 -16 8 ) maya2_2 -0 -0 0 1 1 +( -16 -16 8 ) ( -16 -128 -0 ) ( -48 -128 16 ) maya2_2 -0 -0 0 1 1 +( -48 -128 16 ) ( -16 -128 -0 ) ( -48 -128 -0 ) maya2_2 0 0 0 1 1 +} +// brush 4 +{ +( 312 272 -48 ) ( 312 -416 -48 ) ( 312 272 264 ) sky4 -16 16 -0 1 1 +( 304 -416 -48 ) ( 304 -416 264 ) ( 312 -416 -48 ) sky4 40 16 -0 1 1 +( 304 272 264 ) ( 304 272 -48 ) ( 312 272 264 ) sky4 40 16 -0 1 1 +( 304 -416 264 ) ( 304 272 264 ) ( 312 -416 264 ) sky4 40 16 -0 1 1 +( 304 272 -48 ) ( 304 -416 -48 ) ( 312 272 -48 ) sky4 40 16 -0 1 1 +( 304 272 264 ) ( 304 -416 264 ) ( 304 272 -48 ) sky4 -16 16 -0 1 1 +} +// brush 5 +{ +( -424 -416 -48 ) ( -424 272 -48 ) ( -424 -416 264 ) sky4 -16 16 -0 1 1 +( -416 -416 264 ) ( -416 -416 -48 ) ( -424 -416 264 ) sky4 40 16 -0 1 1 +( -416 272 -48 ) ( -416 272 264 ) ( -424 272 -48 ) sky4 40 16 -0 1 1 +( -416 272 264 ) ( -416 -416 264 ) ( -424 272 264 ) sky4 40 16 -0 1 1 +( -416 -416 -48 ) ( -416 272 -48 ) ( -424 -416 -48 ) sky4 40 16 -0 1 1 +( -416 -416 -48 ) ( -416 -416 264 ) ( -416 272 -48 ) sky4 -16 16 -0 1 1 +} +// brush 6 +{ +( -416 272 264 ) ( -416 272 -48 ) ( 304 272 264 ) sky4 40 16 -0 1 1 +( 304 264 264 ) ( -416 264 264 ) ( 304 272 264 ) sky4 40 16 -0 1 1 +( -416 264 -48 ) ( 304 264 -48 ) ( -416 272 -48 ) sky4 40 16 -0 1 1 +( 304 264 -48 ) ( 304 264 264 ) ( 304 272 -48 ) sky4 0 0 0 1 1 +( -416 264 264 ) ( -416 264 -48 ) ( -416 272 264 ) sky4 0 0 0 1 1 +( 304 264 264 ) ( 304 264 -48 ) ( -416 264 264 ) sky4 40 16 -0 1 1 +} +// brush 7 +{ +( -416 -416 -48 ) ( -416 -416 264 ) ( 304 -416 -48 ) sky4 40 16 -0 1 1 +( -416 -408 264 ) ( 304 -408 264 ) ( -416 -416 264 ) sky4 40 16 -0 1 1 +( 304 -408 -48 ) ( -416 -408 -48 ) ( 304 -416 -48 ) sky4 40 16 -0 1 1 +( 304 -408 264 ) ( 304 -408 -48 ) ( 304 -416 264 ) sky4 0 0 0 1 1 +( -416 -408 -48 ) ( -416 -408 264 ) ( -416 -416 -48 ) sky4 0 0 0 1 1 +( -416 -408 -48 ) ( 304 -408 -48 ) ( -416 -408 264 ) sky4 40 16 -0 1 1 +} +// brush 8 +{ +( 304 -408 264 ) ( -416 -408 264 ) ( 304 264 264 ) sky4 40 16 -0 1 1 +( 304 264 256 ) ( 304 -408 256 ) ( 304 264 264 ) sky4 0 0 0 1 1 +( -416 -408 256 ) ( -416 264 256 ) ( -416 -408 264 ) sky4 0 0 0 1 1 +( -416 264 256 ) ( 304 264 256 ) ( -416 264 264 ) sky4 0 0 0 1 1 +( 304 -408 256 ) ( -416 -408 256 ) ( 304 -408 264 ) sky4 0 0 0 1 1 +( 304 264 256 ) ( -416 264 256 ) ( 304 -408 256 ) sky4 40 16 -0 1 1 +} +// brush 9 +{ +( -416 -408 -48 ) ( 304 -408 -48 ) ( -416 264 -48 ) sky4 40 16 -0 1 1 +( 304 -408 -40 ) ( 304 264 -40 ) ( 304 -408 -48 ) sky4 0 0 0 1 1 +( -416 264 -40 ) ( -416 -408 -40 ) ( -416 264 -48 ) sky4 0 0 0 1 1 +( 304 264 -40 ) ( -416 264 -40 ) ( 304 264 -48 ) sky4 0 0 0 1 1 +( -416 -408 -40 ) ( 304 -408 -40 ) ( -416 -408 -48 ) sky4 0 0 0 1 1 +( -416 -408 -40 ) ( -416 264 -40 ) ( 304 -408 -40 ) sky4 40 16 -0 1 1 +} +// brush 10 +{ +( -48 -168 16 ) ( -48 -168 -0 ) ( -16 -168 8 ) maya2_2 -0 -0 -0 1 1 +( -16 -168 8 ) ( -48 -168 -0 ) ( -16 -200 -0 ) maya2_2 -0 -24 -0 1 1 +( -16 -168 8 ) ( -48 -200 16 ) ( -48 -168 16 ) maya2_2 -0 -24 -0 1 1 +( -16 -168 8 ) ( -16 -200 -0 ) ( -48 -200 16 ) maya2_2 -0 -24 -0 1 1 +( -48 -200 16 ) ( -48 -200 -0 ) ( -48 -168 -0 ) maya2_2 24 -0 -0 1 1 +( -48 -168 -0 ) ( -48 -200 -0 ) ( -16 -200 -0 ) maya2_2 -0 -24 -0 1 1 +( -16 -200 -0 ) ( -48 -200 -0 ) ( -48 -200 16 ) maya2_2 -0 -0 -0 1 1 +} +// brush 11 +{ +( -0 -152 16 ) ( -0 -152 -0 ) ( -0 -200 -0 ) city1_4 24 48 -0 1 1 +( -0 -152 16 ) ( -16 -152 16 ) ( -16 -152 -0 ) city1_4 16 48 -0 1 1 +( -16 -200 16 ) ( -16 -152 16 ) ( -0 -152 16 ) city1_4 16 -24 -0 1 1 +( -16 -152 -0 ) ( -16 -200 -0 ) ( -0 -200 -0 ) city1_4 16 -24 -0 1 1 +( -0 -200 -0 ) ( -16 -200 -0 ) ( -16 -200 16 ) city1_4 16 48 -0 1 1 +( -16 -200 16 ) ( -16 -200 -0 ) ( -16 -152 -0 ) city1_4 24 48 -0 1 1 +} +// brush 12 +{ +( -128 -280 -0 ) ( -128 -279 -0 ) ( -128 -280 1 ) city1_4 24 48 -0 1 1 +( -16 -72 16 ) ( -16 -72 17 ) ( -16 -71 16 ) city1_4 24 48 -0 1 1 +( -32 -168 -0 ) ( -32 -168 1 ) ( -31 -168 -0 ) city1_4 32 48 -0 1 1 +( -16 -152 16 ) ( -15 -152 16 ) ( -16 -152 17 ) city1_4 32 48 -0 1 1 +( -16 -72 16 ) ( -16 -71 16 ) ( -15 -72 16 ) city1_4 32 -24 -0 1 1 +( -32 -280 -0 ) ( -31 -280 -0 ) ( -32 -279 -0 ) city1_4 32 -24 -0 1 1 +} +// brush 13 +{ +( -0 -152 -0 ) ( -0 -152 -32 ) ( -0 -200 -32 ) afloor1_3 24 -16 -0 1 1 +( -0 -152 -0 ) ( -128 -152 -0 ) ( -128 -152 -32 ) afloor1_3 -0 -16 -0 1 1 +( -128 -200 -0 ) ( -128 -152 -0 ) ( -0 -152 -0 ) afloor1_3 -0 -24 -0 1 1 +( -128 -152 -32 ) ( -128 -200 -32 ) ( -0 -200 -32 ) afloor1_3 -0 -24 -0 1 1 +( -0 -200 -32 ) ( -128 -200 -32 ) ( -128 -200 -0 ) afloor1_3 -0 -16 -0 1 1 +( -128 -200 -0 ) ( -128 -200 -32 ) ( -128 -152 -32 ) afloor1_3 24 -16 -0 1 1 +} +// brush 14 +{ +( -0 -216 16 ) ( -0 -216 -0 ) ( -0 -264 -0 ) city1_4 24 48 -0 1 1 +( -0 -216 16 ) ( -16 -216 16 ) ( -16 -216 -0 ) city1_4 16 48 -0 1 1 +( -16 -264 16 ) ( -16 -216 16 ) ( -0 -216 16 ) city1_4 16 -24 -0 1 1 +( -16 -216 -0 ) ( -16 -264 -0 ) ( -0 -264 -0 ) city1_4 16 -24 -0 1 1 +( -0 -304 -0 ) ( -16 -304 -0 ) ( -16 -304 16 ) city1_4 16 48 -0 1 1 +( -16 -264 16 ) ( -16 -264 -0 ) ( -16 -216 -0 ) city1_4 24 48 -0 1 1 +} +// brush 15 +{ +( -128 -344 -0 ) ( -128 -343 -0 ) ( -128 -344 1 ) city1_4 24 48 -0 1 1 +( -16 -136 16 ) ( -16 -136 17 ) ( -16 -135 16 ) city1_4 24 48 -0 1 1 +( -32 -232 -0 ) ( -32 -232 1 ) ( -31 -232 -0 ) city1_4 32 48 -0 1 1 +( -16 -216 16 ) ( -15 -216 16 ) ( -16 -216 17 ) city1_4 32 48 -0 1 1 +( -16 -136 16 ) ( -16 -135 16 ) ( -15 -136 16 ) city1_4 32 -24 -0 1 1 +( -32 -344 -0 ) ( -31 -344 -0 ) ( -32 -343 -0 ) city1_4 32 -24 -0 1 1 +} +// brush 16 +{ +( -48 -232 16 ) ( -48 -232 -0 ) ( -16 -232 8 ) maya2_2 -0 -0 -0 1 1 +( -16 -232 8 ) ( -48 -232 -0 ) ( -16 -264 -0 ) maya2_2 -0 -88 -0 1 1 +( -16 -232 8 ) ( -48 -264 16 ) ( -48 -232 16 ) maya2_2 -0 -88 -0 1 1 +( -16 -232 8 ) ( -16 -264 -0 ) ( -48 -264 16 ) maya2_2 -0 -88 -0 1 1 +( -48 -264 16 ) ( -48 -264 -0 ) ( -48 -232 -0 ) maya2_2 88 -0 -0 1 1 +( -48 -232 -0 ) ( -48 -264 -0 ) ( -16 -264 -0 ) maya2_2 -0 -88 -0 1 1 +( -16 -264 -0 ) ( -48 -264 -0 ) ( -48 -264 16 ) maya2_2 -0 -0 -0 1 1 +} +// brush 17 +{ +( -0 -216 -0 ) ( -0 -216 -32 ) ( -0 -264 -32 ) afloor1_3 24 -16 -0 1 1 +( -0 -216 -0 ) ( -128 -216 -0 ) ( -128 -216 -32 ) afloor1_3 -0 -16 -0 1 1 +( -128 -264 -0 ) ( -128 -216 -0 ) ( -0 -216 -0 ) afloor1_3 -0 -24 -0 1 1 +( -128 -216 -32 ) ( -128 -264 -32 ) ( -0 -264 -32 ) afloor1_3 -0 -24 -0 1 1 +( -0 -304 -32 ) ( -128 -304 -32 ) ( -128 -304 -0 ) afloor1_3 -0 -16 -0 1 1 +( -128 -264 -0 ) ( -128 -264 -32 ) ( -128 -216 -32 ) afloor1_3 24 -16 -0 1 1 +} +// brush 18 +{ +( -0 120 -0 ) ( -0 120 -32 ) ( -0 72 -32 ) afloor1_3 -56 -16 -0 1 1 +( -0 120 -0 ) ( -128 120 -0 ) ( -128 120 -32 ) afloor1_3 -0 -16 -0 1 1 +( -128 72 -0 ) ( -128 120 -0 ) ( -0 120 -0 ) afloor1_3 -0 56 -0 1 1 +( -128 120 -32 ) ( -128 72 -32 ) ( -0 72 -32 ) afloor1_3 -0 56 -0 1 1 +( -0 72 -32 ) ( -128 72 -32 ) ( -128 72 -0 ) afloor1_3 -0 -16 -0 1 1 +( -48 72 -0 ) ( -48 72 -32 ) ( -48 120 -32 ) afloor1_3 -56 -16 -0 1 1 +} +// brush 19 +{ +( -48 -8 -0 ) ( -48 -7 -0 ) ( -48 -8 1 ) city1_4 -56 48 -0 1 1 +( -16 200 16 ) ( -16 200 17 ) ( -16 201 16 ) city1_4 -56 48 -0 1 1 +( -32 104 -0 ) ( -32 104 1 ) ( -31 104 -0 ) city1_4 32 48 -0 1 1 +( -16 120 16 ) ( -15 120 16 ) ( -16 120 17 ) city1_4 32 48 -0 1 1 +( -16 200 16 ) ( -16 201 16 ) ( -15 200 16 ) city1_4 32 56 -0 1 1 +( -32 -8 -0 ) ( -31 -8 -0 ) ( -32 -7 -0 ) city1_4 32 56 -0 1 1 +} +// brush 20 +{ +( -48 104 16 ) ( -48 104 -0 ) ( -16 104 8 ) maya2_2 -0 -0 -0 1 1 +( -16 104 8 ) ( -48 104 -0 ) ( -16 72 -0 ) maya2_2 -0 120 -0 1 1 +( -16 104 8 ) ( -48 72 16 ) ( -48 104 16 ) maya2_2 -0 120 -0 1 1 +( -16 104 8 ) ( -16 72 -0 ) ( -48 72 16 ) maya2_2 -0 120 -0 1 1 +( -48 72 16 ) ( -48 72 -0 ) ( -48 104 -0 ) maya2_2 -120 -0 -0 1 1 +( -48 104 -0 ) ( -48 72 -0 ) ( -16 72 -0 ) maya2_2 -0 120 -0 1 1 +( -16 72 -0 ) ( -48 72 -0 ) ( -48 72 16 ) maya2_2 -0 -0 -0 1 1 +} +// brush 21 +{ +( -0 120 16 ) ( -0 120 -0 ) ( -0 72 -0 ) city1_4 -56 48 -0 1 1 +( -0 120 16 ) ( -16 120 16 ) ( -16 120 -0 ) city1_4 16 48 -0 1 1 +( -16 72 16 ) ( -16 120 16 ) ( -0 120 16 ) city1_4 16 56 -0 1 1 +( -16 120 -0 ) ( -16 72 -0 ) ( -0 72 -0 ) city1_4 16 56 -0 1 1 +( -0 72 -0 ) ( -16 72 -0 ) ( -16 72 16 ) city1_4 16 48 -0 1 1 +( -16 72 16 ) ( -16 72 -0 ) ( -16 120 -0 ) city1_4 -56 48 -0 1 1 +} +// brush 22 +{ +( -120 -8 -0 ) ( -120 -7 -0 ) ( -120 -8 1 ) city1_4 8 48 -0 1 1 +( -88 200 16 ) ( -88 200 17 ) ( -88 201 16 ) city1_4 8 48 -0 1 1 +( -104 104 -0 ) ( -104 104 1 ) ( -103 104 -0 ) city1_4 40 48 -0 1 1 +( -88 120 16 ) ( -87 120 16 ) ( -88 120 17 ) city1_4 40 48 -0 1 1 +( -88 200 16 ) ( -88 201 16 ) ( -87 200 16 ) city1_4 40 -8 -0 1 1 +( -104 -8 -0 ) ( -103 -8 -0 ) ( -104 -7 -0 ) city1_4 40 -8 -0 1 1 +} +// brush 23 +{ +( -72 120 16 ) ( -72 120 -0 ) ( -72 72 -0 ) city1_4 8 48 -0 1 1 +( -72 120 16 ) ( -88 120 16 ) ( -88 120 -0 ) city1_4 24 48 -0 1 1 +( -88 72 16 ) ( -88 120 16 ) ( -72 120 16 ) city1_4 24 -8 -0 1 1 +( -88 120 -0 ) ( -88 72 -0 ) ( -72 72 -0 ) city1_4 24 -8 -0 1 1 +( -72 72 -0 ) ( -88 72 -0 ) ( -88 72 16 ) city1_4 24 48 -0 1 1 +( -88 72 16 ) ( -88 72 -0 ) ( -88 120 -0 ) city1_4 8 48 -0 1 1 +} +// brush 24 +{ +( -72 120 -0 ) ( -72 120 -32 ) ( -72 72 -32 ) afloor1_3 8 -16 -0 1 1 +( -72 120 -0 ) ( -200 120 -0 ) ( -200 120 -32 ) afloor1_3 8 -16 -0 1 1 +( -200 72 -0 ) ( -200 120 -0 ) ( -72 120 -0 ) afloor1_3 8 -8 -0 1 1 +( -200 120 -32 ) ( -200 72 -32 ) ( -72 72 -32 ) afloor1_3 8 -8 -0 1 1 +( -72 72 -32 ) ( -200 72 -32 ) ( -200 72 -0 ) afloor1_3 8 -16 -0 1 1 +( -120 72 -0 ) ( -120 72 -32 ) ( -120 120 -32 ) afloor1_3 8 -16 -0 1 1 +} +// brush 25 +{ +( -88 104 8 ) ( -120 104 -0 ) ( -88 72 -0 ) maya2_2 72 -8 -0 1 1 +( -88 104 8 ) ( -88 72 -0 ) ( -120 72 16 ) maya2_2 72 -8 -0 1 1 +( -120 104 -0 ) ( -120 72 -0 ) ( -88 72 -0 ) maya2_2 72 -8 -0 1 1 +( -88 72 -0 ) ( -120 72 -0 ) ( -120 72 16 ) maya2_2 72 -0 -0 1 1 +( -120 72 16 ) ( -88 104 16 ) ( -88 104 144 ) maya2_2 72 0 0 1 1 +} +// brush 26 +{ +( -120 104 16 ) ( -120 104 -0 ) ( -88 104 8 ) maya2_2 72 -0 -0 1 1 +( -88 104 8 ) ( -120 104 -0 ) ( -88 72 -0 ) maya2_2 72 -8 -0 1 1 +( -88 104 8 ) ( -120 72 16 ) ( -120 104 16 ) maya2_2 72 -8 -0 1 1 +( -120 72 16 ) ( -120 72 -0 ) ( -120 104 -0 ) maya2_2 8 -0 -0 1 1 +( -120 104 -0 ) ( -120 72 -0 ) ( -88 72 -0 ) maya2_2 72 -8 -0 1 1 +( -120 72 16 ) ( -88 104 144 ) ( -88 104 16 ) maya2_2 72 0 0 1 1 +} +// brush 27 +{ +( -72 192 -0 ) ( -72 192 -32 ) ( -72 144 -32 ) afloor1_3 -0 -16 -0 1 1 +( -72 192 -0 ) ( -200 192 -0 ) ( -200 192 -32 ) afloor1_3 8 -16 -0 1 1 +( -200 144 -0 ) ( -200 192 -0 ) ( -72 192 -0 ) afloor1_3 8 -0 -0 1 1 +( -200 192 -32 ) ( -200 144 -32 ) ( -72 144 -32 ) afloor1_3 8 -0 -0 1 1 +( -72 144 -32 ) ( -200 144 -32 ) ( -200 144 -0 ) afloor1_3 8 -16 -0 1 1 +( -120 144 -0 ) ( -120 144 -32 ) ( -120 192 -32 ) afloor1_3 -0 -16 -0 1 1 +} +// brush 28 +{ +( -120 176 16 ) ( -120 176 -0 ) ( -88 176 8 ) maya2_2 72 -0 -0 1 1 +( -88 176 8 ) ( -120 176 -0 ) ( -88 144 -0 ) maya2_2 72 64 -0 1 1 +( -88 176 8 ) ( -120 144 16 ) ( -120 176 16 ) maya2_2 72 64 -0 1 1 +( -120 144 16 ) ( -120 144 -0 ) ( -120 176 -0 ) maya2_2 -64 -0 -0 1 1 +( -120 176 -0 ) ( -120 144 -0 ) ( -88 144 -0 ) maya2_2 72 64 -0 1 1 +( -120 144 16 ) ( -88 176 144 ) ( -88 176 16 ) maya2_2 -0 -0 -0 1 1 +} +// brush 29 +{ +( -88 176 8 ) ( -120 176 -0 ) ( -88 144 -0 ) maya2_2 72 64 -0 1 1 +( -88 176 8 ) ( -88 144 -0 ) ( -120 144 16 ) maya2_2 72 64 -0 1 1 +( -120 176 -0 ) ( -120 144 -0 ) ( -88 144 -0 ) maya2_2 72 64 -0 1 1 +( -88 144 -0 ) ( -120 144 -0 ) ( -120 144 16 ) maya2_2 72 -0 -0 1 1 +( -120 144 16 ) ( -88 176 16 ) ( -88 176 144 ) maya2_2 -0 -0 -0 1 1 +} +// brush 30 +{ +( -72 192 16 ) ( -72 192 -0 ) ( -72 144 -0 ) city1_4 -0 48 -0 1 1 +( -72 192 16 ) ( -88 192 16 ) ( -88 192 -0 ) city1_4 24 48 -0 1 1 +( -88 144 16 ) ( -88 192 16 ) ( -72 192 16 ) city1_4 24 -0 -0 1 1 +( -88 192 -0 ) ( -88 144 -0 ) ( -72 144 -0 ) city1_4 24 -0 -0 1 1 +( -72 144 -0 ) ( -88 144 -0 ) ( -88 144 16 ) city1_4 24 48 -0 1 1 +( -88 144 16 ) ( -88 144 -0 ) ( -88 192 -0 ) city1_4 -0 48 -0 1 1 +} +// brush 31 +{ +( -88 240 -0 ) ( -88 208 -0 ) ( -88 240 8 ) maya2_2 -32 -0 -0 1 1 +( -88 240 -0 ) ( -120 208 -0 ) ( -88 208 -0 ) maya2_2 -0 32 -0 1 1 +( -88 240 8 ) ( -120 208 16 ) ( -120 208 -0 ) maya2_2 -32 -0 -0 1 1 +( -120 208 -0 ) ( -120 208 16 ) ( -88 208 -0 ) maya2_2 -0 -0 -0 1 1 +( -88 208 -0 ) ( -120 208 16 ) ( -88 240 8 ) maya2_2 -0 32 -0 1 1 +} +// brush 32 +{ +( -120 240 -0 ) ( -120 208 -0 ) ( -88 240 -0 ) maya2_2 -0 32 -0 1 1 +( -120 240 16 ) ( -120 208 16 ) ( -120 208 -0 ) maya2_2 -32 -0 -0 1 1 +( -120 240 16 ) ( -88 240 8 ) ( -120 208 16 ) maya2_2 -0 32 -0 1 1 +( -120 208 16 ) ( -88 240 8 ) ( -88 240 -0 ) maya2_2 -32 -0 -0 1 1 +( -88 240 -0 ) ( -88 240 8 ) ( -120 240 16 ) maya2_2 -0 -0 -0 1 1 +} +// brush 33 +{ +( -120 128 -0 ) ( -120 129 -0 ) ( -120 128 1 ) city1_4 -0 48 -0 1 1 +( -88 336 16 ) ( -88 336 17 ) ( -88 337 16 ) city1_4 -0 48 -0 1 1 +( -104 240 -0 ) ( -104 240 1 ) ( -103 240 -0 ) city1_4 40 48 -0 1 1 +( -88 256 16 ) ( -87 256 16 ) ( -88 256 17 ) city1_4 40 48 -0 1 1 +( -88 336 16 ) ( -88 337 16 ) ( -87 336 16 ) city1_4 40 -0 -0 1 1 +( -104 128 -0 ) ( -103 128 -0 ) ( -104 129 -0 ) city1_4 40 -0 -0 1 1 +} +// brush 34 +{ +( -72 256 16 ) ( -72 256 -0 ) ( -72 208 -0 ) city1_4 -0 48 -0 1 1 +( -72 256 16 ) ( -88 256 16 ) ( -88 256 -0 ) city1_4 24 48 -0 1 1 +( -88 208 16 ) ( -88 256 16 ) ( -72 256 16 ) city1_4 24 -0 -0 1 1 +( -88 256 -0 ) ( -88 208 -0 ) ( -72 208 -0 ) city1_4 24 -0 -0 1 1 +( -72 208 -0 ) ( -88 208 -0 ) ( -88 208 16 ) city1_4 24 48 -0 1 1 +( -88 208 16 ) ( -88 208 -0 ) ( -88 256 -0 ) city1_4 -0 48 -0 1 1 +} +// brush 35 +{ +( -72 256 -0 ) ( -72 256 -32 ) ( -72 208 -32 ) afloor1_3 -0 -16 -0 1 1 +( -72 256 -0 ) ( -200 256 -0 ) ( -200 256 -32 ) afloor1_3 8 -16 -0 1 1 +( -200 208 -0 ) ( -200 256 -0 ) ( -72 256 -0 ) afloor1_3 8 -0 -0 1 1 +( -200 256 -32 ) ( -200 208 -32 ) ( -72 208 -32 ) afloor1_3 8 -0 -0 1 1 +( -72 208 -32 ) ( -200 208 -32 ) ( -200 208 -0 ) afloor1_3 8 -16 -0 1 1 +( -120 208 -0 ) ( -120 208 -32 ) ( -120 256 -32 ) afloor1_3 -0 -16 -0 1 1 +} +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "-96 -64 24" +} diff --git a/testmaps/testblockedmidpoint.map b/testmaps/deprecated/testblockedmidpoint.map similarity index 100% rename from testmaps/testblockedmidpoint.map rename to testmaps/deprecated/testblockedmidpoint.map diff --git a/testmaps/testlightonface.map b/testmaps/deprecated/testlightonface.map similarity index 100% rename from testmaps/testlightonface.map rename to testmaps/deprecated/testlightonface.map diff --git a/testmaps/testminlight.map b/testmaps/deprecated/testminlight.map similarity index 100% rename from testmaps/testminlight.map rename to testmaps/deprecated/testminlight.map diff --git a/testmaps/testphongtjunc.map b/testmaps/deprecated/testphongtjunc.map similarity index 100% rename from testmaps/testphongtjunc.map rename to testmaps/deprecated/testphongtjunc.map diff --git a/testmaps/testphongtjunc2.map b/testmaps/deprecated/testphongtjunc2.map similarity index 100% rename from testmaps/testphongtjunc2.map rename to testmaps/deprecated/testphongtjunc2.map diff --git a/testmaps/testrotators.map b/testmaps/deprecated/testrotators.map similarity index 100% rename from testmaps/testrotators.map rename to testmaps/deprecated/testrotators.map diff --git a/testmaps/testrotators_bmodel.map b/testmaps/deprecated/testrotators_bmodel.map similarity index 100% rename from testmaps/testrotators_bmodel.map rename to testmaps/deprecated/testrotators_bmodel.map diff --git a/testmaps/testshadows.map b/testmaps/deprecated/testshadows.map similarity index 100% rename from testmaps/testshadows.map rename to testmaps/deprecated/testshadows.map diff --git a/testmaps/testslime.map b/testmaps/deprecated/testslime.map similarity index 100% rename from testmaps/testslime.map rename to testmaps/deprecated/testslime.map diff --git a/testmaps/testsurfacelight.map b/testmaps/deprecated/testsurfacelight.map similarity index 100% rename from testmaps/testsurfacelight.map rename to testmaps/deprecated/testsurfacelight.map From 2446134b239701136bb82a002e162c8a4f00e5bb Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 16:23:23 -0600 Subject: [PATCH 07/19] ci: add hash checking and generating functionality --- testmaps/automatated_tests.sh | 37 +++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/testmaps/automatated_tests.sh b/testmaps/automatated_tests.sh index 80c21dcd..309fe4e8 100755 --- a/testmaps/automatated_tests.sh +++ b/testmaps/automatated_tests.sh @@ -1,12 +1,23 @@ #!/bin/bash # usage: -# - qbsp, vis, light need to be in PATH before running -# - returns exit status 1 if any tests failed, otherwise 0 +# ./automated_tests.sh [--update-hashes] +# +# If --update-hashes is given, updates the expected hash files. +# Otherwise tests the generated .bsp's match the expected hashes. +# +# qbsp, vis, light need to be in PATH before running. +# +# Returns exit status 1 if any tests failed, otherwise 0 # print statements as they are executed set -x +UPDATE_HASHES=0 +if [[ "$1" == "--update-hashes" ]]; then + UPDATE_HASHES=1 +fi + # checking for lack of crashes qbsp -noverbose invalid_texture_axes.map || exit 1 @@ -29,7 +40,8 @@ e1m1-bsp2.bsp \ e1m1-2psb.bsp \ e1m1-hexen2.bsp \ e1m1-hexen2-bsp2.bsp \ -e1m1-hexen2-2psb.bsp" +e1m1-hexen2-2psb.bsp \ +e1m1-hlbsp.bsp" 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 @@ -37,8 +49,13 @@ qbsp -noverbose -2psb quake_map_source/E1M1.map e1m1-2psb.bsp || qbsp -noverbose -hexen2 quake_map_source/E1M1.map e1m1-hexen2.bsp || exit 1 qbsp -noverbose -hexen2 -bsp2 quake_map_source/E1M1.map e1m1-hexen2-bsp2.bsp || exit 1 qbsp -noverbose -hexen2 -2psb quake_map_source/E1M1.map e1m1-hexen2-2psb.bsp || exit 1 +qbsp -noverbose -hlbsp quake_map_source/E1M1.map e1m1-hlbsp.bsp || exit 1 -sha256sum ${HASH_CHECK_BSPS} +if [[ $UPDATE_HASHES -ne 0 ]]; then + sha256sum ${HASH_CHECK_BSPS} > qbsp.sha256sum || exit 1 +else + sha256sum --strict --check qbsp.sha256sum || exit 1 +fi # now run vis @@ -46,12 +63,24 @@ for bsp in ${HASH_CHECK_BSPS}; do vis -nostate ${bsp} || exit 1 done +if [[ $UPDATE_HASHES -ne 0 ]]; then + sha256sum ${HASH_CHECK_BSPS} > qbsp-vis.sha256sum || exit 1 +else + sha256sum --strict --check qbsp-vis.sha256sum || exit 1 +fi + # now run light for bsp in ${HASH_CHECK_BSPS}; do light ${bsp} || exit 1 done +if [[ $UPDATE_HASHES -ne 0 ]]; then + sha256sum ${HASH_CHECK_BSPS} > qbsp-vis-light.sha256sum || exit 1 +else + sha256sum --strict --check qbsp-vis-light.sha256sum || exit 1 +fi + # leak tests on all id1 maps cd quake_map_source ./leaktest.sh || exit 1 From 87c65fffed0f45b82fd3e3a8276595a022d97c1e Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 16:29:42 -0600 Subject: [PATCH 08/19] ci: initial commit of test map hashes --- testmaps/qbsp-vis-light.sha256sum | 7 +++++++ testmaps/qbsp-vis.sha256sum | 7 +++++++ testmaps/qbsp.sha256sum | 7 +++++++ 3 files changed, 21 insertions(+) create mode 100644 testmaps/qbsp-vis-light.sha256sum create mode 100644 testmaps/qbsp-vis.sha256sum create mode 100644 testmaps/qbsp.sha256sum diff --git a/testmaps/qbsp-vis-light.sha256sum b/testmaps/qbsp-vis-light.sha256sum new file mode 100644 index 00000000..c1a7b384 --- /dev/null +++ b/testmaps/qbsp-vis-light.sha256sum @@ -0,0 +1,7 @@ +a46bc18dcd32ca85aa72d72c818be70f211076fc39abb64a52bc09915b9a78d3 *e1m1-bsp29.bsp +9c74e953aca788d6c0b9453b0ebdd10896effdbd003ad23919555998cbea1358 *e1m1-bsp2.bsp +a5c2bea990084da30673c589cea41deeae1527d2cc3ae65beb247acb06624130 *e1m1-2psb.bsp +3cd6fcba96cfc7d289a995d6a9fea5b1e25096f10c896ef5a3b6b49dadc2fe4f *e1m1-hexen2.bsp +9696cad6ffe7ca8e2fae9cbb127d10097fd867df784dce7f5e296b4eed721413 *e1m1-hexen2-bsp2.bsp +0266f39c56568eec2be01504031c95372c17b7d5f42e72b7af47b1afbb244199 *e1m1-hexen2-2psb.bsp +f4ce4140b00163ac2120a0c768c5903301c672642816915a3702afaad30991fb *e1m1-hlbsp.bsp diff --git a/testmaps/qbsp-vis.sha256sum b/testmaps/qbsp-vis.sha256sum new file mode 100644 index 00000000..8372ca0d --- /dev/null +++ b/testmaps/qbsp-vis.sha256sum @@ -0,0 +1,7 @@ +03e940ac2ce95a1837c129dd7f234ee6e84b374bd460c75f63a66cd6a3060595 *e1m1-bsp29.bsp +866aa5d3060349905c24ada53e9240a4661a93d8370b1113618b2b9855a62054 *e1m1-bsp2.bsp +2f2afe85b101cc9670027ff96d7b660a0d104adf90fc7510ad7d9b750d9e621a *e1m1-2psb.bsp +bdd9048ea393999c3bf69b31c20b67f3a59027cf165201a6cd10abe3d14e35d4 *e1m1-hexen2.bsp +79e05843fa11164f8081120b2c7367acc1f67dcc20bdcaf3b91034f619ad5314 *e1m1-hexen2-bsp2.bsp +bb0c8abc8f41b837f6f190c443f2f1c75abfb3b2709c44f2a611cd0278b69520 *e1m1-hexen2-2psb.bsp +4971d6da31721c0eba9ec84f933202f12ea43ec6bf8e642a33a20dfae64d7366 *e1m1-hlbsp.bsp diff --git a/testmaps/qbsp.sha256sum b/testmaps/qbsp.sha256sum new file mode 100644 index 00000000..7221eca0 --- /dev/null +++ b/testmaps/qbsp.sha256sum @@ -0,0 +1,7 @@ +d289427e3c8a7046dce509a83401f6732a9c5f8194f8beb3eee431e33215656c *e1m1-bsp29.bsp +85002a12afa023d850199e205f01fc58de2743f97aea9b2a22a3b0ac3ce8f7ad *e1m1-bsp2.bsp +832ec9aff302ddfcc5ab4fe0911afec0b4d57c60e02dc1c8f61e1edbf8f53eda *e1m1-2psb.bsp +5e20fca2a3b6c975efe257a5768d8f8cde10ecb96abec535ea2c2d0b45d3a051 *e1m1-hexen2.bsp +018b759817dcc2ca343bdd38d511c455c13be992734e97e2fa1ad88e614240b1 *e1m1-hexen2-bsp2.bsp +015c582d9a76ec0f911c5d5f2e7ebcc1ad01ee81860dd113222259f65a40e953 *e1m1-hexen2-2psb.bsp +66936b95d27716cbcb28bc6bf8a0191f8d53bc7e2823abcb85cd04fec9d2fcb6 *e1m1-hlbsp.bsp From 16b2db5732838796f60facc0a5026e504e0c127e Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 17:14:45 -0600 Subject: [PATCH 09/19] ci: install sha256sum on macOS --- build-osx.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build-osx.sh b/build-osx.sh index 115da8d1..87bb5ada 100755 --- a/build-osx.sh +++ b/build-osx.sh @@ -1,5 +1,8 @@ #!/bin/bash +# for sha256sum, used by the tests +brew install coreutils + BUILD_DIR=build-osx EMBREE_ZIP="https://github.com/embree/embree/releases/download/v3.13.0/embree-3.13.0.x86_64.macosx.zip" From caac229b2b173432a98b5d17fc9661c7b3fd62b5 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 18:18:27 -0600 Subject: [PATCH 10/19] ci: appveyor: run automated_tests.sh --- appveyor.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 3ce9c5d7..cb4557df 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,6 +15,9 @@ build_script: $env:Path += ";C:\cygwin64\bin" + # For sha256sum + $env:Path += ";C:\Program Files\Git\usr\bin" + mkdir cmakebuild cd cmakebuild @@ -43,7 +46,25 @@ build_script: .\light\Release\testlight.exe + if ( $? -eq $false ) { + throw "testlight failed" + } + .\qbsp\Release\testqbsp.exe + + if ( $? -eq $false ) { + throw "testqbsp failed" + } + + $env:Path += ";$(pwd)\qbsp\Release;$(pwd)\vis\Release;$(pwd)\light\Release" + + cd ..\testmaps + + . "C:\Program Files\Git\usr\bin\bash.exe" .\automatated_tests.sh + + if ( $? -eq $false ) { + throw "automatated_tests.sh failed" + } artifacts: - path: cmakebuild\*.zip deploy: From d01c30ea9b4bd205b4ad446e9532ec0cb5d5677c Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 18:46:40 -0600 Subject: [PATCH 11/19] ci: run vis single threaded, refresh expected hashes --- testmaps/automatated_tests.sh | 3 ++- testmaps/qbsp-vis-light.sha256sum | 14 +++++++------- testmaps/qbsp-vis.sha256sum | 14 +++++++------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/testmaps/automatated_tests.sh b/testmaps/automatated_tests.sh index 309fe4e8..bd4a5745 100755 --- a/testmaps/automatated_tests.sh +++ b/testmaps/automatated_tests.sh @@ -58,9 +58,10 @@ else fi # now run vis +# FIXME: vis output is nondeterministic when run with multiple threads! for bsp in ${HASH_CHECK_BSPS}; do - vis -nostate ${bsp} || exit 1 + vis -nostate -threads 1 ${bsp} || exit 1 done if [[ $UPDATE_HASHES -ne 0 ]]; then diff --git a/testmaps/qbsp-vis-light.sha256sum b/testmaps/qbsp-vis-light.sha256sum index c1a7b384..50bc3db6 100644 --- a/testmaps/qbsp-vis-light.sha256sum +++ b/testmaps/qbsp-vis-light.sha256sum @@ -1,7 +1,7 @@ -a46bc18dcd32ca85aa72d72c818be70f211076fc39abb64a52bc09915b9a78d3 *e1m1-bsp29.bsp -9c74e953aca788d6c0b9453b0ebdd10896effdbd003ad23919555998cbea1358 *e1m1-bsp2.bsp -a5c2bea990084da30673c589cea41deeae1527d2cc3ae65beb247acb06624130 *e1m1-2psb.bsp -3cd6fcba96cfc7d289a995d6a9fea5b1e25096f10c896ef5a3b6b49dadc2fe4f *e1m1-hexen2.bsp -9696cad6ffe7ca8e2fae9cbb127d10097fd867df784dce7f5e296b4eed721413 *e1m1-hexen2-bsp2.bsp -0266f39c56568eec2be01504031c95372c17b7d5f42e72b7af47b1afbb244199 *e1m1-hexen2-2psb.bsp -f4ce4140b00163ac2120a0c768c5903301c672642816915a3702afaad30991fb *e1m1-hlbsp.bsp +d5da8e86c8f2f1c8e78ce5bfacb21c59bdc98cd91f6f14172a5fdd0020e4dd4d *e1m1-bsp29.bsp +361c32951113f1afc98e61d3bc7b7f2eaa8dd67ebfbc15944257b86099981635 *e1m1-bsp2.bsp +00ecf1affe4d77eba7090a4a8613e5aa0037d50cf374365c80a8a66e55c03b46 *e1m1-2psb.bsp +a646ed92ca0d630ecf654491cef06257aca793dc6f0e67df3b3144022421585f *e1m1-hexen2.bsp +cb12dad4278373ef86214ec3907967de054aab8344e965d726e7ac5ea4eda221 *e1m1-hexen2-bsp2.bsp +7dc19487e2659732ec714395d7a7c484e89415eb655c405453b923e29384f36d *e1m1-hexen2-2psb.bsp +84209486441bcb21e9c2d7f5dee840a6bf074311fd773b417f03bd187997e880 *e1m1-hlbsp.bsp diff --git a/testmaps/qbsp-vis.sha256sum b/testmaps/qbsp-vis.sha256sum index 8372ca0d..1a511f8a 100644 --- a/testmaps/qbsp-vis.sha256sum +++ b/testmaps/qbsp-vis.sha256sum @@ -1,7 +1,7 @@ -03e940ac2ce95a1837c129dd7f234ee6e84b374bd460c75f63a66cd6a3060595 *e1m1-bsp29.bsp -866aa5d3060349905c24ada53e9240a4661a93d8370b1113618b2b9855a62054 *e1m1-bsp2.bsp -2f2afe85b101cc9670027ff96d7b660a0d104adf90fc7510ad7d9b750d9e621a *e1m1-2psb.bsp -bdd9048ea393999c3bf69b31c20b67f3a59027cf165201a6cd10abe3d14e35d4 *e1m1-hexen2.bsp -79e05843fa11164f8081120b2c7367acc1f67dcc20bdcaf3b91034f619ad5314 *e1m1-hexen2-bsp2.bsp -bb0c8abc8f41b837f6f190c443f2f1c75abfb3b2709c44f2a611cd0278b69520 *e1m1-hexen2-2psb.bsp -4971d6da31721c0eba9ec84f933202f12ea43ec6bf8e642a33a20dfae64d7366 *e1m1-hlbsp.bsp +c9683e945bb01528a768653cdb79584dfbc8be6f76b712cbf0d24482a4ae3cc3 *e1m1-bsp29.bsp +a8024b07d48abc0553ff3628d6d4cb62138f67808b425b833e5643068231c2e4 *e1m1-bsp2.bsp +cb11d4f40d92c9d349fd11f9e4901e9cd9aa82db9971181a615c197f75f4b4a6 *e1m1-2psb.bsp +f5656ae5a98b4044568e70a411afe2b37cae41c14f7262f26be2aa45aebc3672 *e1m1-hexen2.bsp +4e0fec87702736481d08d67366f300bf351944f0ebcd4daafa56cbfb2f509893 *e1m1-hexen2-bsp2.bsp +a5eb5b451baab8db48a141285479669656010fc7d3945e30672d609169b040e5 *e1m1-hexen2-2psb.bsp +ecf7a82cfad86c3b8a330645233c17011f77b8fef844130ac85dd6e8972eea8f *e1m1-hlbsp.bsp From f2cffaa9e81747369851a637e1cc197ec3c71a21 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 18:57:00 -0600 Subject: [PATCH 12/19] ci: run light single threaded --- testmaps/automatated_tests.sh | 3 ++- testmaps/qbsp-vis-light.sha256sum | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/testmaps/automatated_tests.sh b/testmaps/automatated_tests.sh index bd4a5745..ce0cd4a1 100755 --- a/testmaps/automatated_tests.sh +++ b/testmaps/automatated_tests.sh @@ -71,9 +71,10 @@ else fi # now run light +# FIXME: light output is nondeterministic when run with multiple threads! for bsp in ${HASH_CHECK_BSPS}; do - light ${bsp} || exit 1 + light -threads 1 ${bsp} || exit 1 done if [[ $UPDATE_HASHES -ne 0 ]]; then diff --git a/testmaps/qbsp-vis-light.sha256sum b/testmaps/qbsp-vis-light.sha256sum index 50bc3db6..231a8144 100644 --- a/testmaps/qbsp-vis-light.sha256sum +++ b/testmaps/qbsp-vis-light.sha256sum @@ -1,7 +1,7 @@ -d5da8e86c8f2f1c8e78ce5bfacb21c59bdc98cd91f6f14172a5fdd0020e4dd4d *e1m1-bsp29.bsp -361c32951113f1afc98e61d3bc7b7f2eaa8dd67ebfbc15944257b86099981635 *e1m1-bsp2.bsp -00ecf1affe4d77eba7090a4a8613e5aa0037d50cf374365c80a8a66e55c03b46 *e1m1-2psb.bsp -a646ed92ca0d630ecf654491cef06257aca793dc6f0e67df3b3144022421585f *e1m1-hexen2.bsp -cb12dad4278373ef86214ec3907967de054aab8344e965d726e7ac5ea4eda221 *e1m1-hexen2-bsp2.bsp -7dc19487e2659732ec714395d7a7c484e89415eb655c405453b923e29384f36d *e1m1-hexen2-2psb.bsp -84209486441bcb21e9c2d7f5dee840a6bf074311fd773b417f03bd187997e880 *e1m1-hlbsp.bsp +3ba50d67149cfe759d40ed46c163c4162ccf5962c085c7e5564c1b17cb667c99 *e1m1-bsp29.bsp +eae94ddc3fe8e98cb09c09b2d25aa99e5c0d3ab83e04ac6c839e838a100ce3af *e1m1-bsp2.bsp +61f2e036b2a8969b314534d5397f44736f625ee6cce725832f762d333aacca9c *e1m1-2psb.bsp +f2cfec96cee6828ce5c1cfc90b6ab04052b5801737d06d6d42052ab36c73aaad *e1m1-hexen2.bsp +4627312bd6af8a5652e40927a2e439085ace92fec7f2e965df684bc3803768be *e1m1-hexen2-bsp2.bsp +c05db0b15d5c5d45c1002e898c26e088d684fb5e193068281d9505992c7137ab *e1m1-hexen2-2psb.bsp +406b85388f1070d05d291fa2e6729178ff9680b96f99f567a3b629dc7eecaafc *e1m1-hlbsp.bsp From a6f90438f60e09a6980903bfee438795ef70b56b Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 20:35:44 -0600 Subject: [PATCH 13/19] build: fix homebrew build --- light/CMakeLists.txt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/light/CMakeLists.txt b/light/CMakeLists.txt index cd62153c..25fd140b 100644 --- a/light/CMakeLists.txt +++ b/light/CMakeLists.txt @@ -61,14 +61,18 @@ if (embree_FOUND) target_link_libraries (light PRIVATE embree) add_definitions(-DHAVE_EMBREE) + # macOS/homebrew: hack around find_file applying the .. before resolving the symlink + # causing it not to find the LICENSE.txt + get_filename_component(embree_DIR_ABS "${embree_DIR}" REALPATH CACHE) + find_file(EMBREE_LICENSE LICENSE.txt - "${embree_DIR}/doc" - "${embree_DIR}/../../../doc" - "${embree_DIR}/../embree3/embree3" # vcpkg puts it here - "${embree_DIR}/../../.." # homebrew puts it here + "${embree_DIR_ABS}/doc" + "${embree_DIR_ABS}/../../../doc" + "${embree_DIR_ABS}/../embree3/embree3" # vcpkg puts it here + "${embree_DIR_ABS}/../../.." # homebrew puts it here NO_DEFAULT_PATH) if (EMBREE_LICENSE STREQUAL EMBREE_LICENSE-NOTFOUND) - message(WARNING "Couldn't find embree license. embree_DIR is ${embree_DIR}") + message(WARNING "Couldn't find embree license. embree_DIR: ${embree_DIR}, embree_DIR_ABS: ${embree_DIR_ABS}") else() message(STATUS "Found embree license: ${EMBREE_LICENSE}") endif() From ab23e8cac57fde729416fb1b62fdedd3972b8fc1 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 21:58:38 -0600 Subject: [PATCH 14/19] ci :disable light test for now, because it's nondeterministic (at least across windows/mac) --- testmaps/automatated_tests.sh | 19 +++++++++---------- testmaps/qbsp-vis-light.sha256sum | 7 ------- 2 files changed, 9 insertions(+), 17 deletions(-) delete mode 100644 testmaps/qbsp-vis-light.sha256sum diff --git a/testmaps/automatated_tests.sh b/testmaps/automatated_tests.sh index ce0cd4a1..f8d5d14c 100755 --- a/testmaps/automatated_tests.sh +++ b/testmaps/automatated_tests.sh @@ -70,18 +70,17 @@ else sha256sum --strict --check qbsp-vis.sha256sum || exit 1 fi -# now run light -# FIXME: light output is nondeterministic when run with multiple threads! +# FIXME: light output is nondeterministic -for bsp in ${HASH_CHECK_BSPS}; do - light -threads 1 ${bsp} || exit 1 -done +# for bsp in ${HASH_CHECK_BSPS}; do +# light -threads 1 ${bsp} || exit 1 +# done -if [[ $UPDATE_HASHES -ne 0 ]]; then - sha256sum ${HASH_CHECK_BSPS} > qbsp-vis-light.sha256sum || exit 1 -else - sha256sum --strict --check qbsp-vis-light.sha256sum || exit 1 -fi +# if [[ $UPDATE_HASHES -ne 0 ]]; then +# sha256sum ${HASH_CHECK_BSPS} > qbsp-vis-light.sha256sum || exit 1 +# else +# sha256sum --strict --check qbsp-vis-light.sha256sum || exit 1 +# fi # leak tests on all id1 maps cd quake_map_source diff --git a/testmaps/qbsp-vis-light.sha256sum b/testmaps/qbsp-vis-light.sha256sum deleted file mode 100644 index 231a8144..00000000 --- a/testmaps/qbsp-vis-light.sha256sum +++ /dev/null @@ -1,7 +0,0 @@ -3ba50d67149cfe759d40ed46c163c4162ccf5962c085c7e5564c1b17cb667c99 *e1m1-bsp29.bsp -eae94ddc3fe8e98cb09c09b2d25aa99e5c0d3ab83e04ac6c839e838a100ce3af *e1m1-bsp2.bsp -61f2e036b2a8969b314534d5397f44736f625ee6cce725832f762d333aacca9c *e1m1-2psb.bsp -f2cfec96cee6828ce5c1cfc90b6ab04052b5801737d06d6d42052ab36c73aaad *e1m1-hexen2.bsp -4627312bd6af8a5652e40927a2e439085ace92fec7f2e965df684bc3803768be *e1m1-hexen2-bsp2.bsp -c05db0b15d5c5d45c1002e898c26e088d684fb5e193068281d9505992c7137ab *e1m1-hexen2-2psb.bsp -406b85388f1070d05d291fa2e6729178ff9680b96f99f567a3b629dc7eecaafc *e1m1-hlbsp.bsp From 45201118d5c14a4c96e7ad14405323b01ddca502 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 22:38:26 -0600 Subject: [PATCH 15/19] ci: fix exitcode check in appveyor.yml --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index cb4557df..c244a9a3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -62,7 +62,7 @@ build_script: . "C:\Program Files\Git\usr\bin\bash.exe" .\automatated_tests.sh - if ( $? -eq $false ) { + if ( $LastExitCode -ne 0 ) { throw "automatated_tests.sh failed" } artifacts: From d453ff6c01751ffc26dc1673cc97db83879ef646 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 22:59:10 -0600 Subject: [PATCH 16/19] ci: try forcing exit 0 --- testmaps/automatated_tests.sh | 2 ++ testmaps/quake_map_source/leaktest.sh | 1 + 2 files changed, 3 insertions(+) diff --git a/testmaps/automatated_tests.sh b/testmaps/automatated_tests.sh index f8d5d14c..e530ba27 100755 --- a/testmaps/automatated_tests.sh +++ b/testmaps/automatated_tests.sh @@ -85,3 +85,5 @@ fi # leak tests on all id1 maps cd quake_map_source ./leaktest.sh || exit 1 + +exit 0 diff --git a/testmaps/quake_map_source/leaktest.sh b/testmaps/quake_map_source/leaktest.sh index bcf384df..82630609 100755 --- a/testmaps/quake_map_source/leaktest.sh +++ b/testmaps/quake_map_source/leaktest.sh @@ -6,3 +6,4 @@ for file in *.map; do qbsp -leaktest -noverbose "$file" || exit 1 done +exit 0 From ba7fbbb69b1e40584b2b53a9eccbd0fd580c1ca8 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 19 Sep 2021 23:26:27 -0600 Subject: [PATCH 17/19] ci: move appveyor build to separate .ps1 script to suppress failing on writes to stderr. see: https://help.appveyor.com/discussions/problems/10014-false-build-fail-status --- appveyor.yml | 56 +--------------------------------------------- build-appveyor.ps1 | 54 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 55 deletions(-) create mode 100644 build-appveyor.ps1 diff --git a/appveyor.yml b/appveyor.yml index c244a9a3..afb35f86 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,61 +10,7 @@ install: - ps: Invoke-WebRequest 'https://github.com/oneapi-src/oneTBB/releases/download/v2020.2/tbb-2020.2-win.zip' -OutFile 'tbb.zip' - ps: 7z x tbb.zip -oc:\ build_script: -- ps: >- - git submodule update --init --recursive - - $env:Path += ";C:\cygwin64\bin" - - # For sha256sum - $env:Path += ";C:\Program Files\Git\usr\bin" - - mkdir cmakebuild - - cd cmakebuild - - cmake .. -T v142 -Dembree_DIR="C:\embree-3.12.1.x64.vc14.windows" -DTBB_DIR="C:\tbb\cmake" -DCMAKE_GENERATOR_PLATFORM=x64 -DENABLE_LIGHTPREVIEW=NO -DQt5Widgets_DIR="C:\Qt\5.8\msvc2013_64\lib\cmake\Qt5Widgets" - - $cmakePlatform = "x64" - - msbuild /target:testlight /p:Configuration=Release /p:Platform=$cmakePlatform /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" ericw-tools.sln - - if ( $? -eq $false ) { - throw "testlight failed to build" - } - - msbuild /target:testqbsp /p:Configuration=Release /p:Platform=$cmakePlatform /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" ericw-tools.sln - - if ( $? -eq $false ) { - throw "testqbsp failed to build" - } - - msbuild /p:Configuration=Release /p:Platform=$cmakePlatform /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" PACKAGE.vcxproj - - if ( $? -eq $false ) { - throw "package failed" - } - - .\light\Release\testlight.exe - - if ( $? -eq $false ) { - throw "testlight failed" - } - - .\qbsp\Release\testqbsp.exe - - if ( $? -eq $false ) { - throw "testqbsp failed" - } - - $env:Path += ";$(pwd)\qbsp\Release;$(pwd)\vis\Release;$(pwd)\light\Release" - - cd ..\testmaps - - . "C:\Program Files\Git\usr\bin\bash.exe" .\automatated_tests.sh - - if ( $LastExitCode -ne 0 ) { - throw "automatated_tests.sh failed" - } +- cmd: powershell .\build-appveyor.ps1 artifacts: - path: cmakebuild\*.zip deploy: diff --git a/build-appveyor.ps1 b/build-appveyor.ps1 new file mode 100644 index 00000000..8183374b --- /dev/null +++ b/build-appveyor.ps1 @@ -0,0 +1,54 @@ +git submodule update --init --recursive + +$env:Path += ";C:\cygwin64\bin" + +# For sha256sum +$env:Path += ";C:\Program Files\Git\usr\bin" + +mkdir cmakebuild + +cd cmakebuild + +cmake .. -T v142 -Dembree_DIR="C:\embree-3.12.1.x64.vc14.windows" -DTBB_DIR="C:\tbb\cmake" -DCMAKE_GENERATOR_PLATFORM=x64 -DENABLE_LIGHTPREVIEW=NO -DQt5Widgets_DIR="C:\Qt\5.8\msvc2013_64\lib\cmake\Qt5Widgets" + +$cmakePlatform = "x64" + +msbuild /target:testlight /p:Configuration=Release /p:Platform=$cmakePlatform /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" ericw-tools.sln + +if ( $? -eq $false ) { + throw "testlight failed to build" +} + +msbuild /target:testqbsp /p:Configuration=Release /p:Platform=$cmakePlatform /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" ericw-tools.sln + +if ( $? -eq $false ) { + throw "testqbsp failed to build" +} + +msbuild /p:Configuration=Release /p:Platform=$cmakePlatform /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" PACKAGE.vcxproj + +if ( $? -eq $false ) { + throw "package failed" +} + +.\light\Release\testlight.exe + +if ( $? -eq $false ) { + throw "testlight failed" +} + +.\qbsp\Release\testqbsp.exe + +if ( $? -eq $false ) { + throw "testqbsp failed" +} + +$env:Path += ";$(pwd)\qbsp\Release;$(pwd)\vis\Release;$(pwd)\light\Release" + +cd ..\testmaps + +. "C:\Program Files\Git\usr\bin\bash.exe" .\automatated_tests.sh + +if ( $LastExitCode -ne 0 ) { + throw "automatated_tests.sh failed" +} From 405ce25913905653ebd6872eaaa552610c659767 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Mon, 20 Sep 2021 18:38:28 -0600 Subject: [PATCH 18/19] Revert "Revert "Q2BSP + QBSP (#313)"" This reverts commit e9052f3002d1444186b20a8e94ccb25ba9c46c97. --- bsputil/bsputil.cc | 32 +- common/bspfile.cc | 1859 ++++++++++++++++++++++++------------- common/bsputils.cc | 13 +- include/common/bspfile.hh | 147 ++- light/entities.cc | 2 +- light/imglib.cc | 6 +- light/light.cc | 18 +- light/ltface.cc | 6 +- light/trace.cc | 2 +- light/trace_embree.cc | 11 +- vis/vis.cc | 6 +- 11 files changed, 1388 insertions(+), 714 deletions(-) diff --git a/bsputil/bsputil.cc b/bsputil/bsputil.cc index 987b8341..926b2c07 100644 --- a/bsputil/bsputil.cc +++ b/bsputil/bsputil.cc @@ -541,7 +541,7 @@ main(int argc, char **argv) LoadBSPFile(source, &bspdata); - ConvertBSPFormat(GENERIC_BSP, &bspdata); + ConvertBSPFormat(&bspdata, &bspver_generic); for (i = 0; i < argc - 1; i++) { if (!strcmp(argv[i], "--compare")) { @@ -556,7 +556,7 @@ main(int argc, char **argv) strcpy(refbspname, argv[i]); DefaultExtension(refbspname, ".bsp"); LoadBSPFile(refbspname, &refbspdata); - ConvertBSPFormat(GENERIC_BSP, &refbspdata); + ConvertBSPFormat(&refbspdata, &bspver_generic); printf("comparing reference bsp %s with test bsp %s\n", refbspname, source); @@ -569,21 +569,21 @@ main(int argc, char **argv) if (!(i < argc - 1)) { Error("--convert requires an argument"); } - - int fmt; - if (!strcmp(argv[i], "bsp29")) { - fmt = BSPVERSION; - } else if (!strcmp(argv[i], "bsp2")) { - fmt = BSP2VERSION; - } else if (!strcmp(argv[i], "bsp2rmq")) { - fmt = BSP2RMQVERSION; - } else if (!strcmp(argv[i], "q2bsp")) { - fmt = Q2_BSPVERSION; - } else { + + const bspversion_t *fmt = nullptr; + + for (const bspversion_t *bspver : bspversions) { + if (!strcmp(argv[i], bspver->short_name)) { + fmt = bspver; + break; + } + } + + if (!fmt) { Error("Unsupported format %s", argv[i]); } - - ConvertBSPFormat(fmt, &bspdata); + + ConvertBSPFormat(&bspdata, fmt); StripExtension(source); strcat(source, "-"); @@ -672,7 +672,7 @@ main(int argc, char **argv) bsp2_dface_t* face = BSP_GetFace(bsp, fnum); face->texinfo = texinfonum; - ConvertBSPFormat(bspdata.loadversion, &bspdata); + ConvertBSPFormat(&bspdata, bspdata.loadversion); // Overwrite source bsp! WriteBSPFile(source, &bspdata); diff --git a/common/bspfile.cc b/common/bspfile.cc index 364f0e2a..9f96e755 100644 --- a/common/bspfile.cc +++ b/common/bspfile.cc @@ -23,43 +23,45 @@ #include +const bspversion_t bspver_generic { NO_VERSION, NO_VERSION, "mbsp", "generic BSP" }; +const bspversion_t bspver_q1 { BSPVERSION, NO_VERSION, "bsp29", "Quake BSP" }; +/* Hexen II doesn't use a separate version, but we can still use a separate tag/name for it */ +const bspversion_t bspver_h2 { BSPVERSION, NO_VERSION, "hexen2", "Hexen II BSP" }; +const bspversion_t bspver_bsp2 { BSP2VERSION, NO_VERSION, "bsp2", "Quake BSP2" }; +const bspversion_t bspver_bsp2rmq { BSP2RMQVERSION, NO_VERSION, "bsp2rmq", "Quake BSP2-RMQ" }; +const bspversion_t bspver_hl { BSPHLVERSION, NO_VERSION, "hl", "Half-Life BSP" }; +const bspversion_t bspver_q2 { Q2_BSPIDENT, Q2_BSPVERSION, "q2bsp", "Quake II BSP" }; +const bspversion_t bspver_qbism { Q2_QBISMIDENT, Q2_BSPVERSION, "qbism", "Quake II Qbism BSP" }; + static const char * -BSPVersionString(int32_t version) +BSPVersionString(const bspversion_t *version) { + if (version->name) { + return version->name; + } + static char buffers[2][20]; static int index; - char *buffer; - - switch (version) { - case BSP2RMQVERSION: - return "BSP2rmq"; - case BSP2VERSION: - return "BSP2"; - case BSPHLVERSION: - return "HLBSP"; - case Q2_BSPVERSION: - return "Q2BSP"; - default: - buffer = buffers[1 & ++index]; - q_snprintf(buffer, sizeof(buffers[0]), "%d", version); - return buffer; + char *buffer = buffers[1 & ++index]; + if (version->version != NO_VERSION) { + q_snprintf(buffer, sizeof(buffers[0]), "%d:%d", version->version, version->ident); + } else { + q_snprintf(buffer, sizeof(buffers[0]), "%d", version->version); } + return buffer; } static qboolean -BSPVersionSupported(int32_t version) +BSPVersionSupported(int32_t ident, int32_t version, const bspversion_t **out_version) { - switch (version) { - case BSPVERSION: - case BSP2VERSION: - case BSP2RMQVERSION: - case BSPHLVERSION: - return true; - case Q2_BSPVERSION: - return true; - default: - return false; + for (const bspversion_t *bspver : bspversions) { + if (bspver->ident == ident && bspver->version == version) { + *out_version = bspver; + return true; + } } + + return false; } /* @@ -568,6 +570,200 @@ void Q2_SwapBSPFile (q2bsp_t *bsp, qboolean todisk) } } +/* +============= +Q2_Qbism_SwapBSPFile + +Byte swaps all data in a bsp file. +============= +*/ +void Q2_Qbism_SwapBSPFile (q2bsp_qbism_t *bsp, qboolean todisk) +{ + int i, j; + q2_dmodel_t *d; + + + // models + for (i=0 ; inummodels ; i++) + { + d = &bsp->dmodels[i]; + + d->firstface = LittleLong (d->firstface); + d->numfaces = LittleLong (d->numfaces); + d->headnode = LittleLong (d->headnode); + + for (j=0 ; j<3 ; j++) + { + d->mins[j] = LittleFloat(d->mins[j]); + d->maxs[j] = LittleFloat(d->maxs[j]); + d->origin[j] = LittleFloat(d->origin[j]); + } + } + + // + // vertexes + // + for (i=0 ; inumvertexes ; i++) + { + for (j=0 ; j<3 ; j++) + bsp->dvertexes[i].point[j] = LittleFloat (bsp->dvertexes[i].point[j]); + } + + // + // planes + // + for (i=0 ; inumplanes ; i++) + { + for (j=0 ; j<3 ; j++) + bsp->dplanes[i].normal[j] = LittleFloat (bsp->dplanes[i].normal[j]); + bsp->dplanes[i].dist = LittleFloat (bsp->dplanes[i].dist); + bsp->dplanes[i].type = LittleLong (bsp->dplanes[i].type); + } + + // + // texinfos + // + for (i=0 ; inumtexinfo ; i++) + { + for (j=0 ; j<4 ; j++) + { + bsp->texinfo[i].vecs[0][j] = LittleFloat(bsp->texinfo[i].vecs[0][j]); + bsp->texinfo[i].vecs[1][j] = LittleFloat(bsp->texinfo[i].vecs[1][j]); + } + bsp->texinfo[i].flags = LittleLong (bsp->texinfo[i].flags); + bsp->texinfo[i].value = LittleLong (bsp->texinfo[i].value); + bsp->texinfo[i].nexttexinfo = LittleLong (bsp->texinfo[i].nexttexinfo); + } + + // + // faces + // + for (i=0 ; inumfaces ; i++) + { + bsp->dfaces[i].texinfo = LittleLong (bsp->dfaces[i].texinfo); + bsp->dfaces[i].planenum = LittleLong (bsp->dfaces[i].planenum); + bsp->dfaces[i].side = LittleLong (bsp->dfaces[i].side); + bsp->dfaces[i].lightofs = LittleLong (bsp->dfaces[i].lightofs); + bsp->dfaces[i].firstedge = LittleLong (bsp->dfaces[i].firstedge); + bsp->dfaces[i].numedges = LittleLong (bsp->dfaces[i].numedges); + } + + // + // nodes + // + for (i=0 ; inumnodes ; i++) + { + bsp->dnodes[i].planenum = LittleLong (bsp->dnodes[i].planenum); + for (j=0 ; j<3 ; j++) + { + bsp->dnodes[i].mins[j] = LittleFloat (bsp->dnodes[i].mins[j]); + bsp->dnodes[i].maxs[j] = LittleFloat (bsp->dnodes[i].maxs[j]); + } + bsp->dnodes[i].children[0] = LittleLong (bsp->dnodes[i].children[0]); + bsp->dnodes[i].children[1] = LittleLong (bsp->dnodes[i].children[1]); + bsp->dnodes[i].firstface = LittleLong (bsp->dnodes[i].firstface); + bsp->dnodes[i].numfaces = LittleLong (bsp->dnodes[i].numfaces); + } + + // + // leafs + // + for (i=0 ; inumleafs ; i++) + { + bsp->dleafs[i].contents = LittleLong (bsp->dleafs[i].contents); + bsp->dleafs[i].cluster = LittleLong (bsp->dleafs[i].cluster); + bsp->dleafs[i].area = LittleLong (bsp->dleafs[i].area); + for (j=0 ; j<3 ; j++) + { + bsp->dleafs[i].mins[j] = LittleFloat (bsp->dleafs[i].mins[j]); + bsp->dleafs[i].maxs[j] = LittleFloat (bsp->dleafs[i].maxs[j]); + } + + bsp->dleafs[i].firstleafface = LittleLong (bsp->dleafs[i].firstleafface); + bsp->dleafs[i].numleaffaces = LittleLong (bsp->dleafs[i].numleaffaces); + bsp->dleafs[i].firstleafbrush = LittleLong (bsp->dleafs[i].firstleafbrush); + bsp->dleafs[i].numleafbrushes = LittleLong (bsp->dleafs[i].numleafbrushes); + } + + // + // leaffaces + // + for (i=0 ; inumleaffaces ; i++) + bsp->dleaffaces[i] = LittleLong (bsp->dleaffaces[i]); + + // + // leafbrushes + // + for (i=0 ; inumleafbrushes ; i++) + bsp->dleafbrushes[i] = LittleLong (bsp->dleafbrushes[i]); + + // + // surfedges + // + for (i=0 ; inumsurfedges ; i++) + bsp->dsurfedges[i] = LittleLong (bsp->dsurfedges[i]); + + // + // edges + // + for (i=0 ; inumedges ; i++) + { + bsp->dedges[i].v[0] = LittleLong (bsp->dedges[i].v[0]); + bsp->dedges[i].v[1] = LittleLong (bsp->dedges[i].v[1]); + } + + // + // brushes + // + for (i=0 ; inumbrushes ; i++) + { + bsp->dbrushes[i].firstside = LittleLong (bsp->dbrushes[i].firstside); + bsp->dbrushes[i].numsides = LittleLong (bsp->dbrushes[i].numsides); + bsp->dbrushes[i].contents = LittleLong (bsp->dbrushes[i].contents); + } + + // + // areas + // + for (i=0 ; inumareas ; i++) + { + bsp->dareas[i].numareaportals = LittleLong (bsp->dareas[i].numareaportals); + bsp->dareas[i].firstareaportal = LittleLong (bsp->dareas[i].firstareaportal); + } + + // + // areasportals + // + for (i=0 ; inumareaportals ; i++) + { + bsp->dareaportals[i].portalnum = LittleLong (bsp->dareaportals[i].portalnum); + bsp->dareaportals[i].otherarea = LittleLong (bsp->dareaportals[i].otherarea); + } + + // + // brushsides + // + for (i=0 ; inumbrushsides ; i++) + { + bsp->dbrushsides[i].planenum = LittleLong (bsp->dbrushsides[i].planenum); + bsp->dbrushsides[i].texinfo = LittleLong (bsp->dbrushsides[i].texinfo); + } + + // + // visibility + // + if (todisk) + j = bsp->dvis->numclusters; + else + j = LittleLong(bsp->dvis->numclusters); + bsp->dvis->numclusters = LittleLong (bsp->dvis->numclusters); + for (i=0 ; idvis->bitofs[i][0] = LittleLong (bsp->dvis->bitofs[i][0]); + bsp->dvis->bitofs[i][1] = LittleLong (bsp->dvis->bitofs[i][1]); + } +} + /* * ============= * SwapBSPFile @@ -577,15 +773,17 @@ void Q2_SwapBSPFile (q2bsp_t *bsp, qboolean todisk) static void SwapBSPFile(bspdata_t *bspdata, swaptype_t swap) { - if (bspdata->version == Q2_BSPVERSION) { + if (bspdata->version == &bspver_q2) { q2bsp_t *bsp = &bspdata->data.q2bsp; - Q2_SwapBSPFile(bsp, swap == TO_DISK); - + return; + } else if (bspdata->version == &bspver_qbism) { + q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; + Q2_Qbism_SwapBSPFile(bsp, swap == TO_DISK); return; } - if (bspdata->version == BSPVERSION || bspdata->version == BSPHLVERSION) { + if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { bsp29_t *bsp = &bspdata->data.bsp29; SwapBSPVertexes(bsp->numvertexes, bsp->dvertexes); @@ -604,7 +802,7 @@ SwapBSPFile(bspdata_t *bspdata, swaptype_t swap) return; } - if (bspdata->version == BSP2RMQVERSION) { + if (bspdata->version == &bspver_bsp2rmq) { bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; SwapBSPVertexes(bsp->numvertexes, bsp->dvertexes); @@ -623,7 +821,7 @@ SwapBSPFile(bspdata_t *bspdata, swaptype_t swap) return; } - if (bspdata->version == BSP2VERSION) { + if (bspdata->version == &bspver_bsp2) { bsp2_t *bsp = &bspdata->data.bsp2; SwapBSPVertexes(bsp->numvertexes, bsp->dvertexes); @@ -815,6 +1013,33 @@ Q2BSPtoM_Leafs(const q2_dleaf_t *dleafsq2, int numleafs) { return newdata; } +static mleaf_t * +Q2BSP_QBSPtoM_Leafs(const q2_dleaf_qbism_t *dleafsq2, int numleafs) { + const q2_dleaf_qbism_t *dleafq2 = dleafsq2; + mleaf_t *newdata, *mleaf; + int i, j; + + newdata = mleaf = (mleaf_t *)calloc(numleafs, sizeof(*mleaf)); + + for (i = 0; i < numleafs; i++, dleafq2++, mleaf++) { + mleaf->contents = dleafq2->contents; + mleaf->cluster = dleafq2->cluster; + mleaf->area = dleafq2->area; + + for (j = 0; j < 3; j++) { + mleaf->mins[j] = dleafq2->mins[j]; + mleaf->maxs[j] = dleafq2->maxs[j]; + } + mleaf->firstmarksurface = dleafq2->firstleafface; + mleaf->nummarksurfaces = dleafq2->numleaffaces; + + mleaf->firstleafbrush = dleafq2->firstleafbrush; + mleaf->numleafbrushes = dleafq2->numleafbrushes; + } + + return newdata; +} + static q2_dleaf_t * MBSPtoQ2_Leafs(const mleaf_t *mleafs, int numleafs) { const mleaf_t *mleaf = mleafs; @@ -842,6 +1067,33 @@ MBSPtoQ2_Leafs(const mleaf_t *mleafs, int numleafs) { return newdata; } +static q2_dleaf_qbism_t * +MBSPtoQ2_Qbism_Leafs(const mleaf_t *mleafs, int numleafs) { + const mleaf_t *mleaf = mleafs; + q2_dleaf_qbism_t *newdata, *dleafq2; + int i, j; + + newdata = dleafq2 = (q2_dleaf_qbism_t *)calloc(numleafs, sizeof(*dleafq2)); + + for (i = 0; i < numleafs; i++, mleaf++, dleafq2++) { + dleafq2->contents = mleaf->contents; + dleafq2->cluster = mleaf->cluster; + dleafq2->area = mleaf->area; + + for (j = 0; j < 3; j++) { + dleafq2->mins[j] = mleaf->mins[j]; + dleafq2->maxs[j] = mleaf->maxs[j]; + } + dleafq2->firstleafface = mleaf->firstmarksurface; + dleafq2->numleaffaces = mleaf->nummarksurfaces; + + dleafq2->firstleafbrush = mleaf->firstleafbrush; + dleafq2->numleafbrushes = mleaf->numleafbrushes; + } + + return newdata; +} + static bsp2_dnode_t * Q2BSPto2_Nodes(const q2_dnode_t *dnodesq2, int numnodes) { const q2_dnode_t *dnodeq2 = dnodesq2; @@ -910,6 +1162,28 @@ Q2BSPto2_Faces(const q2_dface_t *dfacesq2, int numfaces) { return newdata; } +static bsp2_dface_t * +Q2BSP_QBSPto2_Faces(const q2_dface_qbism_t *dfacesq2, int numfaces) { + const q2_dface_qbism_t *dfaceq2 = dfacesq2; + bsp2_dface_t *newdata, *dface2; + int i, j; + + newdata = dface2 = static_cast(malloc(numfaces * sizeof(*dface2))); + + for (i = 0; i < numfaces; i++, dfaceq2++, dface2++) { + dface2->planenum = dfaceq2->planenum; + dface2->side = dfaceq2->side; + dface2->firstedge = dfaceq2->firstedge; + dface2->numedges = dfaceq2->numedges; + dface2->texinfo = dfaceq2->texinfo; + for (j = 0; j < MAXLIGHTMAPS; j++) + dface2->styles[j] = dfaceq2->styles[j]; + dface2->lightofs = dfaceq2->lightofs; + } + + return newdata; +} + static q2_dface_t * BSP2toQ2_Faces(const bsp2_dface_t *dfaces2, int numfaces) { const bsp2_dface_t *dface2 = dfaces2; @@ -932,6 +1206,28 @@ BSP2toQ2_Faces(const bsp2_dface_t *dfaces2, int numfaces) { return newdata; } +static q2_dface_qbism_t * +BSP2toQ2_Qbism_Faces(const bsp2_dface_t *dfaces2, int numfaces) { + const bsp2_dface_t *dface2 = dfaces2; + q2_dface_qbism_t *newdata, *dfaceq2; + int i, j; + + newdata = dfaceq2 = static_cast(malloc(numfaces * sizeof(*dfaceq2))); + + for (i = 0; i < numfaces; i++, dface2++, dfaceq2++) { + dfaceq2->planenum = dface2->planenum; + dfaceq2->side = dface2->side; + dfaceq2->firstedge = dface2->firstedge; + dfaceq2->numedges = dface2->numedges; + dfaceq2->texinfo = dface2->texinfo; + for (j = 0; j < MAXLIGHTMAPS; j++) + dfaceq2->styles[j] = dface2->styles[j]; + dfaceq2->lightofs = dface2->lightofs; + } + + return newdata; +} + static gtexinfo_t * Q2BSPtoM_Texinfo(const q2_texinfo_t *dtexinfosq2, int numtexinfos) { const q2_texinfo_t *dtexinfoq2 = dtexinfosq2; @@ -1417,9 +1713,37 @@ static bsp2_dnode_t *BSP2_CopyNodes(const bsp2_dnode_t *dnodes, int numnodes) return (bsp2_dnode_t *)CopyArray(dnodes, numnodes, sizeof(*dnodes)); } -static uint16_t *Q2BSP_CopyLeafBrushes(const uint16_t *leafbrushes, int count) +static uint32_t *Q2BSPtoM_CopyLeafBrushes(const uint16_t *leafbrushes, int count) { - return (uint16_t *)CopyArray(leafbrushes, count, sizeof(*leafbrushes)); + const uint16_t *leafbrush = leafbrushes; + uint32_t *newdata, *leafbrushes2; + int i; + + newdata = leafbrushes2 = static_cast(malloc(count * sizeof(*leafbrushes2))); + + for (i = 0; i < count; i++, leafbrush++, leafbrushes2++) + *leafbrushes2 = *leafbrush; + + return newdata; +} + +static uint16_t *MBSPtoQ2_CopyLeafBrushes(const uint32_t *leafbrushes, int count) +{ + const uint32_t *leafbrush = leafbrushes; + uint16_t *newdata, *leafbrushes2; + int i; + + newdata = leafbrushes2 = static_cast(malloc(count * sizeof(*leafbrushes2))); + + for (i = 0; i < count; i++, leafbrush++, leafbrushes2++) + *leafbrushes2 = *leafbrush; + + return newdata; +} + +static uint32_t *Q2BSP_Qbism_CopyLeafBrushes(const uint32_t *leafbrushes, int count) +{ + return (uint32_t *)CopyArray(leafbrushes, count, sizeof(*leafbrushes)); } static darea_t *Q2BSP_CopyAreas(const darea_t *areas, int count) @@ -1437,9 +1761,41 @@ static dbrush_t *Q2BSP_CopyBrushes(const dbrush_t *brushes, int count) return (dbrush_t *)CopyArray(brushes, count, sizeof(*brushes)); } -static dbrushside_t *Q2BSP_CopyBrushSides(const dbrushside_t *dbrushsides, int count) +static q2_dbrushside_qbism_t *Q2BSPtoM_CopyBrushSides(const dbrushside_t *dbrushsides, int count) { - return (dbrushside_t *)CopyArray(dbrushsides, count, sizeof(*dbrushsides)); + const dbrushside_t *brushside = dbrushsides; + q2_dbrushside_qbism_t *newdata, *brushsides2; + int i; + + newdata = brushsides2 = static_cast(malloc(count * sizeof(*brushsides2))); + + for (i = 0; i < count; i++, brushside++, brushsides2++) { + brushsides2->planenum = brushside->planenum; + brushsides2->texinfo = brushside->texinfo; + } + + return newdata; +} + +static q2_dbrushside_qbism_t *Q2BSP_Qbism_CopyBrushSides(const q2_dbrushside_qbism_t *brushsides, int count) +{ + return (q2_dbrushside_qbism_t *)CopyArray(brushsides, count, sizeof(*brushsides)); +} + +static dbrushside_t *MBSPtoQ2_CopyBrushSides(const q2_dbrushside_qbism_t *dbrushsides, int count) +{ + const q2_dbrushside_qbism_t *brushside = dbrushsides; + dbrushside_t *newdata, *brushsides2; + int i; + + newdata = brushsides2 = static_cast(malloc(count * sizeof(*brushsides2))); + + for (i = 0; i < count; i++, brushside++, brushsides2++) { + brushsides2->planenum = brushside->planenum; + brushsides2->texinfo = brushside->texinfo; + } + + return newdata; } @@ -1532,6 +1888,29 @@ static void FreeQ2BSP(q2bsp_t *bsp) memset(bsp, 0, sizeof(*bsp)); } +static void FreeQ2BSP_QBSP(q2bsp_qbism_t *bsp) +{ + free(bsp->dmodels); + free(bsp->dvis); + free(bsp->dlightdata); + free(bsp->dentdata); + free(bsp->dleafs); + free(bsp->dplanes); + free(bsp->dvertexes); + free(bsp->dnodes); + free(bsp->texinfo); + free(bsp->dfaces); + free(bsp->dedges); + free(bsp->dleaffaces); + free(bsp->dleafbrushes); + free(bsp->dsurfedges); + free(bsp->dareas); + free(bsp->dareaportals); + free(bsp->dbrushes); + free(bsp->dbrushsides); + memset(bsp, 0, sizeof(*bsp)); +} + static void FreeMBSP(mbsp_t *bsp) { free(bsp->dmodels); @@ -1558,6 +1937,13 @@ static void FreeMBSP(mbsp_t *bsp) memset(bsp, 0, sizeof(*bsp)); } +inline void +ConvertBSPToMFormatComplete(const bspversion_t **mbsp_loadversion, const bspversion_t *version, bspdata_t *bspdata) +{ + *mbsp_loadversion = bspdata->version; + bspdata->version = version; +} + /* * ========================================================================= * ConvertBSPFormat @@ -1566,440 +1952,547 @@ static void FreeMBSP(mbsp_t *bsp) * ========================================================================= */ void -ConvertBSPFormat(int32_t version, bspdata_t *bspdata) +ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) { - if (bspdata->version == version) + if (bspdata->version == to_version) return; // conversions to GENERIC_BSP + if (to_version == &bspver_generic) { + if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { + const bsp29_t *bsp29 = &bspdata->data.bsp29; + mbsp_t *mbsp = &bspdata->data.mbsp; + + memset(mbsp, 0, sizeof(*mbsp)); + + // copy counts + mbsp->nummodels = bsp29->nummodels; + mbsp->visdatasize = bsp29->visdatasize; + mbsp->lightdatasize = bsp29->lightdatasize; + mbsp->texdatasize = bsp29->texdatasize; + mbsp->entdatasize = bsp29->entdatasize; + mbsp->numleafs = bsp29->numleafs; + mbsp->numplanes = bsp29->numplanes; + mbsp->numvertexes = bsp29->numvertexes; + mbsp->numnodes = bsp29->numnodes; + mbsp->numtexinfo = bsp29->numtexinfo; + mbsp->numfaces = bsp29->numfaces; + mbsp->numclipnodes = bsp29->numclipnodes; + mbsp->numedges = bsp29->numedges; + mbsp->numleaffaces = bsp29->nummarksurfaces; + mbsp->numsurfedges = bsp29->numsurfedges; + + // copy or convert data + mbsp->dmodels = BSP29_CopyModels(bsp29->dmodels, bsp29->nummodels); + mbsp->dvisdata = BSP29_CopyVisData(bsp29->dvisdata, bsp29->visdatasize); + mbsp->dlightdata = BSP29_CopyLightData(bsp29->dlightdata, bsp29->lightdatasize); + mbsp->dtexdata = BSP29_CopyTexData(bsp29->dtexdata, bsp29->texdatasize); + mbsp->dentdata = BSP29_CopyEntData(bsp29->dentdata, bsp29->entdatasize); + mbsp->dleafs = BSP29toM_Leafs(bsp29->dleafs, bsp29->numleafs); + mbsp->dplanes = BSP29_CopyPlanes(bsp29->dplanes, bsp29->numplanes); + mbsp->dvertexes = BSP29_CopyVertexes(bsp29->dvertexes, bsp29->numvertexes); + mbsp->dnodes = BSP29to2_Nodes(bsp29->dnodes, bsp29->numnodes); + mbsp->texinfo = BSP29toM_Texinfo(bsp29->texinfo, bsp29->numtexinfo); + mbsp->dfaces = BSP29to2_Faces(bsp29->dfaces, bsp29->numfaces); + mbsp->dclipnodes = BSP29to2_Clipnodes(bsp29->dclipnodes, bsp29->numclipnodes); + mbsp->dedges = BSP29to2_Edges(bsp29->dedges, bsp29->numedges); + mbsp->dleaffaces = BSP29to2_Marksurfaces(bsp29->dmarksurfaces, bsp29->nummarksurfaces); + mbsp->dsurfedges = BSP29_CopySurfedges(bsp29->dsurfedges, bsp29->numsurfedges); + + /* Free old data */ + FreeBSP29((bsp29_t *)bsp29); + + /* Conversion complete! */ + ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); + + return; + } - if ((bspdata->version == BSPVERSION || bspdata->version == BSPHLVERSION) && version == GENERIC_BSP) { - const bsp29_t *bsp29 = &bspdata->data.bsp29; - mbsp_t *mbsp = &bspdata->data.mbsp; + else if (bspdata->version == &bspver_q2) { + const q2bsp_t *q2bsp = &bspdata->data.q2bsp; + mbsp_t *mbsp = &bspdata->data.mbsp; - memset(mbsp, 0, sizeof(*mbsp)); + memset(mbsp, 0, sizeof(*mbsp)); - // copy counts - mbsp->nummodels = bsp29->nummodels; - mbsp->visdatasize = bsp29->visdatasize; - mbsp->lightdatasize = bsp29->lightdatasize; - mbsp->texdatasize = bsp29->texdatasize; - mbsp->entdatasize = bsp29->entdatasize; - mbsp->numleafs = bsp29->numleafs; - mbsp->numplanes = bsp29->numplanes; - mbsp->numvertexes = bsp29->numvertexes; - mbsp->numnodes = bsp29->numnodes; - mbsp->numtexinfo = bsp29->numtexinfo; - mbsp->numfaces = bsp29->numfaces; - mbsp->numclipnodes = bsp29->numclipnodes; - mbsp->numedges = bsp29->numedges; - mbsp->numleaffaces = bsp29->nummarksurfaces; - mbsp->numsurfedges = bsp29->numsurfedges; + // copy counts + mbsp->nummodels = q2bsp->nummodels; + mbsp->visdatasize = q2bsp->visdatasize; + mbsp->lightdatasize = q2bsp->lightdatasize; + mbsp->entdatasize = q2bsp->entdatasize; + mbsp->numleafs = q2bsp->numleafs; + mbsp->numplanes = q2bsp->numplanes; + mbsp->numvertexes = q2bsp->numvertexes; + mbsp->numnodes = q2bsp->numnodes; + mbsp->numtexinfo = q2bsp->numtexinfo; + mbsp->numfaces = q2bsp->numfaces; + mbsp->numedges = q2bsp->numedges; + mbsp->numleaffaces = q2bsp->numleaffaces; + mbsp->numleafbrushes = q2bsp->numleafbrushes; + mbsp->numsurfedges = q2bsp->numsurfedges; + mbsp->numareas = q2bsp->numareas; + mbsp->numareaportals = q2bsp->numareaportals; + mbsp->numbrushes = q2bsp->numbrushes; + mbsp->numbrushsides = q2bsp->numbrushsides; - // copy or convert data - mbsp->dmodels = BSP29_CopyModels(bsp29->dmodels, bsp29->nummodels); - mbsp->dvisdata = BSP29_CopyVisData(bsp29->dvisdata, bsp29->visdatasize); - mbsp->dlightdata = BSP29_CopyLightData(bsp29->dlightdata, bsp29->lightdatasize); - mbsp->dtexdata = BSP29_CopyTexData(bsp29->dtexdata, bsp29->texdatasize); - mbsp->dentdata = BSP29_CopyEntData(bsp29->dentdata, bsp29->entdatasize); - mbsp->dleafs = BSP29toM_Leafs(bsp29->dleafs, bsp29->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(bsp29->dplanes, bsp29->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(bsp29->dvertexes, bsp29->numvertexes); - mbsp->dnodes = BSP29to2_Nodes(bsp29->dnodes, bsp29->numnodes); - mbsp->texinfo = BSP29toM_Texinfo(bsp29->texinfo, bsp29->numtexinfo); - mbsp->dfaces = BSP29to2_Faces(bsp29->dfaces, bsp29->numfaces); - mbsp->dclipnodes = BSP29to2_Clipnodes(bsp29->dclipnodes, bsp29->numclipnodes); - mbsp->dedges = BSP29to2_Edges(bsp29->dedges, bsp29->numedges); - mbsp->dleaffaces = BSP29to2_Marksurfaces(bsp29->dmarksurfaces, bsp29->nummarksurfaces); - mbsp->dsurfedges = BSP29_CopySurfedges(bsp29->dsurfedges, bsp29->numsurfedges); + // copy or convert data + mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); + mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); + mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); + mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); + mbsp->dleafs = Q2BSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); + mbsp->dplanes = BSP29_CopyPlanes(q2bsp->dplanes, q2bsp->numplanes); + mbsp->dvertexes = BSP29_CopyVertexes(q2bsp->dvertexes, q2bsp->numvertexes); + mbsp->dnodes = Q2BSPto2_Nodes(q2bsp->dnodes, q2bsp->numnodes); + mbsp->texinfo = Q2BSPtoM_Texinfo(q2bsp->texinfo, q2bsp->numtexinfo); + mbsp->dfaces = Q2BSPto2_Faces(q2bsp->dfaces, q2bsp->numfaces); + mbsp->dedges = BSP29to2_Edges(q2bsp->dedges, q2bsp->numedges); + mbsp->dleaffaces = BSP29to2_Marksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); + mbsp->dleafbrushes = Q2BSPtoM_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); + mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); - /* Free old data */ - FreeBSP29((bsp29_t *)bsp29); + mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); + mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); - /* Conversion complete! */ - mbsp->loadversion = bspdata->version; - bspdata->version = version; + mbsp->dbrushes = Q2BSP_CopyBrushes(q2bsp->dbrushes, q2bsp->numbrushes); + mbsp->dbrushsides = Q2BSPtoM_CopyBrushSides(q2bsp->dbrushsides, q2bsp->numbrushsides); - return; - } - - if (bspdata->version == Q2_BSPVERSION && version == GENERIC_BSP) { - const q2bsp_t *q2bsp = &bspdata->data.q2bsp; - mbsp_t *mbsp = &bspdata->data.mbsp; + /* Free old data */ + FreeQ2BSP((q2bsp_t *)q2bsp); - memset(mbsp, 0, sizeof(*mbsp)); - - // copy counts - mbsp->nummodels = q2bsp->nummodels; - mbsp->visdatasize = q2bsp->visdatasize; - mbsp->lightdatasize = q2bsp->lightdatasize; - mbsp->entdatasize = q2bsp->entdatasize; - mbsp->numleafs = q2bsp->numleafs; - mbsp->numplanes = q2bsp->numplanes; - mbsp->numvertexes = q2bsp->numvertexes; - mbsp->numnodes = q2bsp->numnodes; - mbsp->numtexinfo = q2bsp->numtexinfo; - mbsp->numfaces = q2bsp->numfaces; - mbsp->numedges = q2bsp->numedges; - mbsp->numleaffaces = q2bsp->numleaffaces; - mbsp->numleafbrushes = q2bsp->numleafbrushes; - mbsp->numsurfedges = q2bsp->numsurfedges; - mbsp->numareas = q2bsp->numareas; - mbsp->numareaportals = q2bsp->numareaportals; - mbsp->numbrushes = q2bsp->numbrushes; - mbsp->numbrushsides = q2bsp->numbrushsides; - - // copy or convert data - mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); - mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); - mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); - mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); - mbsp->dleafs = Q2BSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(q2bsp->dplanes, q2bsp->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(q2bsp->dvertexes, q2bsp->numvertexes); - mbsp->dnodes = Q2BSPto2_Nodes(q2bsp->dnodes, q2bsp->numnodes); - mbsp->texinfo = Q2BSPtoM_Texinfo(q2bsp->texinfo, q2bsp->numtexinfo); - mbsp->dfaces = Q2BSPto2_Faces(q2bsp->dfaces, q2bsp->numfaces); - mbsp->dedges = BSP29to2_Edges(q2bsp->dedges, q2bsp->numedges); - mbsp->dleaffaces = BSP29to2_Marksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); - mbsp->dleafbrushes = Q2BSP_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); - mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); - - mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); - mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); - - mbsp->dbrushes = Q2BSP_CopyBrushes(q2bsp->dbrushes, q2bsp->numbrushes); - mbsp->dbrushsides = Q2BSP_CopyBrushSides(q2bsp->dbrushsides, q2bsp->numbrushsides); - - /* Free old data */ - FreeQ2BSP((q2bsp_t *)q2bsp); - - /* Conversion complete! */ - mbsp->loadversion = bspdata->version; - bspdata->version = version; - - return; - } - - if (bspdata->version == BSP2RMQVERSION && version == GENERIC_BSP) { - const bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); - - // copy counts - mbsp->nummodels = bsp2rmq->nummodels; - mbsp->visdatasize = bsp2rmq->visdatasize; - mbsp->lightdatasize = bsp2rmq->lightdatasize; - mbsp->texdatasize = bsp2rmq->texdatasize; - mbsp->entdatasize = bsp2rmq->entdatasize; - mbsp->numleafs = bsp2rmq->numleafs; - mbsp->numplanes = bsp2rmq->numplanes; - mbsp->numvertexes = bsp2rmq->numvertexes; - mbsp->numnodes = bsp2rmq->numnodes; - mbsp->numtexinfo = bsp2rmq->numtexinfo; - mbsp->numfaces = bsp2rmq->numfaces; - mbsp->numclipnodes = bsp2rmq->numclipnodes; - mbsp->numedges = bsp2rmq->numedges; - mbsp->numleaffaces = bsp2rmq->nummarksurfaces; - mbsp->numsurfedges = bsp2rmq->numsurfedges; - - // copy or convert data - mbsp->dmodels = BSP29_CopyModels(bsp2rmq->dmodels, bsp2rmq->nummodels); - mbsp->dvisdata = BSP29_CopyVisData(bsp2rmq->dvisdata, bsp2rmq->visdatasize); - mbsp->dlightdata = BSP29_CopyLightData(bsp2rmq->dlightdata, bsp2rmq->lightdatasize); - mbsp->dtexdata = BSP29_CopyTexData(bsp2rmq->dtexdata, bsp2rmq->texdatasize); - mbsp->dentdata = BSP29_CopyEntData(bsp2rmq->dentdata, bsp2rmq->entdatasize); - mbsp->dleafs = BSP2rmqtoM_Leafs(bsp2rmq->dleafs, bsp2rmq->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(bsp2rmq->dplanes, bsp2rmq->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(bsp2rmq->dvertexes, bsp2rmq->numvertexes); - mbsp->dnodes = BSP2rmqto2_Nodes(bsp2rmq->dnodes, bsp2rmq->numnodes); - mbsp->texinfo = BSP29toM_Texinfo(bsp2rmq->texinfo, bsp2rmq->numtexinfo); - mbsp->dfaces = BSP2_CopyFaces(bsp2rmq->dfaces, bsp2rmq->numfaces); - mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2rmq->dclipnodes, bsp2rmq->numclipnodes); - mbsp->dedges = BSP2_CopyEdges(bsp2rmq->dedges, bsp2rmq->numedges); - mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2rmq->dmarksurfaces, bsp2rmq->nummarksurfaces); - mbsp->dsurfedges = BSP29_CopySurfedges(bsp2rmq->dsurfedges, bsp2rmq->numsurfedges); - - /* Free old data */ - FreeBSP2RMQ((bsp2rmq_t *)bsp2rmq); - - /* Conversion complete! */ - mbsp->loadversion = bspdata->version; - bspdata->version = version; - - return; - } - - if (bspdata->version == BSP2VERSION && version == GENERIC_BSP) { - const bsp2_t *bsp2 = &bspdata->data.bsp2; - mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(mbsp, 0, sizeof(*mbsp)); - - // copy counts - mbsp->nummodels = bsp2->nummodels; - mbsp->visdatasize = bsp2->visdatasize; - mbsp->lightdatasize = bsp2->lightdatasize; - mbsp->texdatasize = bsp2->texdatasize; - mbsp->entdatasize = bsp2->entdatasize; - mbsp->numleafs = bsp2->numleafs; - mbsp->numplanes = bsp2->numplanes; - mbsp->numvertexes = bsp2->numvertexes; - mbsp->numnodes = bsp2->numnodes; - mbsp->numtexinfo = bsp2->numtexinfo; - mbsp->numfaces = bsp2->numfaces; - mbsp->numclipnodes = bsp2->numclipnodes; - mbsp->numedges = bsp2->numedges; - mbsp->numleaffaces = bsp2->nummarksurfaces; - mbsp->numsurfedges = bsp2->numsurfedges; - - // copy or convert data - mbsp->dmodels = BSP29_CopyModels(bsp2->dmodels, bsp2->nummodels); - mbsp->dvisdata = BSP29_CopyVisData(bsp2->dvisdata, bsp2->visdatasize); - mbsp->dlightdata = BSP29_CopyLightData(bsp2->dlightdata, bsp2->lightdatasize); - mbsp->dtexdata = BSP29_CopyTexData(bsp2->dtexdata, bsp2->texdatasize); - mbsp->dentdata = BSP29_CopyEntData(bsp2->dentdata, bsp2->entdatasize); - mbsp->dleafs = BSP2toM_Leafs(bsp2->dleafs, bsp2->numleafs); - mbsp->dplanes = BSP29_CopyPlanes(bsp2->dplanes, bsp2->numplanes); - mbsp->dvertexes = BSP29_CopyVertexes(bsp2->dvertexes, bsp2->numvertexes); - mbsp->dnodes = BSP2_CopyNodes(bsp2->dnodes, bsp2->numnodes); - mbsp->texinfo = BSP29toM_Texinfo(bsp2->texinfo, bsp2->numtexinfo); - mbsp->dfaces = BSP2_CopyFaces(bsp2->dfaces, bsp2->numfaces); - mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2->dclipnodes, bsp2->numclipnodes); - mbsp->dedges = BSP2_CopyEdges(bsp2->dedges, bsp2->numedges); - mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2->dmarksurfaces, bsp2->nummarksurfaces); - mbsp->dsurfedges = BSP29_CopySurfedges(bsp2->dsurfedges, bsp2->numsurfedges); - - /* Free old data */ - FreeBSP2((bsp2_t *)bsp2); - - /* Conversion complete! */ - mbsp->loadversion = bspdata->version; - bspdata->version = version; + /* Conversion complete! */ + ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); - return; - } + return; + } else if (bspdata->version == &bspver_qbism) { + const q2bsp_qbism_t *q2bsp = &bspdata->data.q2bsp_qbism; + mbsp_t *mbsp = &bspdata->data.mbsp; + + memset(mbsp, 0, sizeof(*mbsp)); + + // copy counts + mbsp->nummodels = q2bsp->nummodels; + mbsp->visdatasize = q2bsp->visdatasize; + mbsp->lightdatasize = q2bsp->lightdatasize; + mbsp->entdatasize = q2bsp->entdatasize; + mbsp->numleafs = q2bsp->numleafs; + mbsp->numplanes = q2bsp->numplanes; + mbsp->numvertexes = q2bsp->numvertexes; + mbsp->numnodes = q2bsp->numnodes; + mbsp->numtexinfo = q2bsp->numtexinfo; + mbsp->numfaces = q2bsp->numfaces; + mbsp->numedges = q2bsp->numedges; + mbsp->numleaffaces = q2bsp->numleaffaces; + mbsp->numleafbrushes = q2bsp->numleafbrushes; + mbsp->numsurfedges = q2bsp->numsurfedges; + mbsp->numareas = q2bsp->numareas; + mbsp->numareaportals = q2bsp->numareaportals; + mbsp->numbrushes = q2bsp->numbrushes; + mbsp->numbrushsides = q2bsp->numbrushsides; + + // copy or convert data + mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); + mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); + mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); + mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); + mbsp->dleafs = Q2BSP_QBSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); + mbsp->dplanes = BSP29_CopyPlanes(q2bsp->dplanes, q2bsp->numplanes); + mbsp->dvertexes = BSP29_CopyVertexes(q2bsp->dvertexes, q2bsp->numvertexes); + mbsp->dnodes = BSP2_CopyNodes(q2bsp->dnodes, q2bsp->numnodes); + mbsp->texinfo = Q2BSPtoM_Texinfo(q2bsp->texinfo, q2bsp->numtexinfo); + mbsp->dfaces = Q2BSP_QBSPto2_Faces(q2bsp->dfaces, q2bsp->numfaces); + mbsp->dedges = BSP2_CopyEdges(q2bsp->dedges, q2bsp->numedges); + mbsp->dleaffaces = BSP2_CopyMarksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); + mbsp->dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); + mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); + + mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); + mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); + + mbsp->dbrushes = Q2BSP_CopyBrushes(q2bsp->dbrushes, q2bsp->numbrushes); + mbsp->dbrushsides = Q2BSP_Qbism_CopyBrushSides(q2bsp->dbrushsides, q2bsp->numbrushsides); + + /* Free old data */ + FreeQ2BSP_QBSP((q2bsp_qbism_t *)q2bsp); + + /* Conversion complete! */ + ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); + + return; + } + else if (bspdata->version == &bspver_bsp2rmq) { + const bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; + mbsp_t *mbsp = &bspdata->data.mbsp; + + memset(mbsp, 0, sizeof(*mbsp)); + + // copy counts + mbsp->nummodels = bsp2rmq->nummodels; + mbsp->visdatasize = bsp2rmq->visdatasize; + mbsp->lightdatasize = bsp2rmq->lightdatasize; + mbsp->texdatasize = bsp2rmq->texdatasize; + mbsp->entdatasize = bsp2rmq->entdatasize; + mbsp->numleafs = bsp2rmq->numleafs; + mbsp->numplanes = bsp2rmq->numplanes; + mbsp->numvertexes = bsp2rmq->numvertexes; + mbsp->numnodes = bsp2rmq->numnodes; + mbsp->numtexinfo = bsp2rmq->numtexinfo; + mbsp->numfaces = bsp2rmq->numfaces; + mbsp->numclipnodes = bsp2rmq->numclipnodes; + mbsp->numedges = bsp2rmq->numedges; + mbsp->numleaffaces = bsp2rmq->nummarksurfaces; + mbsp->numsurfedges = bsp2rmq->numsurfedges; + + // copy or convert data + mbsp->dmodels = BSP29_CopyModels(bsp2rmq->dmodels, bsp2rmq->nummodels); + mbsp->dvisdata = BSP29_CopyVisData(bsp2rmq->dvisdata, bsp2rmq->visdatasize); + mbsp->dlightdata = BSP29_CopyLightData(bsp2rmq->dlightdata, bsp2rmq->lightdatasize); + mbsp->dtexdata = BSP29_CopyTexData(bsp2rmq->dtexdata, bsp2rmq->texdatasize); + mbsp->dentdata = BSP29_CopyEntData(bsp2rmq->dentdata, bsp2rmq->entdatasize); + mbsp->dleafs = BSP2rmqtoM_Leafs(bsp2rmq->dleafs, bsp2rmq->numleafs); + mbsp->dplanes = BSP29_CopyPlanes(bsp2rmq->dplanes, bsp2rmq->numplanes); + mbsp->dvertexes = BSP29_CopyVertexes(bsp2rmq->dvertexes, bsp2rmq->numvertexes); + mbsp->dnodes = BSP2rmqto2_Nodes(bsp2rmq->dnodes, bsp2rmq->numnodes); + mbsp->texinfo = BSP29toM_Texinfo(bsp2rmq->texinfo, bsp2rmq->numtexinfo); + mbsp->dfaces = BSP2_CopyFaces(bsp2rmq->dfaces, bsp2rmq->numfaces); + mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2rmq->dclipnodes, bsp2rmq->numclipnodes); + mbsp->dedges = BSP2_CopyEdges(bsp2rmq->dedges, bsp2rmq->numedges); + mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2rmq->dmarksurfaces, bsp2rmq->nummarksurfaces); + mbsp->dsurfedges = BSP29_CopySurfedges(bsp2rmq->dsurfedges, bsp2rmq->numsurfedges); + + /* Free old data */ + FreeBSP2RMQ((bsp2rmq_t *)bsp2rmq); + + /* Conversion complete! */ + ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); + + return; + } + + else if (bspdata->version == &bspver_bsp2) { + const bsp2_t *bsp2 = &bspdata->data.bsp2; + mbsp_t *mbsp = &bspdata->data.mbsp; + + memset(mbsp, 0, sizeof(*mbsp)); + + // copy counts + mbsp->nummodels = bsp2->nummodels; + mbsp->visdatasize = bsp2->visdatasize; + mbsp->lightdatasize = bsp2->lightdatasize; + mbsp->texdatasize = bsp2->texdatasize; + mbsp->entdatasize = bsp2->entdatasize; + mbsp->numleafs = bsp2->numleafs; + mbsp->numplanes = bsp2->numplanes; + mbsp->numvertexes = bsp2->numvertexes; + mbsp->numnodes = bsp2->numnodes; + mbsp->numtexinfo = bsp2->numtexinfo; + mbsp->numfaces = bsp2->numfaces; + mbsp->numclipnodes = bsp2->numclipnodes; + mbsp->numedges = bsp2->numedges; + mbsp->numleaffaces = bsp2->nummarksurfaces; + mbsp->numsurfedges = bsp2->numsurfedges; + + // copy or convert data + mbsp->dmodels = BSP29_CopyModels(bsp2->dmodels, bsp2->nummodels); + mbsp->dvisdata = BSP29_CopyVisData(bsp2->dvisdata, bsp2->visdatasize); + mbsp->dlightdata = BSP29_CopyLightData(bsp2->dlightdata, bsp2->lightdatasize); + mbsp->dtexdata = BSP29_CopyTexData(bsp2->dtexdata, bsp2->texdatasize); + mbsp->dentdata = BSP29_CopyEntData(bsp2->dentdata, bsp2->entdatasize); + mbsp->dleafs = BSP2toM_Leafs(bsp2->dleafs, bsp2->numleafs); + mbsp->dplanes = BSP29_CopyPlanes(bsp2->dplanes, bsp2->numplanes); + mbsp->dvertexes = BSP29_CopyVertexes(bsp2->dvertexes, bsp2->numvertexes); + mbsp->dnodes = BSP2_CopyNodes(bsp2->dnodes, bsp2->numnodes); + mbsp->texinfo = BSP29toM_Texinfo(bsp2->texinfo, bsp2->numtexinfo); + mbsp->dfaces = BSP2_CopyFaces(bsp2->dfaces, bsp2->numfaces); + mbsp->dclipnodes = BSP2_CopyClipnodes(bsp2->dclipnodes, bsp2->numclipnodes); + mbsp->dedges = BSP2_CopyEdges(bsp2->dedges, bsp2->numedges); + mbsp->dleaffaces = BSP2_CopyMarksurfaces(bsp2->dmarksurfaces, bsp2->nummarksurfaces); + mbsp->dsurfedges = BSP29_CopySurfedges(bsp2->dsurfedges, bsp2->numsurfedges); + + /* Free old data */ + FreeBSP2((bsp2_t *)bsp2); + + /* Conversion complete! */ + ConvertBSPToMFormatComplete(&mbsp->loadversion, to_version, bspdata); + + return; + } + } // conversions from GENERIC_BSP + else if (bspdata->version == &bspver_generic) { + if (to_version == &bspver_q1 || to_version == &bspver_h2 || to_version == &bspver_hl) { + bsp29_t *bsp29 = &bspdata->data.bsp29; + const mbsp_t *mbsp = &bspdata->data.mbsp; + + memset(bsp29, 0, sizeof(*bsp29)); + + // copy counts + bsp29->nummodels = mbsp->nummodels; + bsp29->visdatasize = mbsp->visdatasize; + bsp29->lightdatasize = mbsp->lightdatasize; + bsp29->texdatasize = mbsp->texdatasize; + bsp29->entdatasize = mbsp->entdatasize; + bsp29->numleafs = mbsp->numleafs; + bsp29->numplanes = mbsp->numplanes; + bsp29->numvertexes = mbsp->numvertexes; + bsp29->numnodes = mbsp->numnodes; + bsp29->numtexinfo = mbsp->numtexinfo; + bsp29->numfaces = mbsp->numfaces; + bsp29->numclipnodes = mbsp->numclipnodes; + bsp29->numedges = mbsp->numedges; + bsp29->nummarksurfaces = mbsp->numleaffaces; + bsp29->numsurfedges = mbsp->numsurfedges; + + // copy or convert data + bsp29->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); + bsp29->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); + bsp29->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); + bsp29->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); + bsp29->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); + bsp29->dleafs = MBSPto29_Leafs(mbsp->dleafs, mbsp->numleafs); + bsp29->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); + bsp29->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); + bsp29->dnodes = BSP2to29_Nodes(mbsp->dnodes, mbsp->numnodes); + bsp29->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); + bsp29->dfaces = BSP2to29_Faces(mbsp->dfaces, mbsp->numfaces); + bsp29->dclipnodes = BSP2to29_Clipnodes(mbsp->dclipnodes, mbsp->numclipnodes); + bsp29->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); + bsp29->dmarksurfaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); + bsp29->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + + /* Free old data */ + FreeMBSP((mbsp_t *)mbsp); + + /* Conversion complete! */ + bspdata->version = to_version; + + return; + } - if (bspdata->version == GENERIC_BSP && (version == BSPVERSION || version == BSPHLVERSION)) { - bsp29_t *bsp29 = &bspdata->data.bsp29; - const mbsp_t *mbsp = &bspdata->data.mbsp; + else if (to_version == &bspver_q2) { + const mbsp_t *mbsp = &bspdata->data.mbsp; + q2bsp_t *q2bsp = &bspdata->data.q2bsp; - memset(bsp29, 0, sizeof(*bsp29)); + memset(q2bsp, 0, sizeof(*q2bsp)); - // copy counts - bsp29->nummodels = mbsp->nummodels; - bsp29->visdatasize = mbsp->visdatasize; - bsp29->lightdatasize = mbsp->lightdatasize; - bsp29->texdatasize = mbsp->texdatasize; - bsp29->entdatasize = mbsp->entdatasize; - bsp29->numleafs = mbsp->numleafs; - bsp29->numplanes = mbsp->numplanes; - bsp29->numvertexes = mbsp->numvertexes; - bsp29->numnodes = mbsp->numnodes; - bsp29->numtexinfo = mbsp->numtexinfo; - bsp29->numfaces = mbsp->numfaces; - bsp29->numclipnodes = mbsp->numclipnodes; - bsp29->numedges = mbsp->numedges; - bsp29->nummarksurfaces = mbsp->numleaffaces; - bsp29->numsurfedges = mbsp->numsurfedges; + // copy counts + q2bsp->nummodels = mbsp->nummodels; + q2bsp->visdatasize = mbsp->visdatasize; + q2bsp->lightdatasize = mbsp->lightdatasize; + q2bsp->entdatasize = mbsp->entdatasize; + q2bsp->numleafs = mbsp->numleafs; + q2bsp->numplanes = mbsp->numplanes; + q2bsp->numvertexes = mbsp->numvertexes; + q2bsp->numnodes = mbsp->numnodes; + q2bsp->numtexinfo = mbsp->numtexinfo; + q2bsp->numfaces = mbsp->numfaces; + q2bsp->numedges = mbsp->numedges; + q2bsp->numleaffaces = mbsp->numleaffaces; + q2bsp->numleafbrushes = mbsp->numleafbrushes; + q2bsp->numsurfedges = mbsp->numsurfedges; + q2bsp->numareas = mbsp->numareas; + q2bsp->numareaportals = mbsp->numareaportals; + q2bsp->numbrushes = mbsp->numbrushes; + q2bsp->numbrushsides = mbsp->numbrushsides; - // copy or convert data - bsp29->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); - bsp29->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); - bsp29->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - bsp29->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); - bsp29->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - bsp29->dleafs = MBSPto29_Leafs(mbsp->dleafs, mbsp->numleafs); - bsp29->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - bsp29->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - bsp29->dnodes = BSP2to29_Nodes(mbsp->dnodes, mbsp->numnodes); - bsp29->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - bsp29->dfaces = BSP2to29_Faces(mbsp->dfaces, mbsp->numfaces); - bsp29->dclipnodes = BSP2to29_Clipnodes(mbsp->dclipnodes, mbsp->numclipnodes); - bsp29->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); - bsp29->dmarksurfaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - bsp29->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + // copy or convert data + q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); + q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); + q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); + q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); + q2bsp->dleafs = MBSPtoQ2_Leafs(mbsp->dleafs, mbsp->numleafs); + q2bsp->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); + q2bsp->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); + q2bsp->dnodes = BSP2toQ2_Nodes(mbsp->dnodes, mbsp->numnodes); + q2bsp->texinfo = MBSPtoQ2_Texinfo(mbsp->texinfo, mbsp->numtexinfo); + q2bsp->dfaces = BSP2toQ2_Faces(mbsp->dfaces, mbsp->numfaces); + q2bsp->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); + q2bsp->dleaffaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); + q2bsp->dleafbrushes = MBSPtoQ2_CopyLeafBrushes(mbsp->dleafbrushes, mbsp->numleafbrushes); + q2bsp->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - /* Free old data */ - FreeMBSP((mbsp_t *)mbsp); + q2bsp->dareas = Q2BSP_CopyAreas(mbsp->dareas, mbsp->numareas); + q2bsp->dareaportals = Q2BSP_CopyAreaPortals(mbsp->dareaportals, mbsp->numareaportals); - /* Conversion complete! */ - bspdata->version = version; + q2bsp->dbrushes = Q2BSP_CopyBrushes(mbsp->dbrushes, mbsp->numbrushes); + q2bsp->dbrushsides = MBSPtoQ2_CopyBrushSides(mbsp->dbrushsides, mbsp->numbrushsides); - return; - } + /* Free old data */ + FreeMBSP((mbsp_t *)mbsp); + + /* Conversion complete! */ + bspdata->version = to_version; + + return; + } else if (to_version == &bspver_qbism) { + const mbsp_t *mbsp = &bspdata->data.mbsp; + q2bsp_qbism_t *q2bsp = &bspdata->data.q2bsp_qbism; + + memset(q2bsp, 0, sizeof(*q2bsp)); + + // copy counts + q2bsp->nummodels = mbsp->nummodels; + q2bsp->visdatasize = mbsp->visdatasize; + q2bsp->lightdatasize = mbsp->lightdatasize; + q2bsp->entdatasize = mbsp->entdatasize; + q2bsp->numleafs = mbsp->numleafs; + q2bsp->numplanes = mbsp->numplanes; + q2bsp->numvertexes = mbsp->numvertexes; + q2bsp->numnodes = mbsp->numnodes; + q2bsp->numtexinfo = mbsp->numtexinfo; + q2bsp->numfaces = mbsp->numfaces; + q2bsp->numedges = mbsp->numedges; + q2bsp->numleaffaces = mbsp->numleaffaces; + q2bsp->numleafbrushes = mbsp->numleafbrushes; + q2bsp->numsurfedges = mbsp->numsurfedges; + q2bsp->numareas = mbsp->numareas; + q2bsp->numareaportals = mbsp->numareaportals; + q2bsp->numbrushes = mbsp->numbrushes; + q2bsp->numbrushsides = mbsp->numbrushsides; + + // copy or convert data + q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); + q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); + q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); + q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); + q2bsp->dleafs = MBSPtoQ2_Qbism_Leafs(mbsp->dleafs, mbsp->numleafs); + q2bsp->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); + q2bsp->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); + q2bsp->dnodes = BSP2_CopyNodes(mbsp->dnodes, mbsp->numnodes); + q2bsp->texinfo = MBSPtoQ2_Texinfo(mbsp->texinfo, mbsp->numtexinfo); + q2bsp->dfaces = BSP2toQ2_Qbism_Faces(mbsp->dfaces, mbsp->numfaces); + q2bsp->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); + q2bsp->dleaffaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); + q2bsp->dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(mbsp->dleafbrushes, mbsp->numleafbrushes); + q2bsp->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + + q2bsp->dareas = Q2BSP_CopyAreas(mbsp->dareas, mbsp->numareas); + q2bsp->dareaportals = Q2BSP_CopyAreaPortals(mbsp->dareaportals, mbsp->numareaportals); + + q2bsp->dbrushes = Q2BSP_CopyBrushes(mbsp->dbrushes, mbsp->numbrushes); + q2bsp->dbrushsides = Q2BSP_Qbism_CopyBrushSides(mbsp->dbrushsides, mbsp->numbrushsides); + + /* Free old data */ + FreeMBSP((mbsp_t *)mbsp); + + /* Conversion complete! */ + bspdata->version = to_version; + + return; + } - if (bspdata->version == GENERIC_BSP && version == Q2_BSPVERSION) { - const mbsp_t *mbsp = &bspdata->data.mbsp; - q2bsp_t *q2bsp = &bspdata->data.q2bsp; + else if (to_version == &bspver_bsp2rmq) { + bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; + const mbsp_t *mbsp = &bspdata->data.mbsp; - memset(q2bsp, 0, sizeof(*q2bsp)); + memset(bsp2rmq, 0, sizeof(*bsp2rmq)); - // copy counts - q2bsp->nummodels = mbsp->nummodels; - q2bsp->visdatasize = mbsp->visdatasize; - q2bsp->lightdatasize = mbsp->lightdatasize; - q2bsp->entdatasize = mbsp->entdatasize; - q2bsp->numleafs = mbsp->numleafs; - q2bsp->numplanes = mbsp->numplanes; - q2bsp->numvertexes = mbsp->numvertexes; - q2bsp->numnodes = mbsp->numnodes; - q2bsp->numtexinfo = mbsp->numtexinfo; - q2bsp->numfaces = mbsp->numfaces; - q2bsp->numedges = mbsp->numedges; - q2bsp->numleaffaces = mbsp->numleaffaces; - q2bsp->numleafbrushes = mbsp->numleafbrushes; - q2bsp->numsurfedges = mbsp->numsurfedges; - q2bsp->numareas = mbsp->numareas; - q2bsp->numareaportals = mbsp->numareaportals; - q2bsp->numbrushes = mbsp->numbrushes; - q2bsp->numbrushsides = mbsp->numbrushsides; + // copy counts + bsp2rmq->nummodels = mbsp->nummodels; + bsp2rmq->visdatasize = mbsp->visdatasize; + bsp2rmq->lightdatasize = mbsp->lightdatasize; + bsp2rmq->texdatasize = mbsp->texdatasize; + bsp2rmq->entdatasize = mbsp->entdatasize; + bsp2rmq->numleafs = mbsp->numleafs; + bsp2rmq->numplanes = mbsp->numplanes; + bsp2rmq->numvertexes = mbsp->numvertexes; + bsp2rmq->numnodes = mbsp->numnodes; + bsp2rmq->numtexinfo = mbsp->numtexinfo; + bsp2rmq->numfaces = mbsp->numfaces; + bsp2rmq->numclipnodes = mbsp->numclipnodes; + bsp2rmq->numedges = mbsp->numedges; + bsp2rmq->nummarksurfaces = mbsp->numleaffaces; + bsp2rmq->numsurfedges = mbsp->numsurfedges; - // copy or convert data - q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); - q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); - q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - q2bsp->dleafs = MBSPtoQ2_Leafs(mbsp->dleafs, mbsp->numleafs); - q2bsp->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - q2bsp->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - q2bsp->dnodes = BSP2toQ2_Nodes(mbsp->dnodes, mbsp->numnodes); - q2bsp->texinfo = MBSPtoQ2_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - q2bsp->dfaces = BSP2toQ2_Faces(mbsp->dfaces, mbsp->numfaces); - q2bsp->dedges = BSP2to29_Edges(mbsp->dedges, mbsp->numedges); - q2bsp->dleaffaces = BSP2to29_Marksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - q2bsp->dleafbrushes = Q2BSP_CopyLeafBrushes(mbsp->dleafbrushes, mbsp->numleafbrushes); - q2bsp->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + // copy or convert data + bsp2rmq->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); + bsp2rmq->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); + bsp2rmq->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); + bsp2rmq->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); + bsp2rmq->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); + bsp2rmq->dleafs = MBSPto2rmq_Leafs(mbsp->dleafs, mbsp->numleafs); + bsp2rmq->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); + bsp2rmq->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); + bsp2rmq->dnodes = BSP2to2rmq_Nodes(mbsp->dnodes, mbsp->numnodes); + bsp2rmq->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); + bsp2rmq->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); + bsp2rmq->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); + bsp2rmq->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); + bsp2rmq->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); + bsp2rmq->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - q2bsp->dareas = Q2BSP_CopyAreas(mbsp->dareas, mbsp->numareas); - q2bsp->dareaportals = Q2BSP_CopyAreaPortals(mbsp->dareaportals, mbsp->numareaportals); + /* Free old data */ + FreeMBSP((mbsp_t *)mbsp); - q2bsp->dbrushes = Q2BSP_CopyBrushes(mbsp->dbrushes, mbsp->numbrushes); - q2bsp->dbrushsides = Q2BSP_CopyBrushSides(mbsp->dbrushsides, mbsp->numbrushsides); + /* Conversion complete! */ + bspdata->version = to_version; - /* Free old data */ - FreeMBSP((mbsp_t *)mbsp); - - /* Conversion complete! */ - bspdata->version = version; - - return; - } + return; + } - if (bspdata->version == GENERIC_BSP && version == BSP2RMQVERSION) { - bsp2rmq_t *bsp2rmq = &bspdata->data.bsp2rmq; - const mbsp_t *mbsp = &bspdata->data.mbsp; + else if (to_version == &bspver_bsp2) { + bsp2_t *bsp2 = &bspdata->data.bsp2; + const mbsp_t *mbsp = &bspdata->data.mbsp; - memset(bsp2rmq, 0, sizeof(*bsp2rmq)); + memset(bsp2, 0, sizeof(*bsp2)); - // copy counts - bsp2rmq->nummodels = mbsp->nummodels; - bsp2rmq->visdatasize = mbsp->visdatasize; - bsp2rmq->lightdatasize = mbsp->lightdatasize; - bsp2rmq->texdatasize = mbsp->texdatasize; - bsp2rmq->entdatasize = mbsp->entdatasize; - bsp2rmq->numleafs = mbsp->numleafs; - bsp2rmq->numplanes = mbsp->numplanes; - bsp2rmq->numvertexes = mbsp->numvertexes; - bsp2rmq->numnodes = mbsp->numnodes; - bsp2rmq->numtexinfo = mbsp->numtexinfo; - bsp2rmq->numfaces = mbsp->numfaces; - bsp2rmq->numclipnodes = mbsp->numclipnodes; - bsp2rmq->numedges = mbsp->numedges; - bsp2rmq->nummarksurfaces = mbsp->numleaffaces; - bsp2rmq->numsurfedges = mbsp->numsurfedges; + // copy counts + bsp2->nummodels = mbsp->nummodels; + bsp2->visdatasize = mbsp->visdatasize; + bsp2->lightdatasize = mbsp->lightdatasize; + bsp2->texdatasize = mbsp->texdatasize; + bsp2->entdatasize = mbsp->entdatasize; + bsp2->numleafs = mbsp->numleafs; + bsp2->numplanes = mbsp->numplanes; + bsp2->numvertexes = mbsp->numvertexes; + bsp2->numnodes = mbsp->numnodes; + bsp2->numtexinfo = mbsp->numtexinfo; + bsp2->numfaces = mbsp->numfaces; + bsp2->numclipnodes = mbsp->numclipnodes; + bsp2->numedges = mbsp->numedges; + bsp2->nummarksurfaces = mbsp->numleaffaces; + bsp2->numsurfedges = mbsp->numsurfedges; - // copy or convert data - bsp2rmq->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); - bsp2rmq->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); - bsp2rmq->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - bsp2rmq->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); - bsp2rmq->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - bsp2rmq->dleafs = MBSPto2rmq_Leafs(mbsp->dleafs, mbsp->numleafs); - bsp2rmq->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - bsp2rmq->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - bsp2rmq->dnodes = BSP2to2rmq_Nodes(mbsp->dnodes, mbsp->numnodes); - bsp2rmq->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - bsp2rmq->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); - bsp2rmq->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); - bsp2rmq->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); - bsp2rmq->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - bsp2rmq->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); + // copy or convert data + bsp2->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); + bsp2->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); + bsp2->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); + bsp2->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); + bsp2->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); + bsp2->dleafs = MBSPto2_Leafs(mbsp->dleafs, mbsp->numleafs); + bsp2->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); + bsp2->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); + bsp2->dnodes = BSP2_CopyNodes(mbsp->dnodes, mbsp->numnodes); + bsp2->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); + bsp2->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); + bsp2->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); + bsp2->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); + bsp2->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); + bsp2->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - /* Free old data */ - FreeMBSP((mbsp_t *)mbsp); + /* Free old data */ + FreeMBSP((mbsp_t *)mbsp); - /* Conversion complete! */ - bspdata->version = version; + /* Conversion complete! */ + bspdata->version = to_version; - return; - } - - if (bspdata->version == GENERIC_BSP && version == BSP2VERSION) { - bsp2_t *bsp2 = &bspdata->data.bsp2; - const mbsp_t *mbsp = &bspdata->data.mbsp; - - memset(bsp2, 0, sizeof(*bsp2)); - - // copy counts - bsp2->nummodels = mbsp->nummodels; - bsp2->visdatasize = mbsp->visdatasize; - bsp2->lightdatasize = mbsp->lightdatasize; - bsp2->texdatasize = mbsp->texdatasize; - bsp2->entdatasize = mbsp->entdatasize; - bsp2->numleafs = mbsp->numleafs; - bsp2->numplanes = mbsp->numplanes; - bsp2->numvertexes = mbsp->numvertexes; - bsp2->numnodes = mbsp->numnodes; - bsp2->numtexinfo = mbsp->numtexinfo; - bsp2->numfaces = mbsp->numfaces; - bsp2->numclipnodes = mbsp->numclipnodes; - bsp2->numedges = mbsp->numedges; - bsp2->nummarksurfaces = mbsp->numleaffaces; - bsp2->numsurfedges = mbsp->numsurfedges; - - // copy or convert data - bsp2->dmodels = BSP29_CopyModels(mbsp->dmodels, mbsp->nummodels); - bsp2->dvisdata = BSP29_CopyVisData(mbsp->dvisdata, mbsp->visdatasize); - bsp2->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); - bsp2->dtexdata = BSP29_CopyTexData(mbsp->dtexdata, mbsp->texdatasize); - bsp2->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); - bsp2->dleafs = MBSPto2_Leafs(mbsp->dleafs, mbsp->numleafs); - bsp2->dplanes = BSP29_CopyPlanes(mbsp->dplanes, mbsp->numplanes); - bsp2->dvertexes = BSP29_CopyVertexes(mbsp->dvertexes, mbsp->numvertexes); - bsp2->dnodes = BSP2_CopyNodes(mbsp->dnodes, mbsp->numnodes); - bsp2->texinfo = MBSPto29_Texinfo(mbsp->texinfo, mbsp->numtexinfo); - bsp2->dfaces = BSP2_CopyFaces(mbsp->dfaces, mbsp->numfaces); - bsp2->dclipnodes = BSP2_CopyClipnodes(mbsp->dclipnodes, mbsp->numclipnodes); - bsp2->dedges = BSP2_CopyEdges(mbsp->dedges, mbsp->numedges); - bsp2->dmarksurfaces = BSP2_CopyMarksurfaces(mbsp->dleaffaces, mbsp->numleaffaces); - bsp2->dsurfedges = BSP29_CopySurfedges(mbsp->dsurfedges, mbsp->numsurfedges); - - /* Free old data */ - FreeMBSP((mbsp_t *)mbsp); - - /* Conversion complete! */ - bspdata->version = version; - - return; + return; + } } Error("Don't know how to convert BSP version %s to %s", - BSPVersionString(bspdata->version), BSPVersionString(version)); + BSPVersionString(bspdata->version), BSPVersionString(to_version)); } static int isHexen2(const dheader_t *header) { - /* + /* the world should always have some face. however, if the sizes are wrong then we're actually reading headnode[6]. hexen2 only used 5 hulls, so this should be 0 in hexen2, and not in quake. - */ - const dmodelq1_t *modelsq1 = (const dmodelq1_t*)((const uint8_t *)header + header->lumps[LUMP_MODELS].fileofs); - return !modelsq1->numfaces; + */ + const dmodelq1_t *modelsq1 = (const dmodelq1_t*)((const uint8_t *)header + header->lumps[LUMP_MODELS].fileofs); + return !modelsq1->numfaces; } /* @@ -2084,8 +2577,30 @@ const lumpspec_t lumpspec_q2bsp[] = { { "areaportals", sizeof(dareaportal_t) }, }; +const lumpspec_t lumpspec_qbism[] = { + { "entities", sizeof(char) }, + { "planes", sizeof(dplane_t) }, + { "vertexes", sizeof(dvertex_t) }, + { "visibility", sizeof(uint8_t) }, + { "nodes", sizeof(q2_dnode_qbism_t) }, + { "texinfos", sizeof(q2_texinfo_t) }, + { "faces", sizeof(q2_dface_qbism_t) }, + { "lighting", sizeof(uint8_t) }, + { "leafs", sizeof(q2_dleaf_qbism_t) }, + { "leaffaces", sizeof(uint32_t) }, + { "leafbrushes", sizeof(uint32_t) }, + { "edges", sizeof(q2_dedge_qbism_t) }, + { "surfedges", sizeof(int32_t) }, + { "models", sizeof(q2_dmodel_t) }, + { "brushes", sizeof(dbrush_t) }, + { "brushsides", sizeof(q2_dbrushside_qbism_t) }, + { "pop", sizeof(uint8_t) }, + { "areas", sizeof(darea_t) }, + { "areaportals", sizeof(dareaportal_t) }, +}; + static int -CopyLump(const dheader_t *header, int lumpnum, void *destptr) +CopyLump(const void *header, const bspversion_t *version, const lump_t *lumps, int lumpnum, void *destptr) { const lumpspec_t *lumpspec; uint8_t **bufferptr = static_cast(destptr); @@ -2093,29 +2608,29 @@ CopyLump(const dheader_t *header, int lumpnum, void *destptr) int length; int ofs; - switch (header->version) { - case BSPVERSION: - case BSPHLVERSION: + if (version == &bspver_q1 || version == &bspver_h2 || version == &bspver_hl) { lumpspec = &lumpspec_bsp29[lumpnum]; - break; - case BSP2RMQVERSION: + } else if (version == &bspver_bsp2rmq) { lumpspec = &lumpspec_bsp2rmq[lumpnum]; - break; - case BSP2VERSION: + } else if (version == &bspver_bsp2) { lumpspec = &lumpspec_bsp2[lumpnum]; - break; - default: - Error("Unsupported BSP version: %d", header->version); + } else if (version == &bspver_q2) { + lumpspec = &lumpspec_q2bsp[lumpnum]; + } else if (version == &bspver_qbism) { + lumpspec = &lumpspec_qbism[lumpnum]; + } else { + Error("Unsupported BSP version: %s", BSPVersionString(version)); throw; //mxd. Fixes "Uninitialized variable" warning } - length = header->lumps[lumpnum].filelen; - ofs = header->lumps[lumpnum].fileofs; + length = lumps[lumpnum].filelen; + ofs = lumps[lumpnum].fileofs; if (buffer) free(buffer); - if (lumpnum == LUMP_MODELS && !isHexen2(header)) + // convert non-Hexen II BSP model hulls over to Hexen II ones + if (lumpnum == LUMP_MODELS && (version == &bspver_q1 || version == &bspver_hl)) { /*convert in-place. no need to care about endian here.*/ const dmodelq1_t *in = (const dmodelq1_t*)((const uint8_t *)header + ofs); dmodel_t *out; @@ -2162,45 +2677,6 @@ CopyLump(const dheader_t *header, int lumpnum, void *destptr) } } -// FIXME: Could merge this with CopyLump once the hexen 2 hack is moved elsewhere -static int -Q2_CopyLump(const q2_dheader_t *header, int lumpnum, void *destptr) -{ - const lumpspec_t *lumpspec; - uint8_t **bufferptr = static_cast(destptr); - uint8_t *buffer = *bufferptr; - int length; - int ofs; - - switch (header->version) { - case Q2_BSPVERSION: - lumpspec = &lumpspec_q2bsp[lumpnum]; - break; - default: - Error("Unsupported BSP version: %d", header->version); - throw; //mxd. Fixes "Uninitialized variable" warning - } - - length = header->lumps[lumpnum].filelen; - ofs = header->lumps[lumpnum].fileofs; - - if (buffer) - free(buffer); - - if (length % lumpspec->size) - Error("%s: odd %s lump size", __func__, lumpspec->name); - - buffer = *bufferptr = static_cast(malloc(length + 1)); - if (!buffer) - Error("%s: allocation of %i bytes failed.", __func__, length); - - memcpy(buffer, (const uint8_t *)header + ofs, length); - buffer[length] = 0; /* In case of corrupt entity lump */ - - return length / lumpspec->size; -} - - void BSPX_AddLump(bspdata_t *bspdata, const char *xname, const void *xdata, size_t xsize) { bspxentry_t *e; @@ -2286,32 +2762,37 @@ LoadBSPFile(char *filename, bspdata_t *bspdata) /* transfer the header data to these variables */ int numlumps; - int32_t version; lump_t *lumps; /* check for IBSP */ - if (LittleLong(((int *)file_data)[0]) == Q2_BSPIDENT) { + bspversion_t temp_version { LittleLong(((int *)file_data)[0]) }; + + if (temp_version.ident == Q2_BSPIDENT || + temp_version.ident == Q2_QBISMIDENT) { q2_dheader_t *q2header = (q2_dheader_t *)file_data; q2header->version = LittleLong(q2header->version); numlumps = Q2_HEADER_LUMPS; - version = q2header->version; + temp_version.version = q2header->version; lumps = q2header->lumps; } else { dheader_t *q1header = (dheader_t *)file_data; q1header->version = LittleLong(q1header->version); numlumps = BSP_LUMPS; - version = q1header->version; lumps = q1header->lumps; + + // not useful for Q1BSP, but we'll initialize it to -1 + temp_version.version = NO_VERSION; } - bspdata->loadversion = version; - /* check the file version */ - logprint("BSP is version %s\n", BSPVersionString(version)); - if (!BSPVersionSupported(version)) + if (!BSPVersionSupported(temp_version.ident, temp_version.version, &bspdata->version)) { + logprint("BSP is version %s\n", BSPVersionString(&temp_version)); Error("Sorry, this bsp version is not supported."); + } else { + logprint("BSP is version %s\n", BSPVersionString(bspdata->version)); + } /* swap the lump headers */ for (i = 0; i < numlumps; i++) { @@ -2319,152 +2800,175 @@ LoadBSPFile(char *filename, bspdata_t *bspdata) lumps[i].filelen = LittleLong(lumps[i].filelen); } - if (isHexen2((dheader_t *)file_data)) - { - logprint("BSP appears to be from hexen2\n"); - bspdata->hullcount = MAX_MAP_HULLS_H2; - } - else - bspdata->hullcount = MAX_MAP_HULLS_Q1; - /* copy the data */ - if (version == Q2_BSPVERSION) { + if (bspdata->version == &bspver_q2) { q2_dheader_t *header = (q2_dheader_t *)file_data; q2bsp_t *bsp = &bspdata->data.q2bsp; - + memset(bsp, 0, sizeof(*bsp)); - bspdata->version = header->version; + + bsp->nummodels = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_MODELS, &bsp->dmodels); + bsp->numvertexes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_VERTEXES, &bsp->dvertexes); + bsp->numplanes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_PLANES, &bsp->dplanes); + bsp->numleafs = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFS, &bsp->dleafs); + bsp->numnodes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_NODES, &bsp->dnodes); + bsp->numtexinfo = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_TEXINFO, &bsp->texinfo); + bsp->numfaces = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_FACES, &bsp->dfaces); + bsp->numleaffaces = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFFACES, &bsp->dleaffaces); + bsp->numleafbrushes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFBRUSHES, &bsp->dleafbrushes); + bsp->numsurfedges = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_SURFEDGES, &bsp->dsurfedges); + bsp->numedges = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_EDGES, &bsp->dedges); + bsp->numbrushes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_BRUSHES, &bsp->dbrushes); + bsp->numbrushsides = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_BRUSHSIDES, &bsp->dbrushsides); + bsp->numareas = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_AREAS, &bsp->dareas); + bsp->numareaportals = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_AREAPORTALS, &bsp->dareaportals); - bsp->nummodels = Q2_CopyLump (header, Q2_LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = Q2_CopyLump (header, Q2_LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = Q2_CopyLump (header, Q2_LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = Q2_CopyLump (header, Q2_LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = Q2_CopyLump (header, Q2_LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = Q2_CopyLump (header, Q2_LUMP_TEXINFO, &bsp->texinfo); - bsp->numfaces = Q2_CopyLump (header, Q2_LUMP_FACES, &bsp->dfaces); - bsp->numleaffaces = Q2_CopyLump (header, Q2_LUMP_LEAFFACES, &bsp->dleaffaces); - bsp->numleafbrushes = Q2_CopyLump (header, Q2_LUMP_LEAFBRUSHES, &bsp->dleafbrushes); - bsp->numsurfedges = Q2_CopyLump (header, Q2_LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = Q2_CopyLump (header, Q2_LUMP_EDGES, &bsp->dedges); - bsp->numbrushes = Q2_CopyLump (header, Q2_LUMP_BRUSHES, &bsp->dbrushes); - bsp->numbrushsides = Q2_CopyLump (header, Q2_LUMP_BRUSHSIDES, &bsp->dbrushsides); - bsp->numareas = Q2_CopyLump (header, Q2_LUMP_AREAS, &bsp->dareas); - bsp->numareaportals = Q2_CopyLump (header, Q2_LUMP_AREAPORTALS, &bsp->dareaportals); + bsp->visdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_VISIBILITY, &bsp->dvis); + bsp->lightdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LIGHTING, &bsp->dlightdata); + bsp->entdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_ENTITIES, &bsp->dentdata); - bsp->visdatasize = Q2_CopyLump (header, Q2_LUMP_VISIBILITY, &bsp->dvis); - bsp->lightdatasize = Q2_CopyLump (header, Q2_LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = Q2_CopyLump (header, Q2_LUMP_ENTITIES, &bsp->dentdata); + CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_POP, &bsp->dpop); + } else if (bspdata->version == &bspver_qbism) { + q2_dheader_t *header = (q2_dheader_t *)file_data; + q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; + + memset(bsp, 0, sizeof(*bsp)); + + bsp->nummodels = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_MODELS, &bsp->dmodels); + bsp->numvertexes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_VERTEXES, &bsp->dvertexes); + bsp->numplanes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_PLANES, &bsp->dplanes); + bsp->numleafs = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFS, &bsp->dleafs); + bsp->numnodes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_NODES, &bsp->dnodes); + bsp->numtexinfo = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_TEXINFO, &bsp->texinfo); + bsp->numfaces = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_FACES, &bsp->dfaces); + bsp->numleaffaces = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFFACES, &bsp->dleaffaces); + bsp->numleafbrushes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LEAFBRUSHES, &bsp->dleafbrushes); + bsp->numsurfedges = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_SURFEDGES, &bsp->dsurfedges); + bsp->numedges = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_EDGES, &bsp->dedges); + bsp->numbrushes = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_BRUSHES, &bsp->dbrushes); + bsp->numbrushsides = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_BRUSHSIDES, &bsp->dbrushsides); + bsp->numareas = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_AREAS, &bsp->dareas); + bsp->numareaportals = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_AREAPORTALS, &bsp->dareaportals); - Q2_CopyLump (header, Q2_LUMP_POP, &bsp->dpop); + bsp->visdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_VISIBILITY, &bsp->dvis); + bsp->lightdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_LIGHTING, &bsp->dlightdata); + bsp->entdatasize = CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_ENTITIES, &bsp->dentdata); + + CopyLump (header, bspdata->version, header->lumps, Q2_LUMP_POP, &bsp->dpop); + } else { + // Only Q1-like maps need hullcount + if (isHexen2((dheader_t *)file_data)) { + logprint("BSP appears to be from hexen2\n"); + // swap version over to H2 + bspdata->version = &bspver_h2; + bspdata->hullcount = MAX_MAP_HULLS_H2; + } else { + bspdata->hullcount = MAX_MAP_HULLS_Q1; + } } - if (version == BSPVERSION || version == BSPHLVERSION) { + if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { dheader_t *header = (dheader_t *)file_data; bsp29_t *bsp = &bspdata->data.bsp29; memset(bsp, 0, sizeof(*bsp)); - bspdata->version = header->version; - bsp->nummodels = CopyLump(header, LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump(header, LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, LUMP_TEXINFO, &bsp->texinfo); - bsp->numclipnodes = CopyLump(header, LUMP_CLIPNODES, &bsp->dclipnodes); - bsp->numfaces = CopyLump(header, LUMP_FACES, &bsp->dfaces); - bsp->nummarksurfaces = CopyLump(header, LUMP_MARKSURFACES, &bsp->dmarksurfaces); - bsp->numsurfedges = CopyLump(header, LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, LUMP_EDGES, &bsp->dedges); - bsp->texdatasize = CopyLump(header, LUMP_TEXTURES, &bsp->dtexdata); - bsp->visdatasize = CopyLump(header, LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, LUMP_ENTITIES, &bsp->dentdata); - } + bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels); + bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp->dvertexes); + bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp->dplanes); + bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp->dleafs); + bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp->dnodes); + bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp->texinfo); + bsp->numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp->dclipnodes); + bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp->dfaces); + bsp->nummarksurfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp->dmarksurfaces); + bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp->dsurfedges); + bsp->numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp->dedges); - if (version == BSP2RMQVERSION) { + bsp->texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp->dtexdata); + bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp->dvisdata); + bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp->dlightdata); + bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp->dentdata); + } else if (bspdata->version == &bspver_bsp2rmq) { dheader_t *header = (dheader_t *)file_data; bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; memset(bsp, 0, sizeof(*bsp)); - bspdata->version = header->version; - bsp->nummodels = CopyLump(header, LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump(header, LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, LUMP_TEXINFO, &bsp->texinfo); - bsp->numclipnodes = CopyLump(header, LUMP_CLIPNODES, &bsp->dclipnodes); - bsp->numfaces = CopyLump(header, LUMP_FACES, &bsp->dfaces); - bsp->nummarksurfaces = CopyLump(header, LUMP_MARKSURFACES, &bsp->dmarksurfaces); - bsp->numsurfedges = CopyLump(header, LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, LUMP_EDGES, &bsp->dedges); - bsp->texdatasize = CopyLump(header, LUMP_TEXTURES, &bsp->dtexdata); - bsp->visdatasize = CopyLump(header, LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, LUMP_ENTITIES, &bsp->dentdata); - } + bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels); + bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp->dvertexes); + bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp->dplanes); + bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp->dleafs); + bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp->dnodes); + bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp->texinfo); + bsp->numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp->dclipnodes); + bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp->dfaces); + bsp->nummarksurfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp->dmarksurfaces); + bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp->dsurfedges); + bsp->numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp->dedges); - if (version == BSP2VERSION) { + bsp->texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp->dtexdata); + bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp->dvisdata); + bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp->dlightdata); + bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp->dentdata); + } else if (bspdata->version == &bspver_bsp2) { dheader_t *header = (dheader_t *)file_data; bsp2_t *bsp = &bspdata->data.bsp2; memset(bsp, 0, sizeof(*bsp)); - bspdata->version = header->version; - bsp->nummodels = CopyLump(header, LUMP_MODELS, &bsp->dmodels); - bsp->numvertexes = CopyLump(header, LUMP_VERTEXES, &bsp->dvertexes); - bsp->numplanes = CopyLump(header, LUMP_PLANES, &bsp->dplanes); - bsp->numleafs = CopyLump(header, LUMP_LEAFS, &bsp->dleafs); - bsp->numnodes = CopyLump(header, LUMP_NODES, &bsp->dnodes); - bsp->numtexinfo = CopyLump(header, LUMP_TEXINFO, &bsp->texinfo); - bsp->numclipnodes = CopyLump(header, LUMP_CLIPNODES, &bsp->dclipnodes); - bsp->numfaces = CopyLump(header, LUMP_FACES, &bsp->dfaces); - bsp->nummarksurfaces = CopyLump(header, LUMP_MARKSURFACES, &bsp->dmarksurfaces); - bsp->numsurfedges = CopyLump(header, LUMP_SURFEDGES, &bsp->dsurfedges); - bsp->numedges = CopyLump(header, LUMP_EDGES, &bsp->dedges); - bsp->texdatasize = CopyLump(header, LUMP_TEXTURES, &bsp->dtexdata); - bsp->visdatasize = CopyLump(header, LUMP_VISIBILITY, &bsp->dvisdata); - bsp->lightdatasize = CopyLump(header, LUMP_LIGHTING, &bsp->dlightdata); - bsp->entdatasize = CopyLump(header, LUMP_ENTITIES, &bsp->dentdata); + bsp->nummodels = CopyLump(header, bspdata->version, header->lumps, LUMP_MODELS, &bsp->dmodels); + bsp->numvertexes = CopyLump(header, bspdata->version, header->lumps, LUMP_VERTEXES, &bsp->dvertexes); + bsp->numplanes = CopyLump(header, bspdata->version, header->lumps, LUMP_PLANES, &bsp->dplanes); + bsp->numleafs = CopyLump(header, bspdata->version, header->lumps, LUMP_LEAFS, &bsp->dleafs); + bsp->numnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_NODES, &bsp->dnodes); + bsp->numtexinfo = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXINFO, &bsp->texinfo); + bsp->numclipnodes = CopyLump(header, bspdata->version, header->lumps, LUMP_CLIPNODES, &bsp->dclipnodes); + bsp->numfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_FACES, &bsp->dfaces); + bsp->nummarksurfaces = CopyLump(header, bspdata->version, header->lumps, LUMP_MARKSURFACES, &bsp->dmarksurfaces); + bsp->numsurfedges = CopyLump(header, bspdata->version, header->lumps, LUMP_SURFEDGES, &bsp->dsurfedges); + bsp->numedges = CopyLump(header, bspdata->version, header->lumps, LUMP_EDGES, &bsp->dedges); + + bsp->texdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_TEXTURES, &bsp->dtexdata); + bsp->visdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_VISIBILITY, &bsp->dvisdata); + bsp->lightdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_LIGHTING, &bsp->dlightdata); + bsp->entdatasize = CopyLump(header, bspdata->version, header->lumps, LUMP_ENTITIES, &bsp->dentdata); } - if (version != Q2_BSPVERSION) { - dheader_t *header = (dheader_t *)file_data; + // detect BSPX + dheader_t *header = (dheader_t *)file_data; - /*bspx header is positioned exactly+4align at the end of the last lump position (regardless of order)*/ - for (i = 0, bspxofs = 0; i < BSP_LUMPS; i++) + /*bspx header is positioned exactly+4align at the end of the last lump position (regardless of order)*/ + for (i = 0, bspxofs = 0; i < BSP_LUMPS; i++) + { + if (bspxofs < header->lumps[i].fileofs + header->lumps[i].filelen) + bspxofs = header->lumps[i].fileofs + header->lumps[i].filelen; + } + bspxofs = (bspxofs+3) & ~3; + /*okay, so that's where it *should* be if it exists */ + if (bspxofs + sizeof(*bspx) <= flen) + { + int xlumps; + const bspx_lump_t *xlump; + bspx = (const bspx_header_t*)((const uint8_t*)header + bspxofs); + xlump = (const bspx_lump_t*)(bspx+1); + xlumps = LittleLong(bspx->numlumps); + if (!memcmp(&bspx->id,"BSPX",4) && xlumps >= 0 && bspxofs+sizeof(*bspx)+sizeof(*xlump)*xlumps <= flen) { - if (bspxofs < header->lumps[i].fileofs + header->lumps[i].filelen) - bspxofs = header->lumps[i].fileofs + header->lumps[i].filelen; + /*header seems valid so far. just add the lumps as we normally would if we were generating them, ensuring that they get written out anew*/ + while(xlumps --> 0) + { + uint32_t ofs = LittleLong(xlump[xlumps].fileofs); + uint32_t len = LittleLong(xlump[xlumps].filelen); + void *lumpdata = malloc(len); + memcpy(lumpdata, (const uint8_t*)header + ofs, len); + BSPX_AddLump(bspdata, xlump[xlumps].lumpname, lumpdata, len); + } } - bspxofs = (bspxofs+3) & ~3; - /*okay, so that's where it *should* be if it exists */ - if (bspxofs + sizeof(*bspx) <= flen) + else { - int xlumps; - const bspx_lump_t *xlump; - bspx = (const bspx_header_t*)((const uint8_t*)header + bspxofs); - xlump = (const bspx_lump_t*)(bspx+1); - xlumps = LittleLong(bspx->numlumps); - if (!memcmp(&bspx->id,"BSPX",4) && xlumps >= 0 && bspxofs+sizeof(*bspx)+sizeof(*xlump)*xlumps <= flen) - { - /*header seems valid so far. just add the lumps as we normally would if we were generating them, ensuring that they get written out anew*/ - while(xlumps --> 0) - { - uint32_t ofs = LittleLong(xlump[xlumps].fileofs); - uint32_t len = LittleLong(xlump[xlumps].filelen); - void *lumpdata = malloc(len); - memcpy(lumpdata, (const uint8_t*)header + ofs, len); - BSPX_AddLump(bspdata, xlump[xlumps].lumpname, lumpdata, len); - } - } - else - { - if (!memcmp(&bspx->id,"BSPX",4)) - printf("invalid bspx header\n"); - } + if (!memcmp(&bspx->id,"BSPX",4)) + printf("invalid bspx header\n"); } } @@ -2478,11 +2982,13 @@ LoadBSPFile(char *filename, bspdata_t *bspdata) /* ========================================================================= */ typedef struct { - int version; + const bspversion_t *version; // which one is used depends on version - dheader_t q1header; - q2_dheader_t q2header; + union { + dheader_t q1header; + q2_dheader_t q2header; + }; FILE *file; } bspfile_t; @@ -2492,33 +2998,33 @@ AddLump(bspfile_t *bspfile, int lumpnum, const void *data, int count) { bool q2 = false; size_t size; - - switch (bspfile->version) { - case BSPVERSION: - case BSPHLVERSION: - size = lumpspec_bsp29[lumpnum].size * count; - break; - case BSP2RMQVERSION: - size = lumpspec_bsp2rmq[lumpnum].size * count; - break; - case BSP2VERSION: - size = lumpspec_bsp2[lumpnum].size * count; - break; - case Q2_BSPVERSION: - size = lumpspec_q2bsp[lumpnum].size * count; - q2 = true; - break; - default: - Error("Unsupported BSP version: %d", LittleLong(bspfile->version)); + const lumpspec_t *lumpspec; + lump_t *lumps; + + if (bspfile->version == &bspver_q1 || bspfile->version == &bspver_h2 || bspfile->version == &bspver_hl) { + lumpspec = &lumpspec_bsp29[lumpnum]; + lumps = bspfile->q1header.lumps; + } else if (bspfile->version == &bspver_bsp2rmq) { + lumpspec = &lumpspec_bsp2rmq[lumpnum]; + lumps = bspfile->q1header.lumps; + } else if (bspfile->version == &bspver_bsp2) { + lumpspec = &lumpspec_bsp2[lumpnum]; + lumps = bspfile->q1header.lumps; + } else if (bspfile->version == &bspver_q2) { + lumpspec = &lumpspec_q2bsp[lumpnum]; + lumps = bspfile->q2header.lumps; + } else if (bspfile->version == &bspver_qbism) { + lumpspec = &lumpspec_qbism[lumpnum]; + lumps = bspfile->q2header.lumps; + } else { + Error("Unsupported BSP version: %s", BSPVersionString(bspfile->version)); throw; //mxd. Fixes "Uninitialized variable" warning } + size = lumpspec->size * count; + uint8_t pad[4] = {0}; - lump_t *lump; - if (q2) - lump = &bspfile->q2header.lumps[lumpnum]; - else - lump = &bspfile->q1header.lumps[lumpnum]; + lump_t *lump = &lumps[lumpnum]; lump->fileofs = LittleLong(ftell(bspfile->file)); lump->filelen = LittleLong(size); @@ -2575,25 +3081,27 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) SwapBSPFile(bspdata, TO_DISK); bspfile.version = bspdata->version; - if (bspfile.version == Q2_BSPVERSION) { - bspfile.q2header.ident = LittleLong(Q2_BSPIDENT); - bspfile.q2header.version = LittleLong(Q2_BSPVERSION); - } else { - bspfile.q1header.version = LittleLong(bspfile.version); + + // headers are union'd, so this sets both + bspfile.q2header.ident = LittleLong(bspfile.version->ident); + + if (bspfile.version->version != NO_VERSION) { + bspfile.q2header.version = LittleLong(bspfile.version->version); } logprint("Writing %s as BSP version %s\n", filename, BSPVersionString(bspdata->version)); bspfile.file = SafeOpenWrite(filename); /* Save header space, updated after adding the lumps */ - if (bspfile.version == Q2_BSPVERSION) { + if (bspfile.version->version != NO_VERSION) { SafeWrite(bspfile.file, &bspfile.q2header, sizeof(bspfile.q2header)); } else { SafeWrite(bspfile.file, &bspfile.q1header, sizeof(bspfile.q1header)); } - if (bspdata->version == BSPVERSION || - bspdata->version == BSPHLVERSION) { + if (bspdata->version == &bspver_q1 || + bspdata->version == &bspver_h2 || + bspdata->version == &bspver_hl) { bsp29_t *bsp = &bspdata->data.bsp29; AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes); @@ -2612,7 +3120,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize); AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize); - } else if (bspdata->version == BSP2RMQVERSION) { + } else if (bspdata->version == &bspver_bsp2rmq) { bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes); @@ -2631,7 +3139,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize); AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize); - } else if (bspdata->version == BSP2VERSION) { + } else if (bspdata->version == &bspver_bsp2) { bsp2_t *bsp = &bspdata->data.bsp2; AddLump(&bspfile, LUMP_PLANES, bsp->dplanes, bsp->numplanes); @@ -2650,7 +3158,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) AddLump(&bspfile, LUMP_VISIBILITY, bsp->dvisdata, bsp->visdatasize); AddLump(&bspfile, LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); AddLump(&bspfile, LUMP_TEXTURES, bsp->dtexdata, bsp->texdatasize); - } else if (bspdata->version == Q2_BSPVERSION) { + } else if (bspdata->version == &bspver_q2) { q2bsp_t *bsp = &bspdata->data.q2bsp; AddLump(&bspfile, Q2_LUMP_MODELS, bsp->dmodels, bsp->nummodels); @@ -2669,6 +3177,29 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) AddLump(&bspfile, Q2_LUMP_AREAS, bsp->dareas, bsp->numareas); AddLump(&bspfile, Q2_LUMP_AREAPORTALS, bsp->dareaportals, bsp->numareaportals); + AddLump(&bspfile, Q2_LUMP_VISIBILITY, bsp->dvis, bsp->visdatasize); + AddLump(&bspfile, Q2_LUMP_LIGHTING, bsp->dlightdata, bsp->lightdatasize); + AddLump(&bspfile, Q2_LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); + AddLump(&bspfile, Q2_LUMP_POP, bsp->dpop, sizeof(bsp->dpop)); + } else if (bspdata->version == &bspver_qbism) { + q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; + + AddLump(&bspfile, Q2_LUMP_MODELS, bsp->dmodels, bsp->nummodels); + AddLump(&bspfile, Q2_LUMP_VERTEXES, bsp->dvertexes, bsp->numvertexes); + AddLump(&bspfile, Q2_LUMP_PLANES, bsp->dplanes, bsp->numplanes); + AddLump(&bspfile, Q2_LUMP_LEAFS, bsp->dleafs, bsp->numleafs); + AddLump(&bspfile, Q2_LUMP_NODES, bsp->dnodes, bsp->numnodes); + AddLump(&bspfile, Q2_LUMP_TEXINFO, bsp->texinfo, bsp->numtexinfo); + AddLump(&bspfile, Q2_LUMP_FACES, bsp->dfaces, bsp->numfaces); + AddLump(&bspfile, Q2_LUMP_LEAFFACES, bsp->dleaffaces, bsp->numleaffaces); + AddLump(&bspfile, Q2_LUMP_LEAFBRUSHES, bsp->dleafbrushes, bsp->numleafbrushes); + AddLump(&bspfile, Q2_LUMP_SURFEDGES, bsp->dsurfedges, bsp->numsurfedges); + AddLump(&bspfile, Q2_LUMP_EDGES, bsp->dedges, bsp->numedges); + AddLump(&bspfile, Q2_LUMP_BRUSHES, bsp->dbrushes, bsp->numbrushes); + AddLump(&bspfile, Q2_LUMP_BRUSHSIDES, bsp->dbrushsides, bsp->numbrushsides); + AddLump(&bspfile, Q2_LUMP_AREAS, bsp->dareas, bsp->numareas); + AddLump(&bspfile, Q2_LUMP_AREAPORTALS, bsp->dareaportals, bsp->numareaportals); + AddLump(&bspfile, Q2_LUMP_VISIBILITY, bsp->dvis, bsp->visdatasize); AddLump(&bspfile, Q2_LUMP_LIGHTING, bsp->dlightdata, bsp->lightdatasize); AddLump(&bspfile, Q2_LUMP_ENTITIES, bsp->dentdata, bsp->entdatasize); @@ -2720,7 +3251,7 @@ WriteBSPFile(const char *filename, bspdata_t *bspdata) fseek(bspfile.file, 0, SEEK_SET); // write the real header - if (bspfile.version == Q2_BSPVERSION) { + if (bspfile.version->version != NO_VERSION) { SafeWrite(bspfile.file, &bspfile.q2header, sizeof(bspfile.q2header)); } else { SafeWrite(bspfile.file, &bspfile.q1header, sizeof(bspfile.q1header)); @@ -2749,7 +3280,7 @@ PrintBSPFileSizes(const bspdata_t *bspdata) { int numtextures = 0; - if (bspdata->version == Q2_BSPVERSION) { + if (bspdata->version == &bspver_q2) { const q2bsp_t *bsp = &bspdata->data.q2bsp; const lumpspec_t *lumpspec = lumpspec_q2bsp; @@ -2773,9 +3304,31 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); - } - - if (bspdata->version == BSPVERSION || bspdata->version == BSPHLVERSION) { + } else if (bspdata->version == &bspver_qbism) { + const q2bsp_qbism_t *bsp = &bspdata->data.q2bsp_qbism; + const lumpspec_t *lumpspec = lumpspec_qbism; + + logprint("%7i %-12s\n", bsp->nummodels, "models"); + + PrintLumpSize(lumpspec, Q2_LUMP_PLANES, bsp->numplanes); + PrintLumpSize(lumpspec, Q2_LUMP_VERTEXES, bsp->numvertexes); + PrintLumpSize(lumpspec, Q2_LUMP_NODES, bsp->numnodes); + PrintLumpSize(lumpspec, Q2_LUMP_TEXINFO, bsp->numtexinfo); + PrintLumpSize(lumpspec, Q2_LUMP_FACES, bsp->numfaces); + PrintLumpSize(lumpspec, Q2_LUMP_LEAFS, bsp->numleafs); + PrintLumpSize(lumpspec, Q2_LUMP_LEAFFACES, bsp->numleaffaces); + PrintLumpSize(lumpspec, Q2_LUMP_LEAFBRUSHES, bsp->numleafbrushes); + PrintLumpSize(lumpspec, Q2_LUMP_EDGES, bsp->numedges); + PrintLumpSize(lumpspec, Q2_LUMP_SURFEDGES, bsp->numsurfedges); + PrintLumpSize(lumpspec, Q2_LUMP_BRUSHES, bsp->numbrushes); + PrintLumpSize(lumpspec, Q2_LUMP_BRUSHSIDES, bsp->numbrushsides); + PrintLumpSize(lumpspec, Q2_LUMP_AREAS, bsp->numareas); + PrintLumpSize(lumpspec, Q2_LUMP_AREAPORTALS, bsp->numareaportals); + + logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); + logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); + logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); + } else if (bspdata->version == &bspver_q1 || bspdata->version == &bspver_h2 || bspdata->version == &bspver_hl) { const bsp29_t *bsp = &bspdata->data.bsp29; const lumpspec_t *lumpspec = lumpspec_bsp29; @@ -2799,9 +3352,15 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); - } - if (bspdata->version == BSP2RMQVERSION) { + if (bspdata->bspxentries) + { + bspxentry_t *x; + for (x = bspdata->bspxentries; x; x = x->next) { + logprint("%7s %-12s %10i\n", "BSPX", x->lumpname, (int)x->lumpsize); + } + } + } else if (bspdata->version == &bspver_bsp2rmq) { const bsp2rmq_t *bsp = &bspdata->data.bsp2rmq; const lumpspec_t *lumpspec = lumpspec_bsp2rmq; @@ -2825,9 +3384,7 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "lightdata", bsp->lightdatasize); logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); - } - - if (bspdata->version == BSP2VERSION) { + } else if (bspdata->version == &bspver_bsp2) { const bsp2_t *bsp = &bspdata->data.bsp2; const lumpspec_t *lumpspec = lumpspec_bsp2; @@ -2852,12 +3409,4 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "visdata", bsp->visdatasize); logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); } - - if (bspdata->bspxentries) - { - bspxentry_t *x; - for (x = bspdata->bspxentries; x; x = x->next) { - logprint("%7s %-12s %10i\n", "BSPX", x->lumpname, (int)x->lumpsize); - } - } } diff --git a/common/bsputils.cc b/common/bsputils.cc index b49cdeec..53be82bf 100644 --- a/common/bsputils.cc +++ b/common/bsputils.cc @@ -188,7 +188,7 @@ bool Face_IsLightmapped(const mbsp_t *bsp, const bsp2_dface_t *face) if (texinfo == nullptr) return false; - if (bsp->loadversion == Q2_BSPVERSION) { + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { if (texinfo->flags & (Q2_SURF_WARP|Q2_SURF_SKY|Q2_SURF_NODRAW)) { //mxd. +Q2_SURF_NODRAW return false; } @@ -223,7 +223,7 @@ TextureName_Contents(const char *texname) bool //mxd Contents_IsTranslucent(const mbsp_t *bsp, const int contents) { - if (bsp->loadversion == Q2_BSPVERSION) + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) return (contents & Q2_SURF_TRANSLUCENT) && ((contents & Q2_SURF_TRANSLUCENT) != Q2_SURF_TRANSLUCENT); // Don't count KMQ2 fence flags combo as translucent else return contents == CONTENTS_WATER || contents == CONTENTS_LAVA || contents == CONTENTS_SLIME; @@ -238,7 +238,7 @@ Face_IsTranslucent(const mbsp_t *bsp, const bsp2_dface_t *face) int //mxd. Returns CONTENTS_ value for Q1, Q2_SURF_ bitflags for Q2... Face_Contents(const mbsp_t *bsp, const bsp2_dface_t *face) { - if (bsp->loadversion == Q2_BSPVERSION) { + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { const gtexinfo_t *info = Face_Texinfo(bsp, face); return info->flags; } else { @@ -281,8 +281,13 @@ static bool Light_PointInSolid_r(const mbsp_t *bsp, const int nodenum, const vec { if (nodenum < 0) { const mleaf_t *leaf = BSP_GetLeafFromNodeNum(bsp, nodenum); + + //mxd + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { + return leaf->contents & Q2_CONTENTS_SOLID; + } - return (bsp->loadversion == Q2_BSPVERSION ? leaf->contents & Q2_CONTENTS_SOLID : (leaf->contents == CONTENTS_SOLID || leaf->contents == CONTENTS_SKY)); //mxd + return (leaf->contents == CONTENTS_SOLID || leaf->contents == CONTENTS_SKY); } const bsp2_dnode_t *node = &bsp->dnodes[nodenum]; diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index 7a6cb51c..9183755b 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -52,17 +52,41 @@ #define MAX_ENT_KEY 32 #define MAX_ENT_VALUE 1024 +struct bspversion_t +{ + /* identifier value, the first int32_t in the header */ + int32_t ident; + /* version value, if supported; use NO_VERSION if a version is not required */ + int32_t version; + /* short name used for command line args, etc */ + const char *short_name; + /* full display name for printing */ + const char *name; +}; + +#define NO_VERSION -1 + #define BSPVERSION 29 #define BSP2RMQVERSION (('B' << 24) | ('S' << 16) | ('P' << 8) | '2') #define BSP2VERSION ('B' | ('S' << 8) | ('P' << 16) | ('2' << 24)) #define BSPHLVERSION 30 //24bit lighting, and private palettes in the textures lump. #define Q2_BSPIDENT (('P'<<24)+('S'<<16)+('B'<<8)+'I') #define Q2_BSPVERSION 38 +#define Q2_QBISMIDENT (('P'<<24)+('S'<<16)+('B'<<8)+'Q') -/* Not an actual file format, but the mbsp_t struct */ -/* TODO: Should probably separate the type tag for bspdata_t from the file - version numbers */ -#define GENERIC_BSP 99 +extern const bspversion_t bspver_generic, bspver_q1, bspver_h2, bspver_bsp2, bspver_bsp2rmq, bspver_hl, bspver_q2, bspver_qbism; + +/* table of supported versions */ +constexpr const bspversion_t *const bspversions[] = { + &bspver_generic, + &bspver_q1, + &bspver_h2, + &bspver_bsp2, + &bspver_bsp2rmq, + &bspver_hl, + &bspver_q2, + &bspver_qbism +}; typedef struct { int32_t fileofs; @@ -290,6 +314,8 @@ struct q2_dnode_t { uint16_t numfaces; // counting both sides }; +using q2_dnode_qbism_t = bsp2_dnode_t; + /* * Note that children are interpreted as unsigned values now, so that we can * handle > 32k clipnodes. Values > 0xFFF0 can be assumed to be CONTENTS @@ -387,6 +413,8 @@ typedef struct { uint32_t v[2]; /* vertex numbers */ } bsp2_dedge_t; +using q2_dedge_qbism_t = bsp2_dedge_t; + #define MAXLIGHTMAPS 4 typedef struct { int16_t planenum; @@ -424,6 +452,18 @@ typedef struct { int32_t lightofs; // start of [numstyles*surfsize] samples } q2_dface_t; +typedef struct { + uint32_t planenum; // NOTE: only difference from bsp2_dface_t + int32_t side; + int32_t firstedge; // we must support > 64k edges + int32_t numedges; + int32_t texinfo; + + // lighting info + uint8_t styles[MAXLIGHTMAPS]; + int32_t lightofs; // start of [numstyles*surfsize] samples +} q2_dface_qbism_t; + /* Ambient Sounds */ #define AMBIENT_WATER 0 #define AMBIENT_SKY 1 @@ -481,6 +521,22 @@ typedef struct { uint16_t numleafbrushes; } q2_dleaf_t; +typedef struct { + int32_t contents; // OR of all brushes (not needed?) + + int32_t cluster; + int32_t area; + + float mins[3]; // for frustum culling + float maxs[3]; + + uint32_t firstleafface; + uint32_t numleaffaces; + + uint32_t firstleafbrush; + uint32_t numleafbrushes; +} q2_dleaf_qbism_t; + typedef struct { // bsp2_dleaf_t int32_t contents; @@ -492,10 +548,10 @@ typedef struct { uint8_t ambient_level[NUM_AMBIENTS]; // q2 extras - int16_t cluster; - int16_t area; - uint16_t firstleafbrush; - uint16_t numleafbrushes; + int32_t cluster; + int32_t area; + uint32_t firstleafbrush; + uint32_t numleafbrushes; } mleaf_t; typedef struct { @@ -503,6 +559,11 @@ typedef struct { int16_t texinfo; } dbrushside_t; +typedef struct { + uint32_t planenum; // facing out of the leaf + int32_t texinfo; +} q2_dbrushside_qbism_t; + typedef struct { int32_t firstside; int32_t numsides; @@ -742,8 +803,66 @@ typedef struct { uint8_t dpop[256]; } q2bsp_t; +typedef struct { + int nummodels; + q2_dmodel_t *dmodels; + + int visdatasize; + dvis_t *dvis; + + int lightdatasize; + uint8_t *dlightdata; + + int entdatasize; + char *dentdata; + + int numleafs; + q2_dleaf_qbism_t *dleafs; + + int numplanes; + dplane_t *dplanes; + + int numvertexes; + dvertex_t *dvertexes; + + int numnodes; + q2_dnode_qbism_t *dnodes; + + int numtexinfo; + q2_texinfo_t *texinfo; + + int numfaces; + q2_dface_qbism_t *dfaces; + + int numedges; + q2_dedge_qbism_t *dedges; + + int numleaffaces; + uint32_t *dleaffaces; + + int numleafbrushes; + uint32_t *dleafbrushes; + + int numsurfedges; + int32_t *dsurfedges; + + int numareas; + darea_t *dareas; + + int numareaportals; + dareaportal_t *dareaportals; + + int numbrushes; + dbrush_t *dbrushes; + + int numbrushsides; + q2_dbrushside_qbism_t *dbrushsides; + + uint8_t dpop[256]; +} q2bsp_qbism_t; + struct mbsp_t { - int32_t loadversion; + const bspversion_t *loadversion; int nummodels; dmodelh2_t *dmodels; @@ -792,7 +911,7 @@ struct mbsp_t { uint32_t *dleaffaces; int numleafbrushes; - uint16_t *dleafbrushes; + uint32_t *dleafbrushes; int numsurfedges; int32_t *dsurfedges; @@ -807,7 +926,7 @@ struct mbsp_t { dbrush_t *dbrushes; int numbrushsides; - dbrushside_t *dbrushsides; + q2_dbrushside_qbism_t *dbrushsides; uint8_t dpop[256]; }; // "generic" bsp - superset of all other supported types @@ -824,8 +943,7 @@ typedef struct { } q2_dheader_t; typedef struct { - int32_t loadversion; - int32_t version; + const bspversion_t *version, *loadversion; int hullcount; struct { @@ -834,6 +952,7 @@ typedef struct { bsp2_t bsp2; q2bsp_t q2bsp; mbsp_t mbsp; + q2bsp_qbism_t q2bsp_qbism; } data; bspxentry_t *bspxentries; @@ -842,7 +961,7 @@ typedef struct { void LoadBSPFile(char *filename, bspdata_t *bspdata); //returns the filename as contained inside a bsp void WriteBSPFile(const char *filename, bspdata_t *bspdata); void PrintBSPFileSizes(const bspdata_t *bspdata); -void ConvertBSPFormat(int32_t version, bspdata_t *bspdata); +void ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version); void BSPX_AddLump(bspdata_t *bspdata, const char *xname, const void *xdata, size_t xsize); const void *BSPX_GetLump(bspdata_t *bspdata, const char *xname, size_t *xsize); diff --git a/light/entities.cc b/light/entities.cc index be2fd378..5ee1e76e 100644 --- a/light/entities.cc +++ b/light/entities.cc @@ -1579,7 +1579,7 @@ static void MakeSurfaceLights(const mbsp_t *bsp) for (int i = 0; i < bsp->numleafs; i++) { const mleaf_t *leaf = bsp->dleafs + i; - const qboolean underwater = (bsp->loadversion == Q2_BSPVERSION ? leaf->contents & Q2_CONTENTS_LIQUID : leaf->contents != CONTENTS_EMPTY); //mxd + const qboolean underwater = ((bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) ? leaf->contents & Q2_CONTENTS_LIQUID : leaf->contents != CONTENTS_EMPTY); //mxd for (int k = 0; k < leaf->nummarksurfaces; k++) { const int facenum = bsp->dleaffaces[leaf->firstmarksurface + k]; diff --git a/light/imglib.cc b/light/imglib.cc index 3093db64..37e9abac 100644 --- a/light/imglib.cc +++ b/light/imglib.cc @@ -44,7 +44,7 @@ void // WHO TOUCHED MY PALET? LoadPalette(bspdata_t *bspdata) { // Load Quake 2 palette - if (bspdata->loadversion == Q2_BSPVERSION) { + if (bspdata->loadversion == &bspver_q2 || bspdata->loadversion == &bspver_qbism) { uint8_t *palette; char path[1024]; char colormap[] = "pics/colormap.pcx"; @@ -66,7 +66,7 @@ LoadPalette(bspdata_t *bspdata) for (int i = 0; i < 768; i++) thepalette[i] = palette[i]; - } else if (bspdata->hullcount == MAX_MAP_HULLS_H2) { // Gross hacks + } else if (bspdata->loadversion == &bspver_h2) { // Copy Hexen 2 palette for (int i = 0; i < 768; i++) thepalette[i] = hexen2palette[i]; @@ -721,7 +721,7 @@ void // Expects correct palette and game/mod paths to be set LoadOrConvertTextures(mbsp_t *bsp) { // Load or convert textures... - if (bsp->loadversion == Q2_BSPVERSION) + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) LoadTextures(bsp); else if (bsp->texdatasize > 0) ConvertTextures(bsp); diff --git a/light/light.cc b/light/light.cc index 2851c2b2..4c4c0a90 100644 --- a/light/light.cc +++ b/light/light.cc @@ -439,7 +439,7 @@ LightWorld(bspdata_t *bspdata, qboolean forcedscale) CalcualateVertexNormals(bsp); const qboolean bouncerequired = cfg_static.bounce.boolValue() && (debugmode == debugmode_none || debugmode == debugmode_bounce || debugmode == debugmode_bouncelights); //mxd - const qboolean isQuake2map = (bsp->loadversion == Q2_BSPVERSION); //mxd + const qboolean isQuake2map = (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism); //mxd if (bouncerequired || isQuake2map) { MakeTextureColors(bsp); @@ -470,7 +470,7 @@ LightWorld(bspdata_t *bspdata, qboolean forcedscale) // Transfer greyscale lightmap (or color lightmap for Q2/HL) to the bsp and update lightdatasize if (!litonly) { free(bsp->dlightdata); - if (bsp->loadversion == Q2_BSPVERSION || bsp->loadversion == BSPHLVERSION) { + if (isQuake2map || bsp->loadversion == &bspver_hl) { bsp->lightdatasize = lit_file_p; bsp->dlightdata = (uint8_t *)malloc(bsp->lightdatasize); memcpy(bsp->dlightdata, lit_filebase, bsp->lightdatasize); @@ -545,9 +545,9 @@ LoadExtendedTexinfoFlags(const char *sourcefilename, const mbsp_t *bsp) static const char* //mxd GetBaseDirName(bspdata_t *bspdata) { - if (bspdata->loadversion == Q2_BSPVERSION) + if (bspdata->loadversion == &bspver_q2 || bspdata->loadversion == &bspver_qbism) return "BASEQ2"; - if (bspdata->hullcount == MAX_MAP_HULLS_H2) + if (bspdata->loadversion == &bspver_h2) return "DATA1"; return "ID1"; } @@ -951,7 +951,7 @@ light_main(int argc, const char **argv) { bspdata_t bspdata; mbsp_t *const bsp = &bspdata.data.mbsp; - int32_t loadversion; + const bspversion_t *loadversion; int i; double start; double end; @@ -1199,10 +1199,10 @@ light_main(int argc, const char **argv) LoadBSPFile(source, &bspdata); loadversion = bspdata.version; - ConvertBSPFormat(GENERIC_BSP, &bspdata); + ConvertBSPFormat(&bspdata, &bspver_generic); //mxd. Use 1.0 rangescale as a default to better match with qrad3/arghrad - if (loadversion == Q2_BSPVERSION && !cfg.rangescale.isChanged()) + if ((loadversion == &bspver_q2 || loadversion == &bspver_qbism) && !cfg.rangescale.isChanged()) { const auto rs = new lockable_vec_t(cfg.rangescale.primaryName(), 1.0f, 0.0f, 100.0f); cfg.rangescale = *rs; // Gross hacks to avoid displaying this in OptionsSummary... @@ -1242,7 +1242,7 @@ light_main(int argc, const char **argv) if (!onlyents) { - if (loadversion != Q2_BSPVERSION && bsp->loadversion != BSPHLVERSION) //mxd. No lit for Quake 2 + if (loadversion != &bspver_q2 && loadversion != &bspver_qbism && bsp->loadversion != &bspver_hl) //mxd. No lit for Quake 2 CheckLitNeeded(cfg); SetupDirt(cfg); @@ -1281,7 +1281,7 @@ light_main(int argc, const char **argv) WriteEntitiesToString(cfg, bsp); /* Convert data format back if necessary */ - ConvertBSPFormat(loadversion, &bspdata); + ConvertBSPFormat(&bspdata, loadversion); if (!litonly) { WriteBSPFile(source, &bspdata); diff --git a/light/ltface.cc b/light/ltface.cc index 6c964877..365663f5 100644 --- a/light/ltface.cc +++ b/light/ltface.cc @@ -1034,7 +1034,7 @@ GetLightContrib(const globalconfig_t &cfg, const light_t *entity, const vec3_t s if (dist < 0.1) { // Catch 0 distance between sample point and light (produces infinite brightness / nan's) and causes // problems later - dist = 0.1; + dist = 0.1f; VectorSet(surfpointToLightDir_out, 0, 0, 1); } const float add = GetLightValueWithAngle(cfg, entity, surfnorm, surfpointToLightDir_out, dist, twosided); @@ -3081,7 +3081,7 @@ WriteLightmaps(const mbsp_t *bsp, bsp2_dface_t *face, facesup_t *facesup, const continue; // skip lightmaps where all samples have brightness below 1 - if (bsp->loadversion != Q2_BSPVERSION) { // HACK: don't do this on Q2. seems if all styles are 0xff, the face is drawn fullbright instead of black (Q1) + if (bsp->loadversion != &bspver_q2 && bsp->loadversion != &bspver_qbism) { // HACK: don't do this on Q2. seems if all styles are 0xff, the face is drawn fullbright instead of black (Q1) const float maxb = Lightmap_MaxBrightness(&lightmap, lightsurf); if (maxb < 1) continue; @@ -3146,7 +3146,7 @@ WriteLightmaps(const mbsp_t *bsp, bsp2_dface_t *face, facesup_t *facesup, const // q2 support int lightofs; - if (bsp->loadversion == Q2_BSPVERSION || bsp->loadversion == BSPHLVERSION) { + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism || bsp->loadversion == &bspver_hl) { lightofs = lit - lit_filebase; } else { lightofs = out - filebase; diff --git a/light/trace.cc b/light/trace.cc index 3828cca3..4bcf6174 100644 --- a/light/trace.cc +++ b/light/trace.cc @@ -716,7 +716,7 @@ TraceFaces (traceinfo_t *ti, int node, const vec3_t start, const vec3_t end) // only solid and sky faces stop the trace. bool issolid, issky; //mxd - if(bsp_static->loadversion == Q2_BSPVERSION) { + if(bsp_static->loadversion == &bspver_q2 || bsp_static->loadversion == &bspver_qbism) { issolid = !(fi->content & Q2_SURF_TRANSLUCENT); issky = (fi->content & Q2_SURF_SKY); } else { diff --git a/light/trace_embree.cc b/light/trace_embree.cc index 811fe4bc..f9a5322e 100644 --- a/light/trace_embree.cc +++ b/light/trace_embree.cc @@ -354,7 +354,7 @@ Embree_FilterFuncN(const struct RTCFilterFunctionNArguments* args) //mxd bool isFence, isGlass; - if(bsp_static->loadversion == Q2_BSPVERSION) { + if(bsp_static->loadversion == &bspver_q2 || bsp_static->loadversion == &bspver_qbism) { const int contents = Face_Contents(bsp_static, face); isFence = ((contents & Q2_SURF_TRANSLUCENT) == Q2_SURF_TRANSLUCENT); // KMQuake 2-specific. Use texture alpha chanel when both flags are set. isGlass = !isFence && (contents & Q2_SURF_TRANSLUCENT); @@ -559,7 +559,7 @@ MakeFaces_r(const mbsp_t *bsp, const int nodenum, std::vector *planes, const int leafnum = -nodenum - 1; const mleaf_t *leaf = &bsp->dleafs[leafnum]; - if (bsp->loadversion == Q2_BSPVERSION ? leaf->contents & Q2_CONTENTS_SOLID : leaf->contents == CONTENTS_SOLID) { + if ((bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) ? leaf->contents & Q2_CONTENTS_SOLID : leaf->contents == CONTENTS_SOLID) { std::vector leaf_windings = Leaf_MakeFaces(bsp, leaf, *planes); for (winding_t *w : leaf_windings) { result->push_back(w); @@ -631,15 +631,16 @@ Embree_TraceInit(const mbsp_t *bsp) const int contents = Face_Contents(bsp, face); //mxd const gtexinfo_t *texinfo = Face_Texinfo(bsp, face); + const bool is_q2 = bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism; //mxd. Skip NODRAW faces, but not SKY ones (Q2's sky01.wal has both flags set) - if(bsp->loadversion == Q2_BSPVERSION && (contents & Q2_SURF_NODRAW) && !(contents & Q2_SURF_SKY)) + if(is_q2 && (contents & Q2_SURF_NODRAW) && !(contents & Q2_SURF_SKY)) continue; // handle glass / water const float alpha = Face_Alpha(model, face); if (alpha < 1.0f - || (bsp->loadversion == Q2_BSPVERSION && (contents & Q2_SURF_TRANSLUCENT))) { //mxd. Both fence and transparent textures are done using SURF_TRANS flags in Q2 + || (is_q2 && (contents & Q2_SURF_TRANSLUCENT))) { //mxd. Both fence and transparent textures are done using SURF_TRANS flags in Q2 filterfaces.push_back(face); continue; } @@ -652,7 +653,7 @@ Embree_TraceInit(const mbsp_t *bsp) } // handle sky - if (bsp->loadversion == Q2_BSPVERSION) { + if (is_q2) { // Q2: arghrad compat: sky faces only emit sunlight if: // sky flag set, light flag set, value nonzero if ((contents & Q2_SURF_SKY) != 0 diff --git a/vis/vis.cc b/vis/vis.cc index 64daa1b8..afe29eaf 100644 --- a/vis/vis.cc +++ b/vis/vis.cc @@ -1234,7 +1234,7 @@ main(int argc, char **argv) { bspdata_t bspdata; mbsp_t *const bsp = &bspdata.data.mbsp; - int32_t loadversion; + const bspversion_t *loadversion; int i; init_log("vis.log"); @@ -1309,7 +1309,7 @@ main(int argc, char **argv) LoadBSPFile(sourcefile, &bspdata); loadversion = bspdata.version; - ConvertBSPFormat(GENERIC_BSP, &bspdata); + ConvertBSPFormat(&bspdata, &bspver_generic); strcpy(portalfile, argv[i]); StripExtension(portalfile); @@ -1341,7 +1341,7 @@ main(int argc, char **argv) CalcAmbientSounds(bsp); /* Convert data format back if necessary */ - ConvertBSPFormat(loadversion, &bspdata); + ConvertBSPFormat(&bspdata, loadversion); WriteBSPFile(sourcefile, &bspdata); From 6c19c3c927076b9e6e458bc26a160e2a3a3f726b Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Mon, 20 Sep 2021 18:38:31 -0600 Subject: [PATCH 19/19] Revert "Revert "Q2bsp VIS support (#315)"" This reverts commit 5465ab4ff648d1cdaf1b8f0d842d51ef5d24b54c. --- common/bspfile.cc | 229 +++++++++++++++++++++++++++++++++++++- common/cmdlib.cc | 2 +- include/common/bspfile.hh | 12 +- light/trace_embree.cc | 4 +- qbsp3/common/bspfile.cc | 72 ------------ qbsp3/common/bspfile.h | 3 - vis/vis.cc | 121 +++++++++++--------- 7 files changed, 304 insertions(+), 139 deletions(-) diff --git a/common/bspfile.cc b/common/bspfile.cc index 9f96e755..560a6928 100644 --- a/common/bspfile.cc +++ b/common/bspfile.cc @@ -964,6 +964,36 @@ Q2BSPtoM_Models(const q2_dmodel_t *dmodelsq2, int nummodels) { return newdata; } +static uint8_t * +Q2BSPtoM_CopyVisData(const dvis_t *dvisq2, int vissize, int *outvissize, mleaf_t *leafs, int numleafs) { + + if (!*outvissize) { + return ((uint8_t *) dvisq2); + } + + // FIXME: assumes PHS always follows PVS. + int32_t phs_start = INT_MAX, pvs_start = INT_MAX; + size_t header_offset = sizeof(dvis_t) + (sizeof(int32_t) * dvisq2->numclusters * 2); + + for (int32_t i = 0; i < dvisq2->numclusters; i++) { + pvs_start = std::min(pvs_start, (int32_t) (dvisq2->bitofs[i][DVIS_PVS])); + phs_start = std::min(phs_start, (int32_t) (dvisq2->bitofs[i][DVIS_PHS] - header_offset)); + + for (int32_t l = 0; l < numleafs; l++) { + if (leafs[l].cluster == i) { + leafs[l].visofs = dvisq2->bitofs[i][DVIS_PVS] - header_offset; + } + } + } + + // cut off the PHS and header + *outvissize -= header_offset + ((*outvissize - header_offset) - phs_start); + + uint8_t *vis = (uint8_t *) calloc(1, *outvissize); + memcpy(vis, ((uint8_t *) dvisq2) + pvs_start, *outvissize); + return vis; +} + static q2_dmodel_t * MBSPtoQ2_Models(const dmodelh2_t *dmodelsh2, int nummodels) { const dmodelh2_t *dmodelh2 = dmodelsh2; @@ -986,6 +1016,128 @@ MBSPtoQ2_Models(const dmodelh2_t *dmodelsh2, int nummodels) { return newdata; } + +/* +================ +CalcPHS + +Calculate the PHS (Potentially Hearable Set) +by ORing together all the PVS visible from a leaf +================ +*/ +static std::vector CalcPHS(int32_t portalclusters, const uint8_t *visdata, int *visdatasize, int32_t bitofs[][2]) +{ + const int32_t leafbytes = (portalclusters + 7) >> 3; + const int32_t leaflongs = leafbytes / sizeof(long); + std::vector compressed_phs; + uint8_t *uncompressed = (uint8_t *) calloc(1, leafbytes); + uint8_t *uncompressed_2 = (uint8_t *) calloc(1, leafbytes); + uint8_t *compressed = (uint8_t *) calloc(1, leafbytes * 2); + uint8_t *uncompressed_orig = (uint8_t *) calloc(1, leafbytes); + + printf ("Building PHS...\n"); + + int32_t count = 0; + for (int32_t i = 0; i < portalclusters; i++) + { + const uint8_t *scan = &visdata[bitofs[i][DVIS_PVS]]; + + DecompressRow(scan, leafbytes, uncompressed); + memset(uncompressed_orig, 0, leafbytes); + memcpy(uncompressed_orig, uncompressed, leafbytes); + + scan = uncompressed_orig; + + for (int32_t j = 0; j < leafbytes; j++) + { + uint8_t bitbyte = scan[j]; + if (!bitbyte) + continue; + for (int32_t k = 0; k < 8; k++) + { + if (! (bitbyte & (1<= portalclusters) + Error ("Bad bit in PVS"); // pad bits should be 0 + const uint8_t *src_compressed = &visdata[bitofs[index][DVIS_PVS]]; + DecompressRow(src_compressed, leafbytes, uncompressed_2); + const long *src = (long *) uncompressed_2; + long *dest = (long *) uncompressed; + for (int32_t l = 0; l < leaflongs; l++) + ((long *)uncompressed)[l] |= src[l]; + } + } + for (int32_t j = 0; j < portalclusters; j++) + if (uncompressed[j>>3] & (1<<(j&7)) ) + count++; + + // + // compress the bit string + // + int32_t j = CompressRow (uncompressed, leafbytes, compressed); + + bitofs[i][DVIS_PHS] = compressed_phs.size(); + + compressed_phs.insert(compressed_phs.end(), compressed, compressed + j); + } + + free(uncompressed); + free(uncompressed_2); + free(compressed); + free(uncompressed_orig); + + printf ("Average clusters hearable: %i\n", count / portalclusters); + + return compressed_phs; +} + +static dvis_t * +MBSPtoQ2_CopyVisData(const uint8_t *visdata, int *visdatasize, int numleafs, const mleaf_t *leafs) { + int32_t num_clusters = 0; + + for (int32_t i = 0; i < numleafs; i++) { + num_clusters = std::max(num_clusters, leafs[i].cluster + 1); + } + + size_t vis_offset = sizeof(dvis_t) + (sizeof(int32_t) * num_clusters * 2); + dvis_t *vis = (dvis_t *)calloc(1, vis_offset + *visdatasize); + + vis->numclusters = num_clusters; + + // the leaves are already using a per-cluster visofs, so just find one matching + // cluster and note it down under bitofs. + // we're also not worrying about PHS currently. + for (int32_t i = 0; i < num_clusters; i++) { + for (int32_t l = 0; l < numleafs; l++) { + if (leafs[l].cluster == i) { + // copy PVS visofs + vis->bitofs[i][DVIS_PVS] = leafs[l].visofs; + break; + } + } + } + + std::vector phs = CalcPHS(num_clusters, visdata, visdatasize, vis->bitofs); + + vis = (dvis_t *) realloc(vis, vis_offset + *visdatasize + phs.size()); + + // offset the pvs/phs properly + for (int32_t i = 0; i < num_clusters; i++) { + vis->bitofs[i][DVIS_PVS] += vis_offset; + vis->bitofs[i][DVIS_PHS] += vis_offset + *visdatasize; + } + + memcpy(((uint8_t *) vis) + vis_offset, visdata, *visdatasize); + *visdatasize += vis_offset; + + memcpy(((uint8_t *) vis) + *visdatasize, phs.data(), phs.size()); + *visdatasize += phs.size(); + + return vis; +} + static mleaf_t * Q2BSPtoM_Leafs(const q2_dleaf_t *dleafsq2, int numleafs) { const q2_dleaf_t *dleafq2 = dleafsq2; @@ -1940,7 +2092,7 @@ static void FreeMBSP(mbsp_t *bsp) inline void ConvertBSPToMFormatComplete(const bspversion_t **mbsp_loadversion, const bspversion_t *version, bspdata_t *bspdata) { - *mbsp_loadversion = bspdata->version; + bspdata->loadversion = *mbsp_loadversion = bspdata->version; bspdata->version = version; } @@ -2036,7 +2188,6 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) // copy or convert data mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); - mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); mbsp->dleafs = Q2BSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); @@ -2049,6 +2200,8 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) mbsp->dleaffaces = BSP29to2_Marksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); mbsp->dleafbrushes = Q2BSPtoM_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); + + mbsp->dvisdata = Q2BSPtoM_CopyVisData(q2bsp->dvis, q2bsp->visdatasize, &mbsp->visdatasize, mbsp->dleafs, mbsp->numleafs); mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); @@ -2091,7 +2244,6 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) // copy or convert data mbsp->dmodels = Q2BSPtoM_Models(q2bsp->dmodels, q2bsp->nummodels); - mbsp->dvisdata = (uint8_t *)CopyArray(q2bsp->dvis, q2bsp->visdatasize, 1); mbsp->dlightdata = BSP29_CopyLightData(q2bsp->dlightdata, q2bsp->lightdatasize); mbsp->dentdata = BSP29_CopyEntData(q2bsp->dentdata, q2bsp->entdatasize); mbsp->dleafs = Q2BSP_QBSPtoM_Leafs(q2bsp->dleafs, q2bsp->numleafs); @@ -2104,6 +2256,8 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) mbsp->dleaffaces = BSP2_CopyMarksurfaces(q2bsp->dleaffaces, q2bsp->numleaffaces); mbsp->dleafbrushes = Q2BSP_Qbism_CopyLeafBrushes(q2bsp->dleafbrushes, q2bsp->numleafbrushes); mbsp->dsurfedges = BSP29_CopySurfedges(q2bsp->dsurfedges, q2bsp->numsurfedges); + + mbsp->dvisdata = Q2BSPtoM_CopyVisData(q2bsp->dvis, q2bsp->visdatasize, &mbsp->visdatasize, mbsp->dleafs, mbsp->numleafs); mbsp->dareas = Q2BSP_CopyAreas(q2bsp->dareas, q2bsp->numareas); mbsp->dareaportals = Q2BSP_CopyAreaPortals(q2bsp->dareaportals, q2bsp->numareaportals); @@ -2297,7 +2451,7 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) // copy or convert data q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); - q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); + q2bsp->dvis = MBSPtoQ2_CopyVisData(mbsp->dvisdata, &q2bsp->visdatasize, mbsp->numleafs, mbsp->dleafs); q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); q2bsp->dleafs = MBSPtoQ2_Leafs(mbsp->dleafs, mbsp->numleafs); @@ -2352,7 +2506,7 @@ ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version) // copy or convert data q2bsp->dmodels = MBSPtoQ2_Models(mbsp->dmodels, mbsp->nummodels); - q2bsp->dvis = (dvis_t *)CopyArray(mbsp->dvisdata, mbsp->visdatasize, 1); + q2bsp->dvis = MBSPtoQ2_CopyVisData(mbsp->dvisdata, &q2bsp->visdatasize, mbsp->numleafs, mbsp->dleafs); q2bsp->dlightdata = BSP29_CopyLightData(mbsp->dlightdata, mbsp->lightdatasize); q2bsp->dentdata = BSP29_CopyEntData(mbsp->dentdata, mbsp->entdatasize); q2bsp->dleafs = MBSPtoQ2_Qbism_Leafs(mbsp->dleafs, mbsp->numleafs); @@ -3410,3 +3564,68 @@ PrintBSPFileSizes(const bspdata_t *bspdata) logprint("%7s %-12s %10i\n", "", "entdata", bsp->entdatasize); } } + +/* + =============== + CompressRow + =============== +*/ +int +CompressRow(const uint8_t *vis, const int numbytes, uint8_t *out) +{ + int i, rep; + uint8_t *dst; + + dst = out; + for (i = 0; i < numbytes; i++) { + *dst++ = vis[i]; + if (vis[i]) + continue; + + rep = 1; + for (i++; i < numbytes; i++) + if (vis[i] || rep == 255) + break; + else + rep++; + *dst++ = rep; + i--; + } + + return dst - out; +} + +/* +=================== +DecompressRow +=================== +*/ +void +DecompressRow (const uint8_t *in, const int numbytes, uint8_t *decompressed) +{ + int c; + uint8_t *out; + int row; + + row = numbytes; + out = decompressed; + + do + { + if (*in) + { + *out++ = *in++; + continue; + } + + c = in[1]; + if (!c) + Error ("DecompressVis: 0 repeat"); + in += 2; + while (c) + { + *out++ = 0; + c--; + } + } while (out - decompressed < row); +} diff --git a/common/cmdlib.cc b/common/cmdlib.cc index 5b482183..2ed0e081 100644 --- a/common/cmdlib.cc +++ b/common/cmdlib.cc @@ -217,7 +217,7 @@ SetQdirFromPath(const char *basedirname, const char *path) } if (pos == -1) { - logprint("SetQ2dirFromPath: failed to find %s in '%s'", basedir, path); + logprint("SetQ2dirFromPath: failed to find %s in '%s'\n", basedir, path); ClearQdir(); return; } diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index 9183755b..68463364 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -575,10 +575,10 @@ typedef struct { // compressed bit vectors #define DVIS_PVS 0 #define DVIS_PHS 1 -typedef struct { +struct dvis_t { int32_t numclusters; - int32_t bitofs[8][2]; // bitofs[numclusters][2] -} dvis_t; + int32_t bitofs[][2]; // bitofs[numclusters][2] +}; // each area has a list of portals that lead into other areas // when portals are closed, other areas may not be visible or @@ -965,4 +965,10 @@ void ConvertBSPFormat(bspdata_t *bspdata, const bspversion_t *to_version); void BSPX_AddLump(bspdata_t *bspdata, const char *xname, const void *xdata, size_t xsize); const void *BSPX_GetLump(bspdata_t *bspdata, const char *xname, size_t *xsize); +void +DecompressRow (const uint8_t *in, const int numbytes, uint8_t *decompressed); + +int +CompressRow(const uint8_t *vis, const int numbytes, uint8_t *out); + #endif /* __COMMON_BSPFILE_H__ */ diff --git a/light/trace_embree.cc b/light/trace_embree.cc index f9a5322e..0575f804 100644 --- a/light/trace_embree.cc +++ b/light/trace_embree.cc @@ -657,8 +657,8 @@ Embree_TraceInit(const mbsp_t *bsp) // Q2: arghrad compat: sky faces only emit sunlight if: // sky flag set, light flag set, value nonzero if ((contents & Q2_SURF_SKY) != 0 - && (contents & Q2_SURF_LIGHT) != 0 - && texinfo->value != 0) + && (!arghradcompat || ((contents & Q2_SURF_LIGHT) != 0 + && texinfo->value != 0))) { skyfaces.push_back(face); continue; diff --git a/qbsp3/common/bspfile.cc b/qbsp3/common/bspfile.cc index 61997668..6f01ea62 100644 --- a/qbsp3/common/bspfile.cc +++ b/qbsp3/common/bspfile.cc @@ -86,78 +86,6 @@ dareaportal_t dareaportals[MAX_MAP_AREAPORTALS]; uint8_t dpop[256]; -/* -=============== -CompressVis - -=============== -*/ -int CompressVis (uint8_t *vis, uint8_t *dest) -{ - int j; - int rep; - int visrow; - uint8_t *dest_p; - - dest_p = dest; -// visrow = (r_numvisleafs + 7)>>3; - visrow = (dvis->numclusters + 7)>>3; - - for (j=0 ; j>3; - row = (dvis->numclusters+7)>>3; - out = decompressed; - - do - { - if (*in) - { - *out++ = *in++; - continue; - } - - c = in[1]; - if (!c) - Error ("DecompressVis: 0 repeat"); - in += 2; - while (c) - { - *out++ = 0; - c--; - } - } while (out - decompressed < row); -} - //============================================================================= /* diff --git a/qbsp3/common/bspfile.h b/qbsp3/common/bspfile.h index 7e388a4b..02f11053 100644 --- a/qbsp3/common/bspfile.h +++ b/qbsp3/common/bspfile.h @@ -80,9 +80,6 @@ extern dbrushside_t dbrushsides[MAX_MAP_BRUSHSIDES]; extern uint8_t dpop[256]; -void DecompressVis (uint8_t *in, uint8_t *decompressed); -int CompressVis (uint8_t *vis, uint8_t *dest); - void LoadBSPFile (char *filename); void LoadBSPFileTexinfo (char *filename); // just for qdata void WriteBSPFile (char *filename); diff --git a/vis/vis.cc b/vis/vis.cc index afe29eaf..84c1813f 100644 --- a/vis/vis.cc +++ b/vis/vis.cc @@ -31,10 +31,12 @@ static uint8_t *vismap; static uint8_t *vismap_p; static uint8_t *vismap_end; // past visfile -int originalvismapsize; +uint32_t originalvismapsize; uint8_t *uncompressed; // [leafbytes_real*portalleafs] +uint8_t *uncompressed_q2; // [leafbytes*portalleafs] + int leafbytes; // (portalleafs+63)>>3 int leaflongs; int leafbytes_real; // (portalleafs_real+63)>>3 @@ -545,36 +547,6 @@ LeafThread(void *arg) return NULL; } -/* - =============== - CompressRow - =============== -*/ -static int -CompressRow(const uint8_t *vis, const int numbytes, uint8_t *out) -{ - int i, rep; - uint8_t *dst; - - dst = out; - for (i = 0; i < numbytes; i++) { - *dst++ = vis[i]; - if (vis[i]) - continue; - - rep = 1; - for (i++; i < numbytes; i++) - if (vis[i] || rep == 255) - break; - else - rep++; - *dst++ = rep; - i--; - } - - return dst - out; -} - /* =============== @@ -586,7 +558,7 @@ CompressRow(const uint8_t *vis, const int numbytes, uint8_t *out) int64_t totalvis; static void -LeafFlow(int leafnum, mleaf_t *dleaf) +LeafFlow(int leafnum, mleaf_t *dleaf, const mbsp_t *bsp) { leaf_t *leaf; uint8_t *outbuffer; @@ -599,7 +571,7 @@ LeafFlow(int leafnum, mleaf_t *dleaf) /* * flow through all portals, collecting visible bits */ - outbuffer = uncompressed + leafnum * leafbytes; + outbuffer = (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism ? uncompressed_q2 : uncompressed) + leafnum * leafbytes; leaf = &leafs[leafnum]; for (i = 0; i < leaf->numportals; i++) { p = leaf->portals[i]; @@ -645,8 +617,8 @@ LeafFlow(int leafnum, mleaf_t *dleaf) } -void -ClusterFlow(int clusternum, leafbits_t *buffer) +static void +ClusterFlow(int clusternum, leafbits_t *buffer, const mbsp_t *bsp) { leaf_t *leaf; uint8_t *outbuffer; @@ -680,11 +652,22 @@ ClusterFlow(int clusternum, leafbits_t *buffer) * Now expand the clusters into the full leaf visibility map */ numvis = 0; - outbuffer = uncompressed + clusternum * leafbytes_real; - for (i = 0; i < portalleafs_real; i++) { - if (TestLeafBit(buffer, clustermap[i])) { - outbuffer[i >> 3] |= (1 << (i & 7)); - numvis++; + + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { + outbuffer = uncompressed_q2 + clusternum * leafbytes; + for (i = 0; i < portalleafs; i++) { + if (TestLeafBit(buffer, i)) { + outbuffer[i >> 3] |= (1 << (i & 7)); + numvis++; + } + } + } else { + outbuffer = uncompressed + clusternum * leafbytes_real; + for (i = 0; i < portalleafs_real; i++) { + if (TestLeafBit(buffer, clustermap[i])) { + outbuffer[i >> 3] |= (1 << (i & 7)); + numvis++; + } } } @@ -705,8 +688,13 @@ ClusterFlow(int clusternum, leafbits_t *buffer) } /* Allocate for worst case where RLE might grow the data (unlikely) */ - compressed = static_cast(malloc(portalleafs_real * 2 / 8)); - len = CompressRow(outbuffer, (portalleafs_real + 7) >> 3, compressed); + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { + compressed = static_cast(malloc(portalleafs * 2 / 8)); + len = CompressRow(outbuffer, (portalleafs + 7) >> 3, compressed); + } else { + compressed = static_cast(malloc(portalleafs_real * 2 / 8)); + len = CompressRow(outbuffer, (portalleafs_real + 7) >> 3, compressed); + } dest = vismap_p; vismap_p += len; @@ -751,6 +739,8 @@ CalcPortalVis(const mbsp_t *bsp) } RunThreadsOn(startcount, numportals * 2, LeafThread, NULL); + SaveVisState(); + if (verbose) { logprint("portalcheck: %i portaltest: %i portalpass: %i\n", c_portalcheck, c_portaltest, c_portalpass); @@ -785,7 +775,7 @@ CalcVis(const mbsp_t *bsp) // if (portalleafs == portalleafs_real) { for (i = 0; i < portalleafs; i++) - LeafFlow(i, &bsp->dleafs[i + 1]); + LeafFlow(i, &bsp->dleafs[i + 1], bsp); } else { leafbits_t *buffer; @@ -793,7 +783,7 @@ CalcVis(const mbsp_t *bsp) buffer = static_cast(malloc(LeafbitsSize(portalleafs))); for (i = 0; i < portalleafs; i++) { memset(buffer, 0, LeafbitsSize(portalleafs)); - ClusterFlow(i, buffer); + ClusterFlow(i, buffer, bsp); } free(buffer); @@ -1070,9 +1060,17 @@ LoadPortals(char *name, mbsp_t *bsp) count = fscanf(f, "%i\n%i\n", &portalleafs, &numportals); if (count != 2) Error("%s: unable to parse %s HEADER\n", __func__, PORTALFILE); - portalleafs_real = portalleafs; - logprint("%6d leafs\n", portalleafs); - logprint("%6d portals\n", numportals); + + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { + portalleafs_real = bsp->numleafs; + logprint("%6d leafs\n", portalleafs_real); + logprint("%6d clusters\n", portalleafs); + logprint("%6d portals\n", numportals); + } else { + portalleafs_real = portalleafs; + logprint("%6d leafs\n", portalleafs); + logprint("%6d portals\n", numportals); + } } else if (!strcmp(magic, PORTALFILE2)) { count = fscanf(f, "%i\n%i\n%i\n", &portalleafs_real, &portalleafs, &numportals); @@ -1103,7 +1101,11 @@ LoadPortals(char *name, mbsp_t *bsp) leafs = static_cast(malloc(portalleafs * sizeof(leaf_t))); memset(leafs, 0, portalleafs * sizeof(leaf_t)); - originalvismapsize = portalleafs_real * ((portalleafs_real + 7) / 8); + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { + originalvismapsize = portalleafs * ((portalleafs + 7) / 8); + } else { + originalvismapsize = portalleafs_real * ((portalleafs_real + 7) / 8); + } // FIXME - more intelligent allocation? bsp->dvisdata = static_cast(malloc(MAX_MAP_VISIBILITY)); @@ -1178,7 +1180,13 @@ LoadPortals(char *name, mbsp_t *bsp) } /* Load the cluster expansion map if needed */ - if (portalleafs != portalleafs_real) { + if (bsp->loadversion == &bspver_q2 || bsp->loadversion == &bspver_qbism) { + clustermap = static_cast(malloc(portalleafs_real * sizeof(int))); + + for (int32_t i = 0; i < bsp->numleafs; i++) { + clustermap[i] = bsp->dleafs[i + 1].cluster; + } + } else if (portalleafs != portalleafs_real) { clustermap = static_cast(malloc(portalleafs_real * sizeof(int))); if (!strcmp(magic, PORTALFILE2)) { for (i = 0; i < portalleafs; i++) { @@ -1325,7 +1333,11 @@ main(int argc, char **argv) StripExtension(statetmpfile); DefaultExtension(statetmpfile, ".vi0"); - uncompressed = static_cast(calloc(portalleafs, leafbytes_real)); + if (bsp->loadversion != &bspver_q2 && bsp->loadversion != &bspver_qbism) { + uncompressed = static_cast(calloc(portalleafs, leafbytes_real)); + } else { + uncompressed_q2 = static_cast(calloc(portalleafs, leafbytes)); + } // CalcPassages (); @@ -1335,10 +1347,13 @@ main(int argc, char **argv) logprint("c_chains: %lu\n", c_chains); bsp->visdatasize = vismap_p - bsp->dvisdata; - logprint("visdatasize:%i compressed from %i\n", + logprint("visdatasize:%i compressed from %u\n", bsp->visdatasize, originalvismapsize); - - CalcAmbientSounds(bsp); + + // no ambient sounds for Q2 + if (bsp->loadversion != &bspver_q2 && bsp->loadversion != &bspver_qbism) { + CalcAmbientSounds(bsp); + } /* Convert data format back if necessary */ ConvertBSPFormat(&bspdata, loadversion);