@omnimedia/omnitool 1.1.0-76 → 1.1.0-78

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 (99) hide show
  1. package/README.md +52 -4
  2. package/package.json +2 -1
  3. package/s/driver/fns/schematic.ts +11 -2
  4. package/s/driver/parts/compositor.ts +46 -2
  5. package/s/driver/utils/find-pixi-filter.ts +24 -0
  6. package/s/timeline/index.ts +1 -1
  7. package/s/timeline/parts/filters.ts +453 -0
  8. package/s/timeline/parts/item.ts +17 -1
  9. package/s/timeline/renderers/parts/samplers/visual/parts/sample.ts +9 -3
  10. package/s/timeline/sugar/helpers.ts +35 -2
  11. package/s/timeline/sugar/o.ts +38 -1
  12. package/s/timeline/types.ts +2 -0
  13. package/x/WebGLRenderer-4CHIZDHY.js +2 -0
  14. package/x/WebGPURenderer-O6WXU2QR.js +2 -0
  15. package/x/browserAll-WNIOTNNP.js +2 -0
  16. package/x/{demo/chunk-USLRKDKD.js → chunk-23FOBGX6.js} +2 -2
  17. package/x/{chunk-A45M2HJC.js.map → chunk-23FOBGX6.js.map} +1 -1
  18. package/x/{chunk-MWCIWPRL.js → chunk-73XOWA4F.js} +3 -3
  19. package/x/{chunk-Q7JBQNE4.js → chunk-IAWJKNX5.js} +2 -2
  20. package/x/{demo/chunk-Q4MWBZHL.js → chunk-KCMVLWBS.js} +2 -2
  21. package/x/{chunk-4ONWQOPX.js.map → chunk-KCMVLWBS.js.map} +1 -1
  22. package/x/{chunk-D5CIWPNS.js → chunk-MR32SQ27.js} +2 -2
  23. package/x/{chunk-W5CN46AR.js → chunk-VCUJJYRJ.js} +3 -3
  24. package/x/{chunk-WFT3KTZG.js → chunk-XNIZ4L5W.js} +2 -2
  25. package/x/{chunk-OTQK6FAJ.js → chunk-ZLGNQFUI.js} +2 -2
  26. package/x/demo/WebGLRenderer-RSJAHIG2.js +2 -0
  27. package/x/demo/WebGPURenderer-MGFAJCYY.js +2 -0
  28. package/x/demo/browserAll-PTRBXBRP.js +2 -0
  29. package/x/demo/{chunk-P3PTHHFE.js → chunk-CUYOGHWU.js} +2 -2
  30. package/x/demo/{chunk-P3PTHHFE.js.map → chunk-CUYOGHWU.js.map} +1 -1
  31. package/x/demo/{chunk-IRDQEA6B.js → chunk-DGTDNJ7W.js} +2 -2
  32. package/x/demo/{chunk-T3METYEY.js → chunk-FZ5BYF63.js} +2 -2
  33. package/x/demo/{chunk-T3METYEY.js.map → chunk-FZ5BYF63.js.map} +1 -1
  34. package/x/demo/{chunk-PYG4RZZ2.js → chunk-KWN4NNES.js} +15 -15
  35. package/x/demo/{chunk-PYG4RZZ2.js.map → chunk-KWN4NNES.js.map} +1 -1
  36. package/x/{chunk-4ONWQOPX.js → demo/chunk-OJ3FPXW7.js} +2 -2
  37. package/x/demo/{chunk-Q4MWBZHL.js.map → chunk-OJ3FPXW7.js.map} +1 -1
  38. package/x/demo/{chunk-RWJ2UHV4.js → chunk-PSLUOGTZ.js} +3 -3
  39. package/x/demo/{chunk-RWJ2UHV4.js.map → chunk-PSLUOGTZ.js.map} +1 -1
  40. package/x/demo/{chunk-YISSXWBT.js → chunk-VLCVEIFU.js} +3 -3
  41. package/x/demo/{chunk-YISSXWBT.js.map → chunk-VLCVEIFU.js.map} +1 -1
  42. package/x/demo/chunk-ZWCPT5FR.js +2 -0
  43. package/x/demo/demo.bundle.min.js +4921 -11
  44. package/x/demo/demo.bundle.min.js.map +4 -4
  45. package/x/demo/webworkerAll-JENRT6BT.js +2 -0
  46. package/x/driver/fns/schematic.d.ts +10 -1
  47. package/x/driver/parts/compositor.js +32 -1
  48. package/x/driver/parts/compositor.js.map +1 -1
  49. package/x/driver/utils/find-pixi-filter.d.ts +5 -0
  50. package/x/driver/utils/find-pixi-filter.js +13 -0
  51. package/x/driver/utils/find-pixi-filter.js.map +1 -0
  52. package/x/index.html +2 -2
  53. package/x/tests.bundle.min.js +4926 -16
  54. package/x/tests.bundle.min.js.map +4 -4
  55. package/x/tests.html +1 -1
  56. package/x/timeline/index.d.ts +1 -0
  57. package/x/timeline/index.js +1 -0
  58. package/x/timeline/index.js.map +1 -1
  59. package/x/timeline/parts/filters.d.ts +108 -0
  60. package/x/timeline/parts/filters.js +340 -0
  61. package/x/timeline/parts/filters.js.map +1 -0
  62. package/x/timeline/parts/item.d.ts +16 -2
  63. package/x/timeline/parts/item.js +1 -0
  64. package/x/timeline/parts/item.js.map +1 -1
  65. package/x/timeline/parts/waveform/parts/collect.d.ts +1 -1
  66. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js +8 -2
  67. package/x/timeline/renderers/parts/samplers/visual/parts/sample.js.map +1 -1
  68. package/x/timeline/sugar/helpers.d.ts +11 -2
  69. package/x/timeline/sugar/helpers.js +15 -0
  70. package/x/timeline/sugar/helpers.js.map +1 -1
  71. package/x/timeline/sugar/o.d.ts +3 -1
  72. package/x/timeline/sugar/o.js +31 -0
  73. package/x/timeline/sugar/o.js.map +1 -1
  74. package/x/webworkerAll-RLCTMSDD.js +2 -0
  75. package/x/WebGLRenderer-7X274AYV.js +0 -2
  76. package/x/WebGPURenderer-XMCMEXAO.js +0 -2
  77. package/x/browserAll-LRGVU2GN.js +0 -2
  78. package/x/chunk-A45M2HJC.js +0 -2
  79. package/x/demo/WebGLRenderer-NLGJGAXK.js +0 -2
  80. package/x/demo/WebGPURenderer-RBOFXPL5.js +0 -2
  81. package/x/demo/browserAll-QEV2P3ED.js +0 -2
  82. package/x/demo/webworkerAll-ELLD4M57.js +0 -2
  83. package/x/webworkerAll-KR5SWEBU.js +0 -2
  84. /package/x/{WebGLRenderer-7X274AYV.js.map → WebGLRenderer-4CHIZDHY.js.map} +0 -0
  85. /package/x/{WebGPURenderer-XMCMEXAO.js.map → WebGPURenderer-O6WXU2QR.js.map} +0 -0
  86. /package/x/{browserAll-LRGVU2GN.js.map → browserAll-WNIOTNNP.js.map} +0 -0
  87. /package/x/{chunk-MWCIWPRL.js.map → chunk-73XOWA4F.js.map} +0 -0
  88. /package/x/{chunk-Q7JBQNE4.js.map → chunk-IAWJKNX5.js.map} +0 -0
  89. /package/x/{chunk-D5CIWPNS.js.map → chunk-MR32SQ27.js.map} +0 -0
  90. /package/x/{chunk-W5CN46AR.js.map → chunk-VCUJJYRJ.js.map} +0 -0
  91. /package/x/{chunk-WFT3KTZG.js.map → chunk-XNIZ4L5W.js.map} +0 -0
  92. /package/x/{chunk-OTQK6FAJ.js.map → chunk-ZLGNQFUI.js.map} +0 -0
  93. /package/x/demo/{WebGLRenderer-NLGJGAXK.js.map → WebGLRenderer-RSJAHIG2.js.map} +0 -0
  94. /package/x/demo/{WebGPURenderer-RBOFXPL5.js.map → WebGPURenderer-MGFAJCYY.js.map} +0 -0
  95. /package/x/demo/{browserAll-QEV2P3ED.js.map → browserAll-PTRBXBRP.js.map} +0 -0
  96. /package/x/demo/{chunk-IRDQEA6B.js.map → chunk-DGTDNJ7W.js.map} +0 -0
  97. /package/x/demo/{chunk-USLRKDKD.js.map → chunk-ZWCPT5FR.js.map} +0 -0
  98. /package/x/demo/{webworkerAll-ELLD4M57.js.map → webworkerAll-JENRT6BT.js.map} +0 -0
  99. /package/x/{webworkerAll-KR5SWEBU.js.map → webworkerAll-RLCTMSDD.js.map} +0 -0
