Skip to content

v2.0.4

Choose a tag to compare

@github-actions github-actions released this 16 Sep 07:47
· 1400 commits to main since this release

workbench-opacity — a translucent monomer (a window pane over a cassette)

  • New: opacity on any lathe / extrude / sweep / loft / drape / relief monomer (0 < opacity < 1)
    stamps a face-level alpha, which the orbitable World and the glTF leg already render per group
    (the cellular-view jelly path). A thin opacity: 0.25 extrude over a pocket reads as a window with
    whatever sits behind it visible — the Walkman's cassette door. Absent or 1 → faces untouched,
    byte-identical; the glass material row's opacity is still not read, so every minted glass part
    stays exactly as opaque as it was. Card: solid-vocab/workbench.md (Groups, a hinge, and a bare studio).
    The SVG still and CSS-3D shots draw the pane opaque (advisory, unchanged).

relief-unmirror — raised outlines read the right way round

  • Fixed: every reliefs monomer rendered mirrored. reliefToFaces negated the in-plane
    right axis on the belief that the raise flipped handedness; it does not (both contour sources
    arrive y-up — text from the font, SVG paths through flipY), so a wordmark embossed on a
    workbench part read backwards from the side it faces. The frame is now the plain right-handed
    (up × normal, up, normal). Emission changes for every already-minted relief, which is the
    point: they were all backwards. relief-faces.test.js pins an L's stem on the left for text,
    for a path, and under an explicit normal / up frame.

bound-mesh-decollide — a GI-baked object keeps its DCC planes in the World

  • Fixed: the World's de-collide pass skipped for bound meshes. emitThreeWorld lifts a
    face stacked on coincident neighbours a hair along its normal, scaled by the face's size and
    by how many it overlaps. A DCC re-triangulates every cap as a fan of large overlapping
    triangles, so a meshRef bind-back (a Blender GI bake placed in a world) had its lid cap
    floated millimetres through the proud plate in front of it. Faces in a mesh:<name> render
    group now bypass the pass (decollideExceptBound); they arrive already resolved. Worlds
    without a bound mesh take the unchanged path, byte-identical.

update-sketch-patch — iterate a stored recipe by naming the part

  • Added: update_sketch { patch } — an ordered list of set / remove / add ops addressed
    by monomer id or JSON Pointer path, applied to the stored manifest and then run through the
    same mint gates a full replacement pays. The stored row is still the whole resolved manifest;
    the archived revision carries the ops as its diff. Exclusive with manifest.
  • Added: update_sketch { readout } — changed (the default for a patch) returns only the
    parts a patch touched or moved (a touched cut operand surfaces its cut's part), removed parts,
    parts_total, plus new warnings (warnings already present on the previous revision collapse to
    one counted line); summary drops parts[]; full is the previous block unchanged, and stays
    the default for a manifest replacement. The previous readout comes from an in-process cache of
    the last edit's stats when this process made it, else one extra plan.
  • Added: id on each stats.parts[] row of a workbench readout when the monomer carries one.
    Additive; the render is untouched.
  • Changed: the tools/list payload pin in tool-descriptions.test.js re-pinned for the two new
    update_sketch input-schema properties (why: a legitimate addition crossed the pin; the
    description itself stays under its ceiling).

pixelizer-godot — the 2D reducer games get a Godot leg, and the 3D leg learns to measure

  • Added: export_game { target: 'godot' } on a pixelizer game (and scripts/export-godot.mjs --ref <ref>) emits a Godot 4 arcade pack instead of refusing. The pack is DATA — game.json,
    skin.json (the bank tiles, legend and palette), probe/replay.json, the groove and SFX WAVs when
    music is on — performed by a separate versioned kernel (godot-arcade-kernel/, 0.1.0):
    brickster.gd is a hand-authored port of the JS reducer (mulberry32 7-bag, SRS kicks, guideline
    hold, the same scoring), arcade.gd the shell (the web shell's key map, gravity timer, start
    gate, HUD, game-over card, music loop, SFX cues). One reducer, two instruments; the web build
    stays the reference. philosophers-stone is not ported yet and refuses with a teaching error.
  • Added: the replay probe, a machine-gate rung. The pack carries a seeded action script and
    the JS reducer's expected outcome; the gate runs godot --headless … -- --mojulo-replay and
    compares board, score, lines, hold, queue and game-over flag field by field. A port that drifts
    from the reducer fails the gate, not the eyes.
  • Added: [mojulo-perf] on both headless probes. Process and physics time plus node and object
    counts at the probe's last frame, stamped advisory under the gate result; the arcade probe adds
    replay_ms, the reducer port's wall time for the whole script. Headless has no renderer, so no
    render time is claimed. --mojulo-shot=<png> on a windowed arcade run saves the drawn viewport
    after the replay, so the eyes gate has a picture without opening the editor.
  • Changed: 3D kernel 0.2.2. The HUD label is assigned only when its text changes; hazard and
    meshless-entity markers share one material and one unit mesh per kind instead of allocating
    their own. No visible change; fewer draw states, nothing allocated per frame.

prepack-heap — the publish build gets an 8 GB heap

  • Fixed: npm publish aborted with JavaScript heap out of memory. The webpack production
    build now needs more than V8's default ~4 GB old space; prepack sets
    NODE_OPTIONS=--max-old-space-size=8192 for the next build --webpack step. Dev and the
    standalone runtime are untouched.