Jet
A tiny, fast 3D rasteriser for embedded devices. Dependency-free, fixed-function, modern C++17. Ship smooth software-rendered 3D on a microcontroller.
Jet is built for tiny, real-time 3D
A fixed-function software rasteriser, written in modern C++17, with no dependencies and a fixed memory budget.
Jet is a tiny, dependency-free, fixed-function 3D rasteriser written in modern C++17. It is designed to run on low-performance embedded hardware with limited memory such as the ESP32, STM32 and similar embedded MCUs, yet it is portable enough to run on a desktop PC, Raspberry Pi, or anything else.
Jet runs entirely in software using fast, integer-only arithmetic. It exclusively uses 16-bit RGB565 color natively for fast output to 565 displays such as the ST7796, ILI9488 and other similar SPI displays.
On an ESP32 S3, it is capable of rendering approximately 15000 triangles/second (flat shaded), or approximately 250 on-screen triangles (after culling) at 60fps at 480x320, or 500 at 30fps which puts it somewhere between the Sega 32X and Sega Saturn in terms of performance at that resolution.
Feature Overview
A look at what Jet can do, almost all of it individually toggleable at compile time.
Rendering
- Triangle and quad meshes with per-face materials
- Flat, Gouraud, Phong and wireframe shading
- Affine and perspective-correct texture mapping, optional bilinear filtering
- RGB565 framebuffer throughout native to most embedded displays
- Optional Z-buffer, or painter's-algorithm sorting when memory is tighter than CPU
- Back/front-face culling, depth bias for decals and shadows, per-object blend modes
- Screen-door alpha and noise dithering for cheap transparency
- Per-object distance-based fade and scene-wide depth fog
- Interlaced or checkerboard rendering with optional reconstruction
Lighting, Post-FX & Tooling
- Ambient and directional lights with flat / Gouraud / Phong shading
- Optional cheap depth-darkening for engines without a real light rig
- “Free” post effects: CRT scanlines, cell-shading
- Buffered post effects (desktop / large-RAM): FXAA, bloom, motion blur, chromatic aberration, pixelation
- Primitive helpers: cube, sphere, cylinder, capsule, pyramid, grid, plane, quad, billboard
- Minimal Wavefront
.objloader - Optional screen-space picking (zero cost when disabled)
- Small custom shader entry point if you need to step outside the fixed-function path
What is it good at?
Jet is opinionated. Its sweet spot is:
- Stylised / retro 3D - flat-shaded, gouraud-shaded or affine-textured geometry, RGB565 framebuffers, the look of late-90s console / arcade 3D.
- Hard real-time, fixed budget - every feature is a compile-time switch in Config.hpp, so you only pay (in flash, RAM and CPU) for what you actually use. Disable Z-buffering, perspective-correct texturing or per-pixel lighting and the code for them simply isn't compiled in.
- Tiny memory footprints - fixed-point math throughout the hot path, an optional half-width framebuffer mode, optional interlaced field-buffer mode for 60 Hz on parts that can't sustain a full progressive frame, and an optional checkerboard reconstruction mode for desktop.
- Predictable behaviour - no allocations on the hot path, no virtual dispatch in the rasteriser, no hidden globals. The same scene renders the same way on every platform.
If you want PBR, real-time global illumination, mesh shaders or 4K then this is not the engine for you. If you want to put a smooth, lit, textured 3D scene on a 320×240 LCD attached to a microcontroller, or to render a low-poly software-rasterised aesthetic at silly framerates on a desktop, Jet is built for exactly that.
Free and open source
For hobbyists, academics, open-source projects and anyone happy to ship their source.
Jet is distributed under the GNU Affero General Public License v3 (or later). You are free to use, study, modify and redistribute Jet under the AGPL. In short: anyone you distribute a binary to — including users who interact with it over a network — is entitled to the complete corresponding source code of the application that links against Jet, under the AGPL.
If you're a hobbyist, an academic, an open-source project, or a company that ships your source code anyway, you almost certainly want this licence and you do not need a commercial licence.
Commercial Licensing
For shipping a closed-source product that links against Jet — i.e. you cannot or do not wish to release your application's source under the AGPL — a commercial licence is available from CubeCoders. The commercial licence removes the AGPL's source-disclosure requirement for your product while leaving the upstream Jet codebase itself unaffected.
Pricing is tiered by your organisation's annual global revenue. Licence fees are quoted in GBP.
Hobbyist / Indie Individuals and organisations with global revenue under £1M.
£100
first year · renew at £50/yr
Organisation (Mid) For organisations with global revenue between £1M and £2.5M.
£500
first year · renew at £250/yr
Organisation (Large) For organisations with global revenue above £2.5M.
£1,500
first year · renew at £750/yr
A Jet commercial licence covers use of the official upstream source from the Git repository for up to one year from the date of purchase. After that, you can renew at 50% of the up-front cost for another year, or simply continue using the version of the source tree as of the end of your licence period with no further payment, you just won't be entitled to any commits made upstream after that date under the commercial terms.
Revenue tier is based on the total global revenue of your organisation (and any parent or controlling entity) over its most recent financial year.
Interested in a commercial Jet licence?
Purchase isn't available online yet — for now, get in touch and we'll arrange the licence directly.