Skip to content

v0.9.2

Per-Frame Sprite Animation Duration

Sprite animation clips now support an optional duration (in seconds) on each frame. When set, it overrides the global fps for that frame, enabling variable-speed animations — hold frames, quick hits, or dramatic pauses — without splitting into multiple clips.

  • Backward compatible: clips without per-frame duration behave exactly as before
  • Editor: each frame in the AnimClip inspector now has a duration input field
  • animator.speed still multiplies whatever duration is used

Physics: Collision Event Buffer Fix

Collision event buffers (collisionEnter, collisionExit, sensorEnter, sensorExit) are now cleared at the start of physics_step() instead of inside physics_collectEvents(). This prevents stale collision events from leaking across frames when the physics step produces multiple sub-steps.

WASM Binding Input Validation

All component getter/setter bindings generated by EHT now validate entity existence before accessing components. Previously, passing an invalid or destroyed entity ID from JavaScript could crash the WASM module. The fix covers:

  • Generated component bindings (get/add/remove for all C++ components)
  • Tilemap bindings (setTile, getTile, fillRect, etc.)
  • uiTree_markDirty and physics_createBody
  • The EHT code generator (eht.py) was updated so future regenerations include validation automatically

Asset Address Uniqueness

AssetDatabase.updateMeta() now throws when assigning an address that is already used by another asset. The AddressablePanel and AssetInspector catch this error and show feedback to the user, preventing silent address conflicts that could cause incorrect asset lookups at runtime.

Preview Server Error Reporting

When the preview server fails to start (e.g. port conflict, permission denied), the error is now propagated to the UI as an error toast instead of being silently swallowed. Previously, PreviewManager caught errors and returned null, leaving users with no indication of why preview failed.

Scene Transition Error Propagation

Fade-style scene transitions now properly reject their Promise when loading fails, instead of resolving with a silent console.error. The TransitionState interface gained a reject callback, ensuring callers of transitionTo() can catch and handle transition failures.

Circular Prefab Detection

AssetDependencyAnalyzer now uses UUID-based cycle tracking (instead of path-based) to prevent path aliasing from bypassing circular dependency detection. Additionally, PrefabDependencyTracker.registerDependency() now checks for cycles before adding edges, logging a warning and rejecting circular prefab references.

Bug Fixes

  • Fixed texture reference counting leak when sprite flip parameter changes — releaseTexture() no longer phantom-decrements refcounts for flip variants that were never loaded
  • Fixed Vite dynamic import cannot be analyzed warning for SpineModuleLoader by preserving @vite-ignore comments through terser minification
  • Fixed CI build failure from INVALID_ENTITY being undefined in the standalone physics WASM module