New two-color noise mode + initial draft on commands
[kaka/cakelight.git] / src / kaka / cakelight / mode / TwoColorNoiseMode.java
diff --git a/src/kaka/cakelight/mode/TwoColorNoiseMode.java b/src/kaka/cakelight/mode/TwoColorNoiseMode.java
new file mode 100644 (file)
index 0000000..6d2dabe
--- /dev/null
@@ -0,0 +1,64 @@
+package kaka.cakelight.mode;
+
+import kaka.cakelight.*;
+import kaka.cakelight.util.SimplexNoise3D;
+
+public class TwoColorNoiseMode extends AmbientMode {
+    private final Color primary, secondary;
+    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(CakeLight cakelight, Configuration config, String[] args) {
+                if (args.length == 3) { // cmd + col1 + col2
+                    cakelight.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 primary, Color secondary) {
+        this.primary = primary;
+        this.secondary = secondary;
+    }
+
+    @Override
+    protected void updateFrame(LedFrame frame, long time, int count) {
+        for (int i = 0; i < config.leds.getCount(); i++) {
+            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));
+        }
+    }
+}