/
AnimationInstanceRainbow.ts
59 lines (52 loc) · 1.89 KB
/
AnimationInstanceRainbow.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
import { AnimationFlagsValues } from "./AnimationFlags";
import AnimationInstance from "./AnimationInstance";
import AnimationRainbow from "./AnimationRainbow";
import { Color32Utils } from "../color";
/**
* @category Animation Instance
*/
export default class AnimationInstanceRainbow extends AnimationInstance {
get preset(): AnimationRainbow {
return this.animationPreset as AnimationRainbow;
}
updateLEDs(ms: number, retIndices: number[], retColors32: number[]): number {
const preset = this.preset;
const ledCount = this.die.ledCount;
// Compute color
let color = 0;
const fadeTime = (preset.duration * preset.fade) / (255 * 2);
const time = ms - this.startTime;
const wheelPos = ((time * preset.count * 255) / preset.duration) % 256;
let intensity = preset.intensity;
if (time <= fadeTime) {
// Ramp up
intensity = (time * preset.intensity) / fadeTime;
} else if (time >= preset.duration - fadeTime) {
// Ramp down
intensity = ((preset.duration - time) * preset.intensity) / fadeTime;
}
// Fill the indices and colors for the anim controller to know how to update LEDs
let retCount = 0;
if (preset.animFlags & AnimationFlagsValues.traveling) {
for (let i = 0; i < ledCount; ++i) {
if ((preset.faceMask & (1 << i)) !== 0) {
retIndices[retCount] = i;
retColors32[retCount] = Color32Utils.rainbowWheel(
(wheelPos + (i * 256 * preset.cyclesTimes10) / (ledCount * 10)) %
256,
intensity
);
retCount++;
}
}
} else {
// All LEDs same color
color = Color32Utils.rainbowWheel(wheelPos, intensity);
retCount = this.setColor(color, preset.faceMask, retIndices, retColors32);
}
return retCount;
}
stop(retIndices: number[]): number {
return this.setIndices(this.preset.faceMask, retIndices);
}
}