Hint brush: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (see also consistancy)
m (typo correction)
Line 34: Line 34:


Above we see a typical corner. There are two players (the green boxes) and the cylinders at each end represent a lot of stuff to be drawn for the engine. We do not want this stuff to be rendered when not neccesairy, e.g. when we are "around" the corner.
Above we see a typical corner. There are two players (the green boxes) and the cylinders at each end represent a lot of stuff to be drawn for the engine. We do not want this stuff to be rendered when not neccesairy, e.g. when we are "around" the corner.
You may think <code>vbsp.exe</code> will make sure each player wont see the stuff belonging to the other player. This is wrong. The program has no AI, so it isn't spart enough to see what we see. It will divide this "level" into two leafs, either cutting the leafs along the brown or pink line (remember how <code>vbsp.exe</code> is not very predictable?). Either way, the leafs will be able to see each other and the stuff from the other player will be drawn. However, we '''can''' do something about it, simply by placing a '''hint''' at the corner, dividing our level into three leafs, (one more) but making sure the players don't render the stuff from the other players:
You may think <code>vbsp.exe</code> will make sure each player wont see the stuff belonging to the other player. This is wrong. The program has no AI, so it isn't smart enough to see what we see. It will divide this "level" into two leafs, either cutting the leafs along the brown or pink line (remember how <code>vbsp.exe</code> is not very predictable?). Either way, the leafs will be able to see each other and the stuff from the other player will be drawn. However, we '''can''' do something about it, simply by placing a '''hint''' at the corner, dividing our level into three leafs, (one more) but making sure the players don't render the stuff from the other players:


[[Image:Hint example4.jpg]]
[[Image:Hint example4.jpg]]

Revision as of 21:39, 2 July 2005


HINTs are planes used to split visleafs. Here's how hinting works. First, you create a brush, with on all sides the "tools/toolsskip"-texture. (this texture makes those faces to be ignored by the compilers). Now, wherever you want a leaf to be split, create the "tools/toolshint"-texture. The leafs are split EXACTLY where the face with the hint texture is. You don't have to tie the brush to an entity. Be sure to fit hint brushes to walls exactly, or else their effect *may* be lost. It will also make your level tidier. Hints are automatically tied to their own visgroup, so you can easily hide them.

You may take a look at the example map made by valve in: "sourcesdk_content\hl2\mapsrc\sdk_hints.vmf" for more information on how to make these hint-brushes, or look at the akilling.org HINT brush tutorial [[1]].

Why and when split visleafs?

First, before trying to understand this, learn how visleafs work. (see that link) Sometimes, certain leaf-shapes are preferred over others simply because that shape makes those leafs see less other leafs. (which means less stuff to be rendered, thus a faster map)

I will try to illustrate the importance of visleaf-cutting, and in the same time give you some examples on where one could use hints.

Our first example is allmost the same as the example level:

Hint example1.jpg

When a player is at either of the two player_starts, he can see the brushes (pipes) to the right of the wall. Why is that? well, it's because vbsp.exe did not do what would be the most efficient way of dividing our level into leafs:

Hint example2.jpg

See? The leaf the player is in, can see the leaf the pipes are in, and so the pipes are drawn. Quite a shame, because those pipes cannot be seen from the players perspective (they are behind the wall in the center). We can use hints to steer the process of leaf-making, like so:

Hint example3.jpg

The white line is a side of a brush with the "tools/toolshint"-texture. Notice how it forces vbsp.exe to divide our map into three leafs? And that, in this case, there can be no straight line drawn from the leaf the player is in to the leaf the pipes are in? If you understand that, you understand the essence of hinting.

Skyboxes are sometimes a bit high, causing a player to see a lot of stuff in the city because the leaf he is in can see over the houses. (like in the above example). That also is a good situation where one can use hints to stop the visibility.

Let's add some more examples:

Hint example5.JPG

Above we see a typical corner. There are two players (the green boxes) and the cylinders at each end represent a lot of stuff to be drawn for the engine. We do not want this stuff to be rendered when not neccesairy, e.g. when we are "around" the corner. You may think vbsp.exe will make sure each player wont see the stuff belonging to the other player. This is wrong. The program has no AI, so it isn't smart enough to see what we see. It will divide this "level" into two leafs, either cutting the leafs along the brown or pink line (remember how vbsp.exe is not very predictable?). Either way, the leafs will be able to see each other and the stuff from the other player will be drawn. However, we can do something about it, simply by placing a hint at the corner, dividing our level into three leafs, (one more) but making sure the players don't render the stuff from the other players:

Hint example4.jpg

See? The red and brown leafs can't see each other, so the players wont have to render each others' stuff. However, if one of the players moves into the green leaf, he will see both his and the other players' stuff rendered. You cannot stop that using hints. The only way to stop this would be by changing the level layout or by using other methods, like the ones described in Controlling Geometry Visibility and Compile Times

A last few examples I have whipped up in paint.

Hint example6.jpg

We see here a few examples of when, and how to use Hints. In all cases we try to hide the green players from each other. The upper three work as they should. The left one illustrates that it doesn't even matter if its one hint-brush spanning the corner, as long as its angle is > 180 degrees the two players will not render each other, because no straight line can be drawn between their leafs. (think about this one) The bottom-left example shows you that can happen when the angle is less than 180 degrees. One can easily draw a straight line from leaf to leaf, resulting in non-functional hints. When the corner in the hallway is 180 degrees, as in the middle top picture, you can suffice placing two hints like there. In fact, you can even make them closer to the players, but that would increase their effectivity (more stuff will be drawn "around the corner". ) see the example below the middle. Because you lowered the hints, vbsp.exe is forces to cut up the top visleaf because visleafs can't be concave. No matter how vbsp.exe cuts up this corner, the hints will always work less effective AND create extra leafs (more work for vvis.exe). In our example, the left player can see leafs 1 and 2 (same surfaces as above), but the right player will see all three numbered leafs (which is more than the top example.). The two right pictures show you you should keep things as simple as possible. If you can suffice using one hint, like in the top example, do so. And, don't use hints if you don't need to, like in the bottom picture. there is absolutely no way vbsp.exe can create leafs that enable both players to see each other, so there's no need to use hints here to hide the players from each other (you can offcourse use hints to hide parts of the hallways). In the same example you can also see a nice wall (the middle one) that should NEVER be a func_detail: because func_details don't exist according to vvis.exe, it will think both players will see each other and thats not what we want. vbsp.exe may even make it so both players here are in the same leaf.

A last example on when to use hints, is for simplifying your map. Sometimes, vbsp.exe cuts up your level into more leafs than neccesairy. This will only add to the compile time, so you don't want this. You can use hints to counteract this. For instance, place hints in doorways to stop the doorways to cut up the rooms they connect. Or, if you get an error that a certain visleaf is cornering too many other visleafs, you can use hints to cut that leaf into multiple leafs that corner a smaller amount of leafs.

In summary, since hints cost no extra power during the playing of your map, the are the primary way to speed up your map and controll your visibility.


See also

Controlling Geometry Visibility and Compile Times

Skips