Merge branch 'processing-2'
[SugarCubes.git] / UIImplementation.pde
similarity index 83%
rename from _UIImplementation.pde
rename to UIImplementation.pde
index ba0f110bc826a00aec85ce91e1b7ad52e9520c37..0f73b99aaa3a3839b5ebf06e72c0ba72d24de0fa 100644 (file)
  * 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") {
@@ -23,21 +83,18 @@ class UICubesLayer extends UICameraComponent {
 
     long simulationStart = System.nanoTime();
     if (simulationOn) {
+      hint(DISABLE_DEPTH_TEST);
       drawSimulation(simulationColors);
+      hint(ENABLE_DEPTH_TEST);
     }
     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();
+    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);
@@ -61,22 +118,72 @@ class UICubesLayer extends UICameraComponent {
     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;
     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) {