Any number of colors (>1) for noise mode
authorTomas Wenström <tomas@cakepi>
Sun, 22 Nov 2020 18:47:27 +0000 (19:47 +0100)
committerTomas Wenström <tomas@cakepi>
Sun, 22 Nov 2020 18:47:27 +0000 (19:47 +0100)
src/kaka/cakelight/Commands.java
src/kaka/cakelight/mode/TwoColorNoiseMode.java

index 9a2be3b..cbd9e38 100644 (file)
@@ -3,6 +3,7 @@ package kaka.cakelight;
 import kaka.cakelight.mode.*;
 
 import java.util.function.BiFunction;
+import java.util.stream.Stream;
 
 class Commands {
     private static Console.Command command(String[] names, BiFunction<Console, String[], Boolean> activate) {
@@ -156,11 +157,13 @@ class Commands {
 
     static Console.Command twoColorNoiseMode() {
         return modeCommand(new String[] {"n", "noise"}, (console, args) -> {
-           if (args.length == 2) {
-               console.out("setting two-color noise mode");
-               return new TwoColorNoiseMode(
-                       console.parseColor(args[0]),
-                       console.parseColor(args[1])
+           if (args.length > 1) {
+               console.out("setting multi-color noise mode");
+               return new TwoColorNoiseMode(Stream.of(args)
+                                            .map(arg -> console.parseColor(arg))
+                                            .toArray(Color[]::new)
+//                     console.parseColor(args[0]),
+//                     console.parseColor(args[1])
                );
            }
            return null;
index 7e39705..6e8de55 100644 (file)
@@ -5,12 +5,19 @@ 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 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
@@ -19,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);
+       }
+    }
 }