-
Notifications
You must be signed in to change notification settings - Fork 0
/
EditPattern.ts
69 lines (62 loc) · 1.8 KB
/
EditPattern.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import {
AnimationBits,
Track,
RgbTrack,
} from "@systemic-games/pixels-core-animation";
import { safeAssign } from "@systemic-games/pixels-core-utils";
import EditDataSet from "./EditDataSet";
import EditRgbGradient from "./EditRgbGradient";
import Editable from "./Editable";
import { observable } from "./decorators";
export default class EditPattern extends Editable {
@observable
gradients: EditRgbGradient[];
get duration(): number {
return this.gradients.length
? Math.max(...this.gradients.map((g) => g.duration))
: 1;
}
constructor(opt?: {
uuid?: string;
name?: string;
gradients?: EditRgbGradient[];
}) {
super(opt);
this.gradients = opt?.gradients ?? [];
}
toRgbTracks(editSet: EditDataSet, bits: AnimationBits): RgbTrack[] {
return this.gradients.map((gradient, i) => {
// Add the keyframes
const keyframesOffset = bits.rgbKeyframes.length;
bits.rgbKeyframes.push(
...gradient.keyframes.map((kf) => kf.toRgbKeyframe(editSet, bits))
);
return safeAssign(new RgbTrack(), {
keyframesOffset,
keyFrameCount: gradient.keyframes.length,
ledMask: 1 << i,
});
});
}
toTracks(editSet: EditDataSet, bits: AnimationBits): Track[] {
return this.gradients.map((gradient, i) => {
// Add the keyframes
const keyframesOffset = bits.keyframes.length;
bits.keyframes.push(
...gradient.keyframes.map((kf) => kf.toKeyframe(editSet, bits))
);
return safeAssign(new Track(), {
keyframesOffset,
keyFrameCount: gradient.keyframes.length,
ledMask: 1 << i,
});
});
}
duplicate(uuid?: string): EditPattern {
return new EditPattern({
...this,
uuid,
gradients: this.gradients.map((g) => g.duplicate()),
});
}
}