@displayxr/inline3d 1.21.0 → 1.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,15 @@ entry points (`.`, `./three`) are frozen for 1.x, while the **scene subpaths** (
5
5
  `./splat`, `./model`) are a preview tier whose options may change in any release. Entries below say
6
6
  which tier they touch, because that is what tells you whether an upgrade can move your pixels.
7
7
 
8
+ ## 1.21.1 — 2026-09-24
9
+
10
+ Touches the **preview tier** (`./splat`, `engine: 'playcanvas'` only). No API change; nothing changes at rest.
11
+
12
+ - **A gated `reveal` no longer shows its start state frozen.** The splat is hidden until the reveal's clock
13
+ starts, so its first visible frame is the first frame of motion; previously the start state (e.g.
14
+ `assemble`'s scatter) sat still for up to the rest of the `firstWoven` hold, then jumped. On a cached
15
+ asset the tile is empty for the rest of the hold instead.
16
+
8
17
  ## 1.21.0 — 2026-09-24
9
18
 
10
19
  Touches the **preview tier** (`./splat`, `engine: 'playcanvas'` only). Minor: a new `setSource`
@@ -3630,7 +3630,22 @@ export function attachPlayCanvasSplat(out, wall, canvas, src, opts, pending = []
3630
3630
  // tile is woven (handle.firstWoven — which is immediate in 2D) and the first frames are built.
3631
3631
  if (revealSpec) {
3632
3632
  const gate = Promise.resolve(out.firstWoven).then(() => afterTicks(2));
3633
+ // The splat stays HIDDEN until the gate opens, so the first frame anyone sees is the first
3634
+ // frame of motion. The gate is `firstWoven`, a worst-case hold of up to 1.2 s past the
3635
+ // layer's birth (docs/woven-canvas-rules.md §5), and the browser usually joins the canvas
3636
+ // well before it ends. Drawn meanwhile, the start state (a particle reveal's scatter) sat
3637
+ // frozen on the woven panel for the rest of the hold and then jumped into motion. Hidden,
3638
+ // the tile is empty for that span, which also keeps stereo pixels off a canvas that may
3639
+ // not be joined yet (rule 5). Registered after fx.play's own `.then`, so it lands in the
3640
+ // same microtask that releases the effect: the clock starts on the frame it first shows.
3641
+ entity.enabled = false;
3633
3642
  fx.play(revealSpec.type, revealSpec.raw, { gate });
3643
+ gate.then(() => {
3644
+ if (removed || current?.entity !== entity) return;
3645
+ // setVideo took the splat off screen meanwhile: its exit restores what it saved.
3646
+ if (vid?.saved?.entity === entity) vid.saved.splatEnabled = true;
3647
+ else entity.enabled = true;
3648
+ });
3634
3649
  }
3635
3650
  for (const [what, name, arg] of fxPending.splice(0)) {
3636
3651
  if (what === 'set') fx.set(name, arg);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@displayxr/inline3d",
3
- "version": "1.21.0",
3
+ "version": "1.21.1",
4
4
  "description": "Turn any HTML <canvas> into a glasses-free-3D window on a DisplayXR display, inside an ordinary web page. Dependency-free; progressive enhancement (falls back to plain 2D everywhere else).",
5
5
  "type": "module",
6
6
  "types": "./index.d.ts",