Any number of colors (>1) for noise mode
[kaka/cakelight.git] / src / kaka / cakelight / mode / TwoColorNoiseMode.java
index 7577f66..6e8de55 100644 (file)
@@ -1,57 +1,23 @@
 package kaka.cakelight.mode;
 
 import kaka.cakelight.Color;
-import kaka.cakelight.Console;
 import kaka.cakelight.LedFrame;
 import kaka.cakelight.util.SimplexNoise3D;
 
 public class TwoColorNoiseMode extends AmbientMode {
-    private final Color primary, secondary;
+    //    private final Color primary, secondary;
+    private final Color[] colors;
     private SimplexNoise3D noise = new SimplexNoise3D(0);
 
-    public static Console.Command getCommand() {
-        return new Console.Command() {
-            public String[] getNames() {
-                return new String[] {"n", "noise"};
-            }
-
-            public void activate(Console console, String[] args) {
-                if (args.length == 3) { // cmd + col1 + col2
-                    console.getCakelight().setMode(new TwoColorNoiseMode(
-                            parseColor(args[1]),
-                            parseColor(args[2])
-                    ));
-                }
-            }
-
-            private Color parseColor(String s) {
-                switch (s.toLowerCase()) {
-                    case "r": return Color.rgb(255, 0, 0);
-                    case "g": return Color.rgb(0, 255, 0);
-                    case "b": return Color.rgb(0, 0, 255);
-                    default: // assume hexadecimal
-                        if (s.length() == 3) {
-                            return Color.rgb(
-                                    Integer.parseInt(s.substring(0, 1), 16) * 16 + Integer.parseInt(s.substring(0, 1), 16),
-                                    Integer.parseInt(s.substring(1, 2), 16) * 16 + Integer.parseInt(s.substring(1, 2), 16),
-                                    Integer.parseInt(s.substring(2, 3), 16) * 16 + Integer.parseInt(s.substring(2, 3), 16)
-                            );
-                        } else if (s.length() == 6) {
-                            return Color.rgb(
-                                    Integer.parseInt(s.substring(0, 2), 16),
-                                    Integer.parseInt(s.substring(2, 4), 16),
-                                    Integer.parseInt(s.substring(4, 6), 16)
-                            );
-                        }
-                }
-                return Color.BLACK;
-            }
-        };
+    public TwoColorNoiseMode(Color... colors) {
+       assert colors.length > 1;
+        this.colors = colors;
     }
 
     public TwoColorNoiseMode(Color primary, Color secondary) {
-        this.primary = primary;
-        this.secondary = secondary;
+       this(new Color[] {primary, secondary});
+//        this.primary = primary;
+//        this.secondary = secondary;
     }
 
     @Override
@@ -60,7 +26,19 @@ public class TwoColorNoiseMode extends AmbientMode {
             double x = frame.xOf(i);
             double y = frame.yOf(i);
             double v = Math.pow(Math.min(1, Math.max(0, noise.getr(0.0, 1.0, 1, x, y, time / 7000.0))), 1.5);
-            frame.setLedColor(i, primary.interpolate(secondary, v));
+           //            frame.setLedColor(i, primary.interpolate(secondary, v));
+            frame.setLedColor(i, getColorAt(v));
         }
     }
+
+    private Color getColorAt(double value) { // 0.0 to 1.0
+       double localRange = 1.0 / (colors.length - 1);
+        int index = (int)(value / localRange);
+        double localValue = (value / localRange) - index;
+       if (index == colors.length - 1) {
+           return colors[colors.length - 1];
+       } else {
+           return colors[index].interpolate(colors[index + 1], localValue);
+       }
+    }
 }