Advanced Brushwork


(shazmax) #1

Anyone know of any decent tutorials on advanced brushwork for buildings, architectural procedures, etc. I’m trying to keep away from simple patch mesh editing tutorials, just mainly tutorials on some good clean decent brushwork.

Sure anyone can make a building and such - but I’m looking for something that has a decent way to create buildings and such keeping performance and design in mind.

Buildings from great architectural designs to adobe huts from ancient civilization. Simple patch mesh editing is nice, but if you can do it with some great brushwork or know a site where I can find something in the likes, let me know.

:clap:


(shazmax) #2

The all important curve is an essential in design in any means. In gtkradiant it would be nice to have a refined geometrical curve without the added taxing on the performance. Would be nice if someone could post up the difference in performance hits between patch meshing and brush work.

Here’s some examples of the closest I can come to a decent curve with just brushwork.

Shape format:

Transposed:

Angled:


(sock) #3

The problem with patches/curves is the poping/LOD affect as the mapper has very little control over when it will happen. A classic example for me is the tunnel road in fueldump. The raised road surface in the middle area is a patch, which if you set “low geometry detail” on the game menu will reveal a HOM effect below. Ideally something like that should have been converted to a ASE file.

One other solution is to create the shape you need from a patch/curve with the correct texture alignment. Convert it to a ASE file and then de-compilie it back to brushwork. This will often keep the texture alignment and also create the relevant brushwork for you. Plus the LOD problem is no longer relevant as the final architecture is brushwork again.

The second big problem with patches/curves is that you cannot easily create damaged/broken architecture easily. It may be fine for brand new shiny archways and gothic style doorways but smashed up war torn buildings are not brand new.

This problem was really apparent when creating the old city in the map Oasis as the angles and shapes needed to create smooth mud bricks structures which need to be old and abandoned was not easily possible with patches. The best solution was brush sheared corners and phong shading.

The example diagram above is something I often use as a base for creating brushwork curve shapes or scaling. Why these measurements I hear you ask, well each segment can easily be subdivided (grey lines) and also scaled from a origin point very easy. Plus all the points are on the grid. The numbers in each brush is the texture angle the blue numbers is the stretch factor.

When something like this is coupled with phong shading you can create very low poly controlled architecture and still have the ability to cut the shapes to represent damage. Plus the editor also supports brush shearing in the 3D window so you can easily bend this brushwork inwards or outwards to create funnel/sphere shapes. This was done alot in the old city in the map Oasis, where the tunnels were curved upwards to give the impression of more vertical space and the outside areas had overhangs on the ledges above. This allowed for players on the ground to have more cover from fire above.

Sock
:moo:


(Shallow) #4

EDIT: I should always check whether people have posted in the meantime when taking a long time to compose a response :slight_smile:

You can get the shape you have there with less faces on the outside (didn’t bother building the back walls).

Also, if you’re building this in a situation where you didn’t need to see both sides of the wall you could leave the unseen brush faces axial to reduce the number of unique planes.

Another alternative would be to build in patches, compile those bits with a low -patchmeta and convert to ASE.

Here’s a couple of tutorials by Speedy that I think you will find useful:
http://www.planetquake.com/speedy/tut_dome.htm
http://www.planetquake.com/speedy/tut_pipe.htm

I played with using brushes as curves quite a bit in various Q3 test maps, it’s quite a good technique to use provided you are sensible. Obviously, patch meshes are treated as tri-strips by the engine so they render faster than an equivalent number of brush-generated drawsurfs, so if you’re making excessively smooth curves from brushes you are probably hurting performance (Or at least that used to be the case - I suspect -meta compiles may have narrowed the gap quite a bit actually). Slicing an 8-unit wedge off a corner and applying a phong shader is preferable to sticking a bevel patch that small on there.

Another thing I’ve found is that excessive geometrical precision simply isn’t worth the hassle - approximate the shapes you want on the highest grid setting you can get away with. It makes aligning things much easier and usually looks the same in game.


(shazmax) #5

“The best solution was brush sheared corners and phong shading.”

That’s exactly what I was looking for. Of all things I was trying to figure out your curves in the Oasis map and I was somewhat dumbfounded on the procedure that you took. I tried some shearing but wasn’t getting it right. I was looking at the curvature that you created on the Oasis axis starting spawnpoint and I could of copied it but no…had to figure it out. This helps a great deal. I’m only puzzled by the measurements and how you got those. I didn’t even know you could measure stuff out on the shears and angles. It makes sense on why you did it…just curious on how you got the measurements. Is that based off the individual unit square on the grid or?


(sock) #6

The problem originally occured with the map Battery and the gun room. I needed to create a section of map which followed a circle with a circumference that would align to the grid at certain intervals. All segments of the room had to be on the grid so other sections could be added to the map over time. The person who often created a map did not often finish or detail a map so everything had to be organised so it was flexible for different people.

