Merge branch 'brushbsp' of https://github.com/ericwa/ericw-tools into brushbsp

This commit is contained in:
Jonathan 2022-06-14 10:50:54 -04:00
commit f1fd0bd30f
8 changed files with 424 additions and 2 deletions

View File

@ -26,6 +26,8 @@
#include <fmt/format.h>
#include <atomic>
static std::vector<qvec3b> make_palette(std::initializer_list<uint8_t> bytes)
{
Q_assert((bytes.size() % 3) == 0);
@ -183,12 +185,12 @@ public:
return !string_iequals(name, "hint");
}
constexpr contentflags_t create_sky_contents() const
contentflags_t create_sky_contents() const
{
return {CONTENTS_SKY};
}
constexpr contentflags_t create_liquid_contents(const int32_t &liquid_type) const
contentflags_t create_liquid_contents(const int32_t &liquid_type) const
{
return {liquid_type};
}

View File

@ -448,6 +448,32 @@ const mleaf_t* BSP_FindLeafAtPoint(const mbsp_t* bsp, const dmodelh2_t* model, c
return BSP_FindLeafAtPoint_r(bsp, model->headnode[0], point);
}
static int BSP_FindClipnodeAtPoint_r(
const mbsp_t *bsp, const int clipnodenum, const qvec3d &point)
{
if (clipnodenum < 0) {
// actually contents
return clipnodenum;
}
const auto *node = &bsp->dclipnodes.at(clipnodenum);
const vec_t dist = bsp->dplanes[node->planenum].distance_to_fast(point);
if (dist >= 0) {
return BSP_FindClipnodeAtPoint_r(bsp, node->children[0], point);
} else {
return BSP_FindClipnodeAtPoint_r(bsp, node->children[1], point);
}
}
int BSP_FindContentsAtPoint(const mbsp_t *bsp, int hull, const dmodelh2_t *model, const qvec3d &point)
{
if (hull == 0) {
return BSP_FindLeafAtPoint_r(bsp, model->headnode[0], point)->contents;
}
return BSP_FindClipnodeAtPoint_r(bsp, model->headnode.at(hull), point);
}
std::vector<const mface_t*> Leaf_Markfaces(const mbsp_t* bsp, const mleaf_t* leaf)
{
std::vector<const mface_t *> result;

View File

@ -70,6 +70,7 @@ const bsp2_dnode_t *BSP_FindNodeAtPoint(
const mbsp_t *bsp, const dmodelh2_t *model, const qvec3d &point, const qvec3d &wanted_normal);
const mleaf_t *BSP_FindLeafAtPoint(const mbsp_t *bsp, const dmodelh2_t *model, const qvec3d &point);
int BSP_FindContentsAtPoint(const mbsp_t *bsp, int hull, const dmodelh2_t *model, const qvec3d &point);
std::vector<const mface_t *> Leaf_Markfaces(const mbsp_t *bsp, const mleaf_t *leaf);
std::vector<const dbrush_t *> Leaf_Brushes(const mbsp_t *bsp, const mleaf_t *leaf);

View File

@ -800,6 +800,10 @@ static void ProcessEntity(mapentity_t *entity, const int hullnum)
// make a really good tree
nodes = SolidBSP(entity, false);
// fill again so PruneNodes works
PortalizeEntity(entity, nodes, hullnum);
FillOutside(entity, nodes, hullnum);
PruneNodes(nodes);
DetailToSolid(nodes);
}
}

View File

