pixi-effects 0.18.1 → 0.20.0

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +6 -6
  3. package/ai/CHAT.md +1 -1
  4. package/ai/SKILL.md +2 -1
  5. package/ai/chat-template.html +4 -4
  6. package/ai/reference/cheatsheet.md +10 -9
  7. package/ai/reference/pitfalls.md +9 -0
  8. package/ai/reference/recipes.md +117 -0
  9. package/ai/template.html +5 -5
  10. package/ai/tools/check.mjs +29 -6
  11. package/dist/{Base-BQUodYZK.d.ts → Base-CzfLGoDr.d.ts} +9 -1
  12. package/dist/{Base-OHqp8qvX.d.cts → Base-wYJQ2g5Q.d.cts} +9 -1
  13. package/dist/Composition-6PA4C4TV.js +5 -0
  14. package/dist/{Composition-MLBHYYFF.js.map → Composition-6PA4C4TV.js.map} +1 -1
  15. package/dist/Composition-LL2XXU5N.cjs +14 -0
  16. package/dist/{Composition-6JMXWNVV.cjs.map → Composition-LL2XXU5N.cjs.map} +1 -1
  17. package/dist/Controller.cjs +2 -2
  18. package/dist/Controller.d.cts +2 -2
  19. package/dist/Controller.d.ts +2 -2
  20. package/dist/Controller.js +1 -1
  21. package/dist/{Movie-DlHQ9C02.d.ts → Movie-CBxGH5ms.d.ts} +13 -2
  22. package/dist/{Movie-K2YuVAdg.d.cts → Movie-CzzJw8A-.d.cts} +13 -2
  23. package/dist/Presenter.cjs +2 -2
  24. package/dist/Presenter.d.cts +2 -2
  25. package/dist/Presenter.d.ts +2 -2
  26. package/dist/Presenter.js +1 -1
  27. package/dist/{chunk-SG3Y66FN.js → chunk-DQHXVNOI.js} +1029 -64
  28. package/dist/chunk-DQHXVNOI.js.map +1 -0
  29. package/dist/{chunk-JW67MDHQ.cjs → chunk-FFYA3UBU.cjs} +144 -36
  30. package/dist/chunk-FFYA3UBU.cjs.map +1 -0
  31. package/dist/{chunk-DKGG7WD4.js → chunk-MNM56B3X.js} +6 -3
  32. package/dist/chunk-MNM56B3X.js.map +1 -0
  33. package/dist/{chunk-ANO5R2E6.cjs → chunk-NO26HWR7.cjs} +1036 -65
  34. package/dist/chunk-NO26HWR7.cjs.map +1 -0
  35. package/dist/{chunk-UXDR3ZDU.js → chunk-TSPMKV2F.js} +121 -13
  36. package/dist/chunk-TSPMKV2F.js.map +1 -0
  37. package/dist/{chunk-UQBGW5DO.cjs → chunk-WTRKDIKH.cjs} +6 -3
  38. package/dist/chunk-WTRKDIKH.cjs.map +1 -0
  39. package/dist/index.cjs +246 -96
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +4 -4
  42. package/dist/index.d.ts +4 -4
  43. package/dist/index.js +187 -37
  44. package/dist/index.js.map +1 -1
  45. package/dist/loader.css +1 -1
  46. package/dist/{music-4HDFULNR.js → music-CFEC7HKL.js} +3 -3
  47. package/dist/{music-4HDFULNR.js.map → music-CFEC7HKL.js.map} +1 -1
  48. package/dist/{music-3OF5C6X5.cjs → music-UAN7DXK4.cjs} +7 -7
  49. package/dist/{music-3OF5C6X5.cjs.map → music-UAN7DXK4.cjs.map} +1 -1
  50. package/dist/{sfx-MZJZXYY3.cjs → sfx-EX4PUBMV.cjs} +8 -8
  51. package/dist/{sfx-MZJZXYY3.cjs.map → sfx-EX4PUBMV.cjs.map} +1 -1
  52. package/dist/{sfx-S37DDC66.js → sfx-U3GM2MED.js} +3 -3
  53. package/dist/{sfx-S37DDC66.js.map → sfx-U3GM2MED.js.map} +1 -1
  54. package/dist/three.cjs +6 -6
  55. package/dist/three.d.cts +2 -2
  56. package/dist/three.d.ts +2 -2
  57. package/dist/three.js +2 -2
  58. package/dist/{types-SS51lP6O.d.ts → types-YmUaViL1.d.cts} +40 -6
  59. package/dist/{types-SS51lP6O.d.cts → types-YmUaViL1.d.ts} +40 -6
  60. package/docs/dsl.md +58 -5
  61. package/llms-full.txt +196 -15
  62. package/package.json +3 -1
  63. package/dist/Composition-6JMXWNVV.cjs +0 -14
  64. package/dist/Composition-MLBHYYFF.js +0 -5
  65. package/dist/chunk-ANO5R2E6.cjs.map +0 -1
  66. package/dist/chunk-DKGG7WD4.js.map +0 -1
  67. package/dist/chunk-JW67MDHQ.cjs.map +0 -1
  68. package/dist/chunk-SG3Y66FN.js.map +0 -1
  69. package/dist/chunk-UQBGW5DO.cjs.map +0 -1
  70. package/dist/chunk-UXDR3ZDU.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkANO5R2E6_cjs = require('./chunk-ANO5R2E6.cjs');
4
- var chunkUQBGW5DO_cjs = require('./chunk-UQBGW5DO.cjs');
3
+ var chunkNO26HWR7_cjs = require('./chunk-NO26HWR7.cjs');
4
+ var chunkWTRKDIKH_cjs = require('./chunk-WTRKDIKH.cjs');
5
5
  var pixi_js = require('pixi.js');
6
6
  var gsap = require('gsap');
7
7
 