Sometimes a grand plan does not work out the way you want it and a simple system can be overlooked even when explained several times. In the case of Battery the circle system was not understood and alot of additional detail which could have used the system sadly did not. A classic example of this is the floor grills outside of the upper doorways to gun room and the crane over the gun itself.

The scale was created with a high grid setting inside of radiant and I just played with numbers until I found something which rougly looked like a circle. Each segment needed to be able to sub divide and everything had to fit to a grid. The numbers on my diagram above are to do with texture scaling and angles not radiant grid settings. Look at the circle segments and simply count the radiant squares for an idea of scale.

As the segments get further away from the (rough) central point the circumference will need to be subdivided again so that it does not look too blocky. The grey lines allow further details to be locked to the grid and show where addtional segments can be added to the circumference. If I get some time I will dig out the Battery circle example map I have which shows what I mean easier than my crap word explaination.

Once the circle system worked with Battery it was applied to the Axis garrision in Oasis and the old city. Map editing ultimately always breaks down into numbers and angles and alot of cool ways of creating cool brushwork is from a geometry books. One series of books which I have used alot is the wooden book series: http://www.walkerbooks.com/books/catalog.php?key=176

Sock
:moo:


(shazmax) #7

Ok cool - So you’re using a geometrical process. I might actually buy that book…looks like its a good low price! So I’m assuming that from there you can bevel your edge if you wanted to and rotate that around also.

I’m working on it…but its hard to work it in. I’ve sheared, manipulated vertices…etc. Gonna be a long night. I got the first and the last in but the middle ones are a pain in the neck, the bevels keep misaligning.
:stuck_out_tongue_winking_eye:


(sock) #8

The trick to brush shearing is preparation of the brush so that it is facing the right direction and not too complex. If you want brush shearing to be simply then try and orientate the brush so that it involves the minimal amount of brush shearing directions needed.

The image above shows the brush shape you have designed and how you want to span the gap using brush shearing. The first thing you need to do is create the angled version of your shape. Take the original brush, and cut it like the one in the top right. It does not matter about how big the brush is or if it fills the right space, its just the angle that is really important.

Starting with the first brush segment, copy the one in the top right of diagram and put the brush into position. Then brush shear on one face only into position. Put the cursor on the left hand side of the brush and shear upwards into position. Because the brush is angled already the shearing operation should only be necessary on one side of the brush and not produce any errors.

Once the new brush is into position, use the new brush as the next template as it will be quicker to create the circumference from one point to the other with something partly in place already. Once you reach the middle you can either mirror around the other segments or use the middle brush as the next template and carry on brush shearing.

Once you have finished you should have something like this:

Here is the map file:

