--start--

This archive contains the source code for a sample system to render
3-D scenes from 2-D BSP trees, as discussed in my "Ramblings in
Realtime" column in the May/June, July/August, and November/December
1995 issues of _Dr. Dobb's Sourcebook_.  The archive contains the
source code for BSPMAKER, a C++ program to generate 2D BSP trees from
input line segment lists, and MAZE, a C program to allow first-person
3-D viewing of those trees in realtime.  Both programs are Win32
programs, tested with VC++ 2.0 running on Windows NT 3.5.

To make the VC++ projects for these two programs, just unzip this
archive into a directory using the -d option to pkunzip.  This will
create two subdirectories, BSPMAKER and MAZE.  Have VC++ build two
projects, one from the files in each directory.  Besides the source
code, there is a sample BSP tree to view, several sample input line
segment files, and the Win32 executables, bspmaker.exe and maze.exe,
in the respective WinDebug subdirectories.

To run the BSP compiler, make BSPMAKER the current directory and type

windebug\bspmaker

Then load one of the .lin files, and compile and save as desired.

To run the BSP-based animation, make MAZE the current directory and
type

windebug\maze

The BSP tree in bsptree.txt will be displayed.

BSPMAKER
========
The UI is simple and self-explanatory; you can load a line file, and
can compile either either one split at a time with visual feedback as
to where the splitting is happening, at a paced speed with visual
feedback, or as quickly as possible with no feedback.

You can save the compiled BSP tree to any file, but in order to view
it with the MAZE program, you must save it to the file bsptree.txt in
the directory that is current when MAZE is run.

MAZE ==== MAZE automatically displays the BSP tree stored in the file
bsptree.txt in the directory that is current when MAZE is run.  The
arrow keys move the viewpoint forward, backward, and turn right or
left; the minus key moves the viewpoint up and the plus key moves the
viewpoint down. There is no way to tilt the viewing angle up or down.

SAMPLE FILES
============
The MAZE directory contains the sample BSP file bsptree.txt, which is
compiled from the line file test.lin in the BSPMAKER directory.  This
BSP tree is displayed automatically when you run MAZE.
Sample line files in the BSPMAKER directory are:

test2.lin: a very simple four-line case
test.lin: a fairly simple case designed to look a bit like a real
          level
mike.lin: a fairly complex case with the level spelling out "Hi Mike"
hand.lin: a complex case with the level in the shape of a hand

One important thing to keep in mind is that walls face in a
direction, and are only visible from one side.  This means that if
you walk around to the other side of a visible wall, it will vanish. 
This is the way real game levels work, where walls have volume, and
you only see the outside of the polygons bounding the volume. 
Test.lin looks more realistic than the other levels because I've
inserted pairs of collinear polygons for the walls, one facing in
each direction, so the wall are visible from both sides.  In a real
game, the walls would be separated by some distance, and there would
be top and bottom surfaces to make the walls volumes rather than
flat, 2-D planes.  Note that the collinear walls can be confusing
when you do a visual compile of test.lin, because it appears that the
same wall is compiled multiple times.  It's not the same wall,
though, it's another wall that's collinear with the first wall that
was compiled.  In a production BSP compiler, collinear walls would
share a single BSP node, for compactness and efficiency, and to avoid
problems that can arise from collinear BSP splits.

NOTES
=====
Please note that these programs are provided totally "as-is."  I am
well aware that the UI is crude and probably has some bugs, that the
visualization could stand some improvement as well, that there
certainly should be a built-in line-segment editor, and that the
animation could be much faster, especially if it used DirectDraw, but
that's not really what this archive is about.  The object of this
particular archive is primarily to provide working 2D BSP code for
people to learn from, and to provide visual feedback to make it
easier to understand how BSPs work, and secondarily to provide a
skeleton upon which a full-featured BSP compiler and BSP-based
rendering system could be built. Please feel free to improve upon
this program in any way you wish, and to use this code for any
purpose, although acknowledgement is always appreciated. Please DON'T
send me mail or disks or email telling me about your improvements; I
just don't have time to read them; instead, post your comments and
code on the net, for example in rec.games.programmer.

Thanks to Chris Hecker and John Carmack for their help.

Enjoy!

Michael Abrash
mikeab@idsoftware.com
11/4/95

--end--

