Atom is a node-based image processing application. It provides a user-friendly front-end for creating nodes, dragging connections between them, and viewing previews of the image operation at each node. The front-end is written in C#/Gtk and the back-end is written in C++ using Magick++ for some operations and SWIG for the C# wrapper.

Atom also allows you to define image processing networks with an external markup file. This could be used, for example, to generate image processing networks from external code. Atom could then be called to run on images in batch using the generated network. Here is a one-page overview of the markup.

Evaluation of the node network happens in dependency order, and sets of nodes on the same dependency level are processed on individual threads. The UI stays fairly responsive, and multi-core processors should benefit as well.

Doing forward and inverse hough transforms on a pattern. One node blurs the transform before it's inverted, just for kicks.

Example of multi-image support between nodes.

ColorCube is a simple application that lets you load an image and displays the color space of the image in a 3D cube. You can rotate the cube with a slider.

It has very few options since it really doesn't need much. A neat feature is the ability to only show colors used more than a certain number of times, set by the Density Cutoff spinner. So, if Density Cutoff were 15, then you would only see colors in the cloud that were used on at least 15 pixels.

You can also specify the cloud opacity, which is often useful for seeing the 'inner' structure without raising the density cutoff.

Download ColorCube (for Windows)

Geos is an experiment in game engine design. I talk to game engineers all day at work, and eventually I felt the need to get a better understanding what some of the real issues are in designing and maintaining a game engine. So, way back in 2006, I sat down and got started.

At the same time, I wanted to try my own rendering and game state ideas, and maybe even implement a decent platform for launching game prototypes quickly. So, I decided to go all out, and Geos, the never-finished engine in progress, is the result.

Unfortunately it hasn't had much attention lately, as work demands my time, and I've also started an android engine on the side. Plus, it turns out writing good game engines is actually pretty hard. Crazy.


As of right now, here's the run-down:

  • Lua scripting runtime with fairly decent exposure to the engine
  • Physics support using ODE
  • Configurable scene graph traversals
  • Collada Support via FCollada
  • OpenGL 2.0 Support
  • Some nifty concepts about how rendering pipelines could work
  • And lots of other obvious things ...

A game where you spin, push, and slap metallic objects off of a board.

Geos actually has a dedicated site here and the start of its scripting reference docs can be found here.
Or check out some lame videos, like Rocket Quest.

ReconSpy is an app written in C# to pull NMEA GPS data over a serial device, visualize information from it, and associate other data with time and location.

It uses Gtk# for the UI and Cairo for custom drawing.

The area on the left shows satellite information. The blue circle shows visible satellite positions in the sky. On the right you see the altitude history along with the minimum and maximum altitudes marked in a graph.

The large 'Plots' area is used to display other information associated with your location. For example, here is a plot of WiFi AP scans (the rest of the UI is hidden):

Green dots indicate open APs, red ones are closed. The color of the gps trail shows how long ago it was recorded. An AP's location is determined by a weighted average of all positions it was seen from. The weighting primarily comes from the AP's signal strength.

SHGen takes six images from a cube map -- such as what you might render out of Max or Maya -- gives a polar coordinate preview in the center, and transforms it into Spherical Harmonics coefficients.

Spherical Harmonics are used to approximate functions over a sphere, which happens to work out nicely for ambient lighting solutions. Since ambient lighting kind of bounces all over the place and comes from 'everywhere,' it can be represented as intensities over a sphere around an object being lit.

The precision of the approximation depends on how many numbers (the coefficients) you use to drive the harmonic functions. More is better, as usual.

Spherical Harmonics have a few other neat properties in regards to rendering and some nice shortcuts when it comes to doing fast math operations over a sphere. I'd recommend reading some more about them.

Sketcher is a user-friendly version of my original sketcher experiment from 2005. It lets you load an image, tweak the filter and sketch settings, and save the "sketchy" version as another image.

The sketch rendering was originally done in OpenGL, but I went and re-implemented it in software for this version for various reasons. It is a C# port of my original C++ code, and unfortunately it seems to be a good deal slower. It's still quite usable, though, provided your image isn't gigantic.

A few features remain grayed out as well, having not been completely ported, such as Underpaint mode and the Quality setting. Underpaint is kept off, and Quality is fixed at 100%.

Download Sketcher (for Windows)

Ever wished searching for images was a little more intuitive? Me too! I wrote Webtrip to make image searching easier. It is a front-end to Yahoo Image Search, as Yahoo has so kindly provided an open interface to their search engine for free.

Using Webtrip, you search for images, and the thumbnailed results are kept in collapsible groups. You can click a thumbnail to see the full version in the main view. In addition to this, I implemented some features I find useful:

  • Download every image in a group to disk
  • Save groups as a "Search Set" for later use
  • Drag thumbnails out to applications, and drop the full image
  • More control over image sizes
  • Prune out thumbnails you don't like, make room for ones you do
  • Dynamically increase or decrease the number of results in a group

Webtrip is an application I have been writing in Mono C# using Gtk# and Glade 3. To be honest, I did't expect Gtk to be as elegant as it is. I have been using Gtk about as much as I have used Windows Forms, and with Gtk, I have been able to create much better interfaces in far less time. It makes me frown whenever I have to go back to using Forms.