-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathViewport.pde
140 lines (119 loc) · 2.51 KB
/
Viewport.pde
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
class ViewportList extends ArrayList<Viewport> {
void update() {
for (Viewport vp : this) {
vp.update();
}
}
void display() {
for (Viewport vp : this) {
vp.display();
}
}
}
class Viewport {
int x;
int y;
int w;
int h;
protected PGraphics pg;
Routine routine;
EffectsChain effectsChain;
Viewport(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
effectsChain = new EffectsChain(this);
}
void addEffect(Effect effect) {
effectsChain.add(effect);
}
void update() {
routine.beginDraw();
routine.draw();
routine.endDraw();
effectsChain.update();
}
void display() {
pushStyle();
imageMode(CORNER);
image(pg, x, y, w, h);
popStyle();
effectsChain.displayOverlay();
}
void setRoutine(Routine routine) {
this.routine = routine;
pg = routine.getPG();
effectsChain.updateRoutine();
}
PGraphics getPG() {
return pg;
}
PGraphics getEffectsPG() {
return effectsChain.getPG();
}
}
class ViewportMixer {
int x;
int y;
int w;
int h;
Viewport viewport0;
Viewport viewport1;
int blendMode = ADD;
private float pan = 0.5;
private PGraphics pg;
private PGraphics output;
ViewportMixer(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
pg = createGraphics(360, 360, P2D);
output = createGraphics(Config.STRIPS, Config.LEDS, P2D);
}
void setPan(float value) {
pan = value;
}
PGraphics getPG() {
return pg;
}
void setViewports(Viewport viewport0, Viewport viewport1) {
this.viewport0 = viewport0;
this.viewport1 = viewport1;
}
void update() {
pg.beginDraw();
pg.pushStyle();
pg.background(0);
pg.blendMode(blendMode);
pg.tint(255, 256 * (1.0 - pan));
pg.image(viewport0.getEffectsPG(), 0, 0, pg.width, pg.height);
pg.tint(255, 256 * pan);
pg.image(viewport1.getEffectsPG(), 0, 0, pg.width, pg.height);
pg.popStyle();
pg.endDraw();
createOutput();
}
void display() {
pushStyle();
imageMode(CORNER);
image(pg, x, y, w, h);
popStyle();
}
PGraphics getOutput() {
return output;
}
private void createOutput() {
int w = pg.width;
pg.loadPixels();
output.beginDraw();
output.loadPixels();
for (MapEntry entry : map) {
color c = pg.pixels[entry.x + entry.y * w];
output.pixels[entry.strip + entry.led * Config.STRIPS] = c;
}
output.updatePixels();
output.endDraw();
}
}