factor/basis/opengl/textures/textures.factor

81 lines
2.3 KiB
Factor
Raw Normal View History

! Copyright (C) 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors assocs cache colors.constants destructors fry
kernel opengl opengl.gl combinators images endian
specialized-arrays.float locals sequences ;
IN: opengl.textures
: init-texture ( -- )
GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_LINEAR glTexParameteri
GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_LINEAR glTexParameteri
GL_TEXTURE_2D GL_TEXTURE_WRAP_S GL_REPEAT glTexParameterf
GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_REPEAT glTexParameterf ;
: rect-texture-coords ( -- )
float-array{ 0 0 1 0 1 1 0 1 } gl-texture-coord-pointer ;
: gen-texture ( -- id )
[ glGenTextures ] (gen-gl-object) ;
:: make-texture ( dim pixmap format type -- id )
gen-texture [
GL_TEXTURE_BIT [
GL_TEXTURE_2D swap glBindTexture
GL_TEXTURE_2D
0
GL_RGBA
dim first2
0
format
type
pixmap
glTexImage2D
] do-attribs
] keep ;
: draw-textured-rect ( dim texture -- )
GL_TEXTURE_2D [
GL_TEXTURE_BIT [
GL_TEXTURE_COORD_ARRAY [
COLOR: white gl-color
GL_TEXTURE_2D swap glBindTexture
init-texture rect-texture-coords
fill-rect-vertices (gl-fill-rect)
GL_TEXTURE_2D 0 glBindTexture
] do-enabled-client-state
] do-attribs
] do-enabled ;
: delete-texture ( id -- )
[ glDeleteTextures ] (delete-gl-object) ;
TUPLE: texture texture display-list disposed ;
: make-texture-display-list ( dim texture -- dlist )
GL_COMPILE [ draw-textured-rect ] make-dlist ;
GENERIC: component-order>format ( component-order -- format )
M: RGBA component-order>format drop GL_RGBA ;
M: BGRA component-order>format drop GL_BGRA_EXT ;
: byte-order>type ( byte-order -- format )
native-endianness eq?
GL_UNSIGNED_INT_8_8_8_8_REV
GL_UNSIGNED_BYTE
? ;
: <texture> ( image -- texture )
[
{
[ dim>> ]
[ bitmap>> ]
[ component-order>> component-order>format ]
[ byte-order>> byte-order>type ]
} cleave make-texture
] [ dim>> ] bi
over make-texture-display-list f texture boa ;
M: texture dispose*
[ texture>> delete-texture ]
[ display-list>> delete-dlist ] bi ;