Code Review of Doom For the iPhone
Developer Fabien Sanglard has written a code review for id Software's iPhone port of Doom. It's an interesting look into how the original 1993 game (which he also reviewed to understand its rendering process) was adapted to a modern platform.
"Just like Wolfenstein 3D, Doom was rendering a screenframe pixel per pixel. The only way to do this on iPhone with an acceptable framerate would be to use CoreSurface/CoreSurface.h framework. But it is unfortunately restricted and using it would prevent distribution on the AppStore. The only solution is to use OpenGL, but this comes with a few challenges: Doom was faking 3D with a 2D map. OpenGL needs real 3D vertices. More than 3D vertices, OpenGL needs data to be sent as triangles (among other things because they are easy to rasterize). But Doom sectors were made of arbitrary forms. Doom 1993's perspective was also faked, it was actually closer to an orthogonal projection than a perspective projection. Doom was using VGA palette indexing to perform special effect (red for damage, silver for invulnerable...)."
Forgive my ignorance, but couldn't you have the original software renderer write to an in-memory buffer and then upload that using glTexSubImage2D()?
Doom 1993's perspective was also faked, it was actually closer to an orthogonal projection than a perspective projection
Not remotely true; DOOM's perspective is/was perfectly correct (apart from the monsters being billboards, of course - but they were perspective-correct billboards).
The method for achieving perspective is rather unconventional, but the maths works out the same.
Matching up floor and ceiling in an animated view with fake perspective is basically impossible.
[I did a port of DOOM before it was open-source, so I know a thing or two about this.]
Disallowing the use of private APIs ensures that your software will continue to function with new versions of the iPhone OS. The private APIs might change, but the public ones will not. The real questions is whether or not there should be a public API for CoreSurface.
Kiteboarding Gear Mention slashdot and get 10% off!