@@ -0,0 +1,453 @@
1
+ import type {
2
+ AlphaFilterOptions,
3
+ BlurFilterOptions,
4
+ ColorMatrix,
5
+ FilterOptions as PixiFilterOptions,
6
+ NoiseFilterOptions,
7
+ Point,
8
+ } from "pixi.js"
9
+ import type * as PixiFilters from "pixi-filters"
10
+ import {FilterableItem, Item} from "./item.js"
11
+
12
+ export type PixelateFilterOptions = {size?: number | number[] | Point}
13
+ export type EmbossFilterOptions = {strength?: number}
14
+
15
+ export type ChoiceOptions = string[] | Record<string, string | number> | number[]
16
+
17
+ export type ChoiceFilterProperty = {
18
+ type: "choice"
19
+ options: ChoiceOptions
20
+ default: string | number
21
+ }
22
+
23
+ export type NumericFilterProperty = {
24
+ type: "number"
25
+ min: number
26
+ max: number
27
+ default: number
28
+ step?: number
29
+ }
30
+
31
+ export type ColorFilterProperty = {
32
+ type: "color"
33
+ default: string
34
+ }
35
+
36
+ export type BooleanFilterProperty = {
37
+ type: "boolean"
38
+ default: boolean
39
+ }
40
+
41
+ export type ObjectFilterProperty = {
42
+ type: "object"
43
+ properties: Record<string, FilterPropertyConfig>
44
+ }
45
+
46
+ export type ArrayFilterProperty = {
47
+ type: "array"
48
+ items: FilterPropertyConfig[]
49
+ }
50
+
51
+ export type FilterPropertyConfig =
52
+ | NumericFilterProperty
53
+ | ColorFilterProperty
54
+ | BooleanFilterProperty
55
+ | ChoiceFilterProperty
56
+ | ObjectFilterProperty
57
+ | ArrayFilterProperty
58
+
59
+ export interface FilterSchema {
60
+ [property: string]: FilterPropertyConfig
61
+ }
62
+
63
+ export type SchemaFromOptions<T> = {
64
+ [K in keyof Required<T>]?: FilterPropertyConfig
65
+ }
66
+
67
+ type FilterDefinition<TType extends string, TParams> = {
68
+ type: TType
69
+ schema: SchemaFromOptions<TParams>
70
+ _params?: TParams
71
+ }
72
+
73
+ const num =(
74
+ min: number,
75
+ max: number,
76
+ defaultValue: number,
77
+ step?: number,
78
+ ): NumericFilterProperty => ({
79
+ type: "number",
80
+ min,
81
+ max,
82
+ default: defaultValue,
83
+ ...(step === undefined ? {} : {step}),
84
+ })
85
+
86
+ const color =(defaultValue: string): ColorFilterProperty => ({
87
+ type: "color",
88
+ default: defaultValue,
89
+ })
90
+
91
+ const bool =(defaultValue: boolean): BooleanFilterProperty => ({
92
+ type: "boolean",
93
+ default: defaultValue,
94
+ })
95
+
96
+ const choice =(
97
+ options: ChoiceOptions,
98
+ defaultValue: string | number,
99
+ ): ChoiceFilterProperty => ({
100
+ type: "choice",
101
+ options,
102
+ default: defaultValue,
103
+ })
104
+
105
+ const object =(properties: Record<string, FilterPropertyConfig>): ObjectFilterProperty => ({
106
+ type: "object",
107
+ properties,
108
+ })
109
+
110
+ const array =(items: FilterPropertyConfig[]): ArrayFilterProperty => ({
111
+ type: "array",
112
+ items,
113
+ })
114
+
115
+ const kernelSizes = [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]
116
+ const glitchFillModes = {
117
+ TRANSPARENT: 0,
118
+ ORIGINAL: 1,
119
+ LOOP: 2,
120
+ CLAMP: 3,
121
+ MIRROR: 4,
122
+ } as const
123
+
124
+ const defineFilter = <TParams>() =>
125
+ <TType extends string>(
126
+ type: TType,
127
+ schema: SchemaFromOptions<TParams> = {},
128
+ ): FilterDefinition<TType, TParams> => ({type, schema})
129
+
130
+ export const filters = {
131
+ adjustment: defineFilter<PixiFilters.AdjustmentFilterOptions>()("AdjustmentFilter", {
132
+ gamma: num(0, 5, 1),
133
+ saturation: num(0, 5, 1),
134
+ contrast: num(0, 5, 1),
135
+ brightness: num(0, 5, 1),
136
+ red: num(0, 5, 1),
137
+ green: num(0, 5, 1),
138
+ blue: num(0, 5, 1),
139
+ alpha: num(0, 1, 1, 0.01),
140
+ }),
141
+ advancedBloom: defineFilter<PixiFilters.AdvancedBloomFilterOptions>()("AdvancedBloomFilter", {
142
+ threshold: num(0.1, 0.9, 0.5, 0.01),
143
+ bloomScale: num(0.5, 1.5, 1, 0.01),
144
+ brightness: num(0.5, 1.5, 1, 0.01),
145
+ blur: num(0, 20, 8, 0.1),
146
+ quality: num(1, 20, 4, 1),
147
+ }),
148
+ alpha: defineFilter<AlphaFilterOptions>()("AlphaFilter", {
149
+ alpha: num(0, 1, 1, 0.01),
150
+ }),
151
+ ascii: defineFilter<PixiFilters.AsciiFilterOptions>()("AsciiFilter", {
152
+ size: num(2, 20, 8, 1),
153
+ color: color("#ffffff"),
154
+ replaceColor: bool(false),
155
+ }),
156
+ backdropBlur: defineFilter<BlurFilterOptions>()("BackdropBlurFilter", {
157
+ strength: num(0, 100, 8, 0.1),
158
+ quality: num(1, 10, 4, 1),
159
+ }),
160
+ bevel: defineFilter<PixiFilters.BevelFilterOptions>()("BevelFilter", {
161
+ rotation: num(0, 360, 45, 1),
162
+ thickness: num(0, 10, 2, 0.1),
163
+ lightColor: color("#ffffff"),
164
+ lightAlpha: num(0, 1, 0.7, 0.01),
165
+ shadowColor: color("#000000"),
166
+ shadowAlpha: num(0, 1, 0.7, 0.01),
167
+ }),
168
+ bloom: defineFilter<PixiFilters.BloomFilterOptions>()("BloomFilter", {
169
+ strength: object({
170
+ x: num(0, 20, 2, 0.1),
171
+ y: num(0, 20, 2, 0.1),
172
+ }),
173
+ quality: num(1, 20, 4, 1),
174
+ resolution: num(0.25, 4, 1, 0.01),
175
+ kernelSize: choice([5, 7, 9, 11, 13, 15], 5),
176
+ }),
177
+ blur: defineFilter<BlurFilterOptions>()("BlurFilter", {
178
+ strength: num(0, 100, 8, 0.1),
179
+ quality: num(1, 10, 4, 1),
180
+ }),
181
+ bulgePinch: defineFilter<PixiFilters.BulgePinchFilterOptions>()("BulgePinchFilter", {
182
+ radius: num(0, 1000, 100, 1),
183
+ strength: num(-1, 1, 1, 0.01),
184
+ center: object({
185
+ x: num(0, 1, 0.5, 0.01),
186
+ y: num(0, 1, 0.5, 0.01),
187
+ }),
188
+ }),
189
+ colorGradient: defineFilter<PixiFilters.ColorGradientFilterOptions | PixiFilters.ColorGradientFilterCSSOptions>()("ColorGradientFilter"),
190
+ colorMatrix: defineFilter<PixiFilterOptions & {matrix?: ColorMatrix}>()("ColorMatrixFilter"),
191
+ colorOverlay: defineFilter<PixiFilters.ColorOverlayFilterOptions>()("ColorOverlayFilter", {
192
+ color: color("#ff0000"),
193
+ alpha: num(0, 1, 0.5, 0.01),
194
+ }),
195
+ colorReplace: defineFilter<PixiFilters.ColorReplaceFilterOptions>()("ColorReplaceFilter", {
196
+ originalColor: color("#ff0000"),
197
+ targetColor: color("#000000"),
198
+ tolerance: num(0, 1, 0.4, 0.01),
199
+ }),
200
+ convolution: defineFilter<PixiFilters.ConvolutionFilterOptions>()("ConvolutionFilter", {
201
+ width: num(0, 500, 300, 1),
202
+ height: num(0, 500, 300, 1),
203
+ matrix: array([
204
+ num(0, 1, 0),
205
+ num(0, 1, 0.5, 0.01),
206
+ num(0, 1, 0),
207
+ num(0, 1, 0.5, 0.01),
208
+ num(0, 1, 1, 0.01),
209
+ num(0, 1, 0.5, 0.01),
210
+ num(0, 1, 0),
211
+ num(0, 1, 0.5, 0.01),
212
+ num(0, 1, 0),
213
+ ]),
214
+ }),
215
+ crossHatch: defineFilter<{}>()("CrossHatchFilter"),
216
+ crt: defineFilter<PixiFilters.CRTFilterOptions>()("CRTFilter", {
217
+ curvature: num(0, 10, 1, 0.01),
218
+ lineWidth: num(0, 5, 3, 0.01),
219
+ lineContrast: num(0, 1, 0.3, 0.01),
220
+ verticalLine: bool(false),
221
+ noise: num(0, 1, 0.2, 0.01),
222
+ noiseSize: num(1, 10, 1, 0.1),
223
+ vignetting: num(0, 1, 0.3, 0.01),
224
+ vignettingAlpha: num(0, 1, 1, 0.01),
225
+ vignettingBlur: num(0, 1, 0.3, 0.01),
226
+ seed: num(0, 1, 0, 0.01),
227
+ time: num(0.5, 20, 0.5, 0.01),
228
+ }),
229
+ dot: defineFilter<PixiFilters.DotFilterOptions>()("DotFilter", {
230
+ scale: num(0.3, 1, 1, 0.01),
231
+ angle: num(0, 5, 5, 0.01),
232
+ grayscale: bool(true),
233
+ }),
234
+ dropShadow: defineFilter<PixiFilters.DropShadowFilterOptions>()("DropShadowFilter", {
235
+ blur: num(0, 20, 2, 0.1),
236
+ quality: num(1, 20, 3, 1),
237
+ alpha: num(0, 1, 0.5, 0.01),
238
+ offset: object({
239
+ x: num(-50, 50, 4, 1),
240
+ y: num(-50, 50, 4, 1),
241
+ }),
242
+ color: color("#000000"),
243
+ shadowOnly: bool(false),
244
+ }),
245
+ emboss: defineFilter<EmbossFilterOptions>()("EmbossFilter", {
246
+ strength: num(0, 20, 5, 0.1),
247
+ }),
248
+ glitch: defineFilter<PixiFilters.GlitchFilterOptions>()("GlitchFilter", {
249
+ slices: num(0, 64, 5, 1),
250
+ seed: num(0, 1, 0.5, 0.01),
251
+ offset: num(-400, 400, 100, 1),
252
+ direction: num(-180, 180, 0, 1),
253
+ fillMode: choice(glitchFillModes, "LOOP"),
254
+ average: bool(false),
255
+ minSize: num(0, 64, 8, 1),
256
+ sampleSize: num(1, 2048, 512, 1),
257
+ red: object({
258
+ x: num(-50, 50, 2, 1),
259
+ y: num(-50, 50, 2, 1),
260
+ }),
261
+ blue: object({
262
+ x: num(-50, 50, 10, 1),
263
+ y: num(-50, 50, -4, 1),
264
+ }),
265
+ green: object({
266
+ x: num(-50, 50, -10, 1),
267
+ y: num(-50, 50, 4, 1),
268
+ }),
269
+ }),
270
+ glow: defineFilter<PixiFilters.GlowFilterOptions>()("GlowFilter", {
271
+ distance: num(0, 20, 15, 0.1),
272
+ innerStrength: num(0, 20, 0, 0.1),
273
+ outerStrength: num(0, 20, 2, 0.1),
274
+ color: color("#ffffff"),
275
+ quality: num(0, 1, 0.2, 0.01),
276
+ alpha: num(0, 1, 1, 0.01),
277
+ knockout: bool(false),
278
+ }),
279
+ godray: defineFilter<PixiFilters.GodrayFilterOptions>()("GodrayFilter", {
280
+ time: num(0, 1, 0, 0.01),
281
+ gain: num(0, 1, 0.6, 0.01),
282
+ lacunarity: num(0, 5, 2.75, 0.01),
283
+ alpha: num(0, 1, 1, 0.01),
284
+ parallel: bool(true),
285
+ angle: num(-60, 60, 30, 1),
286
+ center: object({
287
+ x: num(-100, 2012, 956, 1),
288
+ y: num(-1000, -100, -100, 1),
289
+ }),
290
+ }),
291
+ grayscale: defineFilter<{}>()("GrayscaleFilter"),
292
+ hslAdjustment: defineFilter<PixiFilters.HslAdjustmentFilterOptions>()("HslAdjustmentFilter", {
293
+ hue: num(-180, 180, 0, 1),
294
+ saturation: num(-1, 1, 0, 0.01),
295
+ lightness: num(-1, 1, 0, 0.01),
296
+ colorize: bool(false),
297
+ alpha: num(0, 1, 1, 0.01),
298
+ }),
299
+ kawaseBlur: defineFilter<PixiFilters.KawaseBlurFilterOptions>()("KawaseBlurFilter", {
300
+ strength: num(0, 20, 4, 0.1),
301
+ quality: num(1, 20, 3, 1),
302
+ pixelSize: object({
303
+ x: num(0, 10, 1, 0.1),
304
+ y: num(0, 10, 1, 0.1),
305
+ }),
306
+ }),
307
+ motionBlur: defineFilter<PixiFilters.MotionBlurFilterOptions>()("MotionBlurFilter", {
308
+ velocity: object({
309
+ x: num(-90, 90, 40, 1),
310
+ y: num(-90, 90, 40, 1),
311
+ }),
312
+ kernelSize: choice(kernelSizes, 15),
313
+ offset: num(-150, 150, 0, 1),
314
+ }),
315
+ multiColorReplace: defineFilter<PixiFilters.MultiColorReplaceFilterOptions>()("MultiColorReplaceFilter"),
316
+ noise: defineFilter<NoiseFilterOptions>()("NoiseFilter", {
317
+ noise: num(0, 1, 0.5, 0.01),
318
+ seed: num(0.01, 10, 0.5, 0.01),
319
+ }),
320
+ oldFilm: defineFilter<PixiFilters.OldFilmFilterOptions>()("OldFilmFilter", {
321
+ sepia: num(0, 1, 0.3, 0.01),
322
+ noise: num(0, 1, 0.3, 0.01),
323
+ noiseSize: num(1, 10, 1, 0.1),
324
+ scratch: num(-1, 1, 0.5, 0.01),
325
+ scratchDensity: num(0, 1, 0.3, 0.01),
326
+ scratchWidth: num(1, 20, 1, 0.1),
327
+ vignetting: num(0, 1, 0.3, 0.01),
328
+ vignettingAlpha: num(0, 1, 1, 0.01),
329
+ vignettingBlur: num(0, 1, 0.3, 0.01),
330
+ }),
331
+ outline: defineFilter<PixiFilters.OutlineFilterOptions>()("OutlineFilter", {
332
+ thickness: num(0, 10, 4, 0.1),
333
+ color: color("#000000"),
334
+ alpha: num(0, 1, 1, 0.01),
335
+ knockout: bool(false),
336
+ }),
337
+ pixelate: defineFilter<PixelateFilterOptions>()("PixelateFilter", {
338
+ size: object({
339
+ x: num(4, 40, 10, 1),
340
+ y: num(4, 40, 10, 1),
341
+ }),
342
+ }),
343
+ radialBlur: defineFilter<PixiFilters.RadialBlurFilterOptions>()("RadialBlurFilter", {
344
+ angle: num(-180, 180, 20, 1),
345
+ radius: num(-1, 1912, 300, 1),
346
+ center: object({
347
+ x: num(0, 1912, 956, 1),
348
+ y: num(0, 920, 460, 1),
349
+ }),
350
+ kernelSize: choice(kernelSizes, 15),
351
+ }),
352
+ reflection: defineFilter<PixiFilters.ReflectionFilterOptions>()("ReflectionFilter", {
353
+ mirror: bool(true),
354
+ boundary: num(0, 1, 0.5, 0.01),
355
+ amplitude: object({
356
+ start: num(0, 50, 0, 0.1),
357
+ end: num(0, 50, 20, 0.1),
358
+ }),
359
+ waveLength: object({
360
+ start: num(10, 200, 30, 1),
361
+ end: num(10, 200, 100, 1),
362
+ }),
363
+ alpha: object({
364
+ start: num(0, 1, 1, 0.01),
365
+ end: num(0, 1, 1, 0.01),
366
+ }),
367
+ time: num(0, 20, 0, 0.01),
368
+ }),
369
+ rgbSplit: defineFilter<PixiFilters.RGBSplitFilterOptions>()("RGBSplitFilter", {
370
+ red: object({
371
+ x: num(-20, 20, -10, 1),
372
+ y: num(-20, 20, 0, 1),
373
+ }),
374
+ blue: object({
375
+ x: num(-20, 20, 0, 1),
376
+ y: num(-20, 20, 0, 1),
377
+ }),
378
+ green: object({
379
+ x: num(-20, 20, 0, 1),
380
+ y: num(-20, 20, 10, 1),
381
+ }),
382
+ }),
383
+ shockwave: defineFilter<PixiFilters.ShockwaveFilterOptions>()("ShockwaveFilter", {
384
+ speed: num(500, 2000, 500, 1),
385
+ amplitude: num(1, 100, 30, 1),
386
+ wavelength: num(2, 400, 160, 1),
387
+ brightness: num(0.2, 2, 1, 0.01),
388
+ radius: num(100, 2000, -1, 1),
389
+ center: object({
390
+ x: num(0, 1912, 956, 1),
391
+ y: num(0, 920, 460, 1),
392
+ }),
393
+ }),
394
+ simplexNoise: defineFilter<PixiFilters.SimplexNoiseFilterOptions>()("SimplexNoiseFilter", {
395
+ strength: num(0, 1, 0.5, 0.01),
396
+ noiseScale: num(0, 50, 10, 0.1),
397
+ offsetX: num(0, 5, 0, 0.01),
398
+ offsetY: num(0, 5, 0, 0.01),
399
+ offsetZ: num(0, 5, 0, 0.01),
400
+ step: num(-1, 1, -1, 0.01),
401
+ }),
402
+ tiltShift: defineFilter<PixiFilters.TiltShiftFilterOptions>()("TiltShiftFilter", {
403
+ blur: num(0, 200, 100, 0.1),
404
+ gradientBlur: num(0, 1000, 600, 1),
405
+ start: object({
406
+ x: num(0, 1912, 0, 1),
407
+ y: num(0, 920, 460, 1),
408
+ }),
409
+ end: object({
410
+ x: num(0, 1912, 1912, 1),
411
+ y: num(0, 920, 460, 1),
412
+ }),
413
+ }),
414
+ twist: defineFilter<Partial<PixiFilters.TwistFilterOptions>>()("TwistFilter", {
415
+ angle: num(-10, 10, 4, 0.01),
416
+ radius: num(0, 1912, 200, 1),
417
+ offset: object({
418
+ x: num(0, 1912, 956, 1),
419
+ y: num(0, 920, 460, 1),
420
+ }),
421
+ }),
422
+ zoomBlur: defineFilter<PixiFilters.ZoomBlurFilterOptions>()("ZoomBlurFilter", {
423
+ strength: num(0.01, 0.5, 0.1, 0.01),
424
+ center: object({
425
+ x: num(0, 1912, 956, 1),
426
+ y: num(0, 920, 460, 1),
427
+ }),
428
+ innerRadius: num(0, 956, 80, 1),
429
+ radius: num(0, 956, -1, 1),
430
+ }),
431
+ } as const
432
+
433
+ type FilterDefinitions = typeof filters
434
+ type FilterDefinitionParams<T> =
435
+ T extends FilterDefinition<string, infer TParams>
436
+ ? TParams
437
+ : never
438
+
439
+ export type FilterOptions = {
440
+ [TName in keyof FilterDefinitions as FilterDefinitions[TName]["type"]]:
441
+ FilterDefinitionParams<FilterDefinitions[TName]>
442
+ }
443
+
444
+ export type FilterType = FilterDefinitions[keyof FilterDefinitions]["type"]
445
+ export type FilterParams<T extends FilterType = FilterType> = FilterOptions[T]
446
+
447
+ export interface FilterAction<TFilter extends FilterType> {
448
+ <T extends FilterableItem>(item: T, params?: FilterParams<TFilter>): T
449
+ make(params?: FilterParams<TFilter>): Item.Filter<TFilter>
450
+ }
451
+ export type FilterActions = {
452
+ [TName in keyof typeof filters]: FilterAction<(typeof filters)[TName]["type"]>
453
+ }
@@ -4,6 +4,7 @@ import {TextStyleOptions} from "pixi.js"
4
4
  import {Id, Hash} from "./basics.js"
