*
* 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") {
drawSimulation(simulationColors);
}
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.);
+ //drawBox(0, -TRAILER_HEIGHT, 0, 0, 0, 0, TRAILER_WIDTH, TRAILER_HEIGHT, TRAILER_DEPTH, TRAILER_HEIGHT/2.);
fill(#070707);
stroke(#222222);
beginShape();
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);
+
+ 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;
noStroke();
fill(#393939);
- drawBox(c.x+in, c.y+in, c.z+in, c.rx, c.ry, c.rz, Cube.EDGE_WIDTH-in*2, Cube.EDGE_HEIGHT-in*2, Cube.EDGE_WIDTH-in*2, Cube.CHANNEL_WIDTH-in);
+ //drawBox(c.x+in, c.y+in, c.z+in, c.rx, c.ry, c.rz, Cube.EDGE_WIDTH-in*2, Cube.EDGE_HEIGHT-in*2, Cube.EDGE_WIDTH-in*2, Cube.CHANNEL_WIDTH-in);
}
void drawBox(float x, float y, float z, float rx, float ry, float rz, float xd, float yd, float zd, float sw) {