Releases / v0.81.0

v0.81.0 Still There

2026-08-29 Engine Latest

Your bake is there when you open the project. A query says what it hit and what that thing is made of. And you can look at a particle effect without opening the editor.

Your navmesh survives being closed

Bake a Nav Mesh, save, close the editor, open the project again — and the bake was gone. Not lost: the file had been sitting beside the scene the whole time. It was never loaded, and nothing said so. An unloaded navmesh looks exactly like one you never baked, so the only thing to do was press Bake again, every session.

Light Probes had it too. A scene came back with no bounce light for the same reason, with the same silence.

Opening a project through File ▸ Open Project always worked. Launching the editor on a project — from the Hub, or from the command line, which is how a project actually gets opened — did not. Both load the bakes now, and so does a scene a script switches to with scene.load while the game is running: a game that changed levels had been pathing on the previous level's navmesh.

A bake written by an older version of Floptle is remade once, on its own, the first time you open the level, and the Console says so when it happens.

What am I standing on?

A footstep, an impact decal, a splash — each of them needs to know what the ground is made of, and the engine could only tell you which node you hit. One building is one node, and its brick, its grass and its floorboards are three materials on it, so a whole mansion answered "brick".

Every query hit now carries material: the name of the material slot it landed on, exactly as you typed it and as the Inspector shows it.

lua
local hit = spherecast(node.pos, vec3(0, -1, 0), 0.14, 1.2, { layers = "Level" })
if hit and hit.material == "Boards" then
  audio.play("audio/footstep_wood.ogg", node)
end

raycast, spherecast, capsulecast and overlapSphere all answer it. It is nil for anything with one surface — terrain, a Collidable cube, an imported model, another character — because a name invented for those would be right for map meshes and quietly wrong everywhere else. Use hit.node:material() there.

Reading it costs a lookup; not reading it costs nothing. A line-of-sight ray that only wants hit.distance pays for none of this.

raycast also names the node it hit for level geometry now. It used to answer nil for anything that was not a physics body, while spherecast — same fields, same documentation — named it. If you tried a ground check with raycast, got nothing, and concluded the engine could not tell you, it can.

Look at a particle effect without opening the editor

floptle vfx --effect Sparks

One effect, rendered to PNGs across its own timeline, with no window:

Sparks: visible over 0.141s, 5 frame(s) at 480x480
  t=  0.028s    1.5% of frame  Sparks.t00028ms.png
  t=  0.056s    1.9% of frame  Sparks.t00056ms.png
  t=  0.084s    2.0% of frame  Sparks.t00084ms.png
  t=  0.113s    1.9% of frame  Sparks.t00113ms.png
  t=  0.141s    1.4% of frame  Sparks.t00141ms.png
  all of them: Sparks.sheet.png

A single frame cannot show an effect. A burst is a blank frame before it fires and drifting smoke after it, and both are correct — so this takes a spread of moments and tiles them into one contact sheet. The camera is identical in every frame, so the start really can be compared against the middle. --at 0.084 renders exactly that moment, framed close.

Which moments are worth photographing is decided by looking: the effect is rendered at thumbnail size across its whole timeline first, and the frames are spread over the part where something is actually on screen. A quarter-second burst gets five frames of that quarter second rather than four frames of the empty second after it.

--scene renders it inside a level, at the node that plays it and through that scene's camera; --background sets the colour behind it otherwise. Each frame reports how much of the picture the effect covers, measured from the picture itself — so a frame with nothing in it says so, instead of leaving you to wonder whether the effect or the renderer was at fault.

Upgrading

Nothing to do.

Floptle Hub

Linux x86_64 7.5 MB Download → sha256 95d4a3b8998fcc3484f5ac0e7909fe4966721daa7f2e0ab4714fa7d76f53c80f
macOS Apple Silicon 5.7 MB Download → sha256 4d318af82da489388cb9ca59cb0f63102a557c3a32d7323c199f47e046d82822
macOS Intel 6.2 MB Download → sha256 184d403200d6f9ce35677c6c3d10be36126df994eec14c6b9faae4e889dd5003
Windows x86_64 7.1 MB Download → sha256 a6853a5fa7024929cebeeb804ae3f8ca39a78bf30ef5cdf703c501ded87331fe

Engine

Linux x86_64 20.9 MB Download → sha256 1bbdb16bfdff7320ef2895811ca1a2761df6ff3bfe346fa8295d59603cac6509
macOS Apple Silicon 16.9 MB Download → sha256 f02e0e59d7cf96f552bc2bd68a6fefdc76ba48ca56c71619efaa2bf72cbdc4ff
macOS Intel 18.2 MB Download → sha256 5d39adccadeec726b687810a63c5ee256fb0f8a0e0091c60049eec395d52f369
Windows x86_64 20.6 MB Download → sha256 1e52606daded66e3a38aaaa24dfbb095c5a0eb61752e3428121c3698224ab35f

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.