improve grid-mesh generation performance

db4
Joe Groff 2009-10-16 15:57:38 -05:00
parent a0c6af5603
commit 2ae8edeb9d
1 changed files with 16 additions and 18 deletions

View File

@ -1,31 +1,26 @@
! (c)2009 Joe Groff bsd license ! (c)2009 Joe Groff bsd license
USING: accessors arrays destructors kernel math opengl USING: accessors alien.data.map arrays destructors fry grouping
opengl.gl sequences sequences.product specialized-arrays ; kernel math math.ranges math.vectors.simd opengl opengl.gl sequences
sequences.product specialized-arrays ;
FROM: alien.c-types => float ; FROM: alien.c-types => float ;
SPECIALIZED-ARRAY: float SIMD: float
SPECIALIZED-ARRAY: float-4
IN: grid-meshes IN: grid-meshes
TUPLE: grid-mesh dim buffer row-length ; TUPLE: grid-mesh dim buffer row-length ;
<PRIVATE <PRIVATE
: vertex-array-vertex ( dim x z -- vertex ) : vertex-array-row ( range z0 z1 -- vertices )
[ swap first /f ] '[ _ _ [ 0.0 swap 1.0 float-4-boa ] bi-curry@ bi ]
[ swap second /f ] bi-curry* bi data-map( void -- float-4[2] ) ; inline
[ 0 ] dip float-array{ } 3sequence ;
: vertex-array-row ( dim z -- vertices )
dup 1 + 2array
over first 1 + iota
2array [ first2 swap vertex-array-vertex ] with product-map
concat ;
: vertex-array ( dim -- vertices ) : vertex-array ( dim -- vertices )
dup second iota first2 [ [ 0.0 1.0 1.0 ] dip /f <range> ] bi@
[ vertex-array-row ] with map concat ; 2 <sliced-clumps> [ first2 vertex-array-row ] with map concat ;
: >vertex-buffer ( bytes -- buffer ) : >vertex-buffer ( bytes -- buffer )
[ GL_ARRAY_BUFFER ] dip GL_STATIC_DRAW <gl-buffer> ; [ GL_ARRAY_BUFFER ] dip GL_STATIC_DRAW <gl-buffer> ; inline
: draw-vertex-buffer-row ( grid-mesh i -- ) : draw-vertex-buffer-row ( grid-mesh i -- )
swap [ GL_TRIANGLE_STRIP ] 2dip swap [ GL_TRIANGLE_STRIP ] 2dip
@ -36,13 +31,16 @@ PRIVATE>
: draw-grid-mesh ( grid-mesh -- ) : draw-grid-mesh ( grid-mesh -- )
GL_ARRAY_BUFFER over buffer>> [ GL_ARRAY_BUFFER over buffer>> [
[ 3 GL_FLOAT 0 f glVertexPointer ] dip [ 4 GL_FLOAT 0 f glVertexPointer ] dip
dup dim>> second iota [ draw-vertex-buffer-row ] with each dup dim>> second iota [ draw-vertex-buffer-row ] with each
] with-gl-buffer ; ] with-gl-buffer ;
USE: tools.time
: <grid-mesh> ( dim -- grid-mesh ) : <grid-mesh> ( dim -- grid-mesh )
[
[ ] [ vertex-array >vertex-buffer ] [ first 1 + 2 * ] tri [ ] [ vertex-array >vertex-buffer ] [ first 1 + 2 * ] tri
grid-mesh boa ; grid-mesh boa
] time ;
M: grid-mesh dispose M: grid-mesh dispose
[ [ delete-gl-buffer ] when* f ] change-buffer [ [ delete-gl-buffer ] when* f ] change-buffer