Add a debug overlay mode that can set channels/cubes to black/white
authorMark Slee <mcslee@Mark-Slees-MacBook-Pro.local>
Sun, 30 Jun 2013 19:39:53 +0000 (12:39 -0700)
committerMark Slee <mcslee@Mark-Slees-MacBook-Pro.local>
Sun, 30 Jun 2013 19:39:53 +0000 (12:39 -0700)
_Internals.pde
_Overlay.pde

index 3bf4d3199572b85cfe9370ada56c689bd1477004..dab8bdd920a665e768cceda90fda4dc681d72be6 100644 (file)
@@ -53,6 +53,7 @@ boolean mappingMode = false;
 boolean pandaBoardsEnabled = false;
 
 boolean debugMode = false;
+DebugUI debugUI;
 
 // Camera variables
 float eyeR, eyeA, eyeX, eyeY, eyeZ, midX, midY, midZ;
@@ -93,6 +94,7 @@ void setup() {
   // Build overlay UI
   ui = controlUI = new ControlUI();
   mappingUI = new MappingUI(mappingTool);
+  debugUI = new DebugUI(frontChannels, rearChannels);
   logTime("Built overlay UI");
     
   // MIDI devices
@@ -101,7 +103,7 @@ void setup() {
   }
   SCMidiDevices.initializeStandardDevices(glucose);
   logTime("Setup MIDI devices");
-  
+    
   // Setup camera
   midX = glucose.model.xMax/2 + 20;
   midY = glucose.model.yMax/2;
@@ -149,6 +151,10 @@ void draw() {
   // Draws the simulation and the 2D UI overlay
   background(40);
   color[] colors = glucose.getColors();
+  if (debugMode) {
+    debugUI.maskColors(colors);
+  }
+  
   camera(
     eyeX, eyeY, eyeZ,
     midX, midY, midZ,
@@ -181,6 +187,10 @@ void draw() {
   strokeWeight(1);
   drawUI();
   
+  if (debugMode) {
+    debugUI.draw();
+  }
+    
   // TODO(mcslee): move into GLucose engine
   if (pandaBoardsEnabled) {
     pandaFront.send(colors);
@@ -216,6 +226,7 @@ void keyPressed() {
     case 'd':
       debugMode = !debugMode;
       println("Debug output: " + (debugMode ? "ON" : "OFF"));
+      break;
     case 'm':
       mappingMode = !mappingMode;
       if (mappingMode) {
@@ -250,6 +261,9 @@ void mousePressed() {
   if (mouseX > ui.leftPos) {
     ui.mousePressed();
   } else {
+    if (debugMode) {
+      debugUI.mousePressed();
+    }    
     mx = mouseX;
     my = mouseY;
   }
index 5ee02a4a3349a1567b7237ad4ac4374fddbed03d..08e0befa89606f9d7ccfb8aaebd0e6682b822cca 100644 (file)
@@ -614,3 +614,148 @@ class MappingUI extends OverlayUI {
   }
 }
 
+class DebugUI {
+  
+  final int[][] channelList;
+  final int debugX = 10;
+  final int debugY = 42;
+  final int debugXSpacing = 28;
+  final int debugYSpacing = 22;
+  final int[][] debugState = new int[17][6];
+  
+  final int DEBUG_STATE_ANIM = 0;
+  final int DEBUG_STATE_WHITE = 1;
+  final int DEBUG_STATE_OFF = 2;
+  
+  DebugUI(int[][] frontChannels, int[][] rearChannels) {
+    channelList = new int[frontChannels.length + rearChannels.length][];
+    int channelIndex = 0;
+    for (int[] channel : frontChannels) {
+      channelList[channelIndex++] = channel;
+    }
+    for (int[] channel : rearChannels) {    
+      channelList[channelIndex++] = channel;
+    }
+    for (int i = 0; i < debugState.length; ++i) {
+      for (int j = 0; j < debugState[i].length; ++j) {
+        debugState[i][j] = DEBUG_STATE_ANIM;
+      }
+    }
+  }
+  
+  void draw() {
+    noStroke();
+    int xBase = debugX;
+    int yPos = debugY;
+    
+    fill(color(0, 0, 0, 80));
+    rect(4, 32, 172, 388);
+    
+    int channelNum = 0;
+    for (int[] channel : channelList) {
+      int xPos = xBase;
+      drawNumBox(xPos, yPos, channelNum+1, debugState[channelNum][0]);
+      
+      boolean first = true;
+      int cubeNum = 0;
+      for (int cube : channel) {
+        if (cube == 0) {
+          break;
+        }
+        xPos += debugXSpacing;
+        if (first) {
+          first = false;
+        } else {
+          stroke(#999999);          
+          line(xPos - 12, yPos + 8, xPos, yPos + 8);
+        }
+        drawNumBox(xPos, yPos, cube, debugState[channelNum][cubeNum+1]);
+        ++cubeNum;
+      }
+      
+      yPos += debugYSpacing;
+      ++channelNum;
+    }
+    drawNumBox(xBase, yPos, "A", debugState[channelNum][0]);
+  }
+  
+  void drawNumBox(int xPos, int yPos, int label, int state) {
+    drawNumBox(xPos, yPos, "" + label, state);
+  }
+  
+  void drawNumBox(int xPos, int yPos, String label, int state) {
+    noFill();
+    color textColor = #cccccc;
+    switch (state) {
+      case DEBUG_STATE_ANIM:
+        noStroke();
+        fill(#880000);
+        rect(xPos, yPos, 16, 8);
+        fill(#000088);
+        rect(xPos, yPos+8, 16, 8);
+        noFill();
+        stroke(textColor);
+        rect(xPos, yPos, 16, 16); 
+        break;
+      case DEBUG_STATE_WHITE:
+        stroke(textColor);
+        fill(#e9e9e9);
+        rect(xPos, yPos, 16, 16);
+        textColor = #333333;
+        break;
+      case DEBUG_STATE_OFF:
+        stroke(textColor);
+        rect(xPos, yPos, 16, 16);
+        break;
+    }
+    
+    noStroke();
+    fill(textColor);
+    text(label, xPos + 2, yPos + 12);
+  
+  }
+  
+  void maskColors(color[] colors) {
+    color white = #FFFFFF;
+    color off = #000000;
+    int channelIndex = 0;
+    for (int[] channel : channelList) {
+      int cubeIndex = 1;
+      for (int rawCubeIndex : channel) {
+        if (rawCubeIndex > 0) {
+          int state = debugState[channelIndex][cubeIndex];
+          if (state != DEBUG_STATE_ANIM) {
+            color debugColor = (state == DEBUG_STATE_WHITE) ? white : off;
+            Cube cube = glucose.model.getCubeByRawIndex(rawCubeIndex);
+            for (Point p : cube.points) {
+              colors[p.index] = debugColor;
+            }
+          }
+        }
+        ++cubeIndex;
+      }
+      ++channelIndex;
+    }
+  }
+  
+  void mousePressed() {
+    int dx = (mouseX - debugX) / debugXSpacing;
+    int dy = (mouseY - debugY) / debugYSpacing;
+    if ((dy >= 0) && (dy < debugState.length)) {
+      if ((dx >= 0) && (dx < debugState[dy].length)) {
+        int newState = debugState[dy][dx] = (debugState[dy][dx] + 1) % 3;
+        if (dy == 16) {
+          for (int[] states : debugState) {
+            for (int i = 0; i < states.length; ++i) {
+              states[i] = newState;
+            }
+          }
+        } else if (dx == 0) {
+          for (int i = 0; i < debugState[dy].length; ++i) {
+            debugState[dy][i] = newState;
+          }
+        }
+      }
+    }
+  }    
+}