factor/unmaintained/opengl-gadgets/gadgets.factor

117 lines
3.1 KiB
Factor

! Copyright (C) 2008 Matthew Willis.
! See http://factorcode.org/license.txt for BSD license.
USING: locals math.functions math namespaces
opengl.gl opengl.demo-support accessors kernel opengl ui.gadgets
fry assocs
destructors sequences ui.render colors ;
IN: opengl.gadgets
TUPLE: texture-gadget < gadget ;
GENERIC: render* ( gadget -- texture dims )
GENERIC: cache-key* ( gadget -- key )
M: texture-gadget cache-key* ;
SYMBOL: textures
SYMBOL: refcounts
: init-cache ( symbol -- )
dup get [ drop ] [ H{ } clone swap set-global ] if ;
textures init-cache
refcounts init-cache
: refcount-change ( gadget quot -- )
[ cache-key* refcounts get [ [ 0 ] unless* ] ] dip compose change-at ;
TUPLE: cache-entry tex dims ;
C: <entry> cache-entry
: make-entry ( gadget -- entry )
dup render* <entry>
[ swap cache-key* textures get set-at ] keep ;
: get-entry ( gadget -- {texture,dims} )
dup cache-key* textures get at
[ nip ] [ make-entry ] if* ;
: get-dims ( gadget -- dims )
get-entry dims>> ;
: get-texture ( gadget -- texture )
get-entry tex>> ;
: release-texture ( gadget -- )
cache-key* textures get delete-at*
[ tex>> delete-texture ] [ drop ] if ;
: clear-textures ( -- )
textures get values [ tex>> delete-texture ] each
H{ } clone textures set-global
H{ } clone refcounts set-global ;
M: texture-gadget graft* ( gadget -- ) [ 1+ ] refcount-change ;
M: texture-gadget ungraft* ( gadget -- )
dup [ 1- ] refcount-change
dup cache-key* refcounts get at
zero? [ release-texture ] [ drop ] if ;
: 2^-ceil ( x -- y )
dup 2 < [ 2 * ] [ 1- log2 1+ 2^ ] if ; foldable flushable
: 2^-bounds ( dim -- dim' )
[ 2^-ceil ] map ; foldable flushable
:: (render-bytes) ( dims bytes format texture -- )
GL_ENABLE_BIT [
GL_TEXTURE_2D glEnable
GL_TEXTURE_2D texture glBindTexture
GL_TEXTURE_2D
0
GL_RGBA
dims 2^-bounds first2
0
format
GL_UNSIGNED_BYTE
bytes
glTexImage2D
init-texture
GL_TEXTURE_2D 0 glBindTexture
] do-attribs ;
: render-bytes ( dims bytes format -- texture )
gen-texture [ (render-bytes) ] keep ;
: render-bytes* ( dims bytes format -- texture dims )
pick [ render-bytes ] dip ;
:: four-corners ( dim -- )
[let* | w [ dim first ]
h [ dim second ]
dim' [ dim dup 2^-bounds [ /f ] 2map ]
w' [ dim' first ]
h' [ dim' second ] |
0 0 glTexCoord2d 0 0 glVertex2d
0 h' glTexCoord2d 0 h glVertex2d
w' h' glTexCoord2d w h glVertex2d
w' 0 glTexCoord2d w 0 glVertex2d
] ;
M: texture-gadget draw-gadget* ( gadget -- )
origin get [
GL_ENABLE_BIT [
white gl-color
1.0 -1.0 glPixelZoom
GL_TEXTURE_2D glEnable
GL_TEXTURE_2D over get-texture glBindTexture
GL_QUADS [
get-dims four-corners
] do-state
GL_TEXTURE_2D 0 glBindTexture
] do-attribs
] with-translation ;
M: texture-gadget pref-dim* ( gadget -- dim ) get-dims ;