@omnimedia/omnitool 1.1.0-98 → 1.1.0-99
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/README.md +46 -13
- package/package.json +1 -1
- package/s/demo/routines/timeline-setup.ts +8 -4
- package/s/driver/fns/schematic.ts +2 -1
- package/s/driver/parts/compositor.ts +1 -1
- package/s/features/transition/parts/types.ts +3 -70
- package/s/timeline/index.ts +1 -0
- package/s/timeline/parts/item.ts +2 -5
- package/s/timeline/parts/transitions.ts +102 -0
- package/s/timeline/renderers/parts/samplers/visual/parts/transition.ts +1 -1
- package/s/timeline/sugar/helpers.ts +9 -4
- package/s/timeline/sugar/o.ts +16 -7
- package/s/timeline/sugar/omni.test.ts +7 -7
- package/x/demo/demo.bundle.min.js +25 -25
- package/x/demo/demo.bundle.min.js.map +4 -4
- package/x/demo/routines/timeline-setup.js +3 -2
- package/x/demo/routines/timeline-setup.js.map +1 -1
- package/x/driver/fns/schematic.d.ts +2 -1
- package/x/driver/parts/compositor.js +1 -1
- package/x/driver/parts/compositor.js.map +1 -1
- package/x/features/transition/parts/types.d.ts +3 -3
- package/x/index.html +2 -2
- package/x/tests.bundle.min.js +58 -58
- package/x/tests.bundle.min.js.map +4 -4
- package/x/tests.html +1 -1
- package/x/timeline/index.d.ts +1 -0
- package/x/timeline/index.js +1 -0
- package/x/timeline/index.js.map +1 -1
- package/x/timeline/parts/item.d.ts +2 -4
- package/x/timeline/parts/item.js +0 -4
- package/x/timeline/parts/item.js.map +1 -1
- package/x/timeline/parts/transitions.d.ts +15 -0
- package/x/timeline/parts/transitions.js +81 -0
- package/x/timeline/parts/transitions.js.map +1 -0
- package/x/timeline/renderers/parts/samplers/visual/parts/transition.js +1 -1
- package/x/timeline/renderers/parts/samplers/visual/parts/transition.js.map +1 -1
- package/x/timeline/sugar/helpers.d.ts +5 -3
- package/x/timeline/sugar/helpers.js +7 -5
- package/x/timeline/sugar/helpers.js.map +1 -1
- package/x/timeline/sugar/o.d.ts +2 -3
- package/x/timeline/sugar/o.js +12 -5
- package/x/timeline/sugar/o.js.map +1 -1
- package/x/timeline/sugar/omni.test.js +5 -5
- package/x/timeline/sugar/omni.test.js.map +1 -1
package/README.md
CHANGED
|
@@ -36,17 +36,21 @@ const timeline = omni.timeline(o => {
|
|
|
36
36
|
duration: 1500,
|
|
37
37
|
styles: {fill: "white", fontSize: 48}
|
|
38
38
|
})
|
|
39
|
-
const xfade = o.transition.
|
|
39
|
+
const xfade = o.transition.fade(500)
|
|
40
40
|
const softened = o.filter.blur.make({strength: 8, quality: 4})
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
const visual = o.sequence(
|
|
43
43
|
o.stack(
|
|
44
44
|
o.video(clip, {start: 0, duration: 3000, filterIds: [softened.id]}),
|
|
45
45
|
caption
|
|
46
46
|
),
|
|
47
|
-
o.gap(400),
|
|
48
47
|
xfade,
|
|
49
48
|
o.video(clip, {start: 5000, duration: 2500}),
|
|
49
|
+
o.gap(400)
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
return o.stack(
|
|
53
|
+
visual,
|
|
50
54
|
o.audio(clip, {start: 5000, duration: 2500})
|
|
51
55
|
)
|
|
52
56
|
})
|
|
@@ -57,7 +61,7 @@ Declarative helper style (no explicit `o` in timeline declarations):
|
|
|
57
61
|
```ts
|
|
58
62
|
import {
|
|
59
63
|
Driver, Omni, Datafile,
|
|
60
|
-
timeline, stack, video, audio, text, gap, transition, filter
|
|
64
|
+
timeline, sequence, stack, video, audio, text, gap, transition, filter
|
|
61
65
|
} from "@omnimedia/omnitool"
|
|
62
66
|
|
|
63
67
|
const driver = await Driver.setup()
|
|
@@ -66,16 +70,20 @@ const {clip} = await omni.load({clip: Datafile.make(file)})
|
|
|
66
70
|
|
|
67
71
|
const timeline = timeline(
|
|
68
72
|
stack(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
sequence(
|
|
74
|
+
stack(
|
|
75
|
+
filter.blur(
|
|
76
|
+
video(clip, {start: 0, duration: 3000}),
|
|
77
|
+
{strength: 8, quality: 4}
|
|
78
|
+
),
|
|
79
|
+
text("Hello world", {duration: 1500}),
|
|
80
|
+
),
|
|
81
|
+
transition.fade(500),
|
|
82
|
+
video(clip, {start: 5000, duration: 2500}),
|
|
83
|
+
gap(400),
|
|
72
84
|
),
|
|
73
|
-
|
|
74
|
-
)
|
|
75
|
-
gap(400),
|
|
76
|
-
transition.crossfade(500),
|
|
77
|
-
video(clip, {start: 5000, duration: 2500}),
|
|
78
|
-
audio(clip, {start: 5000, duration: 2500})
|
|
85
|
+
audio(clip, {start: 5000, duration: 2500})
|
|
86
|
+
)
|
|
79
87
|
)
|
|
80
88
|
```
|
|
81
89
|
|
|
@@ -458,6 +466,31 @@ const opacity = resolveScalarAnimation(localTime, opacityAnimation)
|
|
|
458
466
|
`localTime` is time relative to the item being resolved.
|
|
459
467
|
`clamp` is the default and currently only extrapolation mode, holding the first or last keyframe value outside the authored range.
|
|
460
468
|
|
|
469
|
+
## 🔀 Transitions
|
|
470
|
+
|
|
471
|
+
Transitions are sequence items placed between two visual items.
|
|
472
|
+
|
|
473
|
+
```ts
|
|
474
|
+
const timeline = omni.timeline(o =>
|
|
475
|
+
o.sequence(
|
|
476
|
+
o.video(firstClip, {duration: 3000}),
|
|
477
|
+
o.transition.fade(700),
|
|
478
|
+
o.video(secondClip, {duration: 3000}),
|
|
479
|
+
)
|
|
480
|
+
)
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
Use the exported transition registry to build UI:
|
|
484
|
+
|
|
485
|
+
```ts
|
|
486
|
+
import {transitions} from "@omnimedia/omnitool"
|
|
487
|
+
|
|
488
|
+
const options = Object.entries(transitions).map(([key, transition]) => ({
|
|
489
|
+
key,
|
|
490
|
+
label: transition.label,
|
|
491
|
+
}))
|
|
492
|
+
```
|
|
493
|
+
|
|
461
494
|
Worker URL notes:
|
|
462
495
|
- `Driver.setup()` defaults to `/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js`.
|
|
463
496
|
- If you serve the worker from a different location, pass `workerUrl`:
|
package/package.json
CHANGED
|
@@ -49,7 +49,7 @@ export async function TimelineSchemaTest(driver: Driver, file: File) {
|
|
|
49
49
|
o.set<Item.Text>(text.id, {styleId: style.id, spatialId: textSpatial.id, animationIds: [fade.id, textMotion.id]})
|
|
50
50
|
o.set<Item.Video>(video.id, {spatialId: videoSpatial.id})
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
const visual = o.sequence(
|
|
53
53
|
o.stack(
|
|
54
54
|
text,
|
|
55
55
|
o.captions(video, transcript, {
|
|
@@ -65,12 +65,16 @@ export async function TimelineSchemaTest(driver: Driver, file: File) {
|
|
|
65
65
|
wordWrapWidth: 1280,
|
|
66
66
|
stroke: {color: "#000000", width: 6},
|
|
67
67
|
},
|
|
68
|
-
})
|
|
69
|
-
o.audio(videoA, {start: 3000})
|
|
68
|
+
})
|
|
70
69
|
),
|
|
71
|
-
o.
|
|
70
|
+
o.transition.circle(1500),
|
|
72
71
|
o.video(videoA, {duration: 7000, start: 5000})
|
|
73
72
|
)
|
|
73
|
+
|
|
74
|
+
return o.stack(
|
|
75
|
+
visual,
|
|
76
|
+
o.audio(videoA, {start: 3000, duration: video.duration})
|
|
77
|
+
)
|
|
74
78
|
})
|
|
75
79
|
|
|
76
80
|
return {timeline, omni}
|
|
@@ -7,6 +7,7 @@ import {Id} from "../../timeline/index.js"
|
|
|
7
7
|
import {Crop} from "../../timeline/parts/item.js"
|
|
8
8
|
import {Mat6} from "../../timeline/utils/matrix.js"
|
|
9
9
|
import {FilterParams, FilterType} from "../../timeline/parts/filters.js"
|
|
10
|
+
import {TransitionName} from "../../timeline/parts/transitions.js"
|
|
10
11
|
|
|
11
12
|
export type DriverSchematic = AsSchematic<{
|
|
12
13
|
|
|
@@ -106,7 +107,7 @@ export type ImageLayer = {
|
|
|
106
107
|
export type TransitionLayer = {
|
|
107
108
|
id: Id
|
|
108
109
|
kind: 'transition'
|
|
109
|
-
name:
|
|
110
|
+
name: TransitionName
|
|
110
111
|
progress: number
|
|
111
112
|
from: VideoFrame
|
|
112
113
|
to: VideoFrame
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {Renderer} from "pixi.js"
|
|
2
|
+
import {TransitionName} from "../../../timeline/parts/transitions.js"
|
|
2
3
|
|
|
3
4
|
export interface TransitionOptions {
|
|
4
|
-
name:
|
|
5
|
+
name: TransitionName
|
|
5
6
|
renderer: Renderer
|
|
6
7
|
}
|
|
7
8
|
|
|
@@ -18,77 +19,9 @@ export interface GLTransition {
|
|
|
18
19
|
createdAt: string
|
|
19
20
|
glsl: string
|
|
20
21
|
license: string
|
|
21
|
-
name:
|
|
22
|
+
name: TransitionName
|
|
22
23
|
updatedAt: string
|
|
23
24
|
defaultParams: any
|
|
24
25
|
paramsTypes: any
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
export type Transition =
|
|
28
|
-
| "Bounce"
|
|
29
|
-
| "BowTieHorizontal"
|
|
30
|
-
| "BowTieVertical"
|
|
31
|
-
| "ButterflyWaveScrawler"
|
|
32
|
-
| "CircleCrop"
|
|
33
|
-
| "ColourDistance"
|
|
34
|
-
| "CrazyParametricFun"
|
|
35
|
-
| "CrossZoom"
|
|
36
|
-
| "Directional"
|
|
37
|
-
| "DoomScreenTransition"
|
|
38
|
-
| "Dreamy"
|
|
39
|
-
| "DreamyZoom"
|
|
40
|
-
| "GlitchDisplace"
|
|
41
|
-
| "GlitchMemories"
|
|
42
|
-
| "GridFlip"
|
|
43
|
-
| "InvertedPageCurl"
|
|
44
|
-
| "LinearBlur"
|
|
45
|
-
| "Mosaic"
|
|
46
|
-
| "PolkaDotsCurtain"
|
|
47
|
-
| "Radial"
|
|
48
|
-
| "SimpleZoom"
|
|
49
|
-
| "StereoViewer"
|
|
50
|
-
| "Swirl"
|
|
51
|
-
| "WaterDrop"
|
|
52
|
-
| "ZoomInCircles"
|
|
53
|
-
| "angular"
|
|
54
|
-
| "burn"
|
|
55
|
-
| "cannabisleaf"
|
|
56
|
-
| "circle"
|
|
57
|
-
| "circleopen"
|
|
58
|
-
| "colorphase"
|
|
59
|
-
| "crosshatch"
|
|
60
|
-
| "crosswarp"
|
|
61
|
-
| "cube"
|
|
62
|
-
| "directionalwarp"
|
|
63
|
-
| "directionalwipe"
|
|
64
|
-
| "displacement"
|
|
65
|
-
| "doorway"
|
|
66
|
-
| "fade"
|
|
67
|
-
| "fadecolor"
|
|
68
|
-
| "fadegrayscale"
|
|
69
|
-
| "flyeye"
|
|
70
|
-
| "heart"
|
|
71
|
-
| "hexagonalize"
|
|
72
|
-
| "kaleidoscope"
|
|
73
|
-
| "luma"
|
|
74
|
-
| "luminance_melt"
|
|
75
|
-
| "morph"
|
|
76
|
-
| "multiply_blend"
|
|
77
|
-
| "perlin"
|
|
78
|
-
| "pinwheel"
|
|
79
|
-
| "pixelize"
|
|
80
|
-
| "polar_function"
|
|
81
|
-
| "randomsquares"
|
|
82
|
-
| "ripple"
|
|
83
|
-
| "rotate_scale_fade"
|
|
84
|
-
| "squareswire"
|
|
85
|
-
| "squeeze"
|
|
86
|
-
| "swap"
|
|
87
|
-
| "undulatingBurnOut"
|
|
88
|
-
| "wind"
|
|
89
|
-
| "windowblinds"
|
|
90
|
-
| "windowslice"
|
|
91
|
-
| "wipeDown"
|
|
92
|
-
| "wipeLeft"
|
|
93
|
-
| "wipeRight"
|
|
94
|
-
| "wipeUp"
|
package/s/timeline/index.ts
CHANGED
|
@@ -4,6 +4,7 @@ export * from "./parts/basics.js"
|
|
|
4
4
|
export * from "./parts/filters.js"
|
|
5
5
|
export * from "./parts/item.js"
|
|
6
6
|
export * from "./parts/media.js"
|
|
7
|
+
export * from "./parts/transitions.js"
|
|
7
8
|
export * from "./parts/resource-pool.js"
|
|
8
9
|
export * from "./parts/resource.js"
|
|
9
10
|
export * from "./parts/filmstrip.js"
|
package/s/timeline/parts/item.ts
CHANGED
|
@@ -3,6 +3,7 @@ import {TextStyleOptions} from "pixi.js"
|
|
|
3
3
|
|
|
4
4
|
import {Id, Hash} from "./basics.js"
|
|
5
5
|
import {Ms} from "../../units/ms.js"
|
|
6
|
+
import type {TransitionName} from "./transitions.js"
|
|
6
7
|
import {Transform, VisualAnimations} from "../types.js"
|
|
7
8
|
import type {FilterParams, FilterType} from "./filters.js"
|
|
8
9
|
import type {Transcription} from "../../features/speech/transcribe/types.js"
|
|
@@ -25,10 +26,6 @@ export enum Kind {
|
|
|
25
26
|
Image
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
export enum Effect {
|
|
29
|
-
Crossfade,
|
|
30
|
-
}
|
|
31
|
-
|
|
32
29
|
export namespace Item {
|
|
33
30
|
export type TextStyle = {
|
|
34
31
|
id: Id
|
|
@@ -142,7 +139,7 @@ export namespace Item {
|
|
|
142
139
|
export type Transition = {
|
|
143
140
|
id: Id
|
|
144
141
|
kind: Kind.Transition
|
|
145
|
-
|
|
142
|
+
name: TransitionName
|
|
146
143
|
duration: number
|
|
147
144
|
}
|
|
148
145
|
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type {Item} from "./item.js"
|
|
2
|
+
|
|
3
|
+
export const transitionNames = [
|
|
4
|
+
"Bounce",
|
|
5
|
+
"BowTieHorizontal",
|
|
6
|
+
"BowTieVertical",
|
|
7
|
+
"ButterflyWaveScrawler",
|
|
8
|
+
"CircleCrop",
|
|
9
|
+
"ColourDistance",
|
|
10
|
+
"CrazyParametricFun",
|
|
11
|
+
"CrossZoom",
|
|
12
|
+
"Directional",
|
|
13
|
+
"DoomScreenTransition",
|
|
14
|
+
"Dreamy",
|
|
15
|
+
"DreamyZoom",
|
|
16
|
+
"GlitchDisplace",
|
|
17
|
+
"GlitchMemories",
|
|
18
|
+
"GridFlip",
|
|
19
|
+
"InvertedPageCurl",
|
|
20
|
+
"LinearBlur",
|
|
21
|
+
"Mosaic",
|
|
22
|
+
"PolkaDotsCurtain",
|
|
23
|
+
"Radial",
|
|
24
|
+
"SimpleZoom",
|
|
25
|
+
"StereoViewer",
|
|
26
|
+
"Swirl",
|
|
27
|
+
"WaterDrop",
|
|
28
|
+
"ZoomInCircles",
|
|
29
|
+
"angular",
|
|
30
|
+
"burn",
|
|
31
|
+
"cannabisleaf",
|
|
32
|
+
"circle",
|
|
33
|
+
"circleopen",
|
|
34
|
+
"colorphase",
|
|
35
|
+
"crosshatch",
|
|
36
|
+
"crosswarp",
|
|
37
|
+
"cube",
|
|
38
|
+
"directionalwarp",
|
|
39
|
+
"directionalwipe",
|
|
40
|
+
"displacement",
|
|
41
|
+
"doorway",
|
|
42
|
+
"fade",
|
|
43
|
+
"fadecolor",
|
|
44
|
+
"fadegrayscale",
|
|
45
|
+
"flyeye",
|
|
46
|
+
"heart",
|
|
47
|
+
"hexagonalize",
|
|
48
|
+
"kaleidoscope",
|
|
49
|
+
"luma",
|
|
50
|
+
"luminance_melt",
|
|
51
|
+
"morph",
|
|
52
|
+
"multiply_blend",
|
|
53
|
+
"perlin",
|
|
54
|
+
"pinwheel",
|
|
55
|
+
"pixelize",
|
|
56
|
+
"polar_function",
|
|
57
|
+
"randomsquares",
|
|
58
|
+
"ripple",
|
|
59
|
+
"rotate_scale_fade",
|
|
60
|
+
"squareswire",
|
|
61
|
+
"squeeze",
|
|
62
|
+
"swap",
|
|
63
|
+
"undulatingBurnOut",
|
|
64
|
+
"wind",
|
|
65
|
+
"windowblinds",
|
|
66
|
+
"windowslice",
|
|
67
|
+
"wipeDown",
|
|
68
|
+
"wipeLeft",
|
|
69
|
+
"wipeRight",
|
|
70
|
+
"wipeUp",
|
|
71
|
+
] as const
|
|
72
|
+
|
|
73
|
+
export type TransitionName = typeof transitionNames[number]
|
|
74
|
+
|
|
75
|
+
export type Transition = {
|
|
76
|
+
name: TransitionName
|
|
77
|
+
label: string
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface TransitionAction {
|
|
81
|
+
(duration: number): Item.Transition
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export type TransitionActions = {
|
|
85
|
+
[TName in TransitionName]: TransitionAction
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export const transitionRegistry = Object.fromEntries(
|
|
89
|
+
transitionNames.map(name => [name, {
|
|
90
|
+
name,
|
|
91
|
+
label: labelizeTransitionName(name),
|
|
92
|
+
}])
|
|
93
|
+
) as Record<TransitionName, Transition>
|
|
94
|
+
|
|
95
|
+
export const transitions = transitionRegistry
|
|
96
|
+
|
|
97
|
+
function labelizeTransitionName(name: string) {
|
|
98
|
+
return name
|
|
99
|
+
.replace(/_/g, " ")
|
|
100
|
+
.replace(/([a-z])([A-Z])/g, "$1 $2")
|
|
101
|
+
.replace(/\b\w/g, letter => letter.toUpperCase())
|
|
102
|
+
}
|
|
@@ -5,6 +5,7 @@ import {O} from "./o.js"
|
|
|
5
5
|
import {Media} from "../parts/media.js"
|
|
6
6
|
import {TimelineFile} from "../parts/basics.js"
|
|
7
7
|
import {FilterAction} from "../parts/filters.js"
|
|
8
|
+
import {TransitionName, transitions} from "../parts/transitions.js"
|
|
8
9
|
import {filters, FilterParams, FilterType} from "../parts/filters.js"
|
|
9
10
|
import {CaptionOptions, CaptionSourceItem} from "../parts/captions.js"
|
|
10
11
|
import {Transcription} from "../../features/speech/transcribe/types.js"
|
|
@@ -20,6 +21,9 @@ type BuildVisualAnimateActions = {
|
|
|
20
21
|
type BuildPresetAnimateActions = {
|
|
21
22
|
[TKey in AnimationPreset]: BuildPresetAnimateAction
|
|
22
23
|
}
|
|
24
|
+
type BuildTransitionActions = {
|
|
25
|
+
[TKey in TransitionName]: (duration: number) => Build<Item.Transition>
|
|
26
|
+
}
|
|
23
27
|
|
|
24
28
|
function createTimeline(): TimelineFile {
|
|
25
29
|
return {
|
|
@@ -226,9 +230,10 @@ export function textStyle(style: TextStyleOptions): Build<Item.TextStyle> {
|
|
|
226
230
|
return o => o.textStyle(style)
|
|
227
231
|
}
|
|
228
232
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
+
function makeTransitionActions(): BuildTransitionActions {
|
|
234
|
+
const entries = Object.keys(transitions)
|
|
235
|
+
.map(key => [key, (duration: number) => (o: O) => o.transition[key as TransitionName](duration)])
|
|
236
|
+
return Object.fromEntries(entries) as BuildTransitionActions
|
|
233
237
|
}
|
|
234
238
|
|
|
239
|
+
export const transition = makeTransitionActions()
|
package/s/timeline/sugar/o.ts
CHANGED
|
@@ -6,8 +6,9 @@ import {Id, TimelineFile} from "../parts/basics.js"
|
|
|
6
6
|
import {FilterAction, FilterActions} from "../parts/filters.js"
|
|
7
7
|
import {filters, FilterParams, FilterType} from "../parts/filters.js"
|
|
8
8
|
import {Transcription} from "../../features/speech/transcribe/types.js"
|
|
9
|
-
import {Crop,
|
|
9
|
+
import {Crop, FilterableItem, Item, Kind, VisualAnimatableItem} from "../parts/item.js"
|
|
10
10
|
import {animationPresets, makeAnimationPresets, visualAnimations} from "../parts/animations/registry.js"
|
|
11
|
+
import {TransitionAction, TransitionActions, transitions, TransitionName} from "../parts/transitions.js"
|
|
11
12
|
import {AnimationPreset, PresetAnimateAction, PresetAnimateActions, PresetAnimation, PresetOptions} from "../parts/animations/types.js"
|
|
12
13
|
import {CaptionAction, CaptionActions, captionDuration, CaptionOptions, CaptionPreset, captionPresets, CaptionSourceItem} from "../parts/captions.js"
|
|
13
14
|
import {Anim, AnimateAction, Interpolation, Keyframes, ScalarAnimation, TrackTransform, Transform, TransformAnimation, TransformOptions, Vec2, VisualAnimationInput, VisualAnimationValue, VisualAnimations} from "../types.js"
|
|
@@ -395,19 +396,27 @@ export class O {
|
|
|
395
396
|
return item
|
|
396
397
|
}
|
|
397
398
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
const item = {
|
|
399
|
+
#makeTransition = (key: TransitionName): TransitionAction => {
|
|
400
|
+
return (duration: number): Item.Transition => {
|
|
401
|
+
const item: Item.Transition = {
|
|
401
402
|
id: this.getId(),
|
|
402
403
|
kind: Kind.Transition,
|
|
403
|
-
|
|
404
|
+
name: transitions[key].name,
|
|
404
405
|
duration,
|
|
405
|
-
}
|
|
406
|
+
}
|
|
406
407
|
this.register(item)
|
|
407
408
|
return item
|
|
408
|
-
}
|
|
409
|
+
}
|
|
409
410
|
}
|
|
410
411
|
|
|
412
|
+
#makeTransitions = (): TransitionActions => {
|
|
413
|
+
const entries = Object.keys(transitions)
|
|
414
|
+
.map(key => [key, this.#makeTransition(key as TransitionName)])
|
|
415
|
+
return Object.fromEntries(entries) as TransitionActions
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
transition = this.#makeTransitions()
|
|
419
|
+
|
|
411
420
|
transform = (options?: TransformOptions): Transform => {
|
|
412
421
|
const position: Vec2 = [
|
|
413
422
|
options?.position?.[0] ?? 0,
|
|
@@ -104,7 +104,7 @@ export default Science.suite({
|
|
|
104
104
|
const transitionDuration = 1000
|
|
105
105
|
const o = new O({timeline: omni.timeline(o => o.sequence(
|
|
106
106
|
o.video(videoA),
|
|
107
|
-
o.transition.
|
|
107
|
+
o.transition.fade(transitionDuration),
|
|
108
108
|
o.video(videoA)
|
|
109
109
|
))})
|
|
110
110
|
const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline)
|
|
@@ -117,7 +117,7 @@ export default Science.suite({
|
|
|
117
117
|
const transitionDuration = 1000
|
|
118
118
|
const o = new O({timeline: omni.timeline(o => o.stack(
|
|
119
119
|
o.video(videoA),
|
|
120
|
-
o.transition.
|
|
120
|
+
o.transition.fade(transitionDuration),
|
|
121
121
|
o.video(videoA)
|
|
122
122
|
))})
|
|
123
123
|
const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline)
|
|
@@ -127,10 +127,10 @@ export default Science.suite({
|
|
|
127
127
|
"ignore invalid transition": test(async () => {
|
|
128
128
|
const {omni, videoA} = await setupTest()
|
|
129
129
|
const o = new O({timeline: omni.timeline(o => o.sequence(
|
|
130
|
-
o.transition.
|
|
130
|
+
o.transition.fade(1000),
|
|
131
131
|
o.video(videoA),
|
|
132
132
|
o.video(videoA),
|
|
133
|
-
o.transition.
|
|
133
|
+
o.transition.fade(1000),
|
|
134
134
|
))})
|
|
135
135
|
const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline)
|
|
136
136
|
expect(timelineDuration).is(videoA.duration * 2)
|
|
@@ -141,7 +141,7 @@ export default Science.suite({
|
|
|
141
141
|
const duration = 3000
|
|
142
142
|
const o = new O({timeline: omni.timeline(o => o.sequence(
|
|
143
143
|
o.video(videoA, {duration}),
|
|
144
|
-
o.transition.
|
|
144
|
+
o.transition.fade(duration * 2),
|
|
145
145
|
o.video(videoA, {duration})
|
|
146
146
|
))})
|
|
147
147
|
const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline)
|
|
@@ -153,9 +153,9 @@ export default Science.suite({
|
|
|
153
153
|
const transitionDuration = 1000
|
|
154
154
|
const o = new O({timeline: omni.timeline(o => o.sequence(
|
|
155
155
|
o.video(videoA),
|
|
156
|
-
o.transition.
|
|
156
|
+
o.transition.fade(transitionDuration),
|
|
157
157
|
o.video(videoA),
|
|
158
|
-
o.transition.
|
|
158
|
+
o.transition.fade(transitionDuration),
|
|
159
159
|
o.video(videoA)
|
|
160
160
|
))})
|
|
161
161
|
const timelineDuration = computeItemDuration(o.timeline.rootId, o.timeline)
|