1 ! (c)2010 Joe Groff bsd license
2 USING: accessors alien.c-types alien.data.map combinators fry
3 gpu.buffers gpu.framebuffers gpu.render gpu.shaders gpu.state
4 images images.atlas kernel locals math math.matrices.simd
5 math.order math.vectors math.vectors.simd papier.map sequences
9 CONSTANT: slab-buffer-chunk-size 1024
11 GLSL-SHADER-FILE: papier-vertex-shader vertex-shader "papier.v.glsl"
12 GLSL-SHADER-FILE: papier-fragment-shader fragment-shader "papier.f.glsl"
13 GLSL-PROGRAM: papier-program
14 papier-vertex-shader papier-fragment-shader
17 UNIFORM-TUPLE: papier-uniforms
18 { "p_matrix" mat4-uniform f }
19 { "eye" vec3-uniform f }
20 { "atlas" texture-uniform f } ;
22 TUPLE: papier-renderer
23 { vertex-buffer buffer }
24 { index-buffer buffer }
25 { vertex-array vertex-array initial: T{ vertex-array-object } } ;
27 : set-papier-state ( -- )
29 T{ blend-state { rgb-mode T{ blend-mode } } { alpha-mode T{ blend-mode } } }
32 TYPED:: <papier-renderer> ( -- renderer: papier-renderer )
34 stream-upload draw-usage index-buffer slab-buffer-chunk-size f <buffer> >>index-buffer
35 stream-upload draw-usage vertex-buffer slab-buffer-chunk-size f <buffer>
37 [ papier-program <program-instance> <vertex-array> >>vertex-array ] bi ;
39 :: <p-matrix> ( dim fov near-plane far-plane -- matrix )
40 dim dup first2 min >float v/n fov v*n near-plane v*n
41 near-plane far-plane frustum-matrix4 ; inline
43 : slab-vertices ( slab -- av at ac bv bt bc cv ct cc dv dt dc )
44 [ matrix>> ] [ [ frame>> ] [ texcoords>> ] bi nth ] [ color>> ] tri {
45 [ [ float-4{ -1 -1 0 1 } m4.v ] [ ] [ ] tri* ]
46 [ [ float-4{ 1 -1 0 1 } m4.v ] [ { 2 1 0 3 } vshuffle ] [ ] tri* ]
47 [ [ float-4{ -1 1 0 1 } m4.v ] [ { 0 3 2 1 } vshuffle ] [ ] tri* ]
48 [ [ float-4{ 1 1 0 1 } m4.v ] [ { 2 3 0 1 } vshuffle ] [ ] tri* ]
51 : slab-indexes ( i -- a b c d e f )
52 4 * { [ ] [ 1 + ] [ 2 + ] [ 2 + ] [ 1 + ] [ 3 + ] } cleave ; inline
54 : order-slabs ( slabs eye -- slabs' )
56 ! '[ center>> _ v- norm-sq ] inv-sort-with ; inline
59 : render-slabs ( slabs -- vertices indexes )
63 ] data-map( object object -- float-4[12] uint[6] ) ; inline
65 TYPED:: render-slabs-to-buffers ( renderer: papier-renderer uniforms: papier-uniforms slabs -- )
66 slabs uniforms eye>> order-slabs render-slabs :> ( vertices indexes )
67 renderer vertex-buffer>> vertices allocate-byte-array
68 renderer index-buffer>> indexes allocate-byte-array ; inline
70 : slab-index-count ( slabs -- count )
73 TYPED: prep-slab-atlas ( slabs images -- atlas-image: image )
74 make-atlas-assoc [ update-slabs-for-atlas ] dip ;
76 TYPED:: draw-slabs ( renderer: papier-renderer uniforms: papier-uniforms slabs -- )
77 system-framebuffer { { default-attachment { 0.0 0.0 0.0 0.0 } } } clear-framebuffer
79 renderer uniforms slabs render-slabs-to-buffers
81 renderer index-buffer>> 0 <buffer-ptr> slabs slab-index-count
82 uint-indexes <index-elements> :> indexes
84 renderer vertex-array>> :> vertex-array
92 { default-attachment }
93 f render-set boa render ;