Skip to content

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 31 May 12:40
· 135 commits to main since this release

ExoJS v0.10.0

Release Date: 2026-05-31

Changelog

Breaking — RenderingContext and Scene.draw migration

  • Scene.draw() now receives RenderingContext instead of RenderBackend.
  • Use context.render(node) instead of node.render(backend) for the high-level path.
  • Use context.backend for advanced raw backend calls (clear, setRenderTarget, setView, etc.).
  • app.rendering is the canonical high-level rendering accessor (replaces the former app.renderer name).
  • 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.zIndex is 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, and RadialGradient with toTexture(width, height, options?).
  • Removed SaveStore; replaced with JsonStore.
  • JsonStore API rename: save() -> set(), load() -> get().
  • Renamed particles Gradient to ColorGradient and GradientKey to ColorGradientKey to avoid root export collisions.

Migration notes

  • Remove container.sortableChildren = true from user code.
  • Scene.draw(backend)Scene.draw(context): the draw method now receives RenderingContext instead of RenderBackend.
    • 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 + RendererRegistry so rendering remains on the backend dispatch path (backend.draw(drawable)).
  • Replace GradientDrawable with new Sprite(new LinearGradient(...).toTexture(w, h)) (or RadialGradient).
  • Replace SaveStore imports/usages with JsonStore and update calls to set()/get().
  • Replace particles Gradient imports with ColorGradient.

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-owned GPURenderPassEncoder per 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 RenderTexture content preservation across multiple passes in a frame) is now owned by the coordinator.
  • WebGPU now supports geometric stencil clipping (RenderNode.clip with a Geometry clipShape) at pixel parity with WebGL2 for default-material Sprite and default-material Mesh/Graphics content (including composition with scissor rects and nested clips); it previously failed clearly. Clipping Text, ParticleSystem, custom-material Sprite, or custom-material Mesh content with a Geometry clipShape on WebGPU still throws a clear error at collection time (use a Rectangle clipShape 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