+ 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