+ case 0: V.set(Pn.x, yt , Pn.z); break; // bouncing line\r
+ case 1: V.set(Pn.x, map(cos(PI*t * Pn.x),-1,1,0,1) , Pn.z); break; // top tap\r
+ case 2: V.set(Pn.x, bnc*map(Pn.x<.5?Pn.x:1-Pn.x,0,.5 ,0,t-.5)+.5, Pn.z); break; // V shape\r
+ case 3: V.set(Pn.x, Pn.x < cMidNorm.x ? map(Pn.x,0,cMidNorm.x, .5,yt) :\r
+ map(Pn.x,cMidNorm.x,1, yt,.5), Pn.z); break; // Random V shape\r
+\r
+ case 4: V.set(Pn.x, .5*(Pn.x < cMidNorm.x ? map(Pn.x,0,cMidNorm.x, .5,yt) :\r
+ map(Pn.x,cMidNorm.x,1, yt,.5)) +\r
+ .5*(Pn.z < cMidNorm.z ? map(Pn.z,0,cMidNorm.z, .5,yt) :\r
+ map(Pn.z,cMidNorm.z,1, yt,.5)), Pn.z); break; // Random Pyramid shape\r
+ \r
+ case 5: V.set(Pn.x, bnc*map((Pn.x-.5)*(Pn.x-.5),0,.25,0,t-.5)+.5, Pn.z); break; // wings\r
+ case 6: V.set(Pn.x, bnc*map((mp -.5)*(mp -.5),0,.25,0,t-.5)+.5, Pn.z); break; // wings\r
+\r
+ case 7: d = min(\r
+ distToSeg(Px.x, Px.y, a1.getX(70),a1.getY(70), mCtr.x, mCtr.y),\r
+ distToSeg(Px.x, Px.y, a2.getX(40),a2.getY(40), mCtr.x, mCtr.y));\r
+ d = constrain(30*(rad*40-d),0,100);\r
+ return color(0,max(0,150-d), d); // clock\r
+\r
+ case 8: r = amp*200 * map(bnc,0,1,1,sin(PI*t));\r
+ d = min(\r
+ distToSeg(Px.x, Px.y, a1.getX(r),a1.getY(r), a2.getX(r),a2.getY(r)),\r
+ distToSeg(Px.x, Px.y, a2.getX(r),a2.getY(r), a3.getX(r),a3.getY(r)),\r
+ distToSeg(Px.x, Px.y, a3.getX(r),a3.getY(r), a1.getX(r),a1.getY(r)) // triangle\r
+ );\r
+ d = constrain(30*(rad*40-d),0,100);\r
+ return color(0,max(0,150-d), d); // clock\r
+\r
+ case 9: r = amp*200 * map(bnc,0,1,1,sin(PI*t));\r
+ d = min(\r
+ distToSeg(Px.x, Px.y, a1.getX(r),a1.getY(r), a2.getX(r),a2.getY(r)),\r
+ distToSeg(Px.x, Px.y, a2.getX(r),a2.getY(r), a3.getX(r),a3.getY(r)),\r
+ distToSeg(Px.x, Px.y, a3.getX(r),a3.getY(r), a4.getX(r),a4.getY(r)),\r
+ distToSeg(Px.x, Px.y, a4.getX(r),a4.getY(r), a1.getX(r),a1.getY(r)) // quad\r
+ );\r
+ d = constrain(30*(rad*40-d),0,100);\r
+ return color(0,max(0,150-d), d); // clock\r
+\r
+ case 10:\r
+ r = map(bnc,0,1,a1.r,amp*200*sin(PI*t));\r
+ return color(0,0,c1c(.9+2*rad - dist(Px.x,Px.y,a1.getX(r),a1.getY(r))*.03) ); // sphere\r
+\r
+ case 11:\r
+ Px.z=mCtr.z; cMid.z=mCtr.z;\r
+ return color(0,0,c1c(1 - CalcCone(Px,cMid,mCtr) * 0.02 > .5?1:0)); // cone\r
+\r
+ case 12: return color(100 + noise(Pn.x,Pn.y,Pn.z + (NoiseMove+50000)/1000.)*200,\r
+ 85,c1c(Pn.y < noise(Pn.x + NoiseMove/2000.,Pn.z)*(1+amp)-amp/2.-.1 ? 1 : 0)); // noise\r
+\r
+ case 13: float y=0; for (rWave w : waves) y += .5*w.val(Pn.x);\r
+ V.set(Pn.x, .7+y, Pn.z);\r
+ break;\r
+\r
+ default: return color(0,0,0);\r
+ }\r
+\r
+ return color(0,\r
+ 150-c1c(1 - V.distance(Pn)/rad),\r
+ c1c(1 - V.distance(Pn)/rad));\r
+ }\r
+}\r
+//----------------------------------------------------------------------------------------------------------------------------------\r
+// 0 - TLB, L (b), BLB, B (l) // Fwd , Down, Back, Up\r
+// 4 - TLF, F (l), BLF, L (f) // Fwd , Down, Back, Up\r
+// 8 - TRF, R (f), BRF, F (r) // Back, Down, Fwd , Up\r
+// 12- TRB, B (r), BRB, R (b) // Back, Down, Fwd , Up\r
+// 1->7, 15->9\r
+\r
+class dBolt {\r
+ dStrip v, h;\r
+ int vpos, hpos;\r
+ dBolt(dStrip _v, dStrip _h, int _vpos, int _hpos) {\r
+ v=_v; h=_h; vpos=_vpos; hpos=_hpos;\r
+ if (v.b0 == null) { v.b0=this; h.b0=this; } \r
+ else { v.b1=this; h.b1=this; }\r
+ }\r
+}\r
+\r
+class dVertex {\r
+ dStrip s1 , s2 ;\r
+ int dir1, dir2 ;\r
+ dVertex(dStrip s, int d) {\r
+ int _a = (s.iS%4==1)? (d==1? 5: 3) :\r
+ (s.iS%4==3)? (d==1? 9:11) :\r
+ (d==1) ? (s.Top()?4:12) : (s.Top()?12:4);\r
+ dir1 = d * (s.isVert() ? -1 : 1);\r
+ dir2 = d;\r
+ s1 = DL_.DS[s.iCube() + ((s.iS+_a) % 16)];\r
+ s2 = DL_.DS[d == 1 ? (s.idx == s.iFace()+3 ? s.idx-3 : s.idx+1):\r
+ (s.idx == s.iFace() ? s.idx+3 : s.idx-1)];\r
+ swapout(1 , 6);\r
+ swapout(15,-6);\r
+ }\r
+ void swapout(int a, int b) {\r
+ if (s1.iS == a) { s1 = DL_.DS[s1.idx + b]; dir1 = -dir1; }\r
+ if (s2.iS == a) { s2 = DL_.DS[s2.idx + b]; dir2 = -dir2; }\r
+ }\r
+\r
+}\r
+\r
+class dStrip { // THIS WAS SUCH A PAIN!\r
+ int row, col, ci, idx, iS, axis; // 1-y, 2-left, 3-right\r
+ Strip s; \r
+ boolean bTop; // direction: top ccw, bottom cw.\r
+\r
+ boolean Top (){ return axis!=1 && bTop ; }\r
+ boolean Bottom(){ return axis!=1 && !bTop; }\r
+ boolean isVert(){ return axis==1; }\r
+ boolean isHorz(){ return axis!=1; }\r
+ int iCube (){ return 16*floor(idx/16); }\r
+ int iFace (){ return iCube() + 4*floor(iS/4); }\r
+\r
+ void init(Strip _s, int _i, int _row, int _col) {\r
+ idx = _i; row = _row; col = _col; s = _s;\r
+ iS = idx%16; bTop = (iS%4==0);\r
+ ci = s.points.get(0).index;\r
+ DL_.DQ[col][row] = iCube();\r
+ switch (iS) {\r
+ case 4: case 6 : case 12: case 14: axis=2; break;\r
+ case 0: case 2 : case 8 : case 10: axis=3; break;\r
+ default: axis=1; break;\r
+ }\r
+ }\r
+\r
+ void addBolts() {\r
+ v0 = new dVertex(this, 1);\r
+ v1 = new dVertex(this,-1);\r
+\r
+\r
+ if (iS == 7 && col != 0 && row != 0) // left bottom\r
+ new dBolt(this, DL_.GetStrip(row-1,col-1,(col % 2 == 1) ? 8 : 12), \r
+ 4, (col % 2 == 1) ? 6 : 9); \r
+\r
+ if (iS == 7 && col != 0 && row < MaxCubeHeight*2-2) // left top\r
+ new dBolt(this, DL_.GetStrip(row+1,col-1,(col % 2 == 1) ? 10 : 14), \r
+ 11, (col % 2 == 1) ? 9 : 6);\r
+\r
+ if (iS == 9 && col < NumBackTowers-1 && row < MaxCubeHeight*2-2) // right top\r
+ new dBolt(this, DL_.GetStrip(row+1,col+1,(col % 2 == 1) ? 6 : 2), \r
+ 4, (col % 2 == 1) ? 6 : 9);\r
+\r
+ if (iS == 9 && col < NumBackTowers-1 && row != 0) // right bottom\r
+ new dBolt(this, DL_.GetStrip(row-1,col+1,(col % 2 == 1) ? 4 : 0), \r
+ 11, (col % 2 == 1) ? 9 : 6);\r
+ }\r
+\r
+ dBolt b0, b1;\r
+ dVertex v0, v1;\r
+}\r
+\r
+class dCursor {\r
+ dStrip s, sNext;\r
+ int nLast,pos,posNext,end; // 0 - 65535\r
+ int dir; // 1 or -1\r
+ color clr;\r
+ \r
+ dCursor(color _c) { clr=_c;}\r