+
+ DPat(GLucose glucose) {
+ super(glucose);
+ DG.Init();
+ pSharp = addParam("Shrp", 0);
+ nPoints = model.points.size();
+ xdMax = model.xMax;
+ ydMax = model.yMax;
+ zdMax = model.zMax;
+ xyzdMax = new xyz(xdMax,ydMax,zdMax);
+ xyzMid = new xyz(xdMax/2, ydMax/2, zdMax/2);
+ }
+
+ void run(double deltaMs)
+ {
+ NoiseMove += deltaMs;
+ StartRun (deltaMs);
+ zSpinHue += DG._SpinHue ()*deltaMs*.05;
+ xyz P = new xyz();
+ float modhue = DG._ModHue ()==0 ? 0 : DG._ModHue ()*360;
+ float fSharp = 1/(1.01-pSharp.Val());
+
+ DG.SetText();
+ nPoint = 0;
+ for (Point p : model.points) { nPoint++;
+ if (!IsActive()) { colors[p.index] = color(0,0,0); continue; }
+
+ P.set(p);
+
+ if (DG._Spark () > 0) P.y += DG._Spark () * (noise(P.x,P.y+NoiseMove/30 ,P.z)*ydMax - ydMax/2.);
+ if (DG._Wiggle() > 0) P.y += DG._Wiggle() * (noise(P.x/(xdMax*.3)-NoiseMove/1500.) - .5) * (ydMax/2.);
+
+ color cOld = colors[p.index];
+
+ color cNew = CalcPoint(P);
+ if (DG._XSym) cNew = blendColor(cNew, CalcPoint(new xyz(xdMax-P.x,P.y,P.z)), ADD);
+ if (DG._YSym) cNew = blendColor(cNew, CalcPoint(new xyz(P.x,ydMax-P.y,P.z)), ADD);
+ if (DG._ZSym) cNew = blendColor(cNew, CalcPoint(new xyz(P.x,P.y,zdMax-P.z)), ADD);
+
+ float b = brightness(cNew)/100.;
+ b = b < .5 ? pow(b,fSharp) : 1-pow(1-b,fSharp);
+
+ float noizhue = DG._NoiseHue()==0 ? 0 : DG._NoiseHue()*360*noise(
+ P.x/(xdMax*.3)+NoiseMove*.0003,
+ P.y/(ydMax*.3)+NoiseMove*.00025,
+ P.z/(zdMax*.3)+NoiseMove*.0002 );
+
+ cNew = color( (hue(cNew) + modhue + zSpinHue - noizhue) % 360,
+ saturation(cNew) + 100*DG._Saturate(),
+ 100 * (DG._Trails()==0 ? b : max(b, (float) (brightness(cOld)/100. - (1-DG._Trails()) * deltaMs/200.)))
+ * (DG._Dim ()==0 ? 1 : 1-DG._Dim())
+ );
+
+ colors[p.index] = cNew;
+ }
+ }