class SpaceTime extends SCPattern {
- SinLFO pos = new SinLFO(0, 15, 3000);
+ SinLFO pos = new SinLFO(0, 1, 3000);
SinLFO rate = new SinLFO(1000, 9000, 13000);
SinLFO falloff = new SinLFO(10, 70, 5000);
float angle = 0;
BasicParameter rateParameter = new BasicParameter("RATE", 0.5);
BasicParameter sizeParameter = new BasicParameter("SIZE", 0.5);
+
public SpaceTime(GLucose glucose) {
super(glucose);
+
addModulator(pos).trigger();
addModulator(rate).trigger();
addModulator(falloff).trigger();
int i = 0;
for (Point p : strip.points) {
colors[p.index] = color(
- (lx.getBaseHuef() + 360 - p.fx*.2 + p.fy * .3) % 360,
- constrain(.4 * min(abs(s - sVal1), abs(s - sVal2)), 20, 100),
- max(0, 100 - fVal*abs(i - pVal))
- );
+ (lx.getBaseHuef() + 360 - p.fx*.2 + p.fy * .3) % 360,
+ constrain(.4 * min(abs(s - sVal1), abs(s - sVal2)), 20, 100),
+ max(0, 100 - fVal*abs(i - pVal*(strip.metrics.numPoints - 1)))
+ );
++i;
}
++s;
class Swarm extends SCPattern {
- SawLFO offset = new SawLFO(0, 16, 1000);
+ SawLFO offset = new SawLFO(0, 1, 1000);
SinLFO rate = new SinLFO(350, 1200, 63000);
SinLFO falloff = new SinLFO(15, 50, 17000);
- SinLFO fX = new SinLFO(0, 255, 19000);
- SinLFO fY = new SinLFO(0, 127, 11000);
- SinLFO hOffX = new SinLFO(0, 255, 13000);
+ SinLFO fX = new SinLFO(0, model.xMax, 19000);
+ SinLFO fY = new SinLFO(0, model.yMax, 11000);
+ SinLFO hOffX = new SinLFO(0, model.xMax, 13000);
public Swarm(GLucose glucose) {
super(glucose);
+
addModulator(offset).trigger();
addModulator(rate).trigger();
addModulator(falloff).trigger();
void run(int deltaMs) {
float s = 0;
- for (Strip strip : model.strips) {
+ for (Strip strip : model.strips ) {
int i = 0;
for (Point p : strip.points) {
float fV = max(-1, 1 - dist(p.fx/2., p.fy, fX.getValuef()/2., fY.getValuef()) / 64.);
colors[p.index] = color(
(lx.getBaseHuef() + 0.3 * abs(p.fx - hOffX.getValuef())) % 360,
constrain(80 + 40 * fV, 0, 100),
- constrain(100 - (30 - fV * falloff.getValuef()) * modDist(i + (s*63)%61, offset.getValuef(), 16), 0, 100)
+ constrain(100 - (30 - fV * falloff.getValuef()) * modDist(i + (s*63)%61, (int) (offset.getValuef() * strip.metrics.numPoints), strip.metrics.numPoints), 0, 100)
);
++i;
}
void computeBlend(int[] c1, int[] c2, double progress) {
float bleedf = 10 + bleed.getValuef() * 200.;
- float xPos = (float) (-bleedf + progress * (255. + bleedf));
+ float xPos = (float) (-bleedf + progress * (model.xMax + bleedf));
for (Point p : model.points) {
float d = (p.fx - xPos) / bleedf;
if (d < 0) {
float clrConst = 1.1 + clr.getValuef();
for (Point p : model.points) {
- float avgIndex = constrain((p.fx / 256. * avgSize), 0, avgSize-2);
+ float avgIndex = constrain((p.fx / model.xMax * avgSize), 0, avgSize-2);
int avgFloor = (int) avgIndex;
- float j = jBase + jConst * (p.fy / 128.);
+ float j = jBase + jConst * (p.fy / model.yMax);
float value = lerp(
this.bandVals[avgFloor].getValuef(),
this.bandVals[avgFloor+1].getValuef(),
final BasicParameter bright = new BasicParameter("BRT", 1.0);
final BasicParameter sat = new BasicParameter("SAT", 0.2);
List<Layer> layers = new ArrayList<Layer>();
- final float maxr = sqrt(127*127 + 127*127 + 255*255) + 10;
+ final float maxr = sqrt(model.xMax*model.xMax + model.yMax*model.yMax + model.zMax*model.zMax) + 10;
class Layer {
LinearEnvelope boom = new LinearEnvelope(-40, 500, 1300);
for (Point p : model.points) {
colors[p.index] = blendColor(
colors[p.index],
- color(huev, satv, constrain(brightv - falloffv*abs(boom.getValuef() - dist(p.fx, 2*p.fy, 2*p.fz, 128, 128, 128)), 0, 100)),
+ color(huev, satv, constrain(brightv - falloffv*abs(boom.getValuef() - dist(p.fx, 2*p.fy, 3*p.fz, model.xMax/2, model.yMax, model.zMax*1.5)), 0, 100)),
ADD);
}
}
for (Cube c : model.cubes) {
float v = max(getBase(i).getValuef() * levelf/4., getEnvelope(i++).getValuef());
setColor(c, color(
- (huef + 20*v + abs(c.fx-128.)*.3 + c.fy) % 360,
+ (huef + 20*v + abs(c.cx-model.xMax/2.)*.3 + c.cy) % 360,
min(100, 120*v),
100*v
));
class CrossSections extends SCPattern {
- final SinLFO x = new SinLFO(0, 255, 5000);
- final SinLFO y = new SinLFO(0, 127, 6000);
- final SinLFO z = new SinLFO(0, 127, 7000);
+ final SinLFO x = new SinLFO(0, model.xMax, 5000);
+ final SinLFO y = new SinLFO(0, model.yMax, 6000);
+ final SinLFO z = new SinLFO(0, model.zMax, 7000);
final BasicParameter xw = new BasicParameter("XWID", 0.3);
final BasicParameter yw = new BasicParameter("YWID", 0.3);
color c = 0;
c = blendColor(c, color(
(lx.getBaseHuef() + p.fx/10 + p.fy/3) % 360,
- constrain(140 - 1.1*abs(p.fx - 127), 0, 100),
+ constrain(140 - 1.1*abs(p.fx - model.xMax/2.), 0, 100),
max(0, xlv - xwv*abs(p.fx - xv))
), ADD);
c = blendColor(c, color(
(lx.getBaseHuef() + 80 + p.fy/10) % 360,
- constrain(140 - 2.2*abs(p.fy - 64), 0, 100),
+ constrain(140 - 2.2*abs(p.fy - model.yMax/2.), 0, 100),
max(0, ylv - ywv*abs(p.fy - yv))
), ADD);
c = blendColor(c, color(
(lx.getBaseHuef() + 160 + p.fz / 10 + p.fy/2) % 360,
- constrain(140 - 2.2*abs(p.fz - 64), 0, 100),
+ constrain(140 - 2.2*abs(p.fz - model.zMax/2.), 0, 100),
max(0, zlv - zwv*abs(p.fz - zv))
), ADD);
colors[p.index] = c;
}
}
}
+
+class AskewPlanes extends SCPattern {
+
+ class Plane {
+ private final SinLFO a;
+ private final SinLFO b;
+ private final SinLFO c;
+ float av = 1;
+ float bv = 1;
+ float cv = 1;
+ float denom = 0.1;
+
+ Plane(int i) {
+ addModulator(a = new SinLFO(-1, 1, 4000 + 1029*i)).trigger();
+ addModulator(b = new SinLFO(-1, 1, 11000 - 1104*i)).trigger();
+ addModulator(c = new SinLFO(-50, 50, 4000 + 1000*i * ((i % 2 == 0) ? 1 : -1))).trigger();
+ }
+
+ void run(int deltaMs) {
+ av = a.getValuef();
+ bv = b.getValuef();
+ cv = c.getValuef();
+ denom = sqrt(av*av + bv*bv);
+ }
+ }
+
+ final Plane[] planes;
+ final int NUM_PLANES = 3;
+
+ AskewPlanes(GLucose glucose) {
+ super(glucose);
+ planes = new Plane[NUM_PLANES];
+ for (int i = 0; i < planes.length; ++i) {
+ planes[i] = new Plane(i);
+ }
+ }
+
+ public void run(int deltaMs) {
+ float huev = lx.getBaseHuef();
+
+ // This is super fucking bizarre. But if this is a for loop, the framerate
+ // tanks to like 30FPS, instead of 60. Call them manually and it works fine.
+ // Doesn't make ANY sense... there must be some weird side effect going on
+ // with the Processing internals perhaps?
+// for (Plane plane : planes) {
+// plane.run(deltaMs);
+// }
+ planes[0].run(deltaMs);
+ planes[1].run(deltaMs);
+ planes[2].run(deltaMs);
+
+ for (Point p : model.points) {
+ float d = MAX_FLOAT;
+ for (Plane plane : planes) {
+ if (plane.denom != 0) {
+ d = min(d, abs(plane.av*(p.fx-model.cx) + plane.bv*(p.fy-model.cy) + plane.cv) / plane.denom);
+ }
+ }
+ colors[p.index] = color(
+ (huev + abs(p.fx-model.cx)*.3 + p.fy*.8) % 360,
+ max(0, 100 - .8*abs(p.fx - model.cx)),
+ constrain(140 - 10.*d, 0, 100)
+ );
+ }
+ }
+}
+
+class ShiftingPlane extends SCPattern {
+
+ final SinLFO a = new SinLFO(-.2, .2, 5300);
+ final SinLFO b = new SinLFO(1, -1, 13300);
+ final SinLFO c = new SinLFO(-1.4, 1.4, 5700);
+ final SinLFO d = new SinLFO(-10, 10, 9500);
+
+ ShiftingPlane(GLucose glucose) {
+ super(glucose);
+ addModulator(a).trigger();
+ addModulator(b).trigger();
+ addModulator(c).trigger();
+ addModulator(d).trigger();
+ }
+
+ public void run(int deltaMs) {
+ float hv = lx.getBaseHuef();
+ float av = a.getValuef();
+ float bv = b.getValuef();
+ float cv = c.getValuef();
+ float dv = d.getValuef();
+ float denom = sqrt(av*av + bv*bv + cv*cv);
+ for (Point p : model.points) {
+ float d = abs(av*(p.fx-model.cx) + bv*(p.fy-model.cy) + cv*(p.fz-model.cz) + dv) / denom;
+ colors[p.index] = color(
+ (hv + abs(p.fx-model.cx)*.6 + abs(p.fy-model.cy)*.9 + abs(p.fz - model.cz)) % 360,
+ constrain(110 - d*6, 0, 100),
+ constrain(130 - 7*d, 0, 100)
+ );
+ }
+ }
+}
+