/** * Copyright 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package com.jogamp.opengl.test.junit.jogl.offscreen; import java.nio.*; import com.jogamp.opengl.*; import com.jogamp.opengl.fixedfunc.*; import com.jogamp.opengl.util.*; import com.jogamp.opengl.fixedfunc.GLPointerFunc; import com.jogamp.opengl.util.texture.TextureCoords; import com.jogamp.opengl.util.GLArrayDataClient; import com.jogamp.opengl.util.GLArrayDataServer; public class ReadBuffer2Screen extends ReadBufferBase { PMVMatrix pmvMatrix; GLArrayDataClient readTextureVertices = null; GLArrayDataClient readTextureCoords = null; boolean enableBufferAlways = false; // FIXME boolean enableBufferVBO = true; // FIXME public ReadBuffer2Screen (final GLDrawable externalRead) { super(externalRead, true); } @Override public void init(final GLAutoDrawable drawable) { super.init(drawable); final GL gl = drawable.getGL(); pmvMatrix = new PMVMatrix(); final float f_edge = 1f; if(null==readTextureVertices) { //readTextureVertices = GLArrayDataClient.createFixed(gl, GLPointerFunc.GL_VERTEX_ARRAY, "mgl_Vertex", // 2, GL.GL_FLOAT, true, 4); readTextureVertices = GLArrayDataServer.createFixed(GLPointerFunc.GL_VERTEX_ARRAY, 2, GL.GL_FLOAT, true, 4, GL.GL_STATIC_DRAW); readTextureVertices.setEnableAlways(enableBufferAlways); readTextureVertices.setVBOEnabled(enableBufferVBO); { final FloatBuffer vb = (FloatBuffer)readTextureVertices.getBuffer(); vb.put(-f_edge); vb.put(-f_edge); vb.put( f_edge); vb.put(-f_edge); vb.put(-f_edge); vb.put( f_edge); vb.put( f_edge); vb.put( f_edge); } readTextureVertices.seal(gl, true); System.out.println(readTextureVertices); } // Clear background to gray gl.glClearColor(0.5f, 0.5f, 0.5f, 0.4f); } @Override public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) { super.reshape(drawable, x, y, width, height); final GL gl = drawable.getGL(); gl.glViewport(0, 0, width, height); if(gl instanceof GLLightingFunc) { ((GLLightingFunc)gl).glShadeModel(GLLightingFunc.GL_SMOOTH); } GLMatrixFunc glM; if(gl instanceof GLMatrixFunc) { glM = (GLMatrixFunc)gl; } else { throw new GLException("ES2 currently unhandled .. "); } // Identity .. pmvMatrix.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); pmvMatrix.glLoadIdentity(); pmvMatrix.glTranslatef(0, 0, -2.5f); if(null!=glM) { glM.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); glM.glLoadMatrixf(pmvMatrix.glGetMvMatrixf()); } // Set location in front of camera pmvMatrix.glMatrixMode(GLMatrixFunc.GL_PROJECTION); pmvMatrix.glLoadIdentity(); pmvMatrix.gluPerspective(45.0f, (float)width / (float)height, 1.0f, 100.0f); if(null!=glM) { glM.glMatrixMode(GLMatrixFunc.GL_PROJECTION); glM.glLoadMatrixf(pmvMatrix.glGetPMatrixf()); } } @Override public void dispose(final GLAutoDrawable drawable) { super.dispose(drawable); } void renderOffscreenTexture(final GL gl) { if(!readBufferUtil.isValid()) return; // Now draw one quad with the texture readBufferUtil.getTexture().enable(gl); readBufferUtil.getTexture().bind(gl); if(gl.isGL2ES1()) { // gl.getGL2ES1().glTexEnvi(GL2ES1.GL_TEXTURE_ENV, GL2ES1.GL_TEXTURE_ENV_MODE, GL2ES1.GL_REPLACE); gl.getGL2ES1().glTexEnvi(GL2ES1.GL_TEXTURE_ENV, GL2ES1.GL_TEXTURE_ENV_MODE, GL2ES1.GL_MODULATE); } updateTextureCoords(gl, false); readTextureVertices.enableBuffer(gl, true); if(null!=readTextureCoords) { readTextureCoords.enableBuffer(gl, true); } gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, readTextureVertices.getElementCount()); /** if(null!=readTextureCoords) { readTextureCoords.enableBuffer(gl, false); } readTextureVertices.enableBuffer(gl, false); */ readBufferUtil.getTexture().disable(gl); } void updateTextureCoords(final GL gl, final boolean force) { if(force || null==readTextureCoords) { readTextureCoords = GLArrayDataServer.createFixed(GLPointerFunc.GL_TEXTURE_COORD_ARRAY, 2, GL.GL_FLOAT, true, 4, GL.GL_STATIC_DRAW); readTextureCoords.setEnableAlways(enableBufferAlways); readTextureCoords.setVBOEnabled(enableBufferVBO); { final TextureCoords coords = readBufferUtil.getTexture().getImageTexCoords(); final FloatBuffer cb = (FloatBuffer)readTextureCoords.getBuffer(); cb.put(coords.left()); cb.put(coords.bottom()); cb.put(coords.right()); cb.put(coords.bottom()); cb.put(coords.left()); cb.put(coords.top()); cb.put(coords.right()); cb.put(coords.top()); } readTextureCoords.seal(gl, true); System.out.println(readTextureCoords); } } @Override public void display(final GLAutoDrawable drawable) { super.display(drawable); final GL gl = drawable.getGL(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); if(gl instanceof GLLightingFunc) { ((GLLightingFunc)gl).glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } renderOffscreenTexture(gl); } }