Lamorna Engine - lite 3D game engine with software renderer

Hi guys, first post here, but I’ve been around the network for awhile, watching Handmade Hero et al. and keeping an eye on the various featured projects. I’d like to share what I’ve been working on, a lite handmade 3D game engine, featuring a robust software renderer. I’m self taught, and wrote the game systems myself from scratch. I have a website for my work, with a playable demo here. On the website is a bunch of posts talking about the different components. Please check out the demo, read the posts, hopefully they are informative, I’d love to get some feedback, answer any questions and share what I know. The engine features at a glance:

  • Robust software renderer: HD, sort-middle binning architecture, hierarchical tiled rasteriser, vectorised, threaded, hierarchical z buffer, deferred attribute fetch & shading.
  • Simple shading scheme: interpolated 3 channel colour and point sampled mip-mapped texture pass.
  • Simple axis aligned collision scheme, accelerated with a loose grid BVH
  • Spatial sound
  • Job system: Frame is characterised as jobs fed into custom thread pool, performance critical sections highly parallelised
  • Dynamic lightmaps: low resolution textures on world surfaces accumulate colour from light sources for ‘painting’ effect






Thanks for your time!

Edited by Trevor Nagel on
This looks really good, especially with the painting on the floor while running around. So from what I understand your engine runs at 60 fps currently, or is that just for vsync and the fps is actually higher? What are your next plans?
Thanks for the interest Lares, the engine runs with a fixed time step that keeps it locked to 60 fps. As for future plans, the engine is pretty much done. I'm going to be using it to make a series of game demos going forward, and only do piecemeal technical work. There's a bunch of visual improvements I'd love to add: texture filtering, blending, a proper lighting model etc, but there's so little headroom with software rendering. I'm considering a low resolution renderer with up-sampling to buy more performance on lower end machines, and that might give me room for more features.
I just tried it but unfortunately it doesn't recognize my keyboard layout and I can't use the usual shortcut to switch to a qwerty layout. Even changing the layout before starting the exe doesn't work. There is a wiki article about using scancodes to have layout independent keyboard inputs (on Windows).

The behavior of the application is weird: after alt-tabing, clicking in the window, doesn't give the focus to the game. Or at least it's not consistent. And when it gives the focus to the game, it keeps shooting until I left click again. When it doesn't give the focus, it still hides the cursor, even when it outside the game window. Also when the application doesn't have the focus I would prefer it doesn't hides the cursor at all.

Just turning left/right with the mouse, the view "shakes". Here is a video (although it's not that obvious in the video).

I know it's a demo but it would help to be able to configure the mouse sensitivity and be able to go fullscreen, or at least maximize the window.

I'm confused about the sphere. At first I though it was the player model (in a 3rd person) but it seems to be the weapon in an fps. But it's weird because it looks like the camera is rotating around it and it also looks like it's moving with the camera. If it's a weapon, it should be fixed in the view (a view model).

Holding down jump restart the jump sound in a loop.

And the movement speed (for the small time I manage to move) should be faster.

Apart from those things it looks great, it doesn't feel any different than a hardware renderer.
Thank you for trying out the demo and taking the time to report these issues, I really appreciate it!



I just tried it but unfortunately it doesn't recognize my keyboard layout and I can't use the usual shortcut to switch to a qwerty layout. Even changing the layout before starting the exe doesn't work. There is a wiki article about using scancodes to have layout independent keyboard inputs (on Windows).


I'll check that article out and implement this as soon as I can.

The behavior of the application is weird: after alt-tabing, clicking in the window, doesn't give the focus to the game. Or at least it's not consistent. And when it gives the focus to the game, it keeps shooting until I left click again. When it doesn't give the focus, it still hides the cursor, even when it outside the game window. Also when the application doesn't have the focus I would prefer it doesn't hides the cursor at all.


I'm painfully aware of this, and have spent some time over the course of development trying to fix it. The cursor hiding has been particularly irritating because no matter what scheme I try I can't get consistent cursor behaviour across my dev machines. I've tried all the cursor related functions listed on MSDN, but I obviously haven't gotten the incantations right. Any suggestions would be most welcome.

Just turning left/right with the mouse, the view "shakes". Here is a video (although it's not that obvious in the video).


It's awesome that you made a video, you're a champ! I use raw input for the mouse and so I had to hand roll mouse acceleration and I think it comes down to me doing a poor job! I'll work this over. Once again any resources you could point me to would be appreciated.

I'm confused about the sphere. At first I though it was the player model (in a 3rd person) but it seems to be the weapon in an fps. But it's weird because it looks like the camera is rotating around it and it also looks like it's moving with the camera. If it's a weapon, it should be fixed in the view (a view model).


This has got to be a good example of dev blindness. After reading this I went back and saw exactly what you were saying. I think I'll put in a player weapon model to make it more visually obvious what the intent of the sphere is.

Holding down jump restart the jump sound in a loop.

And the movement speed (for the small time I manage to move) should be faster.


I'll fix those.

Thanks again for the feedback!

Edited by Trevor Nagel on