Tacx Trainer Software – Level Update

Years ago, I made the graphics for the Tacx Trainer Software Virtual Reality (including tools and shaders).
But after about 8 years, the first levels started to feel a bit outdated, so I got the opportunity to revamp the Mediteranian/Italy levels.

The main restriction was that the road-structure had to remain exactly the same.
But we also didn’t want the levels to suddenly become a lot more demanding (hardware-wise).

I made a lot of new vegetation (grass, plants, trees), and new water-, terrain- and vegetation-shaders among other things.



Improved Terrain UV-mapping

As part of improving these levels, I also created a terrain shader that reduces the vertical UV-stretching that is typical for standard heightmap-based terrains:
(the level itself wasn’t fully finished however, at the time of these screenshots)

The making of Gem Eater

My first mobile game

It took me long enough, but last year I finally decided to make a mobile game.
The main reason being that I felt I should make a smaller game for once, and fully finish it, rather than the heap of unfinished (bigger) game projects I have.
I also wanted it to be accessible to most people, so a mobile game seemed like the best choice then.

I have to admit that mobile games, and casual games, are actually a bit out of my comfort zone. But that only makes it more of an interesting challenge to design such a game.
I didn’t have to make it a casual game, but I felt like I should make it as easy to get into as I could (to a degree), and IMO that seems like one of the key-aspects of a casual game.
(This because I noticed that the games I made before often required me to explain to people how to play, rather than people understanding it immediately themselves.)

The game

In Gem Eater you play as an underground gem-eating snake. Just drag the snake’s head to move him around.
You eat your way through a screen filled with dirt, stones(blocks) and gems; trying to eat as much gems while making big combos, without getting stuck.

You gain points by eating gems, these come in 3 colors, red, yellow and blue.
Each time you eat the same color as the last, you increase your gem combo, earning you more and more points each time. But eat a different colored gem, and the combo ends.

At first the screen is only filled with dirt and gems, you’re free to move around carelessly, but as you eat your way through, stone-blocks will fall down among the dirt and gems. These stone blocks are impassable, and slowly but surely the screen will fill up with these, making it harder for you to get around, until eventually, you get stuck. That is, unless you reach the target score first.

Designing the mechanics

Comming up with the game concept and designing the mechanics was actually rather easy. I knew I wanted to make something similar to old arcade games, which quickly made me think about games like Tetris, Snake and Bejeweled. And it didn’t take long for me to come up with a bunch of ideas involving falling blocks and snakes eating gems.

Now don’t get me wrong, my idea wasn’t to copy existing games, I always want to make fully original games, I just wanted something with a simple concept, structure and controls as these games.

I had the main game mechanics pretty much entirely worked out in my head before even making the first prototype.
After making the prototype however, finalizing the entire game took a lot more time to figure out.
I had expected to finish the game in a couple of weeks in my spare time, but it ended up taking months.

Finalizing the game and adding extra content

At first it was just gonna be like Tetris; no stages, you just play until you get stuck, and that’s it. But I realized it would be more fun to have to try to reach a target score, which clears the solid blocks and makes you advance to the next stage, which has a higher target score.
I also felt (And still do) like it would be best to have every stage continue from the last (as in: keep all tiles with dirt and gems the same), rather than have you move to a new screen as you go to the next stage. Because this way you can save gems for later, and it just makes all the stages feel like one big level rather than a bunch of small ones.

However I felt like the game was a bit too short and lacked reason to play the game over and over, and it took me long to decide what to do against that.
Eventually I came up with a bunch of variations of the snake, each with a different power that could help you. And I decided to make the player unlock these one by one.
But it wasn’t clear to me what would be the best way to unlock these.
At first I made it so you needed to reach a certain highscore for each to unlock. But I eventually made it so you earn coins for completing stages, and more coins the higher the stage. And you could then use these coins to unlock the next snake.
The benefit this has over unlocking through highscore, is that every game you play brings you closer to your goal of unlocking the next snake, even when you don’t play as well as before. And since the main purpose of it was to give the player a reason to keep playing, I went with this approach.

All the snakes

I also added in achievements and a leaderboard through google play.

