added red label for duplicate cubes in mapping + list of unused cubes
[SugarCubes.git] / _Overlay.pde
index 2ee00c8c26b8247d8fac858ace30873851d2b67b..2623e8276fb668135acc5a4f039fc0a8cb92e35f 100644 (file)
@@ -42,7 +42,7 @@ abstract class OverlayUI {
   protected final int STATE_PENDING = 2;
   
   protected int[] pandaLeft = new int[pandaBoards.length];
-  protected final int pandaWidth = 56;
+  protected final int pandaWidth = 64;
   protected final int pandaHeight = 13;
   protected final int pandaTop = height-16;
   
@@ -75,26 +75,42 @@ abstract class OverlayUI {
     text("Tap 'u' to restore UI", width-4, height-6);
   }
 
+  public void drawDanText() {
+    textFont(itemFont);
+    textAlign(LEFT);
+    fill(#FFFFFF);
+    text(DanTextLine1, 4, height-50);
+    text(DanTextLine2, 4, height-30);
+  }
+
   public void drawFPS() {
     textFont(titleFont);
     textAlign(LEFT);
     fill(#666666);
-    text("FPS: " + (((int)(frameRate * 10)) / 10.), 4, height-6);
-    text("Target (-/+):", 50, height-6);
+    int lPos = 4;
+    String fps = "FPS: " + (((int)(frameRate * 10)) / 10.);
+    text(fps, lPos, height-6);
+    lPos += 48;
+    
+    String target = "Target (-/+):";
+    text(target, lPos, height-6);
     fill(#000000);
-    rect(104, height-16, 20, 13);
+    lPos += textWidth(target) + 4;
+    rect(lPos, height-16, 24, 13);
     fill(#666666);
-    text("" + targetFramerate, 108, height-6);
-    text("PandaOutput (p):", 134, height-6);
-    int lPos = 214;
+    text("" + targetFramerate, lPos + (24 - textWidth("" + targetFramerate))/2, height-6);
+    lPos += 32;
+    String pandaOutput = "PandaOutput (p):";
+    text(pandaOutput, lPos, height-6);
+    lPos += textWidth(pandaOutput)+4;
     int pi = 0;
     for (PandaDriver p : pandaBoards) {
       pandaLeft[pi++] = lPos;
       fill(p.enabled ? #666666 : #000000);
       rect(lPos, pandaTop, pandaWidth, pandaHeight);
       fill(p.enabled ? #000000 : #666666);
-      text(p.ip, lPos + 4, height-6);
-      lPos += 60;
+      text(p.ip, lPos + (pandaWidth - textWidth(p.ip)) / 2, height-6);
+      lPos += pandaWidth + 8;
     }
 
   }
@@ -622,6 +638,7 @@ class MappingUI extends OverlayUI {
   
   public void draw() {
     drawLogoAndBackground();
+    
     int yPos = 0;
     firstMappingY = yPos + lineHeight + 6;    
     yPos = drawObjectList(yPos, "MAPPING MODE", mappingModes, mappingModes, mappingModeStateMethod);
@@ -749,11 +766,18 @@ class MappingUI extends OverlayUI {
 class DebugUI {
   
   final ChannelMapping[] channelList;
-  final int debugX = 10;
-  final int debugY = 42;
+  final int debugX = 5;
+  final int debugY = 5;
   final int debugXSpacing = 28;
-  final int debugYSpacing = 22;
-  final int[][] debugState = new int[17][6];
+  final int debugYSpacing = 21;
+  final int[][] debugState;
+  final int[] indexState;
+  
+  final int ERROR_STATE_USED = 0;
+  final int ERROR_STATE_DUPLICATED = 1;
+  
+  final int CUBE_STATE_UNUSED = 0;
+  final int CUBE_STATE_USED = 1;
   
   final int DEBUG_STATE_ANIM = 0;
   final int DEBUG_STATE_WHITE = 1;
@@ -761,6 +785,9 @@ class DebugUI {
   
   DebugUI(PandaMapping[] pandaMappings) {
     int totalChannels = pandaMappings.length * PandaMapping.CHANNELS_PER_BOARD;
+    debugState = new int[totalChannels+1][ChannelMapping.CUBES_PER_CHANNEL+1];
+    indexState = new int[glucose.model.cubes.size()+1];
+    
     channelList = new ChannelMapping[totalChannels];
     int channelIndex = 0;
     for (PandaMapping pm : pandaMappings) {
@@ -773,6 +800,16 @@ class DebugUI {
         debugState[i][j] = DEBUG_STATE_ANIM;
       }
     }
+    
+    for (int rawIndex = 0; rawIndex < glucose.model.cubes.size()+1; rawIndex++) {
+      indexState[rawIndex] = CUBE_STATE_UNUSED;
+    }
+    for (ChannelMapping channel : channelList) {
+      for (int rawCubeIndex : channel.objectIndices) {
+        if (rawCubeIndex > 0)
+          indexState[rawCubeIndex]++;
+      }
+    }
   }
   
   void draw() {    
@@ -780,8 +817,8 @@ class DebugUI {
     int xBase = debugX;
     int yPos = debugY;
     
-    fill(color(0, 0, 0, 80));
-    rect(4, 32, 172, 388);
+    fill(#000000);
+    rect(0, 0, debugX + 5*debugXSpacing, height);
     
     int channelNum = 0;
     for (ChannelMapping channel : channelList) {
@@ -803,7 +840,7 @@ class DebugUI {
               stroke(#999999);          
               line(xPos - 12, yPos + 8, xPos, yPos + 8);
             }
-            drawNumBox(xPos, yPos, rawCubeIndex, debugState[channelNum][stateIndex+1]);
+            drawNumBox(xPos, yPos, rawCubeIndex, debugState[channelNum][stateIndex+1], indexState[rawCubeIndex]);
             ++stateIndex;
             xPos += debugXSpacing;            
           }
@@ -814,7 +851,7 @@ class DebugUI {
         case ChannelMapping.MODE_SPEAKER:
           drawNumBox(xPos, yPos, "S" + channel.objectIndices[0], debugState[channelNum][1]);
           break;
-        case ChannelMapping.MODE_FLOOR:
+        case ChannelMapping.MODE_STRUTS_AND_FLOOR:
           drawNumBox(xPos, yPos, "F", debugState[channelNum][1]);
           break;
         case ChannelMapping.MODE_NULL:
@@ -827,12 +864,41 @@ class DebugUI {
       ++channelNum;
     }
     drawNumBox(xBase, yPos, "A", debugState[channelNum][0]);
+    yPos += debugYSpacing * 2;
+   
+    noFill();
+    stroke(#CCCCCC);
+    rect(xBase, yPos, 100, 16);
+    fill(#CCCCCC);
+    text("Unused Cubes",  xBase + 5, yPos + 12);
+    yPos += debugYSpacing;
+    
+    int x_index = 0;
+    for (int rawIndex = 1; rawIndex < glucose.model.cubes.size()+1; rawIndex++) {
+      if (indexState[rawIndex] == 0) {
+        drawNumBox(xBase + (x_index * debugXSpacing), yPos, rawIndex, 0, 2);
+        x_index++;
+        if (x_index > 4) {
+          x_index = 0;
+          yPos += debugYSpacing + 2;
+        }
+      }
+    }
   }
+
   
   void drawNumBox(int xPos, int yPos, int label, int state) {
     drawNumBox(xPos, yPos, "" + label, state);
   }
   
+  void drawNumBox(int xPos, int yPos, int label, int state, int cube_state) {
+    if (cube_state > 1) {
+      fill(#FF0000);
+      rect(xPos-2, yPos-2, 20, 20);
+    }
+    drawNumBox(xPos, yPos, label, state);
+  }
+  
   void drawNumBox(int xPos, int yPos, String label, int state) {
     noFill();
     color textColor = #cccccc;
@@ -893,19 +959,26 @@ class DebugUI {
            state = debugState[channelIndex][1];
            if (state != DEBUG_STATE_ANIM) {
               color debugColor = (state == DEBUG_STATE_WHITE) ? white : off;
-              for (Point p : glucose.model.bassBox.points) {
-                colors[p.index] = debugColor;
+              for (Strip s : glucose.model.bassBox.boxStrips) {
+                for (Point p : s.points) {
+                  colors[p.index] = debugColor;
+                }
               }
            }
            break;
 
-         case ChannelMapping.MODE_FLOOR:
+         case ChannelMapping.MODE_STRUTS_AND_FLOOR:
            state = debugState[channelIndex][1];
            if (state != DEBUG_STATE_ANIM) {
               color debugColor = (state == DEBUG_STATE_WHITE) ? white : off;
               for (Point p : glucose.model.boothFloor.points) {
                 colors[p.index] = debugColor;
               }
+              for (Strip s : glucose.model.bassBox.struts) {
+                for (Point p : s.points) {
+                  colors[p.index] = debugColor;
+                }
+              }
            }
            break;
            
@@ -935,7 +1008,7 @@ class DebugUI {
     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) {
+        if (dy == debugState.length-1) {
           for (int[] states : debugState) {
             for (int i = 0; i < states.length; ++i) {
               states[i] = newState;