engine v4.6.0
Atelier
June 1, 2026
A real workshop for god mode — tabbed tools, undo/redo, and richer material looks.
what's new
- God mode is a real in-world editor now. Grab any object and move, rotate, scale, or stretch it with on-object handles. A toolbar at the bottom gives you shapes, paths, and brushes, and your tools live in tidy tabs in the top-right. Made a mistake? Ctrl+Z to undo, Ctrl+Y to redo (top-left).
- Paint your world. Sculpt hills and valleys with terrain brushes, paint different ground materials, and scatter plants and objects across the land. Right-click anything you've scattered to tune the whole patch at once — amount, size, spacing, sway, and how it grows on slopes.
- Sculpt while you play. Terrain you raise, lower, or repaint updates live underfoot — and since edits sync to everyone, you and your friends can build the same world together in real time.
- More material looks — give objects toon, phong, matcap, and other lighting styles, not just the standard one.
- Per-object shadows — turn shadow casting and receiving on or off for any object — handy for glass, signs, and effects.
- Animations just work. Name a clip loosely (say "walk") and it still finds the right one instead of freezing in a T-pose, and you can layer upper-body-only animations over a full-body one.
- Walk-through archways — archway openings reach the ground, so players walk straight through the doorway.
- Smoother and sharper — a rebuilt renderer keeps frame rates steady, holds detail on distant models, and keeps memory in check on big scenes. Custom camera styles run smoothly again.
- Sculpting feels right on hills and cliffs. The brush lands exactly where you point — even on steep ground — strokes stay strong on slopes, and the brush ring hugs the terrain instead of floating as a flat circle.
›technical notes
God mode: in-world editing surface (#6496, #6576)
- Rebuilt god mode as a direct-manipulation editor — anatomy-grown handles/gizmos (translate/rotate/scale/extrude), hover affordances, and a bottom toolbar (paths/shapes/brushes + blueprint-category tabs). All authoring flows through replicated, deterministic Tome authoring input (server-authoritative, multiplayer co-edit), not the old client-only selection-inspector transport.
- Placement: primitives, blueprints (full subtree clones), and prefabs via cursor-follow + click-to-commit, right-click cancel. Splines: freehand draw, extend-from-endpoint, snap-close, shape recognition, conform-to-terrain. Attach/detach, subtree-aware duplicate, parent-aware transforms, R-to-rotate.
- BREAKING: god-mode authoring UI moved to
creatorTabs(CreatorTabDef[]onGameSpec, compiled toCompiledSpec.creatorTabs);setCreatorTab(id, tab|null)adds/replaces/removes one tab. The oldcreatorUiandmode:"god"modUisare no longer compiled or rendered into the rail (hard-cut;creatorUiremains in the type as@deprecated). One module per tab — default export = render, namedonMount/onDestroyfor lifecycle. Rail moved from a bottom-center pill to a top-right tab rail (buildCreatorTabRailHtml). - Added god-mode undo/redo: top-left controls + replicated
god:undo/god:redoactions (Ctrl+Z / Ctrl+Y) on the player-keyedUndoStacksResource(the same stackapi.undo()drives). Property edits only; structural spawn/delete is a follow-up. - Fields primitive: named authored+runtime spatial rasters (
terrain:height,terrain:material:<id>,scatter:<bedId>, plus gameplay fields), component-backed inside the rollback envelope; every field op is O(update) via per-chunk versioning. NewreadField/writeFieldObjectAPI;writeFieldinsidewithPersistenceauthors (→place.fields), otherwise writes the runtime layer. - Runtime terrain editing: terrain mesh + collider read the composed (authored+runtime) field, so a gameplay/behavior
writeField("terrain:height"|"terrain:material:<id>")sculpts live (only authored edits persist). Static{ terrain: offset }objects re-anchor when the composed ground moves (terrainReanchorSystem, version-gated); physics bodies settle on the composed collider. - Brushes + scatter:
godMode.brushesregistry (defineBrush/updateBrush/getBrush) + paint-only scripts (export function paint(p, inset, current, ctx)). Ships terrain/material/daisies built-ins (materials derive from the terrain palette). Scatter = real entities (≤500 cap), edited via one generic scatter editor (Amount/Pattern/Size/Sway/Steep/Grow/Shrink);TomeOwnedFieldauto-prunes a bed's field on destroy. AddedgetObjectWithDescendants(deep-clone subtree).
Renderer → adapter rewrite (#6517)
- Replaced the 13 hand-rolled
state/*translator classes with op-driven per-kind handlers that write Three.js directly off the ECS delta stream (noRenderPrep/RenderReadView/DrawableSourceintermediate; per-handler typeduserData). Renderer dropped from ~66k to ~20k LOC.TransformSmootheremits synthetictransform/world-*ops into the same per-op write path. No spec/script migration required — games render the same. - Node-material resolver:
DrawMaterial.keymaps to lit material families (standard/PBR, Phong, Lambert, Toon, Matcap, unlit) plus water/slash/shockwave/voxel paths, with consistent override application.isEmissiveMaterial(flash + glow) broadened fromMeshStandard-only to any material withemissive/emissiveIntensity. - Per-entity
draw/shadowcomponent (castShadow/receiveShadow, default on), authored viaObjectProperties.castShadow/receiveShadow; honored across standalone, indirect-batch (in the batch lane key), and oversized primitive lanes. Effect/water materials keep__noShadowas cast default. - Animation: mixer now substring-matches a missing clip name (
"walk"→"Walking") and falls back to the first viable clip instead of rendering T-pose; restored mask bones (per-bone clip filtering for upper-body-only overlays) and LOD migration (camera-driven reconcile, thresholds 25/50/100, LOD3 resident to 200m). - Bounded texture VRAM via handler retain/release at every bind site + re-enabled eviction; batched MSDF world-text glyphs; GPU scatter for terrain decorations; place-transition stream reset (keeps same-frame recreated entity objects alive).
- Fixed archway primitive geometry (doorway opening reaches the floor) and a regression that broke
kind: "custom"cameras.
God-mode polish + sculpting feel (#6587, #6588, #6585)
- Particle emitters get their own editor cluster (move pad, vertical lift, one shape-aware size grip that grows the emission shape, rate chip, verbs — no yaw/scale grips); selected emitters draw their emission volume as a translucent shell. Smoke placeable emits from a box volume.
- Toolbar pipeline unified: default + spec prefabs group by category into tabs; "Shapes"/"Paths"/"Brushes"/"Effects" are joinable category names, so creator/Savi blueprints land inside the built-in shelves.
- Hover affordances stay quiet while a selection is active; co-located handle fan-out uses a screen-space threshold so nearly-identical anchors separate consistently; a controls cheat sheet sits under the top-left undo/redo cluster.
- Brush sculpting feel: dabs land on the first ray–terrain crossing (the cliff face under the pointer), the cursor projects against the sculpted surface frozen at stroke start, built-in Raise/Lower compensate for slope, and the brush ring drapes over the terrain.
- Savi: the god-mode briefing fires only when a game has no creator tabs and steers her toward a per-place "Places" tab, blueprints/brushes in a zoo place, and
withPersistencefor panel edits; heightmap-terrain skill triggers incidental terrain and tames domain-warp spikes.
›migration notes
The god-mode authoring UI is now a tab rail in the top-right, defined by a new creatorTabs array on the spec. It replaces creatorUi and the god-mode half of modUis. Each tab is ONE script module: its default export is render(localPlayer, world) => htmlString, and it may add named exports onMount(container, localPlayer, world) / onDestroy(container) for mount-managed panels.
Migrate every affected game:
- If the spec has
creatorUi: { render: "scripts/creator-ui.js" }, replace it with a tab and deletecreatorUi:creatorTabs: [ { id: "creator", title: "Creator", icon: "🛠️", script: "scripts/creator-ui.js" } ] - For each
modUisentry whosemodeis"god"— e.g."slash-fx#editor": { label: "Slash FX", icon: "🧩", shortcut: "F", ui: { render: "scripts/panel.js" } }— add acreatorTabsentry and remove that entry frommodUis:
The tab's{ id: "slash-fx#editor", title: "Slash FX", icon: "🧩", shortcut: "F", script: "scripts/panel.js" }scriptis the oldui.rendermodule — its default export is still the renderer, and anyonMount/onDestroynamed exports keep working. No script edits are needed. - Leave
modUisentries withmode: "game"untouched — those are gameplay panels, not god-mode, and are unaffected. creatorTabsis ordered: the first tab is selected by default. Put the primary authoring panel first.- Strip self-positioning from each migrated panel script. The engine now mounts the panel in a container directly under the tab row, so the panel's
rendermust return plain content. Remove anyfixed/absolutewrapper and any top padding/margin that the old panel used to clear the topbar (e.g.class="fixed right-4 top-20 …"→ just the inner<div>). Leaving it in double-offsets the panel.
If a game had no creatorUi and no mode: "god" modUis, it needs no changes — god mode still has its built-in authoring (handles, toolbar, undo/redo).