]> gitweb.factorcode.org Git - factor.git/blob - basis/opengl/opengl.factor
Specialized array overhaul
[factor.git] / basis / opengl / opengl.factor
1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! Portions copyright (C) 2007 Eduardo Cavazos.
3 ! Portions copyright (C) 2008 Joe Groff.
4 ! See http://factorcode.org/license.txt for BSD license.
5 USING: alien alien.c-types ascii calendar combinators.short-circuit
6 continuations kernel libc math macros namespaces math.vectors
7 math.parser opengl.gl combinators combinators.smart arrays
8 sequences splitting words byte-arrays assocs vocabs
9 colors colors.constants accessors generalizations locals fry
10 specialized-arrays ;
11 SPECIALIZED-ARRAY: float
12 SPECIALIZED-ARRAY: uint
13 IN: opengl
14
15 : gl-color ( color -- ) >rgba-components glColor4d ; inline
16
17 : gl-clear-color ( color -- ) >rgba-components glClearColor ;
18
19 : gl-clear ( color -- )
20     gl-clear-color GL_COLOR_BUFFER_BIT glClear ;
21
22 : error>string ( n -- string )
23     H{
24         { HEX: 0 "No error" }
25         { HEX: 0501 "Invalid value" }
26         { HEX: 0500 "Invalid enumerant" }
27         { HEX: 0502 "Invalid operation" }
28         { HEX: 0503 "Stack overflow" }
29         { HEX: 0504 "Stack underflow" }
30         { HEX: 0505 "Out of memory" }
31         { HEX: 0506 "Invalid framebuffer operation" }
32     } at "Unknown error" or ;
33
34 TUPLE: gl-error function code string ;
35
36 : <gl-error> ( function code -- gl-error )
37     dup error>string \ gl-error boa ; inline
38
39 : gl-error-code ( -- code/f )
40     glGetError dup 0 = [ drop f ] when ; inline
41
42 : (gl-error) ( function -- )
43     gl-error-code [ <gl-error> throw ] [ drop ] if* ;
44
45 : gl-error ( -- )
46     f (gl-error) ; inline
47
48 : do-enabled ( what quot -- )
49     over glEnable dip glDisable ; inline
50
51 : do-enabled-client-state ( what quot -- )
52     over glEnableClientState dip glDisableClientState ; inline
53
54 : words>values ( word/value-seq -- value-seq )
55     [ ?execute ] map ;
56
57 : (all-enabled) ( seq quot -- )
58     over [ glEnable ] each dip [ glDisable ] each ; inline
59
60 : (all-enabled-client-state) ( seq quot -- )
61     [ dup [ glEnableClientState ] each ] dip
62     dip
63     [ glDisableClientState ] each ; inline
64
65 MACRO: all-enabled ( seq quot -- )
66     [ words>values ] dip '[ _ _ (all-enabled) ] ;
67
68 MACRO: all-enabled-client-state ( seq quot -- )
69     [ words>values ] dip '[ _ _ (all-enabled-client-state) ] ;
70
71 : do-matrix ( quot -- )
72     glPushMatrix call glPopMatrix ; inline
73
74 : gl-material ( face pname params -- )
75     float-array{ } like glMaterialfv ;
76
77 : gl-vertex-pointer ( seq -- )
78     [ 2 GL_FLOAT 0 ] dip glVertexPointer ; inline
79
80 : gl-color-pointer ( seq -- )
81     [ 4 GL_FLOAT 0 ] dip glColorPointer ; inline
82
83 : gl-texture-coord-pointer ( seq -- )
84     [ 2 GL_FLOAT 0 ] dip glTexCoordPointer ; inline
85
86 : line-vertices ( a b -- )
87     [ first2 [ 0.5 + ] bi@ ] bi@ 4 float-array{ } nsequence
88     gl-vertex-pointer ;
89
90 : gl-line ( a b -- )
91     line-vertices GL_LINES 0 2 glDrawArrays ;
92
93 :: (rect-vertices) ( loc dim -- vertices )
94     #! We use GL_LINE_STRIP with a duplicated first vertex
95     #! instead of GL_LINE_LOOP to work around a bug in Apple's
96     #! X3100 driver.
97     loc first2 :> y :> x
98     dim first2 :> h :> w
99     [
100         x 0.5 +     y 0.5 +
101         x w + 0.3 - y 0.5 +
102         x w + 0.3 - y h + 0.3 -
103         x           y h + 0.3 -
104         x 0.5 +     y 0.5 +
105     ] float-array{ } output>sequence ;
106
107 : rect-vertices ( loc dim -- )
108     (rect-vertices) gl-vertex-pointer ;
109
110 : (gl-rect) ( -- )
111     GL_LINE_STRIP 0 5 glDrawArrays ;
112
113 : gl-rect ( loc dim -- )
114     rect-vertices (gl-rect) ;
115
116 :: (fill-rect-vertices) ( loc dim -- vertices )
117     loc first2 :> y :> x
118     dim first2 :> h :> w
119     [
120         x      y
121         x w +  y
122         x w +  y h +
123         x      y h +
124     ] float-array{ } output>sequence ;
125
126 : fill-rect-vertices ( loc dim -- )
127     (fill-rect-vertices) gl-vertex-pointer ;
128
129 : (gl-fill-rect) ( -- )
130     GL_QUADS 0 4 glDrawArrays ;
131
132 : gl-fill-rect ( loc dim -- )
133     fill-rect-vertices (gl-fill-rect) ;
134
135 : do-attribs ( bits quot -- )
136     swap glPushAttrib call glPopAttrib ; inline
137
138 : (gen-gl-object) ( quot -- id )
139     [ 1 0 <uint> ] dip keep *uint ; inline
140
141 : (delete-gl-object) ( id quot -- )
142     [ 1 swap <uint> ] dip call ; inline
143
144 : gen-gl-buffer ( -- id )
145     [ glGenBuffers ] (gen-gl-object) ;
146
147 : delete-gl-buffer ( id -- )
148     [ glDeleteBuffers ] (delete-gl-object) ;
149
150 :: with-gl-buffer ( binding id quot -- )
151     binding id glBindBuffer
152     quot [ binding 0 glBindBuffer ] [ ] cleanup ; inline
153
154 : with-array-element-buffers ( array-buffer element-buffer quot -- )
155     [ GL_ELEMENT_ARRAY_BUFFER ] 2dip '[
156         GL_ARRAY_BUFFER swap _ with-gl-buffer
157     ] with-gl-buffer ; inline
158
159 : gen-vertex-array ( -- id )
160     [ glGenVertexArrays ] (gen-gl-object) ;
161
162 : delete-vertex-array ( id -- )
163     [ glDeleteVertexArrays ] (delete-gl-object) ;
164
165 :: with-vertex-array ( id quot -- )
166     id glBindVertexArray
167     quot [ 0 glBindVertexArray ] [ ] cleanup ; inline
168
169 : <gl-buffer> ( target data hint -- id )
170     pick gen-gl-buffer [
171         [
172             [ [ byte-length ] keep ] dip glBufferData
173         ] with-gl-buffer
174     ] keep ;
175
176 : buffer-offset ( int -- alien )
177     <alien> ; inline
178
179 : bind-texture-unit ( id target unit -- )
180     glActiveTexture swap glBindTexture gl-error ;
181
182 : (set-draw-buffers) ( buffers -- )
183     [ length ] [ >uint-array ] bi glDrawBuffers ;
184
185 MACRO: set-draw-buffers ( buffers -- )
186     words>values '[ _ (set-draw-buffers) ] ;
187
188 : gen-dlist ( -- id ) 1 glGenLists ;
189
190 : make-dlist ( type quot -- id )
191     [ gen-dlist ] 2dip '[ _ glNewList @ glEndList ] keep ; inline
192
193 : gl-translate ( point -- ) first2 0.0 glTranslated ;
194
195 : delete-dlist ( id -- ) 1 glDeleteLists ;
196
197 : with-translation ( loc quot -- )
198     [ [ gl-translate ] dip call ] do-matrix ; inline
199
200 : fix-coordinates ( point1 point2 -- x1 y2 x2 y2 )
201     [ first2 [ >fixnum ] bi@ ] bi@ ;
202
203 : gl-set-clip ( loc dim -- )
204     fix-coordinates glScissor ;
205
206 : gl-viewport ( loc dim -- )
207     fix-coordinates glViewport ;
208
209 : init-matrices ( -- )
210     #! Leaves with matrix mode GL_MODELVIEW
211     GL_PROJECTION glMatrixMode
212     glLoadIdentity
213     GL_MODELVIEW glMatrixMode
214     glLoadIdentity ;