
Mario 64.
Tech Stack
- C++
- DirectX 11
- Graphics
- Tools
Overview
Catstronaut: Mission Impawssible was the 6th game I worked on at TGA. It is a 3D third person platformer inspired by Mario 64 & Mario Odyssey. The game was built in our custom game engine BOB, with Unreal Engine acting as a level designer.
My main contributions in the project were the landscape pipeline from Unreal to BOB, and a lot of optimizations with multithreading.
Landscapes
In the beginning of the project I was tasked with figuring out the landscape pipeline. Some other groups had already established a landscape pipeline, but from what we had heard, none of them were without their problems. The main problem with all the other groups’ pipelines were that there were way too many steps involved, breaking the agile workflow. Our group wanted the pipeline to be as easy as possible, leading us to experiment with Unreals heightmap export feature.
Heightmap export
Exporting heightmaps from Unreal as PNGs that we could later convert to DDSes seemed like the best option at the beginning, as we already use DDSes in BOB for all our textures. This proved to not be the case though, because we could not get Unreal to export their heightmaps as 16-bit images, even though the data stored internally in their landscapes were 16-bit. This led to banding in the exported heightmap which caused steps, or plateaus, in the landscape in BOB.

To fix this we decided to export raw 16-bit binary files instead (Unreal’s .r16 file format). Reading the data from these files were much easier than I thought it would be. However, this limits our landscapes to be square, as the .r16 files don’t have any data of the length of the individual sides. Calculating the size of a square landscape is trivial as you just have to take the file size divided by two (because 16 bits are two bytes), and the take the square root of that.
After establishing the file format for the heightmaps, I moved on to trying to export the textures for the landscape as a splat map that could be applied in BOB. There was no way to do this from Unreal, so I hade to write an Unreal Plugin.
Unreal Plugin
With this being my first time making an Unreal Engine plugin I needed a bit of help from other people. Most notably Valter Decorte, who had worked on modifying the TGA Unreal Export plugin when working on the previous game project. Keiren Wall, who helped me understand Unreal’s landscape materials, and Svante Jakobsson who helped me set up the splat maps in BOB.

After getting the splat map export to work, I wanted to improve the pipeline even more. We had recently had our Networking course, were our educator Hjalmar talked about Clicks of Death, unnecessary clicks that get annoying after doing them many times. The current pipeline for level designer was to export the landscape heigtmap and splatmap separately. To improve this, I moved the heigtmap export to the Unreal plugin, making the whole pipeline a one-click export.
Tessellation
When the landscape pipeline was done, me and Elias Öström got interested in implementing tessellation on our landscapes using Hull, Domain and Geometry shaders. Mainly to learn about the tessellation stages as we both found them interesting, but also because there was a chance of some optimizations.
Before tessellation, I generated the whole landscape mesh on the CPU when loading a level. In level one this was about 250.000 iterations, with each one calculating normals and such. After tessellation we could generate a much lower resolution mesh, instead generating additional vertices on the GPU, which decreased loading times. Additionally tessellation also enabled us to do frustum culling on the landscape, as there were patches of landscape that could be culled individually.
I’m still a litte unsure if we actually gained performance during runtime, but I think the coolness factor outweighs any performance loss :)