Select your entertainment

> Make your own comic

Strip Editor | GTA online | 3D Pinball | 3D Printer | Carputer | Software | Films | Features

Features > A tribute to Build > Exclusive: Polytex, Build version 2.0

Back when Duke3D was being developed, Quake was about to do real 3D for games. For this reason, work was started on bringing the Build engine to being a true 3D renderer.

What ever happened to the Polytex engine you were working on?

The Polytex engine,
showing different render

In 1994, Scott Miller was pushing me to write a new engine to compete with Quake. So I played around with some stuff and called it "Polytex". A few months later, the Build teams were complaining (to both Apogee and myself) that I was not giving enough attention to Build. We all knew what our priorities were.. and that was the end of Polytex.

Polytex never got past the test program stage. Polytex generated a BSP tree on the fly at startup and drew all surfaces in the map in back-to-front order. Drawing this way avoids the need for hidden surface removal, but it suffers from a ton of overdraw. It actually ran fast enough on medium-size Build maps. To achieve this, I had to optimize my polygon drawing code as much as possible. I used 2 unusual tricks to speed up my polygon drawing:

1. Free-directional texture mapping. This method is very fast since it uses a minimal number of divides. It is also very close to correct perspective. Unfortunately, free directional mapping suffers from visible artifacts which make textures not look so clean (I like to call them "sawtooth" marks)

2. 2-D texture cache. Instead of simply using malloc() when allocating space for textures, I wrote a special system that would allocate rectangles for each tile on a 2-dimensional (X * 256) space. This way, all textures could be accessed simply by using the x86 byte registers (AL and AH for example) as U and V texture coordinates directly. This makes for a much faster inner loop - especially on 486's - because there is no need for shift operations. The 2D cache saved a lot of memory on poorly-sized textures, such as 65x129.

Polytex had a lot of problems. Besides the obvious bugs and crashes everywhere, I didn't have a clue on how to implement an editor. I was trying to do everything in 3D mode. In fact, the only editor function that remotely worked was the 'T' key (for splitting a polygon into a triangle fan), but even that had problems because I had to re-generate the BSP from scratch on every change. If I wrote a 6 degree of freedom polygon engine from scratch today, I would never use a BSP. Actually, it would be very similar to my "Polymost" engine.

Polytex screenshots

A 3D polygon in
the Polytex engine.

The same model, but
rendered in wire frame.

Other 3D objects with
flat shading, with a window
showing the wire frame
of the models.

A view of the world rendered
with texturized planes.

The same view, but with
solid plane rendering.

Again, but this time
shown in wire frame.

A spinning 3D object,
taken from an angled view.

Another angled view,
looking down on the world.

This time with a
rotated view point.

Do you want to know more?
Ken has let me get first dibs on posting this information, but there'll be more info at his website soon.