From 2b6688e8e11d5421ec83f1c03efb6eb05508cc7b Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Tue, 28 May 2013 22:08:17 -0500 Subject: [PATCH] Change animation level coordinates to x->left-to-right, y->top-to-bottom, z->front-to-back --- MarkSlee.pde | 88 +++++++++++++++++++++++------------------------ SugarCubes.pde | 14 ++++---- TestPatterns.pde | 4 +-- code/GLucose.jar | Bin 12899 -> 12854 bytes 4 files changed, 52 insertions(+), 54 deletions(-) diff --git a/MarkSlee.pde b/MarkSlee.pde index ed1fc5a..76d2aef 100644 --- a/MarkSlee.pde +++ b/MarkSlee.pde @@ -39,7 +39,7 @@ class SpaceTime extends SCPattern { int i = 0; for (Point p : strip.points) { colors[p.index] = color( - (lx.getBaseHuef() + 360 - p.fy*.2 + p.fz * .3) % 360, + (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)) ); @@ -55,18 +55,18 @@ class Swarm extends SCPattern { SawLFO offset = new SawLFO(0, 16, 1000); SinLFO rate = new SinLFO(350, 1200, 63000); SinLFO falloff = new SinLFO(15, 50, 17000); - SinLFO fY = new SinLFO(0, 250, 19000); - SinLFO fZ = new SinLFO(0, 127, 11000); - SinLFO hOffY = new SinLFO(0, 255, 13000); + SinLFO fX = new SinLFO(0, 255, 19000); + SinLFO fY = new SinLFO(0, 127, 11000); + SinLFO hOffX = new SinLFO(0, 255, 13000); public Swarm(GLucose glucose) { super(glucose); addModulator(offset).trigger(); addModulator(rate).trigger(); addModulator(falloff).trigger(); + addModulator(fX).trigger(); addModulator(fY).trigger(); - addModulator(fZ).trigger(); - addModulator(hOffY).trigger(); + addModulator(hOffX).trigger(); offset.modulateDurationBy(rate); } @@ -86,9 +86,9 @@ class Swarm extends SCPattern { for (Strip strip : Strip.list) { int i = 0; for (Point p : strip.points) { - float fV = max(-1, 1 - dist(p.fy/2., p.fz, fY.getValuef()/2., fZ.getValuef()) / 64.); + 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.fy - hOffY.getValuef())) % 360, + (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) ); @@ -111,16 +111,14 @@ class SwipeTransition extends SCTransition { void computeBlend(int[] c1, int[] c2, double progress) { float bleedf = 10 + bleed.getValuef() * 200.; - float yPos = (float) (-bleedf + progress * (255. + bleedf)); + float xPos = (float) (-bleedf + progress * (255. + bleedf)); for (Point p : Point.list) { - float d = (p.fy - yPos) / bleedf; + float d = (p.fx - xPos) / bleedf; if (d < 0) { colors[p.index] = c2[p.index]; - } - else if (d > 1) { + } else if (d > 1) { colors[p.index] = c1[p.index]; - } - else { + } else { colors[p.index] = lerpColor(c2[p.index], c1[p.index], d, RGB); } } @@ -187,9 +185,9 @@ class CubeEQ extends SCPattern { float clrConst = 1.1 + clr.getValuef(); for (Point p : Point.list) { - float avgIndex = constrain((p.fy / 256. * avgSize), 0, avgSize-2); + float avgIndex = constrain((p.fx / 256. * avgSize), 0, avgSize-2); int avgFloor = (int) avgIndex; - float j = jBase + jConst * (p.fz / 128.); + float j = jBase + jConst * (p.fy / 128.); float value = lerp( this.bandVals[avgFloor].getValuef(), this.bandVals[avgFloor+1].getValuef(), @@ -198,7 +196,7 @@ class CubeEQ extends SCPattern { float b = constrain(edgeConst * (value - j), 0, 100); colors[p.index] = color( - (480 + lx.getBaseHuef() - min(clrConst*p.fz, 120)) % 360, + (480 + lx.getBaseHuef() - min(clrConst*p.fy, 120)) % 360, 100, b); } @@ -212,6 +210,7 @@ class BoomEffect extends SCEffect { final BasicParameter bright = new BasicParameter("BRT", 1.0); final BasicParameter sat = new BasicParameter("SAT", 0.2); List layers = new ArrayList(); + final float maxr = sqrt(127*127 + 127*127 + 255*255) + 10; class Layer { LinearEnvelope boom = new LinearEnvelope(-40, 500, 1300); @@ -223,7 +222,7 @@ class BoomEffect extends SCEffect { void trigger() { float falloffv = falloffv(); - boom.setRange(-100 / falloffv, 500 + 100/falloffv, 4000 - speed.getValuef() * 3300); + boom.setRange(-100 / falloffv, maxr + 100/falloffv, 4000 - speed.getValuef() * 3300); boom.trigger(); } @@ -235,7 +234,7 @@ class BoomEffect extends SCEffect { for (Point p : Point.list) { colors[p.index] = blendColor( colors[p.index], - color(huev, satv, constrain(brightv - falloffv*abs(boom.getValuef() - dist(2*p.fx, 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, 2*p.fz, 128, 128, 128)), 0, 100)), ADD); } } @@ -336,7 +335,7 @@ public class PianoKeyPattern extends SCPattern { for (Cube c : Cube.list) { float v = max(getBase(i).getValuef() * levelf/4., getEnvelope(i++).getValuef()); setColor(c, color( - (huef + 20*v + abs(c.fy-128.)*.3 + c.fz) % 360, + (huef + 20*v + abs(c.fx-128.)*.3 + c.fy) % 360, min(100, 120*v), 100*v )); @@ -346,19 +345,19 @@ public class PianoKeyPattern extends SCPattern { class CrossSections extends SCPattern { - final SinLFO y = new SinLFO(0, 255, 5000); - final SinLFO z = new SinLFO(0, 127, 6000); - final SinLFO x = new SinLFO(0, 127, 7000); + 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 BasicParameter xw = new BasicParameter("XWID", 0.3); final BasicParameter yw = new BasicParameter("YWID", 0.3); final BasicParameter zw = new BasicParameter("ZWID", 0.3); - final BasicParameter xr = new BasicParameter("XRAT", 0.5); + final BasicParameter xr = new BasicParameter("XRAT", 0.7); final BasicParameter yr = new BasicParameter("YRAT", 0.6); - final BasicParameter zr = new BasicParameter("ZRAT", 0.7); - final BasicParameter xl = new BasicParameter("XLEV", 0.5); + final BasicParameter zr = new BasicParameter("ZRAT", 0.5); + final BasicParameter xl = new BasicParameter("XLEV", 1); final BasicParameter yl = new BasicParameter("YLEV", 1); - final BasicParameter zl = new BasicParameter("ZLEV", 1); + final BasicParameter zl = new BasicParameter("ZLEV", 0.5); CrossSections(GLucose glucose) { @@ -369,23 +368,22 @@ class CrossSections extends SCPattern { addParameter(xr); addParameter(yr); addParameter(zr); - addParameter(yw); + addParameter(xw); addParameter(xl); addParameter(yl); addParameter(zl); - addParameter(zw); - addParameter(xw); + addParameter(yw); + addParameter(zw); } void onParameterChanged(LXParameter p) { if (p == xr) { - x.setDuration(10000 - 9000*p.getValuef()); + x.setDuration(10000 - 8800*p.getValuef()); } else if (p == yr) { - y.setDuration(10000 - 8800*p.getValuef()); + y.setDuration(10000 - 9000*p.getValuef()); } else if (p == zr) { z.setDuration(10000 - 9000*p.getValuef()); } - } public void run(int deltaMs) { @@ -403,19 +401,19 @@ class CrossSections extends SCPattern { for (Point p : Point.list) { color c = 0; c = blendColor(c, color( - (lx.getBaseHuef() + p.fy/10 + p.fz/3) % 360, - constrain(140 - 1.1*abs(p.fy - 127), 0, 100), - max(0, ylv - ywv*abs(p.fy - yv)) + (lx.getBaseHuef() + p.fx/10 + p.fy/3) % 360, + constrain(140 - 1.1*abs(p.fx - 127), 0, 100), + max(0, xlv - xwv*abs(p.fx - xv)) ), ADD); c = blendColor(c, color( - (lx.getBaseHuef() + 80 + p.fz/10) % 360, - constrain(140 - 2.2*abs(p.fz - 64), 0, 100), - max(0, zlv - zwv*abs(p.fz - zv)) + (lx.getBaseHuef() + 80 + p.fy/10) % 360, + constrain(140 - 2.2*abs(p.fy - 64), 0, 100), + max(0, ylv - ywv*abs(p.fy - yv)) ), ADD); c = blendColor(c, color( - (lx.getBaseHuef() + 160 + p.fx / 10 + p.fz/2) % 360, - constrain(140 - 2.2*abs(p.fx - 64), 0, 100), - max(0, xlv - xwv*abs(p.fx - xv)) + (lx.getBaseHuef() + 160 + p.fz / 10 + p.fy/2) % 360, + constrain(140 - 2.2*abs(p.fz - 64), 0, 100), + max(0, zlv - zwv*abs(p.fz - zv)) ), ADD); colors[p.index] = c; } @@ -449,9 +447,9 @@ class Blinders extends SCPattern { float mv = m[si % m.length].getValuef(); for (Point p : strip.points) { colors[p.index] = color( - (hv + p.fx + p.fz*hs.getValuef()) % 360, - min(100, abs(p.fy - s.getValuef())/2.), - max(0, 100 - mv * abs(i - 7.5)) + (hv + p.fz + p.fy*hs.getValuef()) % 360, + min(100, abs(p.fx - s.getValuef())/2.), + max(0, 100 - mv/2. - mv * abs(i - 7.5)) ); ++i; } diff --git a/SugarCubes.pde b/SugarCubes.pde index c6b8834..ed2cf6d 100644 --- a/SugarCubes.pde +++ b/SugarCubes.pde @@ -25,18 +25,18 @@ LXPattern[] patterns(GLucose glucose) { return new LXPattern[] { - new Swarm(glucose), - new SpaceTime(glucose), - new Blinders(glucose), - new CrossSections(glucose), - new CubeEQ(glucose), - new PianoKeyPattern(glucose), +// new Swarm(glucose), +// new SpaceTime(glucose), +// new Blinders(glucose), +// new CrossSections(glucose), +// new CubeEQ(glucose), +// new PianoKeyPattern(glucose), // Basic test patterns for reference, not art // new TestHuePattern(glucose), // new TestXPattern(glucose), // new TestYPattern(glucose), -// new TestZPattern(glucose), + new TestZPattern(glucose), }; } diff --git a/TestPatterns.pde b/TestPatterns.pde index f54e888..04c2c73 100644 --- a/TestPatterns.pde +++ b/TestPatterns.pde @@ -10,7 +10,7 @@ class TestHuePattern extends SCPattern { } class TestXPattern extends SCPattern { - private SinLFO xPos = new SinLFO(0, 127, 4000); + private SinLFO xPos = new SinLFO(0, 255, 4000); public TestXPattern(GLucose glucose) { super(glucose); addModulator(xPos).trigger(); @@ -27,7 +27,7 @@ class TestXPattern extends SCPattern { } class TestYPattern extends SCPattern { - private SinLFO yPos = new SinLFO(0, 255, 4000); + private SinLFO yPos = new SinLFO(0, 127, 4000); public TestYPattern(GLucose glucose) { super(glucose); addModulator(yPos).trigger(); diff --git a/code/GLucose.jar b/code/GLucose.jar index 74084b63edd715547e06d82c6584b0cb25eb3dc1..13bc6cfbe03b53a550b90e4a01762d0d22d230a1 100644 GIT binary patch delta 7291 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