Releases / v0.114.0

v0.114.0 Stays In Front

2026-10-07 Engine

One camera can now be drawn over another, so first-person arms never clip into walls. Scripts can build objects out of models at runtime and move nodes between parents, inventories lay out as grids, hiding a node hides what is under it, and headless shots show render targets.

Arms that never clip into walls

A camera has a new stack setting in the Inspector: a list of other cameras drawn on top of its picture. Each stacked camera draws only the layers it renders, over an empty depth buffer, so nothing the camera beneath drew can hide them.

To set up first-person arms:

  1. Put the arm rig on its own layer (add one in Settings ▸ Layers).
  2. On the player's camera, untick that layer under renders:.
  3. Add a second camera parented to the first, and tick only that layer under its renders:. It does not need to be the active camera.
  4. On the player's camera, pick the second camera from stack ▸ + add camera, or drag it in from the Hierarchy.
  • Rows drag to reorder; the bottom row draws on top.
  • A stacked camera keeps its own field of view, so the arms can use a narrower one than the world.
  • It draws its layers lit by the scene's sun, lamps and fog. It draws no sky, terrain, particles or script shapes.
  • The stack is laid on before post-processing, so bloom and grading cover the whole picture.
  • It applies in the Game tab, in exported builds, in floptle shot and camera.capture, and on cameras that draw into a render target.
  • From a script: node:setCamera{ stack = { 'ArmsCam' } }, and stack = {} clears it.

The full walkthrough is in Camera stacks.

Build objects out of models at runtime

  • node.model on an Empty turns it into that model. An Empty is what createNode makes, so a gun can be assembled from a frame and its parts without a pool of hidden placeholder nodes: createNode("Barrel", gun, function(n) n.model = "models/barrel.glb" end). On a light, a camera or anything else that already is something, the Console now says the write did nothing, once, instead of staying silent.
  • node:setParent(other) moves a node under another, or to the top level with nil. It stays where it is in the world by default; { keepWorld = false } keeps its local position and rotation instead, so it lands at the same spot relative to its new parent. A move under its own child is ignored.

Inventory grids

A ui.make row or column takes wrap = true: children that do not fit start a new line, so a row of fixed-size tiles becomes a grid whose column count follows the container's width and reflows when it is resized. The UI Inspector has the same switch as wrap onto new lines. See ui.make.

Hiding a node hides what is under it

node.visible = false now hides the node and every node under it, the way the Hierarchy reads. A prefab whose model is a child is hidden by hiding its root. Each node's own visible still reads back as it was set, so showing the root again brings back exactly what was shown before.

On upgrade: a script that hid a node to hide only that node's own model, leaving its children drawn, now hides the children too. Move that model onto a child of its own and hide the child instead.

Directions under a rotated parent

  • node:lookAt and node:turnTowards face the world target whatever the parent's rotation. Under a turned parent they used to point off by that turn.
  • node.forward and node.right are in the parent's space, the same space as node.pos, and the docs now say so. For a world direction, such as panning along a camera's right under a turned parent, use node:worldForward(), node:worldRight() and node:worldUp().

Hands that keep hold

Animator pose changes queued in lateUpdate (reach, lookAt, setBoneRot, …) now land on the same frame. A hand reaching for a gun held under the camera used to trail it by a frame whenever the view moved.

Material rules that survive a re-texture

A material handle reads m.source: the project material file it follows, such as "materials/Checkerboard.ron", or nil for a material of its own. A rule like "this surface can't be grappled" can key on that instead of on a texture that may be repainted. From a raycast hit: hit.node:material(hit.material).source.

Render targets in headless shots

floptle shot and camera.capture taken during a shot now draw render targets, so a screen, a minimap or a UI image wearing rt:<name> shows its camera's picture instead of white.

Upgrading

Nothing to do, except where a script hid a parent and expected its children to stay drawn (see above). Scenes without a camera stack look exactly as before.

Floptle Hub

Linux x86_64 10.7 MB Download → sha256 66df87f1b46e98b07267e488dbeda308508cf99b93025f5117d2337ba9c9031b
macOS Apple Silicon 7.4 MB Download → sha256 1af2031881a0209427a232a5b71964269356a3b90435fc14cb8293eae83efec1
macOS Intel 7.9 MB Download → sha256 eb84ee7d927b6fbbcedc2ba45b6c4e45b51782beb04c9626ffd60c8f16cd1568
Windows x86_64 9.1 MB Download → sha256 b52ca07b6bc60e0abe37acd31f3ab1daf51059de3e6367ad616fb0a2fafd019c

Engine

Linux x86_64 53.7 MB Download → sha256 e7ce6151155767dd128704bb560ad602a13486524e68dc16d7efa6684bb56320
macOS Apple Silicon 41.7 MB Download → sha256 842dc60771bdb2ce1994f931985ac1832a40b7853bad7bfd29600eb6082a57a1
macOS Intel 44.9 MB Download → sha256 52ae01d1953f5e82c6ac16a9dc8240e1de056e412b68a2e491cbee6a29f0849d
web 4.8 MB Download → sha256 32a8c487fc9a565dd703c37dc8830029d2f574a70d519fe37e91462ab12fec48
Windows x86_64 50.7 MB Download → sha256 c48a2f1d8a0215075032142c5045d7c1361c81e70e25078ebe7a6800b772b502

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.