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.
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
Engine
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.