5
5
  import {Transform} from "../types.js"
6
6
  import {Ms} from "../../units/ms.js"
7
+ import type {FilterParams, FilterType} from "./filters.js"
7
8
 
8
9
  export type Crop = [top: number, right: number, bottom: number, left: number]
9
10
 
@@ -16,7 +17,8 @@ export enum Kind {
16
17
  Gap,
17
18
  Spatial,
18
19
  Transition,
19
- TextStyle
20
+ TextStyle,
21
+ Filter
20
22
  }
21
23
 
22
24
  export enum Effect {
@@ -38,6 +40,14 @@ export namespace Item {
38
40
  enabled: boolean
39
41
  }
40
42
 
43
+ export type Filter<T extends FilterType = FilterType> = {
44
+ id: Id
45
+ kind: Kind.Filter
46
+ type: T
47
+ params?: FilterParams<T>
48
+ enabled: boolean
49
+ }
50
+
41
51
  export type Gap = {
42
52
  id: Id
43
53
  kind: Kind.Gap
@@ -49,6 +59,7 @@ export namespace Item {
49
59
  kind: Kind.Sequence
50
60
  childrenIds: Id[]
51
61
  spatialId?: Id
62
+ filterIds?: Id[]
52
63
  }
53
64
 
54
65
  export type Stack = {
@@ -56,6 +67,7 @@ export namespace Item {
56
67
  kind: Kind.Stack
57
68
  childrenIds: Id[]
58
69
  spatialId?: Id
70
+ filterIds?: Id[]
59
71
  }
60
72
 
61
73
  export type Video = {
@@ -65,6 +77,7 @@ export namespace Item {
65
77
  start: number
66
78
  duration: number
67
79
  spatialId?: Id
80
+ filterIds?: Id[]
68
81
  }
69
82
 
70
83
  export type Audio = {
@@ -83,6 +96,7 @@ export namespace Item {
83
96
  duration: number
84
97
  spatialId?: Id
85
98
  styleId?: Id
99
+ filterIds?: Id[]
86
100
  }
87
101
 
88
102
  export type Transition = {
@@ -102,11 +116,13 @@ export namespace Item {
102
116
  | Transition
103
117
  | Spatial
104
118
  | TextStyle
119
+ | Filter
105
120
  )
106
121
  }
107
122
 
108
123
  export type ContainerItem = Item.Sequence | Item.Stack
109
124
  export type NonContainerItem = Exclude<Item.Any, ContainerItem>
125
+ export type FilterableItem = Item.Sequence | Item.Stack | Item.Video | Item.Text
110
126
 
111
127
  export type PlayableItem = Item.Any & {
112
128
  start: Ms
@@ -3,7 +3,7 @@ import {SampleContext} from "./types.js"
3
3
  import {sampleSequence} from "./sequence.js"
4
4
  import {Ms} from "../../../../../../units/ms.js"
5
5
  import {computeWorldMatrix} from "../../../handy.js"
6
- import {Layer} from "../../../../../../driver/fns/schematic.js"
6
+ import {FilterSpec, Layer} from "../../../../../../driver/fns/schematic.js"
7
7
  import {ContainerItem, Item, Kind} from "../../../../../parts/item.js"
8
8
 
9
9
  export async function sampleVisual(
@@ -16,6 +16,12 @@ export async function sampleVisual(
16
16
  const crop = "spatialId" in item && item.spatialId
17
17
  ? (ctx.items.get(item.spatialId) as Item.Spatial | undefined)?.crop
18
18
  : undefined
19
+ const filters = "filterIds" in item && item.filterIds
20
+ ? item.filterIds
21
+ .map(id => ctx.items.get(id) as Item.Filter | undefined)
22
+ .filter((filter): filter is Item.Filter => !!filter?.enabled)
23
+ .map(filter => ({type: filter.type, params: filter.params}) as FilterSpec)
24
+ : undefined
19
25
 
20
26
  switch (item.kind) {
21
27
  case Kind.Stack: {
@@ -38,7 +44,7 @@ export async function sampleVisual(
38
44
  if (time < 0 || time >= item.duration) return []
39
45
 
40
46
  const frame = await ctx.videoSampler(item, time)
41
- return frame ? [{kind: "image", frame, matrix, crop, id: item.id}] : []
47
+ return frame ? [{kind: "image", frame, matrix, crop, filters, id: item.id}] : []
42
48
  }
43
49
 
44
50
  case Kind.Text: {
@@ -48,7 +54,7 @@ export async function sampleVisual(
48
54
  ? (ctx.items.get(item.styleId) as Item.TextStyle)?.style
49
55
  : undefined
50
56
 
51
- return [{id: item.id, kind: "text", content: item.content, style, matrix, crop}]
57
+ return [{id: item.id, kind: "text", content: item.content, style, matrix, crop, filters}]
52
58
  }
53
59
 
54
60
  case Kind.Gap: {
@@ -4,10 +4,12 @@ import {TextStyleOptions} from "pixi.js"
4
4
  import {O} from "./o.js"
5
5
  import {Transform} from "../types.js"
6
6
  import {Media} from "../parts/media.js"
7
- import {Crop, Item} from "../parts/item.js"
8
7
  import {TimelineFile} from "../parts/basics.js"
8
+ import {FilterAction} from "../parts/filters.js"
9
+ import {Crop, FilterableItem, Item} from "../parts/item.js"
10
+ import {filters, FilterParams, FilterType} from "../parts/filters.js"
9
11
 
10
- type Build<T extends Item.Any = Item.Any> = (o: O) => T
12
+ export type Build<T extends Item.Any = Item.Any> = (o: O) => T
11
13
 
12
14
  function createTimeline(): TimelineFile {
13
15
  return {
@@ -73,6 +75,37 @@ export function spatial(transform?: Transform, crop?: Crop): Build<Item.Spatial>
73
75
  return o => o.spatial(transform, crop)
74
76
  }
75
77
 
78
+ interface BuildFilterAction<TFilter extends FilterType> {
79
+ <T extends FilterableItem>(item: Build<T>, params?: FilterParams<TFilter>): Build<T>
80
+ make(params?: FilterParams<TFilter>): Build<Item.Filter<TFilter>>
81
+ }
82
+
83
+ type BuildFilterActions = {
84
+ [TName in keyof typeof filters]: BuildFilterAction<(typeof filters)[TName]["type"]>
85
+ }
86
+
87
+ function makeFilter<TFilter extends FilterType>(
88
+ get: (o: O) => FilterAction<TFilter>
89
+ ): BuildFilterAction<TFilter> {
90
+ const action = (<T extends FilterableItem>(
91
+ item: Build<T>,
92
+ params?: FilterParams<TFilter>
93
+ ): Build<T> => o => get(o)(item(o), params)) as BuildFilterAction<TFilter>
94
+ action.make = (params?: FilterParams<TFilter>) => o => get(o).make(params)
95
+ return action
96
+ }
97
+
98
+ function makeFilters(): BuildFilterActions {
99
+ const names = Object.keys(filters) as (keyof typeof filters)[]
100
+ const entries = names.map(name => [
101
+ name,
102
+ makeFilter(o => o.filter[name] as FilterAction<any>)
103
+ ])
104
+ return Object.fromEntries(entries) as BuildFilterActions
105
+ }
106
+
107
+ export const filter = makeFilters()
108
+
76
109
  export function textStyle(style: TextStyleOptions): Build<Item.TextStyle> {
77
110
  return o => o.textStyle(style)
78
111
  }
@@ -3,8 +3,10 @@ import {TextStyleOptions} from "pixi.js"
3
3
 
4
4
  import {Media} from "../parts/media.js"
5
5
  import {Id, TimelineFile} from "../parts/basics.js"
6
- import {Crop, Effect, Item, Kind} from "../parts/item.js"
7
6
  import {Transform, TransformOptions, Vec2} from "../types.js"
7
+ import {FilterAction, FilterActions} from "../parts/filters.js"
8
+ import {Crop, Effect, FilterableItem, Item, Kind} from "../parts/item.js"
9
+ import {filters, FilterParams, FilterType} from "../parts/filters.js"
8
10
 
9
11
  export class O {
10
12
  constructor(public state: {timeline: TimelineFile}) {}
@@ -57,6 +59,41 @@ export class O {
57
59
  return item
58
60
  }
59
61
 
62
+ #makeFilter = <TFilter extends FilterType>(type: TFilter) => {
63
+ const make = (params?: FilterParams<TFilter>) => {
64
+ const item: Item.Filter<TFilter> = {
65
+ id: this.getId(),
66
+ kind: Kind.Filter,
67
+ type,
68
+ params,
69
+ enabled: true
70
+ }
71
+ this.register(item)
72
+ return item
73
+ }
74
+
75
+ const action = (<T extends FilterableItem>(item: T, params?: FilterParams<TFilter>): T => {
76
+ const filter = make(params)
77
+ const next = {
78
+ ...item,
79
+ filterIds: [...(item.filterIds ?? []), filter.id]
80
+ }
81
+ this.set<T>(item.id, next as Partial<T>)
82
+ return next
83
+ }) as FilterAction<TFilter>
84
+
85
+ action.make = make
86
+ return action
87
+ }
88
+
89
+ #makeFilters = (): FilterActions => {
90
+ const entries = Object.entries(filters)
91
+ .map(([name, filter]) => [name, this.#makeFilter(filter.type)])
92
+ return Object.fromEntries(entries) as FilterActions
93
+ }
94
+
95
+ filter = this.#makeFilters()
96
+
60
97
  sequence = (...items: Item.Any[]): Item.Sequence => {
61
98
  const item = {
62
99
  id: this.getId(),
@@ -1,3 +1,4 @@
1
+
1
2
  export type Interpolation = "linear" | "catmullRom"
2
3
  export type Keyframe<Value = number> = [time: number, value: Value]
3
4
  export type Keyframes<Value = number> = Keyframe<Value>[]
@@ -27,3 +28,4 @@ export type TransformOptions = {
27
28
  scale?: Vec2
28
29
  rotation?: number
29
30
  }
31
+
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-KCMVLWBS.js";import"./chunk-VCUJJYRJ.js";import"./chunk-XNIZ4L5W.js";export{a as WebGLRenderer};
2
+ //# sourceMappingURL=WebGLRenderer-4CHIZDHY.js.map
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-IAWJKNX5.js";import"./chunk-23FOBGX6.js";import"./chunk-VCUJJYRJ.js";import"./chunk-XNIZ4L5W.js";export{a as WebGPURenderer};
2
+ //# sourceMappingURL=WebGPURenderer-O6WXU2QR.js.map
@@ -0,0 +1,2 @@
1
+ import{a as i,b as o,c as m,d as p,e}from"./chunk-ZLGNQFUI.js";import"./chunk-MR32SQ27.js";import"./chunk-73XOWA4F.js";import"./chunk-23FOBGX6.js";import{P as t,e as r}from"./chunk-XNIZ4L5W.js";r.add(i);r.mixin(t,o);r.add(m);r.mixin(t,p);r.add(e);
2
+ //# sourceMappingURL=browserAll-WNIOTNNP.js.map