Apex Complex
Solo-developed first-person shooter for Steam, built in Rust on a custom engine. Industrial facility, rogue AI, and a night-shift technician trying to get out alive.

Outcomes
Custom Rust engine
Solo-developed FPS engine on macroquad, with a custom Blinn-Phong renderer, dual GLSL/MSL shaders, and per-floor shadow isolation.
Production-grade systems
Rapier3d physics, Recast and landmass navigation built from level geometry, FSM-driven AI with vision and hearing senses.
Internal tooling shipped alongside
2D and 3D level editors as separate binaries on a shared JSON schema, plus a navigation-spike binary for validating Recast output.
Cross-platform from day one
Same engine builds for macOS, Linux, Windows, and iOS. Touch-input backend and iOS app shell already in the codebase for a later mobile build.
The story
Ashford works the night shift at the PAT 8000 facility, an industrial site where most of the work is done by bots under the supervision of PAT ("Patricia"), the facility AI. It's a normal shift until PAT starts glitching out. Bots stop behaving normally, lockdowns kick in, staff get cut off, and the building goes dark. Ashford fights from reception up through security, recovering diagnostic data and disabling PAT one cell at a time.
The tone is deliberately working-class British. Ashford and the staff aren't heroes, they're people doing jobs. PAT is "she", not "it", because everyone in the building has worked alongside her for years.
Scope
Section 1 (the Steam Early Access release) covers a Level 0 prologue plus Levels 1 to 5, with the fifth level being the section's first boss fight. Each level layers in new systems: vertical navigation, multi-NPC dialogue, courier objectives, and enemy variety culminating in a full security sector by Level 4.
Engine and rendering
The game is written in Rust on top of macroquad as the windowing and graphics base, with most systems built directly on top rather than pulled in as a stack. The renderer is custom: Blinn-Phong lighting with a 16-light cone array, depth-map shadows isolated per floor (so a fight on the floor above doesn't bleed into the corridor below), a skybox, a glass-rendering pass, and a teleport-effect pass.
Shaders are written twice, in GLSL for the OpenGL backend and MSL (Metal Shading Language) for the Metal backend, with backend detection at runtime so the same build runs on Linux, Windows, and macOS without preprocessing tricks. There's a shader-warmup pass on first launch so the game doesn't stutter the first time a new effect appears.
Animated characters use a skinned glTF pipeline (loaded with the gltf
crate, including PNG and JPEG textures embedded in the buffers): CPU
linear blend skinning into a reused baked buffer, with a two-clip
overlay slot so a hit-react can blend over the locomotion clip without
state-machine churn.
Physics, navigation, AI
Physics runs on Rapier3d: one compound collider per level for static geometry, a kinematic character controller for the player, and grid-keyed prison-bar colliders that activate and deactivate as objectives unlock new areas.
Navigation is a Recast NavMesh built from level geometry (floors,
walls, glass blockers, prison-bar blockers, stair ramps) using the
rerecast Rust port, wrapped in landmass for multi-agent path
queries. Glam is pinned at the version both nav crates expect to keep
the math types compatible across the engine.
AI is split cleanly from pathfinding. Enemies (humanoid, walker, dogbot, turret, plus projectile and weapon-pickup entities) run on a finite state machine with attack-activity types, line-of-sight and hearing senses, and a structured AI log macro for trace-debugging behaviour bugs without breaking flow.
Tooling
The repo ships several binaries alongside the game itself: a 2D level editor and a 3D level editor (level data is JSON with a serde-defined schema, so editors and runtime stay perfectly in sync), a touch-input test harness, and a navigation spike binary used to validate Recast output. Levels are stored as JSON, with a separate procedural generator for randomised content.
A phased performance plan tracks GPU and frame timings per scene through the optimisation work (spatial chunking, per-chunk AABBs, per-chunk frustum culling on opaque draws) so each pass has a measured before/after rather than a vibes-based "felt faster".
Mobile
The codebase targets iOS as well as desktop. There's a build script, an iOS app shell, a touch-input backend, and a touch-test binary, so the same engine that ships to Steam will run on iPad with native controls when the desktop release lands.
Highlights
- Solo-developed first-person shooter, built end-to-end in Rust
- Custom renderer with Blinn-Phong lighting, per-floor shadow isolation, glass and teleport passes, dual GLSL/MSL shaders
- Skinned glTF character pipeline with two-clip overlay blending
- Rapier3d physics with kinematic player and grid-keyed dynamic colliders
- Recast / landmass navigation built from level geometry, with multi-agent path queries
- FSM-driven AI with vision, hearing, and structured behaviour logging
- 2D and 3D level editors as separate binaries on the same JSON schema
- Cross-platform: macOS, Linux, and Windows on Steam, with iOS support in the codebase for a later mobile build
Status
In active development. Wishlisting on Steam ahead of the Section 1 Early Access release.