From 2bb5682284f70c5788cbfcb9cba3c7bf66a104b6 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Wed, 13 Nov 2013 02:26:31 -0800 Subject: [PATCH] New GLucose/HeronLX, LXPoint and LXModel now core classes --- AlexGreen.pde | 14 ++++----- ArjunBanker.pde | 8 ++--- BenMorrow.pde | 8 ++--- DanHorwitz.pde | 2 +- DanKaminsky.pde | 6 ++-- DanUtil.pde | 14 ++++----- GranimPattern.pde | 2 +- JR.pde | 8 ++--- JackStahl.pde | 6 ++-- MarkSlee.pde | 49 ++++++++++++++--------------- ShaheenGandhi.pde | 2 +- SugarCubes.pde | 2 -- TestPatterns.pde | 77 ++++++++-------------------------------------- TimBavaro.pde | 50 +++++++++++++++--------------- TobySegaran.pde | 12 ++++---- _DebugUI.pde | 10 +++--- _Internals.pde | 6 ++-- _Mappings.pde | 4 +-- _PandaDriver.pde | 2 +- code/GLucose.jar | Bin 25174 -> 31139 bytes code/HeronLX.jar | Bin 87119 -> 88036 bytes 21 files changed, 114 insertions(+), 168 deletions(-) diff --git a/AlexGreen.pde b/AlexGreen.pde index 91677db..b89aaa2 100644 --- a/AlexGreen.pde +++ b/AlexGreen.pde @@ -136,17 +136,17 @@ final Sphery[] spherys; //spherys[1].run(deltaMs); //spherys[2].run(deltaMs); //spherys[3].run(deltaMs);] - sinespin.reset(model) + sinespin.reset() // Translate so the center of the car is the origin, offset by yPos - .translateCenter(model, 0, 0, 0) + .center() // Rotate around the origin (now the center of the car) about an X-vector .rotate(yrot.getValuef(), 0, 1, 0); - for (Point p: model.points){ + for (LXPoint p : model.points){ color c = 0; c = blendColor(c, spherys[1].spheryvalue(p.x, p.y, p.z, .75*model.xMax, model.yMax/2, model.zMax/2), ADD); c = blendColor(c, spherys[0].spheryvalue(p.x, p.y, p.z, model.xMax/4, model.yMax/4, model.zMax/2), ADD); @@ -242,7 +242,7 @@ float cfloor = c.y; // if (i%3 == 0){ -// for (Point p : c.points ){ +// for (LXPoint p : c.points ){ // // colors[p.index]=color(0,0,0); // //float dif = (p.y - c.y); // //colors[p.index] = color( bg.getValuef() , 80 , dif < curl.getValuef() ? 80 : 0, ADD); @@ -251,7 +251,7 @@ float cfloor = c.y; // else if (i%3 == 1) { -// for (Point p: c.points){ +// for (LXPoint p: c.points){ // colors[p.index]=color(0,0,0); // float dif = (p.y - c.y); // // colors[p.index] = @@ -262,7 +262,7 @@ float cfloor = c.y; // } // else if (i%3 == 2){ // centerlist[i].sub(cubeorigin(i); - for (Point p: c.points) { + for (LXPoint p: c.points) { PVector pv = new PVector(p.x, p.y, p.z); colors[p.index] =color( constrain(4* pv.dist(centerlist.get(i)), 0, 360) , 50, 100 ); // colors[p.index] =color(constrain(centerlist[i].x, 0, 360), constrain(centerlist[i].y, 0, 100), ); @@ -290,7 +290,7 @@ HueTestHSB(GLucose glucose) { } void run(double deltaMs){ - for (Point p : model.points) { + for (LXPoint p : model.points) { color c = 0; c = blendColor(c, lx.hsb(360*HueT.getValuef(), 100*SatT.getValuef(), 100*BriT.getValuef()), ADD); colors[p.index]= c; diff --git a/ArjunBanker.pde b/ArjunBanker.pde index c8fe1a6..4709bdc 100644 --- a/ArjunBanker.pde +++ b/ArjunBanker.pde @@ -15,7 +15,7 @@ class TelevisionStatic extends SCPattern { void run(double deltaMs) { boolean d = direction.getValuef() > 5.0; - for (Point p : model.points) { + for (LXPoint p : model.points) { colors[p.index] = lx.hsb((lx.getBaseHuef() + random(hueParameter.getValuef() * 360))%360, random(saturationParameter.getValuef() * 100), random(brightParameter.getValuef() * 100)); } } @@ -38,7 +38,7 @@ class AbstractPainting extends SCPattern { } void run(double deltaMs) { - for (Point p : model.points) { + for (LXPoint p : model.points) { color c = img.get((int)((p.x / model.xMax) * img.width), img.height - (int)((p.y / model.yMax) * img.height)); colors[p.index] = lx.hsb(hue(c) + colorMod.getValuef()%360, saturation(c), brightness(c) - ((p.z - brightMod.getValuef())/p.z)); } @@ -55,7 +55,7 @@ class Spirality extends SCPattern { Spirality(GLucose glucose) { super(glucose); addParameter(r); - for (Point p : model.points) { + for (LXPoint p : model.points) { colors[p.index] = lx.hsb(0, 0, 0); } } @@ -65,7 +65,7 @@ class Spirality extends SCPattern { rad += deltaMs * .025 * direction; float x = model.xMax / 2 + cos(angle) * rad; float y = model.yMax / 2 + sin(angle) * rad; - for (Point p : model.points) { + for (LXPoint p : model.points) { float b = dist(x,y,p.x,p.y); if (b < 90) { colors[p.index] = blendColor( diff --git a/BenMorrow.pde b/BenMorrow.pde index 7024148..51945a8 100644 --- a/BenMorrow.pde +++ b/BenMorrow.pde @@ -59,7 +59,7 @@ class TowerParams extends SCPattern for(int i=0; i> 12; diff --git a/DanKaminsky.pde b/DanKaminsky.pde index 4021d07..f16c0bd 100644 --- a/DanKaminsky.pde +++ b/DanKaminsky.pde @@ -174,10 +174,10 @@ class OSC_Balls extends OSCPattern { } void run(double deltaMs){ - for(Point p: model.points){ colors[p.index]=0; } + for(LXPoint p: model.points){ colors[p.index]=0; } for(int i=1; i x-4 && p.y < y+4 && p.y > y-4) { colors[p.index] = #FF0000; } @@ -207,7 +207,7 @@ import processing.serial.*; pret.pixels = ss.getScreenShotJNI2(x, y, w, h); //for(int i=0; i= b && a <= c; } float interp (float a, float b, float c) { return (1-a)*b + a*c; } float randctr (float a) { return random(a) - a*.5; } float min (float a, float b, float c, float d) { return min(min(a,b),min(c,d)); } -float pointDist(Point p1, Point p2) { return dist(p1.x,p1.y,p1.z,p2.x,p2.y,p2.z); } -float xyDist (Point p1, Point p2) { return dist(p1.x,p1.y,p2.x,p2.y); } +float pointDist(LXPoint p1, LXPoint p2) { return dist(p1.x,p1.y,p1.z,p2.x,p2.y,p2.z); } +float xyDist (LXPoint p1, LXPoint p2) { return dist(p1.x,p1.y,p2.x,p2.y); } float distToSeg(float x, float y, float x1, float y1, float x2, float y2) { float A = x - x1, B = y - y1, C = x2 - x1, D = y2 - y1; float dot = A * C + B * D, len_sq = C * C + D * D; @@ -79,7 +79,7 @@ public class DPat extends SCPattern float interpWv(float i, float[] vals) { return interp(i-floor(i), vals[floor(i)], vals[ceil(i)]); } void setNorm (PVector vec) { vec.set(vec.x/mMax.x, vec.y/mMax.y, vec.z/mMax.z); } void setRand (PVector vec) { vec.set(random(mMax.x), random(mMax.y), random(mMax.z)); } - void setVec (PVector vec, Point p) { vec.set(p.x, p.y, p.z); } + void setVec (PVector vec, LXPoint p) { vec.set(p.x, p.y, p.z); } void interpolate(float i, PVector a, PVector b) { a.set(interp(i,a.x,b.x), interp(i,a.y,b.y), interp(i,a.z,b.z)); } void StartRun(double deltaMs) { } float val (BasicParameter p) { return p.getValuef(); } @@ -211,7 +211,7 @@ public class DPat extends SCPattern xWaveNz[i] = wvAmp * (noise(i/(mMax.y*.3)-(1e3+NoiseMove)/1500.) - .5) * (mMax.x/2.); } - for (Point p : model.points) { nPoint++; + for (LXPoint p : model.points) { nPoint++; setVec(P,p); P.sub(modmin); P.sub(pTrans); @@ -248,8 +248,8 @@ class dVertex { int dir, ci; // dir -- 1 or -1. // ci -- color index - dVertex(Strip _s, Point _p) { s = _s; ci = _p.index; } - Point getPoint(int i) { return s.points.get(dir>0 ? i : 15-i); } + dVertex(Strip _s, LXPoint _p) { s = _s; ci = _p.index; } + LXPoint getPoint(int i) { return s.points.get(dir>0 ? i : 15-i); } void setOpp(dVertex _opp) { opp = _opp; dir = (ci < opp.ci ? 1 : -1); } } //---------------------------------------------------------------------------------------------------------------------------------- @@ -262,7 +262,7 @@ class dLattice { if (v0.t3 == null) { v0.t3=t; return; } } float dist2 (Strip s1, int pos1, Strip s2, int pos2) { return pointDist(s1.points.get(pos1), s2.points.get(pos2)); } - float pd2 (Point p1, float x, float y, float z) { return dist(p1.x,p1.y,p1.z,x,y,z); } + float pd2 (LXPoint p1, float x, float y, float z) { return dist(p1.x,p1.y,p1.z,x,y,z); } boolean sameSame (Strip s1, Strip s2) { return max(dist2(s1, 0, s2, 0), dist2(s1,15, s2,15)) < 5 ; } // same strut, same direction boolean sameOpp (Strip s1, Strip s2) { return max(dist2(s1, 0, s2,15), dist2(s1,15, s2,0 )) < 5 ; } // same strut, opp direction boolean sameBar (Strip s1, Strip s2) { return sameSame(s1,s2) || sameOpp(s1,s2); } // 2 strips on same strut diff --git a/GranimPattern.pde b/GranimPattern.pde index 450c17e..da4c78f 100644 --- a/GranimPattern.pde +++ b/GranimPattern.pde @@ -109,7 +109,7 @@ class GranimPattern extends SCPattern { ((Granim) g).update(); } - List drawList = model.points.subList(Math.min(g.position,colors.length-1), Math.min(g.position + g.width(),colors.length-1)); + List drawList = model.points.subList(Math.min(g.position,colors.length-1), Math.min(g.position + g.width(),colors.length-1)); //println("drawlistsize "+drawList.size()); gbuffer = g.graphicBuffer.toArray(new Integer[0]); diff --git a/JR.pde b/JR.pde index 6692baa..cb8ba63 100644 --- a/JR.pde +++ b/JR.pde @@ -75,9 +75,9 @@ class Gimbal extends SCPattern { Ring ring2 = new Ring((hue + hue_delta * 1) % 360, radius2, girth); Ring ring3 = new Ring((hue + hue_delta * 2) % 360, radius3, girth); - projection.reset(model) + projection.reset() // Translate so the center of the car is the origin - .translateCenter(model, 0, 0, 0); + .center(); for (Coord c : projection) { //if (first_run) println(c.x + "," + c.y + "," + c.z); @@ -191,9 +191,9 @@ class Zebra extends SCPattern { float b = (millis() / 1200.f) % (2 * PI); float g = (millis() / 1600.f) % (2 * PI); - projection.reset(model) + projection.reset() // Translate so the center of the car is the origin - .translateCenter(model, 0, 0, 0); + .center(); for (Coord c : projection) { // rotate3d(c, a, b, g); diff --git a/JackStahl.pde b/JackStahl.pde index 081ea40..dd60db7 100644 --- a/JackStahl.pde +++ b/JackStahl.pde @@ -46,10 +46,10 @@ class Swim extends SCPattern { float denominator = max(xAngle.getValuef() + yAngle.getValuef() + zAngle.getValuef(), 1); - projection.reset(model) + projection.reset() // Swim around the world .rotate(rotation.getValuef(), xAngle.getValuef() / denominator, yAngle.getValuef() / denominator, zAngle.getValuef() / denominator) - .translateCenter(model, 0, 50 + yPos.getValuef(), 0); + .translateCenter(0, 50 + yPos.getValuef(), 0); float model_height = model.yMax - model.yMin; float model_width = model.xMax - model.xMin; @@ -157,7 +157,7 @@ class Balance extends SCPattern { float phase = phaseLFO.getValuef(); float crazy_factor = crazyParam.getValuef() / 0.2; - projection.reset(model) + projection.reset() .rotate(rotationZ.getValuef() * crazy_factor, 0, 1, 0) .rotate(rotationX.getValuef() * crazy_factor, 0, 0, 1) .rotate(rotationY.getValuef() * crazy_factor, 0, 1, 0); diff --git a/MarkSlee.pde b/MarkSlee.pde index 4a37206..dcf35a5 100644 --- a/MarkSlee.pde +++ b/MarkSlee.pde @@ -45,7 +45,7 @@ class Cathedrals extends SCPattern { float sf = 100. / (70 - 69.9*sat.getValuef()); - for (Point p : model.points) { + for (LXPoint p : model.points) { float d = MAX_FLOAT; if (p.y > model.cy) { arm = tarm; @@ -109,7 +109,7 @@ class MidiMusic extends SCPattern { return; } float posf = position.getValuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { colors[p.index] = blendColor(colors[p.index], lx.hsb( (lx.getBaseHuef() + .2*abs(p.x - model.cx) + .2*abs(p.y - model.cy)) % 360, 100, @@ -151,7 +151,7 @@ class MidiMusic extends SCPattern { return; } float yVal = yPos.getValuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { float falloff = 6 - 5*lightSize.getValuef(); float b = max(0, bVal - falloff*dist(p.x, p.y, xPos, yVal)); if (b > 0) { @@ -252,7 +252,7 @@ class MidiMusic extends SCPattern { float maxBright = sparkleBright * (1 - sparkle.getValuef()); for (Strip s : model.strips) { int i = 0; - for (Point p : s.points) { + for (LXPoint p : s.points) { int wavi = (int) constrain(p.x / model.xMax * wval.length, 0, wval.length-1); float wavb = max(0, wave.getValuef()*100. - 8.*abs(p.y - wval[wavi])); colors[p.index] = lx.hsb( @@ -366,7 +366,7 @@ class Pulley extends SCPattern { fPos = .2 + 4 * (.2 - fPos); } float falloff = 100. / (3 + sz.getValuef() * 36 + fPos * beatAmount.getValuef()*48); - for (Point p : model.points) { + for (LXPoint p : model.points) { int gi = (int) constrain((p.x - model.xMin) * NUM_DIVISIONS / (model.xMax - model.xMin), 0, NUM_DIVISIONS-1); colors[p.index] = lx.hsb( (lx.getBaseHuef() + abs(p.x - model.cx)*.8 + p.y*.4) % 360, @@ -438,7 +438,7 @@ class ViolinWave extends SCPattern { } float pFalloff = (30 - 27*pSize.getValuef()); - for (Point p : model.points) { + for (LXPoint p : model.points) { float b = 100 - pFalloff * (abs(p.x - x.getValuef()) + abs(p.y - y.getValuef())); if (b > 0) { colors[p.index] = blendColor(colors[p.index], lx.hsb( @@ -489,7 +489,7 @@ class ViolinWave extends SCPattern { float rng = (78 - 64 * range.getValuef()) / (model.yMax - model.cy); float val = max(2, dbValue.getValuef()); - for (Point p : model.points) { + for (LXPoint p : model.points) { int ci = (int) lerp(0, centers.length-1, (p.x - model.xMin) / (model.xMax - model.xMin)); float rFactor = 1.0 - 0.9 * abs(p.x - model.cx) / (model.xMax - model.cx); colors[p.index] = lx.hsb( @@ -545,7 +545,7 @@ class BouncyBalls extends SCPattern { float xv = xPos.getValuef(); float yv = yPos.getValuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { float d = sqrt((p.x-xv)*(p.x-xv) + (p.y-yv)*(p.y-yv) + .1*(p.z-zPos)*(p.z-zPos)); float b = constrain(130 - falloff*d, 0, 100); if (b > 0) { @@ -630,7 +630,7 @@ class SpaceTime extends SCPattern { int s = 0; for (Strip strip : model.strips) { int i = 0; - for (Point p : strip.points) { + for (LXPoint p : strip.points) { colors[p.index] = lx.hsb( (lx.getBaseHuef() + 360 - p.x*.2 + p.y * .3) % 360, constrain(.4 * min(abs(s - sVal1), abs(s - sVal2)), 20, 100), @@ -648,9 +648,9 @@ class Swarm extends SCPattern { 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, model.xMax, 19000); - SinLFO fY = new SinLFO(0, model.yMax, 11000); - SinLFO hOffX = new SinLFO(0, model.xMax, 13000); + SinLFO fX = new SinLFO(model.xMin, model.xMax, 19000); + SinLFO fY = new SinLFO(model.yMin, model.yMax, 11000); + SinLFO hOffX = new SinLFO(model.xMin, model.xMax, 13000); public Swarm(GLucose glucose) { super(glucose); @@ -677,9 +677,9 @@ class Swarm extends SCPattern { void run(double deltaMs) { float s = 0; - for (Strip strip : model.strips ) { + for (Strip strip : model.strips) { int i = 0; - for (Point p : strip.points) { + for (LXPoint p : strip.points) { float fV = max(-1, 1 - dist(p.x/2., p.y, fX.getValuef()/2., fY.getValuef()) / 64.); colors[p.index] = lx.hsb( (lx.getBaseHuef() + 0.3 * abs(p.x - hOffX.getValuef())) % 360, @@ -706,7 +706,7 @@ class SwipeTransition extends SCTransition { void computeBlend(int[] c1, int[] c2, double progress) { float bleedf = 10 + bleed.getValuef() * 200.; float xPos = (float) (-bleedf + progress * (model.xMax + bleedf)); - for (Point p : model.points) { + for (LXPoint p : model.points) { float d = (p.x - xPos) / bleedf; if (d < 0) { colors[p.index] = c2[p.index]; @@ -829,7 +829,7 @@ class BassPod extends SCPattern { float satBase = bassLevel*480*clr.getValuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { int avgIndex = (int) constrain(1 + abs(p.x-model.cx)/(model.cx)*(eq.numBands-5), 0, eq.numBands-5); float value = 0; for (int i = avgIndex; i < avgIndex + 5; ++i) { @@ -880,7 +880,7 @@ class CubeEQ extends SCPattern { float edgeConst = 2 + 30*edge.getValuef(); float clrConst = 1.1 + clr.getValuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { float avgIndex = constrain(2 + p.x / model.xMax * (eq.numBands-4), 0, eq.numBands-4); int avgFloor = (int) avgIndex; @@ -935,7 +935,7 @@ class BoomEffect extends SCEffect { float falloffv = falloffv(); float satv = sat.getValuef() * 100; float huev = lx.getBaseHuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { colors[p.index] = blendColor( colors[p.index], lx.hsb(huev, satv, constrain(brightv - falloffv*abs(boom.getValuef() - dist(p.x, 2*p.y, 3*p.z, model.xMax/2, model.yMax, model.zMax*1.5)), 0, 100)), @@ -1111,7 +1111,7 @@ class CrossSections extends SCPattern { float ywv = 100. / (10 + 40*yw.getValuef()); float zwv = 100. / (10 + 40*zw.getValuef()); - for (Point p : model.points) { + for (LXPoint p : model.points) { color c = 0; c = blendColor(c, lx.hsb( (lx.getBaseHuef() + p.x/10 + p.y/3) % 360, @@ -1158,7 +1158,7 @@ class Blinders extends SCPattern { for (Strip strip : model.strips) { int i = 0; float mv = m[si % m.length].getValuef(); - for (Point p : strip.points) { + for (LXPoint p : strip.points) { colors[p.index] = lx.hsb( (hv + p.z + p.y*hs.getValuef()) % 360, min(100, abs(p.x - s.getValuef())/2.), @@ -1194,7 +1194,7 @@ class Psychedelia extends SCPattern { float mv = m.getValuef(); int i = 0; for (Strip strip : model.strips) { - for (Point p : strip.points) { + for (LXPoint p : strip.points) { colors[p.index] = lx.hsb( (huev + i*constrain(cv, 0, 2) + p.z/2. + p.x/4.) % 360, min(100, abs(p.y-sv)), @@ -1256,7 +1256,7 @@ class AskewPlanes extends SCPattern { planes[1].run(deltaMs); planes[2].run(deltaMs); - for (Point p : model.points) { + for (LXPoint p : model.points) { float d = MAX_FLOAT; for (Plane plane : planes) { if (plane.denom != 0) { @@ -1294,7 +1294,7 @@ class ShiftingPlane extends SCPattern { float cv = c.getValuef(); float dv = d.getValuef(); float denom = sqrt(av*av + bv*bv + cv*cv); - for (Point p : model.points) { + for (LXPoint p : model.points) { float d = abs(av*(p.x-model.cx) + bv*(p.y-model.cy) + cv*(p.z-model.cz) + dv) / denom; colors[p.index] = lx.hsb( (hv + abs(p.x-model.cx)*.6 + abs(p.y-model.cy)*.9 + abs(p.z - model.cz)) % 360, @@ -1361,7 +1361,7 @@ class Traktor extends SCPattern { bass[index] = rawBass * rawBass * rawBass * rawBass; treble[index] = rawTreble * rawTreble; - for (Point p : model.points) { + for (LXPoint p : model.points) { int i = (int) constrain((model.xMax - p.x) / model.xMax * FRAME_WIDTH, 0, FRAME_WIDTH-1); int pos = (index + FRAME_WIDTH - i) % FRAME_WIDTH; @@ -1520,3 +1520,4 @@ class BlurEffect extends SCEffect { } } + diff --git a/ShaheenGandhi.pde b/ShaheenGandhi.pde index d718e36..83b97cf 100644 --- a/ShaheenGandhi.pde +++ b/ShaheenGandhi.pde @@ -252,7 +252,7 @@ class HelixPattern extends SCPattern { h2.step(deltaMs); calculateSpokes(); - for (Point p : model.points) { + for (LXPoint p : model.points) { PVector pt = new PVector(p.x,p.y,p.z); color h1c = h1.colorOfPoint(pt); color h2c = h2.colorOfPoint(pt); diff --git a/SugarCubes.pde b/SugarCubes.pde index c89a72e..a599b43 100644 --- a/SugarCubes.pde +++ b/SugarCubes.pde @@ -26,7 +26,6 @@ LXPattern[] patterns(GLucose glucose) { return new LXPattern[] { - // Slee new Cathedrals(glucose), new MidiMusic(glucose), @@ -104,7 +103,6 @@ LXPattern[] patterns(GLucose glucose) { new TestBassMapping(glucose), new TestFloorMapping(glucose), new TestSpeakerMapping(glucose), - new TestPerformancePattern(glucose), // new TestHuePattern(glucose), // new TestXPattern(glucose), // new TestYPattern(glucose), diff --git a/TestPatterns.pde b/TestPatterns.pde index 1c2ea70..62a1956 100644 --- a/TestPatterns.pde +++ b/TestPatterns.pde @@ -25,7 +25,7 @@ class TestSpeakerMapping extends TestPattern { for (Speaker speaker : model.speakers) { for (Strip strip : speaker.strips) { float b = 100; - for (Point p : strip.points) { + for (LXPoint p : strip.points) { colors[p.index] = lx.hsb(h % 360, 100, b); b = max(0, b - 10); } @@ -46,7 +46,7 @@ class TestBassMapping extends TestPattern { int h = 0; for (int si : strips) { float b = 100; - for (Point p : model.bassBox.strips.get(si).points) { + for (LXPoint p : model.bassBox.strips.get(si).points) { colors[p.index] = lx.hsb(h % 360, 100, b); b = max(0, b - 10); } @@ -65,7 +65,7 @@ class TestFloorMapping extends TestPattern { int h = 0; for (int si : strutIndices) { float b = 100; - for (Point p : model.bassBox.struts.get(si).points) { + for (LXPoint p : model.bassBox.struts.get(si).points) { colors[p.index] = lx.hsb(h % 360, 100, b); b = max(0, b - 10); } @@ -75,7 +75,7 @@ class TestFloorMapping extends TestPattern { h = 0; for (int fi : floorIndices) { float b = 100; - for (Point p : model.boothFloor.strips.get(fi).points) { + for (LXPoint p : model.boothFloor.strips.get(fi).points) { colors[p.index] = lx.hsb(h, 100, b); b = max(0, b - 3); } @@ -84,59 +84,6 @@ class TestFloorMapping extends TestPattern { } } -class TestPerformancePattern extends TestPattern { - - final BasicParameter ops = new BasicParameter("OPS", 0); - final BasicParameter iter = new BasicParameter("ITER", 0); - - TestPerformancePattern(GLucose glucose) { - super(glucose); - addParameter(ops); - addParameter(iter); - } - - public void run(double deltaMs) { - float x = 1; - for (int j = 0; j < ops.getValuef() * 400000; ++j) { - x *= random(0, 1); - } - - if (iter.getValuef() < 0.25) { - for (Point p : model.points) { - colors[p.index] = lx.hsb( - (p.x*.1 + p.y*.1) % 360, - 100, - 100 - ); - } - } else if (iter.getValuef() < 0.5) { - for (int i = 0; i < colors.length; ++i) { - colors[i] = lx.hsb( - (90 + model.px[i]*.1 + model.py[i]*.1) % 360, - 100, - 100 - ); - } - } else if (iter.getValuef() < 0.75) { - for (int i = 0; i < colors.length; ++i) { - colors[i] = lx.hsb( - (180 + model.p[3*i]*.1 + model.p[3*i+1]*.1) % 360, - 100, - 100 - ); - } - } else { - for (int i = 0; i < colors.length; ++i) { - colors[i] = lx.hsb( - (270 + model.x(i)*.1 + model.y(i)*.1) % 360, - 100, - 100 - ); - } - } - } -} - class TestStripPattern extends TestPattern { SinLFO d = new SinLFO(4, 40, 4000); @@ -148,7 +95,7 @@ class TestStripPattern extends TestPattern { public void run(double deltaMs) { for (Strip s : model.strips) { - for (Point p : s.points) { + for (LXPoint p : s.points) { colors[p.index] = lx.hsb( lx.getBaseHuef(), 100, @@ -188,7 +135,7 @@ class TestXPattern extends TestPattern { } public void run(double deltaMs) { float hv = lx.getBaseHuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { // This is a common technique for modulating brightness. // You can use abs() to determine the distance between two // values. The further away this point is from an exact @@ -210,7 +157,7 @@ class TestYPattern extends TestPattern { } public void run(double deltaMs) { float hv = lx.getBaseHuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { float bv = max(0, 100 - abs(p.y - yPos.getValuef())); colors[p.index] = lx.hsb(hv, 100, bv); } @@ -228,7 +175,7 @@ class TestZPattern extends TestPattern { } public void run(double deltaMs) { float hv = lx.getBaseHuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { float bv = max(0, 100 - abs(p.z - zPos.getValuef())); colors[p.index] = lx.hsb(hv, 100, bv); } @@ -249,7 +196,7 @@ class TestTowerPattern extends TestPattern { public void run(double deltaMs) { int ti = 0; for (Tower t : model.towers) { - for (Point p : t.points) { + for (LXPoint p : t.points) { colors[p.index] = lx.hsb( lx.getBaseHuef(), 100, @@ -297,10 +244,10 @@ class TestProjectionPattern extends TestPattern { // For the same reasons described above, it may logically feel to you that // some of these operations are in reverse order. Again, just keep in mind that // the car itself is what's moving, not the object - projection.reset(model) + projection.reset() // Translate so the center of the car is the origin, offset by yPos - .translateCenter(model, 0, yPos.getValuef(), 0) + .translateCenter(0, yPos.getValuef(), 0) // Rotate around the origin (now the center of the car) about an X-vector .rotate(angle.getValuef(), 1, 0, 0) @@ -334,7 +281,7 @@ class TestCubePattern extends TestPattern { public void run(double deltaMs) { for (Cube c : model.cubes) { int i = 0; - for (Point p : c.points) { + for (LXPoint p : c.points) { colors[p.index] = lx.hsb( lx.getBaseHuef(), 100, diff --git a/TimBavaro.pde b/TimBavaro.pde index a10e89e..5ed805b 100644 --- a/TimBavaro.pde +++ b/TimBavaro.pde @@ -53,7 +53,7 @@ class TimSpheres extends SCPattern { spheres[0].radius = 100 * hueParameter.getValuef(); spheres[1].radius = 100 * hueParameter.getValuef(); - for (Point p : model.points) { + for (LXPoint p : model.points) { float value = 0; color c = lx.hsb(0, 0, 0); @@ -124,7 +124,7 @@ class Vector3 { return distanceTo(v.x, v.y, v.z); } - float distanceTo(Point p) { + float distanceTo(LXPoint p) { return distanceTo(p.x, p.y, p.z); } @@ -246,7 +246,7 @@ class TimRaindrops extends SCPattern { raindrops.add(new Raindrop()); } - for (Point p : model.points) { + for (LXPoint p : model.points) { color c = blendColor( lx.hsb(210, 20, (float)Math.max(0, 1 - Math.pow((model.yMax - p.y) / 10, 2)) * 50), @@ -337,14 +337,14 @@ class TimCubes extends SCPattern { flashes.add(new CubeFlash()); } - for (Point p : model.points) { + for (LXPoint p : model.points) { colors[p.index] = 0; } for (CubeFlash flash : flashes) { float hue = (hueParameter.getValuef() + (hueVarianceParameter.getValuef() * flash.hue)) % 1.0; color c = lx.hsb(hue * 360, saturationParameter.getValuef() * 100, (flash.value) * 100); - for (Point p : flash.c.points) { + for (LXPoint p : flash.c.points) { colors[p.index] = c; } } @@ -456,7 +456,7 @@ class TimPlanes extends SCPattern { Vector3 normalizedPoint = new Vector3(); - for (Point p : model.points) { + for (LXPoint p : model.points) { if (random(1.0) < derez) { continue; } @@ -631,7 +631,7 @@ class TimPinwheels extends SCPattern { float zSlope = (zSlopeParameter.getValuef() - 0.5) * 2; int i = -1; - for (Point p : model.points) { + for (LXPoint p : model.points) { ++i; int value = 0; @@ -663,25 +663,25 @@ class TimPinwheels extends SCPattern { * it but there may be useful code here. */ class TimTrace extends SCPattern { - private Map> pointToNeighbors; - private Map pointToStrip; + private Map> pointToNeighbors; + private Map pointToStrip; // private final Map> stripToNearbyStrips; int extraMs; class MovingPoint { - Point currentPoint; + LXPoint currentPoint; float hue; private Strip currentStrip; private int currentStripIndex; private int direction; // +1 or -1 - MovingPoint(Point p) { + MovingPoint(LXPoint p) { this.setPointOnNewStrip(p); hue = random(360); } - private void setPointOnNewStrip(Point p) { + private void setPointOnNewStrip(LXPoint p) { this.currentPoint = p; this.currentStrip = pointToStrip.get(p); for (int i = 0; i < this.currentStrip.points.size(); ++i) { @@ -703,9 +703,9 @@ class TimTrace extends SCPattern { } void step() { - List neighborsOnOtherStrips = pointToNeighbors.get(this.currentPoint); + List neighborsOnOtherStrips = pointToNeighbors.get(this.currentPoint); - Point nextPointOnCurrentStrip = null; + LXPoint nextPointOnCurrentStrip = null; this.currentStripIndex += this.direction; if (this.currentStripIndex >= 0 && this.currentStripIndex < this.currentStrip.points.size()) { nextPointOnCurrentStrip = this.currentStrip.points.get(this.currentStripIndex); @@ -745,7 +745,7 @@ class TimTrace extends SCPattern { Map stripToCenter = new HashMap(); for (Strip s : model.strips) { Vector3 v = new Vector3(); - for (Point p : s.points) { + for (LXPoint p : s.points) { v.add(p.x, p.y, p.z); } v.divide(s.points.size()); @@ -770,23 +770,23 @@ class TimTrace extends SCPattern { return stripToNeighbors; } - private Map> buildPointToNeighborsMap() { - Map> m = new HashMap(); + private Map> buildPointToNeighborsMap() { + Map> m = new HashMap(); Map> stripToNearbyStrips = this.buildStripToNearbyStripsMap(); for (Strip s : model.strips) { List nearbyStrips = stripToNearbyStrips.get(s); - for (Point p : s.points) { + for (LXPoint p : s.points) { Vector3 v = new Vector3(p.x, p.y, p.z); - List neighbors = new ArrayList(); + List neighbors = new ArrayList(); for (Strip nearbyStrip : nearbyStrips) { - Point closestPoint = null; + LXPoint closestPoint = null; float closestPointDistance = 100000; - for (Point nsp : nearbyStrip.points) { + for (LXPoint nsp : nearbyStrip.points) { float distance = v.distanceTo(nsp.x, nsp.y, nsp.z); if (closestPoint == null || distance < closestPointDistance) { closestPoint = nsp; @@ -806,10 +806,10 @@ class TimTrace extends SCPattern { return m; } - private Map buildPointToStripMap() { - Map m = new HashMap(); + private Map buildPointToStripMap() { + Map m = new HashMap(); for (Strip s : model.strips) { - for (Point p : s.points) { + for (LXPoint p : s.points) { m.put(p, s); } } @@ -817,7 +817,7 @@ class TimTrace extends SCPattern { } public void run(double deltaMs) { - for (Point p : model.points) { + for (LXPoint p : model.points) { color c = colors[p.index]; colors[p.index] = lx.hsb(lx.h(c), lx.s(c), lx.b(c) - 3); } diff --git a/TobySegaran.pde b/TobySegaran.pde index 82ad4d2..8aaacb1 100644 --- a/TobySegaran.pde +++ b/TobySegaran.pde @@ -24,7 +24,7 @@ class GlitchPlasma extends SCPattern { } public void run(double deltaMs) { - for (Point p : model.points) { + for (LXPoint p : model.points) { float hv = sin(dist(p.x + pos, p.y, 128.0, 128.0) / 8.0) + sin(dist(p.x, p.y, 64.0, 64.0) / 8.0) + sin(dist(p.x, p.y + pos / 7, 192.0, 64.0) / 7.0) @@ -81,7 +81,7 @@ class FireEffect extends SCPattern { } } - for (Point p : model.points) { + for (LXPoint p : model.points) { int x = max(0,(int(p.x)+int(p.z))%xm); int y = constrain(ym-int(p.y),0,ym-1); colors[p.index] = flameColor(intensity[x][y]); @@ -120,7 +120,7 @@ class StripBounce extends SCPattern { boolean on = avgdist<30; float hv = (lx.getBaseHuef()+colorOffset[i])%360; float br = max(0,100-avgdist*4); - for (Point p : strip.points) { + for (LXPoint p : strip.points) { if (on && br>bright[p.index]) { colors[p.index] = lx.hsb(hv,sat[i].getValuef(),br); bright[p.index] = br; @@ -184,7 +184,7 @@ class SoundRain extends SCPattern { for (int j=0; javgSize) seq=avgSize-seq; diff --git a/_DebugUI.pde b/_DebugUI.pde index 5b99d43..a36f688 100644 --- a/_DebugUI.pde +++ b/_DebugUI.pde @@ -200,7 +200,7 @@ class DebugUI { if (state != DEBUG_STATE_ANIM) { color debugColor = (state == DEBUG_STATE_WHITE) ? white : off; Cube cube = glucose.model.getCubeByRawIndex(rawCubeIndex); - for (Point p : cube.points) { + for (LXPoint p : cube.points) { colors[p.index] = debugColor; } } @@ -214,7 +214,7 @@ class DebugUI { if (state != DEBUG_STATE_ANIM) { color debugColor = (state == DEBUG_STATE_WHITE) ? white : off; for (Strip s : glucose.model.bassBox.boxStrips) { - for (Point p : s.points) { + for (LXPoint p : s.points) { colors[p.index] = debugColor; } } @@ -225,11 +225,11 @@ class DebugUI { state = debugState[channelIndex][1]; if (state != DEBUG_STATE_ANIM) { color debugColor = (state == DEBUG_STATE_WHITE) ? white : off; - for (Point p : glucose.model.boothFloor.points) { + for (LXPoint p : glucose.model.boothFloor.points) { colors[p.index] = debugColor; } for (Strip s : glucose.model.bassBox.struts) { - for (Point p : s.points) { + for (LXPoint p : s.points) { colors[p.index] = debugColor; } } @@ -240,7 +240,7 @@ class DebugUI { state = debugState[channelIndex][1]; if (state != DEBUG_STATE_ANIM) { color debugColor = (state == DEBUG_STATE_WHITE) ? white : off; - for (Point p : glucose.model.speakers.get(channel.objectIndices[0]).points) { + for (LXPoint p : glucose.model.speakers.get(channel.objectIndices[0]).points) { colors[p.index] = debugColor; } } diff --git a/_Internals.pde b/_Internals.pde index 728e343..8c50a76 100644 --- a/_Internals.pde +++ b/_Internals.pde @@ -140,7 +140,7 @@ void setup() { lx = glucose.lx; lx.enableKeyboardTempo(); logTime("Built GLucose engine"); - + // Set the patterns LXEngine engine = lx.engine; engine.setPatterns(patterns = _leftPatterns(glucose)); @@ -328,7 +328,7 @@ void drawDiagnostics(long drawNanos, long simulationNanos, long uiNanos, long ga } void drawSimulation(color[] simulationColors) { - camera( + camera( eyeX, eyeY, eyeZ, midX, midY, midZ, 0, -1, 0 @@ -370,7 +370,7 @@ void drawSimulation(color[] simulationColors) { noFill(); strokeWeight(2); beginShape(POINTS); - for (Point p : glucose.model.points) { + for (LXPoint p : glucose.model.points) { stroke(simulationColors[p.index]); vertex(p.x, p.y, p.z); } diff --git a/_Mappings.pde b/_Mappings.pde index feca86e..314a88d 100644 --- a/_Mappings.pde +++ b/_Mappings.pde @@ -210,7 +210,7 @@ for (StaggeredTower st : scubes) { tower.add(cubes[cubeIndex++] = new Cube(st.x, st.y + CH* 4/3.*i, st.z, 0, st.r, 0, w)); } towerList.add(new Tower(tower)); - } + } return new Model(towerList, cubes, bassBox, speakers); } @@ -422,4 +422,4 @@ class ChannelMapping { objectIndices[i] = (i < rawObjectIndices.length) ? rawObjectIndices[i] : NO_OBJECT; } } -} \ No newline at end of file +} diff --git a/_PandaDriver.pde b/_PandaDriver.pde index 0aca6af..24afa20 100644 --- a/_PandaDriver.pde +++ b/_PandaDriver.pde @@ -264,7 +264,7 @@ public static class PandaDriver { private int mapStrip(Strip s, int direction, int[] points, int pi) { if (direction == FORWARD) { - for (Point p : s.points) { + for (LXPoint p : s.points) { points[pi++] = p.index; } } else if (direction == BACKWARD) { diff --git a/code/GLucose.jar b/code/GLucose.jar index 92f9ff9b8addd64c173699016e787f986eaf716f..9440558bd4997b26ff78baa8c9545fba069916f4 100755 GIT binary patch delta 22398 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 delta 9427 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 RzA#^y5f=>hRTK;Z`+t=Bh0Fi| -- 2.34.1