X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=_Overlay.pde;h=2623e8276fb668135acc5a4f039fc0a8cb92e35f;hb=f3a1ffdfb114dfb66c79ac1116efa63c248ba6b6;hp=a02aa12fc653111915f22c6d93673ec21d91fc41;hpb=bd33a0f155de19be679b13e02737b7a44956ed03;p=SugarCubes.git diff --git a/_Overlay.pde b/_Overlay.pde index a02aa12..2623e82 100644 --- a/_Overlay.pde +++ b/_Overlay.pde @@ -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); @@ -748,12 +765,19 @@ class MappingUI extends OverlayUI { class DebugUI { - final int[][] channelList; - final int debugX = 10; - final int debugY = 42; + final ChannelMapping[] channelList; + 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,10 +785,13 @@ class DebugUI { DebugUI(PandaMapping[] pandaMappings) { int totalChannels = pandaMappings.length * PandaMapping.CHANNELS_PER_BOARD; - channelList = new int[totalChannels][]; + 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) { - for (int[] channel : pm.channelList) { + for (ChannelMapping channel : pm.channelList) { channelList[channelIndex++] = channel; } } @@ -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,41 +817,88 @@ 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 (int[] channel : channelList) { + for (ChannelMapping channel : channelList) { int xPos = xBase; drawNumBox(xPos, yPos, channelNum+1, debugState[channelNum][0]); + xPos += debugXSpacing; - boolean first = true; - int cubeNum = 0; - for (int cube : channel) { - if (cube <= 0) { + switch (channel.mode) { + case ChannelMapping.MODE_CUBES: + int stateIndex = 0; + boolean first = true; + for (int rawCubeIndex : channel.objectIndices) { + if (rawCubeIndex < 0) { + break; + } + if (first) { + first = false; + } else { + stroke(#999999); + line(xPos - 12, yPos + 8, xPos, yPos + 8); + } + drawNumBox(xPos, yPos, rawCubeIndex, debugState[channelNum][stateIndex+1], indexState[rawCubeIndex]); + ++stateIndex; + xPos += debugXSpacing; + } 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; - } + case ChannelMapping.MODE_BASS: + drawNumBox(xPos, yPos, "B", debugState[channelNum][1]); + break; + case ChannelMapping.MODE_SPEAKER: + drawNumBox(xPos, yPos, "S" + channel.objectIndices[0], debugState[channelNum][1]); + break; + case ChannelMapping.MODE_STRUTS_AND_FLOOR: + drawNumBox(xPos, yPos, "F", debugState[channelNum][1]); + break; + case ChannelMapping.MODE_NULL: + break; + default: + throw new RuntimeException("Unhandled channel mapping mode: " + channel.mode); + } yPos += debugYSpacing; ++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; @@ -851,20 +935,68 @@ class DebugUI { 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; + int state; + for (ChannelMapping channel : channelList) { + switch (channel.mode) { + case ChannelMapping.MODE_CUBES: + int cubeIndex = 1; + for (int rawCubeIndex : channel.objectIndices) { + if (rawCubeIndex >= 0) { + 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; } - } - ++cubeIndex; + break; + + case ChannelMapping.MODE_BASS: + state = debugState[channelIndex][1]; + if (state != DEBUG_STATE_ANIM) { + color debugColor = (state == DEBUG_STATE_WHITE) ? white : off; + for (Strip s : glucose.model.bassBox.boxStrips) { + for (Point p : s.points) { + colors[p.index] = debugColor; + } + } + } + break; + + 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; + + case ChannelMapping.MODE_SPEAKER: + state = debugState[channelIndex][1]; + if (state != DEBUG_STATE_ANIM) { + color debugColor = (state == DEBUG_STATE_WHITE) ? white : off; + for (Point p : glucose.model.speakers.get(channel.objectIndices[0]).points) { + colors[p.index] = debugColor; + } + } + break; + + case ChannelMapping.MODE_NULL: + break; + + default: + throw new RuntimeException("Unhandled channel mapping mode: " + channel.mode); } ++channelIndex; } @@ -876,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;