*
* Custom UI components using the framework.
*/
+
+import java.nio.*;
import java.util.Arrays;
class UICubesLayer extends UICameraComponent {
+
+int nvert = 200000;
+int SIZEOF_INT = Integer.SIZE / 8;
+int SIZEOF_FLOAT = Float.SIZE / 8;
+
+PGL pgl;
+PShader sh;
+
+int vertLoc;
+int colorLoc;
+
+IntBuffer vboName;
+FloatBuffer vertData;
+
+ boolean initted = false;
+ PShape sha1;
+ int numPoints = 10000;
+
+ void initme()
+ {
+ nvert = model.points.size();
+ sh = loadShader("frag.glsl", "vert.glsl");
+ /*color[] simulationColors = lx.getColors();
+ sha1= createShape();
+ sha1.beginShape(POINTS);
+ for (LXPoint p : model.points) {
+ stroke(simulationColors[p.index]);
+ //pointColor(simulationColors[p.index]);
+ gl2.glPointColor=100;
+ sha1.vertex(p.x, p.y, p.z);
+ }
+ sha1.endShape();*/
+ float[] temp = new float[nvert * 7];
+ for (LXPoint p : model.points) {
+ // position
+ temp[p.index * 7 + 0] = p.x;
+ temp[p.index * 7 + 1] = p.y;
+ temp[p.index * 7 + 2] = p.z;
+
+ // color
+ temp[p.index * 7 + 3] = 0.0;
+ temp[p.index * 7 + 4] = 0.0;
+ temp[p.index * 7 + 5] = 0.0;
+ temp[p.index * 7 + 6] = 1.0;
+ }
+
+ vertData = allocateDirectFloatBuffer(nvert * 7);
+ vertData.rewind();
+ vertData.put(temp);
+ vertData.position(0);
+ vboName = allocateDirectIntBuffer(1);
+ initVBO();
+ }
void onDraw(UI ui) {
+ if(!initted)
+ {
+ initted=true;
+ initme();
+ }
color[] simulationColors = lx.getColors();
String displayMode = uiCrossfader.getDisplayMode();
if (displayMode == "A") {
long simulationStart = System.nanoTime();
if (simulationOn) {
+ hint(DISABLE_DEPTH_TEST);
drawSimulation(simulationColors);
+ hint(ENABLE_DEPTH_TEST);
}
simulationNanos = System.nanoTime() - simulationStart;
-
- camera();
- PGraphicsOpenGL gl = (PGraphicsOpenGL) g;
+ camera();
strokeWeight(1);
}
void drawSimulation(color[] simulationColors) {
translate(0, 30, 0);
-
- noStroke();
+
fill(#141414);
drawBox(0, -TRAILER_HEIGHT, 0, 0, 0, 0, TRAILER_WIDTH, TRAILER_HEIGHT, TRAILER_DEPTH, TRAILER_HEIGHT/2.);
fill(#070707);
popMatrix();
noStroke();
- for (Cube c : model.cubes) {
- drawCube(c);
+ if (structureOn) {
+ for (Cube c : model.cubes) {
+ drawCube(c);
+ }
}
-
+
noFill();
- strokeWeight(2);
- beginShape(POINTS);
+ //strokeWeight(2);
+ int count=0;
+
+ ///magic:
+
+ pgl = beginPGL();
+
+
+ sh.bind();
+
+ vertLoc = pgl.getAttribLocation(sh.glProgram, "vertex");
+ colorLoc = pgl.getAttribLocation(sh.glProgram, "color");
+
+ pgl.bindBuffer(PGL.ARRAY_BUFFER, vboName.get(0));
+ pgl.enableVertexAttribArray(vertLoc);
+ pgl.enableVertexAttribArray(colorLoc);
+
+ pgl.vertexAttribPointer(vertLoc, 3, PGL.FLOAT, false, 7 * SIZEOF_FLOAT, 0);
+ pgl.vertexAttribPointer(colorLoc, 4, PGL.FLOAT, false, 7 * SIZEOF_FLOAT, 3 * SIZEOF_FLOAT);
+ javax.media.opengl.GL2 gl2 = (javax.media.opengl.GL2) ((PJOGL)pgl).gl;
+ gl2.glPointSize(2f);
+ pgl.drawArrays(PGL.POINTS, 0, nvert);
+
+ pgl.disableVertexAttribArray(vertLoc);
+ pgl.disableVertexAttribArray(colorLoc);
+ pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
+
+ sh.unbind();
+ endPGL();
+ createGeometry(simulationColors);
+ pgl.bindBuffer(PGL.ARRAY_BUFFER, vboName.get(0));
+ pgl.bufferData(PGL.ARRAY_BUFFER, nvert * 7 * SIZEOF_FLOAT, vertData, PGL.STATIC_DRAW);
+ }
+
+ void createGeometry(color[] simulationColors) {
for (LXPoint p : model.points) {
- stroke(simulationColors[p.index]);
- vertex(p.x, p.y, p.z);
- }
- endShape();
+ vertData.put(p.index * 7 + 3, ((simulationColors[p.index] >> 16) & 0xFF)/255.0);
+ vertData.put(p.index * 7 + 4, ((simulationColors[p.index] >> 8) & 0xFF)/255.0);
+ vertData.put(p.index * 7 + 5, (simulationColors[p.index]& 0xFF)/255.0);
+ }
}
+void initVBO() {
+
+ pgl = beginPGL();
+ pgl.genBuffers(1, vboName);
+ pgl.bindBuffer(PGL.ARRAY_BUFFER, vboName.get(0));
+ pgl.bufferData(PGL.ARRAY_BUFFER, nvert * 7 * SIZEOF_FLOAT, vertData, PGL.DYNAMIC_DRAW);
+ pgl.bindBuffer(PGL.ARRAY_BUFFER, 0);
+ endPGL();
+}
+
+IntBuffer allocateDirectIntBuffer(int n) {
+ return ByteBuffer.allocateDirect(n * SIZEOF_INT).order(ByteOrder.nativeOrder()).asIntBuffer();
+}
+
+FloatBuffer allocateDirectFloatBuffer(int n) {
+ return ByteBuffer.allocateDirect(n * SIZEOF_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer();
+}
void drawCube(Cube c) {
float in = .15;
class UIBlendMode extends UIWindow {
public UIBlendMode(float x, float y, float w, float h) {
super(lx.ui, "BLEND MODE", x, y, w, h);
- List<UIScrollList.Item> items = new ArrayList<UIScrollList.Item>();
+ List<UIItemList.Item> items = new ArrayList<UIItemList.Item>();
for (LXTransition t : transitions) {
- items.add(new TransitionScrollItem(t));
+ items.add(new TransitionItem(t));
}
- final UIScrollList tList;
- (tList = new UIScrollList(1, UIWindow.TITLE_LABEL_HEIGHT, w-2, 60)).setItems(items).addToContainer(this);
+ final UIItemList tList;
+ (tList = new UIItemList(1, UIWindow.TITLE_LABEL_HEIGHT, w-2, 60)).setItems(items).addToContainer(this);
lx.engine.getDeck(RIGHT_DECK).addListener(new LXDeck.AbstractListener() {
public void faderTransitionDidChange(LXDeck deck, LXTransition transition) {
});
}
- class TransitionScrollItem extends UIScrollList.AbstractItem {
+ class TransitionItem extends UIItemList.AbstractItem {
private final LXTransition transition;
private final String label;
- TransitionScrollItem(LXTransition transition) {
+ TransitionItem(LXTransition transition) {
this.transition = transition;
this.label = className(transition, "Transition");
}
super(lx.ui, "FX", x, y, w, h);
int yp = UIWindow.TITLE_LABEL_HEIGHT;
- List<UIScrollList.Item> items = new ArrayList<UIScrollList.Item>();
+ List<UIItemList.Item> items = new ArrayList<UIItemList.Item>();
int i = 0;
for (LXEffect fx : effectsArr) {
items.add(new FXScrollItem(fx, i++));
}
- final UIScrollList effectsList = new UIScrollList(1, yp, w-2, 60).setItems(items);
+ final UIItemList effectsList = new UIItemList(1, yp, w-2, 60).setItems(items);
effectsList.addToContainer(this);
yp += effectsList.getHeight() + 10;
}
- class FXScrollItem extends UIScrollList.AbstractItem {
+ class FXScrollItem extends UIItemList.AbstractItem {
private final LXEffect effect;
private final int index;
}
class UIOutput extends UIWindow {
- public UIOutput(GrizzlyOutput[] grizzlies, float x, float y, float w, float h) {
+ public UIOutput(IPOutput[] outputs, float x, float y, float w, float h) {
super(lx.ui, "OUTPUT", x, y, w, h);
float yp = UIWindow.TITLE_LABEL_HEIGHT;
- final UIScrollList outputs = new UIScrollList(1, UIWindow.TITLE_LABEL_HEIGHT, w-2, 80);
+ final UIItemList itemList = new UIItemList(1, UIWindow.TITLE_LABEL_HEIGHT, w-2, 80);
- List<UIScrollList.Item> items = new ArrayList<UIScrollList.Item>();
- for (GrizzlyOutput grizzly : grizzlies) {
- items.add(new GrizzlyScrollItem(grizzly));
- grizzly.enabled.addListener(new LXParameterListener() {
+ List<UIItemList.Item> items = new ArrayList<UIItemList.Item>();
+ for (IPOutput output : outputs) {
+ items.add(new OutputItem(output));
+ output.enabled.addListener(new LXParameterListener() {
public void onParameterChanged(LXParameter parameter) {
- outputs.redraw();
+ itemList.redraw();
}
});
}
- outputs.setItems(items).addToContainer(this);
+ itemList.setItems(items).addToContainer(this);
}
- class GrizzlyScrollItem extends UIScrollList.AbstractItem {
- final GrizzlyOutput output;
+ class OutputItem extends UIItemList.AbstractItem {
+ final IPOutput output;
- GrizzlyScrollItem(GrizzlyOutput output) {
+ OutputItem(IPOutput output) {
this.output = output;
}
private final MappingTool mappingTool;
- private final UIIntegerBox channelBox;
+ private final UILabel cubeLabel;
private final UIIntegerBox cubeBox;
private final UIIntegerBox stripBox;
else if (value == MAP_MODE_CHANNEL) mappingTool.mappingMode = mappingTool.MAPPING_MODE_CHANNEL;
else if (value == MAP_MODE_CUBE) mappingTool.mappingMode = mappingTool.MAPPING_MODE_SINGLE_CUBE;
}
- }.setOptions(new String[] { MAP_MODE_ALL, MAP_MODE_CHANNEL, MAP_MODE_CUBE }).addToContainer(this);
+ }.setOptions(new String[] { MAP_MODE_ALL, MAP_MODE_CUBE }).addToContainer(this);
yp += 24;
- new UILabel(4, yp+8, w-10, 20).setLabel("CHANNEL ID").addToContainer(this);
+ new UILabel(4, yp+8, w-10, 20).setLabel("CUBE ID").addToContainer(this);
yp += 24;
- (channelBox = new UIIntegerBox(4, yp, w-10, 20) {
- protected void onValueChange(int value) {
- mappingTool.setChannel(value-1);
- }
- }).setRange(1, mappingTool.numChannels()).addToContainer(this);
+ (cubeLabel = new UILabel(4, yp, w-10, 20))
+ .setAlignment(CENTER, CENTER)
+ .setLabel(model.cubes.get(0).id)
+ .setBackgroundColor(#222222)
+ .setBorderColor(#666666)
+ .addToContainer(this);
yp += 24;
- new UILabel(4, yp+8, w-10, 20).setLabel("CUBE ID").addToContainer(this);
+ new UILabel(4, yp+8, w-10, 20).setLabel("CUBE NUMBER").addToContainer(this);
yp += 24;
(cubeBox = new UIIntegerBox(4, yp, w-10, 20) {
protected void onValueChange(int value) {
yp += 10;
- new UIScrollList(1, yp, w-2, 60).setItems(Arrays.asList(new UIScrollList.Item[] {
+ new UIItemList(1, yp, w-2, 60).setItems(Arrays.asList(new UIItemList.Item[] {
new ColorScrollItem(ColorScrollItem.COLOR_RED),
new ColorScrollItem(ColorScrollItem.COLOR_GREEN),
new ColorScrollItem(ColorScrollItem.COLOR_BLUE),
}
- public void setChannelID(int value) {
- channelBox.setValue(value);
- }
-
public void setCubeID(int value) {
cubeBox.setValue(value);
+ cubeLabel.setLabel(model.getCubeByRawIndex(value).id);
}
public void setStripID(int value) {
stripBox.setValue(value);
}
- class ColorScrollItem extends UIScrollList.AbstractItem {
+ class ColorScrollItem extends UIItemList.AbstractItem {
public static final int COLOR_RED = 1;
public static final int COLOR_GREEN = 2;
super(lx.ui, "MIDI", x, y, w, h);
// Processing compiler doesn't seem to get that list of class objects also conform to interface
- List<UIScrollList.Item> scrollItems = new ArrayList<UIScrollList.Item>();
+ List<UIItemList.Item> scrollItems = new ArrayList<UIItemList.Item>();
for (SCMidiInput mc : midiEngine.getControllers()) {
scrollItems.add(mc);
}
- final UIScrollList scrollList;
- (scrollList = new UIScrollList(1, UIWindow.TITLE_LABEL_HEIGHT, w-2, 100)).setItems(scrollItems).addToContainer(this);
+ final UIItemList scrollList;
+ (scrollList = new UIItemList(1, UIWindow.TITLE_LABEL_HEIGHT, w-2, 100)).setItems(scrollItems).addToContainer(this);
(deckMode = new UIToggleSet(4, 130, 90, 20) {
protected void onToggle(String value) {
midiEngine.setFocusedDeck(value == "A" ? 0 : 1);