SCPattern moved out of GLucose
[SugarCubes.git] / _Internals.pde
index 6e985f123e9129f3c95794c13326879dd114f46d..100607a97d4cecee33689184b736ed26efbee064 100644 (file)
@@ -14,9 +14,9 @@
  */
 
 import glucose.*;
-import glucose.model.*;
 import heronarts.lx.*;
 import heronarts.lx.effect.*;
+import heronarts.lx.model.*;
 import heronarts.lx.modulator.*;
 import heronarts.lx.parameter.*;
 import heronarts.lx.pattern.*;
@@ -30,6 +30,9 @@ import ddf.minim.analysis.*;
 import processing.opengl.*;
 import rwmidi.*;
 import java.lang.reflect.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 final int VIEWPORT_WIDTH = 900;
 final int VIEWPORT_HEIGHT = 700;
@@ -74,23 +77,23 @@ UISpeed uiSpeed;
  * Engine construction and initialization.
  */
 
-LXTransition _transition(GLucose glucose) {
-  return new DissolveTransition(glucose.lx).setDuration(1000);
+LXTransition _transition(LX lx) {
+  return new DissolveTransition(lx).setDuration(1000);
 }
 
-LXPattern[] _leftPatterns(GLucose glucose) {
-  LXPattern[] patterns = patterns(glucose);
+LXPattern[] _leftPatterns(LX lx) {
+  LXPattern[] patterns = patterns(lx);
   for (LXPattern p : patterns) {
-    p.setTransition(_transition(glucose));
+    p.setTransition(_transition(lx));
   }
   return patterns;
 }
 
-LXPattern[] _rightPatterns(GLucose glucose) {
-  LXPattern[] patterns = _leftPatterns(glucose);
+LXPattern[] _rightPatterns(LX lx) {
+  LXPattern[] patterns = _leftPatterns(lx);
   LXPattern[] rightPatterns = new LXPattern[patterns.length+1];
   int i = 0;
-  rightPatterns[i++] = new BlankPattern(glucose).setTransition(_transition(glucose));
+  rightPatterns[i++] = new BlankPattern(lx).setTransition(_transition(lx));
   for (LXPattern p : patterns) {
     rightPatterns[i++] = p;
   }
@@ -134,10 +137,10 @@ void setup() {
     
   // Set the patterns
   LXEngine engine = lx.engine;
-  engine.setPatterns(patterns = _leftPatterns(glucose));
-  engine.addDeck(_rightPatterns(glucose));
+  engine.setPatterns(patterns = _leftPatterns(lx));
+  engine.addDeck(_rightPatterns(lx));
   logTime("Built patterns");
-  glucose.setTransitions(transitions(glucose));
+  glucose.setTransitions(transitions(lx));
   logTime("Built transitions");
   glucose.lx.addEffects(_effectsArray(effects = new Effects()));
   logTime("Built effects");
@@ -163,7 +166,7 @@ void setup() {
   logTime("Built Grizzly Outputs");
   
   // Mapping tools
-  mappingTool = new MappingTool(glucose);
+  mappingTool = new MappingTool(lx);
   
   // Build overlay UI
   UILayer[] layers = new UILayer[] {
@@ -205,6 +208,92 @@ void setup() {
   println("Hit the 'o' key to toggle live output");
 }
 
+public SCPattern getPattern() {
+  return (SCPattern) lx.getPattern();
+}      
+
+/**
+ * Subclass of LXPattern specific to sugar cubes. These patterns
+ * get access to the glucose state and geometry, and have some
+ * little helpers for interacting with the model.
+ */
+public static abstract class SCPattern extends LXPattern {
+               
+  protected SCPattern(LX lx) {
+    super(lx);
+  }
+       
+  /**
+   * Reset this pattern to its default state.
+   */
+  public final void reset() {
+    for (LXParameter parameter : getParameters()) {
+      parameter.reset();
+    }
+    onReset();
+  }
+       
+  /**
+   * Subclasses may override to add additional reset functionality.
+   */
+  protected /*abstract*/ void onReset() {}
+       
+  /**
+   * Invoked by the engine when a grid controller button press occurs
+   * 
+   * @param row Row index on the gird
+   * @param col Column index on the grid
+   * @return True if the event was consumed, false otherwise
+   */
+  public boolean gridPressed(int row, int col) {
+    return false;
+  }
+       
+  /**
+   * Invoked by the engine when a grid controller button release occurs
+   * 
+   * @param row Row index on the gird
+   * @param col Column index on the grid
+   * @return True if the event was consumed, false otherwise
+   */
+  public boolean gridReleased(int row, int col) {
+    return false;
+  }
+       
+  /**
+   * Invoked by engine when this pattern is focused an a midi note is received.  
+   * 
+   * @param note
+   * @return True if the pattern has consumed this note, false if the top-level
+   *         may handle it
+   */
+  public boolean noteOn(rwmidi.Note note) {
+    return false;
+  }
+       
+  /**
+   * Invoked by engine when this pattern is focused an a midi note off is received.  
+   * 
+   * @param note
+   * @return True if the pattern has consumed this note, false if the top-level
+   *         may handle it
+   */
+  public boolean noteOff(rwmidi.Note note) {
+    return false;
+  }
+       
+  /**
+   * Invoked by engine when this pattern is focused an a controller is received  
+   * 
+   * @param note
+   * @return True if the pattern has consumed this controller, false if the top-level
+   *         may handle it
+   */
+  public boolean controllerChange(rwmidi.Controller controller) {
+    return false;
+  }
+}
+
 long simulationNanos = 0;
 
 /**
@@ -287,14 +376,14 @@ class UICubesLayer extends UICameraComponent {
     popMatrix();
     
     noStroke();
-    for (Cube c : glucose.model.cubes) {
+    for (Cube c : model.cubes) {
       drawCube(c);
     }
   
     noFill();
     strokeWeight(2);
     beginShape(POINTS);
-    for (LXPoint p : glucose.model.points) {
+    for (LXPoint p : model.points) {
       stroke(simulationColors[p.index]);
       vertex(p.x, p.y, p.z);
     }