v0.10.0
ExoJS v0.10.0
Release Date: 2026-05-31
Changelog
Breaking — RenderingContext and Scene.draw migration
Scene.draw()now receivesRenderingContextinstead ofRenderBackend.- Use
context.render(node)instead ofnode.render(backend)for the high-level path. - Use
context.backendfor advanced raw backend calls (clear,setRenderTarget,setView, etc.). app.renderingis the canonical high-level rendering accessor (replaces the formerapp.renderername).Application.renderTo()remains available as a convenience wrapper.RenderNode.render(backend)remains available as an advanced/raw path, marked@advanced.
Breaking — Rendering order semantics
- Removed
Container.sortableChildren. SceneNode.zIndexis now always applied locally among siblings during render-plan playback.- Sorting is now non-destructive to
Container.children; render ordering no longer mutates the child array. - Removed
SceneNode.childOrder/SceneNode.setChildOrder()from the public scene-node surface.
Breaking — Gradient and storage cleanup
- Removed
GradientDrawable(src/rendering/primitives/Gradient.ts). - Added texture-first gradients:
Gradient,LinearGradient, andRadialGradientwithtoTexture(width, height, options?). - Removed
SaveStore; replaced withJsonStore. JsonStoreAPI rename:save()->set(),load()->get().- Renamed particles
GradienttoColorGradientandGradientKeytoColorGradientKeyto avoid root export collisions.
Migration notes
- Remove
container.sortableChildren = truefrom user code. Scene.draw(backend)→Scene.draw(context): the draw method now receivesRenderingContextinstead ofRenderBackend.node.render(backend)→context.render(node)(recommended high-level path).backend.clear()→context.backend.clear()(raw accessor is still available).RenderNode.render(backend)remains as the advanced raw path when needed.
- For custom drawables, use
Drawable+RendererRegistryso rendering remains on the backend dispatch path (backend.draw(drawable)). - Replace
GradientDrawablewithnew Sprite(new LinearGradient(...).toTexture(w, h))(orRadialGradient). - Replace
SaveStoreimports/usages withJsonStoreand update calls toset()/get(). - Replace particles
Gradientimports withColorGradient.
Internal — render pass consolidation and WebGPU geometry stencil parity
- Centralized render-pass ownership inside the backends behind an internal
RenderPassCoordinator: the WebGPU renderers, mask compositor, and shader filter now record into a single coordinator-ownedGPURenderPassEncoderper flush instead of each opening and submitting its own. Submit/pass counts are unchanged and there is no public API change. - The clear-vs-load decision (including
RenderTexturecontent preservation across multiple passes in a frame) is now owned by the coordinator. - WebGPU now supports geometric stencil clipping (
RenderNode.clipwith aGeometryclipShape) at pixel parity with WebGL2 for default-materialSpriteand default-materialMesh/Graphicscontent (including composition with scissor rects and nested clips); it previously failed clearly. ClippingText,ParticleSystem, custom-materialSprite, or custom-materialMeshcontent with aGeometryclipShape on WebGPU still throws a clear error at collection time (use aRectangleclipShape for the scissor path, or the WebGL2 backend);Rectangle/bounds clips are unaffected.
Install: npm install @codexo/exojs@0.10.0
Full Changelog: View Changes | All Releases