I want to tell you of our progress in 2013.
In the previous article I talked about OGRE and OIS flaws that were threatening the future of our project. This time, I want to start with acknowledging that I made one big imperfect decision myself: I decided to switch to OpenSceneGraph as soon as possible.
We had a number of MJIN API rewrites this year. By deferring the switch to OpenSceneGraph to the point when we have more or less stable API I could have saved at least a month of calendar time (about 40 hours of pure time).
MJIN1 was a real mess when OGS Mahjong 1.0 has been released. Cleaning up and the switch to OpenSceneGraph resulted in MJIN2 which solved many problems MJIN1 had like hiding dependencies and stabilizing both API and ABI. But this resulted in a lot of code duplication.
By the end of the year the new so-called “dictionary state API” concept was born which promises to remove most of the duplication and simplify error handling.
The usual API that you are used to consists of hundreds of classes and methods. The ABI stabilization approach we took requires almost twice more classes and methods. For the team of our size this is simply impossible to handle.
Dictionary state API only leaves you with the most important classes which can be called components or systems like Actions, Pipeline, Scene. You don’t have direct access to their children, you can only setup a dictionary to describe them. Dictionary is a simple associative array of key-value pairs. Basically, if you want a Scene to have a SceneNode child at (0, 15, 0) position you create a dictionary with an entry like “node.position=0 15 0” and pass it to the Scene. This comes with a bit of performance penalty (compared to normal function calls), but removes the need for child classes altogether (and thus a lot of boilerplate code).
As you remember, we were going to use Python for quick iterations of new code. Unfortunately, due to above API changes that happened mostly in C++ we didn’t have a chance to try Python for more than just one component – Actions. Still, Python proved to be faster to iterate than C++.
Actions component allows you to specify changes for properties of game objects and sequence them into larger actions to achieve complex logic without writing much code. Here’s a simple example (only a tip of the iceberg) of what you can do with Actions.
Due to outdated mercurial hosted by Google Code we had to move our mercurial repositories to Bitbucket. Outdated software at Google Code is just one sign of the service decay. Since it’s not uncommon for Google to shutdown unpopular services, we decided not to wait until it’s over and migrate to MantisBT for task tracking. So far so good.
To mitigate the impacts of hasty decisions, we also decided to start planning. The shift from logging to planning is ongoing and is quite hard to fully implement, but several things have been done with planning which proved to be useful for progress estimation, for making sure every team member understands where we are heading.
Just as logging opened our eyes on how hard things were to do, planning promises to open our eyes on how to achieve those hard things faster and with less manpower.
Short 2013 summary
These are the major things we did this year:
- OGS Mahjong 1.1 with online leaderboard.
- OGS Mahjong 2 draft.
- Actions draft.
- Deferred shading pipeline draft with support for the following techniques out of the box:
- soft shadow mapping;
- normal mapping;
- cube mapping;
- glow mapping.
- Dictionary state API.
Unfortunately, I don’t have information how much time each team member spent this year, because we have not yet implemented all the necessary things to gather such statistics for everybody. Nonetheless, I have calculated that I spent 563 hours this year to solve 230 issues. That’s about 4 months worth of full time job, or about 1.5 hours each day during the year.
Plans for 2014
- Deferred shading pipeline.
- Dictionary state API.
First playable versions of:
- Shuan. Arcade shoot ’em up game which will use MJIN2 to its maximum.
- Mahjong 2 which will finally support the long awaited classic mode.