Releases / v0.92.0

v0.92.0 What You See

2026-09-13 Engine

Ten things that were quietly not true. The ground you walk on is the ground that is drawn. Fog can be dark. The Console keeps talking after the second time you press Play. And the scripting guide is a set of chapters instead of one very long page.

The ground matches the picture

Terrain collision was measured against the underlying field, and the terrain you look at is triangles extracted from that field. Those are two different surfaces — the triangles cut across every curve, inside a bulge and outside a hollow — so a hillside you could see solid in front of you let you sink into it, and a dip you could see beneath your feet held you above it. The same model, in both directions, on the same hill, which is why it read as collision being vaguely wrong rather than as an offset you could learn to expect.

Physics now collides against the triangles you are looking at, and asks the field only which side of them you are on. Measured on rough ground at a half- unit voxel, the old answer was out by up to a fifth of a voxel where the terrain is busiest — and it scales with the voxel, so terrain authored coarse was out by more. Digging, sculpting and terrain.* from a script are unaffected: the surface is remeasured the moment the ground changes.

Fog can be dark

Fog tinted surfaces and left the background alone, which reads as fog only while the fog colour is close to the sky's. Pick anything darker and the distant hills turn to silhouette against air that has not moved: the geometry visibly changes and the fog is nowhere. There was a hard seam at the horizon in every foggy scene.

The distance fog now reaches the sky, weighted toward the horizon so a painted skybox survives overhead. Lighting ▸ fog ▸ takes the sky is how much, and 0 is the old surfaces-only look if a scene wants it. A night fog, a cave haze, a dust storm at dusk — all of them are a colour you can now actually pick.

The Console keeps talking

Press Play a second time without editing anything and the Console went silent. Every diagnostic the engine writes is deliberately said once and then held back — sixty identical lines a second is how a Console stops being read — but the suppression was keyed to the file, not to the run, and pressing Play clears the panel. So the second run emptied the Console and then refused to refill it.

Worse: a script stopped for overrunning its time budget was held back "until its file changes", and after a Stop there was nothing left to change its mind. It never ran again for the rest of the session, and nothing said so.

Every run now starts with a clean slate. A script that cannot load says so on the first frame of every Play; a lookup that finds nothing explains itself again; a script the budget stopped gets another go.

node.scripts

node:getScript("name") answers nil when the name is wrong — and nil is also what "no such node" and "not running yet" look like. The plural is the thing you actually want first:

lua
for _, s in ipairs(node.parent.scripts) do print(s.kind) end

Every script on a node, as handles, in the order they were attached. Possibly empty, never nil.

Posing a model without losing it

Locking the selection exists so a stray click cannot take you off the thing you are working on — and posing is exactly when you want that. But the lock swallowed bone clicks too, so it could not be used with the Animating tab at all. A bone of the held model is part of that model, not a way out of it: those clicks land now, the model stays selected, and its rig stays on screen. A bone belonging to some other model is still refused.

Keyframes that hold, one at a time

A clip could be stepped or smooth, whole. That is not what stepped animation is: it is a clip that holds each pose and snaps on the beats the animator chose, with the odd move eased through. The only way to get a hold in the middle of a smooth lane was to key the same value twice and hope nobody retimed it.

Right-click any key in the Animating tab → ⇥ Hold until next key. It is per key, on transform and property lanes alike, and the lane's own setting is now the default for keys that have not been told otherwise. A clip that does not use it is unchanged, down to the bytes its file is saved as.

Terrain textures: the real picker, and a scale each

The texture slots in the Terrain tab had a plain dropdown listing every image in the project in tree order — no search, no folders, no thumbnails — while every other texture field in the editor had the full picker. They all use the same one now.

Each slot also gets a ▦ × control: how often that texture repeats, relative to the rest of the palette. A fine gravel and a broad rock face only look like the same ground if one of them tiles several times as often, and until now the only way to arrange that was to resample the image.

The edge of the picture keeps up

With motion blur on, a fast camera swing left a band around the edge of the frame that stayed sharp while everything inboard of it smeared — worst on the sky, which is at infinity and so the fastest thing in any pan, and gone the instant the camera stopped. Blur samples that fall outside the frame are dropped now instead of folded back onto the border pixel.

The scripting guide is chapters

The guide was one page of thirty-seven sections — findable by searching for a word you already knew, and no use at all for the thing you did not know existed. It is eleven chapters now, each a page of its own: Start here, Nodes & the scene, Physics, Input, Assets & materials, Animation, particles & sound, Maths & the world, Multiplayer, Data, time & the outside world, Steam and Working in the editor.

The same chapters are in the editor — Scripting ▸ § Docs ▸ 📖 Guides — with the contents down the left and one page at a time, instead of twenty-four collapsing headers in a single scroll. Section numbers have not moved, so the engine's own messages still point where they always did.

Every call that can fail says how

A reference that names a second return value and then never mentions it again is not something you can write error handling against. Every call that hands a script an error now lists what fills it — all four assets.read* / write* calls, json.decode, and every steam.* call — and the reference will not build without it the day a new one is added.

Upgrading

Nothing in a project needs changing. Scenes saved by this version gain a fog setting and, if you use them, per-key animation holds; both are written only when they differ from the default, so an untouched project's files do not move. Scenes from earlier versions open with the fog reaching the sky — if a scene was built around the old seam at the horizon, set takes the sky to 0.

Floptle Hub

Linux x86_64 7.9 MB Download → sha256 904e7ad035ca15eed1ea11ed5bf7f0f35ff1acc494126601369aacc6806acf75
macOS Apple Silicon 5.9 MB Download → sha256 4d73774eb0d0c11d00ce2ad0cd47dba0d292e2b300f1623e102c9c445e6d6999
macOS Intel 6.4 MB Download → sha256 33be3f3d4ef3bd5f7723fcc8c346df8ddf39f792fac3a520138bc814399a671e
Windows x86_64 7.3 MB Download → sha256 0c254a388b23e9c81969b8b8cb1013fb334b5af47a21c8d970097dd3328c6643

Engine

Linux x86_64 33.8 MB Download → sha256 d30bc7cd72bb52f6a43e8e780268a7259a09e95b97f2d9fccf26dc80512f2bad
macOS Apple Silicon 27.4 MB Download → sha256 dcafcba55613a7ddb9566367586932ab71572549def3bf52a85896cfadd978a9
macOS Intel 29.6 MB Download → sha256 4f23b1bfe392029b99b196e7335af48c341c2b099bcaec6b0106aecf4c093031
web 4.4 MB Download → sha256 edb5c4063a834cc20ef43ca59d2d8b9b4bf60413b4edfed4d2a9b4e42d130198
Windows x86_64 33.4 MB Download → sha256 dc2663f574a5e24df4a21ff79d89ded0da527aaebb954b56a3c39d388c72817f

The binaries are not signed yet. On macOS, right-click the app and pick Open the first time. On Windows, if SmartScreen appears, pick More info then Run anyway.