Nicolas Wejdell

Project Havtorn

Havtorn is a game engine with a custom, integrated editor that I started building in my spare time, starting in 2021. The goal was always to develop games with it, though the greatest rewards so far have been the cultivation of skills in building a thought-out, usable and modular game engine architecture. Despite most of the work being done by myself exclusively - in late evenings after a full day's work - Axel Savage and Aki Gonzalez have always been my biggest supporters, and have done work on the project when able. We now have a small group of former class mates from The Game Assembly working on the first project. Please have a look at some of the highlights of the development below, or find the repo here.

Shader Hot Reloading

Reloading shaders while the engine is running vastly increases your iteration speed and simplifies the debugging of old and new graphics features.

Asset Hot Reloading

The gif above shows the first iteration of hot reloading assets, where for any asset that was originally authored in an external program such as Blender or Photoshop, the registry can dynamically reimport it as soon as the source file (fbx, dds) changes on disk. As an example, a mesh can be placed in the editor, then the source file watching on the asset be toggled, and whenever the fbx is changed on disk the engine reimports it with the same settings on the fly.

Visual Scripting

In the example we see a physics trigger getting a ScriptComponent referencing the test script asset we authored in the separate script editor. When the block suspended in the air above overlaps with the trigger volume, we change the mesh from a block to the clock mesh, and the green point light in the foreground is toggled off. This was set up to show interactions between a few separate entities, our so called data bindings, and a non-trivial entry point for the script (OnBeginOverlap, instead of a simple Tick for example).

Skeletal Animation

We purposefully serialize our skeletal mesh animations down to our own data formats and run the math using those. Other solutions insteadmake a thin wrapper (or no wrapping at all) around imported assimp scenes, provided they are also working with assimp. I prefer our solutionas it gives us more control in implementing more advanced features such as inverse kinematics now that we’ve split up the logic into clear chunks.

Render Based Picking

Havtorn uses information stored in a separate render target to resolve its picking in the editor. By rendering the identifier of each entity onto the screen, our picking becomes pixel perfect and completely decoupled from the physics system.</p>