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