From f8f0f051604721bceaee214b8e5218fd47d2eb9e Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sat, 5 Jul 2014 04:04:43 +0200 Subject: Bug 1021: Make OVR access vendor agnostic: Package 'com.jogamp.opengl.util.stereo' contains all public interfaces/classes Renamed interfaces: CustomRendererListener -> CustomGLEventListener StereoRendererListener -> StereoGLEventListener New vendor agnostic 'stuff' in com.jogamp.opengl.util.stereo: 1 - StereoDeviceFactory To create a vendor specific StereoDeviceFactory instance, which creates the StereoDevice. 2 - StereoDevice For vendor specific implementation. Can create StereoDeviceRenderer. 3 - StereoDeviceRenderer For vendor specific implementation. 4 - StereoClientRenderer Vendor agnostic client StereoGLEventListener renderer, using a StereoDeviceRenderer. Now supports multiple StereoGLEventListener, via add/remove. - MovieSBSStereo demo-able via StereoDemo01 can show SBS 3D movies. --- .../opengl/oculusvr/OVRSBSRendererDualFBO.java | 233 --------------------- .../opengl/oculusvr/OVRSBSRendererSingleFBO.java | 206 ------------------ 2 files changed, 439 deletions(-) delete mode 100644 src/oculusvr/classes/com/jogamp/opengl/oculusvr/OVRSBSRendererDualFBO.java delete mode 100644 src/oculusvr/classes/com/jogamp/opengl/oculusvr/OVRSBSRendererSingleFBO.java (limited to 'src/oculusvr/classes/com') diff --git a/src/oculusvr/classes/com/jogamp/opengl/oculusvr/OVRSBSRendererDualFBO.java b/src/oculusvr/classes/com/jogamp/opengl/oculusvr/OVRSBSRendererDualFBO.java deleted file mode 100644 index 9af3397cf..000000000 --- a/src/oculusvr/classes/com/jogamp/opengl/oculusvr/OVRSBSRendererDualFBO.java +++ /dev/null @@ -1,233 +0,0 @@ -/** - * Copyright 2014 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.oculusvr; - -import javax.media.opengl.GL; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; - -import jogamp.opengl.oculusvr.OVRDistortion; - -import com.jogamp.oculusvr.OVR; -import com.jogamp.oculusvr.ovrFrameTiming; -import com.jogamp.opengl.FBObject; -import com.jogamp.opengl.FBObject.Attachment; -import com.jogamp.opengl.FBObject.TextureAttachment; -import com.jogamp.opengl.FBObject.Attachment.Type; -import com.jogamp.opengl.util.CustomRendererListener; -import com.jogamp.opengl.util.stereo.StereoRendererListener; - -/** - * OculusVR (OVR) Side By Side Distortion Renderer utilizing {@link OVRDistortion} - * implementing {@link GLEventListener} for convenience. - *

- * Implementation renders an {@link StereoRendererListener} instance - * side-by-side using two {@link FBObject}s according to {@link OVRDistortion}. - *

- */ -public class OVRSBSRendererDualFBO implements GLEventListener { - private final OVRDistortion dist; - private final boolean ownsDist; - private final StereoRendererListener upstream; - private final FBObject[] fbos; - private final int magFilter; - private final int minFilter; - - private int numSamples; - private final TextureAttachment[] fboTexs; - - public OVRSBSRendererDualFBO(final OVRDistortion dist, final boolean ownsDist, final StereoRendererListener upstream, - final int magFilter, final int minFilter, final int numSamples) { - this.dist = dist; - this.ownsDist = ownsDist; - this.upstream = upstream; - this.fbos = new FBObject[2]; - this.fbos[0] = new FBObject(); - this.fbos[1] = new FBObject(); - this.magFilter = magFilter; - this.minFilter = minFilter; - - this.numSamples = numSamples; - this.fboTexs = new TextureAttachment[2]; - } - - private void initFBOs(final GL gl, final int width, final int height) { - // remove all texture attachments, since MSAA uses just color-render-buffer - // and non-MSAA uses texture2d-buffer - fbos[0].detachAllColorbuffer(gl); - fbos[1].detachAllColorbuffer(gl); - - fbos[0].reset(gl, width, height, numSamples, false); - fbos[1].reset(gl, width, height, numSamples, false); - if(fbos[0].getNumSamples() != fbos[1].getNumSamples()) { - throw new InternalError("sample size mismatch: \n\t0: "+fbos[0]+"\n\t1: "+fbos[1]); - } - numSamples = fbos[0].getNumSamples(); - - if(numSamples>0) { - fbos[0].attachColorbuffer(gl, 0, true); // MSAA requires alpha - fbos[0].attachRenderbuffer(gl, Type.DEPTH, 24); - final FBObject ssink0 = new FBObject(); - { - ssink0.reset(gl, width, height); - ssink0.attachTexture2D(gl, 0, false, magFilter, minFilter, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE); - ssink0.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24); - } - fbos[0].setSamplingSink(ssink0); - fbos[0].resetSamplingSink(gl); // validate - fboTexs[0] = fbos[0].getSamplingSink(); - - fbos[1].attachColorbuffer(gl, 0, true); // MSAA requires alpha - fbos[1].attachRenderbuffer(gl, Type.DEPTH, 24); - final FBObject ssink1 = new FBObject(); - { - ssink1.reset(gl, width, height); - ssink1.attachTexture2D(gl, 0, false, magFilter, minFilter, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE); - ssink1.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24); - } - fbos[1].setSamplingSink(ssink1); - fbos[1].resetSamplingSink(gl); // validate - fboTexs[1] = fbos[1].getSamplingSink(); - } else { - fboTexs[0] = fbos[0].attachTexture2D(gl, 0, false, magFilter, minFilter, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE); - fbos[0].attachRenderbuffer(gl, Type.DEPTH, 24); - fboTexs[1] = fbos[1].attachTexture2D(gl, 0, false, magFilter, minFilter, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE); - fbos[1].attachRenderbuffer(gl, Type.DEPTH, 24); - } - fbos[0].unbind(gl); - fbos[1].unbind(gl); - } - - @SuppressWarnings("unused") - private void resetFBOs(final GL gl, final int width, final int height) { - fbos[0].reset(gl, width, height, numSamples, true); - fbos[1].reset(gl, width, height, numSamples, true); - if(fbos[0].getNumSamples() != fbos[1].getNumSamples()) { - throw new InternalError("sample size mismatch: \n\t0: "+fbos[0]+"\n\t1: "+fbos[1]); - } - numSamples = fbos[0].getNumSamples(); - if(numSamples>0) { - fboTexs[0] = fbos[0].getSamplingSink(); - fboTexs[1] = fbos[1].getSamplingSink(); - } else { - fboTexs[0] = (TextureAttachment) fbos[0].getColorbuffer(0); - fboTexs[1] = (TextureAttachment) fbos[1].getColorbuffer(0); - } - } - - @Override - public void init(final GLAutoDrawable drawable) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - dist.init(gl); - - // We will do some offscreen rendering, setup FBO... - if( null != upstream ) { - final int[] textureSize = dist.textureSize; - initFBOs(gl, textureSize[0], textureSize[1]); - upstream.init(drawable); - } - - gl.setSwapInterval(1); - } - - @Override - public void dispose(final GLAutoDrawable drawable) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - // FIXME complete release - if( null != upstream ) { - upstream.dispose(drawable); - fbos[0].destroy(gl); - fbos[1].destroy(gl); - } - if( ownsDist ) { - dist.dispose(gl); - } - } - - @Override - public void display(final GLAutoDrawable drawable) { - final ovrFrameTiming frameTiming = OVR.ovrHmd_BeginFrameTiming(dist.hmdCtx, 0); - - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - if(0 < numSamples) { - gl.glEnable(GL.GL_MULTISAMPLE); - } - - // FIXME: Instead of setting the viewport, - // it's better to change the projection matrix! - if( null != upstream ) { - for(int eyeNum=0; eyeNum<2; eyeNum++) { - // final ovrPosef eyeRenderPose = OVR.ovrHmd_GetEyePose(hmdCtx, eyeNum); - // final float[] eyePos = OVRUtil.getVec3f(eyeRenderPose.getPosition()); - fbos[eyeNum].bind(gl); - - final OVRDistortion.EyeData eyeDist = dist.eyes[eyeNum]; - final int[] viewport = eyeDist.viewport; - gl.glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); - - dist.updateEyePose(eyeNum); - upstream.reshapeEye(drawable, viewport[0], viewport[1], viewport[2], viewport[3], - dist.getEyeParam(eyeNum), dist.updateEyePose(eyeNum)); - upstream.display(drawable, eyeNum > 0 ? CustomRendererListener.DISPLAY_REPEAT : 0); - fbos[eyeNum].unbind(gl); - } - gl.glViewport(0, 0, drawable.getSurfaceWidth(), drawable.getSurfaceHeight()); - } - - gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - gl.glClear(GL.GL_COLOR_BUFFER_BIT); - gl.glActiveTexture(GL.GL_TEXTURE0 + dist.texUnit0.intValue()); - - if( null != upstream ) { - dist.displayOneEyePre(gl, frameTiming.getTimewarpPointSeconds()); - fbos[0].use(gl, fboTexs[0]); - dist.displayOneEye(gl, 0); - fbos[0].unuse(gl); - fbos[1].use(gl, fboTexs[1]); - dist.displayOneEye(gl, 1); - fbos[1].unuse(gl); - dist.displayOneEyePost(gl); - } else { - dist.display(gl, frameTiming.getTimewarpPointSeconds()); - } - - if( !drawable.getAutoSwapBufferMode() ) { - drawable.swapBuffers(); - } - OVR.ovrHmd_EndFrameTiming(dist.hmdCtx); - } - - @Override - public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) { - if( !drawable.getAutoSwapBufferMode() ) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - gl.glViewport(0, 0, width, height); - } - } -} diff --git a/src/oculusvr/classes/com/jogamp/opengl/oculusvr/OVRSBSRendererSingleFBO.java b/src/oculusvr/classes/com/jogamp/opengl/oculusvr/OVRSBSRendererSingleFBO.java deleted file mode 100644 index b18d1634e..000000000 --- a/src/oculusvr/classes/com/jogamp/opengl/oculusvr/OVRSBSRendererSingleFBO.java +++ /dev/null @@ -1,206 +0,0 @@ -/** - * Copyright 2014 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.oculusvr; - -import javax.media.opengl.GL; -import javax.media.opengl.GL2ES2; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; - -import jogamp.opengl.oculusvr.OVRDistortion; - -import com.jogamp.oculusvr.OVR; -import com.jogamp.oculusvr.ovrFrameTiming; -import com.jogamp.opengl.FBObject; -import com.jogamp.opengl.FBObject.Attachment; -import com.jogamp.opengl.FBObject.TextureAttachment; -import com.jogamp.opengl.FBObject.Attachment.Type; -import com.jogamp.opengl.util.CustomRendererListener; -import com.jogamp.opengl.util.stereo.StereoRendererListener; - -/** - * OculusVR (OVR) Side By Side Distortion Renderer utilizing {@link OVRDistortion} - * implementing {@link GLEventListener} for convenience. - *

- * Implementation renders an {@link StereoRendererListener} instance - * side-by-side within one {@link FBObject} according to {@link OVRDistortion}. - *

- */ -public class OVRSBSRendererSingleFBO implements GLEventListener { - - private final OVRDistortion dist; - private final boolean ownsDist; - private final StereoRendererListener upstream; - private final FBObject fbo; - private final int magFilter; - private final int minFilter; - - private int numSamples; - private TextureAttachment fboTex; - - /** - * @param dist {@link OVRDistortion} instance used for rendering. - * @param ownsDist if true, {@link OVRDistortion#dispose(GL2ES2)} is issued on this instance's {@link #dispose(GLAutoDrawable)} method, otherwise not. - * @param upstream the upstream {@link StereoRendererListener}, a.k.a the content to render for both eyes - * @param magFilter if > 0 value for {@link GL#GL_TEXTURE_MAG_FILTER} - * @param minFilter if > 0 value for {@link GL#GL_TEXTURE_MIN_FILTER} - * @param numSamples sample-count, if > 0 using multisampling w/ given samples, otherwise no multisampling applies - */ - public OVRSBSRendererSingleFBO(final OVRDistortion dist, final boolean ownsDist, final StereoRendererListener upstream, - final int magFilter, final int minFilter, final int numSamples) { - this.dist = dist; - this.ownsDist = ownsDist; - this.upstream = upstream; - this.fbo = new FBObject(); - this.magFilter = magFilter; - this.minFilter = minFilter; - - this.numSamples = numSamples; - } - - private void initFBOs(final GL gl, final int width, final int height) { - // remove all texture attachments, since MSAA uses just color-render-buffer - // and non-MSAA uses texture2d-buffer - fbo.detachAllColorbuffer(gl); - - fbo.reset(gl, width, height, numSamples, false); - numSamples = fbo.getNumSamples(); - - if(numSamples>0) { - fbo.attachColorbuffer(gl, 0, true); // MSAA requires alpha - fbo.attachRenderbuffer(gl, Type.DEPTH, 24); - final FBObject ssink = new FBObject(); - { - ssink.reset(gl, width, height); - ssink.attachTexture2D(gl, 0, false, magFilter, minFilter, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE); - ssink.attachRenderbuffer(gl, Attachment.Type.DEPTH, 24); - } - fbo.setSamplingSink(ssink); - fbo.resetSamplingSink(gl); // validate - fboTex = fbo.getSamplingSink(); - } else { - fboTex = fbo.attachTexture2D(gl, 0, false, magFilter, minFilter, GL.GL_CLAMP_TO_EDGE, GL.GL_CLAMP_TO_EDGE); - fbo.attachRenderbuffer(gl, Type.DEPTH, 24); - } - fbo.unbind(gl); - } - - @SuppressWarnings("unused") - private void resetFBOs(final GL gl, final int width, final int height) { - fbo.reset(gl, width, height, numSamples, true); - numSamples = fbo.getNumSamples(); - if(numSamples>0) { - fboTex = fbo.getSamplingSink(); - } else { - fboTex = (TextureAttachment) fbo.getColorbuffer(0); - } - } - - @Override - public void init(final GLAutoDrawable drawable) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - dist.init(gl); - - // We will do some offscreen rendering, setup FBO... - if( null != upstream ) { - final int[] textureSize = dist.textureSize; - initFBOs(gl, textureSize[0], textureSize[1]); - upstream.init(drawable); - } - - gl.setSwapInterval(1); - } - - @Override - public void dispose(final GLAutoDrawable drawable) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - // FIXME complete release - if( null != upstream ) { - upstream.dispose(drawable); - fbo.destroy(gl); - } - if( ownsDist ) { - dist.dispose(gl); - } - } - - @Override - public void display(final GLAutoDrawable drawable) { - final ovrFrameTiming frameTiming = OVR.ovrHmd_BeginFrameTiming(dist.hmdCtx, 0); - - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - if(0 < numSamples) { - gl.glEnable(GL.GL_MULTISAMPLE); - } - - // FIXME: Instead of setting the viewport, - // it's better to change the projection matrix! - if( null != upstream ) { - fbo.bind(gl); - - for(int eyeNum=0; eyeNum<2; eyeNum++) { - // final ovrPosef eyeRenderPose = OVR.ovrHmd_GetEyePose(hmdCtx, eyeNum); - // final float[] eyePos = OVRUtil.getVec3f(eyeRenderPose.getPosition()); - final OVRDistortion.EyeData eyeDist = dist.eyes[eyeNum]; - final int[] viewport = eyeDist.viewport; - gl.glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); - - upstream.reshapeEye(drawable, viewport[0], viewport[1], viewport[2], viewport[3], - dist.getEyeParam(eyeNum), dist.updateEyePose(eyeNum)); - upstream.display(drawable, eyeNum > 0 ? CustomRendererListener.DISPLAY_REPEAT | CustomRendererListener.DISPLAY_DONTCLEAR : 0); - } - fbo.unbind(gl); - gl.glViewport(0, 0, drawable.getSurfaceWidth(), drawable.getSurfaceHeight()); - } - - gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - gl.glClear(GL.GL_COLOR_BUFFER_BIT); - gl.glActiveTexture(GL.GL_TEXTURE0 + dist.texUnit0.intValue()); - - if( null != upstream ) { - fbo.use(gl, fboTex); - dist.display(gl, frameTiming.getTimewarpPointSeconds()); - fbo.unuse(gl); - } else { - dist.display(gl, frameTiming.getTimewarpPointSeconds()); - } - - if( !drawable.getAutoSwapBufferMode() ) { - drawable.swapBuffers(); - } - OVR.ovrHmd_EndFrameTiming(dist.hmdCtx); - } - - @Override - public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) { - if( !drawable.getAutoSwapBufferMode() ) { - final GL2ES2 gl = drawable.getGL().getGL2ES2(); - gl.glViewport(0, 0, width, height); - } - } -} -- cgit v1.2.3