After having played the game myself a bunch, and becoming very good at it, I found that starting at stage 1 each time was a bit tiresome. (Even though that was actually one of the core aspects of the game I wanted, like old arcade games)
So I thought about having the player be able to start a game at a higher stage, but I didn’t know how to make that work exactly. With how many points would he start? Making it too low and it’s pointless to do when you’re trying to beat a highscore, and making it too high would be unfair as well.
So I thought about making the player able to set checkpoints at a stage while playing, and when you start from that checkpoint (CP for short) later, you’ll have exactly the same points and everything as when you initially set it. But I didn’t want the player to just be able to start from a CP as soon as he got there for the first time. Because that would cause the player to set the CP as high as he could, and would ruin the fun of the game. I kindof wanted the player to only be able to set a CP at stage 10 when he is able to get to stage 20, for example. But I couldn’t think of a good way to do this without making it all too complex.
In the end I made it so you can only set (and start from) a CP by spending coins, and the cost increases exponentially the higher the stage. This ensured that it is only beneficial to set a CP at least about 5-10 stages lower than the highest stage you can get to. (Because when you set it higher, it would cost more coins to start from the CP than you could make back)
Honestly, I’m still not entirely sure if that was the best approach, but I think it’s good enough.


Most people were really positive, and I know a couple of people that really loved it and played it a ton. And I’m really happy for that.
But In the end though, the game went pretty much unnoticed, most of the people that played it are people I know personally.
I also added in (optional) rewarding ads, more as an experiment than anything else, but I’m not even close to reaching the minimum number of views to even have the chance of making any money on it.
I didn’t expect it to become a huge success or anything, especially since I spent no money on advertising the game, I just posted about it on facebook and the Unity forums and that’s about it.
But still, when I compare it to years ago when I posted flash games on Kongregate, every game there was easily played a couple hundreds of times after just a single day without telling anyone about it. In the grand scheme of things, that’s still not much, but at least it’s something. Now on the play store, I think not even a single person encountered my game without being directed there by me (either in person or through a post of mine).
But it shouldn’t really be news to anyone that if you post a game on the play store, without advertising it in one way or another, it’s (most likely) never going to reach anyone.

One problem with my game, is that it’s visual style isn’t really attracting anyone I think. I mean I don’t think it looks awful or anything, but it does look rather generic. And I don’t really think any screenshot or video of the game will ever make anyone think “wow, I want to play that!”.

If I wanted more people to play this game, I should have advertised this game better, and made some better promotional images (or have these made) at the very least.


Although it’s ofcourse a rather small game, I’m rather proud of the it. The game mechanics are truly original. And I honestly feel like they are simple but deceptively deep. The way everything influences everything else; every tile you eat causes the tiles above to fall down, changing the shape of the level. The way you eat around the solid blocks defines the wall, rooms, tunnels of the level.

It’s easy to start playing the game, but the more you play the better you get at it because you start to understand the consequences of your every action and you start to see the strategic aspects of the game.

The game is available for free on the Play Store:
Google Play Link

Worn Edges

Worn Edges

WORN EDGES is a tool I created in 2013 that allows the user to generate a worn look (amongst other things) for their props. It is written as a Unity3D editor extension (as such it only works within unity).
I wrote a small post on it when it was early in development, you can see it here.

Tori, before and after using the WORN EDGES tool

It works by generating a lot of different maps, which get combined into a single “combined map”, which details the level of wornness for each pixel of the texture. This combined map is in turn used to alter the original, clean, texture.

a simple example of the principle
a simple example of the principle

The tool can create a lot of different maps:

  • 3d, 2d and 1d noise map
  • sharpness map
  • ambient occlusion map
  • directional occlusion map
  • angle falloff map
  • distance map
  • wood map
  • mask map

How these maps are created and combined is fully customizable, to create the effect the user desires.
As such, it can create more than just a worn edges look (see screenshot below).
tikis with different maps

In general, for just a worn edges look, only the 3d noise, ambient occlusion and sharpness maps are used. The other maps are generally for more specific effects (see screenshot above).

The models this tool is used on should have a clean UV layout, without overlapping triangles (although symmetrical or otherwise identical geometry can often share uv-space without a problem). But it can also bake everything to a 2nd set of UVs, for example the auto-generated lightmap UVs (that is often used in Unity3D). As such you can actually also use this to bake multiple textures with overlapping UVs into a single texture that uses these 2nd UVs.

