The Offender Engine Book
414 chapters across 11 volumes, plus a companion track —
a cross-platform engine built from nothing, one chapter at a time.
Sign in if you already own it, or
see what it costs. Every chapter below is readable as a
sample right now.
Book 1 — Foundations, the RHI, Five Backends & a 2D RPG 31 chapters
- Preface
- Chapter 1 · The Landscape & the Plan
- Chapter 2 · CMake, Ninja & Git — A Working Tutorial
- Chapter 3 · Testing, CI/CD & Automation
- Chapter 4 · Engine Core
- Chapter 5 · The Platform Layer I — Window & Events
- Chapter 6 · The Platform Layer II — Input, Timing & the App Loop
- Chapter 7 · The Threaded Loop & Job System
- Chapter 8 · Resources & Audio
- Chapter 9 · The RHI — One Graphics Boundary
- Chapter 10 · The First Backend — Device, Swapchain, Clear
- Chapter 11 · The First Frame — The Triangle
- Chapter 12 · Text — the Render Buffer & Baked Fonts
- Chapter 13 · Notifications & a Basic UI
- Chapter 14 · Three More Widgets
- Chapter 15 · Scrolling — ScrollView & ListView
- Chapter 16 · Containers & Dialogs
- Chapter 17 · Backends You Load, Not Compile
- Chapter 18 · The Second Backend (Direct3D 12)
- Chapter 19 · Vulkan
- Chapter 20 · Metal (macOS & iOS)
- Chapter 21 · OpenGL ES — the Fifth Backend, on Android
- Chapter 22 · 2D Sprites — the `.ebsprite` Compiler
- Chapter 23 · A 2D Tile Canvas — the World the Sprites Move In
- Chapter 24 · A 2D Entity System — Things That Live in the World
- Chapter 25 · Scenes and Levels — Building a World from Data
- Chapter 26 · The Capstone — a Small RPG on Five Backends
- Chapter 27 — Twenty-One Environment Variables
- Chapter 28 — The Settings Store
- Chapter 29 · Gamepads and Virtual Sticks
- Chapter 30 · What We Built, and What Comes Next
Book 2 — Shaders & the Common Shader Language 22 chapters
- Chapter 1 · The Programmable Pipeline
- Chapter 2 · Coordinate Spaces & the Clip-Space Journey
- Chapter 3 · GLSL, Concretely
- Chapter 4 · Attributes, Varyings, Uniforms & Textures
- Chapter 5 · The Shader Wall
- Chapter 6 · CSL — the Language
- Chapter 7 · The Lexer
- Chapter 8 · The Parser & the AST
- Chapter 9 · Semantic Analysis
- Chapter 10 · The Typed IR
- Chapter 11 · Reflection
- Chapter 12 · The GLSL Back End
- Chapter 13 · The ESSL Back End
- Chapter 14 · The HLSL Back End
- Chapter 15 · The MSL Back End
- Chapter 16 · The SPIR-V Back End
- Chapter 17 · The Command-Line Driver
- Chapter 18 · The Compiled Shader Format
- Chapter 19 · Shaders as Assets
- Chapter 20 · Modules & `#include`
- Chapter 21 · One Source, Five Backends
- Chapter 22 — Techniques, Variants, and a Name to Ask For
Book 3 — Into 3D 26 chapters
- Chapter 1 — Meshes & the Importer
- Chapter 2 — The Depth Buffer & Cross-Backend Conventions
- Chapter 3 — 3D on Mobile
- Chapter 4 — Procedural Primitives
- Chapter 5 — The GPU Transform
- Chapter 6 — Cameras
- Chapter 7 — Scenes & Frustum Culling
- Chapter 8 — Spatial Partitioning
- Chapter 9 — Desktop Polish: Anti-Aliasing, Fullscreen, and Portable Assets
- Chapter 10 — The Scene Graph
- Chapter 11 — Entities, Movement & Collision
- Chapter 12 — Particles & Projectiles
- Chapter 13 — Enemy AI & Pathfinding
- Chapter 14 — Textures, Lighting & Shadows
- Materials: Normal Mapping, Parallax & PBR
- Chapter 16 — Terrain: Chunked LOD, Streaming & Shadows
- Chapter 17 — Atmosphere: Sky, Fog, Water & Foliage
- Chapter 18 — The Water Problem
- Chapter 19 — Water Refraction & Underwater
- Chapter 20 — Billboards: Alpha-Test, Vegetation & Particles
- Chapter 21 — Water Refraction Refinements
- Chapter 22 — Level of Detail
- Chapter 23 — Day/Night Cycle
- Chapter 24 — Weather: Volumetric Clouds
- Chapter 25 — The Sun in the Lens
- Chapter 26 — Into 3D, in Review
Book 4 — The Editor 26 chapters
- Chapter 1 — Dear ImGui on our RHI
- Chapter 2 — The Dockspace & the Viewport
- Chapter 3 — The Other UI: Binding & MVVM Foundations
- Chapter 4 — Reflection & the Inspector
- Chapter 5 — Picking
- Chapter 6 — The Fly Camera
- Chapter 7 — The Translate Gizmo
- Chapter 8 — Rotate & Scale Gizmos
- Chapter 9 — Undo/Redo
- Chapter 10 — The Asset Palette & Placement
- Chapter 11 — Terrain Sculpting
- Chapter 12 — Lights & Environment
- Chapter 13 — Saving the Scene: the `.ebscene` Format
- Chapter 14 — Play-in-Editor
- Chapter 15 — The Runtime UI, Done Right: MVVM in Full
- Chapter 16 — Author a Level, Ship It
- Chapter 17 — A World of Tiles
- Chapter 18 — Streaming the World
- Chapter 19 — Placing Meshes: Self-Contained, Textured, and Collidable
- Chapter 20 — Holes, and Enterable Interiors
- Chapter 21 — Material Maps
- Chapter 22 — Richer Lights
- Chapter 23 — Editor Tools
- Chapter 24 — Brush Geometry
- Chapter 25 — Surfaces & the Texture Library
- Chapter 26 — Editor Design Notes & Wrap
Book 5 — Characters & Animation 17 chapters
- Chapter 1 — The Landscape & the Plan
- Chapter 2 — Skeletons & the Rig
- Chapter 3 — Animation Clips
- Chapter 4 — Skinning, Slowly, on the CPU
- Chapter 5 — Characters in the Scene
- Chapter 6 — The Compiler Grows Arrays
- Chapter 7 — GPU Skinning on Five Backends
- Chapter 8 — The Animation Player
- Chapter 9 — Blending
- Chapter 10 — The State Machine is Data
- Chapter 11 — Locomotion
- Chapter 12 — Sockets & Attachments
- Chapter 13 — Import, in the Editor
- Chapter 14 — Animating in the Editor
- Chapter 15 — The Player, Embodied
- Chapter 16 — Rigging in the Editor, and the Format Writes Back
- Chapter 17 — Design Notes & Wrap
Book 6 — Physics 23 chapters
- Chapter 1 — The Landscape & the Plan
- Chapter 2 — The Simulation Clock
- Chapter 3 — A Library is Born
- Chapter 4 — Bodies & Integration
- Chapter 5 — Debug Draw First
- Chapter 6 — Broadphase
- Chapter 7 — Analytic Contacts
- Chapter 8 — Boxes: SAT with a Manifold
- Chapter 9 — Vs the World
- Chapter 10 — Impulses
- Chapter 11 — The Sequential Impulse Solver
- Chapter 12 — Friction & Materials
- Chapter 13 — Islands & Sleep
- Chapter 14 — Joints
- Chapter 15 — The Ragdoll
- Chapter 16 — IK: Constraints Run Backward
- Chapter 17 — Cloth: the Cape Unwelds
- Chapter 18 — Movement, Migrated
- Chapter 19 — Physics is a Data Problem
- Chapter 20 — The Editor & Five Platforms
- Chapter 21 — Destruction
- Chapter 22 — Wheels: the Raycast Vehicle
- Chapter 23 — Capstone: the Arena, and Design Notes
Book 7 — Scripting & Embedded Languages 34 chapters
- Chapter 1 — The Landscape & the Plan
- Chapter 2 — The Game Module ABI
- Chapter 3 — The Host API & a Real Player Controller
- Chapter 4 — Hot Reload
- Chapter 5 — State Across Reload
- Chapter 6 — Crashes at the Boundary
- Chapter 7 — Behaviors & the Registry
- Chapter 8 — The Editor Connects
- Chapter 9 — Play-in-Editor, Live
- Chapter 10 — Events & Triggers
- Chapter 11 — Game Data as Assets
- Chapter 12 — The Bridge
- Chapter 13 — Mobile: Static Link
- Chapter 14 — The Capstone: a Game, Iterated Live
- Chapter 15 — Design Notes & Wrap
- Chapter 16 — Animation Across the Seam
- Chapter 17 — The Seam Grows Physics (ABI v10)
- Chapter 18 — The Case, and the Shape
- Chapter 19 — sol2 and the Host DLL
- Chapter 20 — Binding the Engine
- Chapter 21 — Scripts Are Content
- Chapter 22 — Behaviors, and a Game in Lua
- Chapter 23 — Reload, Sandbox, Blast Radius
- Chapter 24 — C#: the Same Seam
- Chapter 25 — Binding the Engine to C#
- Chapter 26 — A Game, in C#
- Chapter 27 — The Course
- Chapter 28 — The Game Is Data
- Chapter 29 — The Game in C++
- Chapter 30 — The Game in C#
- Chapter 31 — The Game in Lua
- Chapter 32 — The Editor Speaks Three Languages
- Chapter 33 — The Quick Reference
- Chapter 34 — The Assessment
Book 8 — Advanced 3D & Shaders: Locking the RHI 31 chapters
- Chapter 1 — The Case, the Caps, and the Contract
- Chapter 2 — The Agility SDK
- Chapter 3 — Compute
- Chapter 4 — Barriers
- Chapter 5 — Moved to Compute: Skinning, and Cloth
- Chapter 6 — Bindless
- Chapter 7 — Bindless, Applied
- Chapter 8 — Queues
- Chapter 9 — ExecuteIndirect, and Culling Without the CPU
- Chapter 10 — Mesh Shaders: The Geometry Pipeline, Replaced
- Chapter 11 — DDS, Block Compression, and the Mip Chain
- Chapter 12 — Mesh Shaders II: Meshlet Culling
- Chapter 13 — Hierarchical Cluster Culling
- Chapter 14 — Work Graphs
- Chapter 15 — Variable Rate Shading
- Chapter 16 — Virtual Textures I: Storage Images and Tiled Resources
- Chapter 17 — Virtual Textures II: Streaming
- Chapter 18 — Clustered Lighting
- Chapter 19 — Stencil Shadow Volumes
- Chapter 20 — Volumetric Fog
- Chapter 21 — Parallax, Properly
- Chapter 22 — Particles I: The Data-Driven System
- Chapter 23 — Particles II: The Simulation Moves to the GPU
- Chapter 24 — The Particle Editor
- Chapter 25 — Acceleration Structures
- Chapter 26 — Ray Queries: The Instrument
- Chapter 27 — A Ray Where the Shadow Map Was
- Chapter 28 — The Rays Whose Answer Is Not a Boolean
- Chapter 29 — A Network Where the Rays Were
- Chapter 30 — Mirrors, Water, and What a Bounce Costs
- Chapter 31 — RHI 1.0: Freezing a Contract You Can Still Read
Book 9 — The Trailing Backends 27 chapters
- Chapter 1 — The Windowless Probe
- Chapter 2 — Three Ceilings
- Chapter 3 — A Device That Has Never Seen a Window
- Chapter 4 — The Emitter That Never Asked
- Chapter 5 — Bindless, the OpenGL Way
- Chapter 6 — Sparse Textures, and a Borrowed Ladder
- Chapter 7 — Mesh Shaders on One Vendor
- Chapter 8 — What OpenGL Cannot Do
- Chapter 9 — The Near-Twin That Stopped Compiling
- Chapter 10 — Forty Samples That Cannot Be Launched
- Chapter 11 — The First Frame
- Chapter 12 — Compute, on a Phone
- Chapter 13 — Sixty-Five Samples on a Phone
- Chapter 14 — Assets, Declared Once
- Chapter 15 — One Version Per Program
- Chapter 16 — Only What a Stage Can Reach
- Chapter 17 — Lua on a Phone
- Chapter 18 — Two Clients, One Window
- Chapter 19 — The Build Said No and the Engine Said Yes
- Chapter 20 — Four Dead Buttons
- Chapter 21 — The Noise Floor
- Chapter 22 — The Clock Metal Does Not Have
- Chapter 23 — Nine Chapters Nobody Checked
- Chapter 24 — `gpuOnly` Means Sometimes
- Chapter 25 — One Hardcoded False
- Chapter 26 — The Star Is Not a Wildcard
- Chapter 27 — The Matrix, Per Platform
Book 10 — Shadows 36 chapters
- Chapter 1 — Fourteen Shadows
- Chapter 2 — Two Combo Boxes
- Chapter 3 — The Unit a Bias Is In
- Chapter 4 — A Number for a Picture
- Chapter 5 — The Instrument That Lied About Itself
- Chapter 6 — Not an Approximation
- Chapter 7 — The Subject, and Five Believable Frames
- Chapter 8 — Ground Truth
- Chapter 9 — The Resolution Question
- Chapter 10 — Shadow Maps, Properly
- Chapter 11 — The Bias Problem
- Chapter 12 — PCF, and a Metric That Cannot Score It
- Chapter 13 — Variance Shadow Maps
- Chapter 14 — Exponential Shadow Maps
- Chapter 15 — Moment Shadow Maps
- Chapter 16 — PCSS and Contact Hardening
- Chapter 17 — The Backend That Rendered Nothing
- Chapter 18 — Cascades
- Chapter 19 — Stabilisation
- Chapter 20 — Point Lights: Cube Shadow Maps
- Chapter 21 — Dual-Paraboloid
- Chapter 22 — Spot Lights: One Frustum, and Three Things It Broke
- Chapter 23 — The Light System: Applying It
- Chapter 24 — Atlasing and Budgets
- Chapter 25 — Caching: The Shadow That Did Not Move
- Chapter 26 — Virtual Shadow Maps
- Chapter 27 — Culling: The Casters That Cannot Matter
- Chapter 28 — Baked Shadows and Lightmaps
- Chapter 29 — Ray-Traced Shadows
- Chapter 30 — Screen-Space Contact Shadows
- Chapter 31 — Translucent and Coloured Shadows
- Chapter 32 — Deep Shadow Maps
- Chapter 33 — Volumetric Shadows
- Chapter 34 — The Debts
- Chapter 35 — Stencil Shadow Volumes
- Chapter 36 — The System and the Comparison
Book 11 — MeshEdit 114 chapters
- Chapter 1 — Twenty-Four Thousand Corners That Have Never Met
- Chapter 2 — One Kit, Two Editors
- Chapter 3 — Verts, Edges, Loops, Faces
- Chapter 4 — The Structure That Could Not Hold a Mirror
- Chapter 5 — Soup to Structure, and Back Again
- Chapter 6 — A Renderer With No Wireframe
- Chapter 7 — Three Kinds of Click
- Chapter 8 — The Document `.ebmesh` Cannot Be
- Chapter 9 — Undo for a Hundred Thousand Fields
- Chapter 10 — Seven Hundred Lines Leave the Scene Editor
- Chapter 100 — The Quadratic That Does Not Matter
- Chapter 101 — When Repair Beats Dropping
- Chapter 102 — Three Million Chances
- Chapter 103 — A Float That Is No Number
- Chapter 104 — The Debt Named Three Times
- Chapter 105 — The Zero That Is Not A NaN
- Chapter 106 — The List Becomes The Data
- Chapter 107 — A Comment Is A Rule Nothing Can Check
- Chapter 108 — A File Named After What It Does
- Chapter 109 — A Caption That Points At Nothing
- Chapter 11 — Extrude, and the Edges That Should Not Be There
- Chapter 110 — The Measurement That Examined Nothing
- Chapter 111 — The Reader That Is Switched Off
- Chapter 112 — The Slots Nobody Was Watching
- Chapter 113 — The Cause
- Chapter 114 — What A Hundred And Thirteen Chapters Found
- Chapter 12 — Inset, and the Corner That Turns Inside Out
- Chapter 13 — Modelling Over a Photograph
- Chapter 14 — Bevel Is a Book
- Chapter 15 — Walking the Ring
- Chapter 16 — Slide, Along a Topology
- Chapter 17 — Five Ways to Delete
- Chapter 18 — Cut, Split, Weld
- Chapter 19 — Where the Shading Breaks
- Chapter 20 — A Stack Between the Cage and the Screen
- Chapter 21 — Catmull and Clark
- Chapter 22 — Creases, and the Surface in the Limit
- Chapter 23 — Booleans That Do Not Lie
- Chapter 24 — One Stroke, Three Tools
- Chapter 25 — Brushes That Move a Surface
- Chapter 26 — Topology That Changes Under the Brush
- Chapter 27 — Voxels, and the Honest Word for Retopology
- Chapter 28 — Seams: the Cuts You Choose
- Chapter 29 — Least Squares, Conformal
- Chapter 30 — Angles, Not Positions
- Chapter 31 — Packing an Atlas
- Chapter 32 — The Second Viewport
- Chapter 33 — A Texture You Are Allowed to Change
- Chapter 34 — The Brush That Is a Draw Call
- Chapter 35 — Layers, Masks, and the Bleed at the Seam
- Chapter 36 — Getting a Model In and Out
- Chapter 37 — Typing a Number, and Cutting a Quad
- Chapter 38 — What a Week of Being Used Found
- Chapter 39 — Slots, and the Faces That Belong to Them
- Chapter 40 — The PBR Panel
- Chapter 41 — A Graph That Compiles
- Chapter 42 — The Technique Builder
- Chapter 43 — Baking a Graph to Texels
- Chapter 44 — What Phase VII Owed
- Chapter 45 — Baking One Mesh Onto Another
- Chapter 46 — A Second Week of Being Used
- Chapter 47 — Bones, With a Rest Pose That Means Something
- Chapter 48 — Weights: Bound, Then Painted
- Chapter 49 — A Real Dope Sheet
- Chapter 50 — The Curve Between Two Keys
- Chapter 51 — Everything Is an Operator
- Chapter 52 — The Editor Learns Lua
- Chapter 53 — A Surface a Program Can Drive
- Chapter 54 — A Plugin That Ships
- Chapter 55 — The Bake
- Chapter 56 — Headless
- Chapter 57 — The Round Trip
- Chapter 58 — The Other Writer
- Chapter 59 — What the Document Forgot
- Chapter 60 — The Stack Nobody Could Reach
- Chapter 61 — Which Object Is This Face In
- Chapter 62 — One Thing, Or Several
- Chapter 63 — An Object With No Faces
- Chapter 64 — The Array Beside The Table
- Chapter 65 — The Copies Were Not Lines
- Chapter 66 — A Negative Width
- Chapter 67 — The Plugin Surface Is Lua
- Chapter 68 — A Group Was Always An Object
- Chapter 69 — Where The Transform Is Applied
- Chapter 70 — Object Mode Moves The Object
- Chapter 71 — The Gizmo, And The Stale Binary
- Chapter 72 — The Sweep And The Selection
- Chapter 73 — The Operand, And The Renumbered Table
- Chapter 74 — The Reference That Outlived The Vector
- Chapter 75 — Where An Object Turns
- Chapter 76 — A Chain With A Name
- Chapter 77 — The Three Things Chapter 76 Left
- Chapter 78 — A Stroke Through Space, And A Run That Leaves Evidence
- Chapter 79 — A Face This Editor Just Built
- Chapter 80 — The Sixth Modifier
- Chapter 81 — An Item That Refuses Should Not Look Available
- Chapter 82 — Bevel, Finished
- Chapter 83 — Two Lists With The Same Words In Them
- Chapter 84 — Which Parameter Belongs To Which Button
- Chapter 85 — The Extension That Was Already In The Shader
- Chapter 86 — A Number A File Could Say And A Person Could Not
- Chapter 87 — The Animation A Program Could Not Read
- Chapter 88 — The Clip That Could Not Be Unmade
- Chapter 89 — The Third Time The Bake Dropped A Number
- Chapter 90 — A Guard For The Thing Three Chapters Found By Hand
- Chapter 91 — There Were Never Two Conversions
- Chapter 92 — A Rename Defeats A Name Check
- Chapter 93 — The Check That Should Not Be A Gate
- Chapter 94 — Two Clips Called Walk
- Chapter 95 — Two Bones Called Spine
- Chapter 96 — The Back Door
- Chapter 97 — A Chain That Points At Nothing
- Chapter 98 — Four Promises A Skin Makes
- Chapter 99 — What Three Passes Cost
Concepts — a companion track 27 chapters
- Concept 01 · Layering & Dependency Direction
- Concept 02 · Declarative Builds & the Configure/Build Split
- Concept 03 · Tests as Design & CI as the Definition of Correct
- Concept 04 · Ownership, RAII, and Handles
- Concept 05 · Platform Abstraction — the Seam Between OS and Engine
- Concept 06 · The Game Loop — Edges, Levels & Time
- Concept 07 · Producer/Consumer, Thread Affinity & Sharing Without Racing
- Concept 08 · Asset Pipelines — Bake Once, Load Forever
- Concept 09 · Abstraction Layers — the Interface as a Contract
- Concept 10 · One Implementation of an Interface — and the Do-Nothing Device
- Concept 11 · The GPU as a Data Path — State vs. Data
- Concept 12 · Batching — Why One Draw Beats a Thousand
- Concept 13 · Decoupling with Events — the Sender Who Doesn't Know
- Concept 14 · Immediate vs. Retained UI — and Where State Lives
- Concept 15 · Coordinate Spaces, Transforms, and the Clip
- Concept 16 · Layout as a Tree, and Modality
- Concept 17 · Runtime Polymorphism Across a Binary Boundary
- Concept 18 · Explicit APIs and Who Owns the GPU's Lifetime
- Concept 19 · Synchronization, and Making the Implicit Explicit
- Concept 20 · Convergent Design, and the Bug Only Your Eyes Can Find
- Concept 21 · Reuse vs. Rewrite — the Near-Twin
- Concept 22 · The Compiler as a Tool — Custom Binary Asset Formats
- Concept 23 · Culling — Spending Compute Only on What's Visible
- Concept 24 · Composition over Inheritance, and Data-Oriented Design
- Concept 25 · Data-Driven Design — Separating Description from Construction
- Concept 26 · Systems as Free Functions Over Data — and How Much the Engine Bought
- Concept 27 · Deliberate Seams and Recognizing Debt Before It's Urgent