I've expanded the descriptions here to give a quick overview of the project.
All parts are linked together with "previous" and "next" links at the top
of the page, so you can start anywhere.
|November 19, 2010|
Part 1: It's a Small World
Introducing myself and the project. I build a simple block landscape
implemented with an Octree.
|November 29, 2010|
||Part 2: Going Places
We add a camera and motion, so you can run, and jump and fly... Whee!
Includes a discussion of collision detection.
|December 8, 2010|
||Part 3: Good Old 2D Graphics
Basic 2D graphics for overlays like status bars and UI controls. Also some
comments on file formats.
|December 15, 2010|
||Part 4: Transparency
Various issues related to transparency. At this point in the
project, I am doing things in a very old-fashioned way that doesn't
take advantage of hardware. Look to later parts for a more
|December 22, 2010|
||Part 5: Plans and Directions
A list of the various major parts of the project, and discussion of which
to do first. I settled on graphics, since I figured no one would even
try a bad-looking game.
|December 29, 2010|
||Part 6: The Shape of the World
Speculations on what a semi-infinite, modifiable MMO should look like. A side trip
into ray tracing, which I hoped would help me understand lighting.
|January 11, 2011|
||Part 8: World Building
Building an asteroid out of cubes, and ray-tracing the result to give
realistic lighting. A nice asteroid video.
|January 20, 2011|
||Part 9: A Larger World
A discussion of what sorts of objects will be in the world,
and an attempt at asteroid fields.
|January 26, 2011|
||Part 10: Attempts at Art
Designing a solar system with nebula in the sky. The nebula looks pretty
good, but the asteroids still need work. Another video.
|February 3, 2011|
||Part 11: The Need for Speed
My first correct use of index and vertex buffers for drawing the sample Minecraft data.
Thinking about switching from DirectX to OpenGL.
|February 10, 2011|
||Part 12: Adventures in OpenGL
Learning OpenGL and trying it on my various computers. This was not encouraging! I also
wondered a bit if any ambitious kid programmers out there could still manage to learn how
to do graphics programming at this level. There's a lot to know, which kind of discourages
|February 18, 2011|
||Part 13: The Cake is a Lie!
OpenGL 3.3 did not work under the current version of OSX. I was very disappointed and
doubted the wisdom of trying to support multiple platforms. Looking back, I would
have saved myself a lot of aggravation by just switching to DirectX 10 and sticking
|March 4, 2011|
||Part 14: Portability
Getting the demo to work on Windows 7, Windows XP, Linux and Mac! This was harder than
I expected. Even two years later, I still run into machines that won't initialize
OpenGL or run the shaders correctly. On the other hand, the statistics I'm gathering
say that most people are successfully running the demos.
|March 24, 2011|
||Part 15: Huge Tracts of Land
Rendering a larger world, where chunks of scenery are paged in and out as required.
Debugging multithreaded code is a pain in the neck, by the way...
A video touring the TwentyMine world.
|April 10, 2011|
||Part 16: Fun with Shaders
Can I really render a 1024 by 1024 by 128 block of cubes at interactive speeds? In this
part, I first consider some simpler rendering for distant data.
|April 15, 2011|
||Part 17: Less Fun with Shaders
This is the part where I discover the timing of different shader primitives are wildly
different on the machines I have. This makes it hard to write a completely portable shader.
Fussing over all these platform differences was really taking a lot of fun out of the project.
My view of the graphics industry was starting to change...
|May 10, 2011|
||Part 19: Transparency Again
A demo that renders the large landscape at speed. Now with transparency in the distance!
It turns out this code was wrong. See next part.
And a video.
|May 18, 2011|
||Part 20: Still More Transparency
Let's try that transparency code again... I'm doing "real" transparency as in the previous
demos, but sorting incrementally instead of on each frame.
The video shows the out of date portions.
|May 24, 2011|
||Part 21: Light and Shadow
Some preliminary experiments on lighting. This involved stepping through the Octree to find
lines of sight to the sun. The performance wasn't acceptable and
I eventually stopped using the Octree data structure. I do a bit more with lighting later in the project.
|June 21, 2011|
||Part 23: Realism and Variety
Some thoughts about what a world contains, and whether it should be art or the result
of procedural rules. Real scenery is so complicated!
|June 28, 2011|
||Part 24: One With Everything
More landscape variations. This is the part where I decided on the simple planet with
asteroid belt and moon with ringworld.
|July 1, 2011|
||Part 25: Spin-offs
One of my many attempts to restructure the code to make useful libraries out of it.
It's hard to know if this is worth the trouble. Until someone decides to use the
code for another project, it's all just time-consuming cleanup.
|July 16, 2011|
||Part 26: Trees
I implemented the "space colonization" algorithm for generating tree branches,
inspired by Miguel Cepero's Procworld. The results are interesting, but I was
never really happy with the algorithm.
|July 30, 2011|
||Part 27: Framework
Updating the framework to support both OpenGL 3.2 and OpenGL 2.1, for use on the Mac
and older Windows/Linux hardware.
|August 14, 2011|
||Part 28: Far Horizons
Maintaining an infinite landscape with varying levels of detail.
The video shows subdivision of cells
from above, then a player-eye view of the landscape, with and without grid lines.
|August 17, 2011|
||Part 29: About the Demos
I asked for some feedback about demos and the blog. Maintaining the demos was a lot
of work and I wasn't seeing the number of downloads I had expected. It appears that
the videos are more popular than the demos.
|August 26, 2011|
||Part 30: Cubes and Polygons
An experiment in adding a polygonal landscape to the cube world. I went back and forth
on this idea several times during the project.
|September 2, 2011|
||Part 31: Decals
To add and delete blocks, you need to see the selected block. Which isn't as simple as it sounds.
|September 10, 2011|
||Part 32: Mining Minecraft
I decided to build a viewer for Minecraft save files, with the goal of letting
players extract their favorite buildings from Minecraft and import them into my world.
|September 15, 2011|
||Part 33: Taking Contributions
Some discussion of the problems of taking contributions (especially code) from other people.
So far in this project, everything has either been open-source libraries or my own work.
|September 25, 2011|
||Part 34: Beyond Cubes
Adding some brick types other than cubes to the demo. This required different rendering
code, and import of models from Collada to my own format.
The video shows a tour through the TwentyMine
|October 3, 2011|
||Part 35: Minecraft Lighting
I try to reverse-engineer Minecraft lighting. The output is vertex lighting added to
my existing rendering code.
|October 16, 2011|
||Part 37: Fog
Fog hides the edges of the world, but I'm still not sure I like it.
The video shows different fog distances.
Chunks are faded in during a load.
|October 28, 2011|
||Part 38: Building a Solar System
Putting together some parts of the SeaOfMemes world. Some design speculation, and a different
design for generation ships.
|November 7, 2011|
||Part 39: An MMO
A year has gone by on this project, and there's no MMO. So I wrote one. This is the
Landscape demo from Part 28 with chat functions. Though hardly used, the server has
kept running for over a year.
|November 14, 2011|
||Part 40: Game Design
A possible game design, if I ever get this world built!
It was around this part where I started to have more severe health problems (limited
sleep for weeks at a time) and things slowed down.
|November 21, 2011|
||Part 41: Construction Debris
This discussed some of the rendering issues for an entire solar system. I implemented
a spherical world in a shader (my most complex shader yet) and wondered about some of
the aliasing issues I was getting.
showing movement between the objects of the solar system.
|November 27, 2011|
||Part 42: Planets are Complicated
I tried to add clouds, reflective water and bright lava fields to my shader planet. This
worked well on some of my display hardware, and not at all on others. Doing a realistic
planet at different resolutions as you land from orbit seems hard.
|December 2, 2011|
||Part 43: A Simple Plan
I listed all the things that still needed to be done, and ran a poll about what to do.
I have a lot of anxiety about putting a game out there and having it fail. I'm not
sure people give you a second chance.
|December 9, 2011|
||Part 44: The One That Got Away
I wanted to handle a dusty asteroid belt, or realistic atmosphere on a sphere. I got an
idea for doing this in the shaders with an odd lookup table. It sort of worked in my
first experiments, but I couldn't find a way around the various resolution issues.
|December 15, 2011|
||Part 45: Genetic Algorithms
Since I'm making no progress at this point, I drag out an old demo I wrote showing
a use of Genetic Algorithms. A set of creatures that follow a trail are evolved,
and you can play with the population/reproduction parameters. This is written in Java
and runs in the browser.
|January 6, 2012|
||Part 46: Back To Work
I reimplemented text in my overlay graphics with the FreeType library, so that it
worked on all three platforms (the previous version had been Windows-only.) I also
started wondering about Unicode and whether I should support it.
|January 17, 2012|
||Part 47: Intellectual Property
As part of the PIPA/SOPA protests, I wrote an essay on intellectual property and copyright
issues. I don't agree with the prevailing "piracy is killing publishers" attitude. Instead,
it's changes in advertising and lower barriers to entry that are killing publishers. These
issues are not new either, with variations going back decades.
|February 6, 2012|
||Part 48: Programmer Art
Frustrated by lack of progress on my main project, I fool around with some 3D graphics,
trying to make an alien-looking plant and a flying saucer.
|February 16, 2012|
||Part 49: Sound
I get sound working on Windows, Linux and Mac using the DirectSound and OpenAL
libraries. Then I build a simple movie with flying saucers approaching the Earth.
See the video.
|March 10, 2012|
||Part 50: Spring Cleaning
I release all the demos and source again. Maintenance of this code is taking a lot
of time, but I'm pleased overall with how it looks and runs. Still bugs and platform
issues everywhere, but it's not horrible.
|March 20, 2012|
||Part 51: Internationalization
I stupidly decided to support Unicode and spent too much time tearing up the floor on
all the code. Really supporting multiple languages means implementing keyboard input
helpers and so on, so all this really does it support (badly) some European languages.
|March 27, 2012|
||Part 52: Scripting Languages
With no new progress, I talk about the various open source scripting languages available.
Nothing was actually done with this. Lua was a popular choice in the poll, but I'm not
sold on the syntax. I also worry about security in a shared world where anyone can
|April 3, 2012|
||Part 53: Storing World Data
Since I was still not feeling up to anything hard, I defined the interface of a database
for the project, and did a partial implementation.
|April 12, 2012|
||Part 54: Stuck
At this point, I really ran out of energy due to health issues. I was
trying to think of a data structure for a modifiable landscape that wasn't
just cubes, but got nowhere.
|April 19, 2012|
||Sleepless in Sacramento
A reader suggests Dual-Contouring for landscape data, but I'm too short of sleep
all the time to figure it out.
|April 27, 2012|
||GUI Design Contest
Since I wasn't getting anything done, I decided to improve the GUI and started
a 99designs contest. We had an interesting discussion in the comments.
|May 3, 2012|
||GUI Design Contest Results
Results came back from the design contest. I was impressed -- commenters less so.
I did find 99designs contests to be brutal for the designers. Even the winners get very little
money and the losers get nothing. The site itself takes a very high percentage.
I ended up paying my second choice directly since I was embarrassed over the whole situation.
|May 16, 2012|
||Writing a Game
In frustration, I started new mini-game inspired by the game Proun. I created this little
spaceship and asteroid and started to think about game play.
|May 27, 2012|
||Part 55: Framework Architecture
I talk about my internal framework and getting the GUI code finished. Some new demos of
the GUI were written, but I didn't finish enough of it to attract any other users.
|June 5, 2012|
||Part 56: Don't Hit Me!
I did a bit more on my mini-game, but eventually decided it was just procrastination.
I was having a lot of trouble finding a goal I could achieve on 4 hours sleep a night!
|June 18, 2012|
||Part 57: The Build/Release Process
Building and releasing all the demos on all the platforms was taking hours at a time, and
was very error prone. I write about the process in this part.
|July 4, 2012|
||Part 58: The New Build Process
After some more research and automation, I create a simpler build process. Testing on
each platform is still a nuisance, but there's nothing I can do about that.
|August 6, 2012|
||Part 59: Gathering Statistics
A reader decides to compile the demos and can't get them to work on his laptop. The
results are like nothing I've seen, and I can't imagine what is failing. I end up
buying an identical laptop just to debug it. It turns out the OpenGL drivers have
To get some idea of how often this is happening, I write a statistics server and add
code to the demos to gather system performance and time spent running each demo.
|August 16, 2012|
||Part 60: Our Story So Far
I really "hit the wall" around this time and had no idea how to proceed. The project
is seriously off track at this point!
|August 23, 2012|
||Part 61: Redesigning Crafty
Although the title suggests I was working on the demo, I was actually playing with
3D printing of Minecraft data. The printing service Shapeways produced a piece of the
TwentyMine server for me, for not too much money (since it was small.) A larger piece
was ridiculously expensive and I wondered why.
|August 30, 2012|
||Part 62: Character Animation
I find some open source character animation sequences in BVH format from Carnegie Mellon University
and write a little viewer. Entertaining, but to use this in a game, I'd have to drastically
reduce the amount of animation data. Here's a video.
|September 6, 2012|
||Part 63: Landscape and Selection
I still have a problem with highlighting selected blocks, and try yet another way to do it.
The last time I worked on this was Part 31, which used decals.
|September 13, 2012|
||Part 64: Distant Blocks
I considered some of the issues with making a large landscape out of blocks and
dropping the resolution in the distance. I had talked about this before, but not
come to any conclusions.
|September 21, 2012|
||Part 65: Instancing
I realized I could do instancing under OpenGL 2.1 (and so on older hardware)
and tried some demos. I got odd performance figures because I did not understand
what was really happening in the display.
|September 27, 2012|
||Part 66: Rendering Again
More messing around with rendering cubes. I am seriously tired of cubes and low-level
3D graphics by this point! Anti-aliasing issues are a problem in this part.
|October 4, 2012|
||Part 67: Scenery I Can Live With
I find an algorithm that makes distant cubes look tolerable and decide to use that rather
than dual-contouring. In this part, I also try to automatically extract buildings from
my sample Minecraft data, so that I can populate a planet with interesting buildings.
|October 12, 2012|
||Part 68: Names
No real progress in this part. I continued to mess with rendering block scenery
in the distance.
|October 19, 2012|
||Part 69: Security
With no progress on the project, I talk about security and virtual machine issues.
I want the eventual world to support scripting on objects, and I worry about viruses
spreading within the world. I don't want the game to allow player machines
to be infected.
I also point out that the industry solution is app stores, which just add barriers
to independent software development and limit the types of apps which can be written.
|October 26, 2012|
||Part 70: Application Roles
I write some more about virtual machine security and wonder what the correct solution is,
if there is one.
|November 2, 2012|
||Part 71: Update
The distant block world has been partially implemented. The blocks are there, but
not textures for the summaries.
|November 23, 2012|
||Part 72: Texturing Landscape
I get the textures to work on the summarized landscape. It doesn't look too bad. Still a
lot of work to do for this to be updated in real time as a result of player construction.
|December 2, 2012|
||Part 73: Topology
For fun, I implement the block landscape inside a cylinder (the asteroid habitat) and
on the surface of a ringworld. Rendering it over a sphere looks like a problem, since I
don't have a good rectangular tiling of a sphere.
|December 10, 2012|
||Part 74: Very Annoyed
I don't like the summary of procedural cube landscape much. And I build a new
machine with Windows 8. Some complaints about "why are they changing my UI??"
|December 19, 2012|
||Part 75: Things Are Not As They Seem
I find some bugs, which reveal a long-standing problem with my rendering code. It's hard
to believe I've come this far and still have these basic mistakes.
|January 10, 2013|
||Part 76: Documentation
I generate some documentation web pages from the code comments. Basically procrastination
on my part. So is writing this summary page!
|March 23, 2013|
||Part 77: WebGL
Restarting the project by looking into WebGL. Perhaps this will let me
distribute code without all these endless, frustrating platform issues.
So far, I'm still skeptical.
|April 18, 2013|
||Part 79: Trees Again
The Trees demo converted to WebGL and improved a bit. And some new problems using WebGL.
|April 27, 2013|
||Part 80: Emscripten
working tool with lots of odd details to worry about. Messy!
|May 5, 2013|
||Part 81: Emscripten Demos
I've compiled and run some complex demos with Emscripten. I guess it's a useful
platform after all.
|May 21, 2013|
||Part 82: Platforms
application code changes is a chore. It's not made any easier by different implementations
of WebGL in the various browsers.
|June 8, 2013|
||Part 83: New Source Code
The latest versions of the demos and framework have been released. The first update
in months! Also, a discussion of 2D text.
|June 28, 2013|
||Part 84: Seamless Textures
Played around with one of the oldest items on my ToDo list -- generating seamless
textures procedurally. It works!
|July 25, 2013|
||Part 85: Space Station
Can this space station be saved? I have been asked about putting a space station
in orbit. I'm not sure what it should look like, and it doesn't have much build
area. The deck is long and narrow, making for interesting layout questions.
And it's kind of ugly!
|August 16, 2013|
||Part 86: Worlds You Can Walk On
The SeaOfMemes demo completely rebuilt to cover the objects with landscape. Currently,
it's just a texture, but you can see how it will work. There are also space stations,
and rings around the planet.
|September 8, 2013|
||Part 87: Working on Terrain
An update on my progress this month. The goal is real terrain for all the asteroids,
stations, habitats, and the RingWorld. Also, I'd like a new way of controlling movement,
where the player enters vehicles instead of just flying through the model.
|September 29, 2013|
||Part 88: It's Blue
I keep plodding away on this. For a break from trying to generate nice terrain,
I worked on the look of the space station. I don't know if this is the right direction.
I'm still laughing at it.
|October 27, 2013|
||Part 89: More Models
Not much progress recently, so I've been messing with the look a bit more.
This part showed the Habitat object in the asteroid belt, and some stand-ins
|November 30, 2013|
||Part 90: Update
Miscellaneous topics this month, from 3d printing to z-buffer issues and
cubes again. No new demos.