From a898d79bac007404bed34365f31ffbc6480c901c Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Thu, 19 Sep 2013 13:59:41 -0700 Subject: [PATCH] Some cleanups and listen to deck for transition changes --- _Internals.pde | 28 +++++++++++++++++----------- _UIImplementation.pde | 31 ++++++++++++++++++++----------- code/GLucose.jar | Bin 26495 -> 26511 bytes code/HeronLX.jar | Bin 63884 -> 64496 bytes 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/_Internals.pde b/_Internals.pde index 16a2eb6..5839359 100644 --- a/_Internals.pde +++ b/_Internals.pde @@ -40,22 +40,24 @@ final float TRAILER_DEPTH = 97; final float TRAILER_HEIGHT = 33; int targetFramerate = 60; - int startMillis, lastMillis; + +// Core engine variables GLucose glucose; HeronLX lx; -MappingTool mappingTool; LXPattern[] patterns; -LXTransition[] transitions; -LXEffect[] effects; +MappingTool mappingTool; PandaDriver[] pandaBoards; + +// Display configuration mode boolean mappingMode = false; boolean debugMode = false; DebugUI debugUI; -String displayMode; +// Handles to UI objects UIContext[] overlays; UIPatternDeck uiPatternA; +UICrossfader uiCrossfader; UIMapping uiMapping; UIDebugText uiDebugText; @@ -88,13 +90,12 @@ void setup() { // Set the patterns Engine engine = lx.engine; - glucose.setTransitions(transitions = transitions(glucose)); - logTime("Built transitions"); engine.setPatterns(patterns = _patterns(glucose)); engine.addDeck(_patterns(glucose)); - engine.getDeck(1).setBlendTransition(transitions[0]); logTime("Built patterns"); - glucose.lx.addEffects(effects = effects(glucose)); + glucose.setTransitions(transitions(glucose)); + logTime("Built transitions"); + glucose.lx.addEffects(effects(glucose)); logTime("Built effects"); // Build output driver @@ -111,7 +112,7 @@ void setup() { debugUI = new DebugUI(pandaMappings); overlays = new UIContext[] { uiPatternA = new UIPatternDeck(lx.engine.getDeck(0), "PATTERN A", 4, 4, 140, 344), - new UICrossfader(4, 352, 140, 212), + uiCrossfader = new UICrossfader(4, 352, 140, 212), new UIPatternDeck(lx.engine.getDeck(1), "PATTERN B", width-144, 4, 140, 344), new UIEffects(width-144, 352, 140, 144), @@ -177,7 +178,9 @@ void logTime(String evt) { void draw() { // Draws the simulation and the 2D UI overlay background(40); - color[] colors = glucose.getColors();; + color[] colors = glucose.getColors(); + + String displayMode = uiCrossfader.getDisplayMode(); if (displayMode == "A") { colors = lx.engine.getDeck(0).getColors(); } else if (displayMode == "B") { @@ -414,7 +417,10 @@ void keyPressed() { lx.setPatterns(new LXPattern[] { mappingTool }); } else { lx.setPatterns(patterns); + LXTransition pop = restoreToPattern.getTransition(); + restoreToPattern.setTransition(null); lx.goPattern(restoreToPattern); + restoreToPattern.setTransition(pop); } break; case 'p': diff --git a/_UIImplementation.pde b/_UIImplementation.pde index c2d073c..d25df48 100644 --- a/_UIImplementation.pde +++ b/_UIImplementation.pde @@ -34,7 +34,7 @@ class UIPatternDeck extends UIWindow { parameterKnobs[ki].addToContainer(this); } - Engine.Listener lxListener = new Engine.Listener() { + Engine.Listener lxListener = new Engine.AbstractListener() { public void patternWillChange(Engine.Deck deck, LXPattern pattern, LXPattern nextPattern) { patternList.redraw(); } @@ -87,21 +87,30 @@ class UIPatternDeck extends UIWindow { } class UICrossfader extends UIWindow { - + + private final UIToggleSet displayMode; + public UICrossfader(float x, float y, float w, float h) { super("CROSSFADER", x, y, w, h); List items = new ArrayList(); - for (LXTransition t : transitions) { + for (LXTransition t : glucose.getTransitions()) { items.add(new TransitionScrollItem(t)); - } - new UIScrollList(1, titleHeight, w-2, 120).setItems(items).addToContainer(this); + } + final UIScrollList tList; + (tList = new UIScrollList(1, titleHeight, w-2, 120)).setItems(items).addToContainer(this); new UIParameterSlider(4, titleHeight + 126, w-10, 24).setParameter(lx.engine.getDeck(1).getCrossfader()).addToContainer(this); - new UIToggleSet(4, 182, w-10, 20) { - protected void onToggle(String value) { - displayMode = value; + (displayMode = new UIToggleSet(4, 182, w-10, 20)).setOptions(new String[] { "A", "COMP", "B" }).setValue("COMP").addToContainer(this); + + lx.engine.getDeck(1).addListener(new Engine.AbstractListener() { + public void blendTransitionDidChange(Engine.Deck deck, LXTransition transition) { + tList.redraw(); } - }.setOptions(new String[] { "A", "COMP", "B" }).setValue(displayMode = "COMP").addToContainer(this); + }); + } + + public String getDisplayMode() { + return displayMode.getValue(); } } @@ -119,7 +128,7 @@ class TransitionScrollItem extends AbstractScrollItem { } public boolean isSelected() { - return transition == lx.engine.getDeck(1).getBlendTransition(); + return transition == glucose.getSelectedTransition(); } public boolean isPending() { @@ -127,7 +136,7 @@ class TransitionScrollItem extends AbstractScrollItem { } public void onMousePressed() { - lx.engine.getDeck(1).setBlendTransition(transition); + glucose.setSelectedTransition(transition); } } diff --git a/code/GLucose.jar b/code/GLucose.jar index 6d09722e5cdbccf4cd146259475530dab83dc460..86ea3c434bbda062133b610c5d4d7bc066111aa6 100755 GIT binary patch delta 3353 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 Y+#cCSAkQv-jMD_z`f1XBcBO#-0RYmIFaQ7m diff --git a/code/HeronLX.jar b/code/HeronLX.jar index 70a882684a54c7322dfe0a429ec44fd891a40685..a163fc95981f280b77fa3b25c0adfd446088a7ae 100755 GIT binary patch delta 7625 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