wooden - worn edges
ball_variations 2_ballDevelopment
worn (edges) (worn) edges

It’s available on the Unity Asset Store.

Here’s a relatively recent (at the time of writing) demonstration movie:

and here’s an older demonstration (a bit outdated, but still relevant):
(Unfortunately though, it is kind of slow)

Golden Circle Level

The GoldenCircle Level is the newest for the Tacx Trainer Software Virtual Reality (see my previous post on this software here). It’s the biggest yet, containing more than 40 km of road, in a region of 4 x 4 km.

The level has an oriental theme, and consists of extremely varied Chinese and Japanese scenery.

I created the full Golden Circle Level, the bulk of the work was done in Spring and Summer of 2014.

GoldenCircle GoldenCircle
GoldenCircle GoldenCircle
GoldenCircle GoldenCircle GoldenCircle
GoldenCircle GoldenCircle GoldenCircle

More screenshots can be found on Flickr.



SNOWIFY is a tool I created early 2013 that allows the user to generate thick packs of snow on any prop.
For when a simple snow shader isn’t enough.

It started of as a hobby project; I had just had to make a snow level for work (more precisely, a snowed version of an existing level), for which I had created a couple of simple snow shaders (using the angle of the surface normal to determine snowiness).
But when making that level, I found that in some cases it would have looked better if the snow had a volume, rather than being flat.
So afterwards I came up with an idea to create snow meshes based on the mesh of the object it was resting on, and started working on a tool to do that in my spare time.

Since I nowadays work primarily in the Unity3D engine, I made this tool for use in Unity.

houses with snow

The tool allows for complete control over the snow’s thickness, angle, direction, material, smoothness, and various other settings.
The snow meshes are also automatically unwrapped and textured.

jeep with snow

It’s available on the Unity Asset Store.



Snowify was used by Hinterland Studios for the creation of their game “The Long Dark”:
(it’s being listed as one of their favorite packages from the Unity Asset Store)

Projection Correction

Some time ago I had to take a bunch of screenshots of the TTS VR for advertising purposes.
They needed a lot of screenshot for various formats (web banners, magazines, …),
so they tend to recrop the screenshots I send them a lot, depending on the need and space,
because of that I have to add some extra space outside of the actual screenshots, which I simply do by increasing the fov of the camera I render the screenshots with.

The thing is though, that the higher the fov, the more perspective distortion you get away from the center.
(a logical result for a projection of a 3d space onto flat plane)
This isn’t essentially a bad thing though, it’s actually correct, if the image is viewed from straight in front of the center, and at the right distance, so it’s looked at with the same angular size as the image was made (the fov).

The problem, is that these screenshots sometimes get cropped in extreme ways, by which I mean, far to one side, moving focus away from the center.
This causes the image to look strange, as the content is skewed and stretched.

So I decided to make something to counter that.

I figured that if the 2d space that was projected on was a spherical shell instead of a flat plane, there would be no distortion.
A spherical shell however can not be mapped to a flat plane without distortion (obviously, just look at maps of the earth),
but, a cylindrical shell totally can.

So, using math and logic (whoo) I created a post effect that manipulates the image as if it was projected on a cylinder (with either a horizontal or a vertical axis), and then unfolded.

This way it can make sure there is no distortion either horizontally, or vertically, depending on whether the image is in landscape or portrait.
Because of this, you can move focus in this direction (horizontal or vertical), without it looking off.
A side effect of this is that you can easily stitch together screenshots made by rotating around the cylinder-axis.

rendered with projection correctionAn extreme example, the horizontal fov is more than 200 degrees, this isn’t even possible with normal rendering (only <180 degrees).


There are a few setbacks however,
firstly, unlike normally (projecting on a flat plane), not all straight lines (in 3D) are straight in the image, some are curved,
secondly, a lot of space is wasted in the image (the black parts), because of the extra cylinder-mapping, which means you have to render at a higher resolution for the same detail.
and lastly (and definately least), there is no filtering done in the cylinder-mapping, so the result can be a bit jaggy (and moreso the bigger the fov is).

I also made a second mode, which is a bit simpler and less extreme,
as it only streches 1 of the axes, just so proportions look correcter. This one is actually more difficult to explain, just look at the pictures.


I’ve made this post effect available for free on the Unity Asset Store:


It requires a Unity Pro license in order to work though.