X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=_Internals.pde;h=9d6e2740a4aea94a54cd807202b86949403b6a98;hb=e530876366cf4c07a5e77b7e8890dff376cbcd3c;hp=d4a5fcc76159767c41cf2a88aeffb3ff5e109c69;hpb=34327c962351112e07c3d93f56ffc543fac45b58;p=SugarCubes.git diff --git a/_Internals.pde b/_Internals.pde index d4a5fcc..9d6e274 100644 --- a/_Internals.pde +++ b/_Internals.pde @@ -39,6 +39,9 @@ final float TRAILER_WIDTH = 240; final float TRAILER_DEPTH = 97; final float TRAILER_HEIGHT = 33; +final int MaxCubeHeight = 5; +final int NumBackTowers = 9; + int targetFramerate = 60; int startMillis, lastMillis; @@ -48,7 +51,7 @@ HeronLX lx; LXPattern[] patterns; MappingTool mappingTool; PandaDriver[] pandaBoards; -final List midiListeners = new ArrayList(); +MidiEngine midiEngine; // Display configuration mode boolean mappingMode = false; @@ -56,11 +59,14 @@ boolean debugMode = false; DebugUI debugUI; boolean uiOn = true; LXPattern restoreToPattern = null; +PImage logo; +float[] hsb = new float[3]; // Handles to UI objects UIContext[] overlays; UIPatternDeck uiPatternA; UICrossfader uiCrossfader; +UIMidi uiMidi; UIMapping uiMapping; UIDebugText uiDebugText; @@ -70,14 +76,31 @@ float eyeR, eyeA, eyeX, eyeY, eyeZ, midX, midY, midZ; /** * Engine construction and initialization. */ -LXPattern[] _patterns(GLucose glucose) { + +LXTransition _transition(GLucose glucose) { + return new DissolveTransition(glucose.lx).setDuration(1000); +} + +LXPattern[] _leftPatterns(GLucose glucose) { LXPattern[] patterns = patterns(glucose); for (LXPattern p : patterns) { - p.setTransition(new DissolveTransition(glucose.lx).setDuration(1000)); + p.setTransition(_transition(glucose)); } return patterns; } +LXPattern[] _rightPatterns(GLucose glucose) { + LXPattern[] patterns = _leftPatterns(glucose); + LXPattern[] rightPatterns = new LXPattern[patterns.length+1]; + int i = 0; + rightPatterns[i++] = new BlankPattern(glucose).setTransition(_transition(glucose)); + for (LXPattern p : patterns) { + rightPatterns[i++] = p; + } + return rightPatterns; +} + + void logTime(String evt) { int now = millis(); println(evt + ": " + (now - lastMillis) + "ms"); @@ -102,14 +125,18 @@ void setup() { // Set the patterns Engine engine = lx.engine; - engine.setPatterns(patterns = _patterns(glucose)); - engine.addDeck(_patterns(glucose)); + engine.setPatterns(patterns = _leftPatterns(glucose)); + engine.addDeck(_rightPatterns(glucose)); logTime("Built patterns"); glucose.setTransitions(transitions(glucose)); logTime("Built transitions"); glucose.lx.addEffects(effects(glucose)); logTime("Built effects"); - + + // MIDI devices + midiEngine = new MidiEngine(); + logTime("Setup MIDI devices"); + // Build output driver PandaMapping[] pandaMappings = buildPandaList(); pandaBoards = new PandaDriver[pandaMappings.length]; @@ -119,33 +146,31 @@ void setup() { } mappingTool = new MappingTool(glucose, pandaMappings); logTime("Built PandaDriver"); - + // Build overlay UI debugUI = new DebugUI(pandaMappings); overlays = new UIContext[] { - uiPatternA = new UIPatternDeck(lx.engine.getDeck(0), "PATTERN A", 4, 4, 140, 344), - uiCrossfader = new UICrossfader(4, 352, 140, 212), - new UIOutput(4, 568, 140, 106), + uiPatternA = new UIPatternDeck(lx.engine.getDeck(0), "PATTERN A", 4, 4, 140, 324), + new UIBlendMode(4, 332, 140, 86), + new UIEffects(4, 422, 140, 144), + new UITempo(4, 570, 140, 50), + new UISpeed(4, 624, 140, 50), + + new UIPatternDeck(lx.engine.getDeck(1), "PATTERN B", width-144, 4, 140, 324), + uiMidi = new UIMidi(midiEngine, width-144, 332, 140, 158), + new UIOutput(width-144, 494, 140, 106), - new UIPatternDeck(lx.engine.getDeck(1), "PATTERN B", width-144, 4, 140, 344), - new UIEffects(width-144, 352, 140, 144), - new UITempo(width-144, 498, 140, 50), - new UISpeed(width-144, 552, 140, 50), + uiCrossfader = new UICrossfader(width/2-90, height-90, 180, 86), - uiDebugText = new UIDebugText(4, height-64, width-8, 44), - uiMapping = new UIMapping(mappingTool, 4, 4, 140, 344), + uiDebugText = new UIDebugText(148, height-138, width-304, 44), + uiMapping = new UIMapping(mappingTool, 4, 4, 140, 324), }; uiMapping.setVisible(false); logTime("Built overlay UI"); - - // MIDI devices - midiListeners.add(new MidiListener().setEnabled(true)); - for (MidiInputDevice d : RWMidi.getInputDevices()) { - midiListeners.add(new MidiListener(d)); - } - SCMidiDevices.initializeStandardDevices(glucose); - logTime("Setup MIDI devices"); - + + // Load logo image + logo = loadImage("data/logo.png"); + // Setup camera midX = TRAILER_WIDTH/2.; midY = glucose.model.yMax/2; @@ -155,6 +180,8 @@ void setup() { eyeY = midY + 70; eyeX = midX + eyeR*sin(eyeA); eyeZ = midZ + eyeR*cos(eyeA); + + // Add mouse scrolling event support addMouseWheelListener(new java.awt.event.MouseWheelListener() { public void mouseWheelMoved(java.awt.event.MouseWheelEvent mwe) { mouseWheel(mwe.getWheelRotation()); @@ -164,87 +191,25 @@ void setup() { println("Hit the 'p' key to toggle Panda Board output"); } -public class MidiListener { - private boolean enabled = false; - private final String name; - - MidiListener(MidiInputDevice d) { - d.createInput(this); - name = d.getName(); - } - - MidiListener() { - registerKeyEvent(this); - name = "Keyboard"; - } - - public String getName() { - return name; - } - - public void keyEvent(KeyEvent e) { - if (e.getID() == KeyEvent.KEY_PRESSED) { - switch (e.getKeyChar()) { - case 'q': - noteOnReceived(new Note(60, 127)); - break; - } - } else if (e.getID() == KeyEvent.KEY_RELEASED) { - switch (e.getKeyChar()) { - case 'q': - noteOffReceived(new Note(60, 0)); - break; - } - } - } - - public MidiListener setEnabled(boolean enabled) { - if (enabled != this.enabled) { - this.enabled = enabled; - // notify midi UI to update - } - return this; - } - - void controllerChangeReceived(rwmidi.Controller cc) { - if (!enabled) { - return; - } - println("CC: " + cc.toString()); - } - - void noteOnReceived(Note note) { - if (!enabled) { - return; - } - println("Note On: " + note.toString()); - } - - void noteOffReceived(Note note) { - if (!enabled) { - return; - } - println("Note Off: " + note.toString()); - } - -} - /** * Core render loop and drawing functionality. */ void draw() { // Draws the simulation and the 2D UI overlay background(40); - color[] colors = glucose.getColors(); + color[] simulationColors; + color[] sendColors; + simulationColors = sendColors = glucose.getColors(); String displayMode = uiCrossfader.getDisplayMode(); if (displayMode == "A") { - colors = lx.engine.getDeck(0).getColors(); + simulationColors = lx.engine.getDeck(0).getColors(); } else if (displayMode == "B") { - colors = lx.engine.getDeck(1).getColors(); + simulationColors = lx.engine.getDeck(1).getColors(); } if (debugMode) { - debugUI.maskColors(colors); + debugUI.maskColors(simulationColors); + debugUI.maskColors(sendColors); } camera( @@ -253,7 +218,7 @@ void draw() { 0, -1, 0 ); - translate(0, 10, 0); + translate(0, 40, 0); noStroke(); fill(#141414); @@ -266,12 +231,22 @@ void draw() { vertex(TRAILER_WIDTH, 0, TRAILER_DEPTH); vertex(0, 0, TRAILER_DEPTH); endShape(); + + // Draw the logo on the front of platform + pushMatrix(); + translate(0, 0, -1); + float s = .07; + scale(s, -s, s); + image(logo, TRAILER_WIDTH/2/s-logo.width/2, TRAILER_HEIGHT/2/s-logo.height/2-2/s); + popMatrix(); noStroke(); -// drawBassBox(glucose.model.bassBox); -// for (Speaker s : glucose.model.speakers) { -// drawSpeaker(s); -// } + if (glucose.model.bassBox.exists) { + drawBassBox(glucose.model.bassBox, false); + } + for (Speaker speaker : glucose.model.speakers) { + drawSpeaker(speaker); + } for (Cube c : glucose.model.cubes) { drawCube(c); } @@ -279,51 +254,41 @@ void draw() { noFill(); strokeWeight(2); beginShape(POINTS); - // TODO(mcslee): restore when bassBox/speakers are right again - // for (Point p : glucose.model.points) { - for (Cube cube : glucose.model.cubes) { - for (Point p : cube.points) { - stroke(colors[p.index]); - vertex(p.fx, p.fy, p.fz); - } + for (Point p : glucose.model.points) { + stroke(simulationColors[p.index]); + vertex(p.x, p.y, p.z); } endShape(); // 2D Overlay UI drawUI(); - // Send output colors - color[] sendColors = glucose.getColors(); - if (debugMode) { - debugUI.maskColors(colors); - } - // Gamma correction here. Apply a cubic to the brightness // for better representation of dynamic range - for (int i = 0; i < colors.length; ++i) { - float b = brightness(colors[i]) / 100.f; - colors[i] = color( - hue(colors[i]), - saturation(colors[i]), - (b*b*b) * 100. - ); + for (int i = 0; i < sendColors.length; ++i) { + lx.RGBtoHSB(sendColors[i], hsb); + float b = hsb[2]; + sendColors[i] = lx.hsb(360.*hsb[0], 100.*hsb[1], 100.*(b*b*b)); } // TODO(mcslee): move into GLucose engine for (PandaDriver p : pandaBoards) { - p.send(colors); + p.send(sendColors); } } -void drawBassBox(BassBox b) { +void drawBassBox(BassBox b, boolean hasSub) { + float in = .15; - - noStroke(); - fill(#191919); - pushMatrix(); - translate(b.x + BassBox.EDGE_WIDTH/2., b.y + BassBox.EDGE_HEIGHT/2, b.z + BassBox.EDGE_DEPTH/2.); - box(BassBox.EDGE_WIDTH-20*in, BassBox.EDGE_HEIGHT-20*in, BassBox.EDGE_DEPTH-20*in); - popMatrix(); + + if (hasSub) { + noStroke(); + fill(#191919); + pushMatrix(); + translate(b.x + BassBox.EDGE_WIDTH/2., b.y + BassBox.EDGE_HEIGHT/2, b.z + BassBox.EDGE_DEPTH/2.); + box(BassBox.EDGE_WIDTH-20*in, BassBox.EDGE_HEIGHT-20*in, BassBox.EDGE_DEPTH-20*in); + popMatrix(); + } noStroke(); fill(#393939); @@ -445,6 +410,7 @@ void drawUI() { } } + /** * Top-level keyboard event handling */ @@ -460,24 +426,36 @@ void keyPressed() { case '=': case '+': frameRate(++targetFramerate); - break; + break; + case 'b': + EFF_boom.trigger(); + break; case 'd': - debugMode = !debugMode; - println("Debug output: " + (debugMode ? "ON" : "OFF")); + if (!midiEngine.isQwertyEnabled()) { + debugMode = !debugMode; + println("Debug output: " + (debugMode ? "ON" : "OFF")); + } break; case 'm': - mappingMode = !mappingMode; - uiPatternA.setVisible(!mappingMode); - uiMapping.setVisible(mappingMode); - if (mappingMode) { - restoreToPattern = lx.getPattern(); - lx.setPatterns(new LXPattern[] { mappingTool }); - } else { - lx.setPatterns(patterns); - LXTransition pop = restoreToPattern.getTransition(); - restoreToPattern.setTransition(null); - lx.goPattern(restoreToPattern); - restoreToPattern.setTransition(pop); + if (!midiEngine.isQwertyEnabled()) { + mappingMode = !mappingMode; + uiPatternA.setVisible(!mappingMode); + uiMapping.setVisible(mappingMode); + if (mappingMode) { + restoreToPattern = lx.getPattern(); + lx.setPatterns(new LXPattern[] { mappingTool }); + } else { + lx.setPatterns(patterns); + LXTransition pop = restoreToPattern.getTransition(); + restoreToPattern.setTransition(null); + lx.goPattern(restoreToPattern); + restoreToPattern.setTransition(pop); + } + } + break; + case 't': + if (!midiEngine.isQwertyEnabled()) { + lx.engine.setThreaded(!lx.engine.isThreaded()); } break; case 'p': @@ -486,7 +464,9 @@ void keyPressed() { } break; case 'u': - uiOn = !uiOn; + if (!midiEngine.isQwertyEnabled()) { + uiOn = !uiOn; + } break; } } @@ -531,7 +511,7 @@ void mouseReleased() { context.mouseReleased(mouseX, mouseY); } } - + void mouseWheel(int delta) { boolean wheeled = false; for (UIContext context : overlays) {