mail me

Diary 2002

November 2001:

  • Written an iostream wrapper for .zip file access. Look at the download section.
  • Did some research into the standard C++ iostream framework.
  • Written a small Python script to "clean" a project automatically (i.e. get rid of Debug/Release directories, source safe files, ...).

October 2001:

  • Small change: Replaced occurences of strstream by stringstream because strstream is deprecated.
  • Did some research into CRC checksums for interest. As a result I've added a template CRC class to the engine that is configurable so you can calculate all popular CRC standards. I don't really need that now, but it might come in handy one day.
  • Hooray! We've finished our project, so I can continue with my private stuff again.

September 2001:

  • Too busy working, so I had no time for an update.

August 2001:

  • Alas I'm very busy now at work since we're crunching to get the next game out in time, so I don't have time to work on the engine until we're done.
  • Back from vacation which was great!

July 2001:

  • We'll go to China for 3 weeks on vacation, so don't expect any updates for that period :)
  • Finally added depth sorting of models with alpha transparency. The algortihm I use is not really optimal, but at least it works.
  • Added flipping of texture UV coordinates, since UV coordinates exported by Maya are reversed to DirectX's coordinates on the V axis.
  • I tried FreeImage instead of OpenIL but I think I'll stay with OpenIL since it is easier to use and more mature (had linking problems with FreeImage and some crashes).
  • Texture files are not limited to .bmp anymore. All formats that OpenIL can read are now usable. Restrictions: OpenIL seems to have problems with some .jpg files which are loaded "blocky". Further the alpha channel of .tif files is not loaded -> use .tga for alpha textures instead (I have reported that to the OpenIL developer).
  • Enhanced OpenIL wrapper functionality (including copying the pixel data to an array with a certain byte pitch, e.g. needed for Direct3d textures or Windows compatible bitmaps, which have to be DWORD aligned).
  • Researched per pixel lighting. Put up a screenshot of a small test program. The setup for the lighting is done in a vertex shader. You can also download the executable.
  • Did some experiments with DirectX 8 vertex shaders. Look at the results in Screenshots. The source code is not incorporated into the engine yet.
  • Added a screenshots section to the site.

June 2001:

  • Written a small Python script to fix .obj files which don't reference a material lib (e.g. exported by Maya).
  • Modified GameTime so that you can slow down and accelerate it using a ratio.
  • Added a function in AudioVisual that let's you print out a sub tree of the scene tree to an std::ostream. This proved very helpful for debugging.
  • Fixed a bug in the Lightwave importer. The object hierarchy was built up in wrong order.
  • Models are loaded through a ModelPool now similar to the TexturePool. Thus a model, will be loaded only once in the engine. Every further request for loading the model will clone the original model. (Cloning shares the geometry data, only stuff like transformations and render states will be duplicated). Model loading now has to go through the ModelPool because I made the .x and .obj importer constructors private.
  • Importing Lightwave .lws files is possible now. Some restrictions have to be applied (keys can not be separated into components, since e.g. a position key is a Vector3 internally, so for example no x-axis only translation keys should be used).
  • Implemented hierarchical keyframe animation. The design is preliminary, but works.
  • Changed file structure (don't separate files into Include/Source folders anymore). Further external library #include statements don't us any paths anymore, so it doesn't matter, where DirectX, OpenIL,... are installed.
  • Programmed a 3d model viewer to test engine usage (see Download section).
  • Textures were introduced as render states
  • Materials were originally part of a mesh and are now render states.
  • Meshes were organized into sub meshes before (like subsets of DirectX meshes) where each sub mesh belonged to one material. This idea was abandoned, since it didn't allow sorting by texture/material. Now a mesh doesn't know about materials, since they've become render states. During importing of .x-files the mesh is split up to fit my internal format. This change was a major restructuring of the engine.
  • View frustum culling implementation was finished. After trying out several algorithms for sphere/frustum culling I use the algorithm presented in the book "Realtime rendering" by Möller and Haines.
  • Started this site and using this diary. All older entries are only extracted from memory and as such is quite incomplete.
  • Implemented an .obj file loader
  • TexturePool was introduced that makes checking whether a texture was already loaded somewhere easier. (Textures can only be loaded through TexturePools now). If a texture is requested to be loaded more than once, the texture is shared via a smart pointer.
  • Added class TagLine that facilitates loading of files with lines of tags separated by spaces like "v 0.123 0.456 0.789".

May 2001:

  • Introduced .set files, where game settings are read from. Lines from the .set file are used to construct CommandLine objects that are used to execute commands (through an abstract Command class interface).
  • Added an input system that understands single hardware keystrokes (through DirectInput), hardware keys mapped to virtual keys, multiple virtual keys mapped to multikeys and key sequences mapped to combo keys all through the same abstract key interface. Key mappings can be read from the settings file. Keys can also be mapped to commands, so a keypress automatically issues the assigned action. Further a set of mapped commands can be grouped into an input context that checks keypresses automatically. Different input contexts can thus be used for e.g. menus, in game, popup windows,...
  • Strings used in a game are read through a .str file where each string is identified through a label. This can be used in the future for facilitating localization.
  • Added some really basic physics, but stopped that, since there is no use for that yet.
  • Having render states accessible through renderer switches proved to be clumsy, so render states are now classes that can be attached to nodes in the scene tree. An attached render state influences all nodes below it (examples are: lighting, specular lighting, fill mode, alpha state,...). Handling render states requires switching on the render state type, which I consider bad design, but I couldn't get rid of it. Maybe I'll manage later.
  • Directly rendering a scene when traversing it proved to be a bad idea, when alpha transparency was introduced as a render state, since transparent nodes must be drawn after the opaque ones. So I added a Sorter class where all nodes to be drawn are first accumulated where they can be sorted e.g. by texture, by alpha state or later by vertex shader. The renderer then gets a list of objects to render by the sorter. For your own sorting algorithm just inherit from the sorter and implement your own behavior.The current DefaultSorter just sorts alpha objects to be drawn after opaque ones. (The transparent objects are not sorted correctly yet).
  • Billboards are implemented for stuff like lense flares. Actually billboards are nodes that rotate the subtree below them towards the camera, so you're not limited to texture mapped quads.
  • Spheres, planes and half spaces added as preparation for view frustum culling.
  • Started using unit tests.

April 2001:

  • Added file path handling, scene graph management (nodes, transforms, geometry data, abstract renderer class, DirectX renderer, render caches, materials, lights), camera, interface to OpenIL, interface to XAudio lib for MP3 playback, .x-file importer, display statistics (frame, vertex and triangle counter).
  • A lot of ideas for organizing the scene graph came from Dave Eberly's book "3D Game Engine Design".
  • Render caches were introduced, because refilling vertex buffers every frame was quite a bad idea :)

March 2001:

  • Start!
  • Added game time, smart pointers, object base class, mouse input, basic linear algebra (matrices and vectors) and math tool functions, logging.
  • Smart pointers are realized via an object base class and not through adding a memory header and overriding global new.