X-Git-Url: https://git.piment-noir.org/?p=SugarCubes.git;a=blobdiff_plain;f=UIImplementation.pde;fp=_UIImplementation.pde;h=0f73b99aaa3a3839b5ebf06e72c0ba72d24de0fa;hp=ba0f110bc826a00aec85ce91e1b7ad52e9520c37;hb=f109415988e59cd5e255ce6baac40abc57f307d8;hpb=d3016df6068e182a317be0451674411937fd7e95 diff --git a/_UIImplementation.pde b/UIImplementation.pde similarity index 83% rename from _UIImplementation.pde rename to UIImplementation.pde index ba0f110..0f73b99 100644 --- a/_UIImplementation.pde +++ b/UIImplementation.pde @@ -11,8 +11,68 @@ * 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) {