← Back to work

Engine

SufferEngine

Private custom C++ real-time engine: runtime architecture, editor tooling, rendering, scripting, audio and Linux packaging.

Custom C++

engine/runtime architecture

Runtime + editor

scene, tools and render pipeline

Private

source-safe public case study

Linux

CMake/AppImage hardening

Second-layer evidence

Technical snapshot

A proprietary C++ engine project used as a systems-heavy case study. It demonstrates ECS-style architecture, EngineManager orchestration, Scene/GameObject/Component/System organization, DisplayList/Command render flow, OpenGL resources, Dear ImGui editor tooling, Lua scripting, SoLoud audio, diagnostics and Linux/AppImage hardening without exposing private source code.

Architecture organized around EngineManager, Scene, GameObject, Components, Systems, DisplayLists and Commands.
Engine modules cover resource management, OpenGL rendering, framebuffers, shadow passes, post-processing, Lua scripting, SoLoud audio and Dear ImGui editor tooling.
ResourceManager separates logical resources from GPU-side data and synchronizes buffers, textures, cubemaps, framebuffers and shaders.
Render flow uses command/list submission: systems generate work, RenderManager executes commands against OpenGL resources.
Linux work includes CMake build support, sanitizer/GDB scripts, OpenGL diagnostics and AppImage runtime-only packaging.
Presented honestly as a private technical case study, not as a commercial or production-grade engine.

Video

Why this project matters

SufferEngine is the strongest C++ systems project in my portfolio. It is not positioned as a commercial engine or a pure graphics demo. Its value is architectural: it shows that I can reason about engine-level organization, runtime loops, resource ownership, rendering commands, editor tooling, scripting, audio, platform issues and packaging.

The source code remains private, so this page documents the system without exposing implementation details. The goal is to communicate what exists, how it is organized and which engineering problems it demonstrates.

High-level architecture

The engine is organized around a central Manager that owns the main loop and coordinates the main subsystems:

  • Window/Input and OpenGL context.
  • Scene management.
  • Resource management.
  • Rendering.
  • Audio.
  • Lighting.
  • Dear ImGui editor interface.
  • Systems for transform, hierarchy, script, light, audio and render.

A simplified view:

Application demo
  -> EngineManager
    -> Window / Input / Interface
    -> Scene
       -> GameObject
          -> Transform / Geometry / Material / Script / Light / Audio / Child components
    -> Systems
       -> Transform / Hierarchy / Script / Light / Audio / Render
    -> DisplayList / Commands
       -> RenderManager / AudioManager
    -> ResourceManager
       -> buffers / textures / cubemaps / framebuffers / shaders

Runtime model

The project uses an ECS-style model rather than a data-oriented ECS. Scene objects are composed from components, and systems iterate over those objects to perform work. This demonstrates separation of concerns — object data, behaviour systems, rendering commands and resources — while still being honest about the trade-off: it is flexible and readable, but not designed as a cache-friendly archetype ECS.

Render and resource flow

The renderer is built around a command/list style flow. Systems generate display lists containing commands such as geometry drawing, depth passes, shadow maps, point-light depth passes, skybox rendering and post-processing. The RenderManager executes those commands, while ResourceManager owns or synchronizes the data needed by OpenGL: vertex buffers, index buffers, textures, cubemaps, framebuffers and shader programs.

This is the core professional signal: the project does not simply call drawing code directly from gameplay. It separates data, submission and execution into different responsibilities.

Editor tooling

The editor layer uses Dear ImGui and includes practical runtime tools such as scene hierarchy, inspector-style panels, project browsing, game viewport, lighting/material controls and audio interaction. This turns the engine from a rendering sample into a small editor/runtime environment where scene state can be inspected and changed interactively.

Scripting and audio

Lua scripting is integrated through a script component that exposes engine actions such as transforms, component changes, geometry/draw-mode changes and audio triggers. SoLoud is used for audio playback, including 3D audio concepts. These features show that the runtime is not only a renderer: objects can own behaviour, state and sound.

Linux hardening and packaging

The enhanced version includes Linux/CMake build support, run scripts, sanitizer builds, GDB execution helpers, OpenGL diagnostics and AppImage packaging. A dedicated public packaging flow creates a runtime-only demo while excluding source code, headers, tests, dependencies, scripts and private build artifacts.

This is important professionally because it shows platform and distribution thinking, not just feature implementation.

Technical trade-offs

  • Global engine access vs explicit dependencies: a central singleton-style engine object simplifies demos but increases coupling and reduces testability.
  • Flexible component map vs data-oriented ECS: easy to extend and inspect, but not ideal for cache-local performance.
  • Command-based render flow vs direct calls: cleaner separation, but more ownership and lifetime complexity.
  • Runtime editor convenience vs strict runtime correctness: editor tooling is useful, but it increases synchronization and state-management complexity.
  • Relative asset paths vs robust runtime asset root: quick to use during development, but fragile for packaging and distribution.

What I would improve next

  • Centralize runtime asset path resolution.
  • Separate demos/samples from real automated tests.
  • Add tests for resource handles, display-list ownership and component retrieval.
  • Reduce global engine access through explicit context passing.
  • Harden Lua scripting boundaries.
  • Add architecture diagrams and a public technical write-up.
  • Keep public packaging source-safe and repeatable.

Professional takeaway

SufferEngine is the portfolio proof that I can go below engine-level APIs and reason about the structure of a runtime system: update order, object/component organization, resources, render commands, editor tools, scripting, audio, platform debugging and packaging. It is the best project for roles that care about C++, tools, engine-adjacent systems and maintainable low-level software.

Gallery

SufferEngine screenshot with lighting
SufferEngine editor and scene screenshot