diff --git a/common/bspfile.cc b/common/bspfile.cc index 81028cf1..f155b9e0 100644 --- a/common/bspfile.cc +++ b/common/bspfile.cc @@ -628,6 +628,22 @@ public: return contents_are_solid(contents) || contents_are_sky(contents); } + bool contents_are_opaque(const contentflags_t &contents, bool transwater) const override + { + auto bits = contentflags_to_bits(contents).visible_contents(); + + if (bits.solid) return true; + else if (bits.sky) return true; + else if (bits.wall) return true; + else if (bits.fence) return false; + else if (bits.lava) return !transwater; + else if (bits.slime) return !transwater; + else if (bits.water) return !transwater; + else if (bits.mist) return false; + + return false; + } + contentflags_t contents_remap_for_export(const contentflags_t &contents, remap_type_t type) const override { /* @@ -1310,6 +1326,22 @@ struct gamedef_q2_t : public gamedef_t return contents_are_solid(contents) || contents_are_sky(contents); } + bool contents_are_opaque(const contentflags_t &contents, bool transwater) const override + { + int32_t c = contents.native; + + if (!this->visible_contents(c)) + return false; + + // it's visible.. + + if (c & Q2_CONTENTS_TRANSLUCENT) { + return false; + } + + return true; + } + contentflags_t contents_remap_for_export(const contentflags_t &contents, remap_type_t type) const override { // HACK: borrowing Q2_CONTENTS_MONSTER for func_detail_wall diff --git a/docs/maputil.rst b/docs/maputil.rst index 2deca83e..4b3c243e 100644 --- a/docs/maputil.rst +++ b/docs/maputil.rst @@ -7,7 +7,7 @@ maputil - utiltiy for working with Quake MAP files Synopsis ======== -**bsputil** [OPTION]... MAPFILE +**maputil** MAPFILE [OPTION]... Options ======= diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index d9ac5e21..bf008470 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -298,6 +298,7 @@ struct gamedef_t virtual bool portal_can_see_through( const contentflags_t &contents0, const contentflags_t &contents1, bool transwater, bool transsky) const = 0; virtual bool contents_seals_map(const contentflags_t &contents) const = 0; + virtual bool contents_are_opaque(const contentflags_t &contents, bool transwater) const = 0; enum class remap_type_t { brush, diff --git a/include/qbsp/qbsp.hh b/include/qbsp/qbsp.hh index 09e1cc2d..121b0601 100644 --- a/include/qbsp/qbsp.hh +++ b/include/qbsp/qbsp.hh @@ -174,6 +174,7 @@ public: setting_int32 subdivide; setting_bool nofill; setting_bool nomerge; + setting_bool mergeacrosswater; setting_bool noedgereuse; setting_bool noclip; setting_bool noskip; diff --git a/qbsp/merge.cc b/qbsp/merge.cc index 043e7d2a..b009b942 100644 --- a/qbsp/merge.cc +++ b/qbsp/merge.cc @@ -72,12 +72,14 @@ static std::unique_ptr TryMerge(const face_t *f1, const face_t *f2) f1->original_side->lmshift != f2->original_side->lmshift) return NULL; - // TODO: make this configurable? if (qbsp_options.target_game->id != GAME_QUAKE_II) { - // Q1: don't merge across water boundaries; ezQuake/nQuake water caustics will leak onto - // above-water faces. - if (f1->contents[0].is_liquid(qbsp_options.target_game) != f2->contents[0].is_liquid(qbsp_options.target_game)) - return nullptr; + if (!qbsp_options.mergeacrosswater.value()) { + // Q1: don't merge across water boundaries; ezQuake/nQuake water caustics will leak onto + // above-water faces. + if (f1->contents[0].is_liquid(qbsp_options.target_game) != + f2->contents[0].is_liquid(qbsp_options.target_game)) + return nullptr; + } // Q1: don't merge across sky boundary - we delete faces inside sky if (f1->contents[0].is_sky(qbsp_options.target_game) != f2->contents[0].is_sky(qbsp_options.target_game)) diff --git a/qbsp/qbsp.cc b/qbsp/qbsp.cc index 20df62da..57053979 100644 --- a/qbsp/qbsp.cc +++ b/qbsp/qbsp.cc @@ -463,6 +463,7 @@ qbsp_settings::qbsp_settings() "change the subdivide threshold, in luxels. 0 will disable subdivision entirely"}, nofill{this, "nofill", false, &debugging_group, "don't perform outside filling"}, nomerge{this, "nomerge", false, &debugging_group, "don't perform face merging"}, + mergeacrosswater{this, "mergeacrosswater", false, &common_format_group, "merge faces that cross above and below water"}, noedgereuse{this, "noedgereuse", false, &debugging_group, "don't reuse edges (for debugging software rendering)"}, noclip{this, "noclip", false, &common_format_group, "don't write clip nodes (Q1-like BSP formats)"}, noskip{this, "noskip", false, &debugging_group, "don't remove faces with the 'skip' texture"}, diff --git a/qbsp/tjunc.cc b/qbsp/tjunc.cc index 0e23ab91..5cb2617c 100644 --- a/qbsp/tjunc.cc +++ b/qbsp/tjunc.cc @@ -143,21 +143,46 @@ static void FindEdgeVerts_BruteForce( * tjunc fixes. func_detail_wall is meant to act like a separate mesh, * so it shouldn't interact with solid. */ + +static bool Welds(const contentflags_t &a, const contentflags_t &b) +{ + // FIXME: no clipping same type? + + // all types weld with themselves + if (a.types_equal(b, qbsp_options.target_game)) + return true; + + // detail wall only welds with detail wall + if (qbsp_options.target_game->contents_are_detail_wall(a) + || qbsp_options.target_game->contents_are_detail_wall(b)) + return false; + + // no need to weld translucent to opaque + // (because they could have void behind them due to visblocking. + // e.g. opaque water meeting solid) + if (!qbsp_options.target_game->contents_are_opaque(a, qbsp_options.transwater.value()) + && qbsp_options.target_game->contents_are_opaque(b, qbsp_options.transwater.value())) + return false; + if (!qbsp_options.target_game->contents_are_opaque(b, qbsp_options.transwater.value()) + && qbsp_options.target_game->contents_are_opaque(a, qbsp_options.transwater.value())) + return false; + + // never weld with backfaces + if (qbsp_options.target_game->contents_are_empty(a) + || qbsp_options.target_game->contents_are_empty(b)) + return false; + + // otherwise, weld + return true; +} + static bool HasTJuncInteraction(const face_t *f1, const face_t *f2) { // FIXME: handle func_detail_fence, func_detail_illusionary, // liquids? make sure a combination of solid + func_detail_wall // is treated as solid? - if (f1->contents.back.is_detail_wall(qbsp_options.target_game) && - !f2->contents.back.is_detail_wall(qbsp_options.target_game)) - return false; - - if (f2->contents.back.is_detail_wall(qbsp_options.target_game) && - !f1->contents.back.is_detail_wall(qbsp_options.target_game)) - return false; - - return true; + return Welds(f1->contents.back, f2->contents.back); } /* diff --git a/testmaps/q1_tjunc_matrix.map b/testmaps/q1_tjunc_matrix.map new file mode 100644 index 00000000..500001bb --- /dev/null +++ b/testmaps/q1_tjunc_matrix.map @@ -0,0 +1,1720 @@ +// Game: Quake +// Format: Standard +// entity 0 +{ +"classname" "worldspawn" +"_tb_textures" "textures/e1u1" +"wad" "deprecated/free_wad.wad;deprecated/fence.wad" +} +// entity 1 +{ +"classname" "info_player_start" +"origin" "-272 240 -88" +"angle" "270" +} +// entity 2 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "Sky" +"_tb_id" "2" +// brush 0 +{ +( -560 -80 528 ) ( -560 -79 528 ) ( -560 -80 529 ) sky3 0 0 0 1 1 +( -560 -32 528 ) ( -560 -32 529 ) ( -559 -32 528 ) sky3 128 0 0 1 1 +( -560 -80 528 ) ( -559 -80 528 ) ( -560 -79 528 ) sky3 128 0 0 1 1 +( -512 0 544 ) ( -512 1 544 ) ( -511 0 544 ) sky3 128 0 0 1 1 +( -512 0 544 ) ( -511 0 544 ) ( -512 0 545 ) sky3 128 0 0 1 1 +( -512 0 544 ) ( -512 0 545 ) ( -512 1 544 ) sky3 0 0 0 1 1 +} +// brush 1 +{ +( -560 -80 464 ) ( -560 -79 464 ) ( -560 -80 465 ) sky3 0 0 0 1 1 +( -560 -32 464 ) ( -560 -32 465 ) ( -559 -32 464 ) sky3 128 0 0 1 1 +( -560 -80 464 ) ( -559 -80 464 ) ( -560 -79 464 ) sky3 128 0 0 1 1 +( -512 0 480 ) ( -512 1 480 ) ( -511 0 480 ) sky3 128 0 0 1 1 +( -512 0 480 ) ( -511 0 480 ) ( -512 0 481 ) sky3 128 0 0 1 1 +( -512 0 480 ) ( -512 0 481 ) ( -512 1 480 ) sky3 0 0 0 1 1 +} +// brush 2 +{ +( -560 -80 400 ) ( -560 -79 400 ) ( -560 -80 401 ) sky3 0 0 0 1 1 +( -560 -32 400 ) ( -560 -32 401 ) ( -559 -32 400 ) sky3 128 0 0 1 1 +( -560 -80 400 ) ( -559 -80 400 ) ( -560 -79 400 ) sky3 128 0 0 1 1 +( -512 0 416 ) ( -512 1 416 ) ( -511 0 416 ) sky3 128 0 0 1 1 +( -512 0 416 ) ( -511 0 416 ) ( -512 0 417 ) sky3 128 0 0 1 1 +( -512 0 416 ) ( -512 0 417 ) ( -512 1 416 ) sky3 0 0 0 1 1 +} +// brush 3 +{ +( -560 -80 336 ) ( -560 -79 336 ) ( -560 -80 337 ) sky3 0 0 0 1 1 +( -560 -32 336 ) ( -560 -32 337 ) ( -559 -32 336 ) sky3 128 0 0 1 1 +( -560 -80 336 ) ( -559 -80 336 ) ( -560 -79 336 ) sky3 128 0 0 1 1 +( -512 0 352 ) ( -512 1 352 ) ( -511 0 352 ) sky3 128 0 0 1 1 +( -512 0 352 ) ( -511 0 352 ) ( -512 0 353 ) sky3 128 0 0 1 1 +( -512 0 352 ) ( -512 0 353 ) ( -512 1 352 ) sky3 0 0 0 1 1 +} +// brush 4 +{ +( -560 -80 272 ) ( -560 -79 272 ) ( -560 -80 273 ) sky3 0 0 0 1 1 +( -560 -32 272 ) ( -560 -32 273 ) ( -559 -32 272 ) sky3 128 0 0 1 1 +( -560 -80 272 ) ( -559 -80 272 ) ( -560 -79 272 ) sky3 128 0 0 1 1 +( -512 0 288 ) ( -512 1 288 ) ( -511 0 288 ) sky3 128 0 0 1 1 +( -512 0 288 ) ( -511 0 288 ) ( -512 0 289 ) sky3 128 0 0 1 1 +( -512 0 288 ) ( -512 0 289 ) ( -512 1 288 ) sky3 0 0 0 1 1 +} +// brush 5 +{ +( -560 -80 208 ) ( -560 -79 208 ) ( -560 -80 209 ) sky3 0 0 0 1 1 +( -560 -32 208 ) ( -560 -32 209 ) ( -559 -32 208 ) sky3 128 0 0 1 1 +( -560 -80 208 ) ( -559 -80 208 ) ( -560 -79 208 ) sky3 128 0 0 1 1 +( -512 0 224 ) ( -512 1 224 ) ( -511 0 224 ) sky3 128 0 0 1 1 +( -512 0 224 ) ( -511 0 224 ) ( -512 0 225 ) sky3 128 0 0 1 1 +( -512 0 224 ) ( -512 0 225 ) ( -512 1 224 ) sky3 0 0 0 1 1 +} +// brush 6 +{ +( -560 -80 144 ) ( -560 -79 144 ) ( -560 -80 145 ) sky3 0 0 0 1 1 +( -560 -32 144 ) ( -560 -32 145 ) ( -559 -32 144 ) sky3 128 0 0 1 1 +( -560 -80 144 ) ( -559 -80 144 ) ( -560 -79 144 ) sky3 128 0 0 1 1 +( -512 0 160 ) ( -512 1 160 ) ( -511 0 160 ) sky3 128 0 0 1 1 +( -512 0 160 ) ( -511 0 160 ) ( -512 0 161 ) sky3 128 0 0 1 1 +( -512 0 160 ) ( -512 0 161 ) ( -512 1 160 ) sky3 0 0 0 1 1 +} +// brush 7 +{ +( -560 -80 80 ) ( -560 -79 80 ) ( -560 -80 81 ) sky3 0 0 0 1 1 +( -560 -32 80 ) ( -560 -32 81 ) ( -559 -32 80 ) sky3 128 0 0 1 1 +( -560 -80 80 ) ( -559 -80 80 ) ( -560 -79 80 ) sky3 128 0 0 1 1 +( -512 0 96 ) ( -512 1 96 ) ( -511 0 96 ) sky3 128 0 0 1 1 +( -512 0 96 ) ( -511 0 96 ) ( -512 0 97 ) sky3 128 0 0 1 1 +( -512 0 96 ) ( -512 0 97 ) ( -512 1 96 ) sky3 0 0 0 1 1 +} +// brush 8 +{ +( -560 -80 16 ) ( -560 -79 16 ) ( -560 -80 17 ) sky3 0 0 0 1 1 +( -560 -32 16 ) ( -560 -32 17 ) ( -559 -32 16 ) sky3 128 0 0 1 1 +( -560 -80 16 ) ( -559 -80 16 ) ( -560 -79 16 ) sky3 128 0 0 1 1 +( -512 0 32 ) ( -512 1 32 ) ( -511 0 32 ) sky3 128 0 0 1 1 +( -512 0 32 ) ( -511 0 32 ) ( -512 0 33 ) sky3 128 0 0 1 1 +( -512 0 32 ) ( -512 0 33 ) ( -512 1 32 ) sky3 0 0 0 1 1 +} +} +// entity 3 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_fence" +"_tb_id" "3" +} +// entity 4 +{ +"classname" "func_detail_fence" +"_tb_group" "3" +// brush 0 +{ +( -240 -80 528 ) ( -240 -79 528 ) ( -240 -80 529 ) {trigger 0 0 0 1 1 +( -240 -32 528 ) ( -240 -32 529 ) ( -239 -32 528 ) {trigger 0 0 0 1 1 +( -240 -80 528 ) ( -239 -80 528 ) ( -240 -79 528 ) {trigger 0 0 0 1 1 +( -192 0 544 ) ( -192 1 544 ) ( -191 0 544 ) {trigger 0 0 0 1 1 +( -192 0 544 ) ( -191 0 544 ) ( -192 0 545 ) {trigger 0 0 0 1 1 +( -192 0 544 ) ( -192 0 545 ) ( -192 1 544 ) {trigger 0 0 0 1 1 +} +// brush 1 +{ +( -240 -80 464 ) ( -240 -79 464 ) ( -240 -80 465 ) {trigger 0 0 0 1 1 +( -240 -32 464 ) ( -240 -32 465 ) ( -239 -32 464 ) {trigger 0 0 0 1 1 +( -240 -80 464 ) ( -239 -80 464 ) ( -240 -79 464 ) {trigger 0 0 0 1 1 +( -192 0 480 ) ( -192 1 480 ) ( -191 0 480 ) {trigger 0 0 0 1 1 +( -192 0 480 ) ( -191 0 480 ) ( -192 0 481 ) {trigger 0 0 0 1 1 +( -192 0 480 ) ( -192 0 481 ) ( -192 1 480 ) {trigger 0 0 0 1 1 +} +// brush 2 +{ +( -240 -80 336 ) ( -240 -79 336 ) ( -240 -80 337 ) {trigger 0 0 0 1 1 +( -240 -32 336 ) ( -240 -32 337 ) ( -239 -32 336 ) {trigger 0 0 0 1 1 +( -240 -80 336 ) ( -239 -80 336 ) ( -240 -79 336 ) {trigger 0 0 0 1 1 +( -192 0 352 ) ( -192 1 352 ) ( -191 0 352 ) {trigger 0 0 0 1 1 +( -192 0 352 ) ( -191 0 352 ) ( -192 0 353 ) {trigger 0 0 0 1 1 +( -192 0 352 ) ( -192 0 353 ) ( -192 1 352 ) {trigger 0 0 0 1 1 +} +// brush 3 +{ +( -240 -80 400 ) ( -240 -79 400 ) ( -240 -80 401 ) {trigger 0 0 0 1 1 +( -240 -32 400 ) ( -240 -32 401 ) ( -239 -32 400 ) {trigger 0 0 0 1 1 +( -240 -80 400 ) ( -239 -80 400 ) ( -240 -79 400 ) {trigger 0 0 0 1 1 +( -192 0 416 ) ( -192 1 416 ) ( -191 0 416 ) {trigger 0 0 0 1 1 +( -192 0 416 ) ( -191 0 416 ) ( -192 0 417 ) {trigger 0 0 0 1 1 +( -192 0 416 ) ( -192 0 417 ) ( -192 1 416 ) {trigger 0 0 0 1 1 +} +// brush 4 +{ +( -240 -80 272 ) ( -240 -79 272 ) ( -240 -80 273 ) {trigger 0 0 0 1 1 +( -240 -32 272 ) ( -240 -32 273 ) ( -239 -32 272 ) {trigger 0 0 0 1 1 +( -240 -80 272 ) ( -239 -80 272 ) ( -240 -79 272 ) {trigger 0 0 0 1 1 +( -192 0 288 ) ( -192 1 288 ) ( -191 0 288 ) {trigger 0 0 0 1 1 +( -192 0 288 ) ( -191 0 288 ) ( -192 0 289 ) {trigger 0 0 0 1 1 +( -192 0 288 ) ( -192 0 289 ) ( -192 1 288 ) {trigger 0 0 0 1 1 +} +// brush 5 +{ +( -240 -80 144 ) ( -240 -79 144 ) ( -240 -80 145 ) {trigger 0 0 0 1 1 +( -240 -32 144 ) ( -240 -32 145 ) ( -239 -32 144 ) {trigger 0 0 0 1 1 +( -240 -80 144 ) ( -239 -80 144 ) ( -240 -79 144 ) {trigger 0 0 0 1 1 +( -192 0 160 ) ( -192 1 160 ) ( -191 0 160 ) {trigger 0 0 0 1 1 +( -192 0 160 ) ( -191 0 160 ) ( -192 0 161 ) {trigger 0 0 0 1 1 +( -192 0 160 ) ( -192 0 161 ) ( -192 1 160 ) {trigger 0 0 0 1 1 +} +// brush 6 +{ +( -240 -80 80 ) ( -240 -79 80 ) ( -240 -80 81 ) {trigger 0 0 0 1 1 +( -240 -32 80 ) ( -240 -32 81 ) ( -239 -32 80 ) {trigger 0 0 0 1 1 +( -240 -80 80 ) ( -239 -80 80 ) ( -240 -79 80 ) {trigger 0 0 0 1 1 +( -192 0 96 ) ( -192 1 96 ) ( -191 0 96 ) {trigger 0 0 0 1 1 +( -192 0 96 ) ( -191 0 96 ) ( -192 0 97 ) {trigger 0 0 0 1 1 +( -192 0 96 ) ( -192 0 97 ) ( -192 1 96 ) {trigger 0 0 0 1 1 +} +// brush 7 +{ +( -240 -80 208 ) ( -240 -79 208 ) ( -240 -80 209 ) {trigger 0 0 0 1 1 +( -240 -32 208 ) ( -240 -32 209 ) ( -239 -32 208 ) {trigger 0 0 0 1 1 +( -240 -80 208 ) ( -239 -80 208 ) ( -240 -79 208 ) {trigger 0 0 0 1 1 +( -192 0 224 ) ( -192 1 224 ) ( -191 0 224 ) {trigger 0 0 0 1 1 +( -192 0 224 ) ( -191 0 224 ) ( -192 0 225 ) {trigger 0 0 0 1 1 +( -192 0 224 ) ( -192 0 225 ) ( -192 1 224 ) {trigger 0 0 0 1 1 +} +// brush 8 +{ +( -240 -80 16 ) ( -240 -79 16 ) ( -240 -80 17 ) {trigger 0 0 0 1 1 +( -240 -32 16 ) ( -240 -32 17 ) ( -239 -32 16 ) {trigger 0 0 0 1 1 +( -240 -80 16 ) ( -239 -80 16 ) ( -240 -79 16 ) {trigger 0 0 0 1 1 +( -192 0 32 ) ( -192 1 32 ) ( -191 0 32 ) {trigger 0 0 0 1 1 +( -192 0 32 ) ( -191 0 32 ) ( -192 0 33 ) {trigger 0 0 0 1 1 +( -192 0 32 ) ( -192 0 33 ) ( -192 1 32 ) {trigger 0 0 0 1 1 +} +} +// entity 5 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_illusionary + _noclipfaces" +"_tb_id" "4" +} +// entity 6 +{ +"classname" "func_detail_illusionary" +"_noclipfaces" "1" +"_tb_group" "4" +// brush 0 +{ +( -432 -80 528 ) ( -432 -79 528 ) ( -432 -80 529 ) {trigger 0 0 0 1 1 +( -432 -32 528 ) ( -432 -32 529 ) ( -431 -32 528 ) {trigger 0 0 0 1 1 +( -432 -80 528 ) ( -431 -80 528 ) ( -432 -79 528 ) {trigger 0 0 0 1 1 +( -384 0 544 ) ( -384 1 544 ) ( -383 0 544 ) {trigger 0 0 0 1 1 +( -384 0 544 ) ( -383 0 544 ) ( -384 0 545 ) {trigger 0 0 0 1 1 +( -384 0 544 ) ( -384 0 545 ) ( -384 1 544 ) {trigger 0 0 0 1 1 +} +// brush 1 +{ +( -432 -80 464 ) ( -432 -79 464 ) ( -432 -80 465 ) {trigger 0 0 0 1 1 +( -432 -32 464 ) ( -432 -32 465 ) ( -431 -32 464 ) {trigger 0 0 0 1 1 +( -432 -80 464 ) ( -431 -80 464 ) ( -432 -79 464 ) {trigger 0 0 0 1 1 +( -384 0 480 ) ( -384 1 480 ) ( -383 0 480 ) {trigger 0 0 0 1 1 +( -384 0 480 ) ( -383 0 480 ) ( -384 0 481 ) {trigger 0 0 0 1 1 +( -384 0 480 ) ( -384 0 481 ) ( -384 1 480 ) {trigger 0 0 0 1 1 +} +// brush 2 +{ +( -432 -80 400 ) ( -432 -79 400 ) ( -432 -80 401 ) {trigger 0 0 0 1 1 +( -432 -32 400 ) ( -432 -32 401 ) ( -431 -32 400 ) {trigger 0 0 0 1 1 +( -432 -80 400 ) ( -431 -80 400 ) ( -432 -79 400 ) {trigger 0 0 0 1 1 +( -384 0 416 ) ( -384 1 416 ) ( -383 0 416 ) {trigger 0 0 0 1 1 +( -384 0 416 ) ( -383 0 416 ) ( -384 0 417 ) {trigger 0 0 0 1 1 +( -384 0 416 ) ( -384 0 417 ) ( -384 1 416 ) {trigger 0 0 0 1 1 +} +// brush 3 +{ +( -432 -80 336 ) ( -432 -79 336 ) ( -432 -80 337 ) {trigger 0 0 0 1 1 +( -432 -32 336 ) ( -432 -32 337 ) ( -431 -32 336 ) {trigger 0 0 0 1 1 +( -432 -80 336 ) ( -431 -80 336 ) ( -432 -79 336 ) {trigger 0 0 0 1 1 +( -384 0 352 ) ( -384 1 352 ) ( -383 0 352 ) {trigger 0 0 0 1 1 +( -384 0 352 ) ( -383 0 352 ) ( -384 0 353 ) {trigger 0 0 0 1 1 +( -384 0 352 ) ( -384 0 353 ) ( -384 1 352 ) {trigger 0 0 0 1 1 +} +// brush 4 +{ +( -432 -80 272 ) ( -432 -79 272 ) ( -432 -80 273 ) {trigger 0 0 0 1 1 +( -432 -32 272 ) ( -432 -32 273 ) ( -431 -32 272 ) {trigger 0 0 0 1 1 +( -432 -80 272 ) ( -431 -80 272 ) ( -432 -79 272 ) {trigger 0 0 0 1 1 +( -384 0 288 ) ( -384 1 288 ) ( -383 0 288 ) {trigger 0 0 0 1 1 +( -384 0 288 ) ( -383 0 288 ) ( -384 0 289 ) {trigger 0 0 0 1 1 +( -384 0 288 ) ( -384 0 289 ) ( -384 1 288 ) {trigger 0 0 0 1 1 +} +// brush 5 +{ +( -432 -80 208 ) ( -432 -79 208 ) ( -432 -80 209 ) {trigger 0 0 0 1 1 +( -432 -32 208 ) ( -432 -32 209 ) ( -431 -32 208 ) {trigger 0 0 0 1 1 +( -432 -80 208 ) ( -431 -80 208 ) ( -432 -79 208 ) {trigger 0 0 0 1 1 +( -384 0 224 ) ( -384 1 224 ) ( -383 0 224 ) {trigger 0 0 0 1 1 +( -384 0 224 ) ( -383 0 224 ) ( -384 0 225 ) {trigger 0 0 0 1 1 +( -384 0 224 ) ( -384 0 225 ) ( -384 1 224 ) {trigger 0 0 0 1 1 +} +// brush 6 +{ +( -432 -80 80 ) ( -432 -79 80 ) ( -432 -80 81 ) {trigger 0 0 0 1 1 +( -432 -32 80 ) ( -432 -32 81 ) ( -431 -32 80 ) {trigger 0 0 0 1 1 +( -432 -80 80 ) ( -431 -80 80 ) ( -432 -79 80 ) {trigger 0 0 0 1 1 +( -384 0 96 ) ( -384 1 96 ) ( -383 0 96 ) {trigger 0 0 0 1 1 +( -384 0 96 ) ( -383 0 96 ) ( -384 0 97 ) {trigger 0 0 0 1 1 +( -384 0 96 ) ( -384 0 97 ) ( -384 1 96 ) {trigger 0 0 0 1 1 +} +// brush 7 +{ +( -432 -80 144 ) ( -432 -79 144 ) ( -432 -80 145 ) {trigger 0 0 0 1 1 +( -432 -32 144 ) ( -432 -32 145 ) ( -431 -32 144 ) {trigger 0 0 0 1 1 +( -432 -80 144 ) ( -431 -80 144 ) ( -432 -79 144 ) {trigger 0 0 0 1 1 +( -384 0 160 ) ( -384 1 160 ) ( -383 0 160 ) {trigger 0 0 0 1 1 +( -384 0 160 ) ( -383 0 160 ) ( -384 0 161 ) {trigger 0 0 0 1 1 +( -384 0 160 ) ( -384 0 161 ) ( -384 1 160 ) {trigger 0 0 0 1 1 +} +// brush 8 +{ +( -432 -80 16 ) ( -432 -79 16 ) ( -432 -80 17 ) {trigger 0 0 0 1 1 +( -432 -32 16 ) ( -432 -32 17 ) ( -431 -32 16 ) {trigger 0 0 0 1 1 +( -432 -80 16 ) ( -431 -80 16 ) ( -432 -79 16 ) {trigger 0 0 0 1 1 +( -384 0 32 ) ( -384 1 32 ) ( -383 0 32 ) {trigger 0 0 0 1 1 +( -384 0 32 ) ( -383 0 32 ) ( -384 0 33 ) {trigger 0 0 0 1 1 +( -384 0 32 ) ( -384 0 33 ) ( -384 1 32 ) {trigger 0 0 0 1 1 +} +} +// entity 7 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "Water" +"_tb_id" "5" +// brush 0 +{ +( -496 -80 528 ) ( -496 -79 528 ) ( -496 -80 529 ) *swater4 0 0 0 1 1 +( -496 -32 528 ) ( -496 -32 529 ) ( -495 -32 528 ) *swater4 0 0 0 1 1 +( -496 -80 528 ) ( -495 -80 528 ) ( -496 -79 528 ) *swater4 0 0 0 1 1 +( -448 0 544 ) ( -448 1 544 ) ( -447 0 544 ) *swater4 0 0 0 1 1 +( -448 0 544 ) ( -447 0 544 ) ( -448 0 545 ) *swater4 0 0 0 1 1 +( -448 0 544 ) ( -448 0 545 ) ( -448 1 544 ) *swater4 0 0 0 1 1 +} +// brush 1 +{ +( -496 -80 464 ) ( -496 -79 464 ) ( -496 -80 465 ) *swater4 0 0 0 1 1 +( -496 -32 464 ) ( -496 -32 465 ) ( -495 -32 464 ) *swater4 0 0 0 1 1 +( -496 -80 464 ) ( -495 -80 464 ) ( -496 -79 464 ) *swater4 0 0 0 1 1 +( -448 0 480 ) ( -448 1 480 ) ( -447 0 480 ) *swater4 0 0 0 1 1 +( -448 0 480 ) ( -447 0 480 ) ( -448 0 481 ) *swater4 0 0 0 1 1 +( -448 0 480 ) ( -448 0 481 ) ( -448 1 480 ) *swater4 0 0 0 1 1 +} +// brush 2 +{ +( -496 -80 16 ) ( -496 -79 16 ) ( -496 -80 17 ) *swater4 0 0 0 1 1 +( -496 -32 16 ) ( -496 -32 17 ) ( -495 -32 16 ) *swater4 0 0 0 1 1 +( -496 -80 16 ) ( -495 -80 16 ) ( -496 -79 16 ) *swater4 0 0 0 1 1 +( -448 0 32 ) ( -448 1 32 ) ( -447 0 32 ) *swater4 0 0 0 1 1 +( -448 0 32 ) ( -447 0 32 ) ( -448 0 33 ) *swater4 0 0 0 1 1 +( -448 0 32 ) ( -448 0 33 ) ( -448 1 32 ) *swater4 0 0 0 1 1 +} +// brush 3 +{ +( -496 -80 272 ) ( -496 -79 272 ) ( -496 -80 273 ) *swater4 0 0 0 1 1 +( -496 -32 272 ) ( -496 -32 273 ) ( -495 -32 272 ) *swater4 0 0 0 1 1 +( -496 -80 272 ) ( -495 -80 272 ) ( -496 -79 272 ) *swater4 0 0 0 1 1 +( -448 0 288 ) ( -448 1 288 ) ( -447 0 288 ) *swater4 0 0 0 1 1 +( -448 0 288 ) ( -447 0 288 ) ( -448 0 289 ) *swater4 0 0 0 1 1 +( -448 0 288 ) ( -448 0 289 ) ( -448 1 288 ) *swater4 0 0 0 1 1 +} +// brush 4 +{ +( -496 -80 336 ) ( -496 -79 336 ) ( -496 -80 337 ) *swater4 0 0 0 1 1 +( -496 -32 336 ) ( -496 -32 337 ) ( -495 -32 336 ) *swater4 0 0 0 1 1 +( -496 -80 336 ) ( -495 -80 336 ) ( -496 -79 336 ) *swater4 0 0 0 1 1 +( -448 0 352 ) ( -448 1 352 ) ( -447 0 352 ) *swater4 0 0 0 1 1 +( -448 0 352 ) ( -447 0 352 ) ( -448 0 353 ) *swater4 0 0 0 1 1 +( -448 0 352 ) ( -448 0 353 ) ( -448 1 352 ) *swater4 0 0 0 1 1 +} +// brush 5 +{ +( -496 -80 80 ) ( -496 -79 80 ) ( -496 -80 81 ) *swater4 0 0 0 1 1 +( -496 -32 80 ) ( -496 -32 81 ) ( -495 -32 80 ) *swater4 0 0 0 1 1 +( -496 -80 80 ) ( -495 -80 80 ) ( -496 -79 80 ) *swater4 0 0 0 1 1 +( -448 0 96 ) ( -448 1 96 ) ( -447 0 96 ) *swater4 0 0 0 1 1 +( -448 0 96 ) ( -447 0 96 ) ( -448 0 97 ) *swater4 0 0 0 1 1 +( -448 0 96 ) ( -448 0 97 ) ( -448 1 96 ) *swater4 0 0 0 1 1 +} +// brush 6 +{ +( -496 -80 400 ) ( -496 -79 400 ) ( -496 -80 401 ) *swater4 0 0 0 1 1 +( -496 -32 400 ) ( -496 -32 401 ) ( -495 -32 400 ) *swater4 0 0 0 1 1 +( -496 -80 400 ) ( -495 -80 400 ) ( -496 -79 400 ) *swater4 0 0 0 1 1 +( -448 0 416 ) ( -448 1 416 ) ( -447 0 416 ) *swater4 0 0 0 1 1 +( -448 0 416 ) ( -447 0 416 ) ( -448 0 417 ) *swater4 0 0 0 1 1 +( -448 0 416 ) ( -448 0 417 ) ( -448 1 416 ) *swater4 0 0 0 1 1 +} +// brush 7 +{ +( -496 -80 208 ) ( -496 -79 208 ) ( -496 -80 209 ) *swater4 0 0 0 1 1 +( -496 -32 208 ) ( -496 -32 209 ) ( -495 -32 208 ) *swater4 0 0 0 1 1 +( -496 -80 208 ) ( -495 -80 208 ) ( -496 -79 208 ) *swater4 0 0 0 1 1 +( -448 0 224 ) ( -448 1 224 ) ( -447 0 224 ) *swater4 0 0 0 1 1 +( -448 0 224 ) ( -447 0 224 ) ( -448 0 225 ) *swater4 0 0 0 1 1 +( -448 0 224 ) ( -448 0 225 ) ( -448 1 224 ) *swater4 0 0 0 1 1 +} +// brush 8 +{ +( -496 -80 144 ) ( -496 -79 144 ) ( -496 -80 145 ) *swater4 0 0 0 1 1 +( -496 -32 144 ) ( -496 -32 145 ) ( -495 -32 144 ) *swater4 0 0 0 1 1 +( -496 -80 144 ) ( -495 -80 144 ) ( -496 -79 144 ) *swater4 0 0 0 1 1 +( -448 0 160 ) ( -448 1 160 ) ( -447 0 160 ) *swater4 0 0 0 1 1 +( -448 0 160 ) ( -447 0 160 ) ( -448 0 161 ) *swater4 0 0 0 1 1 +( -448 0 160 ) ( -448 0 161 ) ( -448 1 160 ) *swater4 0 0 0 1 1 +} +} +// entity 8 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail" +"_tb_id" "7" +} +// entity 9 +{ +"classname" "func_detail" +"_tb_group" "7" +// brush 0 +{ +( -112 -80 528 ) ( -112 -79 528 ) ( -112 -80 529 ) bolt2 0 0 0 1 1 +( -112 -32 528 ) ( -112 -32 529 ) ( -111 -32 528 ) bolt2 0 0 0 1 1 +( -112 -80 528 ) ( -111 -80 528 ) ( -112 -79 528 ) bolt2 0 0 0 1 1 +( -64 0 544 ) ( -64 1 544 ) ( -63 0 544 ) bolt2 0 0 0 1 1 +( -64 0 544 ) ( -63 0 544 ) ( -64 0 545 ) bolt2 0 0 0 1 1 +( -64 0 544 ) ( -64 0 545 ) ( -64 1 544 ) bolt2 0 0 0 1 1 +} +// brush 1 +{ +( -112 -80 464 ) ( -112 -79 464 ) ( -112 -80 465 ) bolt2 0 0 0 1 1 +( -112 -32 464 ) ( -112 -32 465 ) ( -111 -32 464 ) bolt2 0 0 0 1 1 +( -112 -80 464 ) ( -111 -80 464 ) ( -112 -79 464 ) bolt2 0 0 0 1 1 +( -64 0 480 ) ( -64 1 480 ) ( -63 0 480 ) bolt2 0 0 0 1 1 +( -64 0 480 ) ( -63 0 480 ) ( -64 0 481 ) bolt2 0 0 0 1 1 +( -64 0 480 ) ( -64 0 481 ) ( -64 1 480 ) bolt2 0 0 0 1 1 +} +// brush 2 +{ +( -112 -80 16 ) ( -112 -79 16 ) ( -112 -80 17 ) bolt2 0 0 0 1 1 +( -112 -32 16 ) ( -112 -32 17 ) ( -111 -32 16 ) bolt2 0 0 0 1 1 +( -112 -80 16 ) ( -111 -80 16 ) ( -112 -79 16 ) bolt2 0 0 0 1 1 +( -64 0 32 ) ( -64 1 32 ) ( -63 0 32 ) bolt2 0 0 0 1 1 +( -64 0 32 ) ( -63 0 32 ) ( -64 0 33 ) bolt2 0 0 0 1 1 +( -64 0 32 ) ( -64 0 33 ) ( -64 1 32 ) bolt2 0 0 0 1 1 +} +// brush 3 +{ +( -112 -80 272 ) ( -112 -79 272 ) ( -112 -80 273 ) bolt2 0 0 0 1 1 +( -112 -32 272 ) ( -112 -32 273 ) ( -111 -32 272 ) bolt2 0 0 0 1 1 +( -112 -80 272 ) ( -111 -80 272 ) ( -112 -79 272 ) bolt2 0 0 0 1 1 +( -64 0 288 ) ( -64 1 288 ) ( -63 0 288 ) bolt2 0 0 0 1 1 +( -64 0 288 ) ( -63 0 288 ) ( -64 0 289 ) bolt2 0 0 0 1 1 +( -64 0 288 ) ( -64 0 289 ) ( -64 1 288 ) bolt2 0 0 0 1 1 +} +// brush 4 +{ +( -112 -80 336 ) ( -112 -79 336 ) ( -112 -80 337 ) bolt2 0 0 0 1 1 +( -112 -32 336 ) ( -112 -32 337 ) ( -111 -32 336 ) bolt2 0 0 0 1 1 +( -112 -80 336 ) ( -111 -80 336 ) ( -112 -79 336 ) bolt2 0 0 0 1 1 +( -64 0 352 ) ( -64 1 352 ) ( -63 0 352 ) bolt2 0 0 0 1 1 +( -64 0 352 ) ( -63 0 352 ) ( -64 0 353 ) bolt2 0 0 0 1 1 +( -64 0 352 ) ( -64 0 353 ) ( -64 1 352 ) bolt2 0 0 0 1 1 +} +// brush 5 +{ +( -112 -80 400 ) ( -112 -79 400 ) ( -112 -80 401 ) bolt2 0 0 0 1 1 +( -112 -32 400 ) ( -112 -32 401 ) ( -111 -32 400 ) bolt2 0 0 0 1 1 +( -112 -80 400 ) ( -111 -80 400 ) ( -112 -79 400 ) bolt2 0 0 0 1 1 +( -64 0 416 ) ( -64 1 416 ) ( -63 0 416 ) bolt2 0 0 0 1 1 +( -64 0 416 ) ( -63 0 416 ) ( -64 0 417 ) bolt2 0 0 0 1 1 +( -64 0 416 ) ( -64 0 417 ) ( -64 1 416 ) bolt2 0 0 0 1 1 +} +// brush 6 +{ +( -112 -80 208 ) ( -112 -79 208 ) ( -112 -80 209 ) bolt2 0 0 0 1 1 +( -112 -32 208 ) ( -112 -32 209 ) ( -111 -32 208 ) bolt2 0 0 0 1 1 +( -112 -80 208 ) ( -111 -80 208 ) ( -112 -79 208 ) bolt2 0 0 0 1 1 +( -64 0 224 ) ( -64 1 224 ) ( -63 0 224 ) bolt2 0 0 0 1 1 +( -64 0 224 ) ( -63 0 224 ) ( -64 0 225 ) bolt2 0 0 0 1 1 +( -64 0 224 ) ( -64 0 225 ) ( -64 1 224 ) bolt2 0 0 0 1 1 +} +// brush 7 +{ +( -112 -80 80 ) ( -112 -79 80 ) ( -112 -80 81 ) bolt2 0 0 0 1 1 +( -112 -32 80 ) ( -112 -32 81 ) ( -111 -32 80 ) bolt2 0 0 0 1 1 +( -112 -80 80 ) ( -111 -80 80 ) ( -112 -79 80 ) bolt2 0 0 0 1 1 +( -64 0 96 ) ( -64 1 96 ) ( -63 0 96 ) bolt2 0 0 0 1 1 +( -64 0 96 ) ( -63 0 96 ) ( -64 0 97 ) bolt2 0 0 0 1 1 +( -64 0 96 ) ( -64 0 97 ) ( -64 1 96 ) bolt2 0 0 0 1 1 +} +// brush 8 +{ +( -112 -80 144 ) ( -112 -79 144 ) ( -112 -80 145 ) bolt2 0 0 0 1 1 +( -112 -32 144 ) ( -112 -32 145 ) ( -111 -32 144 ) bolt2 0 0 0 1 1 +( -112 -80 144 ) ( -111 -80 144 ) ( -112 -79 144 ) bolt2 0 0 0 1 1 +( -64 0 160 ) ( -64 1 160 ) ( -63 0 160 ) bolt2 0 0 0 1 1 +( -64 0 160 ) ( -63 0 160 ) ( -64 0 161 ) bolt2 0 0 0 1 1 +( -64 0 160 ) ( -64 0 161 ) ( -64 1 160 ) bolt2 0 0 0 1 1 +} +} +// entity 10 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "Solid" +"_tb_id" "8" +// brush 0 +{ +( -48 -80 528 ) ( -48 -79 528 ) ( -48 -80 529 ) bolt4 0 0 0 1 1 +( -48 -32 528 ) ( -48 -32 529 ) ( -47 -32 528 ) bolt4 0 0 0 1 1 +( -48 -80 528 ) ( -47 -80 528 ) ( -48 -79 528 ) bolt4 0 0 0 1 1 +( 0 0 544 ) ( 0 1 544 ) ( 1 0 544 ) bolt4 0 0 0 1 1 +( 0 0 544 ) ( 1 0 544 ) ( 0 0 545 ) bolt4 0 0 0 1 1 +( 0 0 544 ) ( 0 0 545 ) ( 0 1 544 ) bolt4 0 0 0 1 1 +} +// brush 1 +{ +( -48 -80 464 ) ( -48 -79 464 ) ( -48 -80 465 ) bolt4 0 0 0 1 1 +( -48 -32 464 ) ( -48 -32 465 ) ( -47 -32 464 ) bolt4 0 0 0 1 1 +( -48 -80 464 ) ( -47 -80 464 ) ( -48 -79 464 ) bolt4 0 0 0 1 1 +( 0 0 480 ) ( 0 1 480 ) ( 1 0 480 ) bolt4 0 0 0 1 1 +( 0 0 480 ) ( 1 0 480 ) ( 0 0 481 ) bolt4 0 0 0 1 1 +( 0 0 480 ) ( 0 0 481 ) ( 0 1 480 ) bolt4 0 0 0 1 1 +} +// brush 2 +{ +( -48 -80 336 ) ( -48 -79 336 ) ( -48 -80 337 ) bolt4 0 0 0 1 1 +( -48 -32 336 ) ( -48 -32 337 ) ( -47 -32 336 ) bolt4 0 0 0 1 1 +( -48 -80 336 ) ( -47 -80 336 ) ( -48 -79 336 ) bolt4 0 0 0 1 1 +( 0 0 352 ) ( 0 1 352 ) ( 1 0 352 ) bolt4 0 0 0 1 1 +( 0 0 352 ) ( 1 0 352 ) ( 0 0 353 ) bolt4 0 0 0 1 1 +( 0 0 352 ) ( 0 0 353 ) ( 0 1 352 ) bolt4 0 0 0 1 1 +} +// brush 3 +{ +( -48 -80 272 ) ( -48 -79 272 ) ( -48 -80 273 ) bolt4 0 0 0 1 1 +( -48 -32 272 ) ( -48 -32 273 ) ( -47 -32 272 ) bolt4 0 0 0 1 1 +( -48 -80 272 ) ( -47 -80 272 ) ( -48 -79 272 ) bolt4 0 0 0 1 1 +( 0 0 288 ) ( 0 1 288 ) ( 1 0 288 ) bolt4 0 0 0 1 1 +( 0 0 288 ) ( 1 0 288 ) ( 0 0 289 ) bolt4 0 0 0 1 1 +( 0 0 288 ) ( 0 0 289 ) ( 0 1 288 ) bolt4 0 0 0 1 1 +} +// brush 4 +{ +( -48 -80 400 ) ( -48 -79 400 ) ( -48 -80 401 ) bolt4 0 0 0 1 1 +( -48 -32 400 ) ( -48 -32 401 ) ( -47 -32 400 ) bolt4 0 0 0 1 1 +( -48 -80 400 ) ( -47 -80 400 ) ( -48 -79 400 ) bolt4 0 0 0 1 1 +( 0 0 416 ) ( 0 1 416 ) ( 1 0 416 ) bolt4 0 0 0 1 1 +( 0 0 416 ) ( 1 0 416 ) ( 0 0 417 ) bolt4 0 0 0 1 1 +( 0 0 416 ) ( 0 0 417 ) ( 0 1 416 ) bolt4 0 0 0 1 1 +} +// brush 5 +{ +( -48 -80 144 ) ( -48 -79 144 ) ( -48 -80 145 ) bolt4 0 0 0 1 1 +( -48 -32 144 ) ( -48 -32 145 ) ( -47 -32 144 ) bolt4 0 0 0 1 1 +( -48 -80 144 ) ( -47 -80 144 ) ( -48 -79 144 ) bolt4 0 0 0 1 1 +( 0 0 160 ) ( 0 1 160 ) ( 1 0 160 ) bolt4 0 0 0 1 1 +( 0 0 160 ) ( 1 0 160 ) ( 0 0 161 ) bolt4 0 0 0 1 1 +( 0 0 160 ) ( 0 0 161 ) ( 0 1 160 ) bolt4 0 0 0 1 1 +} +// brush 6 +{ +( -48 -80 80 ) ( -48 -79 80 ) ( -48 -80 81 ) bolt4 0 0 0 1 1 +( -48 -32 80 ) ( -48 -32 81 ) ( -47 -32 80 ) bolt4 0 0 0 1 1 +( -48 -80 80 ) ( -47 -80 80 ) ( -48 -79 80 ) bolt4 0 0 0 1 1 +( 0 0 96 ) ( 0 1 96 ) ( 1 0 96 ) bolt4 0 0 0 1 1 +( 0 0 96 ) ( 1 0 96 ) ( 0 0 97 ) bolt4 0 0 0 1 1 +( 0 0 96 ) ( 0 0 97 ) ( 0 1 96 ) bolt4 0 0 0 1 1 +} +// brush 7 +{ +( -48 -80 16 ) ( -48 -79 16 ) ( -48 -80 17 ) bolt4 0 0 0 1 1 +( -48 -32 16 ) ( -48 -32 17 ) ( -47 -32 16 ) bolt4 0 0 0 1 1 +( -48 -80 16 ) ( -47 -80 16 ) ( -48 -79 16 ) bolt4 0 0 0 1 1 +( 0 0 32 ) ( 0 1 32 ) ( 1 0 32 ) bolt4 0 0 0 1 1 +( 0 0 32 ) ( 1 0 32 ) ( 0 0 33 ) bolt4 0 0 0 1 1 +( 0 0 32 ) ( 0 0 33 ) ( 0 1 32 ) bolt4 0 0 0 1 1 +} +// brush 8 +{ +( -48 -80 208 ) ( -48 -79 208 ) ( -48 -80 209 ) bolt4 0 0 0 1 1 +( -48 -32 208 ) ( -48 -32 209 ) ( -47 -32 208 ) bolt4 0 0 0 1 1 +( -48 -80 208 ) ( -47 -80 208 ) ( -48 -79 208 ) bolt4 0 0 0 1 1 +( 0 0 224 ) ( 0 1 224 ) ( 1 0 224 ) bolt4 0 0 0 1 1 +( 0 0 224 ) ( 1 0 224 ) ( 0 0 225 ) bolt4 0 0 0 1 1 +( 0 0 224 ) ( 0 0 225 ) ( 0 1 224 ) bolt4 0 0 0 1 1 +} +} +// entity 11 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_wall" +"_tb_id" "9" +} +// entity 12 +{ +"classname" "func_detail_wall" +"_tb_group" "9" +// brush 0 +{ +( -176 -80 80 ) ( -176 -79 80 ) ( -176 -80 81 ) bolt17 0 0 0 1 1 +( -176 -32 80 ) ( -176 -32 81 ) ( -175 -32 80 ) bolt17 0 0 0 1 1 +( -176 -80 80 ) ( -175 -80 80 ) ( -176 -79 80 ) bolt17 0 0 0 1 1 +( -128 0 96 ) ( -128 1 96 ) ( -127 0 96 ) bolt17 0 0 0 1 1 +( -128 0 96 ) ( -127 0 96 ) ( -128 0 97 ) bolt17 0 0 0 1 1 +( -128 0 96 ) ( -128 0 97 ) ( -128 1 96 ) bolt17 0 0 0 1 1 +} +// brush 1 +{ +( -176 -80 16 ) ( -176 -79 16 ) ( -176 -80 17 ) bolt17 0 0 0 1 1 +( -176 -32 16 ) ( -176 -32 17 ) ( -175 -32 16 ) bolt17 0 0 0 1 1 +( -176 -80 16 ) ( -175 -80 16 ) ( -176 -79 16 ) bolt17 0 0 0 1 1 +( -128 0 32 ) ( -128 1 32 ) ( -127 0 32 ) bolt17 0 0 0 1 1 +( -128 0 32 ) ( -127 0 32 ) ( -128 0 33 ) bolt17 0 0 0 1 1 +( -128 0 32 ) ( -128 0 33 ) ( -128 1 32 ) bolt17 0 0 0 1 1 +} +// brush 2 +{ +( -176 -80 528 ) ( -176 -79 528 ) ( -176 -80 529 ) bolt17 0 0 0 1 1 +( -176 -32 528 ) ( -176 -32 529 ) ( -175 -32 528 ) bolt17 0 0 0 1 1 +( -176 -80 528 ) ( -175 -80 528 ) ( -176 -79 528 ) bolt17 0 0 0 1 1 +( -128 0 544 ) ( -128 1 544 ) ( -127 0 544 ) bolt17 0 0 0 1 1 +( -128 0 544 ) ( -127 0 544 ) ( -128 0 545 ) bolt17 0 0 0 1 1 +( -128 0 544 ) ( -128 0 545 ) ( -128 1 544 ) bolt17 0 0 0 1 1 +} +// brush 3 +{ +( -176 -80 464 ) ( -176 -79 464 ) ( -176 -80 465 ) bolt17 0 0 0 1 1 +( -176 -32 464 ) ( -176 -32 465 ) ( -175 -32 464 ) bolt17 0 0 0 1 1 +( -176 -80 464 ) ( -175 -80 464 ) ( -176 -79 464 ) bolt17 0 0 0 1 1 +( -128 0 480 ) ( -128 1 480 ) ( -127 0 480 ) bolt17 0 0 0 1 1 +( -128 0 480 ) ( -127 0 480 ) ( -128 0 481 ) bolt17 0 0 0 1 1 +( -128 0 480 ) ( -128 0 481 ) ( -128 1 480 ) bolt17 0 0 0 1 1 +} +// brush 4 +{ +( -176 -80 400 ) ( -176 -79 400 ) ( -176 -80 401 ) bolt17 0 0 0 1 1 +( -176 -32 400 ) ( -176 -32 401 ) ( -175 -32 400 ) bolt17 0 0 0 1 1 +( -176 -80 400 ) ( -175 -80 400 ) ( -176 -79 400 ) bolt17 0 0 0 1 1 +( -128 0 416 ) ( -128 1 416 ) ( -127 0 416 ) bolt17 0 0 0 1 1 +( -128 0 416 ) ( -127 0 416 ) ( -128 0 417 ) bolt17 0 0 0 1 1 +( -128 0 416 ) ( -128 0 417 ) ( -128 1 416 ) bolt17 0 0 0 1 1 +} +// brush 5 +{ +( -176 -80 336 ) ( -176 -79 336 ) ( -176 -80 337 ) bolt17 0 0 0 1 1 +( -176 -32 336 ) ( -176 -32 337 ) ( -175 -32 336 ) bolt17 0 0 0 1 1 +( -176 -80 336 ) ( -175 -80 336 ) ( -176 -79 336 ) bolt17 0 0 0 1 1 +( -128 0 352 ) ( -128 1 352 ) ( -127 0 352 ) bolt17 0 0 0 1 1 +( -128 0 352 ) ( -127 0 352 ) ( -128 0 353 ) bolt17 0 0 0 1 1 +( -128 0 352 ) ( -128 0 353 ) ( -128 1 352 ) bolt17 0 0 0 1 1 +} +// brush 6 +{ +( -176 -80 272 ) ( -176 -79 272 ) ( -176 -80 273 ) bolt17 0 0 0 1 1 +( -176 -32 272 ) ( -176 -32 273 ) ( -175 -32 272 ) bolt17 0 0 0 1 1 +( -176 -80 272 ) ( -175 -80 272 ) ( -176 -79 272 ) bolt17 0 0 0 1 1 +( -128 0 288 ) ( -128 1 288 ) ( -127 0 288 ) bolt17 0 0 0 1 1 +( -128 0 288 ) ( -127 0 288 ) ( -128 0 289 ) bolt17 0 0 0 1 1 +( -128 0 288 ) ( -128 0 289 ) ( -128 1 288 ) bolt17 0 0 0 1 1 +} +// brush 7 +{ +( -176 -80 208 ) ( -176 -79 208 ) ( -176 -80 209 ) bolt17 0 0 0 1 1 +( -176 -32 208 ) ( -176 -32 209 ) ( -175 -32 208 ) bolt17 0 0 0 1 1 +( -176 -80 208 ) ( -175 -80 208 ) ( -176 -79 208 ) bolt17 0 0 0 1 1 +( -128 0 224 ) ( -128 1 224 ) ( -127 0 224 ) bolt17 0 0 0 1 1 +( -128 0 224 ) ( -127 0 224 ) ( -128 0 225 ) bolt17 0 0 0 1 1 +( -128 0 224 ) ( -128 0 225 ) ( -128 1 224 ) bolt17 0 0 0 1 1 +} +// brush 8 +{ +( -176 -80 144 ) ( -176 -79 144 ) ( -176 -80 145 ) bolt17 0 0 0 1 1 +( -176 -32 144 ) ( -176 -32 145 ) ( -175 -32 144 ) bolt17 0 0 0 1 1 +( -176 -80 144 ) ( -175 -80 144 ) ( -176 -79 144 ) bolt17 0 0 0 1 1 +( -128 0 160 ) ( -128 1 160 ) ( -127 0 160 ) bolt17 0 0 0 1 1 +( -128 0 160 ) ( -127 0 160 ) ( -128 0 161 ) bolt17 0 0 0 1 1 +( -128 0 160 ) ( -128 0 161 ) ( -128 1 160 ) bolt17 0 0 0 1 1 +} +} +// entity 13 +{ +"classname" "func_group" +// brush 0 +{ +( -992 -128 -128 ) ( -992 -112 -128 ) ( -992 -128 896 ) brown_brick 0 0 0 3 3 +( 480 -128 -128 ) ( -992 -128 -128 ) ( 480 -128 896 ) brown_brick 0 0 0 3 3 +( 480 -128 -128 ) ( 480 -112 -128 ) ( -992 -128 -128 ) brown_brick 0 0 0 3 3 +( -992 -128 896 ) ( -992 -112 896 ) ( 480 -128 896 ) brown_brick 0 0 0 3 3 +( -992 -112 -128 ) ( 480 -112 -128 ) ( -992 -112 896 ) brown_brick 0 0 0 3 3 +( 480 -128 896 ) ( 480 -112 896 ) ( 480 -128 -128 ) brown_brick 0 0 0 3 3 +} +// brush 1 +{ +( -992 128 -128 ) ( -992 128 -112 ) ( -992 -112 -128 ) brown_brick 0 0 0 3 3 +( -992 -112 -128 ) ( -992 -112 -112 ) ( 480 -112 -128 ) brown_brick 0 0 0 3 3 +( -992 128 -128 ) ( -992 -112 -128 ) ( 480 128 -128 ) brown_brick 0 0 0 3 3 +( -992 -112 -112 ) ( -992 128 -112 ) ( 480 -112 -112 ) brown_brick 0 0 0 3 3 +( 480 400 -128 ) ( 480 400 -112 ) ( -992 400 -128 ) brown_brick 0 0 0 3 3 +( 480 -112 -128 ) ( 480 -112 -112 ) ( 480 128 -128 ) brown_brick 0 0 0 3 3 +} +// brush 2 +{ +( -1008 -128 -128 ) ( -1008 144 -128 ) ( -1008 -128 896 ) brown_brick 0 0 0 3 3 +( -1008 -128 896 ) ( -992 -128 896 ) ( -1008 -128 -128 ) brown_brick 0 0 0 3 3 +( -1008 -128 -128 ) ( -992 -128 -128 ) ( -1008 144 -128 ) brown_brick 0 0 0 3 3 +( -1008 144 896 ) ( -992 144 896 ) ( -1008 -128 896 ) brown_brick 0 0 0 3 3 +( -1008 416 -128 ) ( -992 416 -128 ) ( -1008 416 896 ) brown_brick 0 0 0 3 3 +( -992 -128 -128 ) ( -992 -128 896 ) ( -992 144 -128 ) brown_brick 0 0 0 3 3 +} +// brush 3 +{ +( -992 416 896 ) ( -992 400 896 ) ( -992 416 -128 ) brown_brick -16 0 0 3 3 +( 480 400 896 ) ( 480 400 -128 ) ( -992 400 896 ) brown_brick 0 0 0 3 3 +( -992 416 -128 ) ( -992 400 -128 ) ( 480 416 -128 ) brown_brick 0 16 0 3 3 +( 480 416 896 ) ( 480 400 896 ) ( -992 416 896 ) brown_brick 0 16 0 3 3 +( 480 416 896 ) ( -992 416 896 ) ( 480 416 -128 ) brown_brick 0 0 0 3 3 +( 480 416 -128 ) ( 480 400 -128 ) ( 480 416 896 ) brown_brick -16 0 0 3 3 +} +// brush 4 +{ +( -992 -112 896 ) ( -992 -112 880 ) ( -992 128 896 ) brown_brick 0 0 0 3 3 +( 480 -112 896 ) ( 480 -112 880 ) ( -992 -112 896 ) brown_brick 0 0 0 3 3 +( 480 128 880 ) ( -992 128 880 ) ( 480 -112 880 ) brown_brick 0 0 0 3 3 +( 480 128 896 ) ( 480 -112 896 ) ( -992 128 896 ) brown_brick 0 0 0 3 3 +( -992 400 896 ) ( -992 400 880 ) ( 480 400 896 ) brown_brick 0 0 0 3 3 +( 480 128 896 ) ( 480 128 880 ) ( 480 -112 896 ) brown_brick 0 0 0 3 3 +} +// brush 5 +{ +( 480 144 896 ) ( 480 -128 896 ) ( 480 144 -128 ) brown_brick 0 0 0 3 3 +( 496 -128 -128 ) ( 480 -128 -128 ) ( 496 -128 896 ) brown_brick 0 0 0 3 3 +( 496 144 -128 ) ( 480 144 -128 ) ( 496 -128 -128 ) brown_brick 0 0 0 3 3 +( 496 -128 896 ) ( 480 -128 896 ) ( 496 144 896 ) brown_brick 0 0 0 3 3 +( 496 416 896 ) ( 480 416 896 ) ( 496 416 -128 ) brown_brick 0 0 0 3 3 +( 496 -128 896 ) ( 496 144 896 ) ( 496 -128 -128 ) brown_brick 0 0 0 3 3 +} +} +// entity 14 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_illusionary" +"_tb_id" "28" +} +// entity 15 +{ +"classname" "func_detail_illusionary" +"_tb_group" "28" +// brush 0 +{ +( -368 -80 528 ) ( -368 -79 528 ) ( -368 -80 529 ) {trigger 0 0 0 1 1 +( -368 -32 528 ) ( -368 -32 529 ) ( -367 -32 528 ) {trigger 0 0 0 1 1 +( -368 -80 528 ) ( -367 -80 528 ) ( -368 -79 528 ) {trigger 0 0 0 1 1 +( -320 0 544 ) ( -320 1 544 ) ( -319 0 544 ) {trigger 0 0 0 1 1 +( -320 0 544 ) ( -319 0 544 ) ( -320 0 545 ) {trigger 0 0 0 1 1 +( -320 0 544 ) ( -320 0 545 ) ( -320 1 544 ) {trigger 0 0 0 1 1 +} +// brush 1 +{ +( -368 -80 464 ) ( -368 -79 464 ) ( -368 -80 465 ) {trigger 0 0 0 1 1 +( -368 -32 464 ) ( -368 -32 465 ) ( -367 -32 464 ) {trigger 0 0 0 1 1 +( -368 -80 464 ) ( -367 -80 464 ) ( -368 -79 464 ) {trigger 0 0 0 1 1 +( -320 0 480 ) ( -320 1 480 ) ( -319 0 480 ) {trigger 0 0 0 1 1 +( -320 0 480 ) ( -319 0 480 ) ( -320 0 481 ) {trigger 0 0 0 1 1 +( -320 0 480 ) ( -320 0 481 ) ( -320 1 480 ) {trigger 0 0 0 1 1 +} +// brush 2 +{ +( -368 -80 400 ) ( -368 -79 400 ) ( -368 -80 401 ) {trigger 0 0 0 1 1 +( -368 -32 400 ) ( -368 -32 401 ) ( -367 -32 400 ) {trigger 0 0 0 1 1 +( -368 -80 400 ) ( -367 -80 400 ) ( -368 -79 400 ) {trigger 0 0 0 1 1 +( -320 0 416 ) ( -320 1 416 ) ( -319 0 416 ) {trigger 0 0 0 1 1 +( -320 0 416 ) ( -319 0 416 ) ( -320 0 417 ) {trigger 0 0 0 1 1 +( -320 0 416 ) ( -320 0 417 ) ( -320 1 416 ) {trigger 0 0 0 1 1 +} +// brush 3 +{ +( -368 -80 336 ) ( -368 -79 336 ) ( -368 -80 337 ) {trigger 0 0 0 1 1 +( -368 -32 336 ) ( -368 -32 337 ) ( -367 -32 336 ) {trigger 0 0 0 1 1 +( -368 -80 336 ) ( -367 -80 336 ) ( -368 -79 336 ) {trigger 0 0 0 1 1 +( -320 0 352 ) ( -320 1 352 ) ( -319 0 352 ) {trigger 0 0 0 1 1 +( -320 0 352 ) ( -319 0 352 ) ( -320 0 353 ) {trigger 0 0 0 1 1 +( -320 0 352 ) ( -320 0 353 ) ( -320 1 352 ) {trigger 0 0 0 1 1 +} +// brush 4 +{ +( -368 -80 272 ) ( -368 -79 272 ) ( -368 -80 273 ) {trigger 0 0 0 1 1 +( -368 -32 272 ) ( -368 -32 273 ) ( -367 -32 272 ) {trigger 0 0 0 1 1 +( -368 -80 272 ) ( -367 -80 272 ) ( -368 -79 272 ) {trigger 0 0 0 1 1 +( -320 0 288 ) ( -320 1 288 ) ( -319 0 288 ) {trigger 0 0 0 1 1 +( -320 0 288 ) ( -319 0 288 ) ( -320 0 289 ) {trigger 0 0 0 1 1 +( -320 0 288 ) ( -320 0 289 ) ( -320 1 288 ) {trigger 0 0 0 1 1 +} +// brush 5 +{ +( -368 -80 208 ) ( -368 -79 208 ) ( -368 -80 209 ) {trigger 0 0 0 1 1 +( -368 -32 208 ) ( -368 -32 209 ) ( -367 -32 208 ) {trigger 0 0 0 1 1 +( -368 -80 208 ) ( -367 -80 208 ) ( -368 -79 208 ) {trigger 0 0 0 1 1 +( -320 0 224 ) ( -320 1 224 ) ( -319 0 224 ) {trigger 0 0 0 1 1 +( -320 0 224 ) ( -319 0 224 ) ( -320 0 225 ) {trigger 0 0 0 1 1 +( -320 0 224 ) ( -320 0 225 ) ( -320 1 224 ) {trigger 0 0 0 1 1 +} +// brush 6 +{ +( -368 -80 80 ) ( -368 -79 80 ) ( -368 -80 81 ) {trigger 0 0 0 1 1 +( -368 -32 80 ) ( -368 -32 81 ) ( -367 -32 80 ) {trigger 0 0 0 1 1 +( -368 -80 80 ) ( -367 -80 80 ) ( -368 -79 80 ) {trigger 0 0 0 1 1 +( -320 0 96 ) ( -320 1 96 ) ( -319 0 96 ) {trigger 0 0 0 1 1 +( -320 0 96 ) ( -319 0 96 ) ( -320 0 97 ) {trigger 0 0 0 1 1 +( -320 0 96 ) ( -320 0 97 ) ( -320 1 96 ) {trigger 0 0 0 1 1 +} +// brush 7 +{ +( -368 -80 144 ) ( -368 -79 144 ) ( -368 -80 145 ) {trigger 0 0 0 1 1 +( -368 -32 144 ) ( -368 -32 145 ) ( -367 -32 144 ) {trigger 0 0 0 1 1 +( -368 -80 144 ) ( -367 -80 144 ) ( -368 -79 144 ) {trigger 0 0 0 1 1 +( -320 0 160 ) ( -320 1 160 ) ( -319 0 160 ) {trigger 0 0 0 1 1 +( -320 0 160 ) ( -319 0 160 ) ( -320 0 161 ) {trigger 0 0 0 1 1 +( -320 0 160 ) ( -320 0 161 ) ( -320 1 160 ) {trigger 0 0 0 1 1 +} +// brush 8 +{ +( -368 -80 16 ) ( -368 -79 16 ) ( -368 -80 17 ) {trigger 0 0 0 1 1 +( -368 -32 16 ) ( -368 -32 17 ) ( -367 -32 16 ) {trigger 0 0 0 1 1 +( -368 -80 16 ) ( -367 -80 16 ) ( -368 -79 16 ) {trigger 0 0 0 1 1 +( -320 0 32 ) ( -320 1 32 ) ( -319 0 32 ) {trigger 0 0 0 1 1 +( -320 0 32 ) ( -319 0 32 ) ( -320 0 33 ) {trigger 0 0 0 1 1 +( -320 0 32 ) ( -320 0 33 ) ( -320 1 32 ) {trigger 0 0 0 1 1 +} +} +// entity 16 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_fence + _mirrorinside" +"_tb_id" "29" +} +// entity 17 +{ +"classname" "func_detail_fence" +"_mirrorinside" "1" +"_tb_group" "29" +// brush 0 +{ +( -304 -80 528 ) ( -304 -79 528 ) ( -304 -80 529 ) {trigger 0 0 0 1 1 +( -304 -32 528 ) ( -304 -32 529 ) ( -303 -32 528 ) {trigger 0 0 0 1 1 +( -304 -80 528 ) ( -303 -80 528 ) ( -304 -79 528 ) {trigger 0 0 0 1 1 +( -256 0 544 ) ( -256 1 544 ) ( -255 0 544 ) {trigger 0 0 0 1 1 +( -256 0 544 ) ( -255 0 544 ) ( -256 0 545 ) {trigger 0 0 0 1 1 +( -256 0 544 ) ( -256 0 545 ) ( -256 1 544 ) {trigger 0 0 0 1 1 +} +// brush 1 +{ +( -304 -80 464 ) ( -304 -79 464 ) ( -304 -80 465 ) {trigger 0 0 0 1 1 +( -304 -32 464 ) ( -304 -32 465 ) ( -303 -32 464 ) {trigger 0 0 0 1 1 +( -304 -80 464 ) ( -303 -80 464 ) ( -304 -79 464 ) {trigger 0 0 0 1 1 +( -256 0 480 ) ( -256 1 480 ) ( -255 0 480 ) {trigger 0 0 0 1 1 +( -256 0 480 ) ( -255 0 480 ) ( -256 0 481 ) {trigger 0 0 0 1 1 +( -256 0 480 ) ( -256 0 481 ) ( -256 1 480 ) {trigger 0 0 0 1 1 +} +// brush 2 +{ +( -304 -80 336 ) ( -304 -79 336 ) ( -304 -80 337 ) {trigger 0 0 0 1 1 +( -304 -32 336 ) ( -304 -32 337 ) ( -303 -32 336 ) {trigger 0 0 0 1 1 +( -304 -80 336 ) ( -303 -80 336 ) ( -304 -79 336 ) {trigger 0 0 0 1 1 +( -256 0 352 ) ( -256 1 352 ) ( -255 0 352 ) {trigger 0 0 0 1 1 +( -256 0 352 ) ( -255 0 352 ) ( -256 0 353 ) {trigger 0 0 0 1 1 +( -256 0 352 ) ( -256 0 353 ) ( -256 1 352 ) {trigger 0 0 0 1 1 +} +// brush 3 +{ +( -304 -80 400 ) ( -304 -79 400 ) ( -304 -80 401 ) {trigger 0 0 0 1 1 +( -304 -32 400 ) ( -304 -32 401 ) ( -303 -32 400 ) {trigger 0 0 0 1 1 +( -304 -80 400 ) ( -303 -80 400 ) ( -304 -79 400 ) {trigger 0 0 0 1 1 +( -256 0 416 ) ( -256 1 416 ) ( -255 0 416 ) {trigger 0 0 0 1 1 +( -256 0 416 ) ( -255 0 416 ) ( -256 0 417 ) {trigger 0 0 0 1 1 +( -256 0 416 ) ( -256 0 417 ) ( -256 1 416 ) {trigger 0 0 0 1 1 +} +// brush 4 +{ +( -304 -80 272 ) ( -304 -79 272 ) ( -304 -80 273 ) {trigger 0 0 0 1 1 +( -304 -32 272 ) ( -304 -32 273 ) ( -303 -32 272 ) {trigger 0 0 0 1 1 +( -304 -80 272 ) ( -303 -80 272 ) ( -304 -79 272 ) {trigger 0 0 0 1 1 +( -256 0 288 ) ( -256 1 288 ) ( -255 0 288 ) {trigger 0 0 0 1 1 +( -256 0 288 ) ( -255 0 288 ) ( -256 0 289 ) {trigger 0 0 0 1 1 +( -256 0 288 ) ( -256 0 289 ) ( -256 1 288 ) {trigger 0 0 0 1 1 +} +// brush 5 +{ +( -304 -80 144 ) ( -304 -79 144 ) ( -304 -80 145 ) {trigger 0 0 0 1 1 +( -304 -32 144 ) ( -304 -32 145 ) ( -303 -32 144 ) {trigger 0 0 0 1 1 +( -304 -80 144 ) ( -303 -80 144 ) ( -304 -79 144 ) {trigger 0 0 0 1 1 +( -256 0 160 ) ( -256 1 160 ) ( -255 0 160 ) {trigger 0 0 0 1 1 +( -256 0 160 ) ( -255 0 160 ) ( -256 0 161 ) {trigger 0 0 0 1 1 +( -256 0 160 ) ( -256 0 161 ) ( -256 1 160 ) {trigger 0 0 0 1 1 +} +// brush 6 +{ +( -304 -80 80 ) ( -304 -79 80 ) ( -304 -80 81 ) {trigger 0 0 0 1 1 +( -304 -32 80 ) ( -304 -32 81 ) ( -303 -32 80 ) {trigger 0 0 0 1 1 +( -304 -80 80 ) ( -303 -80 80 ) ( -304 -79 80 ) {trigger 0 0 0 1 1 +( -256 0 96 ) ( -256 1 96 ) ( -255 0 96 ) {trigger 0 0 0 1 1 +( -256 0 96 ) ( -255 0 96 ) ( -256 0 97 ) {trigger 0 0 0 1 1 +( -256 0 96 ) ( -256 0 97 ) ( -256 1 96 ) {trigger 0 0 0 1 1 +} +// brush 7 +{ +( -304 -80 208 ) ( -304 -79 208 ) ( -304 -80 209 ) {trigger 0 0 0 1 1 +( -304 -32 208 ) ( -304 -32 209 ) ( -303 -32 208 ) {trigger 0 0 0 1 1 +( -304 -80 208 ) ( -303 -80 208 ) ( -304 -79 208 ) {trigger 0 0 0 1 1 +( -256 0 224 ) ( -256 1 224 ) ( -255 0 224 ) {trigger 0 0 0 1 1 +( -256 0 224 ) ( -255 0 224 ) ( -256 0 225 ) {trigger 0 0 0 1 1 +( -256 0 224 ) ( -256 0 225 ) ( -256 1 224 ) {trigger 0 0 0 1 1 +} +// brush 8 +{ +( -304 -80 16 ) ( -304 -79 16 ) ( -304 -80 17 ) {trigger 0 0 0 1 1 +( -304 -32 16 ) ( -304 -32 17 ) ( -303 -32 16 ) {trigger 0 0 0 1 1 +( -304 -80 16 ) ( -303 -80 16 ) ( -304 -79 16 ) {trigger 0 0 0 1 1 +( -256 0 32 ) ( -256 1 32 ) ( -255 0 32 ) {trigger 0 0 0 1 1 +( -256 0 32 ) ( -255 0 32 ) ( -256 0 33 ) {trigger 0 0 0 1 1 +( -256 0 32 ) ( -256 0 33 ) ( -256 1 32 ) {trigger 0 0 0 1 1 +} +} +// entity 18 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "Solid" +"_tb_id" "30" +// brush 0 +{ +( -32 -80 80 ) ( -32 -80 79 ) ( -32 -79 80 ) bolt4 32 0 270 1 1 +( -32 -32 80 ) ( -31 -32 80 ) ( -32 -32 79 ) bolt4 32 16 270 1 1 +( -16 0 32 ) ( -15 0 32 ) ( -16 1 32 ) bolt4 0 16 90 1 -1 +( -32 -80 64 ) ( -32 -79 64 ) ( -31 -80 64 ) bolt4 0 16 90 1 -1 +( -16 0 32 ) ( -16 0 31 ) ( -15 0 32 ) bolt4 32 16 270 1 1 +( -16 0 32 ) ( -16 1 32 ) ( -16 0 31 ) bolt4 32 0 270 1 1 +} +// brush 1 +{ +( -96 -80 80 ) ( -96 -80 79 ) ( -96 -79 80 ) bolt4 32 0 270 1 1 +( -96 -32 80 ) ( -95 -32 80 ) ( -96 -32 79 ) bolt4 32 16 270 1 1 +( -80 0 32 ) ( -79 0 32 ) ( -80 1 32 ) bolt4 0 16 90 1 -1 +( -96 -80 64 ) ( -96 -79 64 ) ( -95 -80 64 ) bolt4 0 16 90 1 -1 +( -80 0 32 ) ( -80 0 31 ) ( -79 0 32 ) bolt4 32 16 270 1 1 +( -80 0 32 ) ( -80 1 32 ) ( -80 0 31 ) bolt4 32 0 270 1 1 +} +// brush 2 +{ +( -224 -80 80 ) ( -224 -80 79 ) ( -224 -79 80 ) bolt4 32 0 270 1 1 +( -224 -32 80 ) ( -223 -32 80 ) ( -224 -32 79 ) bolt4 32 16 270 1 1 +( -208 0 32 ) ( -207 0 32 ) ( -208 1 32 ) bolt4 0 16 90 1 -1 +( -224 -80 64 ) ( -224 -79 64 ) ( -223 -80 64 ) bolt4 0 16 90 1 -1 +( -208 0 32 ) ( -208 0 31 ) ( -207 0 32 ) bolt4 32 16 270 1 1 +( -208 0 32 ) ( -208 1 32 ) ( -208 0 31 ) bolt4 32 0 270 1 1 +} +// brush 3 +{ +( -288 -80 80 ) ( -288 -80 79 ) ( -288 -79 80 ) bolt4 32 0 270 1 1 +( -288 -32 80 ) ( -287 -32 80 ) ( -288 -32 79 ) bolt4 32 16 270 1 1 +( -272 0 32 ) ( -271 0 32 ) ( -272 1 32 ) bolt4 0 16 90 1 -1 +( -288 -80 64 ) ( -288 -79 64 ) ( -287 -80 64 ) bolt4 0 16 90 1 -1 +( -272 0 32 ) ( -272 0 31 ) ( -271 0 32 ) bolt4 32 16 270 1 1 +( -272 0 32 ) ( -272 1 32 ) ( -272 0 31 ) bolt4 32 0 270 1 1 +} +// brush 4 +{ +( -160 -80 80 ) ( -160 -80 79 ) ( -160 -79 80 ) bolt4 32 0 270 1 1 +( -160 -32 80 ) ( -159 -32 80 ) ( -160 -32 79 ) bolt4 32 16 270 1 1 +( -144 0 32 ) ( -143 0 32 ) ( -144 1 32 ) bolt4 0 16 90 1 -1 +( -160 -80 64 ) ( -160 -79 64 ) ( -159 -80 64 ) bolt4 0 16 90 1 -1 +( -144 0 32 ) ( -144 0 31 ) ( -143 0 32 ) bolt4 32 16 270 1 1 +( -144 0 32 ) ( -144 1 32 ) ( -144 0 31 ) bolt4 32 0 270 1 1 +} +// brush 5 +{ +( -416 -80 80 ) ( -416 -80 79 ) ( -416 -79 80 ) bolt4 32 0 270 1 1 +( -416 -32 80 ) ( -415 -32 80 ) ( -416 -32 79 ) bolt4 32 16 270 1 1 +( -400 0 32 ) ( -399 0 32 ) ( -400 1 32 ) bolt4 0 16 90 1 -1 +( -416 -80 64 ) ( -416 -79 64 ) ( -415 -80 64 ) bolt4 0 16 90 1 -1 +( -400 0 32 ) ( -400 0 31 ) ( -399 0 32 ) bolt4 32 16 270 1 1 +( -400 0 32 ) ( -400 1 32 ) ( -400 0 31 ) bolt4 32 0 270 1 1 +} +// brush 6 +{ +( -480 -80 80 ) ( -480 -80 79 ) ( -480 -79 80 ) bolt4 32 0 270 1 1 +( -480 -32 80 ) ( -479 -32 80 ) ( -480 -32 79 ) bolt4 32 16 270 1 1 +( -464 0 32 ) ( -463 0 32 ) ( -464 1 32 ) bolt4 0 16 90 1 -1 +( -480 -80 64 ) ( -480 -79 64 ) ( -479 -80 64 ) bolt4 0 16 90 1 -1 +( -464 0 32 ) ( -464 0 31 ) ( -463 0 32 ) bolt4 32 16 270 1 1 +( -464 0 32 ) ( -464 1 32 ) ( -464 0 31 ) bolt4 32 0 270 1 1 +} +// brush 7 +{ +( -544 -80 80 ) ( -544 -80 79 ) ( -544 -79 80 ) bolt4 32 0 270 1 1 +( -544 -32 80 ) ( -543 -32 80 ) ( -544 -32 79 ) bolt4 32 16 270 1 1 +( -528 0 32 ) ( -527 0 32 ) ( -528 1 32 ) bolt4 0 16 90 1 -1 +( -544 -80 64 ) ( -544 -79 64 ) ( -543 -80 64 ) bolt4 0 16 90 1 -1 +( -528 0 32 ) ( -528 0 31 ) ( -527 0 32 ) bolt4 32 16 270 1 1 +( -528 0 32 ) ( -528 1 32 ) ( -528 0 31 ) bolt4 32 0 270 1 1 +} +// brush 8 +{ +( -352 -80 80 ) ( -352 -80 79 ) ( -352 -79 80 ) bolt4 32 0 270 1 1 +( -352 -32 80 ) ( -351 -32 80 ) ( -352 -32 79 ) bolt4 32 16 270 1 1 +( -336 0 32 ) ( -335 0 32 ) ( -336 1 32 ) bolt4 0 16 90 1 -1 +( -352 -80 64 ) ( -352 -79 64 ) ( -351 -80 64 ) bolt4 0 16 90 1 -1 +( -336 0 32 ) ( -336 0 31 ) ( -335 0 32 ) bolt4 32 16 270 1 1 +( -336 0 32 ) ( -336 1 32 ) ( -336 0 31 ) bolt4 32 0 270 1 1 +} +} +// entity 19 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail" +"_tb_id" "31" +} +// entity 20 +{ +"classname" "func_detail" +"_tb_group" "31" +// brush 0 +{ +( -32 -80 144 ) ( -32 -80 143 ) ( -32 -79 144 ) bolt2 32 0 270 1 1 +( -32 -32 144 ) ( -31 -32 144 ) ( -32 -32 143 ) bolt2 32 16 270 1 1 +( -16 0 96 ) ( -15 0 96 ) ( -16 1 96 ) bolt2 0 16 90 1 -1 +( -32 -80 128 ) ( -32 -79 128 ) ( -31 -80 128 ) bolt2 0 16 90 1 -1 +( -16 0 96 ) ( -16 0 95 ) ( -15 0 96 ) bolt2 32 16 270 1 1 +( -16 0 96 ) ( -16 1 96 ) ( -16 0 95 ) bolt2 32 0 270 1 1 +} +// brush 1 +{ +( -96 -80 144 ) ( -96 -80 143 ) ( -96 -79 144 ) bolt2 32 0 270 1 1 +( -96 -32 144 ) ( -95 -32 144 ) ( -96 -32 143 ) bolt2 32 16 270 1 1 +( -80 0 96 ) ( -79 0 96 ) ( -80 1 96 ) bolt2 0 16 90 1 -1 +( -96 -80 128 ) ( -96 -79 128 ) ( -95 -80 128 ) bolt2 0 16 90 1 -1 +( -80 0 96 ) ( -80 0 95 ) ( -79 0 96 ) bolt2 32 16 270 1 1 +( -80 0 96 ) ( -80 1 96 ) ( -80 0 95 ) bolt2 32 0 270 1 1 +} +// brush 2 +{ +( -544 -80 144 ) ( -544 -80 143 ) ( -544 -79 144 ) bolt2 32 0 270 1 1 +( -544 -32 144 ) ( -543 -32 144 ) ( -544 -32 143 ) bolt2 32 16 270 1 1 +( -528 0 96 ) ( -527 0 96 ) ( -528 1 96 ) bolt2 0 16 90 1 -1 +( -544 -80 128 ) ( -544 -79 128 ) ( -543 -80 128 ) bolt2 0 16 90 1 -1 +( -528 0 96 ) ( -528 0 95 ) ( -527 0 96 ) bolt2 32 16 270 1 1 +( -528 0 96 ) ( -528 1 96 ) ( -528 0 95 ) bolt2 32 0 270 1 1 +} +// brush 3 +{ +( -288 -80 144 ) ( -288 -80 143 ) ( -288 -79 144 ) bolt2 32 0 270 1 1 +( -288 -32 144 ) ( -287 -32 144 ) ( -288 -32 143 ) bolt2 32 16 270 1 1 +( -272 0 96 ) ( -271 0 96 ) ( -272 1 96 ) bolt2 0 16 90 1 -1 +( -288 -80 128 ) ( -288 -79 128 ) ( -287 -80 128 ) bolt2 0 16 90 1 -1 +( -272 0 96 ) ( -272 0 95 ) ( -271 0 96 ) bolt2 32 16 270 1 1 +( -272 0 96 ) ( -272 1 96 ) ( -272 0 95 ) bolt2 32 0 270 1 1 +} +// brush 4 +{ +( -224 -80 144 ) ( -224 -80 143 ) ( -224 -79 144 ) bolt2 32 0 270 1 1 +( -224 -32 144 ) ( -223 -32 144 ) ( -224 -32 143 ) bolt2 32 16 270 1 1 +( -208 0 96 ) ( -207 0 96 ) ( -208 1 96 ) bolt2 0 16 90 1 -1 +( -224 -80 128 ) ( -224 -79 128 ) ( -223 -80 128 ) bolt2 0 16 90 1 -1 +( -208 0 96 ) ( -208 0 95 ) ( -207 0 96 ) bolt2 32 16 270 1 1 +( -208 0 96 ) ( -208 1 96 ) ( -208 0 95 ) bolt2 32 0 270 1 1 +} +// brush 5 +{ +( -160 -80 144 ) ( -160 -80 143 ) ( -160 -79 144 ) bolt2 32 0 270 1 1 +( -160 -32 144 ) ( -159 -32 144 ) ( -160 -32 143 ) bolt2 32 16 270 1 1 +( -144 0 96 ) ( -143 0 96 ) ( -144 1 96 ) bolt2 0 16 90 1 -1 +( -160 -80 128 ) ( -160 -79 128 ) ( -159 -80 128 ) bolt2 0 16 90 1 -1 +( -144 0 96 ) ( -144 0 95 ) ( -143 0 96 ) bolt2 32 16 270 1 1 +( -144 0 96 ) ( -144 1 96 ) ( -144 0 95 ) bolt2 32 0 270 1 1 +} +// brush 6 +{ +( -352 -80 144 ) ( -352 -80 143 ) ( -352 -79 144 ) bolt2 32 0 270 1 1 +( -352 -32 144 ) ( -351 -32 144 ) ( -352 -32 143 ) bolt2 32 16 270 1 1 +( -336 0 96 ) ( -335 0 96 ) ( -336 1 96 ) bolt2 0 16 90 1 -1 +( -352 -80 128 ) ( -352 -79 128 ) ( -351 -80 128 ) bolt2 0 16 90 1 -1 +( -336 0 96 ) ( -336 0 95 ) ( -335 0 96 ) bolt2 32 16 270 1 1 +( -336 0 96 ) ( -336 1 96 ) ( -336 0 95 ) bolt2 32 0 270 1 1 +} +// brush 7 +{ +( -480 -80 144 ) ( -480 -80 143 ) ( -480 -79 144 ) bolt2 32 0 270 1 1 +( -480 -32 144 ) ( -479 -32 144 ) ( -480 -32 143 ) bolt2 32 16 270 1 1 +( -464 0 96 ) ( -463 0 96 ) ( -464 1 96 ) bolt2 0 16 90 1 -1 +( -480 -80 128 ) ( -480 -79 128 ) ( -479 -80 128 ) bolt2 0 16 90 1 -1 +( -464 0 96 ) ( -464 0 95 ) ( -463 0 96 ) bolt2 32 16 270 1 1 +( -464 0 96 ) ( -464 1 96 ) ( -464 0 95 ) bolt2 32 0 270 1 1 +} +// brush 8 +{ +( -416 -80 144 ) ( -416 -80 143 ) ( -416 -79 144 ) bolt2 32 0 270 1 1 +( -416 -32 144 ) ( -415 -32 144 ) ( -416 -32 143 ) bolt2 32 16 270 1 1 +( -400 0 96 ) ( -399 0 96 ) ( -400 1 96 ) bolt2 0 16 90 1 -1 +( -416 -80 128 ) ( -416 -79 128 ) ( -415 -80 128 ) bolt2 0 16 90 1 -1 +( -400 0 96 ) ( -400 0 95 ) ( -399 0 96 ) bolt2 32 16 270 1 1 +( -400 0 96 ) ( -400 1 96 ) ( -400 0 95 ) bolt2 32 0 270 1 1 +} +} +// entity 21 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_wall" +"_tb_id" "32" +} +// entity 22 +{ +"classname" "func_detail_wall" +"_tb_group" "32" +// brush 0 +{ +( -480 -80 208 ) ( -480 -80 207 ) ( -480 -79 208 ) bolt17 32 0 270 1 1 +( -480 -32 208 ) ( -479 -32 208 ) ( -480 -32 207 ) bolt17 32 16 270 1 1 +( -464 0 160 ) ( -463 0 160 ) ( -464 1 160 ) bolt17 0 16 90 1 -1 +( -480 -80 192 ) ( -480 -79 192 ) ( -479 -80 192 ) bolt17 0 16 90 1 -1 +( -464 0 160 ) ( -464 0 159 ) ( -463 0 160 ) bolt17 32 16 270 1 1 +( -464 0 160 ) ( -464 1 160 ) ( -464 0 159 ) bolt17 32 0 270 1 1 +} +// brush 1 +{ +( -544 -80 208 ) ( -544 -80 207 ) ( -544 -79 208 ) bolt17 32 0 270 1 1 +( -544 -32 208 ) ( -543 -32 208 ) ( -544 -32 207 ) bolt17 32 16 270 1 1 +( -528 0 160 ) ( -527 0 160 ) ( -528 1 160 ) bolt17 0 16 90 1 -1 +( -544 -80 192 ) ( -544 -79 192 ) ( -543 -80 192 ) bolt17 0 16 90 1 -1 +( -528 0 160 ) ( -528 0 159 ) ( -527 0 160 ) bolt17 32 16 270 1 1 +( -528 0 160 ) ( -528 1 160 ) ( -528 0 159 ) bolt17 32 0 270 1 1 +} +// brush 2 +{ +( -32 -80 208 ) ( -32 -80 207 ) ( -32 -79 208 ) bolt17 32 0 270 1 1 +( -32 -32 208 ) ( -31 -32 208 ) ( -32 -32 207 ) bolt17 32 16 270 1 1 +( -16 0 160 ) ( -15 0 160 ) ( -16 1 160 ) bolt17 0 16 90 1 -1 +( -32 -80 192 ) ( -32 -79 192 ) ( -31 -80 192 ) bolt17 0 16 90 1 -1 +( -16 0 160 ) ( -16 0 159 ) ( -15 0 160 ) bolt17 32 16 270 1 1 +( -16 0 160 ) ( -16 1 160 ) ( -16 0 159 ) bolt17 32 0 270 1 1 +} +// brush 3 +{ +( -96 -80 208 ) ( -96 -80 207 ) ( -96 -79 208 ) bolt17 32 0 270 1 1 +( -96 -32 208 ) ( -95 -32 208 ) ( -96 -32 207 ) bolt17 32 16 270 1 1 +( -80 0 160 ) ( -79 0 160 ) ( -80 1 160 ) bolt17 0 16 90 1 -1 +( -96 -80 192 ) ( -96 -79 192 ) ( -95 -80 192 ) bolt17 0 16 90 1 -1 +( -80 0 160 ) ( -80 0 159 ) ( -79 0 160 ) bolt17 32 16 270 1 1 +( -80 0 160 ) ( -80 1 160 ) ( -80 0 159 ) bolt17 32 0 270 1 1 +} +// brush 4 +{ +( -160 -80 208 ) ( -160 -80 207 ) ( -160 -79 208 ) bolt17 32 0 270 1 1 +( -160 -32 208 ) ( -159 -32 208 ) ( -160 -32 207 ) bolt17 32 16 270 1 1 +( -144 0 160 ) ( -143 0 160 ) ( -144 1 160 ) bolt17 0 16 90 1 -1 +( -160 -80 192 ) ( -160 -79 192 ) ( -159 -80 192 ) bolt17 0 16 90 1 -1 +( -144 0 160 ) ( -144 0 159 ) ( -143 0 160 ) bolt17 32 16 270 1 1 +( -144 0 160 ) ( -144 1 160 ) ( -144 0 159 ) bolt17 32 0 270 1 1 +} +// brush 5 +{ +( -224 -80 208 ) ( -224 -80 207 ) ( -224 -79 208 ) bolt17 32 0 270 1 1 +( -224 -32 208 ) ( -223 -32 208 ) ( -224 -32 207 ) bolt17 32 16 270 1 1 +( -208 0 160 ) ( -207 0 160 ) ( -208 1 160 ) bolt17 0 16 90 1 -1 +( -224 -80 192 ) ( -224 -79 192 ) ( -223 -80 192 ) bolt17 0 16 90 1 -1 +( -208 0 160 ) ( -208 0 159 ) ( -207 0 160 ) bolt17 32 16 270 1 1 +( -208 0 160 ) ( -208 1 160 ) ( -208 0 159 ) bolt17 32 0 270 1 1 +} +// brush 6 +{ +( -288 -80 208 ) ( -288 -80 207 ) ( -288 -79 208 ) bolt17 32 0 270 1 1 +( -288 -32 208 ) ( -287 -32 208 ) ( -288 -32 207 ) bolt17 32 16 270 1 1 +( -272 0 160 ) ( -271 0 160 ) ( -272 1 160 ) bolt17 0 16 90 1 -1 +( -288 -80 192 ) ( -288 -79 192 ) ( -287 -80 192 ) bolt17 0 16 90 1 -1 +( -272 0 160 ) ( -272 0 159 ) ( -271 0 160 ) bolt17 32 16 270 1 1 +( -272 0 160 ) ( -272 1 160 ) ( -272 0 159 ) bolt17 32 0 270 1 1 +} +// brush 7 +{ +( -352 -80 208 ) ( -352 -80 207 ) ( -352 -79 208 ) bolt17 32 0 270 1 1 +( -352 -32 208 ) ( -351 -32 208 ) ( -352 -32 207 ) bolt17 32 16 270 1 1 +( -336 0 160 ) ( -335 0 160 ) ( -336 1 160 ) bolt17 0 16 90 1 -1 +( -352 -80 192 ) ( -352 -79 192 ) ( -351 -80 192 ) bolt17 0 16 90 1 -1 +( -336 0 160 ) ( -336 0 159 ) ( -335 0 160 ) bolt17 32 16 270 1 1 +( -336 0 160 ) ( -336 1 160 ) ( -336 0 159 ) bolt17 32 0 270 1 1 +} +// brush 8 +{ +( -416 -80 208 ) ( -416 -80 207 ) ( -416 -79 208 ) bolt17 32 0 270 1 1 +( -416 -32 208 ) ( -415 -32 208 ) ( -416 -32 207 ) bolt17 32 16 270 1 1 +( -400 0 160 ) ( -399 0 160 ) ( -400 1 160 ) bolt17 0 16 90 1 -1 +( -416 -80 192 ) ( -416 -79 192 ) ( -415 -80 192 ) bolt17 0 16 90 1 -1 +( -400 0 160 ) ( -400 0 159 ) ( -399 0 160 ) bolt17 32 16 270 1 1 +( -400 0 160 ) ( -400 1 160 ) ( -400 0 159 ) bolt17 32 0 270 1 1 +} +} +// entity 23 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_fence" +"_tb_id" "33" +} +// entity 24 +{ +"classname" "func_detail_fence" +"_tb_group" "33" +// brush 0 +{ +( -32 -80 272 ) ( -32 -80 271 ) ( -32 -79 272 ) {trigger 32 0 270 1 1 +( -32 -32 272 ) ( -31 -32 272 ) ( -32 -32 271 ) {trigger 32 16 270 1 1 +( -16 0 224 ) ( -15 0 224 ) ( -16 1 224 ) {trigger 0 16 90 1 -1 +( -32 -80 256 ) ( -32 -79 256 ) ( -31 -80 256 ) {trigger 0 16 90 1 -1 +( -16 0 224 ) ( -16 0 223 ) ( -15 0 224 ) {trigger 32 16 270 1 1 +( -16 0 224 ) ( -16 1 224 ) ( -16 0 223 ) {trigger 32 0 270 1 1 +} +// brush 1 +{ +( -96 -80 272 ) ( -96 -80 271 ) ( -96 -79 272 ) {trigger 32 0 270 1 1 +( -96 -32 272 ) ( -95 -32 272 ) ( -96 -32 271 ) {trigger 32 16 270 1 1 +( -80 0 224 ) ( -79 0 224 ) ( -80 1 224 ) {trigger 0 16 90 1 -1 +( -96 -80 256 ) ( -96 -79 256 ) ( -95 -80 256 ) {trigger 0 16 90 1 -1 +( -80 0 224 ) ( -80 0 223 ) ( -79 0 224 ) {trigger 32 16 270 1 1 +( -80 0 224 ) ( -80 1 224 ) ( -80 0 223 ) {trigger 32 0 270 1 1 +} +// brush 2 +{ +( -224 -80 272 ) ( -224 -80 271 ) ( -224 -79 272 ) {trigger 32 0 270 1 1 +( -224 -32 272 ) ( -223 -32 272 ) ( -224 -32 271 ) {trigger 32 16 270 1 1 +( -208 0 224 ) ( -207 0 224 ) ( -208 1 224 ) {trigger 0 16 90 1 -1 +( -224 -80 256 ) ( -224 -79 256 ) ( -223 -80 256 ) {trigger 0 16 90 1 -1 +( -208 0 224 ) ( -208 0 223 ) ( -207 0 224 ) {trigger 32 16 270 1 1 +( -208 0 224 ) ( -208 1 224 ) ( -208 0 223 ) {trigger 32 0 270 1 1 +} +// brush 3 +{ +( -160 -80 272 ) ( -160 -80 271 ) ( -160 -79 272 ) {trigger 32 0 270 1 1 +( -160 -32 272 ) ( -159 -32 272 ) ( -160 -32 271 ) {trigger 32 16 270 1 1 +( -144 0 224 ) ( -143 0 224 ) ( -144 1 224 ) {trigger 0 16 90 1 -1 +( -160 -80 256 ) ( -160 -79 256 ) ( -159 -80 256 ) {trigger 0 16 90 1 -1 +( -144 0 224 ) ( -144 0 223 ) ( -143 0 224 ) {trigger 32 16 270 1 1 +( -144 0 224 ) ( -144 1 224 ) ( -144 0 223 ) {trigger 32 0 270 1 1 +} +// brush 4 +{ +( -288 -80 272 ) ( -288 -80 271 ) ( -288 -79 272 ) {trigger 32 0 270 1 1 +( -288 -32 272 ) ( -287 -32 272 ) ( -288 -32 271 ) {trigger 32 16 270 1 1 +( -272 0 224 ) ( -271 0 224 ) ( -272 1 224 ) {trigger 0 16 90 1 -1 +( -288 -80 256 ) ( -288 -79 256 ) ( -287 -80 256 ) {trigger 0 16 90 1 -1 +( -272 0 224 ) ( -272 0 223 ) ( -271 0 224 ) {trigger 32 16 270 1 1 +( -272 0 224 ) ( -272 1 224 ) ( -272 0 223 ) {trigger 32 0 270 1 1 +} +// brush 5 +{ +( -416 -80 272 ) ( -416 -80 271 ) ( -416 -79 272 ) {trigger 32 0 270 1 1 +( -416 -32 272 ) ( -415 -32 272 ) ( -416 -32 271 ) {trigger 32 16 270 1 1 +( -400 0 224 ) ( -399 0 224 ) ( -400 1 224 ) {trigger 0 16 90 1 -1 +( -416 -80 256 ) ( -416 -79 256 ) ( -415 -80 256 ) {trigger 0 16 90 1 -1 +( -400 0 224 ) ( -400 0 223 ) ( -399 0 224 ) {trigger 32 16 270 1 1 +( -400 0 224 ) ( -400 1 224 ) ( -400 0 223 ) {trigger 32 0 270 1 1 +} +// brush 6 +{ +( -480 -80 272 ) ( -480 -80 271 ) ( -480 -79 272 ) {trigger 32 0 270 1 1 +( -480 -32 272 ) ( -479 -32 272 ) ( -480 -32 271 ) {trigger 32 16 270 1 1 +( -464 0 224 ) ( -463 0 224 ) ( -464 1 224 ) {trigger 0 16 90 1 -1 +( -480 -80 256 ) ( -480 -79 256 ) ( -479 -80 256 ) {trigger 0 16 90 1 -1 +( -464 0 224 ) ( -464 0 223 ) ( -463 0 224 ) {trigger 32 16 270 1 1 +( -464 0 224 ) ( -464 1 224 ) ( -464 0 223 ) {trigger 32 0 270 1 1 +} +// brush 7 +{ +( -352 -80 272 ) ( -352 -80 271 ) ( -352 -79 272 ) {trigger 32 0 270 1 1 +( -352 -32 272 ) ( -351 -32 272 ) ( -352 -32 271 ) {trigger 32 16 270 1 1 +( -336 0 224 ) ( -335 0 224 ) ( -336 1 224 ) {trigger 0 16 90 1 -1 +( -352 -80 256 ) ( -352 -79 256 ) ( -351 -80 256 ) {trigger 0 16 90 1 -1 +( -336 0 224 ) ( -336 0 223 ) ( -335 0 224 ) {trigger 32 16 270 1 1 +( -336 0 224 ) ( -336 1 224 ) ( -336 0 223 ) {trigger 32 0 270 1 1 +} +// brush 8 +{ +( -544 -80 272 ) ( -544 -80 271 ) ( -544 -79 272 ) {trigger 32 0 270 1 1 +( -544 -32 272 ) ( -543 -32 272 ) ( -544 -32 271 ) {trigger 32 16 270 1 1 +( -528 0 224 ) ( -527 0 224 ) ( -528 1 224 ) {trigger 0 16 90 1 -1 +( -544 -80 256 ) ( -544 -79 256 ) ( -543 -80 256 ) {trigger 0 16 90 1 -1 +( -528 0 224 ) ( -528 0 223 ) ( -527 0 224 ) {trigger 32 16 270 1 1 +( -528 0 224 ) ( -528 1 224 ) ( -528 0 223 ) {trigger 32 0 270 1 1 +} +} +// entity 25 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_fence + _mirrorinside" +"_tb_id" "34" +} +// entity 26 +{ +"classname" "func_detail_fence" +"_mirrorinside" "1" +"_tb_group" "34" +// brush 0 +{ +( -32 -80 336 ) ( -32 -80 335 ) ( -32 -79 336 ) {trigger 32 0 270 1 1 +( -32 -32 336 ) ( -31 -32 336 ) ( -32 -32 335 ) {trigger 32 16 270 1 1 +( -16 0 288 ) ( -15 0 288 ) ( -16 1 288 ) {trigger 0 16 90 1 -1 +( -32 -80 320 ) ( -32 -79 320 ) ( -31 -80 320 ) {trigger 0 16 90 1 -1 +( -16 0 288 ) ( -16 0 287 ) ( -15 0 288 ) {trigger 32 16 270 1 1 +( -16 0 288 ) ( -16 1 288 ) ( -16 0 287 ) {trigger 32 0 270 1 1 +} +// brush 1 +{ +( -96 -80 336 ) ( -96 -80 335 ) ( -96 -79 336 ) {trigger 32 0 270 1 1 +( -96 -32 336 ) ( -95 -32 336 ) ( -96 -32 335 ) {trigger 32 16 270 1 1 +( -80 0 288 ) ( -79 0 288 ) ( -80 1 288 ) {trigger 0 16 90 1 -1 +( -96 -80 320 ) ( -96 -79 320 ) ( -95 -80 320 ) {trigger 0 16 90 1 -1 +( -80 0 288 ) ( -80 0 287 ) ( -79 0 288 ) {trigger 32 16 270 1 1 +( -80 0 288 ) ( -80 1 288 ) ( -80 0 287 ) {trigger 32 0 270 1 1 +} +// brush 2 +{ +( -224 -80 336 ) ( -224 -80 335 ) ( -224 -79 336 ) {trigger 32 0 270 1 1 +( -224 -32 336 ) ( -223 -32 336 ) ( -224 -32 335 ) {trigger 32 16 270 1 1 +( -208 0 288 ) ( -207 0 288 ) ( -208 1 288 ) {trigger 0 16 90 1 -1 +( -224 -80 320 ) ( -224 -79 320 ) ( -223 -80 320 ) {trigger 0 16 90 1 -1 +( -208 0 288 ) ( -208 0 287 ) ( -207 0 288 ) {trigger 32 16 270 1 1 +( -208 0 288 ) ( -208 1 288 ) ( -208 0 287 ) {trigger 32 0 270 1 1 +} +// brush 3 +{ +( -160 -80 336 ) ( -160 -80 335 ) ( -160 -79 336 ) {trigger 32 0 270 1 1 +( -160 -32 336 ) ( -159 -32 336 ) ( -160 -32 335 ) {trigger 32 16 270 1 1 +( -144 0 288 ) ( -143 0 288 ) ( -144 1 288 ) {trigger 0 16 90 1 -1 +( -160 -80 320 ) ( -160 -79 320 ) ( -159 -80 320 ) {trigger 0 16 90 1 -1 +( -144 0 288 ) ( -144 0 287 ) ( -143 0 288 ) {trigger 32 16 270 1 1 +( -144 0 288 ) ( -144 1 288 ) ( -144 0 287 ) {trigger 32 0 270 1 1 +} +// brush 4 +{ +( -288 -80 336 ) ( -288 -80 335 ) ( -288 -79 336 ) {trigger 32 0 270 1 1 +( -288 -32 336 ) ( -287 -32 336 ) ( -288 -32 335 ) {trigger 32 16 270 1 1 +( -272 0 288 ) ( -271 0 288 ) ( -272 1 288 ) {trigger 0 16 90 1 -1 +( -288 -80 320 ) ( -288 -79 320 ) ( -287 -80 320 ) {trigger 0 16 90 1 -1 +( -272 0 288 ) ( -272 0 287 ) ( -271 0 288 ) {trigger 32 16 270 1 1 +( -272 0 288 ) ( -272 1 288 ) ( -272 0 287 ) {trigger 32 0 270 1 1 +} +// brush 5 +{ +( -416 -80 336 ) ( -416 -80 335 ) ( -416 -79 336 ) {trigger 32 0 270 1 1 +( -416 -32 336 ) ( -415 -32 336 ) ( -416 -32 335 ) {trigger 32 16 270 1 1 +( -400 0 288 ) ( -399 0 288 ) ( -400 1 288 ) {trigger 0 16 90 1 -1 +( -416 -80 320 ) ( -416 -79 320 ) ( -415 -80 320 ) {trigger 0 16 90 1 -1 +( -400 0 288 ) ( -400 0 287 ) ( -399 0 288 ) {trigger 32 16 270 1 1 +( -400 0 288 ) ( -400 1 288 ) ( -400 0 287 ) {trigger 32 0 270 1 1 +} +// brush 6 +{ +( -480 -80 336 ) ( -480 -80 335 ) ( -480 -79 336 ) {trigger 32 0 270 1 1 +( -480 -32 336 ) ( -479 -32 336 ) ( -480 -32 335 ) {trigger 32 16 270 1 1 +( -464 0 288 ) ( -463 0 288 ) ( -464 1 288 ) {trigger 0 16 90 1 -1 +( -480 -80 320 ) ( -480 -79 320 ) ( -479 -80 320 ) {trigger 0 16 90 1 -1 +( -464 0 288 ) ( -464 0 287 ) ( -463 0 288 ) {trigger 32 16 270 1 1 +( -464 0 288 ) ( -464 1 288 ) ( -464 0 287 ) {trigger 32 0 270 1 1 +} +// brush 7 +{ +( -352 -80 336 ) ( -352 -80 335 ) ( -352 -79 336 ) {trigger 32 0 270 1 1 +( -352 -32 336 ) ( -351 -32 336 ) ( -352 -32 335 ) {trigger 32 16 270 1 1 +( -336 0 288 ) ( -335 0 288 ) ( -336 1 288 ) {trigger 0 16 90 1 -1 +( -352 -80 320 ) ( -352 -79 320 ) ( -351 -80 320 ) {trigger 0 16 90 1 -1 +( -336 0 288 ) ( -336 0 287 ) ( -335 0 288 ) {trigger 32 16 270 1 1 +( -336 0 288 ) ( -336 1 288 ) ( -336 0 287 ) {trigger 32 0 270 1 1 +} +// brush 8 +{ +( -544 -80 336 ) ( -544 -80 335 ) ( -544 -79 336 ) {trigger 32 0 270 1 1 +( -544 -32 336 ) ( -543 -32 336 ) ( -544 -32 335 ) {trigger 32 16 270 1 1 +( -528 0 288 ) ( -527 0 288 ) ( -528 1 288 ) {trigger 0 16 90 1 -1 +( -544 -80 320 ) ( -544 -79 320 ) ( -543 -80 320 ) {trigger 0 16 90 1 -1 +( -528 0 288 ) ( -528 0 287 ) ( -527 0 288 ) {trigger 32 16 270 1 1 +( -528 0 288 ) ( -528 1 288 ) ( -528 0 287 ) {trigger 32 0 270 1 1 +} +} +// entity 27 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_illusionary" +"_tb_id" "35" +} +// entity 28 +{ +"classname" "func_detail_illusionary" +"_tb_group" "35" +// brush 0 +{ +( -32 -80 400 ) ( -32 -80 399 ) ( -32 -79 400 ) {trigger 32 0 270 1 1 +( -32 -32 400 ) ( -31 -32 400 ) ( -32 -32 399 ) {trigger 32 16 270 1 1 +( -16 0 352 ) ( -15 0 352 ) ( -16 1 352 ) {trigger 0 16 90 1 -1 +( -32 -80 384 ) ( -32 -79 384 ) ( -31 -80 384 ) {trigger 0 16 90 1 -1 +( -16 0 352 ) ( -16 0 351 ) ( -15 0 352 ) {trigger 32 16 270 1 1 +( -16 0 352 ) ( -16 1 352 ) ( -16 0 351 ) {trigger 32 0 270 1 1 +} +// brush 1 +{ +( -96 -80 400 ) ( -96 -80 399 ) ( -96 -79 400 ) {trigger 32 0 270 1 1 +( -96 -32 400 ) ( -95 -32 400 ) ( -96 -32 399 ) {trigger 32 16 270 1 1 +( -80 0 352 ) ( -79 0 352 ) ( -80 1 352 ) {trigger 0 16 90 1 -1 +( -96 -80 384 ) ( -96 -79 384 ) ( -95 -80 384 ) {trigger 0 16 90 1 -1 +( -80 0 352 ) ( -80 0 351 ) ( -79 0 352 ) {trigger 32 16 270 1 1 +( -80 0 352 ) ( -80 1 352 ) ( -80 0 351 ) {trigger 32 0 270 1 1 +} +// brush 2 +{ +( -160 -80 400 ) ( -160 -80 399 ) ( -160 -79 400 ) {trigger 32 0 270 1 1 +( -160 -32 400 ) ( -159 -32 400 ) ( -160 -32 399 ) {trigger 32 16 270 1 1 +( -144 0 352 ) ( -143 0 352 ) ( -144 1 352 ) {trigger 0 16 90 1 -1 +( -160 -80 384 ) ( -160 -79 384 ) ( -159 -80 384 ) {trigger 0 16 90 1 -1 +( -144 0 352 ) ( -144 0 351 ) ( -143 0 352 ) {trigger 32 16 270 1 1 +( -144 0 352 ) ( -144 1 352 ) ( -144 0 351 ) {trigger 32 0 270 1 1 +} +// brush 3 +{ +( -224 -80 400 ) ( -224 -80 399 ) ( -224 -79 400 ) {trigger 32 0 270 1 1 +( -224 -32 400 ) ( -223 -32 400 ) ( -224 -32 399 ) {trigger 32 16 270 1 1 +( -208 0 352 ) ( -207 0 352 ) ( -208 1 352 ) {trigger 0 16 90 1 -1 +( -224 -80 384 ) ( -224 -79 384 ) ( -223 -80 384 ) {trigger 0 16 90 1 -1 +( -208 0 352 ) ( -208 0 351 ) ( -207 0 352 ) {trigger 32 16 270 1 1 +( -208 0 352 ) ( -208 1 352 ) ( -208 0 351 ) {trigger 32 0 270 1 1 +} +// brush 4 +{ +( -288 -80 400 ) ( -288 -80 399 ) ( -288 -79 400 ) {trigger 32 0 270 1 1 +( -288 -32 400 ) ( -287 -32 400 ) ( -288 -32 399 ) {trigger 32 16 270 1 1 +( -272 0 352 ) ( -271 0 352 ) ( -272 1 352 ) {trigger 0 16 90 1 -1 +( -288 -80 384 ) ( -288 -79 384 ) ( -287 -80 384 ) {trigger 0 16 90 1 -1 +( -272 0 352 ) ( -272 0 351 ) ( -271 0 352 ) {trigger 32 16 270 1 1 +( -272 0 352 ) ( -272 1 352 ) ( -272 0 351 ) {trigger 32 0 270 1 1 +} +// brush 5 +{ +( -352 -80 400 ) ( -352 -80 399 ) ( -352 -79 400 ) {trigger 32 0 270 1 1 +( -352 -32 400 ) ( -351 -32 400 ) ( -352 -32 399 ) {trigger 32 16 270 1 1 +( -336 0 352 ) ( -335 0 352 ) ( -336 1 352 ) {trigger 0 16 90 1 -1 +( -352 -80 384 ) ( -352 -79 384 ) ( -351 -80 384 ) {trigger 0 16 90 1 -1 +( -336 0 352 ) ( -336 0 351 ) ( -335 0 352 ) {trigger 32 16 270 1 1 +( -336 0 352 ) ( -336 1 352 ) ( -336 0 351 ) {trigger 32 0 270 1 1 +} +// brush 6 +{ +( -480 -80 400 ) ( -480 -80 399 ) ( -480 -79 400 ) {trigger 32 0 270 1 1 +( -480 -32 400 ) ( -479 -32 400 ) ( -480 -32 399 ) {trigger 32 16 270 1 1 +( -464 0 352 ) ( -463 0 352 ) ( -464 1 352 ) {trigger 0 16 90 1 -1 +( -480 -80 384 ) ( -480 -79 384 ) ( -479 -80 384 ) {trigger 0 16 90 1 -1 +( -464 0 352 ) ( -464 0 351 ) ( -463 0 352 ) {trigger 32 16 270 1 1 +( -464 0 352 ) ( -464 1 352 ) ( -464 0 351 ) {trigger 32 0 270 1 1 +} +// brush 7 +{ +( -416 -80 400 ) ( -416 -80 399 ) ( -416 -79 400 ) {trigger 32 0 270 1 1 +( -416 -32 400 ) ( -415 -32 400 ) ( -416 -32 399 ) {trigger 32 16 270 1 1 +( -400 0 352 ) ( -399 0 352 ) ( -400 1 352 ) {trigger 0 16 90 1 -1 +( -416 -80 384 ) ( -416 -79 384 ) ( -415 -80 384 ) {trigger 0 16 90 1 -1 +( -400 0 352 ) ( -400 0 351 ) ( -399 0 352 ) {trigger 32 16 270 1 1 +( -400 0 352 ) ( -400 1 352 ) ( -400 0 351 ) {trigger 32 0 270 1 1 +} +// brush 8 +{ +( -544 -80 400 ) ( -544 -80 399 ) ( -544 -79 400 ) {trigger 32 0 270 1 1 +( -544 -32 400 ) ( -543 -32 400 ) ( -544 -32 399 ) {trigger 32 16 270 1 1 +( -528 0 352 ) ( -527 0 352 ) ( -528 1 352 ) {trigger 0 16 90 1 -1 +( -544 -80 384 ) ( -544 -79 384 ) ( -543 -80 384 ) {trigger 0 16 90 1 -1 +( -528 0 352 ) ( -528 0 351 ) ( -527 0 352 ) {trigger 32 16 270 1 1 +( -528 0 352 ) ( -528 1 352 ) ( -528 0 351 ) {trigger 32 0 270 1 1 +} +} +// entity 29 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "func_detail_illusionary + _noclipfaces" +"_tb_id" "36" +} +// entity 30 +{ +"classname" "func_detail_illusionary" +"_noclipfaces" "1" +"_tb_group" "36" +// brush 0 +{ +( -32 -80 464 ) ( -32 -80 463 ) ( -32 -79 464 ) {trigger 32 0 270 1 1 +( -32 -32 464 ) ( -31 -32 464 ) ( -32 -32 463 ) {trigger 32 16 270 1 1 +( -16 0 416 ) ( -15 0 416 ) ( -16 1 416 ) {trigger 0 16 90 1 -1 +( -32 -80 448 ) ( -32 -79 448 ) ( -31 -80 448 ) {trigger 0 16 90 1 -1 +( -16 0 416 ) ( -16 0 415 ) ( -15 0 416 ) {trigger 32 16 270 1 1 +( -16 0 416 ) ( -16 1 416 ) ( -16 0 415 ) {trigger 32 0 270 1 1 +} +// brush 1 +{ +( -96 -80 464 ) ( -96 -80 463 ) ( -96 -79 464 ) {trigger 32 0 270 1 1 +( -96 -32 464 ) ( -95 -32 464 ) ( -96 -32 463 ) {trigger 32 16 270 1 1 +( -80 0 416 ) ( -79 0 416 ) ( -80 1 416 ) {trigger 0 16 90 1 -1 +( -96 -80 448 ) ( -96 -79 448 ) ( -95 -80 448 ) {trigger 0 16 90 1 -1 +( -80 0 416 ) ( -80 0 415 ) ( -79 0 416 ) {trigger 32 16 270 1 1 +( -80 0 416 ) ( -80 1 416 ) ( -80 0 415 ) {trigger 32 0 270 1 1 +} +// brush 2 +{ +( -160 -80 464 ) ( -160 -80 463 ) ( -160 -79 464 ) {trigger 32 0 270 1 1 +( -160 -32 464 ) ( -159 -32 464 ) ( -160 -32 463 ) {trigger 32 16 270 1 1 +( -144 0 416 ) ( -143 0 416 ) ( -144 1 416 ) {trigger 0 16 90 1 -1 +( -160 -80 448 ) ( -160 -79 448 ) ( -159 -80 448 ) {trigger 0 16 90 1 -1 +( -144 0 416 ) ( -144 0 415 ) ( -143 0 416 ) {trigger 32 16 270 1 1 +( -144 0 416 ) ( -144 1 416 ) ( -144 0 415 ) {trigger 32 0 270 1 1 +} +// brush 3 +{ +( -224 -80 464 ) ( -224 -80 463 ) ( -224 -79 464 ) {trigger 32 0 270 1 1 +( -224 -32 464 ) ( -223 -32 464 ) ( -224 -32 463 ) {trigger 32 16 270 1 1 +( -208 0 416 ) ( -207 0 416 ) ( -208 1 416 ) {trigger 0 16 90 1 -1 +( -224 -80 448 ) ( -224 -79 448 ) ( -223 -80 448 ) {trigger 0 16 90 1 -1 +( -208 0 416 ) ( -208 0 415 ) ( -207 0 416 ) {trigger 32 16 270 1 1 +( -208 0 416 ) ( -208 1 416 ) ( -208 0 415 ) {trigger 32 0 270 1 1 +} +// brush 4 +{ +( -288 -80 464 ) ( -288 -80 463 ) ( -288 -79 464 ) {trigger 32 0 270 1 1 +( -288 -32 464 ) ( -287 -32 464 ) ( -288 -32 463 ) {trigger 32 16 270 1 1 +( -272 0 416 ) ( -271 0 416 ) ( -272 1 416 ) {trigger 0 16 90 1 -1 +( -288 -80 448 ) ( -288 -79 448 ) ( -287 -80 448 ) {trigger 0 16 90 1 -1 +( -272 0 416 ) ( -272 0 415 ) ( -271 0 416 ) {trigger 32 16 270 1 1 +( -272 0 416 ) ( -272 1 416 ) ( -272 0 415 ) {trigger 32 0 270 1 1 +} +// brush 5 +{ +( -352 -80 464 ) ( -352 -80 463 ) ( -352 -79 464 ) {trigger 32 0 270 1 1 +( -352 -32 464 ) ( -351 -32 464 ) ( -352 -32 463 ) {trigger 32 16 270 1 1 +( -336 0 416 ) ( -335 0 416 ) ( -336 1 416 ) {trigger 0 16 90 1 -1 +( -352 -80 448 ) ( -352 -79 448 ) ( -351 -80 448 ) {trigger 0 16 90 1 -1 +( -336 0 416 ) ( -336 0 415 ) ( -335 0 416 ) {trigger 32 16 270 1 1 +( -336 0 416 ) ( -336 1 416 ) ( -336 0 415 ) {trigger 32 0 270 1 1 +} +// brush 6 +{ +( -480 -80 464 ) ( -480 -80 463 ) ( -480 -79 464 ) {trigger 32 0 270 1 1 +( -480 -32 464 ) ( -479 -32 464 ) ( -480 -32 463 ) {trigger 32 16 270 1 1 +( -464 0 416 ) ( -463 0 416 ) ( -464 1 416 ) {trigger 0 16 90 1 -1 +( -480 -80 448 ) ( -480 -79 448 ) ( -479 -80 448 ) {trigger 0 16 90 1 -1 +( -464 0 416 ) ( -464 0 415 ) ( -463 0 416 ) {trigger 32 16 270 1 1 +( -464 0 416 ) ( -464 1 416 ) ( -464 0 415 ) {trigger 32 0 270 1 1 +} +// brush 7 +{ +( -416 -80 464 ) ( -416 -80 463 ) ( -416 -79 464 ) {trigger 32 0 270 1 1 +( -416 -32 464 ) ( -415 -32 464 ) ( -416 -32 463 ) {trigger 32 16 270 1 1 +( -400 0 416 ) ( -399 0 416 ) ( -400 1 416 ) {trigger 0 16 90 1 -1 +( -416 -80 448 ) ( -416 -79 448 ) ( -415 -80 448 ) {trigger 0 16 90 1 -1 +( -400 0 416 ) ( -400 0 415 ) ( -399 0 416 ) {trigger 32 16 270 1 1 +( -400 0 416 ) ( -400 1 416 ) ( -400 0 415 ) {trigger 32 0 270 1 1 +} +// brush 8 +{ +( -544 -80 464 ) ( -544 -80 463 ) ( -544 -79 464 ) {trigger 32 0 270 1 1 +( -544 -32 464 ) ( -543 -32 464 ) ( -544 -32 463 ) {trigger 32 16 270 1 1 +( -528 0 416 ) ( -527 0 416 ) ( -528 1 416 ) {trigger 0 16 90 1 -1 +( -544 -80 448 ) ( -544 -79 448 ) ( -543 -80 448 ) {trigger 0 16 90 1 -1 +( -528 0 416 ) ( -528 0 415 ) ( -527 0 416 ) {trigger 32 16 270 1 1 +( -528 0 416 ) ( -528 1 416 ) ( -528 0 415 ) {trigger 32 0 270 1 1 +} +} +// entity 31 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "Water" +"_tb_id" "37" +// brush 0 +{ +( -32 -80 528 ) ( -32 -80 527 ) ( -32 -79 528 ) *swater4 32 0 270 1 1 +( -32 -32 528 ) ( -31 -32 528 ) ( -32 -32 527 ) *swater4 32 16 270 1 1 +( -16 0 480 ) ( -15 0 480 ) ( -16 1 480 ) *swater4 0 16 90 1 -1 +( -32 -80 512 ) ( -32 -79 512 ) ( -31 -80 512 ) *swater4 0 16 90 1 -1 +( -16 0 480 ) ( -16 0 479 ) ( -15 0 480 ) *swater4 32 16 270 1 1 +( -16 0 480 ) ( -16 1 480 ) ( -16 0 479 ) *swater4 32 0 270 1 1 +} +// brush 1 +{ +( -96 -80 528 ) ( -96 -80 527 ) ( -96 -79 528 ) *swater4 32 0 270 1 1 +( -96 -32 528 ) ( -95 -32 528 ) ( -96 -32 527 ) *swater4 32 16 270 1 1 +( -80 0 480 ) ( -79 0 480 ) ( -80 1 480 ) *swater4 0 16 90 1 -1 +( -96 -80 512 ) ( -96 -79 512 ) ( -95 -80 512 ) *swater4 0 16 90 1 -1 +( -80 0 480 ) ( -80 0 479 ) ( -79 0 480 ) *swater4 32 16 270 1 1 +( -80 0 480 ) ( -80 1 480 ) ( -80 0 479 ) *swater4 32 0 270 1 1 +} +// brush 2 +{ +( -544 -80 528 ) ( -544 -80 527 ) ( -544 -79 528 ) *swater4 32 0 270 1 1 +( -544 -32 528 ) ( -543 -32 528 ) ( -544 -32 527 ) *swater4 32 16 270 1 1 +( -528 0 480 ) ( -527 0 480 ) ( -528 1 480 ) *swater4 0 16 90 1 -1 +( -544 -80 512 ) ( -544 -79 512 ) ( -543 -80 512 ) *swater4 0 16 90 1 -1 +( -528 0 480 ) ( -528 0 479 ) ( -527 0 480 ) *swater4 32 16 270 1 1 +( -528 0 480 ) ( -528 1 480 ) ( -528 0 479 ) *swater4 32 0 270 1 1 +} +// brush 3 +{ +( -288 -80 528 ) ( -288 -80 527 ) ( -288 -79 528 ) *swater4 32 0 270 1 1 +( -288 -32 528 ) ( -287 -32 528 ) ( -288 -32 527 ) *swater4 32 16 270 1 1 +( -272 0 480 ) ( -271 0 480 ) ( -272 1 480 ) *swater4 0 16 90 1 -1 +( -288 -80 512 ) ( -288 -79 512 ) ( -287 -80 512 ) *swater4 0 16 90 1 -1 +( -272 0 480 ) ( -272 0 479 ) ( -271 0 480 ) *swater4 32 16 270 1 1 +( -272 0 480 ) ( -272 1 480 ) ( -272 0 479 ) *swater4 32 0 270 1 1 +} +// brush 4 +{ +( -224 -80 528 ) ( -224 -80 527 ) ( -224 -79 528 ) *swater4 32 0 270 1 1 +( -224 -32 528 ) ( -223 -32 528 ) ( -224 -32 527 ) *swater4 32 16 270 1 1 +( -208 0 480 ) ( -207 0 480 ) ( -208 1 480 ) *swater4 0 16 90 1 -1 +( -224 -80 512 ) ( -224 -79 512 ) ( -223 -80 512 ) *swater4 0 16 90 1 -1 +( -208 0 480 ) ( -208 0 479 ) ( -207 0 480 ) *swater4 32 16 270 1 1 +( -208 0 480 ) ( -208 1 480 ) ( -208 0 479 ) *swater4 32 0 270 1 1 +} +// brush 5 +{ +( -480 -80 528 ) ( -480 -80 527 ) ( -480 -79 528 ) *swater4 32 0 270 1 1 +( -480 -32 528 ) ( -479 -32 528 ) ( -480 -32 527 ) *swater4 32 16 270 1 1 +( -464 0 480 ) ( -463 0 480 ) ( -464 1 480 ) *swater4 0 16 90 1 -1 +( -480 -80 512 ) ( -480 -79 512 ) ( -479 -80 512 ) *swater4 0 16 90 1 -1 +( -464 0 480 ) ( -464 0 479 ) ( -463 0 480 ) *swater4 32 16 270 1 1 +( -464 0 480 ) ( -464 1 480 ) ( -464 0 479 ) *swater4 32 0 270 1 1 +} +// brush 6 +{ +( -160 -80 528 ) ( -160 -80 527 ) ( -160 -79 528 ) *swater4 32 0 270 1 1 +( -160 -32 528 ) ( -159 -32 528 ) ( -160 -32 527 ) *swater4 32 16 270 1 1 +( -144 0 480 ) ( -143 0 480 ) ( -144 1 480 ) *swater4 0 16 90 1 -1 +( -160 -80 512 ) ( -160 -79 512 ) ( -159 -80 512 ) *swater4 0 16 90 1 -1 +( -144 0 480 ) ( -144 0 479 ) ( -143 0 480 ) *swater4 32 16 270 1 1 +( -144 0 480 ) ( -144 1 480 ) ( -144 0 479 ) *swater4 32 0 270 1 1 +} +// brush 7 +{ +( -352 -80 528 ) ( -352 -80 527 ) ( -352 -79 528 ) *swater4 32 0 270 1 1 +( -352 -32 528 ) ( -351 -32 528 ) ( -352 -32 527 ) *swater4 32 16 270 1 1 +( -336 0 480 ) ( -335 0 480 ) ( -336 1 480 ) *swater4 0 16 90 1 -1 +( -352 -80 512 ) ( -352 -79 512 ) ( -351 -80 512 ) *swater4 0 16 90 1 -1 +( -336 0 480 ) ( -336 0 479 ) ( -335 0 480 ) *swater4 32 16 270 1 1 +( -336 0 480 ) ( -336 1 480 ) ( -336 0 479 ) *swater4 32 0 270 1 1 +} +// brush 8 +{ +( -416 -80 528 ) ( -416 -80 527 ) ( -416 -79 528 ) *swater4 32 0 270 1 1 +( -416 -32 528 ) ( -415 -32 528 ) ( -416 -32 527 ) *swater4 32 16 270 1 1 +( -400 0 480 ) ( -399 0 480 ) ( -400 1 480 ) *swater4 0 16 90 1 -1 +( -416 -80 512 ) ( -416 -79 512 ) ( -415 -80 512 ) *swater4 0 16 90 1 -1 +( -400 0 480 ) ( -400 0 479 ) ( -399 0 480 ) *swater4 32 16 270 1 1 +( -400 0 480 ) ( -400 1 480 ) ( -400 0 479 ) *swater4 32 0 270 1 1 +} +} +// entity 32 +{ +"classname" "func_group" +"_tb_type" "_tb_group" +"_tb_name" "Sky" +"_tb_id" "38" +// brush 0 +{ +( -32 -80 592 ) ( -32 -80 591 ) ( -32 -79 592 ) sky3 160 0 270 1 1 +( -32 -32 592 ) ( -31 -32 592 ) ( -32 -32 591 ) sky3 160 -48 270 1 1 +( -16 0 544 ) ( -15 0 544 ) ( -16 1 544 ) sky3 0 -48 90 1 -1 +( -32 -80 576 ) ( -32 -79 576 ) ( -31 -80 576 ) sky3 0 -48 90 1 -1 +( -16 0 544 ) ( -16 0 543 ) ( -15 0 544 ) sky3 160 -48 270 1 1 +( -16 0 544 ) ( -16 1 544 ) ( -16 0 543 ) sky3 160 0 270 1 1 +} +// brush 1 +{ +( -96 -80 592 ) ( -96 -80 591 ) ( -96 -79 592 ) sky3 160 0 270 1 1 +( -96 -32 592 ) ( -95 -32 592 ) ( -96 -32 591 ) sky3 160 -48 270 1 1 +( -80 0 544 ) ( -79 0 544 ) ( -80 1 544 ) sky3 0 -48 90 1 -1 +( -96 -80 576 ) ( -96 -79 576 ) ( -95 -80 576 ) sky3 0 -48 90 1 -1 +( -80 0 544 ) ( -80 0 543 ) ( -79 0 544 ) sky3 160 -48 270 1 1 +( -80 0 544 ) ( -80 1 544 ) ( -80 0 543 ) sky3 160 0 270 1 1 +} +// brush 2 +{ +( -160 -80 592 ) ( -160 -80 591 ) ( -160 -79 592 ) sky3 160 0 270 1 1 +( -160 -32 592 ) ( -159 -32 592 ) ( -160 -32 591 ) sky3 160 -48 270 1 1 +( -144 0 544 ) ( -143 0 544 ) ( -144 1 544 ) sky3 0 -48 90 1 -1 +( -160 -80 576 ) ( -160 -79 576 ) ( -159 -80 576 ) sky3 0 -48 90 1 -1 +( -144 0 544 ) ( -144 0 543 ) ( -143 0 544 ) sky3 160 -48 270 1 1 +( -144 0 544 ) ( -144 1 544 ) ( -144 0 543 ) sky3 160 0 270 1 1 +} +// brush 3 +{ +( -224 -80 592 ) ( -224 -80 591 ) ( -224 -79 592 ) sky3 160 0 270 1 1 +( -224 -32 592 ) ( -223 -32 592 ) ( -224 -32 591 ) sky3 160 -48 270 1 1 +( -208 0 544 ) ( -207 0 544 ) ( -208 1 544 ) sky3 0 -48 90 1 -1 +( -224 -80 576 ) ( -224 -79 576 ) ( -223 -80 576 ) sky3 0 -48 90 1 -1 +( -208 0 544 ) ( -208 0 543 ) ( -207 0 544 ) sky3 160 -48 270 1 1 +( -208 0 544 ) ( -208 1 544 ) ( -208 0 543 ) sky3 160 0 270 1 1 +} +// brush 4 +{ +( -288 -80 592 ) ( -288 -80 591 ) ( -288 -79 592 ) sky3 160 0 270 1 1 +( -288 -32 592 ) ( -287 -32 592 ) ( -288 -32 591 ) sky3 160 -48 270 1 1 +( -272 0 544 ) ( -271 0 544 ) ( -272 1 544 ) sky3 0 -48 90 1 -1 +( -288 -80 576 ) ( -288 -79 576 ) ( -287 -80 576 ) sky3 0 -48 90 1 -1 +( -272 0 544 ) ( -272 0 543 ) ( -271 0 544 ) sky3 160 -48 270 1 1 +( -272 0 544 ) ( -272 1 544 ) ( -272 0 543 ) sky3 160 0 270 1 1 +} +// brush 5 +{ +( -352 -80 592 ) ( -352 -80 591 ) ( -352 -79 592 ) sky3 160 0 270 1 1 +( -352 -32 592 ) ( -351 -32 592 ) ( -352 -32 591 ) sky3 160 -48 270 1 1 +( -336 0 544 ) ( -335 0 544 ) ( -336 1 544 ) sky3 0 -48 90 1 -1 +( -352 -80 576 ) ( -352 -79 576 ) ( -351 -80 576 ) sky3 0 -48 90 1 -1 +( -336 0 544 ) ( -336 0 543 ) ( -335 0 544 ) sky3 160 -48 270 1 1 +( -336 0 544 ) ( -336 1 544 ) ( -336 0 543 ) sky3 160 0 270 1 1 +} +// brush 6 +{ +( -416 -80 592 ) ( -416 -80 591 ) ( -416 -79 592 ) sky3 160 0 270 1 1 +( -416 -32 592 ) ( -415 -32 592 ) ( -416 -32 591 ) sky3 160 -48 270 1 1 +( -400 0 544 ) ( -399 0 544 ) ( -400 1 544 ) sky3 0 -48 90 1 -1 +( -416 -80 576 ) ( -416 -79 576 ) ( -415 -80 576 ) sky3 0 -48 90 1 -1 +( -400 0 544 ) ( -400 0 543 ) ( -399 0 544 ) sky3 160 -48 270 1 1 +( -400 0 544 ) ( -400 1 544 ) ( -400 0 543 ) sky3 160 0 270 1 1 +} +// brush 7 +{ +( -480 -80 592 ) ( -480 -80 591 ) ( -480 -79 592 ) sky3 160 0 270 1 1 +( -480 -32 592 ) ( -479 -32 592 ) ( -480 -32 591 ) sky3 160 -48 270 1 1 +( -464 0 544 ) ( -463 0 544 ) ( -464 1 544 ) sky3 0 -48 90 1 -1 +( -480 -80 576 ) ( -480 -79 576 ) ( -479 -80 576 ) sky3 0 -48 90 1 -1 +( -464 0 544 ) ( -464 0 543 ) ( -463 0 544 ) sky3 160 -48 270 1 1 +( -464 0 544 ) ( -464 1 544 ) ( -464 0 543 ) sky3 160 0 270 1 1 +} +// brush 8 +{ +( -544 -80 592 ) ( -544 -80 591 ) ( -544 -79 592 ) sky3 160 0 270 1 1 +( -544 -32 592 ) ( -543 -32 592 ) ( -544 -32 591 ) sky3 160 -48 270 1 1 +( -528 0 544 ) ( -527 0 544 ) ( -528 1 544 ) sky3 0 -48 90 1 -1 +( -544 -80 576 ) ( -544 -79 576 ) ( -543 -80 576 ) sky3 0 -48 90 1 -1 +( -528 0 544 ) ( -528 0 543 ) ( -527 0 544 ) sky3 160 -48 270 1 1 +( -528 0 544 ) ( -528 1 544 ) ( -528 0 543 ) sky3 160 0 270 1 1 +} +} diff --git a/tests/test_qbsp.cc b/tests/test_qbsp.cc index 3999c989..08a70b0a 100644 --- a/tests/test_qbsp.cc +++ b/tests/test_qbsp.cc @@ -2122,3 +2122,195 @@ TEST_CASE("lq e3m4.map" * doctest::may_fail()) const auto [bsp, bspx, prt] = LoadTestmap("LibreQuake/lq1/maps/src/e3/e3m4.map"); CHECK(prt); } + +TEST_CASE("q1_tjunc_matrix") +{ + // TODO: test opaque water in q1 mode + const auto [b, bspx, prt] = LoadTestmap("q1_tjunc_matrix.map", {"-mergeacrosswater"}); + const mbsp_t &bsp = b; // workaround clang not allowing capturing bindings in lambdas + auto *game = bsp.loadversion->game; + + CHECK(GAME_QUAKE == game->id); + + const qvec3d face_midpoint_origin {-24, 0, 24}; + const qvec3d face_midpoint_to_tjunc {8, 0, 8}; + const qvec3d z_delta_to_next_face {0, 0, 64}; + const qvec3d x_delta_to_next_face {-64, 0, 0}; + + enum index_t : int { + INDEX_SOLID = 0, + INDEX_SOLID_DETAIL, + INDEX_DETAIL_WALL, + INDEX_DETAIL_FENCE, + INDEX_DETAIL_FENCE_MIRRORINSIDE, + INDEX_DETAIL_ILLUSIONARY, + INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, + INDEX_WATER, + INDEX_SKY + }; + + auto has_tjunc = [&](index_t horizontal, index_t vertical) -> bool { + const qvec3d face_midpoint = face_midpoint_origin + + (x_delta_to_next_face * static_cast(horizontal)) + + (z_delta_to_next_face * static_cast(vertical)); + + auto *f = BSP_FindFaceAtPoint(&bsp, &bsp.dmodels[0], face_midpoint); + + const qvec3f tjunc_location = qvec3f(face_midpoint + face_midpoint_to_tjunc); + + for (int i = 0; i < f->numedges; ++i) { + if (Face_PointAtIndex(&bsp, f, i) == tjunc_location) { + return true; + } + } + return false; + }; + + { + INFO("INDEX_SOLID horizontal - welds with anything opaque except detail_wall"); + CHECK( has_tjunc(INDEX_SOLID, INDEX_SOLID)); + CHECK( has_tjunc(INDEX_SOLID, INDEX_SOLID_DETAIL)); + CHECK(!has_tjunc(INDEX_SOLID, INDEX_DETAIL_WALL)); + CHECK(!has_tjunc(INDEX_SOLID, INDEX_DETAIL_FENCE)); + CHECK(!has_tjunc(INDEX_SOLID, INDEX_DETAIL_FENCE_MIRRORINSIDE)); + CHECK(!has_tjunc(INDEX_SOLID, INDEX_DETAIL_ILLUSIONARY)); + CHECK(!has_tjunc(INDEX_SOLID, INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES)); + // "-mergeacrosswater" is needed to prevent a weld between transparent water and solid + CHECK(!has_tjunc(INDEX_SOLID, INDEX_WATER)); + CHECK( has_tjunc(INDEX_SOLID, INDEX_SKY)); + } + + { + INFO("INDEX_SOLID_DETAIL horizontal - welds with anything opaque except detail_wall"); + CHECK( has_tjunc(INDEX_SOLID_DETAIL, INDEX_SOLID)); + CHECK( has_tjunc(INDEX_SOLID_DETAIL, INDEX_SOLID_DETAIL)); + CHECK(!has_tjunc(INDEX_SOLID_DETAIL, INDEX_DETAIL_WALL)); + CHECK(!has_tjunc(INDEX_SOLID_DETAIL, INDEX_DETAIL_FENCE)); + CHECK(!has_tjunc(INDEX_SOLID_DETAIL, INDEX_DETAIL_FENCE_MIRRORINSIDE)); + CHECK(!has_tjunc(INDEX_SOLID_DETAIL, INDEX_DETAIL_ILLUSIONARY)); + CHECK(!has_tjunc(INDEX_SOLID_DETAIL, INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES)); + // see INDEX_SOLID, INDEX_WATER explanation + CHECK(!has_tjunc(INDEX_SOLID_DETAIL, INDEX_WATER)); + CHECK( has_tjunc(INDEX_SOLID_DETAIL, INDEX_SKY)); + } + + { + INFO("INDEX_DETAIL_WALL horizontal"); + // solid cuts a hole in detail_wall + CHECK( has_tjunc(INDEX_DETAIL_WALL, INDEX_SOLID)); + // solid detail cuts a hole in detail_wall + CHECK( has_tjunc(INDEX_DETAIL_WALL, INDEX_SOLID_DETAIL)); + CHECK( has_tjunc(INDEX_DETAIL_WALL, INDEX_DETAIL_WALL)); + CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_DETAIL_FENCE)); + CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_DETAIL_FENCE_MIRRORINSIDE)); + CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_DETAIL_ILLUSIONARY)); + CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES)); + // see INDEX_SOLID, INDEX_WATER explanation + CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_WATER)); + // sky cuts a hole in detail_wall + CHECK( has_tjunc(INDEX_DETAIL_WALL, INDEX_SKY)); + } + + { + INFO("INDEX_DETAIL_FENCE horizontal"); + // solid cuts a hole in fence + CHECK( has_tjunc(INDEX_DETAIL_FENCE, INDEX_SOLID)); + // solid detail cuts a hole in fence + CHECK( has_tjunc(INDEX_DETAIL_FENCE, INDEX_SOLID_DETAIL)); + // detail wall cuts a hole in fence + CHECK( has_tjunc(INDEX_DETAIL_FENCE, INDEX_DETAIL_WALL)); + CHECK( has_tjunc(INDEX_DETAIL_FENCE, INDEX_DETAIL_FENCE)); + CHECK( has_tjunc(INDEX_DETAIL_FENCE, INDEX_DETAIL_FENCE_MIRRORINSIDE)); + CHECK( has_tjunc(INDEX_DETAIL_FENCE, INDEX_DETAIL_ILLUSIONARY)); + CHECK( has_tjunc(INDEX_DETAIL_FENCE, INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES)); + // weld because both are translucent + CHECK( has_tjunc(INDEX_DETAIL_FENCE, INDEX_WATER)); + // sky cuts a hole in fence + CHECK( has_tjunc(INDEX_DETAIL_FENCE, INDEX_SKY)); + } + + { + INFO("INDEX_DETAIL_FENCE_MIRRORINSIDE horizontal"); + // solid cuts a hole in fence + CHECK( has_tjunc(INDEX_DETAIL_FENCE_MIRRORINSIDE, INDEX_SOLID)); + // solid detail cuts a hole in fence + CHECK( has_tjunc(INDEX_DETAIL_FENCE_MIRRORINSIDE, INDEX_SOLID_DETAIL)); + // detail wall cuts a hole in fence + CHECK( has_tjunc(INDEX_DETAIL_FENCE_MIRRORINSIDE, INDEX_DETAIL_WALL)); + CHECK( has_tjunc(INDEX_DETAIL_FENCE_MIRRORINSIDE, INDEX_DETAIL_FENCE)); + CHECK( has_tjunc(INDEX_DETAIL_FENCE_MIRRORINSIDE, INDEX_DETAIL_FENCE_MIRRORINSIDE)); + CHECK( has_tjunc(INDEX_DETAIL_FENCE_MIRRORINSIDE, INDEX_DETAIL_ILLUSIONARY)); + CHECK( has_tjunc(INDEX_DETAIL_FENCE_MIRRORINSIDE, INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES)); + // weld because both are translucent + CHECK( has_tjunc(INDEX_DETAIL_FENCE_MIRRORINSIDE, INDEX_WATER)); + // sky cuts a hole in fence + CHECK( has_tjunc(INDEX_DETAIL_FENCE_MIRRORINSIDE, INDEX_SKY)); + } + + { + INFO("INDEX_DETAIL_ILLUSIONARY horizontal"); + // solid cuts a hole in illusionary + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY, INDEX_SOLID)); + // solid detail cuts a hole in illusionary + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY, INDEX_SOLID_DETAIL)); + // detail wall cuts a hole in illusionary + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY, INDEX_DETAIL_WALL)); + // fence and illusionary are both translucent, so weld + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY, INDEX_DETAIL_FENCE)); + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY, INDEX_DETAIL_FENCE_MIRRORINSIDE)); + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY, INDEX_DETAIL_ILLUSIONARY)); + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY, INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES)); + // weld because both are translucent + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY, INDEX_WATER)); + // sky cuts a hole in illusionary + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY, INDEX_SKY)); + } + + { + INFO("INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES horizontal"); + // solid cuts a hole in illusionary + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, INDEX_SOLID)); + // solid detail cuts a hole in illusionary + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, INDEX_SOLID_DETAIL)); + // detail wall cuts a hole in illusionary + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, INDEX_DETAIL_WALL)); + // fence and illusionary are both translucent, so weld + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, INDEX_DETAIL_FENCE)); + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, INDEX_DETAIL_FENCE_MIRRORINSIDE)); + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, INDEX_DETAIL_ILLUSIONARY)); + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES)); + // weld because both are translucent + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, INDEX_WATER)); + // sky cuts a hole in illusionary + CHECK( has_tjunc(INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES, INDEX_SKY)); + } + + { + INFO("INDEX_WATER horizontal"); + // solid cuts a hole in water + CHECK( has_tjunc(INDEX_WATER, INDEX_SOLID)); + // solid detail cuts a hole in illusionary + CHECK( has_tjunc(INDEX_WATER, INDEX_SOLID_DETAIL)); + // detail wall cuts a hole in water + CHECK( has_tjunc(INDEX_WATER, INDEX_DETAIL_WALL)); + CHECK( has_tjunc(INDEX_WATER, INDEX_DETAIL_FENCE)); + CHECK( has_tjunc(INDEX_WATER, INDEX_DETAIL_FENCE_MIRRORINSIDE)); + CHECK( has_tjunc(INDEX_WATER, INDEX_DETAIL_ILLUSIONARY)); + CHECK( has_tjunc(INDEX_WATER, INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES)); + CHECK( has_tjunc(INDEX_WATER, INDEX_WATER)); + CHECK( has_tjunc(INDEX_WATER, INDEX_SKY)); + } + + { + INFO("INDEX_SKY horizontal"); + CHECK( has_tjunc(INDEX_SKY, INDEX_SOLID)); + CHECK( has_tjunc(INDEX_SKY, INDEX_SOLID_DETAIL)); + CHECK(!has_tjunc(INDEX_SKY, INDEX_DETAIL_WALL)); + CHECK(!has_tjunc(INDEX_SKY, INDEX_DETAIL_FENCE)); + CHECK(!has_tjunc(INDEX_SKY, INDEX_DETAIL_FENCE_MIRRORINSIDE)); + CHECK(!has_tjunc(INDEX_SKY, INDEX_DETAIL_ILLUSIONARY)); + CHECK(!has_tjunc(INDEX_SKY, INDEX_DETAIL_ILLUSIONARY_NOCLIPFACES)); + CHECK(!has_tjunc(INDEX_SKY, INDEX_WATER)); + CHECK( has_tjunc(INDEX_SKY, INDEX_SKY)); + } +} diff --git a/tests/test_qbsp_q2.cc b/tests/test_qbsp_q2.cc index 13cc85c9..06d3ee53 100644 --- a/tests/test_qbsp_q2.cc +++ b/tests/test_qbsp_q2.cc @@ -868,7 +868,7 @@ TEST_CASE("q2_mist_transwater" * doctest::test_suite("testmaps_q2")) CHECK(Face_Winding(&bsp, down_faces[0]).directional_equal(top_of_water_dn)); } -TEST_CASE("q2_tjunc_matrix" * doctest::test_suite("testmaps_q2") * doctest::may_fail()) +TEST_CASE("q2_tjunc_matrix" * doctest::test_suite("testmaps_q2")) { const auto [b, bspx, prt] = LoadTestmapQ2("q2_tjunc_matrix.map"); const mbsp_t &bsp = b; // workaround clang not allowing capturing bindings in lambdas @@ -911,16 +911,20 @@ TEST_CASE("q2_tjunc_matrix" * doctest::test_suite("testmaps_q2") * doctest::may_ }; { - INFO("INDEX_DETAIL_WALL horizontal - only welds with itself"); + INFO("INDEX_DETAIL_WALL horizontal"); CHECK( has_tjunc(INDEX_DETAIL_WALL, INDEX_DETAIL_WALL)); - CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_SOLID)); - CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_SOLID_DETAIL)); + // this one is tricky - the solid cuts a hole in the top + // that hole (the detail_wall faces) are what weld with the side + CHECK( has_tjunc(INDEX_DETAIL_WALL, INDEX_SOLID)); + // same as INDEX_DETAIL_WALL, INDEX_SOLID + CHECK( has_tjunc(INDEX_DETAIL_WALL, INDEX_SOLID_DETAIL)); CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_TRANSPARENT_WATER)); CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_OPAQUE_WATER)); CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_OPAQUE_MIST)); CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_TRANSPARENT_WINDOW)); CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_OPAQUE_AUX)); - CHECK(!has_tjunc(INDEX_DETAIL_WALL, INDEX_SKY)); + // same as INDEX_DETAIL_WALL, INDEX_SOLID + CHECK( has_tjunc(INDEX_DETAIL_WALL, INDEX_SKY)); } { @@ -950,66 +954,83 @@ TEST_CASE("q2_tjunc_matrix" * doctest::test_suite("testmaps_q2") * doctest::may_ } { - INFO("INDEX_TRANSPARENT_WATER horizontal - only welds with itself"); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_DETAIL_WALL)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_SOLID)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_SOLID_DETAIL)); + INFO("INDEX_TRANSPARENT_WATER horizontal"); + CHECK( has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_DETAIL_WALL)); + CHECK( has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_SOLID)); + CHECK( has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_SOLID_DETAIL)); CHECK( has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_TRANSPARENT_WATER)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_OPAQUE_WATER)); + CHECK( has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_OPAQUE_WATER)); + // water is stronger than mist, so cuts away the bottom face of the mist + // the top face of the water then doesn't need to weld because CHECK(!has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_OPAQUE_MIST)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_TRANSPARENT_WINDOW)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_OPAQUE_AUX)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_SKY)); + CHECK( has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_TRANSPARENT_WINDOW)); + CHECK( has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_OPAQUE_AUX)); + CHECK( has_tjunc(INDEX_TRANSPARENT_WATER, INDEX_SKY)); } { - INFO("INDEX_OPAQUE_WATER horizontal - same as INDEX_SOLID"); - CHECK(!has_tjunc(INDEX_OPAQUE_WATER, INDEX_DETAIL_WALL)); + INFO("INDEX_OPAQUE_WATER horizontal"); + // detail wall is stronger than water, so cuts a hole and the water then welds with itself + CHECK( has_tjunc(INDEX_OPAQUE_WATER, INDEX_DETAIL_WALL)); CHECK( has_tjunc(INDEX_OPAQUE_WATER, INDEX_SOLID)); CHECK( has_tjunc(INDEX_OPAQUE_WATER, INDEX_SOLID_DETAIL)); - CHECK(!has_tjunc(INDEX_OPAQUE_WATER, INDEX_TRANSPARENT_WATER)); + // welds because opaque water and translucent don't get a face between them + CHECK( has_tjunc(INDEX_OPAQUE_WATER, INDEX_TRANSPARENT_WATER)); CHECK( has_tjunc(INDEX_OPAQUE_WATER, INDEX_OPAQUE_WATER)); CHECK( has_tjunc(INDEX_OPAQUE_WATER, INDEX_OPAQUE_MIST)); - CHECK(!has_tjunc(INDEX_OPAQUE_WATER, INDEX_TRANSPARENT_WINDOW)); + // window is stronger and cuts a hole in the water + CHECK( has_tjunc(INDEX_OPAQUE_WATER, INDEX_TRANSPARENT_WINDOW)); + // same with aux CHECK( has_tjunc(INDEX_OPAQUE_WATER, INDEX_OPAQUE_AUX)); CHECK( has_tjunc(INDEX_OPAQUE_WATER, INDEX_SKY)); } { - INFO("INDEX_OPAQUE_MIST horizontal - same as INDEX_SOLID"); - CHECK(!has_tjunc(INDEX_OPAQUE_MIST, INDEX_DETAIL_WALL)); + INFO("INDEX_OPAQUE_MIST horizontal"); + // detail wall is stronger, cuts mist + CHECK( has_tjunc(INDEX_OPAQUE_MIST, INDEX_DETAIL_WALL)); CHECK( has_tjunc(INDEX_OPAQUE_MIST, INDEX_SOLID)); CHECK( has_tjunc(INDEX_OPAQUE_MIST, INDEX_SOLID_DETAIL)); - CHECK(!has_tjunc(INDEX_OPAQUE_MIST, INDEX_TRANSPARENT_WATER)); + // water is stronger, cuts mist + CHECK( has_tjunc(INDEX_OPAQUE_MIST, INDEX_TRANSPARENT_WATER)); CHECK( has_tjunc(INDEX_OPAQUE_MIST, INDEX_OPAQUE_WATER)); CHECK( has_tjunc(INDEX_OPAQUE_MIST, INDEX_OPAQUE_MIST)); - CHECK(!has_tjunc(INDEX_OPAQUE_MIST, INDEX_TRANSPARENT_WINDOW)); + // window is stronger, cuts mist + CHECK( has_tjunc(INDEX_OPAQUE_MIST, INDEX_TRANSPARENT_WINDOW)); CHECK( has_tjunc(INDEX_OPAQUE_MIST, INDEX_OPAQUE_AUX)); CHECK( has_tjunc(INDEX_OPAQUE_MIST, INDEX_SKY)); } { - INFO("INDEX_TRANSPARENT_WINDOW horizontal - only welds with itself"); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_DETAIL_WALL)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_SOLID)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_SOLID_DETAIL)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_TRANSPARENT_WATER)); + INFO("INDEX_TRANSPARENT_WINDOW horizontal"); + // detail wall is stronger than window, cuts a hole in the window, so window + // tjuncs with itself + CHECK( has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_DETAIL_WALL)); + // solid cuts a hole in the window + CHECK( has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_SOLID)); + CHECK( has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_SOLID_DETAIL)); + // translucent window and translucent water weld + CHECK( has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_TRANSPARENT_WATER)); CHECK(!has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_OPAQUE_WATER)); CHECK(!has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_OPAQUE_MIST)); CHECK( has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_TRANSPARENT_WINDOW)); + // note, aux is lower priority than window, so bottom face of aux gets cut away CHECK(!has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_OPAQUE_AUX)); - CHECK(!has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_SKY)); + // sky cuts hole in window + CHECK( has_tjunc(INDEX_TRANSPARENT_WINDOW, INDEX_SKY)); } { - INFO("INDEX_OPAQUE_AUX horizontal - same as INDEX_SOLID"); - CHECK(!has_tjunc(INDEX_OPAQUE_AUX, INDEX_DETAIL_WALL)); + INFO("INDEX_OPAQUE_AUX horizontal"); + // detail_wall is higher priority, cuts a hole in aux, which welds with itself + CHECK( has_tjunc(INDEX_OPAQUE_AUX, INDEX_DETAIL_WALL)); CHECK( has_tjunc(INDEX_OPAQUE_AUX, INDEX_SOLID)); CHECK( has_tjunc(INDEX_OPAQUE_AUX, INDEX_SOLID_DETAIL)); CHECK(!has_tjunc(INDEX_OPAQUE_AUX, INDEX_TRANSPARENT_WATER)); CHECK( has_tjunc(INDEX_OPAQUE_AUX, INDEX_OPAQUE_WATER)); CHECK( has_tjunc(INDEX_OPAQUE_AUX, INDEX_OPAQUE_MIST)); - CHECK(!has_tjunc(INDEX_OPAQUE_AUX, INDEX_TRANSPARENT_WINDOW)); + // window is stronger, cuts a hole which causes aux to weld + CHECK( has_tjunc(INDEX_OPAQUE_AUX, INDEX_TRANSPARENT_WINDOW)); CHECK( has_tjunc(INDEX_OPAQUE_AUX, INDEX_OPAQUE_AUX)); CHECK( has_tjunc(INDEX_OPAQUE_AUX, INDEX_SKY)); }