From 22df4688eb307b6ccec60303b06b54ce23f048a6 Mon Sep 17 00:00:00 2001 From: Matthew Mott Date: Sun, 29 Jul 2018 18:11:33 +0100 Subject: [PATCH] Initial manual section on creating brushes --- doc/manual.adoc | 43 +++++++++++++++++++++++++++++++++++++++++++ doc/manual.css | 4 ++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/doc/manual.adoc b/doc/manual.adoc index 447cc895e6..1ccce19f67 100644 --- a/doc/manual.adoc +++ b/doc/manual.adoc @@ -229,3 +229,46 @@ patches can also be resized. |*Left drag* _inside_ a selected object|Move the selected object |*Left drag* _outside_ a selected object|Resize the object (if available) |=== + +=== Working with brushes + +Brushes are the basic building blocks of all maps. Typically they are used for +coarse-grained level geometry such as walls, ceiling and floors. Brushes also +have a vital role in sealing a map from the void: even a map built entirely from +patches and static meshes must still be surrounded by brushes in order to avoid +leaking. + +[sidebar] +.Additive versus subtractive geometry +-- +If you are used to mapping for the legacy Thief games using Dromed or T3Edit, +the system used by DarkRadiant may seem somewhat back-to-front. In previous +games, the world starts out as an infinite solid, in which you "carve out" rooms +using subtractive brushes. In DarkRadiant, the world starts out as an infinite +void, and all brushes are solid. The space in which the mission happens must be +fully enclosed by solid brushes, otherwise the map will "leak" and fail to +compile. + +The need to deal with map leaks may at first seem like a burden, however the +exclusive use of solid brushes frees the engine from needing to worry about +"brush ordering", and allows an important performance optimisation: by "flood +filling" the map interior, the map compiler can efficiently discard geometry +that never needs to be rendered. +-- + +==== Creating a brush + +To create a simple rectangular brush, ensure that nothing is selected (*ESC*), +then *Left drag* in the 2D view. A new brush will be created and sized according +to the dragged area, with its dimensions snapped to the current grid level. To +adjust the third dimension of the brush (perpendicular to the view direction), +used *Ctrl + TAB* to switch the 2D view axis, and *Left drag* outside the brush +boundary to adjust the size. + +TIP: Whenever you drag to create a new brush, the third dimension will match the +size of the _most recently selected_ brush. This makes it easy to draw a series +of brushes with the same height, such as when you need to create a series of +floors or walls in succession. To match the height of an existing brush, simply +select (*Shift + Left click*) and deselect it (*ESC*) before drawing the new +brush. + diff --git a/doc/manual.css b/doc/manual.css index 4ad0b87c45..3ec370fd9b 100644 --- a/doc/manual.css +++ b/doc/manual.css @@ -174,7 +174,7 @@ body.toc2.toc-right{padding-left:0;padding-right:20em}} .sect1{padding-bottom:.625em} @media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}} .sect1+.sect1{border-top:1px solid #efefed} -#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} +#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:left;font-weight:400} #content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} @@ -196,7 +196,7 @@ table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inh .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px} .sidebarblock>:first-child{margin-top:0} .sidebarblock>:last-child{margin-bottom:0} -.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} +.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:left;font-size:1em;font-weight:bold;} .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8} .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}