Skip to main content

Feature support and migration

Use the API reference in the navigation bar for function signatures, ownership contracts, errors, and examples. The tables here distinguish implemented features from declarations that still need a backend.

Capability support​

These App services have no backend yet. Their support value is .not_implemented, and every operation returns error.NotImplemented. They allocate no output devices, threads, sessions, files, fake handles, or successful empty results.

App serviceRequests
audioplay, pause/unpause, stop, voice/bus gain, listener placement
animationplay, blend, pause, stop, seek a named model clip
materials.applyEffectpostprocessing effects
particlesemission and stopping
networkconnection, listening, messages, polling, disconnection
navigationpaths and destinations; no physics or collision access
localizationlocale selection and translated-text lookup

eggy.audio.support reports support without an App. Components can store sound references; try app.audio.play(sound, .{}) returns error.NotImplemented. Animation references do not add skeletons or clips to .eggmodel. These contracts do not add components to the Inspector.

Working low-level graphics (eggy.vit), UI (eggy.ui), math (eggy.math), ECS (eggy.ecs), scene formats, and asset formats remain available directly. SDL controllers, touch gameplay input, named input maps, value timers, and gameplay time scaling are implemented. Resource reads, model imports and image decoding have owned asynchronous requests with polling, progress and cooperative cancellation. Native requests use bounded worker threads; browser builds defer decoding of already-preloaded data until polling. Scenes.stream is not implemented. Scenes.replace stages synchronous scene replacement for the end of the gameplay update.

SurfaceDesktopWeb
Native ECS/math, keyboard/mouse, frame time, static graphicsImplementedSame core APIs
Value timers and gameplay time scalingImplementedSame allocation-free API
Named input maps, priorities, modifiers, hold/tap/chord triggersImplemented; project editor includedShared runtime API
Controllers, rumble, and touch contactsSDL3; hardware-dependentSDL3/browser-dependent
Synchronous project/packaged resource and scene providersImplementedPackaged assets preloaded at startup
Game-save slotsAtomic versioned saves in project-specific user dataPersistent browser localStorage; quota/availability errors are explicit
Weeoui game UI and custom draw hooksImplementedShared runtime API; no editor import
UI scenes: UiScreen HUDs and UiBillboard world panelsImplemented; UI Designer panel, animated GIFs, plugin widgetsSame runtime API
Materials and directional/point scene lightsImplemented; Inspector components and reusable material assetsShared renderer, up to sixteen lights
Debug drawing and CPU profilingWorld-space overlays, named samples/counters; DevTools Game tabSame frame-owned collectors and drawing
World sprites and textDepth-tested atlas sprites and camera-facing glyphsSame scene renderer
Editor context, panels, commands, actionsDesktop onlyNot run or linked
Missing-backend contracts listed aboveNotImplementedNotImplemented

See Audio and animation contracts for request syntax and working alternatives to those unimplemented playback contracts. Browser builds preload packaged resources through Emscripten, then read them synchronously through SDL. Keep the generated .data file beside the WebAssembly, JavaScript and HTML. Android APKs contain the same packaged data and read it through SDL's AssetManager adapter; APK export targets Android 13 (API 33) through Android 16 (API 36) devices with Vulkan 1.3, through the Android plugin.

Migrating existing code​

Older codeCurrent code
AssetRef(kind).init(runtime_path)try AssetRef(kind).parse(runtime_path); init is for literals
editorUpdate(self, app)editorUpdate(self, editor); use editor.app
editorUi(self, ui)editorUi(self, editor, ui) !void
editorPanelUi(self, panel, ui)editorPanelUi(self, panel, editor, ui) !void
Custom cache loader returning ?Model/?TextureReturn an error union; author resource access uses the C-safe bridge
Manually feeding Input.handle(event)try Input.handle(event); device/host failures are explicit
app.materials.assign(...), app.lighting.setLight(...)app.materials().assign(...), app.lighting().setLight(...); borrowed current-world services

Rebuild the editor and game library together after updating the engine. Their ABI is checked, not mixed across revisions. Native World/query APIs, transforms, simple polling, preferences, addGame/addPlugin, and physics are not renamed or wrapped.

For state and pointer lifetimes during that rebuild, see Ownership, Play, and reload.