Changelog
One line per feature. Nothing has been released yet, so everything is under
Unreleased; a release is a v* tag whose notes become that version's section.
Unreleased
Scripting
- Rune is the only scripting language; a deterministic
libm-backedmathmodule. - Exported script properties:
pub fn exports(),script = { source, props }, edited in the inspector. - Script debugger: breakpoints, stepping, call frames with locals.
- Debug Adapter Protocol on
balaur run --debug <port>;--debug-waitholds the boot. - Component handles:
node.body2d.apply_impulse(x, y), plusget/set/has/remove. script.attempt,modfiles from disk and packs,balaur api.ScriptHost::call_in(path, function, args)for project-level hooks.- The script API documents itself: every module, function, component and asset type.
Scenes and assets
- Prefabs:
instancebuilds another scene as a node's children, withoverridesper path. - Prefab ids are prefixed by the instance's, so two instances never collide.
- Overrides patch rather than replace, and reach components, the transform and
scriptprops. - Component tags and presets, project-defined in
presets.toml. - Binary assets in packs (format 2, sha256-verified);
assetsmode inproject.toml. mesh(OBJ,.glb,.gltf, inline) andheightfieldasset types.scene.component_properties(name, params): what a component'sapplywould receive.- Node paths accept
..;node:set_parent(other)keeps the world pose.
Rendering and animation
- Shaders in WESL, linked to WGSL at run time;
materialasset type;spritetakes a material. spritecomponent: textured 2D quads with sheets.polygoncomponent: a textured 2D polygon, GPU-skinned to a rig.- 2D and 3D skeletal animation:
bone2d,bone3d, theskeletonmodule, CPU skinning. modifier2d:look_atandtwo_bone_ik, run after the clip.rotationclip tracks take quaternion keys.examples/rigis one figure: the arm's bone chain branches off the body's top bone rather than hanging beside it from the character root, so one clip drives one skeleton.- New 3D shapes (capsule, cylinder, cone, plane, mesh) and 2D shapes (capsule, polyline).
Physics
- The rest of Rapier, in both dimensions (
docs/PLAN-rapier.md): every rigid-body property rapier has — damping, gravity scale, axis locks, CCD, dominance, mass, per-body sleep, forces and torques. - Joints: fixed, revolute, prismatic, spherical, rope, spring, pin-slot and generic, with motors, limits,
break_force, and impulse or reduced-coordinate solvers. - Inverse kinematics on a reduced-coordinate chain:
physics3d.solve_ik. - Character controllers:
character3d/character2dandmove_character, sliding, stepping, slope limits, ground snapping, and pushing what they walk into. - The whole query pipeline: raycasts, shape casts, point, shape and box queries, pairwise distance and time of impact, filtered by body kind, layers, an excluded node or a script predicate.
- Collision and contact-force events reach the node's script as
on_collision_start,on_collision_stopandon_contact_force; a broken joint ason_joint_break. - The three physics hooks —
filter_contact,filter_overlap,modify_contacts— and one-way platforms. - New colliders: 3D capsule, cylinder, cone, triangle, segment, halfspace, trimesh, convex hull, convex decomposition, polyline, heightfield, voxels, voxelized and mesh-fitted; 2D gained all of them but the solids.
- Colliders carry offsets, 32 collision layers, solver layers, combine rules, contact skin and per-collider mass; one on a child node belongs to the body above it, which is how a body carries several shapes.
- Voxel terrain is editable while the game runs:
physics3d.set_voxel, andcollider_meshtessellates any grid for drawing. - A ray-cast vehicle:
vehicle3dwithwheel3dchildren, suspension tuning, engine force, brake and steering. geometry3d: convex hulls, convex decomposition, voxelising, cutting a mesh with a plane, boolean intersection, and separating a mesh into its pieces.- Physics debug draw (
physics.set_debug_draw), the solver's own tuning through[physics]inproject.tomlorphysics.set_tuning, quarantine reporting and step counters. - Two build-time choices:
parallelruns rapier's coloured solver on rayon, andf64swaps in double precision for worlds tens of kilometres across.
Determinism and networking
- One fixed 60 Hz step (
Stage::FixedUpdate,--fixed-tick). - Per-tick digest with
first_divergence,--trace-digest, and a cross-OS CI check. - Record and replay:
run --record,replay --verify/--entries-at. - Rollback on one machine: snapshot ring, input journal, re-simulation from a late input.
- Rollback across spawns: run-time nodes get stable ids and the node set is restored.
- Two engines play in lockstep over a socket:
NetSessionover aTransporttrait. - Websockets carry binary frames and negotiate
permessage-deflate. App::add_replay_setup: loaded state goes in the recording's header, restored before tick one.
Batteries
- Input actions:
[input.actions]binds a name to keys, mouse, pad buttons, axes and key pairs. - Rebinding through
input.bind, saved per user; a recording carries the bindings it used. - Save games:
save.write/read/slots/remove, atomic, versioned, with migrations. - Localization:
strings/<locale>.toml,strings.trwith interpolation and plural forms. - Game UI containers:
row,columnand apanelthat lays out, withpadding,gap,align. - Widget focus, keyboard and pad, with
focusable,on_focusand theui.focus_*verbs. widget_themeasset: fill, stroke, radius and padding per widget kind, inherited.- Audio buses:
[audio.buses], routing per sound,audio.set_bus_volume. - Audio events:
audio/events.toml, variations taken in turn.
Editor
- Undo/redo, collapsible inspector sections, node copy and paste,
--state dock:<name>. - Prefabs: instance rows in the tree, edits written as overrides, placed from the palette.
- Rig and Polygon tools; bones pick and grow in the 3D viewport.
- Ray picking, the Assets dock's filesystem verbs, in-editor linting with a language server.
- Profiler dock;
balaur run --timingsprints per-stage mean, worst and share of a frame. - Showcase pipeline:
scripts/showcase.shretakes the website's images and clips.
Breaking
shape/body/colliderare nowshape3d/body3d/collider3d; script APIs moved tophysics3d.coloris a property ofshape3d,shape2d,spriteandparticles, not a component.- Luau is removed:
.luau,language = "luau"/"mixed"andbalaur_script_luauare gone. animation.is_runningisanimation.is_tween_running.ui.selectisui.dropdown.