Features
Everything in the box, grouped the way you will use it. Each section links to an example that runs in your browser.
Jump to a section
Kernel and scripting
@ignifx/coreThe engine's core is small and explicit. An App owns a World; a world holds scenes; scenes hold entities; entities hold a transform and components. A Script is a component with lifecycle callbacks and typed fields you declare with a schema, so every field is serialisable, inspectable and hot-reloadable without a decorator in sight.
createAppwith extensions, settings, a clock and a log sinkWorld,SceneInstance,Entity,Transform, tags and layersComponentfor data,Scriptfor behaviour; fields fromScript.define({ … })- A documented frame:
PreUpdate→fixedUpdate× N →start→update→ coroutines →PostUpdate→lateUpdate→PreRender→ render - Coroutines as generators;
Signalwith owner-scoped disconnect app.time: fixed step, time scale, pause and resume, clamped deltasapp.tweensfor numbers, vectors and quaternions on the game clock- Metres, seconds, degrees; left-handed, Y up
- Every engine error has an
IGX-####code and reachesapp.onError - Diagnostics counters and structured logging
Rendering
@ignifx/core on Babylon Liteignifx renders exclusively through WebGPU, using Babylon Lite as its rasteriser. You describe a frame with six components and the engine keeps Babylon Lite in sync, once per frame, writing only what changed.
Camera: perspective and orthographic, priority, viewport, clear colour, screen-to-ray and world-to-screenLight: directional, point, spot and hemispheric; include and exclude lists- Shadows from directional and spot lights: PCF and ESM maps, cascades, bias and map size
MeshRendererwith box, ground and custom geometry;Modelfor glTF 2.0 and GLB- PBR materials from
.material.jsonor from code; unlit materials; material overrides per model Environment: image-based lighting from.env,.hdrand.dds, skybox, fog, exposure, contrast and Standard, ACES or Neutral tone mappingPostProcessStack: bloom, SMAA anti-aliasing, image processing- MSAA ×4, resolution scale and device-pixel-ratio clamp
- GPU picking and CPU raycasts against renderables
- Screenshots, per-task GPU timings, draw-call counters
- Material warm-up before a scene shows, and WebGPU device-loss recovery
- A documented
.liteescape hatch when you need Babylon Lite itself
See it:Physically based renderingShadowsBloomTone mappingPicking
Assets and scenes
@ignifx/core and @ignifx/vite-pluginEverything a game loads is addressed by path, typed, reference-counted and asynchronous. The Vite plugin generates the manifest, validates every JSON document against the engine's schemas at build time, and hot-swaps assets while you work.
- Textures (PNG, JPEG, WebP, KTX2, Basis), models (glTF, GLB), environments (
.env,.hdr,.dds), fonts, audio, JSON, text and bytes - Sub-assets by fragment:
"hero.glb#animation:Run" - Cancellable loads, preload groups, reference counting with delayed unload
- One format for scenes and prefabs;
world.instantiatestamps a prefab out and overrides survive a save and load serializeScenefor saves; versioned save documents in the templates- Hot reload of assets and scripts in development
Input
@ignifx/inputGame code asks for "jump", never for a key code. Actions, bindings, composites and processors live in an .input.json document, so rebinding is data and control schemes are a file.
- Keyboard, mouse, pointer, gamepad and touch devices
- Action maps, control schemes, composites (2D vectors, axes), processors (dead zone, normalise, clamp, scale, invert)
wasPressedThisFramethat is consistent across every fixed step of a frame- Interactive rebinding with save and load of overrides
- Pointer lock and cursor control
- Virtual joystick and buttons for touch (with
@ignifx/ui) simulate()for tests: drive input headlessly with no device
3D physics
@ignifx/physicsHavok, through Babylon Lite, stepped by the engine's fixed loop and interpolated for the screen. It runs headlessly too, so a physics test needs no GPU.
Rigidbody: dynamic, kinematic and static; mass, rotation locks, sleep- Box, sphere, capsule, cylinder, mesh and heightfield colliders; triggers
- Physics materials (
.physicsmaterial.json): friction, restitution CharacterController: collide-and-slide, a slope limit, support detection and body pushing- Collision and trigger enter, stay and exit events
- Raycasts, shape casts and overlaps with a layer matrix
- Deterministic per platform: the same inputs give the same hash across processes
See it:Physics playgroundCharacter controllerRaycasts and triggers
2D toolkit
@ignifx/2dSprites, atlases, tilemaps and cameras in pixels per unit, drawn through Babylon Lite's sprite layers.
Camera2Dwith pixels per unit, pixel-perfect zoom, follow with a dead zoneSpriteRenderer,SpriteAnimatorand.spriteanimation.jsonclips- Atlas importers for TexturePacker, Aseprite and grids
TilemapandTilemapRendererwith Tiled and LDtk importers and chunk culling- Sorting layers with Y-sort;
ParallaxLayer; per-layer tint and custom shaders - 2D picking
2D physics
@ignifx/physics-2dRapier 2D behind the same component vocabulary as 3D, with a platformer controller that handles the cases a platformer needs.
Rigidbody2D; box, circle, capsule, polygon, edge and tilemap colliders; triggersCharacterController2D: slopes, auto-step, snap-to-ground, one-way platforms- Queries, events, interpolation, a layer matrix
- Runs headlessly; deterministic per platform
3D toolkit
@ignifx/3dThe parts of a 3D game that every 3D game rewrites, done once.
ThirdPersonControllerandFirstPersonController: walk, sprint, crouch, jump, head pitchThirdPersonCamera: an orbit rig with wall collision and dampingAnimator: a state machine from.animator.jsonwith 1D blend trees, masks, additive layers and events, driving glTF skeletonsNavMeshSurface,NavMeshAgentandNavMeshObstacleon Recast, baked headlesslyRigidbodyMover,PlatformMover,Projectile,LodGroup,Billboard
Audio
@ignifx/audioA mixer, not a play function. Buses are declared in a file; every sound plays on one; volumes multiply down the tree.
.audio.jsonbus tree with per-bus volume and pause behaviourAudioSourcefor one-shots, loops and spatial playback;AudioListener;MusicPlayer- Browsers start locked: plays are queued, not lost, until the first gesture
- Pauses with the app; a
UIbus that does not - WAV, MP3, OGG, WebM and FLAC; a headless backend with exact timing for tests
See it:Audio mixerPositional audio
UI
@ignifx/uiGame UI is HTML, placed over the canvas by the engine, with focus routing so a text field never steals a jump.
- An overlay root with named layers,
css,fitanddpiscaling, safe-area variables MenuandMenuStackdriven by keyboard, gamepad and pointer through one selection modelDialog,Toast,LoadingScreenHudText,WorldText,WorldText2DandWorldAnchorVirtualJoystickandVirtualButtonfeeding@ignifx/inputapp.i18nwith.i18n.json, all locales in one file, ICU-style plurals
See it:UI overlayMenusTranslations
Desktop
@ignifx/electronShip the same build to Windows, macOS and Linux inside a hardened Electron window.
createGameWindowwith the WebGPU flags already set- The
ignifx://protocol serving your build with range requests - Context isolation, sandboxed renderers, no Node in the renderer, a strict CSP and a typed, versioned preload bridge
- File-system
app.storagefor saves and settings;app.desktopfor window control create-ignifx --desktopscaffolds the Electron variant of any template with electron-vite and electron-builder configured
See it:Getting started → Desktop
Devtools
@ignifx/devtoolsPress backtick. Stats, the scene tree, a schema-driven inspector, assets, input, audio, physics debug, a console and a timeline. Zero cost while closed, and every number comes from app.diagnostics, which your game can read too.
See it:Devtools overlay
Tooling
@ignifx/vite-plugin and @ignifx/cli (create-ignifx)- A Vite plugin that generates the asset manifest, writes
.meta.jsonsidecars, validates scene, prefab, material, input, audio, animator and tilemap JSON against the engine schemas, handles WebAssembly, and wires hot module replacement - Typed
virtual:ignifx/*modules create-ignifxwith four templates and a desktop flagcheck-webgpuandnew-scripthelper scripts in every project
Platform and storage
@ignifx/coreapp.platform: where the game runs (browser, Electron, headless), OS, mobile, pointer lock, gamepads, the WebGPU adapter, locale and reduced-motion preferenceapp.storage: an async key-value store with namespaces, backed by IndexedDB in the browser, files in Electron, and memory or files in Node- Save games, settings and input overrides use it; so can you
See it:Save and load
Headless and testing
Create an app with headless: true, step it with app.step(1 / 60), and assert. Physics, navigation, audio timing and input all run without a GPU or a DOM, which is how the engine's own thousand-plus tests run.
- Manual clocks for deterministic tests
- Memory log sinks and error capture
- Playwright browser suites and visual goldens in the repository as worked examples
