From be51cbc787b41de883466bb7b5e54de1ec03449e Mon Sep 17 00:00:00 2001 From: codeanticode Date: Sun, 12 Feb 2012 16:19:55 +0000 Subject: [PATCH] Updated OpenGL examples --- .../examples/Form/BrickTower/BrickTower.pde | 4 +- .../examples/Form/CubicGrid/CubicGrid.pde | 1 + .../opengl/examples/LowLevel/Nehe/Bitmap.pde | 147 ----------- .../opengl/examples/LowLevel/Nehe/Nehe.pde | 235 ------------------ .../opengl/examples/LowLevel/Nehe/Texture.pde | 82 ------ .../examples/LowLevel/Nehe/VertData.pde | 147 ----------- .../examples/LowLevel/Nehe/data/glass.bmp | Bin 49220 -> 0 bytes .../CubicGridImmediate/CubicGridImmediate.pde | 9 +- .../CubicGridRetained/CubicGridRetained.pde | 5 +- 9 files changed, 12 insertions(+), 618 deletions(-) delete mode 100755 java/libraries/opengl/examples/LowLevel/Nehe/Bitmap.pde delete mode 100755 java/libraries/opengl/examples/LowLevel/Nehe/Nehe.pde delete mode 100755 java/libraries/opengl/examples/LowLevel/Nehe/Texture.pde delete mode 100755 java/libraries/opengl/examples/LowLevel/Nehe/VertData.pde delete mode 100755 java/libraries/opengl/examples/LowLevel/Nehe/data/glass.bmp diff --git a/java/libraries/opengl/examples/Form/BrickTower/BrickTower.pde b/java/libraries/opengl/examples/Form/BrickTower/BrickTower.pde index 8def2b7a0..2ef6625fd 100755 --- a/java/libraries/opengl/examples/Form/BrickTower/BrickTower.pde +++ b/java/libraries/opengl/examples/Form/BrickTower/BrickTower.pde @@ -24,9 +24,7 @@ void draw(){ fill(182, 62, 29); noStroke(); // Add basic light setup - ambientLight(100, 100, 100); - directionalLight(255, 255, 255, 0, 1, 0); - + lights(); translate(width/2, height*1.2, -380); // Tip tower to see inside rotateX(radians(-45)); diff --git a/java/libraries/opengl/examples/Form/CubicGrid/CubicGrid.pde b/java/libraries/opengl/examples/Form/CubicGrid/CubicGrid.pde index 111cd3f3f..05e2afd68 100755 --- a/java/libraries/opengl/examples/Form/CubicGrid/CubicGrid.pde +++ b/java/libraries/opengl/examples/Form/CubicGrid/CubicGrid.pde @@ -14,6 +14,7 @@ color boxFill; void setup() { size(640, 360, P3D); noStroke(); + hint(DISABLE_DEPTH_TEST); } void draw() { diff --git a/java/libraries/opengl/examples/LowLevel/Nehe/Bitmap.pde b/java/libraries/opengl/examples/LowLevel/Nehe/Bitmap.pde deleted file mode 100755 index f9179e16a..000000000 --- a/java/libraries/opengl/examples/LowLevel/Nehe/Bitmap.pde +++ /dev/null @@ -1,147 +0,0 @@ -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferByte; -import java.awt.image.DataBufferInt; -import java.io.IOException; -import java.io.InputStream; - -BufferedImage loadBitmap(String file) throws IOException { - BufferedImage image; - InputStream input = null; - try { - input = createInput(file); - - int bitmapFileHeaderLength = 14; - int bitmapInfoHeaderLength = 40; - - byte bitmapFileHeader[] = new byte[bitmapFileHeaderLength]; - byte bitmapInfoHeader[] = new byte[bitmapInfoHeaderLength]; - - input.read(bitmapFileHeader, 0, bitmapFileHeaderLength); - input.read(bitmapInfoHeader, 0, bitmapInfoHeaderLength); - - int nSize = bytesToInt(bitmapFileHeader, 2); - int nWidth = bytesToInt(bitmapInfoHeader, 4); - int nHeight = bytesToInt(bitmapInfoHeader, 8); - int nBiSize = bytesToInt(bitmapInfoHeader, 0); - int nPlanes = bytesToShort(bitmapInfoHeader, 12); - int nBitCount = bytesToShort(bitmapInfoHeader, 14); - int nSizeImage = bytesToInt(bitmapInfoHeader, 20); - int nCompression = bytesToInt(bitmapInfoHeader, 16); - int nColoursUsed = bytesToInt(bitmapInfoHeader, 32); - int nXPixelsMeter = bytesToInt(bitmapInfoHeader, 24); - int nYPixelsMeter = bytesToInt(bitmapInfoHeader, 28); - int nImportantColours = bytesToInt(bitmapInfoHeader, 36); - - if (nBitCount == 24) { - image = read24BitBitmap(nSizeImage, nHeight, nWidth, input); - } - else if (nBitCount == 8) { - image = read8BitBitmap(nColoursUsed, nBitCount, nSizeImage, nWidth, nHeight, input); - } - else { - System.out.println("Not a 24-bit or 8-bit Windows Bitmap, aborting..."); - image = null; - } - } - finally { - try { - if (input != null) - input.close(); - } - catch (IOException e) { - } - } - return image; -} - -BufferedImage read8BitBitmap(int nColoursUsed, int nBitCount, int nSizeImage, int nWidth, int nHeight, InputStream input) throws IOException { - int nNumColors = (nColoursUsed > 0) ? nColoursUsed : (1 & 0xff) << nBitCount; - - if (nSizeImage == 0) { - nSizeImage = ((((nWidth * nBitCount) + 31) & ~31) >> 3); - nSizeImage *= nHeight; - } - - int npalette[] = new int[nNumColors]; - byte bpalette[] = new byte[nNumColors * 4]; - readBuffer(input, bpalette); - int nindex8 = 0; - - for (int n = 0; n < nNumColors; n++) { - npalette[n] = (255 & 0xff) << 24 | - (bpalette[nindex8 + 2] & 0xff) << 16 | - (bpalette[nindex8 + 1] & 0xff) << 8 | - (bpalette[nindex8 + 0] & 0xff); - - nindex8 += 4; - } - - int npad8 = (nSizeImage / nHeight) - nWidth; - BufferedImage bufferedImage = new BufferedImage(nWidth, nHeight, BufferedImage.TYPE_INT_ARGB); - DataBufferInt dataBufferByte = ((DataBufferInt) bufferedImage.getRaster().getDataBuffer()); - int[][] bankData = dataBufferByte.getBankData(); - byte bdata[] = new byte[(nWidth + npad8) * nHeight]; - - readBuffer(input, bdata); - nindex8 = 0; - - for (int j8 = nHeight - 1; j8 >= 0; j8--) { - for (int i8 = 0; i8 < nWidth; i8++) { - bankData[0][j8 * nWidth + i8] = npalette[((int) bdata[nindex8] & 0xff)]; - nindex8++; - } - nindex8 += npad8; - } - - return bufferedImage; -} - -BufferedImage read24BitBitmap(int nSizeImage, int nHeight, int nWidth, InputStream input) throws IOException { - int npad = (nSizeImage / nHeight) - nWidth * 3; - if (npad == 4 || npad < 0) - npad = 0; - int nindex = 0; - BufferedImage bufferedImage = new BufferedImage(nWidth, nHeight, BufferedImage.TYPE_4BYTE_ABGR); - DataBufferByte dataBufferByte = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()); - byte[][] bankData = dataBufferByte.getBankData(); - byte brgb[] = new byte[(nWidth + npad) * 3 * nHeight]; - - readBuffer(input, brgb); - - for (int j = nHeight - 1; j >= 0; j--) { - for (int i = 0; i < nWidth; i++) { - int base = (j * nWidth + i) * 4; - bankData[0][base] = (byte) 255; - bankData[0][base + 1] = brgb[nindex]; - bankData[0][base + 2] = brgb[nindex + 1]; - bankData[0][base + 3] = brgb[nindex + 2]; - nindex += 3; - } - nindex += npad; - } - - return bufferedImage; -} - -int bytesToInt(byte[] bytes, int index) { - return (bytes[index + 3] & 0xff) << 24 | - (bytes[index + 2] & 0xff) << 16 | - (bytes[index + 1] & 0xff) << 8 | - bytes[index + 0] & 0xff; -} - -short bytesToShort(byte[] bytes, int index) { - return (short) (((bytes[index + 1] & 0xff) << 8) | - (bytes[index + 0] & 0xff)); -} - -void readBuffer(InputStream in, byte[] buffer) throws IOException { - int bytesRead = 0; - int bytesToRead = buffer.length; - while (bytesToRead > 0) { - int read = in.read(buffer, bytesRead, bytesToRead); - bytesRead += read; - bytesToRead -= read; - } -} - diff --git a/java/libraries/opengl/examples/LowLevel/Nehe/Nehe.pde b/java/libraries/opengl/examples/LowLevel/Nehe/Nehe.pde deleted file mode 100755 index 8a55c238d..000000000 --- a/java/libraries/opengl/examples/LowLevel/Nehe/Nehe.pde +++ /dev/null @@ -1,235 +0,0 @@ -// Nehe by Andres Colubri -// Example of direct OpenGL use inside Processing with the -// OPENGL2 renderer. -// Ported from NeHe tutorial 8: -// http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=08 - -import javax.media.opengl.*; -import java.nio.*; -import javax.media.opengl.glu.gl2.GLUgl2; - -boolean lighting = true; -boolean blending = true; -boolean depthTest = true; -boolean depthMask = false; -boolean texturing = true; - -int selBlend = 1; -int selFilter = 0; -float transparency = 0.5f; - -// The color depth of the sketch can be set with this -// method. The 6 numbers separated by colons correspond -// to the red, green, blue, alpha, depth and stencil bits. -// If this method is not defined, then Processing will let -// OpenGL to automatically choose the color depth. -String sketchColordepth() { - return "8:8:8:8:16:0"; -} - -// Whether the sketch surface supports translucenty or not. -boolean sketchTranslucency() { - return true; -} - -FloatBuffer[] cubeVertexBfr; -FloatBuffer[] cubeNormalBfr; -FloatBuffer[] cubeTextureBfr; - -FloatBuffer lightAmbBfr; -FloatBuffer lightDifBfr; -FloatBuffer lightPosBfr; - -private IntBuffer texturesBuffer; - -private float xRot; -private float yRot; -float xSpeed = 0.2f; -float ySpeed = 0.2f; - -GLUgl2 glu; - -void setup() { - size(400, 400, P3D); - - glu = new GLUgl2(); - - int SIZEOF_FLOAT = Float.SIZE / 8; - - cubeVertexBfr = new FloatBuffer[6]; - cubeNormalBfr = new FloatBuffer[6]; - cubeTextureBfr = new FloatBuffer[6]; - for (int i = 0; i < 6; i++) { - ByteBuffer vbb = ByteBuffer.allocateDirect(4 * 3 * SIZEOF_FLOAT); - vbb.order(ByteOrder.nativeOrder()); - cubeVertexBfr[i] = vbb.asFloatBuffer(); - cubeVertexBfr[i].put(cubeVertexCoords[i]); - cubeVertexBfr[i].flip(); - - ByteBuffer nbb = ByteBuffer.allocateDirect(4 * 3 * SIZEOF_FLOAT); - nbb.order(ByteOrder.nativeOrder()); - cubeNormalBfr[i] = nbb.asFloatBuffer(); - cubeNormalBfr[i].put(cubeNormalCoords[i]); - cubeNormalBfr[i].flip(); - - ByteBuffer tbb = ByteBuffer.allocateDirect(4 * 2 * SIZEOF_FLOAT); - tbb.order(ByteOrder.nativeOrder()); - cubeTextureBfr[i] = tbb.asFloatBuffer(); - cubeTextureBfr[i].put(cubeTextureCoords[i]); - cubeTextureBfr[i].flip(); - } - - lightAmbBfr = FloatBuffer.wrap(lightAmb); - lightDifBfr = FloatBuffer.wrap(lightDif); - lightPosBfr = FloatBuffer.wrap(lightPos); - - PGraphicsOpenGL pgl = (PGraphicsOpenGL)g; - GL gl = pgl.beginGL(); - - Texture teximage = null; - try { - teximage = readTexture("glass.bmp"); - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - - texturesBuffer = IntBuffer.allocate(3); - gl.glGenTextures(3, texturesBuffer); - - gl.glEnable(GL.GL_TEXTURE_2D); - // setup texture 0 with nearest filtering - gl.glBindTexture(GL.GL_TEXTURE_2D, texturesBuffer.get(0)); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE); - makeRGBTexture(gl, glu, teximage, GL.GL_TEXTURE_2D, false); - - // setup texture 1 with linear filtering for both minification and magnification, - // this is usually called bilinear sampling - gl.glBindTexture(GL.GL_TEXTURE_2D, texturesBuffer.get(1)); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE); - makeRGBTexture(gl, glu, teximage, GL.GL_TEXTURE_2D, false); - - // setup texture 2 with linear filtering for magnification and linear-linear mipmapping - // (trilinear sampling) - gl.glBindTexture(GL.GL_TEXTURE_2D, texturesBuffer.get(2)); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR_MIPMAP_NEAREST); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP_TO_EDGE); - gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP_TO_EDGE); - makeRGBTexture(gl, glu, teximage, GL.GL_TEXTURE_2D, true); - gl.glDisable(GL.GL_TEXTURE_2D); - - pgl.endGL(); -} - -public void draw() { - background(0); - - PGraphicsOpenGL pgl = (PGraphicsOpenGL)g; - GL gl = pgl.beginGL(); - GL2 gl2 = gl.getGL2(); - - gl2.glShadeModel(GL2.GL_SMOOTH); - gl.glClearColor(0, 0, 0, 0); - - if (depthTest) { - gl.glClearDepthf(1.0f); - gl.glEnable(GL.GL_DEPTH_TEST); - gl.glDepthFunc(GL.GL_LEQUAL); - } - else { - gl.glDisable(GL.GL_DEPTH_TEST); - } - gl.glDepthMask(depthMask); - - gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); - - // lighting - gl.glEnable(GL2.GL_LIGHT0); - gl2.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, lightAmbBfr); - gl2.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, lightDifBfr); - gl2.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, lightPosBfr); - - // blending - gl.glEnable(GL2.GL_COLOR_MATERIAL); - gl2.glColor4f(1.0f, 1.0f, 1.0f, transparency); - if (selBlend == 0) { - gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE); - } - else if (selBlend == 1) { - gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); - } - - gl.glViewport(0, 0, width, height); - // setup projection matrix - gl2.glMatrixMode(GL2.GL_PROJECTION); - gl2.glLoadIdentity(); - glu.gluPerspective(45.0f, (float)width / (float)height, 1.0f, 100.0f); - - gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); - gl2.glMatrixMode(GL2.GL_MODELVIEW); - gl2.glLoadIdentity(); - - // update lighting - if (lighting) { - gl.glEnable(GL2.GL_LIGHTING); - } - else { - gl.glDisable(GL2.GL_LIGHTING); - } - - // update blending - if (blending) { - gl.glEnable(GL.GL_BLEND); - gl.glDisable(GL.GL_CULL_FACE); - } - else { - gl.glDisable(GL.GL_BLEND); - gl.glEnable(GL.GL_CULL_FACE); - } - - gl2.glTranslatef(0, 0, -6); - gl2.glRotatef(xRot, 1, 0, 0); - gl2.glRotatef(yRot, 0, 1, 0); - - if (texturing) { - gl.glEnable(GL.GL_TEXTURE_2D); - gl.glBindTexture(GL.GL_TEXTURE_2D, texturesBuffer.get(selFilter)); - } - gl2.glEnableClientState(GL2.GL_VERTEX_ARRAY); - gl2.glEnableClientState(GL2.GL_NORMAL_ARRAY); - if (texturing) gl2.glEnableClientState(GL2.GL_TEXTURE_COORD_ARRAY); - for (int i = 0; i < 6; i++) // draw each face - { - gl2.glVertexPointer(3, GL.GL_FLOAT, 0, cubeVertexBfr[i]); - if (texturing) gl2.glTexCoordPointer(2, GL.GL_FLOAT, 0, cubeTextureBfr[i]); - gl2.glNormalPointer(GL.GL_FLOAT, 0, cubeNormalBfr[i]); - gl2.glDrawArrays(GL.GL_TRIANGLE_FAN, 0, 4); - } - gl2.glDisableClientState(GL2.GL_VERTEX_ARRAY); - gl2.glDisableClientState(GL2.GL_NORMAL_ARRAY); - if (texturing) { - gl2.glDisableClientState(GL2.GL_TEXTURE_COORD_ARRAY); - gl.glDisable(GL.GL_TEXTURE_2D); - } - - // update rotations - xRot += xSpeed; - yRot += ySpeed; - - pgl.endGL(); -} - -void makeRGBTexture(GL gl, GLUgl2 glu, Texture img, int target, boolean mipmapped) { - if (mipmapped) { - glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), img.getHeight(), GL.GL_RGB, GL.GL_UNSIGNED_BYTE, img.getPixels()); - } else { - gl.glTexImage2D(target, 0, GL.GL_RGB, img.getWidth(), img.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, img.getPixels()); - } -} diff --git a/java/libraries/opengl/examples/LowLevel/Nehe/Texture.pde b/java/libraries/opengl/examples/LowLevel/Nehe/Texture.pde deleted file mode 100755 index 67b09712c..000000000 --- a/java/libraries/opengl/examples/LowLevel/Nehe/Texture.pde +++ /dev/null @@ -1,82 +0,0 @@ -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.awt.image.PixelGrabber; -import java.io.IOException; -import java.nio.ByteBuffer; - -Texture readTexture(String filename) throws IOException { - return readTexture(filename, false); -} - -Texture readTexture(String filename, boolean storeAlphaChannel) throws IOException { - BufferedImage bufferedImage; - if (filename.endsWith(".bmp")) { - bufferedImage = loadBitmap(filename); - } - else { - bufferedImage = readImage(filename); - } - return readPixels(bufferedImage, storeAlphaChannel); -} - -BufferedImage readImage(String resourceName) throws IOException { - return ImageIO.read(createInput(resourceName)); -} - -Texture readPixels(BufferedImage img, boolean storeAlphaChannel) { - int[] packedPixels = new int[img.getWidth() * img.getHeight()]; - - PixelGrabber pixelgrabber = new PixelGrabber(img, 0, 0, img.getWidth(), img.getHeight(), packedPixels, 0, img.getWidth()); - try { - pixelgrabber.grabPixels(); - } - catch (InterruptedException e) { - throw new RuntimeException(); - } - - int bytesPerPixel = storeAlphaChannel ? 4 : 3; - //ByteBuffer unpackedPixels = BufferUtil.newByteBuffer(packedPixels.length * bytesPerPixel); - ByteBuffer unpackedPixels = ByteBuffer.allocate(packedPixels.length * bytesPerPixel); - - for (int row = img.getHeight() - 1; row >= 0; row--) { - for (int col = 0; col < img.getWidth(); col++) { - int packedPixel = packedPixels[row * img.getWidth() + col]; - unpackedPixels.put((byte) ((packedPixel >> 16) & 0xFF)); - unpackedPixels.put((byte) ((packedPixel >> 8) & 0xFF)); - unpackedPixels.put((byte) ((packedPixel >> 0) & 0xFF)); - if (storeAlphaChannel) { - unpackedPixels.put((byte) ((packedPixel >> 24) & 0xFF)); - } - } - } - - unpackedPixels.flip(); - - - return new Texture(unpackedPixels, img.getWidth(), img.getHeight()); -} - -class Texture { - ByteBuffer pixels; - int width; - int height; - - public Texture(ByteBuffer pixels, int width, int height) { - this.height = height; - this.pixels = pixels; - this.width = width; - } - - public int getHeight() { - return height; - } - - public ByteBuffer getPixels() { - return pixels; - } - - public int getWidth() { - return width; - } -} - diff --git a/java/libraries/opengl/examples/LowLevel/Nehe/VertData.pde b/java/libraries/opengl/examples/LowLevel/Nehe/VertData.pde deleted file mode 100755 index f6f813b4d..000000000 --- a/java/libraries/opengl/examples/LowLevel/Nehe/VertData.pde +++ /dev/null @@ -1,147 +0,0 @@ -float[][] cubeVertexCoords = new float[][] { - new float[] { // top - 1, 1,-1, - -1, 1,-1, - -1, 1, 1, - 1, 1, 1 - } - , - new float[] { // bottom - 1,-1, 1, - -1,-1, 1, - -1,-1,-1, - 1,-1,-1 - } - , - new float[] { // front - 1, 1, 1, - -1, 1, 1, - -1,-1, 1, - 1,-1, 1 - } - , - new float[] { // back - 1,-1,-1, - -1,-1,-1, - -1, 1,-1, - 1, 1,-1 - } - , - new float[] { // left - -1, 1, 1, - -1, 1,-1, - -1,-1,-1, - -1,-1, 1 - } - , - new float[] { // right - 1, 1,-1, - 1, 1, 1, - 1,-1, 1, - 1,-1,-1 - } - , -}; - -float[][] cubeNormalCoords = new float[][] { - new float[] { // top - 0, 1, 0, - 0, 1, 0, - 0, 1, 0, - 0, 1, 0 - } - , - new float[] { // bottom - 0,-1, 0, - 0,-1, 0, - 0,-1, 0, - 0,-1, 0 - } - , - new float[] { // front - 0, 0, 1, - 0, 0, 1, - 0, 0, 1, - 0, 0, 1 - } - , - new float[] { // back - 0, 0,-1, - 0, 0,-1, - 0, 0,-1, - 0, 0,-1 - } - , - new float[] { // left - -1, 0, 0, - -1, 0, 0, - -1, 0, 0, - -1, 0, 0 - } - , - new float[] { // right - 1, 0, 0, - 1, 0, 0, - 1, 0, 0, - 1, 0, 0 - } - , -}; - -float[][] cubeTextureCoords = new float[][] { - new float[] { // top - 1, 0, - 1, 1, - 0, 1, - 0, 0 - } - , - new float[] { // bottom - 0, 0, - 1, 0, - 1, 1, - 0, 1 - } - , - new float[] { // front - 1, 1, - 0, 1, - 0, 0, - 1, 0 - } - , - new float[] { // back - 0, 1, - 0, 0, - 1, 0, - 1, 1 - } - , - new float[] { // left - 1, 1, - 0, 1, - 0, 0, - 1, 0 - } - , - new float[] { // right - 0, 1, - 0, 0, - 1, 0, - 1, 1 - } - , -}; - -float lightAmb[]= { - 0.5f, 0.5f, 0.5f, 1.0f -}; - -float lightDif[]= { - 1.0f, 1.0f, 1.0f, 1.0f -}; - -float lightPos[]= { - 0.0f, 0.0f, 2.0f, 1.0f -}; - diff --git a/java/libraries/opengl/examples/LowLevel/Nehe/data/glass.bmp b/java/libraries/opengl/examples/LowLevel/Nehe/data/glass.bmp deleted file mode 100755 index 1acf064255835c7f81bb3d15a4271612ce3b6df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49220 zcmZs?XOJA%b|$EekRA;T2@u}4t?KgLdtcpM-h1!8_qMyb+Be#Jv~Qprh9ChFBuIh; zpP{#UUQcgUBaJkpSZOELjAA!7ByGOg{W%r4GBUF=t17;G&pF@u&PlG6_~Ot0`-=!{ z`+#@j|9}5ae|8Dj`yan9T?Jq1Q+B~MS4oDe2>sP-I0%NoP-{7A6_Qqy&6G?R9- zr<Lq4R>xOscv=llr{(K)Vv|v5FaUQ6^g6CqBL==otK}(`{d%29r{in2T(yd? zRf~-Jev?6H&9o=u7KY2g@wx{?0ZG883D*3*)vT~u>a}8(d{Cp3=rw~{wbZC(^7)r9bzDcvE>m<@uIjGC4P7^BXF8adRd-SDk06B? zJ^HsVLk(iHu6XaL^x$s#-f`yMgY@xH?A{&UgJavlu61wQd1v3fx9vOJ_uoAX9N%%@ zI}AU57~TYdh+h{ zlXu$>-fZ4EuI?RX_ivYv_iFd=)_`BUcPF*Co!+^f-MJm#SPiW#2A1c&^E1))<lf_RyNH$tRr+eZ1&#S-uGXJZuGr#)U`PoO7UwmNt z^r`F9_hMgt>Uj2+<@poai>J_dfm@ z82g`meDLANd(S?)`|&6HAAYd+;YXX#Ki+!p*~UBXu0MTx`|&#)kKb8;`^namcbD!x zSb6Z~=HqvY6XRz(I!+G^pYp!RN8|mGs5F*PL}QwGT%Sqll1W`EDNV#AiI_MN;`zN) zr@c?Bf|&FuhlLvo%2O#goxvU)G{zzdms{ob0$a7)qjh!MelMB4$7`yL7h>pzZ(1U6zI#>^j}?p z_|9CQUKMZR+>arJCotv~wbRnN96=R81HeU+IQZ84}=<=!DZn+WoU9ZU(G6$ljV9XGTY5fs} zHzu<9gch&d9koRZjzqzk$%X6Hc%_)GluFII#-#6p^h&f!qr<7tS&R;!D;D*oQ=UZJ zlT4T*Av1u9$0c_=auzK4tGEx9PEZbNeniILx2%D46az9RB@ydzEUnw$|NeaKrZLVqynWvVlf)sW}U;R zaoMykmnrBmhuqe1&=~Z1!$GGzpmR9ndexvp#h0nrg90KFjwfQ!yncRvKSQCQN<@5t zRIE_REqbHZZIAjb0jI$YEaQ;DV^=tx0)sIZa2nZ*vAQP?bM zhh3~z(*;5Z0!`s?B?^^Dt>GJhYji4`O=-1CEf#@R$CfK7VlfPfzjhOR7Am}kkY2u` zxPp}R_M$qF;8=T1>2|?TaF5s5)!9e8fz$L+aVNf%k($29awO;ClVM`!>`2Ec6O^*;0!s2(Eo zVN9wnfx27ZN7{l2r>1w1(22oZL>Lj85ZdQQdu)AX8^{>Oczhs}6K275A~;tC{yw=2 zEVFitE!{#>7taA5F!u# zMCl}Wu=a6kx{SB9D2@ihRimay(Rw{jO6kG-(RwFzzyxAD`}h_R-Ox#L_K2MrEvXxW zy}%y0;TK-j@~$a)SC#BbQvNkH|EAu6jmITp{ZKpax>DL>lJ{6-oo4Y3qv*OmP0VC5 z2`9p*?Xwx+Zq5aX=#orxO*3#+X#qQIeOe@_y9bMd^!0M3gOR0asa6T0kcW5gd&>

A& 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 N&!LW3o_pcB{|_*>WrF|! diff --git a/java/libraries/opengl/examples/Performance/CubicGridImmediate/CubicGridImmediate.pde b/java/libraries/opengl/examples/Performance/CubicGridImmediate/CubicGridImmediate.pde index f9cb7f987..e505c1f0d 100644 --- a/java/libraries/opengl/examples/Performance/CubicGridImmediate/CubicGridImmediate.pde +++ b/java/libraries/opengl/examples/Performance/CubicGridImmediate/CubicGridImmediate.pde @@ -25,8 +25,9 @@ void draw() { background(255); hint(DISABLE_DEPTH_TEST); - + // Center and spin grid + pushMatrix(); translate(width/2, height/2, -depth); rotateY(frameCount * 0.01); rotateX(frameCount * 0.01); @@ -46,6 +47,7 @@ void draw() { } } } + popMatrix(); fcount += 1; int m = millis(); @@ -55,5 +57,6 @@ void draw() { lastm = m; println("fps: " + frate); } -} - + fill(0); + text("fps: " + frate, 10, 20); +} \ No newline at end of file diff --git a/java/libraries/opengl/examples/Performance/CubicGridRetained/CubicGridRetained.pde b/java/libraries/opengl/examples/Performance/CubicGridRetained/CubicGridRetained.pde index 8dd1d8f7e..eaea9de87 100644 --- a/java/libraries/opengl/examples/Performance/CubicGridRetained/CubicGridRetained.pde +++ b/java/libraries/opengl/examples/Performance/CubicGridRetained/CubicGridRetained.pde @@ -90,11 +90,13 @@ void draw() { hint(DISABLE_DEPTH_TEST); // Center and spin grid + pushMatrix(); translate(width/2, height/2, -depth); rotateY(frameCount * 0.01); rotateX(frameCount * 0.01); shape(grid); + popMatrix(); fcount += 1; int m = millis(); @@ -104,5 +106,6 @@ void draw() { lastm = m; println("fps: " + frate); } + fill(0); + text("fps: " + frate, 10, 20); } -