diff --git a/light/phong.cc b/light/phong.cc index 0456ba3a..4b4ef5de 100644 --- a/light/phong.cc +++ b/light/phong.cc @@ -440,11 +440,19 @@ CalcualateVertexNormals(const mbsp_t *bsp) for (int i = 0; i < bsp->numfaces; i++) { const bsp2_dface_t *f = BSP_GetFace(const_cast(bsp), i); + const auto f_points = GLM_FacePoints(bsp, f); const qvec3f f_norm = Face_Normal_E(bsp, f); + const qplane3f f_plane = Face_Plane_E(bsp, f); // any face normal within this many degrees can be smoothed with this face - const int f_smoothangle = (extended_texinfo_flags[f->texinfo] & TEX_PHONG_ANGLE_MASK) >> TEX_PHONG_ANGLE_SHIFT; - if (!f_smoothangle) + const int f_phong_angle = (extended_texinfo_flags[f->texinfo] & TEX_PHONG_ANGLE_MASK) >> TEX_PHONG_ANGLE_SHIFT; + int f_phong_angle_concave = (extended_texinfo_flags[f->texinfo] & TEX_PHONG_ANGLE_CONCAVE_MASK) >> TEX_PHONG_ANGLE_CONCAVE_SHIFT; + if (f_phong_angle_concave == 0) { + f_phong_angle_concave = f_phong_angle; + } + const bool f_wants_phong = (f_phong_angle || f_phong_angle_concave); + + if (!f_wants_phong) continue; for (int j = 0; j < f->numedges; j++) { @@ -454,15 +462,29 @@ CalcualateVertexNormals(const mbsp_t *bsp) if (f2 == f) continue; - const int f2_smoothangle = (extended_texinfo_flags[f2->texinfo] & TEX_PHONG_ANGLE_MASK) >> TEX_PHONG_ANGLE_SHIFT; - if (!f2_smoothangle) + // FIXME: factor out and share with above? + const int f2_phong_angle = (extended_texinfo_flags[f2->texinfo] & TEX_PHONG_ANGLE_MASK) >> TEX_PHONG_ANGLE_SHIFT; + int f2_phong_angle_concave = (extended_texinfo_flags[f2->texinfo] & TEX_PHONG_ANGLE_CONCAVE_MASK) >> TEX_PHONG_ANGLE_CONCAVE_SHIFT; + if (f2_phong_angle_concave == 0) { + f2_phong_angle_concave = f2_phong_angle; + } + const bool f2_wants_phong = (f2_phong_angle || f2_phong_angle_concave); + + if (!f2_wants_phong) continue; + const auto f2_points = GLM_FacePoints(bsp, f2); + const qvec3f f2_centroid = GLM_PolyCentroid(f2_points); const qvec3f f2_norm = Face_Normal_E(bsp, f2); - - const vec_t cosangle = qv::dot(f_norm, f2_norm); - const vec_t cosmaxangle = cos(DEG2RAD(qmin(f_smoothangle, f2_smoothangle))); + const vec_t cosangle = qv::dot(f_norm, f2_norm); + + const bool concave = f_plane.distAbove(f2_centroid) > 0.1; + const vec_t f_threshold = concave ? f_phong_angle_concave : f_phong_angle; + const vec_t f2_threshold = concave ? f2_phong_angle_concave : f2_phong_angle; + const vec_t min_threshold = qmin(f_threshold, f2_threshold); + const vec_t cosmaxangle = cos(DEG2RAD(min_threshold)); + // check the angle between the face normals if (cosangle >= cosmaxangle) { smoothFaces[f].insert(f2); diff --git a/testmaps/phongtest.map b/testmaps/phongtest.map index 1b45bd8a..6d320dc2 100644 --- a/testmaps/phongtest.map +++ b/testmaps/phongtest.map @@ -36,6 +36,15 @@ ( -448 -1472 1984 ) ( -448 -1600 1984 ) ( -576 -1472 1984 ) sbox_side 0 0 0 1 1 ( -576 -1600 1856 ) ( -448 -1600 1856 ) ( -576 -1472 1856 ) sbox_side 0 0 0 1 1 } +// brush 3 +{ +( 352 -912 1936 ) ( 352 -912 1920 ) ( 352 -1360 1936 ) brownstone2 32 -32 -0 1 1 +( 96 -1360 1920 ) ( 96 -912 1920 ) ( 96 -1360 1936 ) brownstone2 32 -32 -0 1 1 +( 592 -576 1936 ) ( -0 -576 1936 ) ( 592 -576 1920 ) brownstone2 -16 -32 -0 1 1 +( -0 -1152 1920 ) ( -0 -1152 1936 ) ( 592 -1152 1920 ) brownstone2 -16 -32 -0 1 1 +( 592 -912 1936 ) ( 592 -1360 1936 ) ( -0 -912 1936 ) brownstone2 -16 -32 -0 1 1 +( -0 -1360 1920 ) ( 592 -1360 1920 ) ( -0 -912 1920 ) brownstone2 -16 -32 -0 1 1 +} } // entity 1 { @@ -999,41 +1008,210 @@ "_phong" "1" // brush 0 { -( -408 -1392 1981 ) ( -408 -1397 1976 ) ( -384 -1397 1952 ) shuttle1 32 25.375 90 1 -2 ( -408 -1392 1987 ) ( -384 -1392 1963 ) ( -384 -1397 1968 ) shuttle1 -31.9996 22.625 90 1 -2 -( -384 -1392 1957 ) ( -384 -1392 1963 ) ( -408 -1392 1987 ) shuttle1 16 16 270 1 1 -( -384 -1403 1952 ) ( -408 -1403 1976 ) ( -408 -1408 1981 ) shuttle1 -31.9996 25.3749 90 1 -2 ( -408 -1408 1987 ) ( -408 -1403 1992 ) ( -384 -1403 1968 ) shuttle1 32 22.625 90 1 -2 -( -384 -1408 1957 ) ( -408 -1408 1981 ) ( -408 -1408 1987 ) shuttle1 16 16 270 1 1 +( -384 -1403 1968 ) ( -408 -1403 1992 ) ( -408 -1397 1992 ) shuttle1 32 16 90 1 -1 +( -408 -1392 1981 ) ( -408 -1397 1976 ) ( -384 -1397 1952 ) shuttle1 32 25.375 90 1 -2 +( -384 -1403 1952 ) ( -408 -1403 1976 ) ( -408 -1408 1981 ) shuttle1 -31.9996 25.3749 90 1 -2 ( -408 -1397 1976 ) ( -408 -1403 1976 ) ( -384 -1403 1952 ) shuttle1 32 16 90 1 -1 ( -408 -1397 1992 ) ( -408 -1403 1992 ) ( -408 -1408 1987 ) shuttle1 15.9991 -16 270 1 -1 -( -384 -1403 1968 ) ( -408 -1403 1992 ) ( -408 -1397 1992 ) shuttle1 32 16 90 1 -1 +( -384 -1392 1957 ) ( -384 -1392 1963 ) ( -408 -1392 1987 ) shuttle1 16 16 270 1 1 +( -384 -1408 1957 ) ( -408 -1408 1981 ) ( -408 -1408 1987 ) shuttle1 16 16 270 1 1 ( -384 -1400 1968 ) ( -392 -1264 1968 ) ( -392 -1392 1968 ) shuttle1 32 16 90 1 -1 } // brush 1 { +( -408 -1397 1976 ) ( -408 -1392 1987 ) ( -408 -1392 1981 ) shuttle1 15.9991 -16 270 1 -1 +( -696 -1397 1976 ) ( -696 -1408 1981 ) ( -696 -1403 1976 ) shuttle1 15.9991 -16 270 1 -1 ( -520 -1397 1992 ) ( -504 -1392 1987 ) ( -504 -1397 1992 ) shuttle1 -31.9996 32 90 1 -1 ( -520 -1397 1976 ) ( -504 -1392 1981 ) ( -520 -1392 1981 ) shuttle1 32 32 90 1 -1 ( -520 -1392 1981 ) ( -504 -1392 1987 ) ( -520 -1392 1987 ) shuttle1 16 32 270 1 1 ( -520 -1408 1987 ) ( -504 -1403 1992 ) ( -504 -1408 1987 ) shuttle1 32 32 90 1 -1 ( -504 -1403 1976 ) ( -520 -1408 1981 ) ( -504 -1408 1981 ) shuttle1 -31.9996 32 90 1 -1 ( -520 -1408 1987 ) ( -504 -1408 1981 ) ( -520 -1408 1981 ) shuttle1 16 32 270 1 1 -( -696 -1397 1976 ) ( -696 -1408 1981 ) ( -696 -1403 1976 ) shuttle1 15.9991 -16 270 1 -1 -( -408 -1397 1976 ) ( -408 -1392 1987 ) ( -408 -1392 1981 ) shuttle1 15.9991 -16 270 1 -1 ( -520 -1397 1992 ) ( -504 -1403 1992 ) ( -520 -1403 1992 ) shuttle1 32 32 90 1 -1 ( -520 -1397 1976 ) ( -504 -1403 1976 ) ( -504 -1397 1976 ) shuttle1 32 32 90 1 -1 } // brush 2 { -( -400 -1397 1856 ) ( -395 -1392 1872 ) ( -400 -1397 1872 ) shuttle1 21.0007 40 -0 1 1 ( -389 -1392 1856 ) ( -384 -1397 1872 ) ( -389 -1392 1872 ) shuttle1 -5 39.9995 180 1 -1 -( -389 -1392 1856 ) ( -395 -1392 1872 ) ( -395 -1392 1856 ) shuttle1 -16 40 -0 1 1 -( -395 -1408 1872 ) ( -400 -1403 1856 ) ( -400 -1403 1872 ) shuttle1 -27 39.9995 180 1 -1 ( -389 -1408 1856 ) ( -384 -1403 1872 ) ( -384 -1403 1856 ) shuttle1 43.0007 40 -0 1 1 -( -389 -1408 1856 ) ( -395 -1408 1872 ) ( -389 -1408 1872 ) shuttle1 -16 40 -0 1 1 -( -400 -1397 1856 ) ( -400 -1403 1872 ) ( -400 -1403 1856 ) shuttle1 -40.0004 39.9995 180 1 -1 ( -384 -1403 1856 ) ( -384 -1397 1872 ) ( -384 -1397 1856 ) shuttle1 -40.0004 39.9995 180 1 -1 +( -400 -1397 1856 ) ( -395 -1392 1872 ) ( -400 -1397 1872 ) shuttle1 21.0007 40 -0 1 1 +( -395 -1408 1872 ) ( -400 -1403 1856 ) ( -400 -1403 1872 ) shuttle1 -27 39.9995 180 1 -1 +( -400 -1397 1856 ) ( -400 -1403 1872 ) ( -400 -1403 1856 ) shuttle1 -40.0004 39.9995 180 1 -1 +( -389 -1392 1856 ) ( -395 -1392 1872 ) ( -395 -1392 1856 ) shuttle1 -16 40 -0 1 1 +( -389 -1408 1856 ) ( -395 -1408 1872 ) ( -389 -1408 1872 ) shuttle1 -16 40 -0 1 1 ( -389 -1408 1968 ) ( -384 -1397 1968 ) ( -384 -1403 1968 ) shuttle1 -39.9995 -0 270 1 -1 ( -389 -1408 1856 ) ( -400 -1403 1856 ) ( -395 -1408 1856 ) shuttle1 -39.9995 -0 270 1 -1 } } +// entity 21 +{ +"classname" "func_detail" +"_phong" "1" +"_phong_angle_concave" "1" +// brush 0 +{ +( 192 -752 2064 ) ( 256 -752 1984 ) ( 288 -752 2064 ) brownstone2 -0 -0 -0 1 1 +( 256 -752 1984 ) ( 192 -752 1984 ) ( 192 -816 1984 ) brownstone2 -0 -32 -0 1 -1 +( 192 -752 2064 ) ( 288 -752 2064 ) ( 192 -848 2064 ) brownstone2 -0 -32 -0 1 -1 +( 288 -752 2064 ) ( 192 -816 1984 ) ( 192 -848 2064 ) brownstone2 60.6897 -0 180 1 -1 +( 192 -816 1984 ) ( 192 -752 2064 ) ( 192 -848 2064 ) brownstone2 32 -0 180 1 -1 +} +// brush 1 +{ +( 192 -800 2064 ) ( 288 -656 2064 ) ( 288 -800 2064 ) brownstone2 -16 -0 -0 1 -1 +( 192 -768 1984 ) ( 192 -656 2064 ) ( 192 -800 2064 ) brownstone2 -0 16 180 1 -1 +( 288 -656 2064 ) ( 192 -656 1984 ) ( 256 -656 1984 ) brownstone2 -16 16 -0 1 1 +( 288 -800 2064 ) ( 256 -656 1984 ) ( 256 -768 1984 ) brownstone2 -0 16 180 1 -1 +( 256 -656 1984 ) ( 192 -768 1984 ) ( 256 -768 1984 ) brownstone2 -16 -0 -0 1 -1 +( 288 -752 2064 ) ( 240 -752 2064 ) ( 240 -752 2192 ) brownstone2 -16 16 -0 1 1 +} +// brush 2 +{ +( 192 -848 2064 ) ( 96 -752 2064 ) ( 192 -752 2064 ) brownstone2 16 48 270 1 -1 +( 96 -848 2064 ) ( 96 -752 1984 ) ( 96 -752 2064 ) brownstone2 16 16 180 1 -1 +( 192 -848 2064 ) ( 96 -816 1984 ) ( 96 -848 2064 ) brownstone2 -48 16 180 1 -1 +( 192 -816 1984 ) ( 192 -752 2064 ) ( 192 -752 1984 ) brownstone2 16 16 180 1 -1 +( 192 -752 2064 ) ( 96 -752 1984 ) ( 192 -752 1984 ) brownstone2 -48 16 180 1 -1 +( 96 -752 1984 ) ( 192 -816 1984 ) ( 192 -752 1984 ) brownstone2 16 48 270 1 -1 +} +// brush 3 +{ +( 192 -768 1984 ) ( 256 -752 1984 ) ( 192 -816 1984 ) brownstone2 -0 -32 -0 1 -1 +( 192 -816 1984 ) ( 256 -752 1984 ) ( 288 -752 1936 ) brownstone2 48 -48 -0 1 -1 +( 288 -752 1936 ) ( 192 -768 1936 ) ( 192 -848 1936 ) brownstone2 -0 -32 -0 1 -1 +( 192 -848 1936 ) ( 192 -768 1936 ) ( 192 -768 1984 ) brownstone2 32 -0 180 1 -1 +( 192 -768 1984 ) ( 192 -768 1936 ) ( 256 -752 1984 ) brownstone2 -0 -0 -0 1 1 +( 256 -752 1984 ) ( 192 -768 1936 ) ( 288 -752 1936 ) brownstone2 -0 -0 -0 1 1 +} +// brush 4 +{ +( 192 -656 1936 ) ( 192 -656 1984 ) ( 192 -752 1984 ) brownstone2 -0 16 180 1 1 +( 256 -752 1984 ) ( 288 -752 1936 ) ( 192 -752 1936 ) brownstone2 -16 -0 -0 1 -1 +( 192 -752 1936 ) ( 288 -752 1936 ) ( 288 -656 1936 ) brownstone2 -16 -0 -0 1 -1 +( 288 -656 1936 ) ( 256 -656 1984 ) ( 192 -656 1984 ) brownstone2 -16 16 -0 1 -1 +( 192 -656 1984 ) ( 256 -656 1984 ) ( 256 -752 1984 ) brownstone2 -16 -0 -0 1 -1 +( 256 -752 1984 ) ( 256 -656 1984 ) ( 288 -656 1936 ) brownstone2 48 48 -0 1 1 +} +// brush 5 +{ +( 96 -816 1984 ) ( 96 -752 1984 ) ( 192 -752 1984 ) brownstone2 16 48 270 1 -1 +( 192 -816 1984 ) ( 192 -848 1936 ) ( 96 -848 1936 ) brownstone2 -0 -0 270 1 1 +( 192 -752 1984 ) ( 192 -752 1936 ) ( 192 -848 1936 ) brownstone2 16 16 180 1 1 +( 96 -752 1984 ) ( 96 -752 1936 ) ( 192 -752 1936 ) brownstone2 -48 16 180 1 1 +( 192 -752 1936 ) ( 96 -752 1936 ) ( 96 -848 1936 ) brownstone2 16 48 270 1 -1 +( 96 -848 1936 ) ( 96 -752 1936 ) ( 96 -752 1984 ) brownstone2 16 -0 180 1 1 +} +// brush 6 +{ +( 96 -896 2144 ) ( 96 -752 2144 ) ( 192 -752 2144 ) brownstone2 16 48 270 1 -1 +( 96 -848 2064 ) ( 96 -896 2144 ) ( 192 -896 2144 ) brownstone2 -48 -16 180 1 1 +( 192 -896 2144 ) ( 192 -752 2144 ) ( 192 -752 2064 ) brownstone2 16 -16 180 1 1 +( 96 -848 2064 ) ( 96 -752 2064 ) ( 96 -752 2144 ) brownstone2 16 -16 180 1 1 +( 96 -752 2144 ) ( 96 -752 2064 ) ( 192 -752 2064 ) brownstone2 -48 -16 180 1 1 +( 192 -752 2064 ) ( 96 -752 2064 ) ( 96 -848 2064 ) brownstone2 16 48 270 1 -1 +} +// brush 7 +{ +( 192 -752 2064 ) ( 192 -848 2064 ) ( 288 -752 2064 ) brownstone2 -0 -32 -0 1 -1 +( 192 -752 2144 ) ( 192 -896 2144 ) ( 192 -848 2064 ) brownstone2 32 32 180 1 1 +( 192 -752 2144 ) ( 336 -752 2144 ) ( 192 -896 2144 ) brownstone2 -0 -32 -0 1 -1 +( 192 -896 2144 ) ( 336 -752 2144 ) ( 288 -752 2064 ) brownstone2 -1.5094 32 180 1 1 +( 288 -752 2064 ) ( 336 -752 2144 ) ( 192 -752 2144 ) brownstone2 -0 32 -0 1 -1 +} +// brush 8 +{ +( 288 -752 2064 ) ( 336 -752 2144 ) ( 336 -656 2144 ) brownstone2 -0 -16 180 1 1 +( 192 -752 2064 ) ( 288 -752 2064 ) ( 288 -656 2064 ) brownstone2 -16 -0 -0 1 -1 +( 192 -752 2064 ) ( 192 -752 2144 ) ( 336 -752 2144 ) brownstone2 -16 -16 -0 1 -1 +( 336 -656 2144 ) ( 192 -656 2144 ) ( 192 -656 2064 ) brownstone2 -16 -16 -0 1 -1 +( 192 -656 2064 ) ( 192 -656 2144 ) ( 192 -752 2144 ) brownstone2 -0 -16 180 1 1 +( 192 -752 2144 ) ( 192 -656 2144 ) ( 336 -656 2144 ) brownstone2 -16 -0 -0 1 -1 +} +} +// entity 22 +{ +"classname" "func_detail" +"_phong" "1" +// brush 0 +{ +( 192 -1008 2064 ) ( 288 -1008 2064 ) ( 288 -1152 2064 ) brownstone2 -16 -16 -0 1 1 +( 192 -1040 1984 ) ( 192 -1008 2064 ) ( 192 -1152 2064 ) brownstone2 16 16 -0 1 1 +( 288 -1152 2064 ) ( 256 -1152 1984 ) ( 192 -1152 1984 ) brownstone2 -16 16 -0 1 1 +( 288 -1008 2064 ) ( 256 -1040 1984 ) ( 256 -1152 1984 ) brownstone2 16 16 -0 1 1 +( 256 -1152 1984 ) ( 256 -1040 1984 ) ( 192 -1040 1984 ) brownstone2 -16 -16 -0 1 1 +( 288 -1056 2064 ) ( 240 -1056 2192 ) ( 240 -1056 2064 ) brownstone2 -16 16 -0 1 1 +} +// brush 1 +{ +( 192 -1056 2064 ) ( 288 -1056 2064 ) ( 256 -1056 1984 ) brownstone2 -0 -0 -0 1 1 +( 256 -1056 1984 ) ( 192 -992 1984 ) ( 192 -1056 1984 ) brownstone2 -0 -47.9999 -0 1 1 +( 192 -1056 2064 ) ( 192 -960 2064 ) ( 288 -1056 2064 ) brownstone2 -0 -48 -0 1 1 +( 288 -1056 2064 ) ( 192 -960 2064 ) ( 192 -992 1984 ) brownstone2 12.6897 -0 -0 1 1 +( 192 -992 1984 ) ( 192 -960 2064 ) ( 192 -1056 2064 ) brownstone2 48 -0 -0 1 1 +} +// brush 2 +{ +( 192 -960 2064 ) ( 192 -1056 2064 ) ( 96 -1056 2064 ) brownstone2 32 48 90 1 1 +( 96 -960 2064 ) ( 96 -1056 2064 ) ( 96 -1056 1984 ) brownstone2 32 16 -0 1 1 +( 192 -960 2064 ) ( 96 -960 2064 ) ( 96 -992 1984 ) brownstone2 -48 16 180 1 -1 +( 192 -992 1984 ) ( 192 -1056 1984 ) ( 192 -1056 2064 ) brownstone2 32 16 -0 1 1 +( 192 -1056 2064 ) ( 192 -1056 1984 ) ( 96 -1056 1984 ) brownstone2 -48 16 180 1 -1 +( 96 -1056 1984 ) ( 192 -1056 1984 ) ( 192 -992 1984 ) brownstone2 32 48 90 1 1 +} +// brush 3 +{ +( 288 -1152 1936 ) ( 192 -1152 1936 ) ( 192 -1152 1984 ) brownstone2 -16 16 -0 1 -1 +( 192 -1056 1936 ) ( 192 -1056 1984 ) ( 192 -1152 1984 ) brownstone2 16 16 -0 1 -1 +( 288 -1056 1936 ) ( 192 -1056 1936 ) ( 192 -1152 1936 ) brownstone2 -16 -16 -0 1 1 +( 288 -1056 1936 ) ( 256 -1056 1984 ) ( 192 -1056 1984 ) brownstone2 -16 -0 -0 1 -1 +( 192 -1056 1984 ) ( 256 -1056 1984 ) ( 256 -1152 1984 ) brownstone2 -16 -16 -0 1 1 +( 256 -1152 1984 ) ( 256 -1056 1984 ) ( 288 -1056 1936 ) brownstone2 -0 -16 -0 1 -1 +} +// brush 4 +{ +( 288 -1056 1936 ) ( 256 -1056 1984 ) ( 192 -992 1984 ) brownstone2 32 16 -0 1 1 +( 192 -992 1984 ) ( 256 -1056 1984 ) ( 192 -1040 1984 ) brownstone2 -0 -48.0001 -0 1 1 +( 192 -960 1936 ) ( 192 -1040 1936 ) ( 288 -1056 1936 ) brownstone2 -0 -48 -0 1 1 +( 288 -1056 1936 ) ( 192 -1040 1936 ) ( 256 -1056 1984 ) brownstone2 -0 -0 -0 1 1 +( 256 -1056 1984 ) ( 192 -1040 1936 ) ( 192 -1040 1984 ) brownstone2 -0 -0 -0 1 1 +( 192 -1040 1984 ) ( 192 -1040 1936 ) ( 192 -960 1936 ) brownstone2 48 -0 -0 1 1 +} +// brush 5 +{ +( 192 -1056 1936 ) ( 96 -1056 1936 ) ( 96 -1056 1984 ) brownstone2 -48 16 180 1 1 +( 192 -1056 1984 ) ( 96 -1056 1984 ) ( 96 -992 1984 ) brownstone2 32 48 90 1 1 +( 192 -992 1984 ) ( 192 -960 1936 ) ( 192 -1056 1936 ) brownstone2 32 16 -0 1 -1 +( 96 -992 1984 ) ( 96 -960 1936 ) ( 192 -960 1936 ) brownstone2 -0 -0 90 1 -1 +( 192 -960 1936 ) ( 96 -960 1936 ) ( 96 -1056 1936 ) brownstone2 32 48 90 1 1 +( 96 -1056 1936 ) ( 96 -960 1936 ) ( 96 -992 1984 ) brownstone2 32 -0 -0 1 -1 +} +// brush 6 +{ +( 192 -1056 2064 ) ( 288 -1056 2064 ) ( 192 -960 2064 ) brownstone2 -0 -48 -0 1 1 +( 192 -1056 2144 ) ( 192 -960 2064 ) ( 192 -912 2144 ) brownstone2 48 32 -0 1 -1 +( 192 -1056 2144 ) ( 192 -912 2144 ) ( 336 -1056 2144 ) brownstone2 -0 -48 -0 1 1 +( 192 -912 2144 ) ( 288 -1056 2064 ) ( 336 -1056 2144 ) brownstone2 14.4906 32 -0 1 -1 +( 288 -1056 2064 ) ( 192 -1056 2144 ) ( 336 -1056 2144 ) brownstone2 -0 32 -0 1 -1 +} +// brush 7 +{ +( 96 -912 2144 ) ( 192 -1056 2144 ) ( 96 -1056 2144 ) brownstone2 32 48 90 1 1 +( 96 -960 2064 ) ( 192 -912 2144 ) ( 96 -912 2144 ) brownstone2 -48 -16 180 1 1 +( 192 -912 2144 ) ( 192 -1056 2064 ) ( 192 -1056 2144 ) brownstone2 32 -16 -0 1 -1 +( 96 -960 2064 ) ( 96 -1056 2144 ) ( 96 -1056 2064 ) brownstone2 32 -16 -0 1 -1 +( 96 -1056 2144 ) ( 192 -1056 2064 ) ( 96 -1056 2064 ) brownstone2 -48 -16 180 1 1 +( 192 -1056 2064 ) ( 96 -960 2064 ) ( 96 -1056 2064 ) brownstone2 32 48 90 1 1 +} +// brush 8 +{ +( 288 -1056 2064 ) ( 336 -1152 2144 ) ( 336 -1056 2144 ) brownstone2 16 -16 -0 1 -1 +( 192 -1056 2064 ) ( 288 -1152 2064 ) ( 288 -1056 2064 ) brownstone2 -16 -16 -0 1 1 +( 192 -1056 2064 ) ( 336 -1056 2144 ) ( 192 -1056 2144 ) brownstone2 -16 -16 -0 1 -1 +( 336 -1152 2144 ) ( 192 -1152 2064 ) ( 192 -1152 2144 ) brownstone2 -16 -16 -0 1 -1 +( 192 -1152 2064 ) ( 192 -1056 2144 ) ( 192 -1152 2144 ) brownstone2 16 -16 -0 1 -1 +( 192 -1056 2144 ) ( 336 -1152 2144 ) ( 192 -1152 2144 ) brownstone2 -16 -16 -0 1 1 +} +}