pixi-effects 0.32.0 → 0.34.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.
- package/CHANGELOG.md +20 -0
- package/README.md +5 -5
- package/ai/chat-template.html +3 -3
- package/ai/tools/lookup.mjs +29 -6
- package/ai/tools/pixi-effects.mjs +1 -1
- package/dist/Composition-NDXKQHB4.js +7 -0
- package/dist/{Composition-RF7QOEXT.js.map → Composition-NDXKQHB4.js.map} +1 -1
- package/dist/Composition-OLH7RC5Z.cjs +16 -0
- package/dist/{Composition-LNMKWXSL.cjs.map → Composition-OLH7RC5Z.cjs.map} +1 -1
- package/dist/{Spans-SDXABOV6.js → Spans-QHHWC2PB.js} +6 -6
- package/dist/{Spans-SDXABOV6.js.map → Spans-QHHWC2PB.js.map} +1 -1
- package/dist/{Spans-NQGKVMR5.cjs → Spans-QRMN2EZO.cjs} +11 -11
- package/dist/{Spans-NQGKVMR5.cjs.map → Spans-QRMN2EZO.cjs.map} +1 -1
- package/dist/{blendModes-MVRLG3T7.js → blendModes-PP5NPBXY.js} +4 -4
- package/dist/{blendModes-MVRLG3T7.js.map → blendModes-PP5NPBXY.js.map} +1 -1
- package/dist/{blendModes-VTKDXWEN.cjs → blendModes-WIUCYIMC.cjs} +5 -5
- package/dist/{blendModes-VTKDXWEN.cjs.map → blendModes-WIUCYIMC.cjs.map} +1 -1
- package/dist/{chunk-CRUDOKSD.cjs → chunk-5IJENZOG.cjs} +91 -91
- package/dist/{chunk-CRUDOKSD.cjs.map → chunk-5IJENZOG.cjs.map} +1 -1
- package/dist/{chunk-FCMOREIS.js → chunk-67LG7MN5.js} +48 -15
- package/dist/chunk-67LG7MN5.js.map +1 -0
- package/dist/{chunk-K3MAEKFM.cjs → chunk-FVZEBYLW.cjs} +78 -45
- package/dist/chunk-FVZEBYLW.cjs.map +1 -0
- package/dist/{chunk-FCGYJCVO.cjs → chunk-GL2AQFLQ.cjs} +23 -5
- package/dist/chunk-GL2AQFLQ.cjs.map +1 -0
- package/dist/{chunk-Z437UWI4.cjs → chunk-IMQJVRMT.cjs} +5 -5
- package/dist/{chunk-Z437UWI4.cjs.map → chunk-IMQJVRMT.cjs.map} +1 -1
- package/dist/{chunk-C5BNHVKK.js → chunk-ITDYFBB6.js} +23 -5
- package/dist/chunk-ITDYFBB6.js.map +1 -0
- package/dist/{chunk-QHDN6TF5.cjs → chunk-LEECUCTG.cjs} +44 -25
- package/dist/chunk-LEECUCTG.cjs.map +1 -0
- package/dist/{chunk-QFNS6BFL.js → chunk-RTJD3ZSW.js} +4 -4
- package/dist/{chunk-QFNS6BFL.js.map → chunk-RTJD3ZSW.js.map} +1 -1
- package/dist/{chunk-D5BFQVKL.js → chunk-XV4L72FW.js} +5 -5
- package/dist/{chunk-D5BFQVKL.js.map → chunk-XV4L72FW.js.map} +1 -1
- package/dist/{chunk-AW5NPDE4.js → chunk-Y253JQOH.js} +24 -7
- package/dist/chunk-Y253JQOH.js.map +1 -0
- package/dist/index.cjs +33 -33
- package/dist/index.js +5 -5
- package/dist/loader.css +1 -1
- package/dist/present.cjs +5 -5
- package/dist/present.js +5 -5
- package/dist/three.cjs +6 -6
- package/dist/three.js +2 -2
- package/docs/dsl.md +9 -2
- package/llms-full.txt +19 -7
- package/package.json +1 -1
- package/skills/pixi-effects/SKILL.md +1 -1
- package/skills/pixi-effects/reference/pitfalls.md +5 -1
- package/skills/pixi-effects/reference/quickstart.md +3 -2
- package/skills/pixi-effects/reference/recipes.md +1 -1
- package/skills/pixi-effects/template.html +6 -6
- package/dist/Composition-LNMKWXSL.cjs +0 -16
- package/dist/Composition-RF7QOEXT.js +0 -7
- package/dist/chunk-AW5NPDE4.js.map +0 -1
- package/dist/chunk-C5BNHVKK.js.map +0 -1
- package/dist/chunk-FCGYJCVO.cjs.map +0 -1
- package/dist/chunk-FCMOREIS.js.map +0 -1
- package/dist/chunk-K3MAEKFM.cjs.map +0 -1
- package/dist/chunk-QHDN6TF5.cjs.map +0 -1
|
@@ -186,14 +186,32 @@ function lintTiming(spec, parentDuration, warn = defaultWarn) {
|
|
|
186
186
|
warn(`pixi-effects: ${who} starts at ${at}s, after its composition ends (${parentDuration}s), so it is never visible`);
|
|
187
187
|
}
|
|
188
188
|
if (spec.type === "audio" && (spec.sfx !== void 0 || spec.music !== void 0) && spec.duration === void 0) return;
|
|
189
|
-
|
|
189
|
+
if (at >= parentDuration) return;
|
|
190
|
+
const lives = spec.duration ?? Math.max(0, parentDuration - at);
|
|
191
|
+
const ms = (x) => Math.round(x * 1e3) / 1e3;
|
|
190
192
|
(spec.keyframes ?? []).forEach((kf, i) => {
|
|
191
193
|
const kat = kf.at ?? 0;
|
|
192
|
-
if (kat >=
|
|
194
|
+
if (kat >= lives) {
|
|
193
195
|
warn(
|
|
194
|
-
`pixi-effects: ${who}: keyframes[${i}] starts at ${kat}s, after the layer ends (duration ${
|
|
196
|
+
`pixi-effects: ${who}: keyframes[${i}] starts at ${kat}s, after the layer ends (duration ${ms(lives)}s), so it never plays. Keyframe \`at\` is measured from the start of this layer, not from the start of the composition.`,
|
|
195
197
|
"late-keyframe"
|
|
196
198
|
);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const length = kf.duration;
|
|
202
|
+
const toAlpha = kf.to?.alpha;
|
|
203
|
+
const fromAlpha = kf.from?.alpha;
|
|
204
|
+
const nearEnd = (v) => typeof v === "number" && (v <= 0.1 || v >= 0.9);
|
|
205
|
+
const fade = toAlpha !== void 0 ? nearEnd(toAlpha) : nearEnd(fromAlpha);
|
|
206
|
+
if (fade && typeof length === "number" && length > 0 && !kf.repeat) {
|
|
207
|
+
const start = kat < 0 ? lives + kat : kat;
|
|
208
|
+
const cut = (start + length - lives) / length;
|
|
209
|
+
if (start >= 0 && cut > 0.25 && cut * length >= 0.2) {
|
|
210
|
+
warn(
|
|
211
|
+
`pixi-effects: ${who}: keyframes[${i}] runs from ${ms(start)}s to ${ms(start + length)}s but the layer ends at ${ms(lives)}s, so the last ${Math.round(cut * 100)}% of it never plays (a fade stops half way). Keyframe \`at\` is measured from the start of this layer: start it earlier, make it shorter, or make the layer longer.`,
|
|
212
|
+
"late-keyframe"
|
|
213
|
+
);
|
|
214
|
+
}
|
|
197
215
|
}
|
|
198
216
|
});
|
|
199
217
|
}
|
|
@@ -335,5 +353,5 @@ exports.lintKeys = lintKeys;
|
|
|
335
353
|
exports.lintText = lintText;
|
|
336
354
|
exports.lintTiming = lintTiming;
|
|
337
355
|
exports.summarizeWarnings = summarizeWarnings;
|
|
338
|
-
//# sourceMappingURL=chunk-
|
|
339
|
-
//# sourceMappingURL=chunk-
|
|
356
|
+
//# sourceMappingURL=chunk-GL2AQFLQ.cjs.map
|
|
357
|
+
//# sourceMappingURL=chunk-GL2AQFLQ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/space/specKeys.ts","../src/core/layerKeys.ts","../src/core/lint.ts"],"names":["suggestName"],"mappings":"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","file":"chunk-GL2AQFLQ.cjs","sourcesContent":["import type { Keyframe } from '../types';\n\n/** Every prop key a spec touches in `initial` and in keyframe `set` / `to` / `from`. */\nexport function collectPropKeys(spec: {\n initial?: Record<string, unknown>;\n keyframes?: Keyframe[];\n}): Set<string> {\n const out = new Set<string>();\n for (const k of Object.keys(spec.initial ?? {})) out.add(k);\n for (const kf of spec.keyframes ?? []) {\n for (const bag of [kf.set, kf.to, kf.from]) {\n for (const k of Object.keys(bag ?? {})) out.add(k);\n }\n }\n return out;\n}\n","import type {\n SequenceCommon, VideoSequenceSpec, ImageSequenceSpec, TextSequenceSpec, AudioAssetSpec, AudioSfxSpec, AudioMusicSpec,\n CompositionSequenceSpec, CameraSequenceSpec, LightSequenceSpec, ShaderSequenceSpec, NullSequenceSpec, SequenceSpec,\n RectShapeSpec, CircleShapeSpec, EllipseShapeSpec, ArcShapeSpec, LineShapeSpec, PolygonShapeSpec, PathShapeSpec,\n} from '../types';\n\n/**\n * The keys a layer of each kind may have, for `lintKeys`. They are tables of names, so each one is checked against its type twice, by\n * the compiler: `satisfies` rejects a name the type does not have, and `Covers` fails the build when the type has a key the table lacks\n * (add a key to a spec type and `tsc` tells you to add it here, so the warning never calls a real key unknown).\n */\ntype KeysOfUnion<T> = T extends unknown ? keyof T : never;\ntype Covers<T, K extends readonly string[]> = [Exclude<KeysOfUnion<T>, K[number]>] extends [never] ? true : { missing: Exclude<KeysOfUnion<T>, K[number]> };\ntype Assert<T extends true> = T;\n\nconst COMMON = ['type', 'name', 'parent', 'at', 'duration', 'initial', 'keyframes', 'filters', 'filterArea', 'mask', 'blendMode', 'threeD', 'hideBehindCamera', 'lit', 'castsShadows'] as const satisfies readonly KeysOfUnion<SequenceCommon | { type: string }>[];\n\nconst VIDEO = [...COMMON, 'asset', 'loop', 'audio', 'volume', 'speed'] as const satisfies readonly KeysOfUnion<VideoSequenceSpec>[];\nconst IMAGE = [...COMMON, 'asset', 'colorSpace'] as const satisfies readonly KeysOfUnion<ImageSequenceSpec>[];\nconst TEXT = [...COMMON, 'text', 'spans', 'format', 'style', 'colorSpace', 'fillGradient'] as const satisfies readonly KeysOfUnion<TextSequenceSpec>[];\nconst AUDIO = [...COMMON, 'volume', 'asset', 'loop', 'sfx', 'music', 'speed'] as const satisfies readonly KeysOfUnion<AudioAssetSpec | AudioSfxSpec | AudioMusicSpec>[];\nconst COMPOSITION = [...COMMON, 'width', 'height', 'sequences', 'transitions', 'speed'] as const satisfies readonly KeysOfUnion<CompositionSequenceSpec>[];\nconst CAMERA = [...COMMON] as const satisfies readonly KeysOfUnion<CameraSequenceSpec>[];\nconst LIGHT = [...COMMON, 'kind', 'falloff'] as const satisfies readonly KeysOfUnion<LightSequenceSpec>[];\nconst SHADER = [...COMMON, 'fragment', 'uniforms', 'width', 'height', 'resolution', 'transparent'] as const satisfies readonly KeysOfUnion<ShaderSequenceSpec>[];\nconst NULL = [...COMMON] as const satisfies readonly KeysOfUnion<NullSequenceSpec>[];\n\nconst SHAPE = [...COMMON, 'shape', 'fillGradient', 'colorSpace', 'strokeCap', 'strokeJoin'] as const;\nconst TRIM = ['trimStart', 'trimEnd', 'trimEach'] as const;\nconst RECT = [...SHAPE, ...TRIM, 'width', 'height', 'cornerRadius', 'anchorX', 'anchorY'] as const satisfies readonly KeysOfUnion<RectShapeSpec>[];\nconst CIRCLE = [...SHAPE, ...TRIM, 'radius', 'anchorX', 'anchorY'] as const satisfies readonly KeysOfUnion<CircleShapeSpec>[];\nconst ELLIPSE = [...SHAPE, ...TRIM, 'radiusX', 'radiusY', 'anchorX', 'anchorY'] as const satisfies readonly KeysOfUnion<EllipseShapeSpec>[];\nconst ARC = [...SHAPE, 'radius', 'innerRadius', 'startAngle', 'endAngle'] as const satisfies readonly KeysOfUnion<ArcShapeSpec>[];\nconst LINE = [...SHAPE, ...TRIM, 'from', 'to'] as const satisfies readonly KeysOfUnion<LineShapeSpec>[];\nconst POLYGON = [...SHAPE, ...TRIM, 'points', 'open'] as const satisfies readonly KeysOfUnion<PolygonShapeSpec>[];\nconst PATH = [...SHAPE, ...TRIM, 'd', 'morphTo', 'morph', 'morphPoints'] as const satisfies readonly KeysOfUnion<PathShapeSpec>[];\n\n/** The compiler checks every table covers its type (this type is never used: it exists to fail the build). */\nexport type __Covered = [\n Assert<Covers<VideoSequenceSpec, typeof VIDEO>>, Assert<Covers<ImageSequenceSpec, typeof IMAGE>>, Assert<Covers<TextSequenceSpec, typeof TEXT>>,\n Assert<Covers<AudioAssetSpec | AudioSfxSpec | AudioMusicSpec, typeof AUDIO>>, Assert<Covers<CompositionSequenceSpec, typeof COMPOSITION>>,\n Assert<Covers<CameraSequenceSpec, typeof CAMERA>>, Assert<Covers<LightSequenceSpec, typeof LIGHT>>, Assert<Covers<ShaderSequenceSpec, typeof SHADER>>, Assert<Covers<NullSequenceSpec, typeof NULL>>,\n Assert<Covers<RectShapeSpec, typeof RECT>>, Assert<Covers<CircleShapeSpec, typeof CIRCLE>>, Assert<Covers<EllipseShapeSpec, typeof ELLIPSE>>,\n Assert<Covers<ArcShapeSpec, typeof ARC>>, Assert<Covers<LineShapeSpec, typeof LINE>>, Assert<Covers<PolygonShapeSpec, typeof POLYGON>>,\n Assert<Covers<PathShapeSpec, typeof PATH>>,\n];\n\nconst SHAPES: Record<string, readonly string[]> = { rect: RECT, circle: CIRCLE, ellipse: ELLIPSE, arc: ARC, line: LINE, polygon: POLYGON, path: PATH };\nconst BY_TYPE: Record<string, readonly string[]> = { video: VIDEO, image: IMAGE, text: TEXT, audio: AUDIO, composition: COMPOSITION, camera: CAMERA, light: LIGHT, shader: SHADER, null: NULL };\n\n/** The keys that shape what is drawn: a layer that is never drawn (audio, a camera, a light) accepts them in its type but they do nothing there. */\nconst PICTURE_KEYS = ['filters', 'filterArea', 'mask', 'blendMode', 'threeD', 'hideBehindCamera', 'lit', 'castsShadows'] as const;\nconst NOT_DRAWN: Record<string, string> = {\n audio: 'an audio layer: it is not drawn (it plays)',\n camera: 'a camera layer: it is not drawn, it frames the picture (its place and lens go in `initial` / `keyframes`: x y z lookAtX … fov)',\n light: 'a light layer: it is not drawn, it lights `threeD` layers (its numbers go in `initial` / `keyframes`: intensity color …)',\n};\n\n/** For a layer that is never drawn: the picture keys it carries, each with what the layer is (the keys do nothing there). A light keeps `castsShadows`, its own switch. */\nexport function pictureKeysIgnored(spec: { type: string } & Record<string, unknown>): Array<{ key: string; why: string }> {\n const why = NOT_DRAWN[spec.type];\n if (!why) return [];\n return PICTURE_KEYS.filter(k => spec[k] !== undefined && !(spec.type === 'light' && k === 'castsShadows')).map(key => ({ key, why }));\n}\n\n/** What a layer may be called, for the message: `text layer`, `rect shape`. */\nexport function kindName(spec: { type: string; shape?: string }): string {\n return spec.type === 'shape' && spec.shape ? `${spec.shape} shape` : `${spec.type} layer`;\n}\n\n/** The keys a layer may have, or null for a kind this library does not know (a `three` layer: registered elsewhere, so not checked). */\nexport function layerKeys(spec: { type: string; shape?: string }): readonly string[] | null {\n if (spec.type === 'shape') return (spec.shape && SHAPES[spec.shape]) || null;\n return BY_TYPE[spec.type] ?? null;\n}\n\n/** Which kinds have `key` (for \"it belongs to a circle shape\"). */\nexport function kindsWithKey(key: string): string[] {\n const out: string[] = [];\n for (const [shape, keys] of Object.entries(SHAPES)) if (keys.includes(key)) out.push(`${shape} shape`);\n for (const [type, keys] of Object.entries(BY_TYPE)) if (keys.includes(key)) out.push(`${type} layer`);\n return out;\n}\n\n/** Names a keyframe or `initial` may animate. Dotted paths (`filters.g.amount`, `three.box.x`) belong to their routers and are not looked up here. */\nexport const PROP_KEYS: ReadonlySet<string> = new Set([\n // transform and look\n 'x', 'y', 'z', 'alpha', 'rotation', 'rotationX', 'rotationY', 'width', 'height', 'visible', 'autoAlpha',\n 'scale', 'scaleX', 'scaleY', 'anchor', 'anchorX', 'anchorY', 'pivot', 'pivotX', 'pivotY', 'skew', 'skewX', 'skewY',\n 'position', 'positionX', 'positionY', 'tilePosition', 'tilePositionX', 'tilePositionY', 'tileScale', 'tileScaleX', 'tileScaleY', 'tint',\n // shapes\n 'fillColor', 'fillAlpha', 'strokeColor', 'strokeAlpha', 'strokeWidth', 'cornerRadius', 'radius', 'radiusX', 'radiusY',\n 'innerRadius', 'startAngle', 'endAngle', 'trimStart', 'trimEnd', 'trimEach', 'morph', 'fillGradient', 'strokeCap', 'strokeJoin',\n // text, audio, video\n 'fill', 'value', 'visibleChars', 'text', 'volume', 'time',\n // camera\n 'lookAtX', 'lookAtY', 'lookAtZ', 'fov', 'focus', 'aperture', 'offsetX', 'offsetY', 'offsetZ', 'lookOffsetX', 'lookOffsetY', 'lookOffsetZ',\n // light + fog\n 'intensity', 'color', 'coneAngle', 'coneFeather', 'falloffDistance', 'shadowDarkness', 'shadowDiffusion', 'fogNear', 'fogFar', 'fogColor', 'fogAmount',\n]);\n\n/** The text `style` keys (PixiJS TextStyle) that this library passes on. */\nexport const STYLE_KEYS: readonly string[] = [\n 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle', 'fontVariant', 'fill', 'stroke', 'dropShadow', 'letterSpacing', 'lineHeight', 'leading',\n 'align', 'wordWrap', 'wordWrapWidth', 'breakWords', 'whiteSpace', 'padding', 'textBaseline', 'trim', 'lineJoin', 'miterLimit', 'filters', 'tagStyles',\n];\n\nexport type { SequenceSpec };\n","import type { SequenceSpec } from '../types';\nimport { collectPropKeys } from '../space/specKeys';\nimport { suggestName } from './options';\nimport { layerKeys, kindName, kindsWithKey, pictureKeysIgnored, PROP_KEYS, STYLE_KEYS } from './layerKeys';\n\ntype Warn = (message: string, kind?: 'late-keyframe') => void;\nconst defaultWarn: Warn = m => console.warn(m);\n\n/** \"layer \"name\"\" or \"unnamed text layer\" — how warnings refer to a sequence. */\nexport function describeLayer(spec: { name?: string; type: string }): string {\n return spec.name ? `layer \"${spec.name}\"` : `unnamed ${spec.type} layer`;\n}\n\n/**\n * Timing mistakes that otherwise fail silently: a layer that starts after its\n * composition has ended, or a keyframe that starts after its own layer has\n * ended (the usual cause: writing keyframe `at` in composition time instead of\n * time since the start of the layer).\n */\nexport function lintTiming(spec: SequenceSpec, parentDuration: number, warn: Warn = defaultWarn): void {\n const who = describeLayer(spec);\n const at = spec.at ?? 0;\n if (at >= parentDuration) {\n warn(`pixi-effects: ${who} starts at ${at}s, after its composition ends (${parentDuration}s), so it is never visible`);\n }\n // An sfx or a piece of music without a duration is as long as its sound, which only the audio layer knows (it checks its own keyframes).\n if (spec.type === 'audio' && ((spec as { sfx?: unknown }).sfx !== undefined || (spec as { music?: unknown }).music !== undefined) && spec.duration === undefined) return;\n if (at >= parentDuration) return; // never visible: said above, and its keyframes say nothing more\n const lives = spec.duration ?? Math.max(0, parentDuration - at); // without a duration a layer lives until its composition ends\n const ms = (x: number) => Math.round(x * 1000) / 1000;\n (spec.keyframes ?? []).forEach((kf, i) => {\n const kat = kf.at ?? 0;\n if (kat >= lives) {\n warn(\n `pixi-effects: ${who}: keyframes[${i}] starts at ${kat}s, after the layer ends (duration ${ms(lives)}s), so it never plays. ` +\n `Keyframe \\`at\\` is measured from the start of this layer, not from the start of the composition.`,\n 'late-keyframe',\n );\n return;\n }\n // Starts in time but is cut off by the layer's end: a FADE (to alpha 0 or 1, or from 0 / 1) that never finishes (a trial: a fade-out that stopped half way, a 1.2 s fade-in on a 0.6 s layer).\n // Not a drift, a fall, a zoom or a decaying glow (to 0.22) that is still going when its layer ends: those are common and on purpose. A `set` is instant, a repeating tween\n // (a blink) and a spring ('auto') are meant to run over, and a cut of under 0.2 s (a few frames: the last keyframe of a generated loop) is nothing.\n const length = kf.duration;\n // a fade ends (almost) opaque or (almost) clear: `to` alpha, or, when only `from` names alpha, the value it fades from (a fade-in `from: { alpha: 0 }` ends where it was)\n const toAlpha = (kf.to as Record<string, unknown> | undefined)?.alpha;\n const fromAlpha = (kf.from as Record<string, unknown> | undefined)?.alpha;\n const nearEnd = (v: unknown) => typeof v === 'number' && (v <= 0.1 || v >= 0.9);\n const fade = toAlpha !== undefined ? nearEnd(toAlpha) : nearEnd(fromAlpha);\n if (fade && typeof length === 'number' && length > 0 && !kf.repeat) {\n const start = kat < 0 ? lives + kat : kat; // a negative `at` counts back from the end of the layer\n const cut = (start + length - lives) / length;\n if (start >= 0 && cut > 0.25 && cut * length >= 0.2) {\n warn(\n `pixi-effects: ${who}: keyframes[${i}] runs from ${ms(start)}s to ${ms(start + length)}s but the layer ends at ${ms(lives)}s, so the last ${Math.round(cut * 100)}% of it never plays ` +\n `(a fade stops half way). Keyframe \\`at\\` is measured from the start of this layer: start it earlier, make it shorter, or make the layer longer.`,\n 'late-keyframe',\n );\n }\n }\n });\n}\n\n/**\n * A loop that builds a hundred layers makes the same mistake a hundred times. Print the first few in full and\n * say how many more there are: the rest are the same loop.\n */\nexport function summarizeWarnings(messages: string[], shown = 3): string[] {\n if (messages.length <= shown) return messages;\n return [...messages.slice(0, shown), `pixi-effects: ${messages.length - shown} more layers with the same problem (the same loop or helper is probably building them): fix the ones above and these go away.`];\n}\n\n/** A text layer that animates `value` but has nowhere to print it. */\nexport function lintText(spec: SequenceSpec, warn: Warn = defaultWarn): void {\n if (spec.type !== 'text') return;\n // Every string the layer ever shows: its `text` and any `set: { text }` swap.\n const strings = [spec.text ?? '', ...(spec.keyframes ?? []).map(kf => String((kf.set as Record<string, unknown> | undefined)?.text ?? ''))];\n const hasPlaceholder = strings.some(t => t.includes('{value}'));\n if (hasPlaceholder && !collectPropKeys(spec).has('value')) {\n warn(`pixi-effects: ${describeLayer(spec)}: the text has a {value} placeholder but nothing sets or animates \\`value\\`, so it prints 0. Set initial: { value: … } or animate it; {value} is reserved for counters (there is no way to print a literal \"{value}\").`);\n }\n if (collectPropKeys(spec).has('value') && !hasPlaceholder) {\n warn(`pixi-effects: ${describeLayer(spec)}: \\`value\\` is set or animated but the text has no {value} placeholder, so nothing shows it. Use text: '{value}' (or e.g. '{value} users').`);\n }\n}\n\nconst REMAPPABLE = new Set(['video', 'audio', 'composition']);\n/** Top-level names that mean a time remap and have their own message. */\nconst REMAP_NAMES = new Set(['time', 'timeRemap', 'reverse']);\nconst TIME_BAGS = ['set', 'to', 'from'] as const;\n\n/** The mistakes a time remap can make (`speed` / `time`), said once when the layer is built. Called from `lintKeys`. */\nfunction lintRemap(spec: SequenceSpec, warn: Warn): void {\n const s = spec as unknown as Record<string, any>;\n const who = describeLayer(spec);\n const kfs: Array<Record<string, any>> = s.keyframes ?? [];\n const bags: Array<Record<string, any> | undefined> = [s.initial, ...kfs.flatMap(kf => TIME_BAGS.map(b => kf[b]))];\n const timeInInitial = !!s.initial && s.initial.time !== undefined;\n const timeInKeyframes = kfs.some(kf => TIME_BAGS.some(b => kf[b] && kf[b].time !== undefined));\n const timed = timeInInitial || timeInKeyframes;\n if (bags.some(bag => bag && bag.speed !== undefined)) {\n warn(`pixi-effects: ${who}: speed is a fixed setting, not an animatable property: write it on the layer (speed: 2); to change the speed over time, animate time (keyframes: [{ at: 0, from: { time: 0 }, to: { time: 4 }, duration: 2, ease: 'power2.in' }])`);\n }\n if (!REMAPPABLE.has(spec.type)) {\n if (timed) warn(`pixi-effects: ${who}: \"time\" only works on video, audio and composition layers; put this layer in a composition and remap that (it is ignored here)`);\n return; // a top-level speed here is the key warning's business (\"not a ... key\")\n }\n if (s.reverse !== undefined) warn(`pixi-effects: ${who}: \"reverse\" is not a key: write speed: -1 to play backward`);\n if (s.timeRemap !== undefined) warn(`pixi-effects: ${who}: \"timeRemap\" is not a key: animate time in keyframes (from / to / set), or write speed`);\n if (s.time !== undefined) warn(`pixi-effects: ${who}: \"time\" belongs in initial or keyframes (initial: { time: 2 }), not on the layer`);\n if (spec.type === 'audio' && (s.sfx !== undefined || s.music !== undefined) && (s.speed !== undefined || timed)) {\n warn(`pixi-effects: ${who}: speed and time do not apply to a synthesised sound (sfx, music); change an sfx's pitch with pitch (semitones), or put it in a composition and remap that`);\n return;\n }\n if (s.speed !== undefined && (typeof s.speed !== 'number' || !Number.isFinite(s.speed) || s.speed === 0)) {\n warn(`pixi-effects: ${who}: speed ${JSON.stringify(s.speed)} cannot be used: write a number other than 0 (negative plays backward); to hold a moment, key time to the same value twice`);\n }\n if (s.speed !== undefined && timeInKeyframes) {\n warn(`pixi-effects: ${who}: speed and keyframed time are both set; time wins and speed is ignored. Use one of them`);\n }\n if (timeInInitial && typeof s.initial.time !== 'number') {\n warn(`pixi-effects: ${who}: initial.time must be a number of seconds, got ${JSON.stringify(s.initial.time)}`);\n }\n kfs.forEach((kf, i) => {\n for (const b of TIME_BAGS) {\n const v = kf[b]?.time;\n if (v !== undefined && typeof v !== 'number' && typeof v !== 'string') warn(`pixi-effects: ${who}: keyframes[${i}].${b}.time must be a number of seconds, got ${JSON.stringify(v)}`);\n }\n });\n}\n\n/**\n * Keys that do not exist, which the library used to ignore without a word (a typo in a layer key, a mistyped property in a keyframe, a\n * style key Pixi does not know). Said once each, with what was probably meant. A warning, never an error. Not checked here: dotted\n * paths (`filters.g.amount`, `three.box.x`: their routers say what is wrong), the names `fillGradient` says itself (`gradientAngle`),\n * and a kind of layer registered elsewhere (`three`).\n */\n/** Keys the library used to have: the sentence says what to write now. */\nconst REMOVED_KEYS: Record<string, string> = {\n maskInverted: 'a hole instead of a crop is `mask: { layer: <the mask layer>, invert: true }`',\n};\n\n/** Where a layer is and how it is turned: always `initial` or a keyframe, even for a kind of layer that has such a name as a key of another meaning (`anchorX` on a shape). */\nconst TRANSFORM_KEYS = new Set(['x', 'y', 'z', 'alpha', 'rotation', 'rotationX', 'rotationY', 'scale', 'scaleX', 'scaleY', 'anchor', 'anchorX', 'anchorY',\n 'pivot', 'pivotX', 'pivotY', 'skew', 'skewX', 'skewY', 'position', 'positionX', 'positionY', 'tint', 'visible', 'autoAlpha']);\n\nexport function lintKeys(spec: SequenceSpec, warn: Warn = defaultWarn): void {\n const who = describeLayer(spec);\n const valid = layerKeys(spec as { type: string; shape?: string });\n if (valid) {\n for (const key of Object.keys(spec)) {\n if (valid.includes(key) || (spec as unknown as Record<string, unknown>)[key] === undefined) continue; // a spread that sets a key only when it applies leaves `undefined`\n if (REMAPPABLE.has(spec.type) && REMAP_NAMES.has(key)) continue; // lintRemap has its own message for these\n if (REMOVED_KEYS[key]) { warn(`pixi-effects: ${who}: \"${key}\" is not a ${kindName(spec as { type: string; shape?: string })} key: ${REMOVED_KEYS[key]}`); continue; }\n // `z`, `x`, `alpha`, `rotationX` … are properties of the picture: they go in `initial` (or a keyframe), not on the layer. Say that, not a guess at another key.\n if (TRANSFORM_KEYS.has(key) || (PROP_KEYS.has(key) && kindsWithKey(key).length === 0)) { // (a key some other kind of layer owns, `radius` on a rect, keeps its \"it belongs to\" sentence below)\n const v = (spec as unknown as Record<string, unknown>)[key];\n const shown = typeof v === 'number' || (typeof v === 'string' && v.length <= 24) ? JSON.stringify(v) : '…';\n warn(`pixi-effects: ${who}: \"${key}\" is a property, not a ${kindName(spec as { type: string; shape?: string })} key, so it is ignored: write it in initial (initial: { ${key}: ${shown} }) or in a keyframe`);\n continue;\n }\n const guess = suggestName(key, valid.filter(k => k !== 'type'));\n const owners = kindsWithKey(key);\n const belongs = owners.length ? ` (it belongs to ${owners.slice(0, 3).join(', ')})` : '';\n const hint = guess ? ` — did you mean \"${guess}\"?${belongs}` : belongs;\n warn(`pixi-effects: ${who}: \"${key}\" is not a ${kindName(spec as { type: string; shape?: string })} key${hint}. Valid keys: ${valid.join(', ')}`);\n }\n }\n for (const { key, why } of pictureKeysIgnored(spec as unknown as { type: string } & Record<string, unknown>)) warn(`pixi-effects: ${who}: \"${key}\" does nothing on ${why}`);\n lintRemap(spec, warn);\n const said = new Set<string>();\n const bags: Array<Record<string, unknown> | undefined> = [spec.initial, ...(spec.keyframes ?? []).flatMap(kf => [kf.set, kf.to, kf.from])] as Array<Record<string, unknown> | undefined>;\n for (const bag of bags) {\n for (const key of Object.keys(bag ?? {})) {\n if (bag![key] === undefined) continue;\n if (PROP_KEYS.has(key) || key.includes('.') || /^gradient/i.test(key) || said.has(key) || key === 'speed') continue; // (speed: lintRemap says what to write)\n said.add(key);\n const guess = suggestName(key, [...PROP_KEYS]);\n warn(`pixi-effects: ${who}: \"${key}\" is not an animatable property${guess ? ` — did you mean \"${guess}\"?` : ''} (in initial, set, to or from). See the cheatsheet for the properties of this kind of layer`);\n }\n }\n if (spec.type === 'text' && spec.style && typeof spec.style === 'object') {\n for (const key of Object.keys(spec.style)) {\n if (STYLE_KEYS.includes(key) || (spec.style as Record<string, unknown>)[key] === undefined) continue;\n const guess = suggestName(key, STYLE_KEYS);\n warn(`pixi-effects: ${who}: style.${key} is not a text style key${guess ? ` — did you mean \"${guess}\"?` : ''} (it is ignored). Keys: ${STYLE_KEYS.join(', ')}`);\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkGL2AQFLQ_cjs = require('./chunk-GL2AQFLQ.cjs');
|
|
4
4
|
var chunkTWZNOUM7_cjs = require('./chunk-TWZNOUM7.cjs');
|
|
5
5
|
|
|
6
6
|
// src/core/blend.ts
|
|
@@ -40,7 +40,7 @@ function usesAdvancedBlend(spec) {
|
|
|
40
40
|
};
|
|
41
41
|
return visit(spec);
|
|
42
42
|
}
|
|
43
|
-
var sayNow = (message, spec) => console.warn(`pixi-effects: ${
|
|
43
|
+
var sayNow = (message, spec) => console.warn(`pixi-effects: ${chunkGL2AQFLQ_cjs.describeLayer(spec)}: ${message}`);
|
|
44
44
|
function blendUnavailableMessage(mode) {
|
|
45
45
|
return `blendMode "${mode}" could not be set up (the blend filters are not registered); the layer is drawn normal`;
|
|
46
46
|
}
|
|
@@ -85,7 +85,7 @@ function blendFilterFor(mode) {
|
|
|
85
85
|
}
|
|
86
86
|
async function enableAdvancedBlend(renderer) {
|
|
87
87
|
try {
|
|
88
|
-
const { registerBlendModes } = await import('./blendModes-
|
|
88
|
+
const { registerBlendModes } = await import('./blendModes-WIUCYIMC.cjs');
|
|
89
89
|
registerBlendModes();
|
|
90
90
|
} catch (e) {
|
|
91
91
|
const why = e instanceof Error ? e.message : String(e);
|
|
@@ -137,5 +137,5 @@ exports.isAdvancedBlend = isAdvancedBlend;
|
|
|
137
137
|
exports.maxConcurrentAdvanced = maxConcurrentAdvanced;
|
|
138
138
|
exports.setBlendFilterFactory = setBlendFilterFactory;
|
|
139
139
|
exports.usesAdvancedBlend = usesAdvancedBlend;
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
140
|
+
//# sourceMappingURL=chunk-IMQJVRMT.cjs.map
|
|
141
|
+
//# sourceMappingURL=chunk-IMQJVRMT.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/blend.ts"],"names":["suggestName","describeLayer"],"mappings":"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","file":"chunk-Z437UWI4.cjs","sourcesContent":["import { describeLayer } from './lint';\nimport { suggestName } from './options';\n\n/** The modes Pixi draws itself (`add`, `screen`, `multiply`) and `normal`. */\nexport const BASIC_BLEND_MODES = ['normal', 'add', 'screen', 'multiply'] as const;\n/** The modes that need the backdrop: our own `BlendModeFilter`s (`src/filters/blendModes.ts`), loaded only when a movie uses one. */\nexport const ADVANCED_BLEND_MODES = [\n 'overlay', 'soft-light', 'hard-light', 'color-dodge', 'color-burn', 'darken', 'lighten', 'difference', 'exclusion',\n 'hue', 'saturation', 'color', 'luminosity', 'linear-burn',\n] as const;\n/** Every `blendMode` there is (the one table the warnings, the types and the docs check against). */\nexport const BLEND_MODES: readonly string[] = [...BASIC_BLEND_MODES, ...ADVANCED_BLEND_MODES];\n\nexport function isAdvancedBlend(mode: unknown): boolean {\n return typeof mode === 'string' && (ADVANCED_BLEND_MODES as readonly string[]).includes(mode);\n}\n\n/** Why `mode` is not a blend mode, with the likely name and the choices; null when it is one. */\nexport function blendProblem(mode: unknown): string | null {\n if (typeof mode === 'string' && BLEND_MODES.includes(mode)) return null;\n const guess = typeof mode === 'string' ? suggestName(mode, BLEND_MODES) : null;\n const shown = typeof mode === 'string' ? `\"${mode}\"` : String(mode);\n return `blendMode ${shown} is not supported${guess ? `; did you mean \"${guess}\"?` : ''} (use ${BLEND_MODES.join(', ')})`;\n}\n\n/** Does any layer of this composition (or one nested in it, or a mask layer) use an advanced blend? */\nexport function usesAdvancedBlend(spec: unknown): boolean {\n const visit = (n: unknown): boolean => {\n if (!n || typeof n !== 'object') return false;\n if (Array.isArray(n)) return n.some(visit);\n const o = n as Record<string, unknown>;\n return isAdvancedBlend(o.blendMode) || visit(o.sequences) || visit(o.mask) || visit(o.layer); // (`layer`: a mask written as { layer: <spec>, invert })\n };\n return visit(spec);\n}\n\n/** What to say about a layer's blend mode: `Composition` collects these per build, so the same mistake in 300 particle layers is said once. */\nexport type BlendReport = (message: string, spec: { name?: string; type: string }) => void;\nconst sayNow: BlendReport = (message, spec) => console.warn(`pixi-effects: ${describeLayer(spec)}: ${message}`);\n\n/** The blend filters of an advanced mode were not registered (a movie registers them in `Movie.init`, or loading them failed): the layer is drawn normal. */\nexport function blendUnavailableMessage(mode: string): string {\n return `blendMode \"${mode}\" could not be set up (the blend filters are not registered); the layer is drawn normal`;\n}\n\n/**\n * Apply a layer's `blendMode` to its display object; an unknown mode, or an advanced mode while the blend filters are not registered, says so\n * and the layer is drawn normal. Returns the blend filter it added to the layer's filter chain (the caller destroys it with the layer), if any.\n */\nexport function applyBlendMode(\n spec: { blendMode?: string; name?: string; type: string },\n display: { blendMode?: unknown; filters?: unknown },\n report: BlendReport = sayNow,\n): BlendFilterLike | null {\n const mode = spec.blendMode;\n if (mode === undefined) return null;\n const problem = blendProblem(mode);\n if (problem) { report(problem, spec); return null; }\n if (isAdvancedBlend(mode) && !blendRegistered()) { report(blendUnavailableMessage(mode), spec); return null; }\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 if (isAdvancedBlend(mode)) {\n // an advanced mode is a filter of its own (it reads the backdrop): it joins the chain as the last pass\n const blend = blendFilterFor(mode);\n if (!blend) { report(blendUnavailableMessage(mode), spec); return null; }\n display.filters = [...filters, blend];\n return blend;\n }\n (filters[filters.length - 1] as { blendMode?: unknown }).blendMode = mode;\n return null;\n }\n display.blendMode = mode;\n return null;\n}\n\n/** What blend.ts needs of a blend filter (the real ones are Pixi filters; tests use plain objects). */\nexport type BlendFilterLike = { blendMode?: unknown; destroy(): void };\nlet factory: ((mode: string) => BlendFilterLike | null) | null = null;\n\n/** `filters/blendModes.ts` hands its filter maker here when it registers, so this file never imports Pixi. */\nexport function setBlendFilterFactory(f: ((mode: string) => BlendFilterLike | null) | null): void {\n factory = f;\n}\n\n/** Are the blend filters registered (a movie that uses an advanced mode registers them in `Movie.init`)? */\nexport function blendRegistered(): boolean {\n return factory !== null;\n}\n\n/** A fresh blend filter for an advanced mode, or null when the blends are not registered (or the mode is not an advanced one). */\nexport function blendFilterFor(mode: string): BlendFilterLike | null {\n return isAdvancedBlend(mode) && factory ? factory(mode) : null;\n}\n\n/**\n * Called by `Movie.init` when a layer uses an advanced mode, and only then: loads our blend filters (a separate chunk), registers them on\n * the pixi the movie runs on, and on WebGL turns the back buffer on (an advanced blend reads what is already drawn; WebGPU copies the\n * backdrop by itself, and has no such switch). A movie that uses none never reaches this, so nothing about it changes.\n */\nexport async function enableAdvancedBlend(renderer: unknown): Promise<void> {\n try {\n const { registerBlendModes } = await import('../filters/blendModes');\n registerBlendModes();\n } catch (e) {\n // a page that serves dist/index.js without its chunk, a CDN hiccup: the movie still plays, its advanced blends drawn normal\n const why = e instanceof Error ? e.message : String(e);\n console.warn(`pixi-effects: the blend filters could not be loaded (${why}); layers with an advanced blendMode are drawn normal. Serve the whole dist/ folder (the filters are the blendModes-*.js file next to index.js)`);\n return;\n }\n const bb = (renderer as { backBuffer?: { useBackBuffer: boolean } }).backBuffer;\n if (bb) bb.useBackBuffer = true;\n}\n\n/** This many layers with an advanced blend on screen at once is slow: each is a full-frame pass (measured on WebGL: about 1.5–2 ms each at 1080p). */\nexport const MANY_ADVANCED = 10;\n\ntype Counted = { at?: number; duration?: number; blendMode?: unknown; type?: string; sequences?: unknown };\n\n/** The layers a composition draws (its children each blend one by one when it has a mode): null, camera and audio layers draw nothing; nested compositions are walked. */\nfunction drawnLeaves(sequences: unknown): number {\n if (!Array.isArray(sequences)) return 0;\n let n = 0;\n for (const s of sequences as Counted[]) {\n if (!s || s.type === 'null' || s.type === 'camera' || s.type === 'audio') continue;\n n += s.type === 'composition' ? drawnLeaves(s.sequences) : 1;\n }\n return n;\n}\n\n/**\n * The full-frame passes one layer costs while it is on screen: 1 for a layer with an advanced mode; for a composition with one, one for each\n * drawn layer inside it (its children inherit the mode and blend one by one); for a composition without, the most that its own layers add\n * at one instant (a card with three blends in it, on screen with four other cards, is twelve).\n */\nfunction passesOf(l: Counted, span: number): number {\n const isComposition = l.type === 'composition';\n if (isAdvancedBlend(l.blendMode)) return isComposition ? Math.max(1, drawnLeaves(l.sequences)) : 1;\n return isComposition && Array.isArray(l.sequences) ? maxConcurrentAdvanced(l.sequences as Counted[], l.duration ?? span) : 0;\n}\n\n/** The most full-frame advanced-blend passes on screen at one instant, from the layers' `at` and `duration` (a layer with no duration lasts to the end). */\nexport function maxConcurrentAdvanced(layers: ReadonlyArray<Counted>, span: number): number {\n const events: Array<[number, number]> = [];\n for (const l of layers) {\n const w = passesOf(l, span);\n if (w === 0) continue;\n const at = l.at ?? 0;\n const end = l.duration === undefined ? span : at + l.duration;\n const start = Math.max(0, at); // a negative `at` starts before the composition: only what is after 0 is on screen\n if (end > start) events.push([start, w], [end, -w]);\n }\n events.sort((a, b) => a[0] - b[0] || a[1] - b[1]); // at one instant, the layers that end go before the ones that start\n let now = 0, most = 0;\n for (const [, d] of events) { now += d; most = Math.max(most, now); }\n return most;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/blend.ts"],"names":["suggestName","describeLayer"],"mappings":"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","file":"chunk-IMQJVRMT.cjs","sourcesContent":["import { describeLayer } from './lint';\nimport { suggestName } from './options';\n\n/** The modes Pixi draws itself (`add`, `screen`, `multiply`) and `normal`. */\nexport const BASIC_BLEND_MODES = ['normal', 'add', 'screen', 'multiply'] as const;\n/** The modes that need the backdrop: our own `BlendModeFilter`s (`src/filters/blendModes.ts`), loaded only when a movie uses one. */\nexport const ADVANCED_BLEND_MODES = [\n 'overlay', 'soft-light', 'hard-light', 'color-dodge', 'color-burn', 'darken', 'lighten', 'difference', 'exclusion',\n 'hue', 'saturation', 'color', 'luminosity', 'linear-burn',\n] as const;\n/** Every `blendMode` there is (the one table the warnings, the types and the docs check against). */\nexport const BLEND_MODES: readonly string[] = [...BASIC_BLEND_MODES, ...ADVANCED_BLEND_MODES];\n\nexport function isAdvancedBlend(mode: unknown): boolean {\n return typeof mode === 'string' && (ADVANCED_BLEND_MODES as readonly string[]).includes(mode);\n}\n\n/** Why `mode` is not a blend mode, with the likely name and the choices; null when it is one. */\nexport function blendProblem(mode: unknown): string | null {\n if (typeof mode === 'string' && BLEND_MODES.includes(mode)) return null;\n const guess = typeof mode === 'string' ? suggestName(mode, BLEND_MODES) : null;\n const shown = typeof mode === 'string' ? `\"${mode}\"` : String(mode);\n return `blendMode ${shown} is not supported${guess ? `; did you mean \"${guess}\"?` : ''} (use ${BLEND_MODES.join(', ')})`;\n}\n\n/** Does any layer of this composition (or one nested in it, or a mask layer) use an advanced blend? */\nexport function usesAdvancedBlend(spec: unknown): boolean {\n const visit = (n: unknown): boolean => {\n if (!n || typeof n !== 'object') return false;\n if (Array.isArray(n)) return n.some(visit);\n const o = n as Record<string, unknown>;\n return isAdvancedBlend(o.blendMode) || visit(o.sequences) || visit(o.mask) || visit(o.layer); // (`layer`: a mask written as { layer: <spec>, invert })\n };\n return visit(spec);\n}\n\n/** What to say about a layer's blend mode: `Composition` collects these per build, so the same mistake in 300 particle layers is said once. */\nexport type BlendReport = (message: string, spec: { name?: string; type: string }) => void;\nconst sayNow: BlendReport = (message, spec) => console.warn(`pixi-effects: ${describeLayer(spec)}: ${message}`);\n\n/** The blend filters of an advanced mode were not registered (a movie registers them in `Movie.init`, or loading them failed): the layer is drawn normal. */\nexport function blendUnavailableMessage(mode: string): string {\n return `blendMode \"${mode}\" could not be set up (the blend filters are not registered); the layer is drawn normal`;\n}\n\n/**\n * Apply a layer's `blendMode` to its display object; an unknown mode, or an advanced mode while the blend filters are not registered, says so\n * and the layer is drawn normal. Returns the blend filter it added to the layer's filter chain (the caller destroys it with the layer), if any.\n */\nexport function applyBlendMode(\n spec: { blendMode?: string; name?: string; type: string },\n display: { blendMode?: unknown; filters?: unknown },\n report: BlendReport = sayNow,\n): BlendFilterLike | null {\n const mode = spec.blendMode;\n if (mode === undefined) return null;\n const problem = blendProblem(mode);\n if (problem) { report(problem, spec); return null; }\n if (isAdvancedBlend(mode) && !blendRegistered()) { report(blendUnavailableMessage(mode), spec); return null; }\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 if (isAdvancedBlend(mode)) {\n // an advanced mode is a filter of its own (it reads the backdrop): it joins the chain as the last pass\n const blend = blendFilterFor(mode);\n if (!blend) { report(blendUnavailableMessage(mode), spec); return null; }\n display.filters = [...filters, blend];\n return blend;\n }\n (filters[filters.length - 1] as { blendMode?: unknown }).blendMode = mode;\n return null;\n }\n display.blendMode = mode;\n return null;\n}\n\n/** What blend.ts needs of a blend filter (the real ones are Pixi filters; tests use plain objects). */\nexport type BlendFilterLike = { blendMode?: unknown; destroy(): void };\nlet factory: ((mode: string) => BlendFilterLike | null) | null = null;\n\n/** `filters/blendModes.ts` hands its filter maker here when it registers, so this file never imports Pixi. */\nexport function setBlendFilterFactory(f: ((mode: string) => BlendFilterLike | null) | null): void {\n factory = f;\n}\n\n/** Are the blend filters registered (a movie that uses an advanced mode registers them in `Movie.init`)? */\nexport function blendRegistered(): boolean {\n return factory !== null;\n}\n\n/** A fresh blend filter for an advanced mode, or null when the blends are not registered (or the mode is not an advanced one). */\nexport function blendFilterFor(mode: string): BlendFilterLike | null {\n return isAdvancedBlend(mode) && factory ? factory(mode) : null;\n}\n\n/**\n * Called by `Movie.init` when a layer uses an advanced mode, and only then: loads our blend filters (a separate chunk), registers them on\n * the pixi the movie runs on, and on WebGL turns the back buffer on (an advanced blend reads what is already drawn; WebGPU copies the\n * backdrop by itself, and has no such switch). A movie that uses none never reaches this, so nothing about it changes.\n */\nexport async function enableAdvancedBlend(renderer: unknown): Promise<void> {\n try {\n const { registerBlendModes } = await import('../filters/blendModes');\n registerBlendModes();\n } catch (e) {\n // a page that serves dist/index.js without its chunk, a CDN hiccup: the movie still plays, its advanced blends drawn normal\n const why = e instanceof Error ? e.message : String(e);\n console.warn(`pixi-effects: the blend filters could not be loaded (${why}); layers with an advanced blendMode are drawn normal. Serve the whole dist/ folder (the filters are the blendModes-*.js file next to index.js)`);\n return;\n }\n const bb = (renderer as { backBuffer?: { useBackBuffer: boolean } }).backBuffer;\n if (bb) bb.useBackBuffer = true;\n}\n\n/** This many layers with an advanced blend on screen at once is slow: each is a full-frame pass (measured on WebGL: about 1.5–2 ms each at 1080p). */\nexport const MANY_ADVANCED = 10;\n\ntype Counted = { at?: number; duration?: number; blendMode?: unknown; type?: string; sequences?: unknown };\n\n/** The layers a composition draws (its children each blend one by one when it has a mode): null, camera and audio layers draw nothing; nested compositions are walked. */\nfunction drawnLeaves(sequences: unknown): number {\n if (!Array.isArray(sequences)) return 0;\n let n = 0;\n for (const s of sequences as Counted[]) {\n if (!s || s.type === 'null' || s.type === 'camera' || s.type === 'audio') continue;\n n += s.type === 'composition' ? drawnLeaves(s.sequences) : 1;\n }\n return n;\n}\n\n/**\n * The full-frame passes one layer costs while it is on screen: 1 for a layer with an advanced mode; for a composition with one, one for each\n * drawn layer inside it (its children inherit the mode and blend one by one); for a composition without, the most that its own layers add\n * at one instant (a card with three blends in it, on screen with four other cards, is twelve).\n */\nfunction passesOf(l: Counted, span: number): number {\n const isComposition = l.type === 'composition';\n if (isAdvancedBlend(l.blendMode)) return isComposition ? Math.max(1, drawnLeaves(l.sequences)) : 1;\n return isComposition && Array.isArray(l.sequences) ? maxConcurrentAdvanced(l.sequences as Counted[], l.duration ?? span) : 0;\n}\n\n/** The most full-frame advanced-blend passes on screen at one instant, from the layers' `at` and `duration` (a layer with no duration lasts to the end). */\nexport function maxConcurrentAdvanced(layers: ReadonlyArray<Counted>, span: number): number {\n const events: Array<[number, number]> = [];\n for (const l of layers) {\n const w = passesOf(l, span);\n if (w === 0) continue;\n const at = l.at ?? 0;\n const end = l.duration === undefined ? span : at + l.duration;\n const start = Math.max(0, at); // a negative `at` starts before the composition: only what is after 0 is on screen\n if (end > start) events.push([start, w], [end, -w]);\n }\n events.sort((a, b) => a[0] - b[0] || a[1] - b[1]); // at one instant, the layers that end go before the ones that start\n let now = 0, most = 0;\n for (const [, d] of events) { now += d; most = Math.max(most, now); }\n return most;\n}\n"]}
|
|
@@ -184,14 +184,32 @@ function lintTiming(spec, parentDuration, warn = defaultWarn) {
|
|
|
184
184
|
warn(`pixi-effects: ${who} starts at ${at}s, after its composition ends (${parentDuration}s), so it is never visible`);
|
|
185
185
|
}
|
|
186
186
|
if (spec.type === "audio" && (spec.sfx !== void 0 || spec.music !== void 0) && spec.duration === void 0) return;
|
|
187
|
-
|
|
187
|
+
if (at >= parentDuration) return;
|
|
188
|
+
const lives = spec.duration ?? Math.max(0, parentDuration - at);
|
|
189
|
+
const ms = (x) => Math.round(x * 1e3) / 1e3;
|
|
188
190
|
(spec.keyframes ?? []).forEach((kf, i) => {
|
|
189
191
|
const kat = kf.at ?? 0;
|
|
190
|
-
if (kat >=
|
|
192
|
+
if (kat >= lives) {
|
|
191
193
|
warn(
|
|
192
|
-
`pixi-effects: ${who}: keyframes[${i}] starts at ${kat}s, after the layer ends (duration ${
|
|
194
|
+
`pixi-effects: ${who}: keyframes[${i}] starts at ${kat}s, after the layer ends (duration ${ms(lives)}s), so it never plays. Keyframe \`at\` is measured from the start of this layer, not from the start of the composition.`,
|
|
193
195
|
"late-keyframe"
|
|
194
196
|
);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const length = kf.duration;
|
|
200
|
+
const toAlpha = kf.to?.alpha;
|
|
201
|
+
const fromAlpha = kf.from?.alpha;
|
|
202
|
+
const nearEnd = (v) => typeof v === "number" && (v <= 0.1 || v >= 0.9);
|
|
203
|
+
const fade = toAlpha !== void 0 ? nearEnd(toAlpha) : nearEnd(fromAlpha);
|
|
204
|
+
if (fade && typeof length === "number" && length > 0 && !kf.repeat) {
|
|
205
|
+
const start = kat < 0 ? lives + kat : kat;
|
|
206
|
+
const cut = (start + length - lives) / length;
|
|
207
|
+
if (start >= 0 && cut > 0.25 && cut * length >= 0.2) {
|
|
208
|
+
warn(
|
|
209
|
+
`pixi-effects: ${who}: keyframes[${i}] runs from ${ms(start)}s to ${ms(start + length)}s but the layer ends at ${ms(lives)}s, so the last ${Math.round(cut * 100)}% of it never plays (a fade stops half way). Keyframe \`at\` is measured from the start of this layer: start it earlier, make it shorter, or make the layer longer.`,
|
|
210
|
+
"late-keyframe"
|
|
211
|
+
);
|
|
212
|
+
}
|
|
195
213
|
}
|
|
196
214
|
});
|
|
197
215
|
}
|
|
@@ -328,5 +346,5 @@ function lintKeys(spec, warn = defaultWarn) {
|
|
|
328
346
|
}
|
|
329
347
|
|
|
330
348
|
export { collectPropKeys, describeLayer, lintKeys, lintText, lintTiming, summarizeWarnings };
|
|
331
|
-
//# sourceMappingURL=chunk-
|
|
332
|
-
//# sourceMappingURL=chunk-
|
|
349
|
+
//# sourceMappingURL=chunk-ITDYFBB6.js.map
|
|
350
|
+
//# sourceMappingURL=chunk-ITDYFBB6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/space/specKeys.ts","../src/core/layerKeys.ts","../src/core/lint.ts"],"names":[],"mappings":"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","file":"chunk-ITDYFBB6.js","sourcesContent":["import type { Keyframe } from '../types';\n\n/** Every prop key a spec touches in `initial` and in keyframe `set` / `to` / `from`. */\nexport function collectPropKeys(spec: {\n initial?: Record<string, unknown>;\n keyframes?: Keyframe[];\n}): Set<string> {\n const out = new Set<string>();\n for (const k of Object.keys(spec.initial ?? {})) out.add(k);\n for (const kf of spec.keyframes ?? []) {\n for (const bag of [kf.set, kf.to, kf.from]) {\n for (const k of Object.keys(bag ?? {})) out.add(k);\n }\n }\n return out;\n}\n","import type {\n SequenceCommon, VideoSequenceSpec, ImageSequenceSpec, TextSequenceSpec, AudioAssetSpec, AudioSfxSpec, AudioMusicSpec,\n CompositionSequenceSpec, CameraSequenceSpec, LightSequenceSpec, ShaderSequenceSpec, NullSequenceSpec, SequenceSpec,\n RectShapeSpec, CircleShapeSpec, EllipseShapeSpec, ArcShapeSpec, LineShapeSpec, PolygonShapeSpec, PathShapeSpec,\n} from '../types';\n\n/**\n * The keys a layer of each kind may have, for `lintKeys`. They are tables of names, so each one is checked against its type twice, by\n * the compiler: `satisfies` rejects a name the type does not have, and `Covers` fails the build when the type has a key the table lacks\n * (add a key to a spec type and `tsc` tells you to add it here, so the warning never calls a real key unknown).\n */\ntype KeysOfUnion<T> = T extends unknown ? keyof T : never;\ntype Covers<T, K extends readonly string[]> = [Exclude<KeysOfUnion<T>, K[number]>] extends [never] ? true : { missing: Exclude<KeysOfUnion<T>, K[number]> };\ntype Assert<T extends true> = T;\n\nconst COMMON = ['type', 'name', 'parent', 'at', 'duration', 'initial', 'keyframes', 'filters', 'filterArea', 'mask', 'blendMode', 'threeD', 'hideBehindCamera', 'lit', 'castsShadows'] as const satisfies readonly KeysOfUnion<SequenceCommon | { type: string }>[];\n\nconst VIDEO = [...COMMON, 'asset', 'loop', 'audio', 'volume', 'speed'] as const satisfies readonly KeysOfUnion<VideoSequenceSpec>[];\nconst IMAGE = [...COMMON, 'asset', 'colorSpace'] as const satisfies readonly KeysOfUnion<ImageSequenceSpec>[];\nconst TEXT = [...COMMON, 'text', 'spans', 'format', 'style', 'colorSpace', 'fillGradient'] as const satisfies readonly KeysOfUnion<TextSequenceSpec>[];\nconst AUDIO = [...COMMON, 'volume', 'asset', 'loop', 'sfx', 'music', 'speed'] as const satisfies readonly KeysOfUnion<AudioAssetSpec | AudioSfxSpec | AudioMusicSpec>[];\nconst COMPOSITION = [...COMMON, 'width', 'height', 'sequences', 'transitions', 'speed'] as const satisfies readonly KeysOfUnion<CompositionSequenceSpec>[];\nconst CAMERA = [...COMMON] as const satisfies readonly KeysOfUnion<CameraSequenceSpec>[];\nconst LIGHT = [...COMMON, 'kind', 'falloff'] as const satisfies readonly KeysOfUnion<LightSequenceSpec>[];\nconst SHADER = [...COMMON, 'fragment', 'uniforms', 'width', 'height', 'resolution', 'transparent'] as const satisfies readonly KeysOfUnion<ShaderSequenceSpec>[];\nconst NULL = [...COMMON] as const satisfies readonly KeysOfUnion<NullSequenceSpec>[];\n\nconst SHAPE = [...COMMON, 'shape', 'fillGradient', 'colorSpace', 'strokeCap', 'strokeJoin'] as const;\nconst TRIM = ['trimStart', 'trimEnd', 'trimEach'] as const;\nconst RECT = [...SHAPE, ...TRIM, 'width', 'height', 'cornerRadius', 'anchorX', 'anchorY'] as const satisfies readonly KeysOfUnion<RectShapeSpec>[];\nconst CIRCLE = [...SHAPE, ...TRIM, 'radius', 'anchorX', 'anchorY'] as const satisfies readonly KeysOfUnion<CircleShapeSpec>[];\nconst ELLIPSE = [...SHAPE, ...TRIM, 'radiusX', 'radiusY', 'anchorX', 'anchorY'] as const satisfies readonly KeysOfUnion<EllipseShapeSpec>[];\nconst ARC = [...SHAPE, 'radius', 'innerRadius', 'startAngle', 'endAngle'] as const satisfies readonly KeysOfUnion<ArcShapeSpec>[];\nconst LINE = [...SHAPE, ...TRIM, 'from', 'to'] as const satisfies readonly KeysOfUnion<LineShapeSpec>[];\nconst POLYGON = [...SHAPE, ...TRIM, 'points', 'open'] as const satisfies readonly KeysOfUnion<PolygonShapeSpec>[];\nconst PATH = [...SHAPE, ...TRIM, 'd', 'morphTo', 'morph', 'morphPoints'] as const satisfies readonly KeysOfUnion<PathShapeSpec>[];\n\n/** The compiler checks every table covers its type (this type is never used: it exists to fail the build). */\nexport type __Covered = [\n Assert<Covers<VideoSequenceSpec, typeof VIDEO>>, Assert<Covers<ImageSequenceSpec, typeof IMAGE>>, Assert<Covers<TextSequenceSpec, typeof TEXT>>,\n Assert<Covers<AudioAssetSpec | AudioSfxSpec | AudioMusicSpec, typeof AUDIO>>, Assert<Covers<CompositionSequenceSpec, typeof COMPOSITION>>,\n Assert<Covers<CameraSequenceSpec, typeof CAMERA>>, Assert<Covers<LightSequenceSpec, typeof LIGHT>>, Assert<Covers<ShaderSequenceSpec, typeof SHADER>>, Assert<Covers<NullSequenceSpec, typeof NULL>>,\n Assert<Covers<RectShapeSpec, typeof RECT>>, Assert<Covers<CircleShapeSpec, typeof CIRCLE>>, Assert<Covers<EllipseShapeSpec, typeof ELLIPSE>>,\n Assert<Covers<ArcShapeSpec, typeof ARC>>, Assert<Covers<LineShapeSpec, typeof LINE>>, Assert<Covers<PolygonShapeSpec, typeof POLYGON>>,\n Assert<Covers<PathShapeSpec, typeof PATH>>,\n];\n\nconst SHAPES: Record<string, readonly string[]> = { rect: RECT, circle: CIRCLE, ellipse: ELLIPSE, arc: ARC, line: LINE, polygon: POLYGON, path: PATH };\nconst BY_TYPE: Record<string, readonly string[]> = { video: VIDEO, image: IMAGE, text: TEXT, audio: AUDIO, composition: COMPOSITION, camera: CAMERA, light: LIGHT, shader: SHADER, null: NULL };\n\n/** The keys that shape what is drawn: a layer that is never drawn (audio, a camera, a light) accepts them in its type but they do nothing there. */\nconst PICTURE_KEYS = ['filters', 'filterArea', 'mask', 'blendMode', 'threeD', 'hideBehindCamera', 'lit', 'castsShadows'] as const;\nconst NOT_DRAWN: Record<string, string> = {\n audio: 'an audio layer: it is not drawn (it plays)',\n camera: 'a camera layer: it is not drawn, it frames the picture (its place and lens go in `initial` / `keyframes`: x y z lookAtX … fov)',\n light: 'a light layer: it is not drawn, it lights `threeD` layers (its numbers go in `initial` / `keyframes`: intensity color …)',\n};\n\n/** For a layer that is never drawn: the picture keys it carries, each with what the layer is (the keys do nothing there). A light keeps `castsShadows`, its own switch. */\nexport function pictureKeysIgnored(spec: { type: string } & Record<string, unknown>): Array<{ key: string; why: string }> {\n const why = NOT_DRAWN[spec.type];\n if (!why) return [];\n return PICTURE_KEYS.filter(k => spec[k] !== undefined && !(spec.type === 'light' && k === 'castsShadows')).map(key => ({ key, why }));\n}\n\n/** What a layer may be called, for the message: `text layer`, `rect shape`. */\nexport function kindName(spec: { type: string; shape?: string }): string {\n return spec.type === 'shape' && spec.shape ? `${spec.shape} shape` : `${spec.type} layer`;\n}\n\n/** The keys a layer may have, or null for a kind this library does not know (a `three` layer: registered elsewhere, so not checked). */\nexport function layerKeys(spec: { type: string; shape?: string }): readonly string[] | null {\n if (spec.type === 'shape') return (spec.shape && SHAPES[spec.shape]) || null;\n return BY_TYPE[spec.type] ?? null;\n}\n\n/** Which kinds have `key` (for \"it belongs to a circle shape\"). */\nexport function kindsWithKey(key: string): string[] {\n const out: string[] = [];\n for (const [shape, keys] of Object.entries(SHAPES)) if (keys.includes(key)) out.push(`${shape} shape`);\n for (const [type, keys] of Object.entries(BY_TYPE)) if (keys.includes(key)) out.push(`${type} layer`);\n return out;\n}\n\n/** Names a keyframe or `initial` may animate. Dotted paths (`filters.g.amount`, `three.box.x`) belong to their routers and are not looked up here. */\nexport const PROP_KEYS: ReadonlySet<string> = new Set([\n // transform and look\n 'x', 'y', 'z', 'alpha', 'rotation', 'rotationX', 'rotationY', 'width', 'height', 'visible', 'autoAlpha',\n 'scale', 'scaleX', 'scaleY', 'anchor', 'anchorX', 'anchorY', 'pivot', 'pivotX', 'pivotY', 'skew', 'skewX', 'skewY',\n 'position', 'positionX', 'positionY', 'tilePosition', 'tilePositionX', 'tilePositionY', 'tileScale', 'tileScaleX', 'tileScaleY', 'tint',\n // shapes\n 'fillColor', 'fillAlpha', 'strokeColor', 'strokeAlpha', 'strokeWidth', 'cornerRadius', 'radius', 'radiusX', 'radiusY',\n 'innerRadius', 'startAngle', 'endAngle', 'trimStart', 'trimEnd', 'trimEach', 'morph', 'fillGradient', 'strokeCap', 'strokeJoin',\n // text, audio, video\n 'fill', 'value', 'visibleChars', 'text', 'volume', 'time',\n // camera\n 'lookAtX', 'lookAtY', 'lookAtZ', 'fov', 'focus', 'aperture', 'offsetX', 'offsetY', 'offsetZ', 'lookOffsetX', 'lookOffsetY', 'lookOffsetZ',\n // light + fog\n 'intensity', 'color', 'coneAngle', 'coneFeather', 'falloffDistance', 'shadowDarkness', 'shadowDiffusion', 'fogNear', 'fogFar', 'fogColor', 'fogAmount',\n]);\n\n/** The text `style` keys (PixiJS TextStyle) that this library passes on. */\nexport const STYLE_KEYS: readonly string[] = [\n 'fontSize', 'fontFamily', 'fontWeight', 'fontStyle', 'fontVariant', 'fill', 'stroke', 'dropShadow', 'letterSpacing', 'lineHeight', 'leading',\n 'align', 'wordWrap', 'wordWrapWidth', 'breakWords', 'whiteSpace', 'padding', 'textBaseline', 'trim', 'lineJoin', 'miterLimit', 'filters', 'tagStyles',\n];\n\nexport type { SequenceSpec };\n","import type { SequenceSpec } from '../types';\nimport { collectPropKeys } from '../space/specKeys';\nimport { suggestName } from './options';\nimport { layerKeys, kindName, kindsWithKey, pictureKeysIgnored, PROP_KEYS, STYLE_KEYS } from './layerKeys';\n\ntype Warn = (message: string, kind?: 'late-keyframe') => void;\nconst defaultWarn: Warn = m => console.warn(m);\n\n/** \"layer \"name\"\" or \"unnamed text layer\" — how warnings refer to a sequence. */\nexport function describeLayer(spec: { name?: string; type: string }): string {\n return spec.name ? `layer \"${spec.name}\"` : `unnamed ${spec.type} layer`;\n}\n\n/**\n * Timing mistakes that otherwise fail silently: a layer that starts after its\n * composition has ended, or a keyframe that starts after its own layer has\n * ended (the usual cause: writing keyframe `at` in composition time instead of\n * time since the start of the layer).\n */\nexport function lintTiming(spec: SequenceSpec, parentDuration: number, warn: Warn = defaultWarn): void {\n const who = describeLayer(spec);\n const at = spec.at ?? 0;\n if (at >= parentDuration) {\n warn(`pixi-effects: ${who} starts at ${at}s, after its composition ends (${parentDuration}s), so it is never visible`);\n }\n // An sfx or a piece of music without a duration is as long as its sound, which only the audio layer knows (it checks its own keyframes).\n if (spec.type === 'audio' && ((spec as { sfx?: unknown }).sfx !== undefined || (spec as { music?: unknown }).music !== undefined) && spec.duration === undefined) return;\n if (at >= parentDuration) return; // never visible: said above, and its keyframes say nothing more\n const lives = spec.duration ?? Math.max(0, parentDuration - at); // without a duration a layer lives until its composition ends\n const ms = (x: number) => Math.round(x * 1000) / 1000;\n (spec.keyframes ?? []).forEach((kf, i) => {\n const kat = kf.at ?? 0;\n if (kat >= lives) {\n warn(\n `pixi-effects: ${who}: keyframes[${i}] starts at ${kat}s, after the layer ends (duration ${ms(lives)}s), so it never plays. ` +\n `Keyframe \\`at\\` is measured from the start of this layer, not from the start of the composition.`,\n 'late-keyframe',\n );\n return;\n }\n // Starts in time but is cut off by the layer's end: a FADE (to alpha 0 or 1, or from 0 / 1) that never finishes (a trial: a fade-out that stopped half way, a 1.2 s fade-in on a 0.6 s layer).\n // Not a drift, a fall, a zoom or a decaying glow (to 0.22) that is still going when its layer ends: those are common and on purpose. A `set` is instant, a repeating tween\n // (a blink) and a spring ('auto') are meant to run over, and a cut of under 0.2 s (a few frames: the last keyframe of a generated loop) is nothing.\n const length = kf.duration;\n // a fade ends (almost) opaque or (almost) clear: `to` alpha, or, when only `from` names alpha, the value it fades from (a fade-in `from: { alpha: 0 }` ends where it was)\n const toAlpha = (kf.to as Record<string, unknown> | undefined)?.alpha;\n const fromAlpha = (kf.from as Record<string, unknown> | undefined)?.alpha;\n const nearEnd = (v: unknown) => typeof v === 'number' && (v <= 0.1 || v >= 0.9);\n const fade = toAlpha !== undefined ? nearEnd(toAlpha) : nearEnd(fromAlpha);\n if (fade && typeof length === 'number' && length > 0 && !kf.repeat) {\n const start = kat < 0 ? lives + kat : kat; // a negative `at` counts back from the end of the layer\n const cut = (start + length - lives) / length;\n if (start >= 0 && cut > 0.25 && cut * length >= 0.2) {\n warn(\n `pixi-effects: ${who}: keyframes[${i}] runs from ${ms(start)}s to ${ms(start + length)}s but the layer ends at ${ms(lives)}s, so the last ${Math.round(cut * 100)}% of it never plays ` +\n `(a fade stops half way). Keyframe \\`at\\` is measured from the start of this layer: start it earlier, make it shorter, or make the layer longer.`,\n 'late-keyframe',\n );\n }\n }\n });\n}\n\n/**\n * A loop that builds a hundred layers makes the same mistake a hundred times. Print the first few in full and\n * say how many more there are: the rest are the same loop.\n */\nexport function summarizeWarnings(messages: string[], shown = 3): string[] {\n if (messages.length <= shown) return messages;\n return [...messages.slice(0, shown), `pixi-effects: ${messages.length - shown} more layers with the same problem (the same loop or helper is probably building them): fix the ones above and these go away.`];\n}\n\n/** A text layer that animates `value` but has nowhere to print it. */\nexport function lintText(spec: SequenceSpec, warn: Warn = defaultWarn): void {\n if (spec.type !== 'text') return;\n // Every string the layer ever shows: its `text` and any `set: { text }` swap.\n const strings = [spec.text ?? '', ...(spec.keyframes ?? []).map(kf => String((kf.set as Record<string, unknown> | undefined)?.text ?? ''))];\n const hasPlaceholder = strings.some(t => t.includes('{value}'));\n if (hasPlaceholder && !collectPropKeys(spec).has('value')) {\n warn(`pixi-effects: ${describeLayer(spec)}: the text has a {value} placeholder but nothing sets or animates \\`value\\`, so it prints 0. Set initial: { value: … } or animate it; {value} is reserved for counters (there is no way to print a literal \"{value}\").`);\n }\n if (collectPropKeys(spec).has('value') && !hasPlaceholder) {\n warn(`pixi-effects: ${describeLayer(spec)}: \\`value\\` is set or animated but the text has no {value} placeholder, so nothing shows it. Use text: '{value}' (or e.g. '{value} users').`);\n }\n}\n\nconst REMAPPABLE = new Set(['video', 'audio', 'composition']);\n/** Top-level names that mean a time remap and have their own message. */\nconst REMAP_NAMES = new Set(['time', 'timeRemap', 'reverse']);\nconst TIME_BAGS = ['set', 'to', 'from'] as const;\n\n/** The mistakes a time remap can make (`speed` / `time`), said once when the layer is built. Called from `lintKeys`. */\nfunction lintRemap(spec: SequenceSpec, warn: Warn): void {\n const s = spec as unknown as Record<string, any>;\n const who = describeLayer(spec);\n const kfs: Array<Record<string, any>> = s.keyframes ?? [];\n const bags: Array<Record<string, any> | undefined> = [s.initial, ...kfs.flatMap(kf => TIME_BAGS.map(b => kf[b]))];\n const timeInInitial = !!s.initial && s.initial.time !== undefined;\n const timeInKeyframes = kfs.some(kf => TIME_BAGS.some(b => kf[b] && kf[b].time !== undefined));\n const timed = timeInInitial || timeInKeyframes;\n if (bags.some(bag => bag && bag.speed !== undefined)) {\n warn(`pixi-effects: ${who}: speed is a fixed setting, not an animatable property: write it on the layer (speed: 2); to change the speed over time, animate time (keyframes: [{ at: 0, from: { time: 0 }, to: { time: 4 }, duration: 2, ease: 'power2.in' }])`);\n }\n if (!REMAPPABLE.has(spec.type)) {\n if (timed) warn(`pixi-effects: ${who}: \"time\" only works on video, audio and composition layers; put this layer in a composition and remap that (it is ignored here)`);\n return; // a top-level speed here is the key warning's business (\"not a ... key\")\n }\n if (s.reverse !== undefined) warn(`pixi-effects: ${who}: \"reverse\" is not a key: write speed: -1 to play backward`);\n if (s.timeRemap !== undefined) warn(`pixi-effects: ${who}: \"timeRemap\" is not a key: animate time in keyframes (from / to / set), or write speed`);\n if (s.time !== undefined) warn(`pixi-effects: ${who}: \"time\" belongs in initial or keyframes (initial: { time: 2 }), not on the layer`);\n if (spec.type === 'audio' && (s.sfx !== undefined || s.music !== undefined) && (s.speed !== undefined || timed)) {\n warn(`pixi-effects: ${who}: speed and time do not apply to a synthesised sound (sfx, music); change an sfx's pitch with pitch (semitones), or put it in a composition and remap that`);\n return;\n }\n if (s.speed !== undefined && (typeof s.speed !== 'number' || !Number.isFinite(s.speed) || s.speed === 0)) {\n warn(`pixi-effects: ${who}: speed ${JSON.stringify(s.speed)} cannot be used: write a number other than 0 (negative plays backward); to hold a moment, key time to the same value twice`);\n }\n if (s.speed !== undefined && timeInKeyframes) {\n warn(`pixi-effects: ${who}: speed and keyframed time are both set; time wins and speed is ignored. Use one of them`);\n }\n if (timeInInitial && typeof s.initial.time !== 'number') {\n warn(`pixi-effects: ${who}: initial.time must be a number of seconds, got ${JSON.stringify(s.initial.time)}`);\n }\n kfs.forEach((kf, i) => {\n for (const b of TIME_BAGS) {\n const v = kf[b]?.time;\n if (v !== undefined && typeof v !== 'number' && typeof v !== 'string') warn(`pixi-effects: ${who}: keyframes[${i}].${b}.time must be a number of seconds, got ${JSON.stringify(v)}`);\n }\n });\n}\n\n/**\n * Keys that do not exist, which the library used to ignore without a word (a typo in a layer key, a mistyped property in a keyframe, a\n * style key Pixi does not know). Said once each, with what was probably meant. A warning, never an error. Not checked here: dotted\n * paths (`filters.g.amount`, `three.box.x`: their routers say what is wrong), the names `fillGradient` says itself (`gradientAngle`),\n * and a kind of layer registered elsewhere (`three`).\n */\n/** Keys the library used to have: the sentence says what to write now. */\nconst REMOVED_KEYS: Record<string, string> = {\n maskInverted: 'a hole instead of a crop is `mask: { layer: <the mask layer>, invert: true }`',\n};\n\n/** Where a layer is and how it is turned: always `initial` or a keyframe, even for a kind of layer that has such a name as a key of another meaning (`anchorX` on a shape). */\nconst TRANSFORM_KEYS = new Set(['x', 'y', 'z', 'alpha', 'rotation', 'rotationX', 'rotationY', 'scale', 'scaleX', 'scaleY', 'anchor', 'anchorX', 'anchorY',\n 'pivot', 'pivotX', 'pivotY', 'skew', 'skewX', 'skewY', 'position', 'positionX', 'positionY', 'tint', 'visible', 'autoAlpha']);\n\nexport function lintKeys(spec: SequenceSpec, warn: Warn = defaultWarn): void {\n const who = describeLayer(spec);\n const valid = layerKeys(spec as { type: string; shape?: string });\n if (valid) {\n for (const key of Object.keys(spec)) {\n if (valid.includes(key) || (spec as unknown as Record<string, unknown>)[key] === undefined) continue; // a spread that sets a key only when it applies leaves `undefined`\n if (REMAPPABLE.has(spec.type) && REMAP_NAMES.has(key)) continue; // lintRemap has its own message for these\n if (REMOVED_KEYS[key]) { warn(`pixi-effects: ${who}: \"${key}\" is not a ${kindName(spec as { type: string; shape?: string })} key: ${REMOVED_KEYS[key]}`); continue; }\n // `z`, `x`, `alpha`, `rotationX` … are properties of the picture: they go in `initial` (or a keyframe), not on the layer. Say that, not a guess at another key.\n if (TRANSFORM_KEYS.has(key) || (PROP_KEYS.has(key) && kindsWithKey(key).length === 0)) { // (a key some other kind of layer owns, `radius` on a rect, keeps its \"it belongs to\" sentence below)\n const v = (spec as unknown as Record<string, unknown>)[key];\n const shown = typeof v === 'number' || (typeof v === 'string' && v.length <= 24) ? JSON.stringify(v) : '…';\n warn(`pixi-effects: ${who}: \"${key}\" is a property, not a ${kindName(spec as { type: string; shape?: string })} key, so it is ignored: write it in initial (initial: { ${key}: ${shown} }) or in a keyframe`);\n continue;\n }\n const guess = suggestName(key, valid.filter(k => k !== 'type'));\n const owners = kindsWithKey(key);\n const belongs = owners.length ? ` (it belongs to ${owners.slice(0, 3).join(', ')})` : '';\n const hint = guess ? ` — did you mean \"${guess}\"?${belongs}` : belongs;\n warn(`pixi-effects: ${who}: \"${key}\" is not a ${kindName(spec as { type: string; shape?: string })} key${hint}. Valid keys: ${valid.join(', ')}`);\n }\n }\n for (const { key, why } of pictureKeysIgnored(spec as unknown as { type: string } & Record<string, unknown>)) warn(`pixi-effects: ${who}: \"${key}\" does nothing on ${why}`);\n lintRemap(spec, warn);\n const said = new Set<string>();\n const bags: Array<Record<string, unknown> | undefined> = [spec.initial, ...(spec.keyframes ?? []).flatMap(kf => [kf.set, kf.to, kf.from])] as Array<Record<string, unknown> | undefined>;\n for (const bag of bags) {\n for (const key of Object.keys(bag ?? {})) {\n if (bag![key] === undefined) continue;\n if (PROP_KEYS.has(key) || key.includes('.') || /^gradient/i.test(key) || said.has(key) || key === 'speed') continue; // (speed: lintRemap says what to write)\n said.add(key);\n const guess = suggestName(key, [...PROP_KEYS]);\n warn(`pixi-effects: ${who}: \"${key}\" is not an animatable property${guess ? ` — did you mean \"${guess}\"?` : ''} (in initial, set, to or from). See the cheatsheet for the properties of this kind of layer`);\n }\n }\n if (spec.type === 'text' && spec.style && typeof spec.style === 'object') {\n for (const key of Object.keys(spec.style)) {\n if (STYLE_KEYS.includes(key) || (spec.style as Record<string, unknown>)[key] === undefined) continue;\n const guess = suggestName(key, STYLE_KEYS);\n warn(`pixi-effects: ${who}: style.${key} is not a text style key${guess ? ` — did you mean \"${guess}\"?` : ''} (it is ignored). Keys: ${STYLE_KEYS.join(', ')}`);\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkGL2AQFLQ_cjs = require('./chunk-GL2AQFLQ.cjs');
|
|
4
4
|
var chunkTWZNOUM7_cjs = require('./chunk-TWZNOUM7.cjs');
|
|
5
5
|
var PIXI = require('pixi.js');
|
|
6
6
|
|
|
@@ -2291,7 +2291,23 @@ function colorGradientParams(params) {
|
|
|
2291
2291
|
if (i < 0) throw new Error(`pixi-effects: colorGradient gradientType "${gradientType}" is not one of linear, radial or conic`);
|
|
2292
2292
|
return { ...rest, type: i };
|
|
2293
2293
|
}
|
|
2294
|
+
function lintBulgeCenter(params) {
|
|
2295
|
+
const c = params.center;
|
|
2296
|
+
if (!c || typeof c !== "object") return;
|
|
2297
|
+
const xy2 = Array.isArray(c) ? [c[0], c[1]] : [c.x, c.y];
|
|
2298
|
+
if (!xy2.some((v) => typeof v === "number" && Math.abs(v) > 3)) return;
|
|
2299
|
+
console.warn(`pixi-effects: bulgePinch.center is 0-1 of the layer ({ x: 0.5, y: 0.5 } is its middle), but ${JSON.stringify(c)} reads as pixels: the bulge lands outside the layer and nothing shows. Write the point as a fraction (x / the layer's width), or animate center.x / center.y between 0 and 1.`);
|
|
2300
|
+
}
|
|
2301
|
+
function fixRadialBlurGpu(f) {
|
|
2302
|
+
const holder = f;
|
|
2303
|
+
const gp = holder.gpuProgram;
|
|
2304
|
+
const GpuProgram5 = PIXI__namespace.GpuProgram;
|
|
2305
|
+
if (!gp || !GpuProgram5 || !/uKernelSize\s*:\s*f32/.test(gp.fragment.source)) return f;
|
|
2306
|
+
holder.gpuProgram = GpuProgram5.from({ name: gp.name, vertex: gp.vertex, fragment: { ...gp.fragment, source: gp.fragment.source.replace(/uKernelSize(\s*):\s*f32/, "uKernelSize$1: i32") } });
|
|
2307
|
+
return f;
|
|
2308
|
+
}
|
|
2294
2309
|
function createNamedFilter(type, params) {
|
|
2310
|
+
if (lower(type) === "bulgepinch") lintBulgeCenter(params);
|
|
2295
2311
|
if (lower(type) === "colormatrix") return colorMatrix(params);
|
|
2296
2312
|
if (lower(type) === "grain") return new GrainFilter(params);
|
|
2297
2313
|
if (lower(type) === "warp") return new WarpFilter(params);
|
|
@@ -2302,7 +2318,8 @@ function createNamedFilter(type, params) {
|
|
|
2302
2318
|
if (!Ctor) throw MISSING(type, library ? "not found in the loaded package" : "not loaded yet");
|
|
2303
2319
|
const single = SINGLE_VALUE[Object.keys(SINGLE_VALUE).find((k) => lower(k) === lower(type)) ?? ""];
|
|
2304
2320
|
if (single) return new Ctor(params[single]);
|
|
2305
|
-
|
|
2321
|
+
const made = new Ctor(lower(type) === "colorgradient" ? colorGradientParams(params) : params);
|
|
2322
|
+
return lower(type) === "radialblur" ? fixRadialBlurGpu(made) : made;
|
|
2306
2323
|
}
|
|
2307
2324
|
|
|
2308
2325
|
// src/filters/index.ts
|
|
@@ -2920,7 +2937,7 @@ var TextSequence = class extends Sequence {
|
|
|
2920
2937
|
{ skipKeys: STYLE_OPAQUE_KEYS }
|
|
2921
2938
|
);
|
|
2922
2939
|
const unset = Object.keys(resolved).filter((k) => resolved[k] === void 0);
|
|
2923
|
-
if (unset.length) console.warn(`pixi-effects: ${
|
|
2940
|
+
if (unset.length) console.warn(`pixi-effects: ${chunkGL2AQFLQ_cjs.describeLayer(this.spec)}: ${unset.map((k) => `style.${k}`).join(", ")} ${unset.length > 1 ? "are" : "is"} undefined (a variable that was never set?), so ${unset.length > 1 ? "they are" : "it is"} ignored and the default is used: omit the key instead`);
|
|
2924
2941
|
const outline = resolved.stroke;
|
|
2925
2942
|
if (outline && typeof outline === "object" && !("join" in outline) && !("lineJoin" in outline)) resolved.stroke = { ...outline, join: "round" };
|
|
2926
2943
|
for (const k of Object.keys(resolved)) {
|
|
@@ -2930,7 +2947,7 @@ var TextSequence = class extends Sequence {
|
|
|
2930
2947
|
this.intrinsicWidth = text.width;
|
|
2931
2948
|
this.intrinsicHeight = text.height;
|
|
2932
2949
|
}
|
|
2933
|
-
validateGradientKeyframes(this.spec,
|
|
2950
|
+
validateGradientKeyframes(this.spec, chunkGL2AQFLQ_cjs.describeLayer(this.spec), void 0, "text");
|
|
2934
2951
|
const gradientSpec = this.spec.fillGradient ?? initialProps.fillGradient;
|
|
2935
2952
|
if (gradientSpec) {
|
|
2936
2953
|
this._grad = { grad: gradStateFrom(gradientSpec) };
|
|
@@ -2966,7 +2983,7 @@ var TextSequence = class extends Sequence {
|
|
|
2966
2983
|
bindTextKeyframes(timeline, keyframes, this.duration, origin, () => this._template, (t) => {
|
|
2967
2984
|
this._template = t;
|
|
2968
2985
|
refresh();
|
|
2969
|
-
},
|
|
2986
|
+
}, chunkGL2AQFLQ_cjs.describeLayer(this.spec));
|
|
2970
2987
|
}
|
|
2971
2988
|
};
|
|
2972
2989
|
function runSuperWithStrippedSpec(inst, strippedSpec, timeline, offset) {
|
|
@@ -3416,7 +3433,7 @@ var CameraSequence = class extends Sequence {
|
|
|
3416
3433
|
carrier.fogColor = "#000000";
|
|
3417
3434
|
carrier.fogAmount = 1;
|
|
3418
3435
|
this.target = carrier;
|
|
3419
|
-
const keys =
|
|
3436
|
+
const keys = chunkGL2AQFLQ_cjs.collectPropKeys(this.spec);
|
|
3420
3437
|
this.autoZ = !keys.has("z");
|
|
3421
3438
|
this.dof = keys.has("focus") || keys.has("aperture");
|
|
3422
3439
|
this.fog = keys.has("fogNear") || keys.has("fogFar") || keys.has("fogColor") || keys.has("fogAmount");
|
|
@@ -3737,7 +3754,7 @@ function resolveSpansStyle(style, scope, who, warn = defaultWarn) {
|
|
|
3737
3754
|
var TEXT_ONLY = ["type", "spans", "text", "style", "format", "colorSpace", "fillGradient", "initial", "keyframes"];
|
|
3738
3755
|
var NOT_FOR_A_GROUP = ["fill", "text", "value", "fillGradient"];
|
|
3739
3756
|
function expandSpans(spec, warn = defaultWarn, scope) {
|
|
3740
|
-
const who =
|
|
3757
|
+
const who = chunkGL2AQFLQ_cjs.describeLayer(spec);
|
|
3741
3758
|
const s = spec;
|
|
3742
3759
|
if (s.text !== void 0) warn(`pixi-effects: ${who}: "text" is ignored when the layer has spans: write the text as spans`);
|
|
3743
3760
|
const style = resolveSpansStyle(s.style ?? {}, scope, who, warn);
|
|
@@ -3897,12 +3914,12 @@ var AudioSequence = class extends Sequence {
|
|
|
3897
3914
|
const playable = this._remap && this._remap.timeKfs.length > 0 ? Infinity : (data.duration ?? Infinity) / constant;
|
|
3898
3915
|
if (!spec.loop && Number.isFinite(playable) && this.duration > playable + 0.05) {
|
|
3899
3916
|
console.warn(
|
|
3900
|
-
`pixi-effects: ${
|
|
3917
|
+
`pixi-effects: ${chunkGL2AQFLQ_cjs.describeLayer(spec)}: audio asset "${spec.asset}" plays for ${playable.toFixed(1)}s (${data.duration.toFixed(1)}s at speed ${constant}) but the layer lasts ${this.duration.toFixed(1)}s, so it goes silent after ${playable.toFixed(1)}s. Add loop: true, or shorten the layer's duration.`
|
|
3901
3918
|
);
|
|
3902
3919
|
}
|
|
3903
3920
|
}
|
|
3904
3921
|
async _buildSfx(spec) {
|
|
3905
|
-
const who =
|
|
3922
|
+
const who = chunkGL2AQFLQ_cjs.describeLayer(spec);
|
|
3906
3923
|
const raw = spec;
|
|
3907
3924
|
if (raw.asset !== void 0) console.warn(`pixi-effects: ${who}: has both asset and sfx \u2014 the sfx plays; remove one`);
|
|
3908
3925
|
if (raw.loop) console.warn(`pixi-effects: ${who}: loop has no effect on an sfx \u2014 to repeat it, add one audio layer per hit (a JS loop)`);
|
|
@@ -3921,7 +3938,7 @@ var AudioSequence = class extends Sequence {
|
|
|
3921
3938
|
});
|
|
3922
3939
|
}
|
|
3923
3940
|
async _buildMusic(spec) {
|
|
3924
|
-
const who =
|
|
3941
|
+
const who = chunkGL2AQFLQ_cjs.describeLayer(spec);
|
|
3925
3942
|
const raw = spec;
|
|
3926
3943
|
if (raw.asset !== void 0) console.warn(`pixi-effects: ${who}: has both asset and music \u2014 the music plays; remove one`);
|
|
3927
3944
|
if (raw.sfx !== void 0) console.warn(`pixi-effects: ${who}: has both sfx and music \u2014 the music plays; remove one`);
|
|
@@ -3956,7 +3973,7 @@ var AudioSequence = class extends Sequence {
|
|
|
3956
3973
|
out.push({
|
|
3957
3974
|
...sourceMap ? { sourceMap } : {},
|
|
3958
3975
|
...this._audioBuffer ? { buffer: this._audioBuffer } : { synth: this._synth },
|
|
3959
|
-
layer:
|
|
3976
|
+
layer: chunkGL2AQFLQ_cjs.describeLayer(this.spec),
|
|
3960
3977
|
source: this._source,
|
|
3961
3978
|
...this._music ? { music: this._music } : {},
|
|
3962
3979
|
loop: !this._synth && !!this.spec.loop,
|
|
@@ -4498,7 +4515,7 @@ var VideoSequence = class extends Sequence {
|
|
|
4498
4515
|
out.push({
|
|
4499
4516
|
...sourceMap ? { sourceMap } : {},
|
|
4500
4517
|
buffer: this._audioBuffer,
|
|
4501
|
-
layer:
|
|
4518
|
+
layer: chunkGL2AQFLQ_cjs.describeLayer(this.spec),
|
|
4502
4519
|
source: `video "${this.spec.asset}"`,
|
|
4503
4520
|
loop: !!this.spec.loop,
|
|
4504
4521
|
start: baseTime + this.at,
|
|
@@ -4766,20 +4783,20 @@ var ShapeSequence = class extends Sequence {
|
|
|
4766
4783
|
for (const k of geomKeys) this._liveKeys.add(k);
|
|
4767
4784
|
seedGeometry(this._state, this.spec, scope);
|
|
4768
4785
|
seedStyle(this._state, this.spec.initial ?? {}, scope);
|
|
4769
|
-
seedStrokeStyle(this._state, this.spec, this.spec.initial ?? {},
|
|
4786
|
+
seedStrokeStyle(this._state, this.spec, this.spec.initial ?? {}, chunkGL2AQFLQ_cjs.describeLayer(this.spec));
|
|
4770
4787
|
if (this.spec.shape === "arc") {
|
|
4771
4788
|
this._state.startAngle ??= 0;
|
|
4772
4789
|
this._state.endAngle ??= 360;
|
|
4773
4790
|
const top = this.spec, ini = this.spec.initial ?? {};
|
|
4774
4791
|
if ("trimStart" in top || "trimEnd" in top || "trimStart" in ini || "trimEnd" in ini) {
|
|
4775
|
-
console.warn(`pixi-effects: ${
|
|
4792
|
+
console.warn(`pixi-effects: ${chunkGL2AQFLQ_cjs.describeLayer(this.spec)}: trimStart / trimEnd do not apply to an arc: animate its endAngle (and startAngle) instead`);
|
|
4776
4793
|
}
|
|
4777
4794
|
} else {
|
|
4778
4795
|
this._state.trimStart ??= 0;
|
|
4779
4796
|
this._state.trimEnd ??= 1;
|
|
4780
4797
|
}
|
|
4781
4798
|
const gradientSpec = this.spec.fillGradient ?? this.spec.initial?.fillGradient;
|
|
4782
|
-
validateGradientKeyframes(this.spec,
|
|
4799
|
+
validateGradientKeyframes(this.spec, chunkGL2AQFLQ_cjs.describeLayer(this.spec));
|
|
4783
4800
|
if (gradientSpec) {
|
|
4784
4801
|
if (hasGradientKeys(this.spec.keyframes)) {
|
|
4785
4802
|
this._grad = { grad: gradStateFrom(gradientSpec) };
|
|
@@ -4821,9 +4838,9 @@ var ShapeSequence = class extends Sequence {
|
|
|
4821
4838
|
}
|
|
4822
4839
|
/** The prepared morph between `d` and `morphTo`, or null (and a warning when the spec asked for one that cannot work). */
|
|
4823
4840
|
_setupMorph() {
|
|
4824
|
-
const who =
|
|
4841
|
+
const who = chunkGL2AQFLQ_cjs.describeLayer(this.spec);
|
|
4825
4842
|
const top = this.spec;
|
|
4826
|
-
const wanted = this.spec.shape === "path" && (this._state.morph !== void 0 ||
|
|
4843
|
+
const wanted = this.spec.shape === "path" && (this._state.morph !== void 0 || chunkGL2AQFLQ_cjs.collectPropKeys(this.spec).has("morph"));
|
|
4827
4844
|
if (this.spec.shape !== "path") {
|
|
4828
4845
|
if ("morphTo" in top) console.warn(`pixi-effects: ${who}: morphTo only works on a path shape (shape: 'path'); ignored`);
|
|
4829
4846
|
return null;
|
|
@@ -5433,7 +5450,7 @@ var ShaderSequence = class extends Sequence {
|
|
|
5433
5450
|
}
|
|
5434
5451
|
async build() {
|
|
5435
5452
|
const spec = this.shaderSpec;
|
|
5436
|
-
const who =
|
|
5453
|
+
const who = chunkGL2AQFLQ_cjs.describeLayer(spec);
|
|
5437
5454
|
for (const m of shaderProblems(spec)) console.warn(`pixi-effects: ${who}: ${m}`);
|
|
5438
5455
|
if (this.duration === void 0) this.duration = this.parent?.duration ?? this.root.duration;
|
|
5439
5456
|
const scope = buildScope(this, this.parent, this.root);
|
|
@@ -5477,7 +5494,7 @@ var ShaderSequence = class extends Sequence {
|
|
|
5477
5494
|
const warn = (why) => {
|
|
5478
5495
|
if (this.warnedPaths.has(path)) return;
|
|
5479
5496
|
this.warnedPaths.add(path);
|
|
5480
|
-
console.warn(`pixi-effects: ${
|
|
5497
|
+
console.warn(`pixi-effects: ${chunkGL2AQFLQ_cjs.describeLayer(this.spec)}: keyframe path uniforms.${path} ${why}; skipped`);
|
|
5481
5498
|
};
|
|
5482
5499
|
if (slot === void 0) {
|
|
5483
5500
|
const guess = chunkTWZNOUM7_cjs.suggestName(name, Object.keys(this.carrier));
|
|
@@ -5512,7 +5529,7 @@ var ShaderSequence = class extends Sequence {
|
|
|
5512
5529
|
this.failed = true;
|
|
5513
5530
|
if (!this.warnedNoGl) {
|
|
5514
5531
|
this.warnedNoGl = true;
|
|
5515
|
-
console.warn(`pixi-effects: ${
|
|
5532
|
+
console.warn(`pixi-effects: ${chunkGL2AQFLQ_cjs.describeLayer(this.spec)}: this browser has no WebGL2, so the shader cannot run; the layer is drawn as a checkerboard`);
|
|
5516
5533
|
}
|
|
5517
5534
|
}
|
|
5518
5535
|
compile() {
|
|
@@ -5543,7 +5560,7 @@ var ShaderSequence = class extends Sequence {
|
|
|
5543
5560
|
gl.deleteProgram(p);
|
|
5544
5561
|
this.failed = true;
|
|
5545
5562
|
this.prog = null;
|
|
5546
|
-
console.warn(`pixi-effects: ${
|
|
5563
|
+
console.warn(`pixi-effects: ${chunkGL2AQFLQ_cjs.describeLayer(this.spec)}: the fragment shader did not compile (the line numbers are the lines of your code):
|
|
5547
5564
|
${glslErrors(log).join("\n")}
|
|
5548
5565
|
The layer is drawn as a checkerboard until it is fixed.`);
|
|
5549
5566
|
return;
|
|
@@ -5627,13 +5644,13 @@ function resolveDim(v, scope) {
|
|
|
5627
5644
|
var _CompositionSequence = null;
|
|
5628
5645
|
async function getCompositionSequence() {
|
|
5629
5646
|
if (!_CompositionSequence) {
|
|
5630
|
-
_CompositionSequence = (await import('./Composition-
|
|
5647
|
+
_CompositionSequence = (await import('./Composition-OLH7RC5Z.cjs')).CompositionSequence;
|
|
5631
5648
|
}
|
|
5632
5649
|
return _CompositionSequence;
|
|
5633
5650
|
}
|
|
5634
5651
|
var _SpansSequence = null;
|
|
5635
5652
|
async function getSpansSequence() {
|
|
5636
|
-
if (!_SpansSequence) _SpansSequence = (await import('./Spans-
|
|
5653
|
+
if (!_SpansSequence) _SpansSequence = (await import('./Spans-QRMN2EZO.cjs')).SpansSequence;
|
|
5637
5654
|
return _SpansSequence;
|
|
5638
5655
|
}
|
|
5639
5656
|
var staticTypes = {
|
|
@@ -5719,6 +5736,7 @@ exports.lightLevel = lightLevel;
|
|
|
5719
5736
|
exports.noise = noise;
|
|
5720
5737
|
exports.packLights = packLights;
|
|
5721
5738
|
exports.parseEase = parseEase;
|
|
5739
|
+
exports.parseSpring = parseSpring;
|
|
5722
5740
|
exports.projectLayer = projectLayer;
|
|
5723
5741
|
exports.projectPoint = projectPoint;
|
|
5724
5742
|
exports.rand = rand;
|
|
@@ -5728,6 +5746,7 @@ exports.remapOf = remapOf;
|
|
|
5728
5746
|
exports.resolveAt = resolveAt;
|
|
5729
5747
|
exports.resolveNumber = resolveNumber;
|
|
5730
5748
|
exports.spansMeta = spansMeta;
|
|
5749
|
+
exports.springDuration = springDuration;
|
|
5731
5750
|
exports.timeRemapOf = timeRemapOf;
|
|
5732
|
-
//# sourceMappingURL=chunk-
|
|
5733
|
-
//# sourceMappingURL=chunk-
|
|
5751
|
+
//# sourceMappingURL=chunk-LEECUCTG.cjs.map
|
|
5752
|
+
//# sourceMappingURL=chunk-LEECUCTG.cjs.map
|