]> gitweb.factorcode.org Git - factor.git/blob - extra/grid-meshes/grid-meshes.factor
19c4568b7ccc76da9bd79c50da995a5491c20e81
[factor.git] / extra / grid-meshes / grid-meshes.factor
1 ! (c)2009 Joe Groff bsd license
2 USING: accessors arrays destructors kernel math opengl
3 opengl.gl sequences sequences.product specialized-arrays.float ;
4 IN: grid-meshes
5
6 TUPLE: grid-mesh dim buffer row-length ;
7
8 <PRIVATE
9
10 : vertex-array-vertex ( dim x z -- vertex )
11     [ swap first /f ]
12     [ swap second /f ] bi-curry* bi
13     [ 0 ] dip float-array{ } 3sequence ;
14
15 : vertex-array-row ( dim z -- vertices )
16     dup 1 + 2array
17     over first 1 + iota
18     2array [ first2 swap vertex-array-vertex ] with product-map
19     concat ;
20
21 : vertex-array ( dim -- vertices )
22     dup second iota
23     [ vertex-array-row ] with map concat ;
24
25 : >vertex-buffer ( bytes -- buffer )
26     [ GL_ARRAY_BUFFER ] dip GL_STATIC_DRAW <gl-buffer> ;
27
28 : draw-vertex-buffer-row ( grid-mesh i -- )
29     swap [ GL_TRIANGLE_STRIP ] 2dip
30     row-length>> [ * ] keep
31     glDrawArrays ;
32
33 PRIVATE>
34
35 : draw-grid-mesh ( grid-mesh -- )
36     GL_ARRAY_BUFFER over buffer>> [
37         [ 3 GL_FLOAT 0 f glVertexPointer ] dip
38         dup dim>> second iota [ draw-vertex-buffer-row ] with each
39     ] with-gl-buffer ;
40
41 : <grid-mesh> ( dim -- grid-mesh )
42     [ ] [ vertex-array >vertex-buffer ] [ first 1 + 2 * ] tri
43     grid-mesh boa ;
44
45 M: grid-mesh dispose
46     [ [ delete-gl-buffer ] when* f ] change-buffer
47     drop ;
48