From f13f35d250f510f360bbb355388c0a86226f3b30 Mon Sep 17 00:00:00 2001 From: kappaOne Date: Fri, 28 Dec 2012 01:11:12 +0000 Subject: [PATCH] Add further work to the CALayer to prepare it for allowing an FBO to be blit to its internal FBO --- .../org_lwjgl_opengl_MacOSXCanvasPeerInfo.m | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m b/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m index ef7dff2a..7ee29dc9 100644 --- a/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m +++ b/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m @@ -47,9 +47,14 @@ #include "common_tools.h" -@interface GLLayer : NSOpenGLLayer {} -- (void) attachLayer; -- (void) removeLayer; +@interface GLLayer : NSOpenGLLayer { + MacOSXPeerInfo *peer_info; +} +- (void) attachLayer: (id)surfaceLayers; +- (void) removeLayer: (id)surfaceLayers; + +- (MacOSXPeerInfo*) peer_info; +- (void) setPeer_info: (MacOSXPeerInfo*)input; @end JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nInitHandle @@ -67,7 +72,8 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nInitHandle // get the root layer of the AWT Canvas id surfaceLayers = (id )macosx_dsi; GLLayer *glLayer = [[GLLayer new] autorelease]; - [glLayer performSelectorOnMainThread:@selector(attachLayer:) withObject:surfaceLayers waitUntilDone:NO]; + [glLayer performSelectorOnMainThread:@selector(attachLayer:) withObject:surfaceLayers waitUntilDone:YES]; + [glLayer setPeer_info:peer_info]; } peer_info->isWindowed = true; @@ -98,15 +104,47 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nInitHandle surfaceLayers.layer = nil; } +- (MacOSXPeerInfo*) peer_info { + return peer_info; +} + +- (void) setPeer_info: (MacOSXPeerInfo*)input { + peer_info = input; +} + -(void)drawInCGLContext:(CGLContextObj)glContext pixelFormat:(CGLPixelFormatObj)pixelFormat forLayerTime:(CFTimeInterval)timeInterval displayTime:(const CVTimeStamp *)timeStamp { + if(!peer_info) { + return; + } + // set the current context CGLSetCurrentContext(glContext); - // draw a single red quad spinning around based on the current time + GLint originalFBO; + GLint originalReadFBO; + GLint originalDrawFBO; + + // get and save the current fbo values + glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &originalFBO); + glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &originalReadFBO); + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &originalDrawFBO); + + // copy/blit the LWJGL FBO to this CALayers FBO + // TODO + /*glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, lwjglFBO); + glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, originalFBO); + + glBlitFramebufferEXT(0, 0, width, height, + 0, 0, width, height, + GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, + GL_NEAREST);*/ + + + // for testing, draw a single yellow quad spinning around based on the current time GLfloat rotate = timeInterval * 60.0; // 60 degrees per second glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); @@ -122,6 +160,11 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nInitHandle glEnd(); glPopMatrix(); + + // restore original fbo read and draw values + glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, originalReadFBO); + glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, originalDrawFBO); + // call super to finalize the drawing - by default all it does is call glFlush() [super drawInCGLContext:glContext pixelFormat:pixelFormat forLayerTime:timeInterval displayTime:timeStamp]; }