]> gitweb.factorcode.org Git - factor.git/blob - extra/grid-meshes/grid-meshes.factor
core: Rename iota to <iota> so we can have TUPLE: iota ... ; instead of TUPLE: iota...
[factor.git] / extra / grid-meshes / grid-meshes.factor
1 ! (c)2009 Joe Groff bsd license
2 USING: accessors alien.data.map arrays destructors fry grouping
3 kernel math math.ranges math.vectors.simd opengl opengl.gl sequences
4 sequences.product specialized-arrays ;
5 FROM: alien.c-types => float ;
6 SPECIALIZED-ARRAY: float-4
7 IN: grid-meshes
8
9 TUPLE: grid-mesh dim buffer row-length ;
10
11 <PRIVATE
12
13 : vertex-array-row ( range z0 z1 -- vertices )
14     '[ _ _ [ 0.0 swap 1.0 float-4-boa ] bi-curry@ bi ]
15     data-map( object -- float-4[2] ) ; inline
16
17 : vertex-array ( dim -- vertices )
18     first2 [ [ 0.0 1.0 1.0 ] dip /f <range> ] bi@
19     2 <clumps> [ first2 vertex-array-row ] with map concat ;
20
21 : >vertex-buffer ( bytes -- buffer )
22     [ GL_ARRAY_BUFFER ] dip GL_STATIC_DRAW <gl-buffer> ; inline
23
24 : draw-vertex-buffer-row ( grid-mesh i -- )
25     swap [ GL_TRIANGLE_STRIP ] 2dip
26     row-length>> [ * ] keep
27     glDrawArrays ;
28
29 PRIVATE>
30
31 : draw-grid-mesh ( grid-mesh -- )
32     GL_ARRAY_BUFFER over buffer>> [
33         [ 4 GL_FLOAT 0 f glVertexPointer ] dip
34         dup dim>> second <iota> [ draw-vertex-buffer-row ] with each
35     ] with-gl-buffer ;
36
37 : <grid-mesh> ( dim -- grid-mesh )
38     [ ] [ vertex-array >vertex-buffer ] [ first 1 + 2 * ] tri
39     grid-mesh boa ;
40
41 M: grid-mesh dispose
42     [ [ delete-gl-buffer ] when* f ] change-buffer
43     drop ;