]> gitweb.factorcode.org Git - factor.git/blob - extra/papier/render/render.factor
papier: Add papier as a demo (2009)
[factor.git] / extra / papier / render / render.factor
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
6 sorting typed ;
7 IN: papier.render
8
9 CONSTANT: slab-buffer-chunk-size 1024
10
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
15     papier-vertex ;
16
17 UNIFORM-TUPLE: papier-uniforms
18     { "p_matrix" mat4-uniform    f }
19     { "eye"      vec3-uniform    f }
20     { "atlas"    texture-uniform f } ;
21
22 TUPLE: papier-renderer
23     { vertex-buffer buffer }
24     { index-buffer buffer }
25     { vertex-array vertex-array initial: T{ vertex-array-object } } ;
26
27 : set-papier-state ( -- )
28     {
29         T{ blend-state { rgb-mode T{ blend-mode } } { alpha-mode T{ blend-mode } } }
30     } set-gpu-state ;
31
32 TYPED:: <papier-renderer> ( -- renderer: papier-renderer )
33     papier-renderer new
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>
36         [ >>vertex-buffer ]
37         [ papier-program <program-instance> <vertex-array> >>vertex-array ] bi ;
38
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
42
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* ]
49     } 3cleave ; inline
50
51 : slab-indexes ( i -- a b c d e f )
52     4 * { [ ] [ 1 + ] [ 2 + ] [ 2 + ] [ 1 + ] [ 3 + ] } cleave ; inline
53
54 : order-slabs ( slabs eye -- slabs' )
55     ! NO
56     ! '[ center>> _ v- norm-sq ] inv-sort-with ; inline
57     drop ;
58
59 : render-slabs ( slabs -- vertices indexes )
60     dup length <iota> [
61         [ slab-vertices ]
62         [ slab-indexes ] bi* 
63     ] data-map( object object -- float-4[12] uint[6] ) ; inline
64
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
69
70 : slab-index-count ( slabs -- count )
71     length 6 * ; inline
72
73 TYPED: prep-slab-atlas ( slabs images -- atlas-image: image )
74     make-atlas-assoc [ update-slabs-for-atlas ] dip ;
75
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
78
79     renderer uniforms slabs render-slabs-to-buffers
80
81     renderer index-buffer>> 0 <buffer-ptr> slabs slab-index-count
82     uint-indexes <index-elements> :> indexes
83
84     renderer vertex-array>> :> vertex-array
85     
86     triangles-mode
87     vertex-array
88     uniforms
89     indexes
90     f
91     system-framebuffer
92     { default-attachment }
93     f render-set boa render ;
94