@ -1246,6 +1246,73 @@ TEST_CASE("q2_liquids", "[testmaps_q2][!mayfail]")
}
/**
* Empty rooms are sealed to solid in Q2
**/
TEST_CASE("qbsp_q2_seal_empty_rooms", "[testmaps_q2]") {
const mbsp_t bsp = LoadTestmapQ2("qbsp_q2_seal_empty_rooms.map");
CHECK(GAME_QUAKE_II == bsp.loadversion->game->id);
const qvec3d in_start_room {-240, 80, 56};
const qvec3d in_empty_room {-244, 476, 68};
// check leaf contents
CHECK(Q2_CONTENTS_EMPTY == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], in_start_room)->contents);
CHECK(Q2_CONTENTS_SOLID == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], in_empty_room)->contents);
}
/**
* Detail seals in Q2
**/
TEST_CASE("qbsp_q2_detail_seals", "[testmaps_q2][!mayfail]") {
const mbsp_t bsp = LoadTestmapQ2("qbsp_q2_detail_seals.map");
CHECK(GAME_QUAKE_II == bsp.loadversion->game->id);
const qvec3d in_start_room {-240, 80, 56};
const qvec3d in_void {-336, 80, 56};
// check leaf contents
CHECK(Q2_CONTENTS_EMPTY == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], in_start_room)->contents);
CHECK(Q2_CONTENTS_SOLID == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], in_void)->contents);
}
/**
* Q1 sealing test:
* - hull0 can use Q2 method (fill inside)
* - hull1+ can't, because it would cause areas containing no entities but connected by a thin gap to the
* rest of the world to get sealed off as solid.
**/
TEST_CASE("qbsp_q1_sealing", "[testmaps_q1]") {
const mbsp_t bsp = LoadTestmap("qbsp_q1_sealing.map");
CHECK(GAME_QUAKE == bsp.loadversion->game->id);
const qvec3d in_start_room {-192, 144, 104};
const qvec3d in_emptyroom {-168, 544, 104};
const qvec3d in_void {-16, -800, 56};
const qvec3d connected_by_thin_gap {72, 136, 104};
// check leaf contents in hull 0
CHECK(CONTENTS_EMPTY == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], in_start_room)->contents);
CHECK(CONTENTS_SOLID == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], in_emptyroom)->contents); // can get sealed, since there are no entities
CHECK(CONTENTS_SOLID == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], in_void)->contents);
CHECK(CONTENTS_EMPTY == BSP_FindLeafAtPoint(&bsp, &bsp.dmodels[0], connected_by_thin_gap)->contents);
// check leaf contents in hull 1
CHECK(CONTENTS_EMPTY == BSP_FindContentsAtPoint(&bsp, 1, &bsp.dmodels[0], in_start_room));
CHECK(CONTENTS_EMPTY == BSP_FindContentsAtPoint(&bsp, 1, &bsp.dmodels[0], in_emptyroom));
CHECK(CONTENTS_SOLID == BSP_FindContentsAtPoint(&bsp, 1, &bsp.dmodels[0], in_void));
CHECK(CONTENTS_EMPTY == BSP_FindContentsAtPoint(&bsp, 1, &bsp.dmodels[0], connected_by_thin_gap));
// check leaf contents in hull 2
CHECK(CONTENTS_EMPTY == BSP_FindContentsAtPoint(&bsp, 2, &bsp.dmodels[0], in_start_room));
CHECK(CONTENTS_EMPTY == BSP_FindContentsAtPoint(&bsp, 2, &bsp.dmodels[0], in_emptyroom));
CHECK(CONTENTS_SOLID == BSP_FindContentsAtPoint(&bsp, 2, &bsp.dmodels[0], in_void));
CHECK(CONTENTS_EMPTY == BSP_FindContentsAtPoint(&bsp, 2, &bsp.dmodels[0], connected_by_thin_gap));
}
TEST_CASE("winding", "[benchmark]") {
ankerl::nanobench::Bench bench;

View File

@ -0,0 +1,134 @@
// Game: Quake
// Format: Standard
// entity 0
{
"classname" "worldspawn"
"wad" "deprecated/free_wad.wad"
// brush 0
{
( -64 256 192 ) ( -64 32 192 ) ( -64 256 16 ) bolt9 0 -28 0 1 1
( -48 32 16 ) ( -64 32 16 ) ( -48 32 192 ) bolt9 0 0 0 1 1
( -48 256 36 ) ( -64 256 36 ) ( -48 32 36 ) bolt9 0 0 0 1 1
( -48 32 192 ) ( -64 32 192 ) ( -48 256 192 ) bolt9 0 0 0 1 1
( -48 256 192 ) ( -64 256 192 ) ( -48 256 16 ) bolt9 0 0 0 1 1
( -48 32 192 ) ( -48 256 192 ) ( -48 32 16 ) bolt9 0 0 0 1 1
}
// brush 1
{
( -304 32 16 ) ( -304 256 16 ) ( -304 32 192 ) bolt9 0 0 0 1 1
( -304 32 192 ) ( -288 32 192 ) ( -304 32 16 ) bolt9 0 0 0 1 1
( -304 32 16 ) ( -288 32 16 ) ( -304 256 16 ) bolt9 0 0 0 1 1
( -304 256 192 ) ( -288 256 192 ) ( -304 32 192 ) bolt9 0 0 0 1 1
( -304 256 16 ) ( -288 256 16 ) ( -304 256 192 ) bolt9 0 0 0 1 1
( -288 32 16 ) ( -288 32 192 ) ( -288 256 16 ) bolt9 0 0 0 1 1
}
// brush 2
{
( -288 256 192 ) ( -288 240 192 ) ( -288 256 16 ) bolt9 0 0 0 1 1
( -64 240 192 ) ( -64 240 16 ) ( -288 240 192 ) bolt9 0 0 0 1 1
( -288 256 16 ) ( -288 240 16 ) ( -64 256 16 ) bolt9 0 0 0 1 1
( -64 256 192 ) ( -64 240 192 ) ( -288 256 192 ) bolt9 0 0 0 1 1
( -64 256 192 ) ( -288 256 192 ) ( -64 256 16 ) bolt9 0 0 0 1 1
( 224 256 16 ) ( 224 240 16 ) ( 224 256 192 ) bolt9 0 0 0 1 1
}
// brush 3
{
( -288 32 16 ) ( -288 48 16 ) ( -288 32 192 ) bolt9 0 0 0 1 1
( -64 32 16 ) ( -288 32 16 ) ( -64 32 192 ) bolt9 0 0 0 1 1
( -64 32 16 ) ( -64 48 16 ) ( -288 32 16 ) bolt9 0 0 0 1 1
( -288 32 192 ) ( -288 48 192 ) ( -64 32 192 ) bolt9 0 0 0 1 1
( -288 48 16 ) ( -64 48 16 ) ( -288 48 192 ) bolt9 0 0 0 1 1
( 224 32 192 ) ( 224 48 192 ) ( 224 32 16 ) bolt9 0 0 0 1 1
}
// brush 4
{
( -288 48 192 ) ( -288 48 176 ) ( -288 240 192 ) bolt9 0 0 0 1 1
( -64 48 192 ) ( -64 48 176 ) ( -288 48 192 ) bolt9 0 0 0 1 1
( -64 240 176 ) ( -288 240 176 ) ( -64 48 176 ) bolt9 0 0 0 1 1
( -64 240 192 ) ( -64 48 192 ) ( -288 240 192 ) bolt9 0 0 0 1 1
( -288 240 192 ) ( -288 240 176 ) ( -64 240 192 ) bolt9 0 0 0 1 1
( 224 240 192 ) ( 224 240 176 ) ( 224 48 192 ) bolt9 0 0 0 1 1
}
// brush 5
{
( -288 240 16 ) ( -288 240 32 ) ( -288 48 16 ) bolt9 0 0 0 1 1
( -288 48 16 ) ( -288 48 32 ) ( -64 48 16 ) bolt9 0 0 0 1 1
( -288 240 16 ) ( -288 48 16 ) ( -64 240 16 ) bolt9 0 0 0 1 1
( -288 48 32 ) ( -288 240 32 ) ( -64 48 32 ) bolt9 0 0 0 1 1
( -64 240 16 ) ( -64 240 32 ) ( -288 240 16 ) bolt9 0 0 0 1 1
( 224 48 16 ) ( 224 48 32 ) ( 224 240 16 ) bolt9 0 0 0 1 1
}
// brush 6
{
( -64 656 192 ) ( -64 432 192 ) ( -64 656 16 ) bolt9 0 0 0 1 1
( -48 432 16 ) ( -64 432 16 ) ( -48 432 192 ) bolt9 0 0 0 1 1
( -48 656 16 ) ( -64 656 16 ) ( -48 432 16 ) bolt9 0 0 0 1 1
( -48 432 192 ) ( -64 432 192 ) ( -48 656 192 ) bolt9 0 0 0 1 1
( -48 656 192 ) ( -64 656 192 ) ( -48 656 16 ) bolt9 0 0 0 1 1
( -48 432 192 ) ( -48 656 192 ) ( -48 432 16 ) bolt9 0 0 0 1 1
}
// brush 7
{
( -304 432 16 ) ( -304 656 16 ) ( -304 432 192 ) bolt9 0 0 0 1 1
( -304 432 192 ) ( -288 432 192 ) ( -304 432 16 ) bolt9 0 0 0 1 1
( -304 432 16 ) ( -288 432 16 ) ( -304 656 16 ) bolt9 0 0 0 1 1
( -304 656 192 ) ( -288 656 192 ) ( -304 432 192 ) bolt9 0 0 0 1 1
( -304 656 16 ) ( -288 656 16 ) ( -304 656 192 ) bolt9 0 0 0 1 1
( -288 432 16 ) ( -288 432 192 ) ( -288 656 16 ) bolt9 0 0 0 1 1
}
// brush 8
{
( -288 656 192 ) ( -288 640 192 ) ( -288 656 16 ) bolt9 0 0 0 1 1
( -64 640 192 ) ( -64 640 16 ) ( -288 640 192 ) bolt9 0 0 0 1 1
( -288 656 16 ) ( -288 640 16 ) ( -64 656 16 ) bolt9 0 0 0 1 1
( -64 656 192 ) ( -64 640 192 ) ( -288 656 192 ) bolt9 0 0 0 1 1
( -64 656 192 ) ( -288 656 192 ) ( -64 656 16 ) bolt9 0 0 0 1 1
( -64 656 16 ) ( -64 640 16 ) ( -64 656 192 ) bolt9 0 0 0 1 1
}
// brush 9
{
( -288 432 16 ) ( -288 448 16 ) ( -288 432 192 ) bolt9 0 0 0 1 1
( -64 432 16 ) ( -288 432 16 ) ( -64 432 192 ) bolt9 0 0 0 1 1
( -64 432 16 ) ( -64 448 16 ) ( -288 432 16 ) bolt9 0 0 0 1 1
( -288 432 192 ) ( -288 448 192 ) ( -64 432 192 ) bolt9 0 0 0 1 1
( -288 448 16 ) ( -64 448 16 ) ( -288 448 192 ) bolt9 0 0 0 1 1
( -64 432 192 ) ( -64 448 192 ) ( -64 432 16 ) bolt9 0 0 0 1 1
}
// brush 10
{
( -288 448 192 ) ( -288 448 176 ) ( -288 640 192 ) bolt9 0 0 0 1 1
( -64 448 192 ) ( -64 448 176 ) ( -288 448 192 ) bolt9 0 0 0 1 1
( -64 640 176 ) ( -288 640 176 ) ( -64 448 176 ) bolt9 0 0 0 1 1
( -64 640 192 ) ( -64 448 192 ) ( -288 640 192 ) bolt9 0 0 0 1 1
( -288 640 192 ) ( -288 640 176 ) ( -64 640 192 ) bolt9 0 0 0 1 1
( -64 640 192 ) ( -64 640 176 ) ( -64 448 192 ) bolt9 0 0 0 1 1
}
// brush 11
{
( -288 640 16 ) ( -288 640 32 ) ( -288 448 16 ) bolt9 0 0 0 1 1
( -288 448 16 ) ( -288 448 32 ) ( -64 448 16 ) bolt9 0 0 0 1 1
( -288 640 16 ) ( -288 448 16 ) ( -64 640 16 ) bolt9 0 0 0 1 1
( -288 448 32 ) ( -288 640 32 ) ( -64 448 32 ) bolt9 0 0 0 1 1
( -64 640 16 ) ( -64 640 32 ) ( -288 640 16 ) bolt9 0 0 0 1 1
( -64 448 16 ) ( -64 448 32 ) ( -64 640 16 ) bolt9 0 0 0 1 1
}
// brush 12
{
( 208 48 32 ) ( 208 49 32 ) ( 208 48 33 ) bolt9 0 0 0 1 1
( 208 48 32 ) ( 208 48 33 ) ( 209 48 32 ) bolt9 0 0 0 1 1
( 208 48 32 ) ( 209 48 32 ) ( 208 49 32 ) bolt9 0 0 0 1 1
( 224 240 192 ) ( 224 241 192 ) ( 225 240 192 ) bolt9 0 0 0 1 1
( 224 240 40 ) ( 225 240 40 ) ( 224 240 41 ) bolt9 0 0 0 1 1
( 224 240 40 ) ( 224 240 41 ) ( 224 241 40 ) bolt9 0 0 0 1 1
}
}
// entity 1
{
"classname" "info_player_start"
"origin" "-240 80 56"
}
// entity 2
{
"classname" "light_fluorospark"
"origin" "-192 144 104"
}

View File

@ -0,0 +1,67 @@
// Game: Quake 2
// Format: Quake2
// entity 0
{
"classname" "worldspawn"
"_tb_textures" "textures/e1u1"
"message" "Detail brush seals the world"
// brush 0
{
( -64 256 192 ) ( -64 32 192 ) ( -64 256 16 ) e1u1/color1_6 0 0 0 1 1 134217728 0 0
( -48 32 16 ) ( -64 32 16 ) ( -48 32 192 ) e1u1/color1_6 0 0 0 1 1 134217728 0 0
( -48 256 16 ) ( -64 256 16 ) ( -48 32 16 ) e1u1/color1_6 0 0 0 1 1 134217728 0 0
( -48 32 192 ) ( -64 32 192 ) ( -48 256 192 ) e1u1/color1_6 0 0 0 1 1 134217728 0 0
( -48 256 192 ) ( -64 256 192 ) ( -48 256 16 ) e1u1/color1_6 0 0 0 1 1 134217728 0 0
( -48 32 192 ) ( -48 256 192 ) ( -48 32 16 ) e1u1/color1_6 0 0 0 1 1 134217728 0 0
}
// brush 1
{
( -304 32 16 ) ( -304 256 16 ) ( -304 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 32 192 ) ( -288 32 192 ) ( -304 32 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 32 16 ) ( -288 32 16 ) ( -304 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 256 192 ) ( -288 256 192 ) ( -304 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 256 16 ) ( -288 256 16 ) ( -304 256 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 32 16 ) ( -288 32 192 ) ( -288 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 2
{
( -288 256 192 ) ( -288 240 192 ) ( -288 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 192 ) ( -64 240 16 ) ( -288 240 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 256 16 ) ( -288 240 16 ) ( -64 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 256 192 ) ( -64 240 192 ) ( -288 256 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 256 192 ) ( -288 256 192 ) ( -64 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 256 16 ) ( -64 240 16 ) ( -64 256 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 3
{
( -288 32 16 ) ( -288 48 16 ) ( -288 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 32 16 ) ( -288 32 16 ) ( -64 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 32 16 ) ( -64 48 16 ) ( -288 32 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 32 192 ) ( -288 48 192 ) ( -64 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 48 16 ) ( -64 48 16 ) ( -288 48 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 32 192 ) ( -64 48 192 ) ( -64 32 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 4
{
( -288 48 192 ) ( -288 48 176 ) ( -288 240 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 48 192 ) ( -64 48 176 ) ( -288 48 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 176 ) ( -288 240 176 ) ( -64 48 176 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 192 ) ( -64 48 192 ) ( -288 240 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 240 192 ) ( -288 240 176 ) ( -64 240 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 192 ) ( -64 240 176 ) ( -64 48 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 5
{
( -288 240 16 ) ( -288 240 32 ) ( -288 48 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 48 16 ) ( -288 48 32 ) ( -64 48 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 240 16 ) ( -288 48 16 ) ( -64 240 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 48 32 ) ( -288 240 32 ) ( -64 48 32 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 16 ) ( -64 240 32 ) ( -288 240 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 48 16 ) ( -64 48 32 ) ( -64 240 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
}
// entity 1
{
"classname" "info_player_start"
"origin" "-240 80 56"
}

View File

@ -0,0 +1,121 @@
// Game: Quake 2
// Format: Quake2
// entity 0
{
"classname" "worldspawn"
"_tb_textures" "textures/e1u1"
"message" "Water brush has SKIP flag on the top face, makign it extend up to the ceiling"
// brush 0
{
( -64 256 192 ) ( -64 32 192 ) ( -64 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 32 16 ) ( -64 32 16 ) ( -48 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 256 16 ) ( -64 256 16 ) ( -48 32 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 32 192 ) ( -64 32 192 ) ( -48 256 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 256 192 ) ( -64 256 192 ) ( -48 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 32 192 ) ( -48 256 192 ) ( -48 32 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 1
{
( -304 32 16 ) ( -304 256 16 ) ( -304 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 32 192 ) ( -288 32 192 ) ( -304 32 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 32 16 ) ( -288 32 16 ) ( -304 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 256 192 ) ( -288 256 192 ) ( -304 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 256 16 ) ( -288 256 16 ) ( -304 256 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 32 16 ) ( -288 32 192 ) ( -288 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 2
{
( -288 256 192 ) ( -288 240 192 ) ( -288 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 192 ) ( -64 240 16 ) ( -288 240 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 256 16 ) ( -288 240 16 ) ( -64 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 256 192 ) ( -64 240 192 ) ( -288 256 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 256 192 ) ( -288 256 192 ) ( -64 256 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 256 16 ) ( -64 240 16 ) ( -64 256 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 3
{
( -288 32 16 ) ( -288 48 16 ) ( -288 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 32 16 ) ( -288 32 16 ) ( -64 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 32 16 ) ( -64 48 16 ) ( -288 32 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 32 192 ) ( -288 48 192 ) ( -64 32 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 48 16 ) ( -64 48 16 ) ( -288 48 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 32 192 ) ( -64 48 192 ) ( -64 32 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 4
{
( -288 48 192 ) ( -288 48 176 ) ( -288 240 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 48 192 ) ( -64 48 176 ) ( -288 48 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 176 ) ( -288 240 176 ) ( -64 48 176 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 192 ) ( -64 48 192 ) ( -288 240 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 240 192 ) ( -288 240 176 ) ( -64 240 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 192 ) ( -64 240 176 ) ( -64 48 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 5
{
( -288 240 16 ) ( -288 240 32 ) ( -288 48 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 48 16 ) ( -288 48 32 ) ( -64 48 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 240 16 ) ( -288 48 16 ) ( -64 240 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 48 32 ) ( -288 240 32 ) ( -64 48 32 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 240 16 ) ( -64 240 32 ) ( -288 240 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 48 16 ) ( -64 48 32 ) ( -64 240 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 6
{
( -64 656 192 ) ( -64 432 192 ) ( -64 656 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 432 16 ) ( -64 432 16 ) ( -48 432 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 656 16 ) ( -64 656 16 ) ( -48 432 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 432 192 ) ( -64 432 192 ) ( -48 656 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 656 192 ) ( -64 656 192 ) ( -48 656 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -48 432 192 ) ( -48 656 192 ) ( -48 432 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 7
{
( -304 432 16 ) ( -304 656 16 ) ( -304 432 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 432 192 ) ( -288 432 192 ) ( -304 432 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 432 16 ) ( -288 432 16 ) ( -304 656 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 656 192 ) ( -288 656 192 ) ( -304 432 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -304 656 16 ) ( -288 656 16 ) ( -304 656 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 432 16 ) ( -288 432 192 ) ( -288 656 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 8
{
( -288 656 192 ) ( -288 640 192 ) ( -288 656 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 640 192 ) ( -64 640 16 ) ( -288 640 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 656 16 ) ( -288 640 16 ) ( -64 656 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 656 192 ) ( -64 640 192 ) ( -288 656 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 656 192 ) ( -288 656 192 ) ( -64 656 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 656 16 ) ( -64 640 16 ) ( -64 656 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 9
{
( -288 432 16 ) ( -288 448 16 ) ( -288 432 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 432 16 ) ( -288 432 16 ) ( -64 432 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 432 16 ) ( -64 448 16 ) ( -288 432 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 432 192 ) ( -288 448 192 ) ( -64 432 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 448 16 ) ( -64 448 16 ) ( -288 448 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 432 192 ) ( -64 448 192 ) ( -64 432 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 10
{
( -288 448 192 ) ( -288 448 176 ) ( -288 640 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 448 192 ) ( -64 448 176 ) ( -288 448 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 640 176 ) ( -288 640 176 ) ( -64 448 176 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 640 192 ) ( -64 448 192 ) ( -288 640 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 640 192 ) ( -288 640 176 ) ( -64 640 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 640 192 ) ( -64 640 176 ) ( -64 448 192 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
// brush 11
{
( -288 640 16 ) ( -288 640 32 ) ( -288 448 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 448 16 ) ( -288 448 32 ) ( -64 448 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 640 16 ) ( -288 448 16 ) ( -64 640 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -288 448 32 ) ( -288 640 32 ) ( -64 448 32 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 640 16 ) ( -64 640 32 ) ( -288 640 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
( -64 448 16 ) ( -64 448 32 ) ( -64 640 16 ) e1u1/color1_6 0 0 0 1 1 0 0 0
}
}
// entity 1
{
"classname" "info_player_start"
"origin" "-240 80 56"
}