@@ -65,8 +65,8 @@ function readLayerTransform(target) {
65
65
  x: c.x,
66
66
  y: c.y,
67
67
  z: c.z ?? 0,
68
- rotationX: (c.rotationX ?? 0) * chunkANO5R2E6_cjs.DEG,
69
- rotationY: (c.rotationY ?? 0) * chunkANO5R2E6_cjs.DEG,
68
+ rotationX: (c.rotationX ?? 0) * chunkNO26HWR7_cjs.DEG,
69
+ rotationY: (c.rotationY ?? 0) * chunkNO26HWR7_cjs.DEG,
70
70
  rotationZ: c.rotation,
71
71
  scaleX: c.scale.x,
72
72
  scaleY: c.scale.y,
@@ -111,19 +111,19 @@ var Layer3D = class {
111
111
  if (!(needW >= 1 && needH >= 1) || !Number.isFinite(bounds.x) || !Number.isFinite(bounds.y)) return this.hide();
112
112
  const size = this.sizeFor(needW, needH);
113
113
  const frame = { x: bounds.x - pad, y: bounds.y - pad, width: size.w, height: size.h };
114
- const projected = chunkANO5R2E6_cjs.projectLayer(readLayerTransform(target), frame, basis);
114
+ const projected = chunkNO26HWR7_cjs.projectLayer(readLayerTransform(target), frame, basis);
115
115
  this.depth = projected.depth;
116
116
  if (!projected.visible) {
117
117
  if (!this.warnedBehind) {
118
118
  this.warnedBehind = true;
119
119
  if (this.seq.spec.hideBehindCamera) return this.hide();
120
- if (projected.depth > chunkANO5R2E6_cjs.NEAR) {
120
+ if (projected.depth > chunkNO26HWR7_cjs.NEAR) {
121
121
  console.warn(
122
- `pixi-effects: ${chunkANO5R2E6_cjs.describeLayer(this.seq.spec)}: part of it (a corner) reaches the camera plane (z = ${(target.z ?? 0).toFixed(0)}, rotationX ${(target.rotationX ?? 0).toFixed(0)}\xB0, rotationY ${(target.rotationY ?? 0).toFixed(0)}\xB0), and a layer is hidden whole when any corner is at or behind it. Tilt it less (rotationX / rotationY), make it smaller, or keep the camera further away from it (the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`
122
+ `pixi-effects: ${chunkNO26HWR7_cjs.describeLayer(this.seq.spec)}: part of it (a corner) reaches the camera plane (z = ${(target.z ?? 0).toFixed(0)}, rotationX ${(target.rotationX ?? 0).toFixed(0)}\xB0, rotationY ${(target.rotationY ?? 0).toFixed(0)}\xB0), and a layer is hidden whole when any corner is at or behind it. Tilt it less (rotationX / rotationY), make it smaller, or keep the camera further away from it (the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`
123
123
  );
124
124
  } else {
125
125
  console.warn(
126
- `pixi-effects: ${chunkANO5R2E6_cjs.describeLayer(this.seq.spec)} is at or behind the camera plane (z = ${(target.z ?? 0).toFixed(0)}) and is hidden. If that is unintended, lower its z or move the camera back (the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`
126
+ `pixi-effects: ${chunkNO26HWR7_cjs.describeLayer(this.seq.spec)} is at or behind the camera plane (z = ${(target.z ?? 0).toFixed(0)}) and is hidden. If that is unintended, lower its z or move the camera back (the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`
127
127
  );
128
128
  }
129
129
  }
@@ -211,8 +211,8 @@ var CAMERA_PROPS = ["x", "y", "z", "fov", "lookAtX", "lookAtY", "lookAtZ", "offs
211
211
  var NEEDS_THREE_D = ["z", "rotationX", "rotationY"];
212
212
  var SKEW_KEYS = ["skew", "skewX", "skewY"];
213
213
  function lintSequence(spec, warn = defaultWarn) {
214
- const who = chunkANO5R2E6_cjs.describeLayer(spec);
215
- const keys = chunkANO5R2E6_cjs.collectPropKeys(spec);
214
+ const who = chunkNO26HWR7_cjs.describeLayer(spec);
215
+ const keys = chunkNO26HWR7_cjs.collectPropKeys(spec);
216
216
  const explained = /* @__PURE__ */ new Set();
217
217
  for (const k of keys) {
218
218
  const hint = LAYER_ALIASES[k] ?? (spec.type === "camera" ? CAMERA_ALIASES[k] : void 0);
@@ -258,7 +258,7 @@ function applyBlendMode(spec, display) {
258
258
  const mode = spec.blendMode;
259
259
  if (mode === void 0) return;
260
260
  if (!MODES.includes(mode)) {
261
- console.warn(`pixi-effects: ${chunkANO5R2E6_cjs.describeLayer(spec)}: blendMode "${mode}" is not supported (use ${MODES.join(", ")})`);
261
+ console.warn(`pixi-effects: ${chunkNO26HWR7_cjs.describeLayer(spec)}: blendMode "${mode}" is not supported (use ${MODES.join(", ")})`);
262
262
  return;
263
263
  }
264
264
  const filters = display.filters;
@@ -270,7 +270,7 @@ function applyBlendMode(spec, display) {
270
270
  }
271
271
 
272
272
  // src/sequences/Composition.ts
273
- var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
273
+ var CompositionSequence = class extends chunkNO26HWR7_cjs.Sequence {
274
274
  _innerContainer = null;
275
275
  _compositionShape = null;
276
276
  _children = [];
@@ -282,6 +282,34 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
282
282
  _nested = [];
283
283
  /** The null layer each parented layer is drawn inside. */
284
284
  _parentOf = /* @__PURE__ */ new Map();
285
+ /** Set when this composition's own time is remapped: the children live on `_inner` in LOCAL time, driven by `_clock`. */
286
+ _inner = null;
287
+ _clock = null;
288
+ _remap = null;
289
+ _childBase = 0;
290
+ _contentSpan = 0;
291
+ /** Where the children's time starts: the composition's absolute start, or 0 when their time is local (remapped). */
292
+ get childBase() {
293
+ return this._childBase;
294
+ }
295
+ /** How long the children's time runs: the composition's duration, or its content length when its time is remapped. */
296
+ get contentSpan() {
297
+ return this._contentSpan;
298
+ }
299
+ /** The time the children live in at movie time `t`: the movie's own, or this composition's local clock when it is remapped. */
300
+ childTime(t) {
301
+ return this._clock ? this._clock.time : t;
302
+ }
303
+ /** The clock reader for filters that want the time (grain), or null when the children run on the movie's time. */
304
+ localClock() {
305
+ return this._clock ? () => this._clock.time : null;
306
+ }
307
+ /** How the time is remapped, for the timeline chart: `×0.5`, `×-1`, `time keyframes`, or null. */
308
+ remapLabel() {
309
+ const r = this._remap;
310
+ if (!r) return null;
311
+ return r.timeKfs.length ? "time keyframes" : `\xD7${r.speed ?? 1}`;
312
+ }
285
313
  async build() {
286
314
  const width = this.spec.width ?? this.parent?.width ?? this.root.width;
287
315
  const height = this.spec.height ?? this.parent?.height ?? this.root.height;
@@ -300,22 +328,27 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
300
328
  this.intrinsicWidth = width;
301
329
  this.intrinsicHeight = height;
302
330
  this._innerContainer = inner;
303
- this._compositionShape = { width, height, duration: this.duration };
331
+ const base = chunkNO26HWR7_cjs.timeRemapOf(this.spec);
332
+ const span = base ? chunkNO26HWR7_cjs.contentLength(base, this.duration) : this.duration;
333
+ this._remap = base ? chunkNO26HWR7_cjs.remapOf(this.spec, "time", span) : null;
334
+ this._contentSpan = span;
335
+ this._compositionShape = { width, height, duration: span };
304
336
  const lateKeyframes = [];
305
337
  for (const s of this.spec.sequences ?? []) {
306
338
  lintSequence(s);
307
- chunkANO5R2E6_cjs.lintTiming(s, this.duration, (message, kind) => kind === "late-keyframe" ? lateKeyframes.push(message) : console.warn(message));
308
- chunkANO5R2E6_cjs.lintText(s);
339
+ chunkNO26HWR7_cjs.lintTiming(s, span, (message, kind) => kind === "late-keyframe" ? lateKeyframes.push(message) : console.warn(message));
340
+ chunkNO26HWR7_cjs.lintText(s);
341
+ chunkNO26HWR7_cjs.lintKeys(s);
309
342
  }
310
- for (const message of chunkANO5R2E6_cjs.summarizeWarnings(lateKeyframes)) console.warn(message);
311
- this._children = await chunkANO5R2E6_cjs.buildSequenceTree(
343
+ for (const message of chunkNO26HWR7_cjs.summarizeWarnings(lateKeyframes)) console.warn(message);
344
+ this._children = await chunkNO26HWR7_cjs.buildSequenceTree(
312
345
  this.spec.sequences ?? [],
313
346
  this._compositionShape,
314
347
  this.root
315
348
  );
316
349
  this._resolveParents();
317
350
  for (const child of this._children) {
318
- if (child instanceof chunkANO5R2E6_cjs.CameraSequence) {
351
+ if (child instanceof chunkNO26HWR7_cjs.CameraSequence) {
319
352
  this._cameras.push(child);
320
353
  continue;
321
354
  }
@@ -330,7 +363,7 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
330
363
  this._visual.push({ seq: child, layer });
331
364
  applyBlendMode(child.spec, layer.display);
332
365
  if (maskSpec) {
333
- console.warn(`pixi-effects: ${chunkANO5R2E6_cjs.describeLayer(child.spec)}: mask is not supported on threeD layers yet; ignored`);
366
+ console.warn(`pixi-effects: ${chunkNO26HWR7_cjs.describeLayer(child.spec)}: mask is not supported on threeD layers yet; ignored`);
334
367
  }
335
368
  continue;
336
369
  }
@@ -340,7 +373,7 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
340
373
  applyBlendMode(child.spec, child.target);
341
374
  if (maskSpec) {
342
375
  const lifetime = maskSpec.at === void 0 ? { at: child.at, duration: maskSpec.duration ?? child.duration } : {};
343
- const built = await chunkANO5R2E6_cjs.buildSequenceTree([{ ...maskSpec, ...lifetime }], this._compositionShape, this.root);
376
+ const built = await chunkNO26HWR7_cjs.buildSequenceTree([{ ...maskSpec, ...lifetime }], this._compositionShape, this.root);
344
377
  const maskSeq = built[0];
345
378
  if (maskSeq?.target) {
346
379
  into.addChild(maskSeq.target);
@@ -371,20 +404,79 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
371
404
  }
372
405
  this.buildFilters();
373
406
  }
407
+ displayProps() {
408
+ const r = this._remap;
409
+ return r ? { initial: r.restInitial, keyframes: r.restKfs } : super.displayProps();
410
+ }
374
411
  bindTimeline(timeline, offset = 0) {
375
412
  super.bindTimeline(timeline, offset);
376
- const childOffset = offset + this.at;
413
+ const remap = this._remap;
414
+ const childOffset = remap ? 0 : offset + this.at;
415
+ this._childBase = childOffset;
416
+ const target = remap ? gsap.gsap.timeline({ paused: true, defaults: { ease: "none" } }) : timeline;
377
417
  for (const child of this._children) {
378
418
  const own = gsap.gsap.timeline({ defaults: { ease: "none" } });
379
419
  child.bindTimeline(own, childOffset);
380
420
  child.maskSequence?.bindTimeline(own, childOffset);
381
- timeline.add(own, 0);
421
+ target.add(own, 0);
382
422
  }
423
+ if (remap) this._bindClock(timeline, target, remap, offset);
383
424
  const overlap = findOverlap(this._cameras.map((c) => c.window()));
384
425
  if (overlap) {
385
426
  console.warn(`pixi-effects: cameras #${overlap[0] + 1} and #${overlap[1] + 1} overlap in time; the top-most one wins`);
386
427
  }
387
428
  }
429
+ /** Drive the local timeline `inner` from the clock, and put the clock's tweens on the outer `timeline`. */
430
+ _bindClock(timeline, inner, remap, offset) {
431
+ let last = NaN;
432
+ let cur = 0;
433
+ const clock = {
434
+ get time() {
435
+ return cur;
436
+ },
437
+ set time(v) {
438
+ cur = v;
439
+ if (v === last) return;
440
+ last = v;
441
+ inner.time(v);
442
+ }
443
+ };
444
+ this._inner = inner;
445
+ this._clock = clock;
446
+ const scope = this.scope();
447
+ if (remap.start !== void 0 && remap.timeKfs.length === 0) clock.time = remap.start;
448
+ chunkNO26HWR7_cjs.bindClock(timeline, clock, "time", remap, this.duration, offset + this.at, scope);
449
+ inner.time(inner.duration());
450
+ inner.time(0);
451
+ last = NaN;
452
+ this._warnUnreachable(chunkNO26HWR7_cjs.clockTable(remap, "time", this.duration, offset + this.at, scope, offset + this.at + this.duration), offset + this.at, offset + this.at + this.duration);
453
+ }
454
+ /**
455
+ * A child the clock never dwells in is never visible: say so. Its `at` is in THIS composition's local time, so the usual mistake is
456
+ * writing it in the outer time (or forgetting that speed 0.5 reaches only half as far). Decided by dwell, not by the clock's end
457
+ * points: a clock that arrives at the child's `at` and HOLDS there shows it for the whole hold; one that only touches it in a single
458
+ * instant (speed 0.5, a child at exactly the farthest local time) does not.
459
+ */
460
+ _warnUnreachable(table, from, to) {
461
+ const remap = this._remap;
462
+ const how = remap.timeKfs.length ? "time keyframes" : `speed ${remap.speed ?? 1}`;
463
+ const span = this._contentSpan;
464
+ const EPS = 1e-9;
465
+ for (const child of this._children) {
466
+ const at = child.at;
467
+ if (at >= span) continue;
468
+ const end = Math.min(at + (child.duration ?? span), span);
469
+ let dwell = 0;
470
+ for (let t = from; t <= to && dwell < 2; t += 1e-3) {
471
+ const v = table.at(t);
472
+ if (v >= at - EPS && v < end + EPS) dwell++;
473
+ }
474
+ if (dwell >= 2) continue;
475
+ console.warn(
476
+ `pixi-effects: ${chunkNO26HWR7_cjs.describeLayer(child.spec)} starts at ${at}s of ${chunkNO26HWR7_cjs.describeLayer(this.spec)}'s own time, but its clock only reaches ${Number(table.min.toFixed(3))}\u2013${Number(table.max.toFixed(3))}s (${how}), so it is never visible. Layers inside a remapped composition are placed in that composition's local time.`
477
+ );
478
+ }
479
+ }
388
480
  /**
389
481
  * Drawn children in stack order, with the display object that stands in for each (the mesh for a threeD layer).
390
482
  * Null layers draw nothing and are left out; the layers inside them follow, with the null layers that carry them.
@@ -395,7 +487,7 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
395
487
  for (let p = this._parentOf.get(seq); p; p = this._parentOf.get(p)) out.push(p);
396
488
  return out;
397
489
  };
398
- return [...this._visual.map((v) => v.seq), ...this._nested].filter((seq) => !(seq instanceof chunkANO5R2E6_cjs.NullSequence)).map((seq) => {
490
+ return [...this._visual.map((v) => v.seq), ...this._nested].filter((seq) => !(seq instanceof chunkNO26HWR7_cjs.NullSequence)).map((seq) => {
399
491
  const layer = this._visual.find((v) => v.seq === seq)?.layer ?? null;
400
492
  return {
401
493
  seq,
@@ -407,14 +499,14 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
407
499
  }
408
500
  /** Match every `parent: 'name'` to a null layer; anything that cannot work is said out loud and drawn unparented. */
409
501
  _resolveParents() {
410
- const nulls = this._children.filter((c) => c instanceof chunkANO5R2E6_cjs.NullSequence);
502
+ const nulls = this._children.filter((c) => c instanceof chunkNO26HWR7_cjs.NullSequence);
411
503
  const nullNames = nulls.map((n) => n.spec.name).filter((n) => !!n);
412
504
  const warned = /* @__PURE__ */ new Set();
413
505
  for (const child of this._children) {
414
506
  const want = child.spec.parent;
415
507
  if (want === void 0) continue;
416
- const who = chunkANO5R2E6_cjs.describeLayer(child.spec);
417
- if (child instanceof chunkANO5R2E6_cjs.CameraSequence) {
508
+ const who = chunkNO26HWR7_cjs.describeLayer(child.spec);
509
+ if (child instanceof chunkNO26HWR7_cjs.CameraSequence) {
418
510
  console.warn(`pixi-effects: ${who}: a camera cannot have a parent; ignored`);
419
511
  continue;
420
512
  }
@@ -424,11 +516,11 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
424
516
  }
425
517
  const same = this._children.filter((c) => c.spec.name === want);
426
518
  if (same.length === 0) {
427
- const hint = chunkUQBGW5DO_cjs.suggestName(want, nullNames);
519
+ const hint = chunkWTRKDIKH_cjs.suggestName(want, nullNames);
428
520
  console.warn(`pixi-effects: ${who}: parent "${want}": no layer with that name${hint ? `; did you mean "${hint}"?` : ""} (the layer is drawn without a parent)`);
429
521
  continue;
430
522
  }
431
- const holder = same.find((c) => c instanceof chunkANO5R2E6_cjs.NullSequence);
523
+ const holder = same.find((c) => c instanceof chunkNO26HWR7_cjs.NullSequence);
432
524
  if (!holder) {
433
525
  console.warn(`pixi-effects: ${who}: parent "${want}" is a ${same[0].spec.type} layer; only { type: 'null' } layers can be parents (the layer is drawn without a parent)`);
434
526
  continue;
@@ -462,16 +554,17 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
462
554
  for (const child of this._children) child.syncFrame();
463
555
  }
464
556
  updateSpace(t, host) {
465
- for (const child of this._children) child.updateSpace(t, host);
557
+ const childT = this.childTime(t);
558
+ for (const child of this._children) child.updateSpace(childT, host);
466
559
  if (this._layers3d.length === 0 || !this._compositionShape) return;
467
560
  const { width, height } = this._compositionShape;
468
- const compEnd = (this.absoluteStart ?? 0) + (this.duration ?? 0);
561
+ const compEnd = this._childBase + (this.duration ?? 0);
469
562
  const active = pickActiveCamera(
470
563
  this._cameras.map((cam) => ({ cam, ...cam.window() })),
471
- t,
564
+ childT,
472
565
  compEnd
473
566
  );
474
- const basis = chunkANO5R2E6_cjs.cameraBasis(active ? active.cam.state() : chunkANO5R2E6_cjs.homeCamera(width, height), width, height);
567
+ const basis = chunkNO26HWR7_cjs.cameraBasis(active ? active.cam.state() : chunkNO26HWR7_cjs.homeCamera(width, height), width, height);
475
568
  for (const layer of this._layers3d) layer.update(host, basis);
476
569
  const order = assignDepthOrder(
477
570
  this._visual.map((v, i) => ({ stackIndex: i, threeD: v.layer !== null, depth: v.layer?.depth ?? 0 }))
@@ -482,10 +575,25 @@ var CompositionSequence = class extends chunkANO5R2E6_cjs.Sequence {
482
575
  }
483
576
  collectAudio(out, baseTime) {
484
577
  super.collectAudio(out, baseTime);
485
- const childBase = baseTime + this.at;
486
- for (const child of this._children) child.collectAudio(out, childBase);
578
+ const remap = this._remap;
579
+ if (!remap) {
580
+ const childBase = baseTime + this.at;
581
+ for (const child of this._children) child.collectAudio(out, childBase);
582
+ return;
583
+ }
584
+ const inner = [];
585
+ for (const child of this._children) child.collectAudio(inner, 0);
586
+ const lo = baseTime + this.at, hi = lo + this.duration;
587
+ const table = chunkNO26HWR7_cjs.clockTable(remap, "time", this.duration, lo, this.scope(), hi);
588
+ for (const d of inner) {
589
+ const prev = d.warp;
590
+ out.push({ ...d, warp: (t) => t < lo || t > hi ? NaN : prev ? prev(table.at(t)) : table.at(t) });
591
+ }
487
592
  }
488
593
  destroy() {
594
+ this._inner?.kill();
595
+ this._inner = null;
596
+ this._clock = null;
489
597
  for (const l of this._layers3d) l.destroy();
490
598
  this._layers3d = [];
491
599
  for (const c of this._children) c.destroy();
@@ -500,5 +608,5 @@ function frameOf(child) {
500
608
  }
501
609
 
502
610
  exports.CompositionSequence = CompositionSequence;
503
- //# sourceMappingURL=chunk-JW67MDHQ.cjs.map
504
- //# sourceMappingURL=chunk-JW67MDHQ.cjs.map
611
+ //# sourceMappingURL=chunk-FFYA3UBU.cjs.map
612
+ //# sourceMappingURL=chunk-FFYA3UBU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/space/camera.ts","../src/space/depth.ts","../src/space/Layer3D.ts","../src/space/lint.ts","../src/core/blend.ts","../src/sequences/Composition.ts"],"names":["i","DEG","frameOf","PerspectiveMesh","Texture","projectLayer","NEAR","describeLayer","Matrix","RenderTexture","collectPropKeys","Sequence","Container","Rectangle","timeRemapOf","contentLength","remapOf","lintTiming","lintText","lintKeys","summarizeWarnings","buildSequenceTree","CameraSequence","AlphaMask","gsap","bindClock","clockTable","NullSequence","suggestName","cameraBasis","homeCamera"],"mappings":"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","file":"chunk-FFYA3UBU.cjs","sourcesContent":["/** A camera layer's lifespan on the global timeline, seconds. */\nexport interface CameraWindow { start: number; end: number }\n\n/**\n * The active camera at time `t`: the last-listed (top-most) camera whose\n * lifespan covers `t`. Windows are [start, end), except that a camera running\n * to the end of its composition also covers the final instant `t === compEnd`.\n */\nexport function pickActiveCamera<T extends CameraWindow>(\n cams: readonly T[],\n t: number,\n compEnd: number,\n): T | null {\n for (let i = cams.length - 1; i >= 0; i--) {\n const c = cams[i]!;\n const inside = t >= c.start && (t < c.end || (c.end >= compEnd && t <= compEnd));\n if (inside) return c;\n }\n return null;\n}\n\n/** First pair of camera indices whose lifespans strictly overlap, or null. */\nexport function findOverlap(cams: readonly CameraWindow[]): [number, number] | null {\n for (let i = 0; i < cams.length; i++) {\n for (let j = i + 1; j < cams.length; j++) {\n const a = cams[i]!;\n const b = cams[j]!;\n if (a.start < b.end && b.start < a.end) return [i, j];\n }\n }\n return null;\n}\n","export interface DepthItem {\n /** Position in the composition's stack (monotonic; gaps allowed). */\n stackIndex: number;\n threeD: boolean;\n /** Camera-space depth (larger = farther). Only read for threeD items. */\n depth: number;\n}\n\nconst finite = (n: number): number => (Number.isFinite(n) ? n : 0);\n\n/**\n * zIndex per item. Non-3D items keep their stack index. Each run of\n * consecutive threeD items is redistributed over the same index slots,\n * farthest first (drawn first), ties in stack order.\n */\nexport function assignDepthOrder(items: readonly DepthItem[]): number[] {\n const out = items.map(i => i.stackIndex);\n let i = 0;\n while (i < items.length) {\n if (!items[i]!.threeD) { i++; continue; }\n let j = i;\n while (j + 1 < items.length && items[j + 1]!.threeD) j++;\n const run = items.slice(i, j + 1).map((it, k) => ({ it, pos: i + k }));\n const slots = run.map(r => r.it.stackIndex);\n const farthestFirst = [...run].sort((a, b) => finite(b.it.depth) - finite(a.it.depth));\n farthestFirst.forEach((r, k) => { out[r.pos] = slots[k]!; });\n i = j + 1;\n }\n return out;\n}\n","import { Container, Matrix, PerspectiveMesh, RenderTexture, Texture } from 'pixi.js';\nimport type { Sequence } from '../sequences/Base';\nimport { describeLayer } from '../core/lint';\nimport { DEG, NEAR, projectLayer, type CameraBasis, type LayerTransform, type Rect } from './math';\n\n/** Render textures are capped at this many pixels on the long side; larger layers are downscaled. */\nexport const MAX_TEXTURE_SIZE = 4096;\n/**\n * Render textures are drawn at this multiple of the layer size (until the caps),\n * so a layer enlarged by perspective (z > 0) stays sharp instead of showing\n * jagged edges and soft text.\n */\nexport const SUPERSAMPLE = 2;\n/** Total texture pixels per layer are capped here (≈ one 2048² target); resolution drops to fit. */\nexport const MAX_TEXTURE_PIXELS = 2048 * 2048;\n/** MSAA multiplies target memory ~4x, so only small textures get it (supersampling covers the rest). */\nexport const ANTIALIAS_MAX_PIXELS = 1024 * 1024;\n/** Mesh grid per side. 20 keeps steeply tilted planes free of visible affine warping. */\nexport const MESH_GRID = 20;\n\n/** The slice of a Pixi renderer Layer3D needs (also what tests fake). */\nexport interface SpaceHost {\n render(options: {\n container: Container;\n target: RenderTexture;\n transform: Matrix;\n clear: boolean;\n clearColor: number[];\n }): void;\n}\n\ntype Carrier = Container & { z?: number; rotationX?: number; rotationY?: number };\n\ninterface TextureSize { w: number; h: number; resolution: number; antialias: boolean }\n\n/** Sum of the target's filter paddings: the texture must be this much larger on every side or filter output is clipped. */\nfunction filterPadding(target: Container): number {\n const filters = (target as unknown as { filters?: ReadonlyArray<{ padding?: number }> | null }).filters;\n if (!Array.isArray(filters)) return 0;\n let pad = 0;\n for (const f of filters) pad += f?.padding ?? 0;\n return Number.isFinite(pad) && pad > 0 ? Math.ceil(pad) : 0;\n}\n\nexport function readLayerTransform(target: Container): LayerTransform {\n const c = target as Carrier;\n return {\n x: c.x, y: c.y, z: c.z ?? 0,\n rotationX: (c.rotationX ?? 0) * DEG,\n rotationY: (c.rotationY ?? 0) * DEG,\n rotationZ: c.rotation,\n scaleX: c.scale.x, scaleY: c.scale.y,\n pivotX: c.pivot.x, pivotY: c.pivot.y,\n };\n}\n\n/**\n * Draws one `threeD` sequence: its display object is rendered into a\n * RenderTexture (with its own 2D transform replaced, so layer-local content\n * lands at the texture origin) and shown on a PerspectiveMesh whose four\n * corners come from projecting the layer through the active camera.\n *\n * The sequence's `target` is never in the scene graph; the composition adds\n * `display` instead. `z`, `rotationX`, `rotationY` live on `target` as plain\n * numeric props so GSAP tweens them like any other prop.\n */\nexport class Layer3D {\n readonly display: PerspectiveMesh;\n /** Camera-space depth from the last update (larger = farther). */\n depth = 0;\n private rt: RenderTexture | null = null;\n /**\n * Textures replaced by a bigger / smaller one. Destroying one right away warns \"destroyed while still\n * bound\": the mesh's bind group still points at it until the next render. They go at the next update,\n * by which time a frame has been drawn with the new texture.\n */\n private retired: RenderTexture[] = [];\n private size: TextureSize | null = null;\n private warnedBehind = false;\n\n constructor(\n private readonly seq: Sequence,\n private readonly frameOf: () => Rect,\n ) {\n const target = seq.target as Carrier;\n target.z ??= 0;\n target.rotationX ??= 0;\n target.rotationY ??= 0;\n this.display = new PerspectiveMesh({ texture: Texture.WHITE, verticesX: MESH_GRID, verticesY: MESH_GRID });\n if (seq.spec.name) this.display.label = seq.spec.name;\n this.display.visible = false;\n }\n\n update(host: SpaceHost, basis: CameraBasis): void {\n this.flushRetired();\n const target = this.seq.target as Carrier | null;\n // Pixi skips rendering (and clearing) a container that is not `visible`\n // (e.g. PixiPlugin autoAlpha at alpha 0), which would leave a stale texture.\n if (!target || !target.renderable || !target.visible) return this.hide();\n\n const bounds = this.frameOf();\n const pad = filterPadding(target);\n const needW = Math.ceil(bounds.width + 2 * pad);\n const needH = Math.ceil(bounds.height + 2 * pad);\n if (!(needW >= 1 && needH >= 1) || !Number.isFinite(bounds.x) || !Number.isFinite(bounds.y)) return this.hide();\n\n const size = this.sizeFor(needW, needH);\n // The quad covers exactly the texture's pixel rect in layer space.\n const frame: Rect = { x: bounds.x - pad, y: bounds.y - pad, width: size.w, height: size.h };\n const projected = projectLayer(readLayerTransform(target), frame, basis);\n this.depth = projected.depth;\n if (!projected.visible) {\n if (!this.warnedBehind) {\n this.warnedBehind = true;\n if ((this.seq.spec as { hideBehindCamera?: boolean }).hideBehindCamera) return this.hide(); // on purpose: say nothing\n if (projected.depth > NEAR) {\n // the layer's own origin is in front of the camera: a tilt or a large size swings a CORNER past the camera plane\n console.warn(\n `pixi-effects: ${describeLayer(this.seq.spec)}: part of it (a corner) reaches the camera plane (z = ${(target.z ?? 0).toFixed(0)}, rotationX ${(target.rotationX ?? 0).toFixed(0)}°, rotationY ${(target.rotationY ?? 0).toFixed(0)}°), ` +\n `and a layer is hidden whole when any corner is at or behind it. Tilt it less (rotationX / rotationY), make it smaller, or keep the camera further away from it ` +\n `(the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`,\n );\n } else {\n console.warn(\n `pixi-effects: ${describeLayer(this.seq.spec)} is at or behind the camera plane (z = ${(target.z ?? 0).toFixed(0)}) and is hidden. ` +\n `If that is unintended, lower its z or move the camera back (the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`,\n );\n }\n }\n return this.hide();\n }\n\n this.ensureTexture(size);\n // `transform` replaces the container's own local transform for this render\n // (Pixi RenderGroupSystem), while `container.alpha` still applies — so the\n // texture carries the layer's alpha and the mesh alpha stays at 1.\n host.render({\n container: target,\n target: this.rt!,\n transform: new Matrix().translate(-frame.x, -frame.y),\n clear: true,\n clearColor: [0, 0, 0, 0],\n });\n this.display.geometry.setCorners(...projected.corners);\n this.display.visible = true;\n }\n\n destroy(): void {\n this.display.destroy();\n this.rt?.destroy(true);\n this.rt = null;\n this.flushRetired();\n }\n\n private flushRetired(): void {\n for (const t of this.retired) t.destroy(true);\n this.retired = [];\n }\n\n private hide(): void {\n this.display.visible = false;\n }\n\n /**\n * Texture size for content of w×h. An existing texture is kept while it is at\n * least that big and at most 2x too big, so content whose bounds change every\n * frame (typewriter text, growing shapes) does not reallocate each frame.\n */\n private sizeFor(w: number, h: number): TextureSize {\n const cur = this.size;\n if (cur && cur.w >= w && cur.h >= h && cur.w <= 2 * w && cur.h <= 2 * h) return cur;\n const resolution = Math.min(\n SUPERSAMPLE,\n MAX_TEXTURE_SIZE / Math.max(w, h),\n Math.sqrt(MAX_TEXTURE_PIXELS / (w * h)),\n );\n const antialias = w * h * resolution * resolution <= ANTIALIAS_MAX_PIXELS;\n return { w, h, resolution, antialias };\n }\n\n private ensureTexture(size: TextureSize): void {\n if (this.rt && this.size === size) return;\n // Same sampling: resize the texture where it is. Replacing it makes Pixi warn that the old one was\n // destroyed while still bound, because the mesh keeps pointing at it until the next render.\n if (this.rt && this.size && this.size.antialias === size.antialias) {\n this.rt.resize(size.w, size.h, size.resolution);\n this.size = size;\n return;\n }\n const next = RenderTexture.create({\n width: size.w, height: size.h, resolution: size.resolution, antialias: size.antialias,\n });\n this.display.texture = next;\n if (this.rt) this.retired.push(this.rt);\n this.rt = next;\n this.size = size;\n }\n}\n","import { collectPropKeys } from './specKeys';\nimport { describeLayer } from '../core/lint';\nimport type { SequenceSpec } from '../types';\n\ntype Warn = (message: string) => void;\nconst defaultWarn: Warn = m => console.warn(m);\n\nconst FOV_HINT = 'perspective is the camera\\'s \"fov\" — add a { type: \"camera\" } layer and set fov in its initial / keyframes';\n\n/** Keys that are never valid for any layer, with a hint at what the author probably meant. */\nconst LAYER_ALIASES: Record<string, string> = {\n rotateX: 'did you mean \"rotationX\"?',\n rotateY: 'did you mean \"rotationY\"?',\n rotateZ: 'did you mean \"rotation\"?',\n rotationZ: 'did you mean \"rotation\" (it is the Z rotation)?',\n translateZ: 'did you mean \"z\"?',\n depth: 'did you mean \"z\"?',\n posZ: 'did you mean \"z\"?',\n perspective: FOV_HINT,\n zoom: FOV_HINT,\n};\n\n/** Camera-only mistakes. */\nconst CAMERA_ALIASES: Record<string, string> = {\n pointOfInterest: 'did you mean \"lookAtX / lookAtY / lookAtZ\"?',\n lookAt: 'did you mean \"lookAtX / lookAtY / lookAtZ\"?',\n};\n\nconst CAMERA_PROPS = ['x', 'y', 'z', 'fov', 'lookAtX', 'lookAtY', 'lookAtZ', 'offsetX', 'offsetY', 'offsetZ', 'lookOffsetX', 'lookOffsetY', 'lookOffsetZ'];\nconst NEEDS_THREE_D = ['z', 'rotationX', 'rotationY'];\nconst SKEW_KEYS = ['skew', 'skewX', 'skewY'];\n\n/**\n * Warn (never throw) about the inputs an AI author is most likely to get wrong,\n * with a message that says what to change. One call per layer, at build time.\n */\nexport function lintSequence(spec: SequenceSpec, warn: Warn = defaultWarn): void {\n const who = describeLayer(spec);\n const keys = collectPropKeys(spec);\n const explained = new Set<string>();\n\n for (const k of keys) {\n const hint = LAYER_ALIASES[k] ?? (spec.type === 'camera' ? CAMERA_ALIASES[k] : undefined);\n if (hint) {\n explained.add(k);\n warn(`pixi-effects: ${who}: \"${k}\" is not a property — ${hint}`);\n }\n }\n\n if (spec.type === 'camera') {\n const raw = spec as unknown as Record<string, unknown>;\n for (const p of CAMERA_PROPS) {\n if (p in raw) warn(`pixi-effects: ${who}: \"${p}\" must go inside initial / keyframes, not on the camera itself`);\n }\n for (const k of Object.keys(raw)) {\n const hint = CAMERA_ALIASES[k] ?? LAYER_ALIASES[k];\n if (hint) warn(`pixi-effects: ${who}: \"${k}\" is not a property — ${hint} (inside initial)`);\n }\n for (const k of keys) {\n if (!explained.has(k) && !CAMERA_PROPS.includes(k)) {\n warn(`pixi-effects: ${who}: \"${k}\" has no effect on a camera (use ${CAMERA_PROPS.join(', ')})`);\n }\n }\n return;\n }\n\n if (spec.type === 'audio') {\n if (spec.threeD) warn(`pixi-effects: ${who}: threeD has no effect on audio`);\n return;\n }\n\n if (!spec.threeD) {\n for (const k of NEEDS_THREE_D) {\n if (keys.has(k)) warn(`pixi-effects: ${who}: \"${k}\" needs threeD: true (it is ignored otherwise)`);\n }\n } else {\n for (const k of SKEW_KEYS) {\n if (keys.has(k)) warn(`pixi-effects: ${who}: \"${k}\" is ignored on threeD layers`);\n }\n }\n}\n","import { describeLayer } from './lint';\n\nconst MODES = ['normal', 'add', 'screen', 'multiply'];\n\n/** Apply a layer's `blendMode` to its display object; an unknown mode warns and is ignored. */\nexport function applyBlendMode(spec: { blendMode?: string; name?: string; type: string }, display: { blendMode?: unknown; filters?: unknown }): void {\n const mode = spec.blendMode;\n if (mode === undefined) return;\n if (!MODES.includes(mode)) {\n console.warn(`pixi-effects: ${describeLayer(spec)}: blendMode \"${mode}\" is not supported (use ${MODES.join(', ')})`);\n return;\n }\n // A container's blend mode applies INSIDE a filter's offscreen pass (against transparent black: multiply gave\n // solid black) and not to the filtered result. With filters, the pass that draws onto the backdrop is the last\n // filter's, so the mode goes there; the container stays normal.\n const filters = display.filters;\n if (Array.isArray(filters) && filters.length > 0) {\n (filters[filters.length - 1] as { blendMode?: unknown }).blendMode = mode;\n return;\n }\n display.blendMode = mode;\n}\n","import { AlphaMask, Container, Rectangle } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { Sequence } from './Base';\nimport { NullSequence } from './Null';\nimport { suggestName } from '../core/options';\nimport { buildSequenceTree } from '../core/Composition';\nimport { CameraSequence } from '../space/CameraSequence';\nimport { findOverlap, pickActiveCamera } from '../space/camera';\nimport { assignDepthOrder } from '../space/depth';\nimport { Layer3D, type SpaceHost } from '../space/Layer3D';\nimport { lintSequence } from '../space/lint';\nimport { describeLayer, lintText, lintTiming, summarizeWarnings, lintKeys } from '../core/lint';\nimport { applyBlendMode } from '../core/blend';\nimport { cameraBasis, homeCamera } from '../space/math';\nimport { timeRemapOf, remapOf, contentLength, bindClock, clockTable, type TimeRemap, type ClockTable } from '../core/remap';\nimport type { CompositionSequenceSpec, AudioDescriptor, CompositionShape, SequenceSpec } from '../types';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport class CompositionSequence extends Sequence {\n declare spec: CompositionSequenceSpec;\n private _innerContainer: Container | null = null;\n private _compositionShape: CompositionShape | null = null;\n _children: Sequence[] = [];\n private _cameras: CameraSequence[] = [];\n private _layers3d: Layer3D[] = [];\n /** Drawn children in stack order (cameras and target-less sequences excluded). */\n private _visual: Array<{ seq: Sequence; layer: Layer3D | null }> = [];\n /** Layers drawn inside a null layer (`parent`): they are not in the composition's own stack. */\n private _nested: Sequence[] = [];\n /** The null layer each parented layer is drawn inside. */\n private _parentOf = new Map<Sequence, NullSequence>();\n /** Set when this composition's own time is remapped: the children live on `_inner` in LOCAL time, driven by `_clock`. */\n private _inner: Timeline | null = null;\n private _clock: { time: number } | null = null;\n private _remap: TimeRemap | null = null;\n private _childBase = 0;\n private _contentSpan = 0;\n\n /** Where the children's time starts: the composition's absolute start, or 0 when their time is local (remapped). */\n get childBase(): number { return this._childBase; }\n /** How long the children's time runs: the composition's duration, or its content length when its time is remapped. */\n get contentSpan(): number { return this._contentSpan; }\n /** The time the children live in at movie time `t`: the movie's own, or this composition's local clock when it is remapped. */\n childTime(t: number): number { return this._clock ? this._clock.time : t; }\n /** The clock reader for filters that want the time (grain), or null when the children run on the movie's time. */\n localClock(): (() => number) | null { return this._clock ? () => this._clock!.time : null; }\n /** How the time is remapped, for the timeline chart: `×0.5`, `×-1`, `time keyframes`, or null. */\n remapLabel(): string | null {\n const r = this._remap;\n if (!r) return null;\n return r.timeKfs.length ? 'time keyframes' : `×${r.speed ?? 1}`;\n }\n\n async build(): Promise<void> {\n const width = this.spec.width ?? this.parent?.width ?? this.root.width;\n const height = this.spec.height ?? this.parent?.height ?? this.root.height;\n if (this.duration === undefined) {\n this.duration = this.spec.duration ?? this.parent?.duration ?? this.root.duration;\n }\n const wrapper = new Container();\n wrapper.cullable = true;\n wrapper.cullableChildren = true;\n wrapper.cullArea = new Rectangle(0, 0, width, height);\n\n const inner = new Container();\n inner.cullable = true;\n inner.cullableChildren = true;\n wrapper.addChild(inner);\n\n this.target = wrapper;\n this.intrinsicWidth = width;\n this.intrinsicHeight = height;\n this._innerContainer = inner;\n // A remapped composition's children live in LOCAL time, which can run past the composition's own duration (speed 2 reads twice as far).\n const base = timeRemapOf(this.spec as never);\n const span = base ? contentLength(base, this.duration) : this.duration;\n this._remap = base ? remapOf(this.spec as never, 'time', span) : null;\n this._contentSpan = span;\n this._compositionShape = { width, height, duration: span };\n\n const lateKeyframes: string[] = [];\n for (const s of this.spec.sequences ?? []) {\n lintSequence(s);\n lintTiming(s, span, (message, kind) => (kind === 'late-keyframe' ? lateKeyframes.push(message) : console.warn(message)));\n lintText(s);\n lintKeys(s);\n }\n for (const message of summarizeWarnings(lateKeyframes)) console.warn(message);\n\n this._children = await buildSequenceTree(\n this.spec.sequences ?? [],\n this._compositionShape,\n this.root,\n );\n this._resolveParents();\n for (const child of this._children) {\n // Cameras are display-less: they only feed the projection pass.\n if (child instanceof CameraSequence) {\n this._cameras.push(child);\n continue;\n }\n if (!child.target) continue;\n const holder = this._parentOf.get(child);\n const into = holder?.target ?? inner; // a layer with `parent` is drawn inside its null layer\n\n const maskSpec = (child.spec as { mask?: SequenceSpec }).mask;\n\n // threeD layers never enter the scene graph themselves: their display\n // object is rendered into a texture and a perspective mesh stands in.\n if (child.spec.threeD) {\n const layer = new Layer3D(child, frameOf(child));\n inner.addChild(layer.display);\n this._layers3d.push(layer);\n this._visual.push({ seq: child, layer });\n applyBlendMode(child.spec, layer.display);\n if (maskSpec) {\n console.warn(`pixi-effects: ${describeLayer(child.spec)}: mask is not supported on threeD layers yet; ignored`);\n }\n continue;\n }\n\n into.addChild(child.target);\n if (holder) this._nested.push(child);\n else this._visual.push({ seq: child, layer: null });\n applyBlendMode(child.spec, child.target);\n // If this child has a `mask` spec, build the mask sequence in the same\n // composition shape, add its target to the same parent (so its\n // transforms resolve in the same coord space), and wire PIXI's\n // mask channel. PIXI v8 renders mask containers into the stencil /\n // alpha buffer; they don't render as normal children.\n if (maskSpec) {\n // The mask lives and animates with the layer it masks: with no `at` of its own its `at` and\n // `duration` are the layer's, so its keyframes are measured from the layer's start too. An\n // explicit `at` is composition time, exactly like a layer's.\n const lifetime = maskSpec.at === undefined\n ? { at: child.at, duration: maskSpec.duration ?? child.duration }\n : {};\n const built = await buildSequenceTree([{ ...maskSpec, ...lifetime } as SequenceSpec], this._compositionShape, this.root);\n const maskSeq = built[0];\n if (maskSeq?.target) {\n into.addChild(maskSeq.target); // the mask shares the layer's space\n // PIXI v8 `setMask` accepts an `inverse` flag — that's how we\n // expose `maskInverted` from the spec. Falls back to plain\n // `target.mask = …` for runtimes that don't have setMask\n // (older PIXI builds).\n const inverse = (child.spec as { maskInverted?: boolean }).maskInverted ?? false;\n const t = child.target as Container & {\n setMask?: (opts: { mask: Container | null; inverse?: boolean }) => void;\n addEffect: (effect: AlphaMask) => void;\n mask: Container | null;\n };\n if (inverse || maskSpec.type === 'text') {\n // A stencil mask is the mask's geometry: a text layer's is its whole bounding box (the letters' alpha is ignored), and\n // PIXI's inverted stencil tests against the empty level, so inside a masked parent it shows what the parent hides.\n // An alpha mask draws the mask into a texture and uses its alpha: letters stay letters, an inverse is 1 − alpha.\n const effect = new AlphaMask({ mask: maskSeq.target });\n effect.inverse = inverse;\n t.setMask?.({ mask: undefined as never, inverse }); // the alpha pipe reads `inverse` from the maskee's mask options, not from the effect\n t.addEffect(effect);\n } else if (typeof t.setMask === 'function') {\n t.setMask({ mask: maskSeq.target, inverse });\n } else {\n t.mask = maskSeq.target;\n }\n child.maskSequence = maskSeq;\n maskSeq.keepHidden = maskSpec.type === 'image' || maskSpec.type === 'video'; // PIXI: a Sprite mask is hidden by renderable = false\n }\n }\n }\n\n if (this._layers3d.length > 0) {\n // Stack order becomes explicit zIndex so threeD layers can be re-sorted\n // by depth each frame without reparenting.\n inner.sortableChildren = true;\n this._visual.forEach((v, i) => {\n (v.layer?.display ?? v.seq.target!).zIndex = i;\n });\n } else if (this._cameras.length > 0) {\n console.warn('pixi-effects: camera has no effect: this composition has no threeD layers');\n }\n\n this.buildFilters();\n }\n\n protected override displayProps(): { initial: CompositionSequenceSpec['initial']; keyframes: CompositionSequenceSpec['keyframes'] } {\n const r = this._remap;\n return r ? { initial: r.restInitial as CompositionSequenceSpec['initial'], keyframes: r.restKfs } : super.displayProps();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n super.bindTimeline(timeline, offset);\n const remap = this._remap;\n // Children's `at` is relative to this composition's start, so push them forward by our absolute start time on the global\n // timeline. A remapped composition builds them in LOCAL time (offset 0) on a timeline of its own, which the clock drives.\n const childOffset = remap ? 0 : offset + this.at;\n this._childBase = childOffset;\n const target = remap ? gsap.timeline({ paused: true, defaults: { ease: 'none' } }) : timeline;\n for (const child of this._children) {\n // Each layer builds its tweens in a small timeline of its own, which is added to the parent once, finished. Adding\n // thousands of tweens one by one to a single timeline makes GSAP re-measure the whole timeline at every add (the cost\n // grows with the square of the count: ~3 s for a piece with 700 particle layers); this way the parent only ever holds\n // one child per layer. Positions stay absolute, so the picture at any time is the same.\n const own = gsap.timeline({ defaults: { ease: 'none' } });\n child.bindTimeline(own, childOffset);\n // The mask shares the maskee's offset — its `at` is interpreted\n // relative to the composition's start, just like the child itself,\n // so a reveal-from-zero animation lines up naturally.\n child.maskSequence?.bindTimeline(own, childOffset);\n target.add(own, 0);\n }\n if (remap) this._bindClock(timeline, target, remap, offset);\n const overlap = findOverlap(this._cameras.map(c => c.window()));\n if (overlap) {\n console.warn(`pixi-effects: cameras #${overlap[0] + 1} and #${overlap[1] + 1} overlap in time; the top-most one wins`);\n }\n }\n\n /** Drive the local timeline `inner` from the clock, and put the clock's tweens on the outer `timeline`. */\n private _bindClock(timeline: Timeline, inner: Timeline, remap: TimeRemap, offset: number): void {\n let last = NaN;\n let cur = 0;\n const clock = {\n get time(): number { return cur; },\n set time(v: number) {\n cur = v;\n if (v === last) return; // a freeze renders nothing\n last = v;\n inner.time(v);\n },\n };\n this._inner = inner;\n this._clock = clock;\n const scope = this.scope() as unknown as Record<string, number>;\n if (remap.start !== undefined && remap.timeKfs.length === 0) clock.time = remap.start;\n bindClock(timeline, clock, 'time', remap, this.duration!, offset + this.at, scope);\n // Initialise every tween of the local timeline in order (end, then start), as Movie does for the main one: GSAP captures a `to`\n // tween's start value the first time it renders, and a remap can reach a stretch of local time for the first time going BACKWARD.\n inner.time(inner.duration()); inner.time(0);\n last = NaN; // the inner timeline now sits at 0, whatever the clock last said\n this._warnUnreachable(clockTable(remap, 'time', this.duration!, offset + this.at, scope, offset + this.at + this.duration!), offset + this.at, offset + this.at + this.duration!);\n }\n\n /**\n * A child the clock never dwells in is never visible: say so. Its `at` is in THIS composition's local time, so the usual mistake is\n * writing it in the outer time (or forgetting that speed 0.5 reaches only half as far). Decided by dwell, not by the clock's end\n * points: a clock that arrives at the child's `at` and HOLDS there shows it for the whole hold; one that only touches it in a single\n * instant (speed 0.5, a child at exactly the farthest local time) does not.\n */\n private _warnUnreachable(table: ClockTable, from: number, to: number): void {\n const remap = this._remap!;\n const how = remap.timeKfs.length ? 'time keyframes' : `speed ${remap.speed ?? 1}`;\n const span = this._contentSpan;\n const EPS = 1e-9;\n for (const child of this._children) {\n const at = child.at;\n if (at >= span) continue; // already said by lintTiming (\"starts after its composition ends\")\n const end = Math.min(at + (child.duration ?? span), span);\n let dwell = 0; // 1 ms samples of the clock inside [at, end)\n for (let t = from; t <= to && dwell < 2; t += 0.001) { const v = table.at(t); if (v >= at - EPS && v < end + EPS) dwell++; }\n if (dwell >= 2) continue;\n console.warn(\n `pixi-effects: ${describeLayer(child.spec)} starts at ${at}s of ${describeLayer(this.spec)}'s own time, but its clock only reaches ` +\n `${Number(table.min.toFixed(3))}–${Number(table.max.toFixed(3))}s (${how}), so it is never visible. ` +\n `Layers inside a remapped composition are placed in that composition's local time.`,\n );\n }\n }\n\n /**\n * Drawn children in stack order, with the display object that stands in for each (the mesh for a threeD layer).\n * Null layers draw nothing and are left out; the layers inside them follow, with the null layers that carry them.\n */\n layers(): Array<{ seq: Sequence; display: Container; threeD: boolean; carriers: NullSequence[] }> {\n const carriersOf = (seq: Sequence): NullSequence[] => {\n const out: NullSequence[] = [];\n for (let p = this._parentOf.get(seq); p; p = this._parentOf.get(p)) out.push(p);\n return out;\n };\n return [...this._visual.map(v => v.seq), ...this._nested]\n .filter(seq => !(seq instanceof NullSequence))\n .map(seq => {\n const layer = this._visual.find(v => v.seq === seq)?.layer ?? null;\n return {\n seq,\n display: (layer?.display ?? seq.target!) as unknown as Container,\n threeD: layer !== null,\n carriers: carriersOf(seq),\n };\n });\n }\n\n /** Match every `parent: 'name'` to a null layer; anything that cannot work is said out loud and drawn unparented. */\n private _resolveParents(): void {\n const nulls = this._children.filter((c): c is NullSequence => c instanceof NullSequence);\n const nullNames = nulls.map(n => n.spec.name).filter((n): n is string => !!n);\n const warned = new Set<string>();\n for (const child of this._children) {\n const want = child.spec.parent;\n if (want === undefined) continue;\n const who = describeLayer(child.spec);\n if (child instanceof CameraSequence) { console.warn(`pixi-effects: ${who}: a camera cannot have a parent; ignored`); continue; }\n if (child.spec.threeD) { console.warn(`pixi-effects: ${who}: a threeD layer cannot have a parent (parent \"${want}\" ignored)`); continue; }\n const same = this._children.filter(c => c.spec.name === want);\n if (same.length === 0) {\n const hint = suggestName(want, nullNames);\n console.warn(`pixi-effects: ${who}: parent \"${want}\": no layer with that name${hint ? `; did you mean \"${hint}\"?` : ''} (the layer is drawn without a parent)`);\n continue;\n }\n const holder = same.find((c): c is NullSequence => c instanceof NullSequence);\n if (!holder) {\n console.warn(`pixi-effects: ${who}: parent \"${want}\" is a ${same[0]!.spec.type} layer; only { type: 'null' } layers can be parents (the layer is drawn without a parent)`);\n continue;\n }\n if (same.length > 1 && !warned.has(want)) {\n warned.add(want);\n console.warn(`pixi-effects: ${same.length} layers are named \"${want}\"; parent \"${want}\" uses the first null layer with that name`);\n }\n if (holder === child) { console.warn(`pixi-effects: ${who} is its own parent; ignored`); continue; }\n this._parentOf.set(child, holder);\n }\n // a chain that leads back to itself: break it where we find it\n for (const start of this._children) {\n const seen = new Set<Sequence>([start]);\n for (let p = this._parentOf.get(start); p; p = this._parentOf.get(p)) {\n if (p === start) {\n const names = [...seen].map(s => s.spec.name ?? s.spec.type).join(' → ');\n console.warn(`pixi-effects: parent cycle: ${names} → ${start.spec.name ?? start.spec.type}; the parent of \"${start.spec.name ?? start.spec.type}\" is ignored`);\n this._parentOf.delete(start);\n break;\n }\n if (seen.has(p)) break;\n seen.add(p);\n }\n }\n }\n\n override syncFrame(): void {\n super.syncFrame();\n for (const child of this._children) child.syncFrame();\n }\n\n override updateSpace(t: number, host: SpaceHost): void {\n // Inner compositions first: a threeD composition is rendered into its own\n // texture by this level, so its content must already be projected.\n const childT = this.childTime(t);\n for (const child of this._children) child.updateSpace(childT, host);\n if (this._layers3d.length === 0 || !this._compositionShape) return;\n\n const { width, height } = this._compositionShape;\n const compEnd = this._childBase + (this.duration ?? 0);\n const active = pickActiveCamera(\n this._cameras.map(cam => ({ cam, ...cam.window() })),\n childT,\n compEnd,\n );\n const basis = cameraBasis(active ? active.cam.state() : homeCamera(width, height), width, height);\n\n for (const layer of this._layers3d) layer.update(host, basis);\n\n const order = assignDepthOrder(\n this._visual.map((v, i) => ({ stackIndex: i, threeD: v.layer !== null, depth: v.layer?.depth ?? 0 })),\n );\n this._visual.forEach((v, i) => {\n if (v.layer) v.layer.display.zIndex = order[i]!;\n });\n }\n\n override collectAudio(out: AudioDescriptor[], baseTime: number): void {\n super.collectAudio(out, baseTime);\n const remap = this._remap;\n if (!remap) {\n const childBase = baseTime + this.at;\n for (const child of this._children) child.collectAudio(out, childBase);\n return;\n }\n // The children's sounds are described in local time; each one is given a warp from the movie's time to it.\n const inner: AudioDescriptor[] = [];\n for (const child of this._children) child.collectAudio(inner, 0);\n const lo = baseTime + this.at, hi = lo + this.duration!;\n const table = clockTable(remap, 'time', this.duration!, lo, this.scope() as unknown as Record<string, number>, hi);\n for (const d of inner) {\n const prev = d.warp;\n out.push({ ...d, warp: (t: number) => (t < lo || t > hi ? NaN : prev ? prev(table.at(t)) : table.at(t)) });\n }\n }\n\n override destroy(): void {\n this._inner?.kill();\n this._inner = null;\n this._clock = null;\n for (const l of this._layers3d) l.destroy();\n this._layers3d = [];\n for (const c of this._children) c.destroy();\n super.destroy();\n }\n}\n\n/** Layer-space rectangle a threeD child projects: a composition's frame, otherwise its content bounds. */\nfunction frameOf(child: Sequence): () => { x: number; y: number; width: number; height: number } {\n if (child instanceof CompositionSequence) {\n return () => ({ x: 0, y: 0, width: child.intrinsicWidth, height: child.intrinsicHeight });\n }\n return () => child.target!.getLocalBounds();\n}\n"]}
@@ -29,7 +29,10 @@ var COMMON_ALIASES = {
29
29
  h: "height",
30
30
  cols: "columns",
31
31
  sweep: "degrees",
32
- angle: "degrees"
32
+ angle: "degrees",
33
+ playbackrate: "speed",
34
+ timescale: "speed",
35
+ rate: "speed"
33
36
  };
34
37
  function suggestName(name, valid) {
35
38
  const n = name.toLowerCase();
@@ -57,5 +60,5 @@ function warnUnknownOptions(where, opts, valid) {
57
60
  }
58
61
 
59
62
  export { suggestName, warnUnknownOptions };
60
- //# sourceMappingURL=chunk-DKGG7WD4.js.map
61
- //# sourceMappingURL=chunk-DKGG7WD4.js.map
63
+ //# sourceMappingURL=chunk-MNM56B3X.js.map
64
+ //# sourceMappingURL=chunk-MNM56B3X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/options.ts"],"names":[],"mappings":"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","file":"chunk-MNM56B3X.js","sourcesContent":["/** Edit distance, small inputs only. */\nfunction distance(a: string, b: string): number {\n const dp = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)] as number[]);\n for (let j = 1; j <= b.length; j++) dp[0]![j] = j;\n for (let i = 1; i <= a.length; i++) {\n for (let j = 1; j <= b.length; j++) {\n dp[i]![j] = Math.min(dp[i - 1]![j]! + 1, dp[i]![j - 1]! + 1, dp[i - 1]![j - 1]! + (a[i - 1] === b[j - 1] ? 0 : 1));\n // swapping two neighbouring letters (sacle / scale) counts as one slip\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) dp[i]![j] = Math.min(dp[i]![j]!, dp[i - 2]![j - 2]! + 1);\n }\n }\n return dp[a.length]![b.length]!;\n}\n\nconst isSubsequence = (small: string, big: string): boolean => {\n let i = 0;\n for (const ch of big) if (i < small.length && ch === small[i]) i++;\n return i === small.length;\n};\n\n/** Names AI authors commonly guess, mapped to the real option (only suggested when the real option exists here). */\nconst COMMON_ALIASES: Record<string, string> = {\n fps: 'frameRate', framerate: 'frameRate', frame_rate: 'frameRate',\n bg: 'background', backgroundcolor: 'background', bgcolor: 'background',\n seconds: 'duration', length: 'duration', time: 'duration',\n w: 'width', h: 'height', cols: 'columns', sweep: 'degrees', angle: 'degrees',\n playbackrate: 'speed', timescale: 'speed', rate: 'speed',\n};\n\n/** The valid name an author most likely meant by `name` (alias, typo, abbreviation or case slip), or null. */\nexport function suggestName(name: string, valid: readonly string[]): string | null {\n const n = name.toLowerCase();\n const alias = COMMON_ALIASES[n];\n if (alias && valid.includes(alias)) return alias;\n let best: { v: string; score: number } | null = null;\n for (const v of valid) {\n const lv = v.toLowerCase();\n const d = distance(n, lv);\n const close = d <= Math.max(1, Math.floor(Math.min(n.length, lv.length) / 3));\n // an abbreviation (cols → columns) or a longer phrase containing the name (fadeIn → in)\n const abbreviation = (n.length >= 3 && isSubsequence(n, lv)) || (lv.length >= 2 && n.length > lv.length && n.includes(lv));\n if (!close && !abbreviation) continue;\n const score = close ? d : 3 + (lv.length - n.length) / 100; // typos first, then abbreviations\n if (!best || score < best.score) best = { v, score };\n }\n return best ? best.v : null;\n}\n\n/**\n * Unknown option keys are silently ignored by JavaScript, which is how a guessed name like `cols`\n * or `fps` quietly does nothing. Say so, and say what was probably meant.\n */\nexport function warnUnknownOptions(where: string, opts: object | undefined | null, valid: readonly string[]): void {\n if (!opts || typeof opts !== 'object') return;\n for (const key of Object.keys(opts)) {\n if (valid.includes(key)) continue;\n const guess = suggestName(key, valid);\n console.warn(`pixi-effects: ${where}: unknown option \"${key}\"${guess ? ` — did you mean \"${guess}\"?` : ''} (valid: ${valid.join(', ')})`);\n }\n}\n"]}