1 class JackieSquares extends SCPattern {
2 private BasicParameter rateParameter = new BasicParameter("RATE", 0.25);
3 private BasicParameter maxSpreadParameter = new BasicParameter("SPREAD", 0.25);
4 private BasicParameter attackParameter = new BasicParameter("ATTK", 0.3);
5 private BasicParameter decayParameter = new BasicParameter("DECAY", 0.2);
6 private BasicParameter saturationParameter = new BasicParameter("SAT", 0.7);
8 SinLFO hueMod = new SinLFO(0, 360, 4000);
9 SinLFO spreadMod = new SinLFO(1, 10, 8000);
19 f = model.faces.get(n % model.faces.size());
21 boolean infiniteAttack = (attackParameter.getValuef() > 0.999);
22 hasPeaked = infiniteAttack;
23 value = (infiniteAttack ? 1 : 0);
26 // returns TRUE if this should die
27 boolean age(double ms) {
29 value = value + (float) (ms / 1000.0f * ((attackParameter.getValuef() + 0.01) * 5));
36 value = value - (float) (ms / 1000.0f * ((decayParameter.getValuef() + 0.01) * 10));
42 private float leftoverMs = 0;
43 private List<FaceFlash> flashes;
44 private int faceNum = 0;
46 public JackieSquares(GLucose glucose) {
48 addParameter(rateParameter);
49 addParameter(attackParameter);
50 addParameter(decayParameter);
51 addParameter(saturationParameter);
52 addModulator(hueMod).trigger();
53 addModulator(spreadMod).trigger();
55 flashes = new LinkedList<FaceFlash>();
58 public void run(double deltaMs) {
59 leftoverMs += deltaMs;
60 float msPerFlash = 1000 / ((rateParameter.getValuef() + .01) * 100);
61 while (leftoverMs > msPerFlash) {
62 leftoverMs -= msPerFlash;
63 faceNum += int(spreadMod.getValuef());
64 flashes.add(new FaceFlash(faceNum));
67 for (LXPoint p : model.points) {
71 for (FaceFlash flash : flashes) {
72 float hue = (hueMod.getValuef() + flash.hue) % 360.0;
73 color c = lx.hsb(hue, saturationParameter.getValuef() * 100, (flash.value) * 100);
74 for (LXPoint p : flash.f.points) {
79 Iterator<FaceFlash> i = flashes.iterator();
81 FaceFlash flash = i.next();
82 boolean dead = flash.age(deltaMs);