// entity 0
{
"classname" "worldspawn"
// brush 0
{
( 64 -192 0 ) ( 0 -192 0 ) ( 0 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( 0 -256 64 ) ( 0 -192 64 ) ( 64 -192 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( 0 -256 8 ) ( 64 -256 8 ) ( 64 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( 64 -256 8 ) ( 64 -192 8 ) ( 64 -192 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( 64 -192 8 ) ( 0 -192 8 ) ( 0 -192 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( 0 -192 8 ) ( 0 -256 8 ) ( 0 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( 0 -208 64 ) ( 0 -192 48 ) ( 64 -208 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( 0 -256 48 ) ( 0 -240 64 ) ( 64 -256 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
}
// brush 1
{
( -96 -96 48 ) ( -96 -80 64 ) ( -32 -96 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -96 -48 64 ) ( -96 -32 48 ) ( -32 -48 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -32 -32 8 ) ( -96 -32 8 ) ( -96 -32 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -96 -96 8 ) ( -32 -96 8 ) ( -32 -96 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -96 -96 64 ) ( -96 -32 64 ) ( -32 -32 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -32 -32 0 ) ( -96 -32 0 ) ( -96 -96 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -32 -32 0 ) ( -40 -48 0 ) ( -32 -32 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -72 -48 0 ) ( -64 -32 0 ) ( -72 -48 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
}
// brush 2
{
( -128 -144 0 ) ( -136 -160 0 ) ( -128 -144 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -128 -144 0 ) ( -160 -208 0 ) ( -144 -224 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -152 -192 64 ) ( -136 -160 64 ) ( -120 -176 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -160 -208 0 ) ( -160 -208 48 ) ( -144 -224 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -128 -144 48 ) ( -128 -144 0 ) ( -112 -160 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -136 -160 64 ) ( -128 -144 48 ) ( -112 -160 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -160 -208 48 ) ( -152 -192 64 ) ( -136 -208 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -160 -136 0 ) ( -144 -128 0 ) ( -160 -136 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
}
// brush 3
{
( -192 -88 0 ) ( -176 -80 0 ) ( -192 -88 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -240 -112 48 ) ( -224 -104 64 ) ( -208 -136 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -192 -88 64 ) ( -176 -80 48 ) ( -160 -112 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -176 -80 48 ) ( -176 -80 0 ) ( -160 -112 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -240 -112 0 ) ( -240 -112 48 ) ( -224 -144 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -224 -104 64 ) ( -192 -88 64 ) ( -176 -120 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -176 -80 0 ) ( -240 -112 0 ) ( -224 -144 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -160 -112 0 ) ( -176 -120 0 ) ( -160 -112 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
}
// brush 4
{
( -184 -64 0 ) ( -200 -72 0 ) ( -184 -64 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -192 -32 0 ) ( -256 -64 0 ) ( -248 -96 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -240 -56 64 ) ( -208 -40 64 ) ( -200 -72 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -256 -64 0 ) ( -256 -64 48 ) ( -248 -96 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -192 -32 48 ) ( -192 -32 0 ) ( -184 -64 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -208 -40 64 ) ( -192 -32 48 ) ( -184 -64 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -256 -64 48 ) ( -240 -56 64 ) ( -232 -88 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -208 -40 0 ) ( -192 -32 0 ) ( -208 -40 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
}
// brush 5
{
( -256 64 48 ) ( -240 64 64 ) ( -256 0 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -208 64 64 ) ( -192 64 48 ) ( -208 0 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -200 64 8 ) ( -264 64 8 ) ( -264 64 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -192 0 8 ) ( -192 64 8 ) ( -192 64 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -256 0 8 ) ( -192 0 8 ) ( -192 0 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -256 64 8 ) ( -256 0 8 ) ( -256 0 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -256 64 64 ) ( -192 64 64 ) ( -192 0 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -192 0 0 ) ( -192 64 0 ) ( -256 64 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
}
// brush 6
{
( -96 -248 48 ) ( -88 -232 64 ) ( -56 -240 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -72 -200 64 ) ( -64 -184 48 ) ( -32 -192 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -64 -184 48 ) ( -64 -184 0 ) ( -32 -192 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -96 -248 0 ) ( -96 -248 48 ) ( -64 -256 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -88 -232 64 ) ( -72 -200 64 ) ( -40 -208 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -64 -184 0 ) ( -96 -248 0 ) ( -64 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -32 -192 0 ) ( -40 -208 0 ) ( -32 -192 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -72 -200 0 ) ( -64 -184 0 ) ( -72 -200 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
}
// brush 7
{
( -120 -176 0 ) ( -112 -160 0 ) ( -120 -176 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -80 -176 0 ) ( -88 -192 0 ) ( -80 -176 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -112 -160 0 ) ( -144 -224 0 ) ( -112 -240 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -136 -208 64 ) ( -120 -176 64 ) ( -88 -192 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -144 -224 0 ) ( -144 -224 48 ) ( -112 -240 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -112 -160 48 ) ( -112 -160 0 ) ( -80 -176 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -120 -176 64 ) ( -112 -160 48 ) ( -80 -176 48 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
( -144 -224 48 ) ( -136 -208 64 ) ( -104 -224 64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0
}
}

Sock
:moo:

PS. Planetquake seems to be going up and down like a yoyo atm, so the images might need a few refreshes to see them.


(CptnTriscuit) #9

A hundred thanks to you Sock for those measurements. This thread should go on to the Mapping Resources sticky.

When I was trying this out I couldn’t help but notice the surface inspector doesn’t seem to like rotational degrees that aren’t whole. When I entered the number (such as 13.5) in either the value or offset column, it would round to 14 and change would be noticeable on the poly surface in the 3d view window. When I put the 13.5 into the step column and then used the little increment arrows in the offset column, the final number in the value column would still round to 14, but the texture would not change in the 3d view. Anyone know anything about this?

Anyways, I still got some nice results. Here was my initial test:

Then I tried beveling that curve using the same measurements just filliped. Some of the textures on the faces are off because I did it quick, got to go back l8tr and fix them.

Very helpful info!

“network maintenance”


(shazmax) #10

That rox! Been working some longs shifts but will get to this soon. I’ll post up some results when I’ve got more time. I tried to adjust the value quickly in the offset value and it worked for me…just not the unlocked main rotate value. I just typed it in and hit enter on the offset…dunno. I’ll try it later on with my adjusted curve. Thnx Socks and everyone else that has posted up.

“This thread should go on to the Mapping Resources sticky.” Bump to that!


(Chruker) #11

Just a small note. In the 1.4.0 version of Radiant, the dialog only shows the integer part of the texture angle. This has been somewhat fixed in the earlier betas of 1.5.0, but it still clamps the angles to integers when saving the .map file. Only the newest beta from 26. september seems to fix this issue, so that texture angles are properly saved.