engine v4.5.2
Engine v4.5.2
May 27, 2026
A patch in the Surface Tension line.
what's new
- Animated models always play something — falls back to an available animation instead of standing still.
- Savi can now catch editing mistakes that made parts of your world disappear or stop moving.
- Savi uses clearer, more specific commands when editing your world's atmosphere, terrain, camera, and other settings.
›technical notes
- Fixed silent T-pose when a
draw/mixerchannel references a clip name that doesn't exist exactly on the loaded model. Renderer now substring-matches (e.g.walk→Walking) and falls back to the first usable clip; skips rest-pose placeholders (zero duration, empty tracks, or every-track-single-keyframe). - Reject misplaced
api.spawn()fields transactionally and make invalid pathlessapi.patch()calls report the runtime mutation API directly to Savi. - BREAKING: Removed
api.patch(path: string, value: Record<string, unknown>)from ObjectAPI. - Restored eight per-slice patch methods:
patchAtmosphere,patchTerrain,patchPlayer,patchCamera,patchInputs,patchGodMode,patchUi,patchEngine. - Per-place targeting uses the second argument again:
api.patchTerrain(p, "main")andapi.patchAtmosphere(p, "main")replace the dot-path form. - Internal recorded mutation
kindtags unchanged — persistence/replay/serialization stay stable.
›migration notes
The unified api.patch(path, value) method is removed. Replace with the corresponding per-slice method.
| Before | After |
|---|---|
api.patch("atmosphere", p) | api.patchAtmosphere(p) |
api.patch("terrain", p) | api.patchTerrain(p) |
api.patch("places.main.terrain", p) | api.patchTerrain(p, "main") |
api.patch("places.main.atmosphere", p) | api.patchAtmosphere(p, "main") |
api.patch("player", p) | api.patchPlayer(p) |
api.patch("camera", p) | api.patchCamera(p) |
api.patch("inputs", p) | api.patchInputs(p) |
api.patch("godMode", p) | api.patchGodMode(p) |
api.patch("ui", p) | api.patchUi(p) |
api.patch("creatorUi", p) | api.patchUi(p, "creatorUi") |
api.patch("engine", p) | api.patchEngine(p) |
Behavior is identical per slice; only the dispatch surface changed.