Rival Fortress
In the past months working on Rival Fortress I found myself having to spend an unreasonable amount of time fussing with CMake build scripts. Don’t get me wrong, I like CMake. I think it’s an excellent tool if you have to manage complex build systems that have to work on...
Rival Fortress
Engine work for Rival Fortress is coming coming to a close. This weekend I decided to give it a test run with a simple prototype in order to get a feel how the API was shaping out. While I was at it I also extracted the engine into a separate...
Rival Fortress
This week I upgraded my main development PC and after a fresh reinstall of the OS I decided to do some spring cleaning. Codebase cleanup Since I recently upgraded Clang from 3.7 to 3.8, I tried compiling Rival Fortress with -Weverything enabled to see if they introduced new useful warnings....
Rival Fortress
Clang is my compiler of choice as I found it to be the fastest for development and it works on all desktop platforms. In this post I’ll talk about how you can setup Clang on Windows without having to cross-compile from Mingw or Cygwin. Flavors of Clang on Windows There...
Rival Fortress
Last week I talked about the new binary asset file format used by Rival Fortress. This week I’ll talk more about PAK files in general, as in the previous post I didn’t explain why I chose the “PAK” approach for game assets. The naive approach A common approach to game...
Rival Fortress
This week I updated the storage file format used in Rival Fortress. The previous file format was a quick implementation I came up with while still figuring out what was needed for the engine. Now that most of the engine functionality is fleshed out, I decided to revise the file...
Rival Fortress
Perfect hash functions are the holy grail of hashing functions. They guarantee no key collisions and work really well when dealing with data that is either static, where all keys are known in advance, or rarely changing. Minimal perfect hash functions (MPHF) are even better. They guarantee 100% load factor,...
Rival Fortress
There’s an excellent chapter in Game Engine Architecture about custom tools that are often developed to aid in the making and debugging of a game engine. Today I’ll talk about the ones I developed for Metric Panda Engine, the game engine that powers Rival Fortress. The Shell Swiss Army Knife...
Rival Fortress
Sometimes it is useful to split code into shared libraries that get loaded by the main executable depending on runtime requirements. For example, the current development version of Rival Fortress is structured like so: The Launcher is the main executable that contains shared data types, interacts with the OS and...
Rival Fortress
Not much coding went into Rival Fortress this week as I decided to give the website a facelift. It has been a while since I dabbled in web dev stuff, so it was fun to get up to speed with how the cool kids are “left-padding”. Get ready for some...
Rival Fortress
I like to keep an eye on new developments of the C++ spec and the direction the language is moving, but in the code for Rival Fortress I don’t use most of the features that C++ has to offer. The features I don’t like I don’t use object-oriented programming. Most...
Rival Fortress
This week has been dedicated to more multiplayer development for Rival Fortress. I’ve fleshed out a networking model based on the one described in the original Tribes paper with a few twists of my own. The model is built on top of the User Datagram Protocol(UDP), a very flexible and...
Rival Fortress
I’ve started working on the multiplayer code for Rival Fortress. It’s an exploratory process, as low level networking is very much new to me. I’m trying to get the simplest and dumbest possible implementation running without adding too much complexity. I’ll probably have to double-back on most of my decisions,...
Rival Fortress
This past week I did some more work on the rendering engine for Rival Fortress by adding a deferred shading path. Deferred rendering is particularly useful when working with many dynamic lights, and since I really want to have light/dark mechanics in the game, a combination of forward and deferred...
Rival Fortress
This week I’ll briefly talk about the custom memory allocators used in the 3D engine that I’m developing for Rival Fortress. Minimizing system allocator usage C and C++ don’t have built in garbage collection, so it’s up to the developer to decide how and when to allocate and free memory....
Rival Fortress
Having a way to capture game video footage is essential for any Indie game developer. It can allow you to: Store videos for visual comparisions of different builds (useful when testing) Capture gameplay demos to share online Have a video of the last few seconds before a crash There are...
Rival Fortress
Most game programmers like to have quick access to graphical performance charts in order to keep an eye on potential performance bottlenecks while developing or testing the game. Every off-the-shelf game engine offers some kind of profiling HUD that you can enable while developing and, if you are rolling your...
Rival Fortress
A while ago I talked about the font rendering used by Rival Fortress. This past week I added more functionality to the text rendering subsystem in the form of better text formatting and Complex Text Layout. Rival Fortress won’t need a complex text rendering engine, but it will require the...
Rival Fortress
This week I started working on the game editor for Rival Fortress. In a way similar to how Unreal Engine does it, I chose to implement the game editor as DLL module that gets loaded by the game executable on demand, instead of writing a separate application that edits game...
Rival Fortress
I’ve moved permanently to Linux as my development platform. I’m in love! Linux is giving me even more freedom from clutter and OS annoyances than what OSX was giving me. How did I ever get by without a tiling window manager! Fanboyism aside, this week I finally finished the cross...