]> gitweb.factorcode.org Git - factor.git/commitdiff
cocoa backend for offscreen world rendering
authorJoe Groff <arcata@gmail.com>
Tue, 9 Dec 2008 03:30:10 +0000 (19:30 -0800)
committerJoe Groff <arcata@gmail.com>
Tue, 9 Dec 2008 03:30:10 +0000 (19:30 -0800)
basis/cocoa/views/views.factor
basis/ui/backend/backend.factor
basis/ui/cocoa/cocoa.factor

index be67f03184e12347b8596f897c6c3c8ce16b1663..f8e95dad400739a811fc74f698db6a7464b7fadb 100644 (file)
@@ -55,8 +55,11 @@ PRIVATE>
 : with-multisample ( quot -- )
     t +multisample+ pick with-variable ; inline
 
-: <PixelFormat> ( -- pixelfmt )
+
+
+: <PixelFormat> ( attributes -- pixelfmt )
     NSOpenGLPixelFormat -> alloc [
+        %
         NSOpenGLPFAWindow ,
         NSOpenGLPFADoubleBuffer ,
         NSOpenGLPFADepthSize , 16 ,
@@ -74,7 +77,7 @@ PRIVATE>
     -> autorelease ;
 
 : <GLView> ( class dim -- view )
-    [ -> alloc 0 0 ] dip first2 <NSRect> <PixelFormat>
+    [ -> alloc 0 0 ] dip first2 <NSRect> { } <PixelFormat>
     -> initWithFrame:pixelFormat:
     dup 1 -> setPostsBoundsChangedNotifications:
     dup 1 -> setPostsFrameChangedNotifications: ;
index 0840d07cbc12fb0c9788a15f187d26e3bde869b1..8d5109ac7fe2bf4d43bbd356a3d71bb50ba59cb0 100644 (file)
@@ -17,11 +17,15 @@ HOOK: (open-window) ui-backend ( world -- )
 
 HOOK: (close-window) ui-backend ( handle -- )
 
+HOOK: (open-offscreen-buffer) ui-backend ( world -- )
+
+HOOK: (close-offscreen-buffer) ui-backend ( handle -- )
+
 HOOK: raise-window* ui-backend ( world -- )
 
-HOOK: select-gl-context ui-backend ( handle -- )
+GENERIC: select-gl-context ( handle -- )
 
-HOOK: flush-gl-context ui-backend ( handle -- )
+GENERIC: flush-gl-context ( handle -- )
 
 HOOK: beep ui-backend ( -- )
 
index a9b3b03b75d7314a8bde2ef5f2ba2761f716cb15..8861f8ffa21af92838736f0a6491586a0e158d35 100644 (file)
@@ -5,12 +5,19 @@ command-line kernel memory namespaces cocoa.messages
 cocoa.runtime cocoa.subclassing cocoa.pasteboard cocoa.types
 cocoa.windows cocoa.classes cocoa.application sequences system
 ui ui.backend ui.clipboards ui.gadgets ui.gadgets.worlds
-ui.cocoa.views core-foundation threads math.geometry.rect fry ;
+ui.cocoa.views core-foundation threads math.geometry.rect fry
+libc generalizations ;
 IN: ui.cocoa
 
-TUPLE: handle view window ;
+TUPLE: handle ;
+TUPLE: window-handle < handle view window ;
+TUPLE: offscreen-handle < handle context buffer ;
 
-C: <handle> handle
+C: <window-handle> window-handle
+C: <offscreen-handle> offscreen-handle
+
+M: offscreen-handle window>> f ;
+M: offscreen-handle view>>   f ;
 
 SINGLETON: cocoa-ui-backend
 
@@ -38,7 +45,8 @@ M: pasteboard set-clipboard-contents
 : gadget-window ( world -- )
     dup <FactorView>
     2dup swap world>NSRect <ViewWindow>
-    [ [ -> release ] [ install-window-delegate ] bi* ] [ <handle> ] 2bi
+    [ [ -> release ] [ install-window-delegate ] bi* ]
+    [ <window-handle> ] 2bi
     >>handle drop ;
 
 M: cocoa-ui-backend set-title ( string world -- )
@@ -87,11 +95,36 @@ M: cocoa-ui-backend raise-window* ( world -- )
         NSApp 1 -> activateIgnoringOtherApps:
     ] when* ;
 
-M: cocoa-ui-backend select-gl-context ( handle -- )
-    view>> -> openGLContext -> makeCurrentContext ;
+: pixel-size ( pixel-format -- size )
+    0 <int> [ NSOpenGLPFAColorSize 0 -> getValues:forAttribute:forVirtualScreen: ]
+    keep *int -3 shift ;
+
+: offscreen-buffer ( world pixel-format -- alien w h pitch )
+    [ dim>> first2 ] [ pixel-size ] bi*
+    { [ * * malloc ] [ 2drop ] [ drop nip ] [ nip * ] } cleave ;
+
+: gadget-offscreen-context ( world -- context buffer )
+    { NSOpenGLPFAOffscreen } <PixelFormat>
+    [ NSOpenGLContext -> alloc swap f -> initWithFormat:shareContext: ]
+    [ offscreen-buffer ] bi
+    4 npick [ setOffScreen:width:height:rowbytes: ] dip ;
+
+M: cocoa-ui-backend (open-offscreen-buffer) ( world -- )
+    dup gadget-offscreen-context <offscreen-handle> >>handle drop ;
+
+M: cocoa-ui-backend (close-offscreen-buffer) ( handle -- )
+    [ context>> -> release ]
+    [ buffer>> free ] bi ;
+
+GENERIC: gl-context ( handle -- context )
+M: window-handle gl-context view>> -> openGLContext ;
+M: offscreen-handle gl-context context>> ;
+
+M: handle select-gl-context ( handle -- )
+    gl-context -> makeCurrentContext ;
 
-M: cocoa-ui-backend flush-gl-context ( handle -- )
-    view>> -> openGLContext -> flushBuffer ;
+M: handle flush-gl-context ( handle -- )
+    gl-context -> flushBuffer ;
 
 M: cocoa-ui-backend beep ( -- )
     NSBeep ;