I have always thought that you cannot let yourself be defined by a single idea. Following that thought, parallel to my Bioinformatics degree at ESCI-UPF, I work as an indie video game developer. In this article, I will explain how it started and what the work is like.
It all started on a cold and mildly unpleasant winter evening during my first Christmas break at ESCI-UPF. Mikołaj, a friend of mine, at the time studying in Toronto, invited me to the center of Warsaw to play snooker and chat. During the game (which I lost), he told me that he had an idea. This was a bit worrying –his ideas were often interesting but overly ambitious. Nonetheless, he suggested we go to a nearby café to discuss it.
Once we were there, and had ordered our drinks, he revealed what he had in mind. He had stumbled upon some demonstrations of cars made in the then-experimental Unreal Engine 5. Notably, despite their excellent quality, the videos showed a live game played on an Xbox One –a solid but unimpressive piece of hardware. The videos made Mikołaj think about an old game he had played in primary school, Mad Tracks, released back in 2006. His idea was simple: to make a game enhancing the original spirit but with modern-day technology, an expanded feature set, and a multiplayer mode. He envisioned it as a “fun project to do on summer holiday.” I agreed to help, even though I knew it would take a huge effort. And so it was. One year later, it is still a work in progress, but we are constantly moving forward.
As we work in a team of two, there are no clear job titles. We both have to be ready to do whatever is necessary –but we have developed a slight specialization. I focus more on the artistic side of the game, while Mikołaj works on the mechanics and backend.
Igor Trujnara, BDBI student, left, and Mikołaj Kawalec, the other author of Track Racer.
My role in the project has a few parts. The first, perhaps the most important, is creating 3D models for the numerous objects in the game. This obviously includes the cars but also level elements, decorations, and power-ups. I make everything using a free, open-source modeling program, Blender. It is a powerful tool, but learning it takes time and dedication (a theme bioinformatics students may recognize). Fortunately, I had worked with it during the pandemic, mostly out of curiosity.
Many of the models were a pleasure to work with –most importantly the race car, inspired by classic sports cars, which now serves as the main vehicle in the game. Others proved to be painful, especially one of them, the shared suspension model for all the cars. Apart from its high complexity, it required rigging, i.e., creating a virtual skeleton which defines the model’s allowed movements. Luckily, I have been able to finish it, and it is already in the game.
Suspension asset rendered in Blender. / Image: Track Racer
There is one technology which has great potential, but so far has found only limited use in the project: photogrammetry. It is a technique which creates models of real-life objects based on a large number of photographs (about 200 per object yields good results).
Even with this much data, the model generated is not fully game-ready. It is high-quality but usually has orders of magnitude more geometry than necessary to convey detail. Every model requires manual processing, which involves heavy geometry reduction (in one case, from 5 million vertices to just 10 thousand) and creation of a normal map which allows the game to visually simulate fine detail.
In the end, it is possible to create accurate models with photorealistic textures with a significantly lower effort than a normal process would take. With photogrammetry, we have scanned a chess set, which now forms part of our first level (hopefully, you will be able to see it in full soon).
Even though much of my focus is put on assets, I do a substantial amount of work inside of Unreal Engine (UE) itself. It is a well-known professional tool offered on good terms by Epic Games – developers can work for free and are only supposed to pay once their game generates a substantial revenue. Unreal Engine 5 has brought many improvements which make our game more optimized and easier to implement.
Out of them, two are the most notable. The first is Nanite, an algorithm which automatically generates levels of detail using virtualized geometry. In simple terms, this means the game creates a few versions of each object with varying detail, and then chooses which one to display based on distance and visibility of the object. This feature allows games to handle thousands of high-quality models with ease. The other is Lumen, a brand-new live illumination system which allows such features as dynamic reflections and shadows without creating an excessive performance cost.
A sample level of the game rendered in Unreal Engine 5. / Image: Track Racer
My work in the engine is split into a few parts. A very obvious one is importing the models I have made and creating materials for them, all of which is relatively easy in UE. In addition to that, I work on the interface and menus for the game. This is mostly a visual task done using a built-in editor. I make all the UI graphics myself using another piece of free software, Inkscape. Only the fonts I use were found online.
Beside all the visual work, I have to do a lot of coding as well. Unreal Engine uses two different ways of coding, both of which should be employed for optimal results. The first is called Blueprints and is based on visual nodes, which pass values to each other. The second is plain old text-based coding, which in this case is done in C++ – an old but very popular programming language, which we also happen to study in the degree.
Working on the game takes time and effort, but I feel it is an enjoyable, valuable experience and a good complement to my degree. If you want to follow the development, check out our Instagram page, where we publish regular updates and will inform you about all important events.