X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=_Internals.pde;h=0100c051c82d0b4bc8b6125829c5bff708e664b3;hb=344908672b7cfe1efba03f739ef945601dae1b8e;hp=fb2a9c7a7167867f7b6d9927320e97b67b839701;hpb=4ad9f85959980d306800ad50636f4fd7c2a5d36b;p=SugarCubes.git diff --git a/_Internals.pde b/_Internals.pde index fb2a9c7..0100c05 100644 --- a/_Internals.pde +++ b/_Internals.pde @@ -14,18 +14,17 @@ */ import glucose.*; -import glucose.control.*; -import glucose.effect.*; import glucose.model.*; -import glucose.pattern.*; -import glucose.transform.*; -import glucose.transition.*; import heronarts.lx.*; -import heronarts.lx.control.*; import heronarts.lx.effect.*; import heronarts.lx.modulator.*; +import heronarts.lx.parameter.*; import heronarts.lx.pattern.*; +import heronarts.lx.transform.*; import heronarts.lx.transition.*; +import heronarts.lx.ui.*; +import heronarts.lx.ui.component.*; +import heronarts.lx.ui.control.*; import ddf.minim.*; import ddf.minim.analysis.*; import processing.opengl.*; @@ -40,15 +39,13 @@ final float TRAILER_WIDTH = 240; final float TRAILER_DEPTH = 97; final float TRAILER_HEIGHT = 33; -final int MaxCubeHeight = 7; -final int NumBackTowers = 18; - int targetFramerate = 60; int startMillis, lastMillis; // Core engine variables GLucose glucose; LX lx; +Model model; LXPattern[] patterns; Effects effects; MappingTool mappingTool; @@ -68,7 +65,6 @@ PImage logo; float[] hsb = new float[3]; // Handles to UI objects -UIContext[] overlays; UIPatternDeck uiPatternA; UICrossfader uiCrossfader; UIMidi uiMidi; @@ -76,9 +72,6 @@ UIMapping uiMapping; UIDebugText uiDebugText; UISpeed uiSpeed; -// Camera variables -float eyeR, eyeA, eyeX, eyeY, eyeZ, midX, midY, midZ; - /** * Engine construction and initialization. */ @@ -136,11 +129,11 @@ void setup() { logTime("Created viewport"); // Create the GLucose engine to run the cubes - glucose = new GLucose(this, buildModel()); + glucose = new GLucose(this, model = buildModel()); lx = glucose.lx; lx.enableKeyboardTempo(); logTime("Built GLucose engine"); - + // Set the patterns LXEngine engine = lx.engine; engine.setPatterns(patterns = _leftPatterns(glucose)); @@ -160,6 +153,15 @@ void setup() { logTime("Setup MIDI devices"); // Build output driver + try { + GrizzlyOutput[] grizzlies = buildGrizzlies(); + for (LXOutput output : grizzlies) { + lx.addOutput(output); + } + } catch (Exception x) { + x.printStackTrace(); + } + PandaMapping[] pandaMappings = buildPandaList(); pandaBoards = new PandaDriver[pandaMappings.length]; int pbi = 0; @@ -171,44 +173,32 @@ void setup() { // Build overlay UI debugUI = new DebugUI(pandaMappings); - overlays = new UIContext[] { - uiPatternA = new UIPatternDeck(lx.engine.getDeck(GLucose.LEFT_DECK), "PATTERN A", 4, 4, 140, 324), + UIContext[] contexts = new UIContext[] { + uiPatternA = new UIPatternDeck(lx.ui, lx.engine.getDeck(GLucose.LEFT_DECK), "PATTERN A", 4, 4, 140, 324), new UIBlendMode(4, 332, 140, 86), new UIEffects(4, 422, 140, 144), new UITempo(4, 570, 140, 50), uiSpeed = new UISpeed(4, 624, 140, 50), - new UIPatternDeck(lx.engine.getDeck(GLucose.RIGHT_DECK), "PATTERN B", width-144, 4, 140, 324), + new UIPatternDeck(lx.ui, lx.engine.getDeck(GLucose.RIGHT_DECK), "PATTERN B", width-144, 4, 140, 324), uiMidi = new UIMidi(midiEngine, width-144, 332, 140, 158), new UIOutput(width-144, 494, 140, 106), uiCrossfader = new UICrossfader(width/2-90, height-90, 180, 86), uiDebugText = new UIDebugText(148, height-138, width-304, 44), - uiMapping = new UIMapping(mappingTool, 4, 4, 140, 324), + uiMapping = new UIMapping(mappingTool, 4, 4, 140, 324) }; uiMapping.setVisible(false); + lx.ui.addLayer(new UICameraLayer(lx.ui).setCenter(TRAILER_WIDTH/2., glucose.model.yMax/2, TRAILER_DEPTH/2.).setRadius(290).addComponent(new UICubesLayer())); + for (UIContext context : contexts) { + lx.ui.addLayer(context); + } logTime("Built overlay UI"); // Load logo image logo = loadImage("data/logo.png"); - - // Setup camera - midX = TRAILER_WIDTH/2.; - midY = glucose.model.yMax/2; - midZ = TRAILER_DEPTH/2.; - eyeR = -290; - eyeA = .15; - 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()); - }}); - + println("Total setup: " + (millis() - startMillis) + "ms"); println("Hit the 'p' key to toggle Panda Board output"); } @@ -219,33 +209,14 @@ void setup() { void draw() { long drawStart = System.nanoTime(); - // Draws the simulation and the 2D UI overlay + // Set background background(40); - - color[] simulationColors; - color[] sendColors; - simulationColors = sendColors = glucose.getColors(); - String displayMode = uiCrossfader.getDisplayMode(); - if (displayMode == "A") { - simulationColors = lx.engine.getDeck(GLucose.LEFT_DECK).getColors(); - } else if (displayMode == "B") { - simulationColors = lx.engine.getDeck(GLucose.RIGHT_DECK).getColors(); - } + + // Send colors + color[] sendColors = glucose.getColors(); if (debugMode) { - debugUI.maskColors(simulationColors); debugUI.maskColors(sendColors); } - - long simulationStart = System.nanoTime(); - if (simulationOn) { - drawSimulation(simulationColors); - } - long simulationNanos = System.nanoTime() - simulationStart; - - // 2D Overlay UI - long uiStart = System.nanoTime(); - drawUI(); - long uiNanos = System.nanoTime() - uiStart; long gammaStart = System.nanoTime(); // Gamma correction here. Apply a cubic to the brightness @@ -256,18 +227,52 @@ void draw() { sendColors[i] = lx.hsb(360.*hsb[0], 100.*hsb[1], 100.*(b*b*b)); } long gammaNanos = System.nanoTime() - gammaStart; - + long sendStart = System.nanoTime(); for (PandaDriver p : pandaBoards) { p.send(sendColors); } long sendNanos = System.nanoTime() - sendStart; - + + drawFPS(); + if (debugMode) { + debugUI.draw(); + } + + // TODO(mcslee): fix long drawNanos = System.nanoTime() - drawStart; + long simulationNanos = 0, uiNanos = 0; if (diagnosticsOn) { drawDiagnostics(drawNanos, simulationNanos, uiNanos, gammaNanos, sendNanos); - } + } +} + +class UICubesLayer extends UICameraComponent { + void onDraw(UI ui) { + color[] simulationColors = glucose.getColors(); + String displayMode = uiCrossfader.getDisplayMode(); + if (displayMode == "A") { + simulationColors = lx.engine.getDeck(GLucose.LEFT_DECK).getColors(); + } else if (displayMode == "B") { + simulationColors = lx.engine.getDeck(GLucose.RIGHT_DECK).getColors(); + } + if (debugMode) { + debugUI.maskColors(simulationColors); + } + + long simulationStart = System.nanoTime(); + if (simulationOn) { + drawSimulation(simulationColors); + } + long simulationNanos = System.nanoTime() - simulationStart; + + camera(); + javax.media.opengl.GL gl = ((PGraphicsOpenGL)g).beginGL(); + gl.glClear(javax.media.opengl.GL.GL_DEPTH_BUFFER_BIT); + ((PGraphicsOpenGL)g).endGL(); + strokeWeight(1); + } } void drawDiagnostics(long drawNanos, long simulationNanos, long uiNanos, long gammaNanos, long sendNanos) { @@ -328,12 +333,6 @@ void drawDiagnostics(long drawNanos, long simulationNanos, long uiNanos, long ga } void drawSimulation(color[] simulationColors) { - camera( - eyeX, eyeY, eyeZ, - midX, midY, midZ, - 0, -1, 0 - ); - translate(0, 40, 0); noStroke(); @@ -370,7 +369,7 @@ void drawSimulation(color[] simulationColors) { noFill(); strokeWeight(2); beginShape(POINTS); - for (Point p : glucose.model.points) { + for (LXPoint p : glucose.model.points) { stroke(simulationColors[p.index]); vertex(p.x, p.y, p.z); } @@ -486,28 +485,12 @@ void drawBox(float x, float y, float z, float rx, float ry, float rz, float xd, popMatrix(); } -void drawUI() { - camera(); - javax.media.opengl.GL gl = ((PGraphicsOpenGL)g).beginGL(); - gl.glClear(javax.media.opengl.GL.GL_DEPTH_BUFFER_BIT); - ((PGraphicsOpenGL)g).endGL(); - strokeWeight(1); - - if (uiOn) { - for (UIContext context : overlays) { - context.draw(); - } - } - +void drawFPS() { // Always draw FPS meter fill(#555555); textSize(9); textAlign(LEFT, BASELINE); text("FPS: " + ((int) (frameRate*10)) / 10. + " / " + targetFramerate + " (-/+)", 4, height-4); - - if (debugMode) { - debugUI.draw(); - } } @@ -622,53 +605,9 @@ void keyPressed() { /** * Top-level mouse event handling */ -int mx, my; void mousePressed() { - boolean debugged = false; if (debugMode) { - debugged = debugUI.mousePressed(); - } - if (!debugged) { - for (UIContext context : overlays) { - context.mousePressed(mouseX, mouseY); - } - } - mx = mouseX; - my = mouseY; -} - -void mouseDragged() { - boolean dragged = false; - for (UIContext context : overlays) { - dragged |= context.mouseDragged(mouseX, mouseY); - } - if (!dragged) { - int dx = mouseX - mx; - int dy = mouseY - my; - mx = mouseX; - my = mouseY; - eyeA += dx*.003; - eyeX = midX + eyeR*sin(eyeA); - eyeZ = midZ + eyeR*cos(eyeA); - eyeY += dy; + debugUI.mousePressed(); } } -void mouseReleased() { - for (UIContext context : overlays) { - context.mouseReleased(mouseX, mouseY); - } -} - -void mouseWheel(int delta) { - boolean wheeled = false; - for (UIContext context : overlays) { - wheeled |= context.mouseWheel(mouseX, mouseY, delta); - } - - if (!wheeled) { - eyeR = constrain(eyeR - delta, -500, -80); - eyeX = midX + eyeR*sin(eyeA); - eyeZ = midZ + eyeR*cos(eyeA); - } -}