From b682746d2a68012f5cdf1f57f23981c113ca83e8 Mon Sep 17 00:00:00 2001 From: Harvey Harrison Date: Sat, 16 Feb 2013 22:28:54 -0800 Subject: j3dcore: add members and helpers for future FBOlayer work Extracted from a patch by August Lammersdorf. [HSH - any mistakes here are mine] Signed-off-by: August Lammersdorf Signed-off-by: Harvey Harrison --- .../share/javax/media/j3d/JoglDrawable.java | 33 +++++++++++++++++----- .../share/javax/media/j3d/JoglPipeline.java | 31 ++++++++++++++++++-- 2 files changed, 55 insertions(+), 9 deletions(-) (limited to 'src/classes') diff --git a/src/classes/share/javax/media/j3d/JoglDrawable.java b/src/classes/share/javax/media/j3d/JoglDrawable.java index 7981b1b..1ce492e 100644 --- a/src/classes/share/javax/media/j3d/JoglDrawable.java +++ b/src/classes/share/javax/media/j3d/JoglDrawable.java @@ -26,19 +26,38 @@ package javax.media.j3d; +import javax.media.nativewindow.NativeWindow; import javax.media.opengl.GLDrawable; /** * Drawable class for the Jogl rendering pipeline. */ class JoglDrawable implements Drawable { - private GLDrawable drawable; + private GLDrawable drawable; + private NativeWindow nativeWindow; - JoglDrawable(GLDrawable drawable) { - this.drawable = drawable; - } + JoglDrawable(GLDrawable drawable, NativeWindow nativeWindow) { + this.drawable = drawable; + this.nativeWindow = nativeWindow; + } - GLDrawable getGLDrawable() { - return drawable; - } + GLDrawable getGLDrawable() { + return drawable; + } + + void setGLDrawable(GLDrawable drawable) { + this.drawable = drawable; + } + + NativeWindow getNativeWindow() { + return nativeWindow; + } + + void destroyNativeWindow() { + if (nativeWindow == null) + return; + + nativeWindow.destroy(); + nativeWindow = null; + } } diff --git a/src/classes/share/javax/media/j3d/JoglPipeline.java b/src/classes/share/javax/media/j3d/JoglPipeline.java index 714c013..430c970 100644 --- a/src/classes/share/javax/media/j3d/JoglPipeline.java +++ b/src/classes/share/javax/media/j3d/JoglPipeline.java @@ -54,6 +54,9 @@ import java.util.regex.Pattern; import com.jogamp.nativewindow.awt.AWTGraphicsConfiguration; import com.jogamp.nativewindow.awt.AWTGraphicsDevice; import com.jogamp.nativewindow.awt.AWTGraphicsScreen; +import com.jogamp.nativewindow.awt.JAWTWindow; +import com.jogamp.opengl.FBObject; + import javax.media.nativewindow.AbstractGraphicsConfiguration; import javax.media.nativewindow.CapabilitiesChooser; import javax.media.nativewindow.CapabilitiesImmutable; @@ -70,6 +73,7 @@ import javax.media.opengl.GLContext; import javax.media.opengl.GLDrawable; import javax.media.opengl.GLDrawableFactory; import javax.media.opengl.GLException; +import javax.media.opengl.GLFBODrawable; import javax.media.opengl.GLPbuffer; import javax.media.opengl.GLProfile; import javax.media.opengl.Threading; @@ -6178,7 +6182,7 @@ class JoglPipeline extends Pipeline { indexChooser, awtGraphicsScreen, VisualIDHolder.VID_UNDEFINED); NativeWindow nativeWindow = NativeWindowFactory.getNativeWindow(cv, awtGraphicsConfiguration); draw = GLDrawableFactory.getFactory(profile).createGLDrawable(nativeWindow); - cv.drawable = new JoglDrawable(draw); + cv.drawable = new JoglDrawable(draw, null); } else { draw = drawable(cv.drawable); } @@ -6311,7 +6315,7 @@ class JoglPipeline extends Pipeline { //FIXME use the real AWTGraphicsDevice GLPbuffer pbuffer = GLDrawableFactory.getFactory(profile).createGLPbuffer(GLDrawableFactory.getDesktopFactory().getDefaultDevice() ,caps, null,width, height, GLContext.getCurrent()); - return new JoglDrawable(pbuffer); + return new JoglDrawable(pbuffer, null); } void destroyOffScreenBuffer(Canvas3D cv, Context ctx, Drawable drawable) { @@ -7148,6 +7152,29 @@ void swapBuffers(Canvas3D cv, Context ctx, Drawable drawable) { } } +private boolean isOffscreenLayerSurfaceEnabled(Canvas3D cv) { + if (cv.drawable == null || cv.offScreen) + return false; + + JoglDrawable joglDrawble = (JoglDrawable)cv.drawable; + final JAWTWindow jawtwindow = (JAWTWindow)joglDrawble.getNativeWindow(); + if (jawtwindow == null) + return false; + + return jawtwindow.isOffscreenLayerSurfaceEnabled(); +} + +private boolean hasFBObjectSizeChanged(JoglDrawable jdraw, int width, int height) { + if (!(jdraw.getGLDrawable() instanceof GLFBODrawable)) + return false; + + FBObject fboBack = ((GLFBODrawable)jdraw.getGLDrawable()).getFBObject(GL.GL_BACK); + if (fboBack == null) + return false; + + return (width != fboBack.getWidth() || height != fboBack.getHeight()); +} + // The native method for setting the Viewport. void setViewport(Context ctx, int x, int y, int width, int height) { if (VERBOSE) System.err.println("JoglPipeline.setViewport()"); -- cgit v1.2.3