]> gitweb.factorcode.org Git - factor.git/blob - basis/ui/render/render.factor
8ce90742258768bab3a321969611561cab977b36
[factor.git] / basis / ui / render / render.factor
1 ! Copyright (C) 2005, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: math.rectangles math.vectors namespaces kernel accessors
4 assocs combinators sequences opengl opengl.gl colors
5 colors.constants ui.gadgets ui.pens ;
6 IN: ui.render
7
8 SYMBOL: clip
9
10 SYMBOL: viewport-translation
11
12 : flip-rect ( rect -- loc dim )
13     rect-bounds [
14         [ { 1 -1 } v* ] dip { 0 -1 } v* v+
15         viewport-translation get v+
16     ] keep ;
17
18 : do-clip ( -- ) clip get flip-rect gl-set-clip ;
19
20 : init-clip ( clip-rect -- )
21     [
22         dim>>
23         [ { 0 1 } v* viewport-translation set ]
24         [ [ { 0 0 } ] dip gl-viewport ]
25         [ [ 0 ] dip first2 0 1 -1 glOrtho ] tri
26     ]
27     [ clip set ] bi
28     do-clip ;
29
30 SLOT: background-color
31
32 : init-gl ( world -- )
33     GL_SMOOTH glShadeModel
34     GL_SCISSOR_TEST glEnable
35     GL_BLEND glEnable
36     GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA glBlendFunc
37     GL_VERTEX_ARRAY glEnableClientState
38     init-matrices
39     [ init-clip ]
40     [
41         background-color>> >rgba-components glClearColor
42         GL_COLOR_BUFFER_BIT glClear
43     ] bi ;
44
45 GENERIC: draw-gadget* ( gadget -- )
46
47 M: gadget draw-gadget* drop ;
48
49 SYMBOL: origin
50
51 { 0 0 } origin set-global
52
53 : visible-children ( gadget -- seq )
54     [ clip get origin get vneg offset-rect ] dip children-on ;
55
56 : translate ( rect/point -- ) loc>> origin [ v+ ] change ;
57
58 GENERIC: draw-children ( gadget -- )
59
60 ! For gadget selection
61 SYMBOL: selected-gadgets
62
63 SYMBOL: selection-background
64
65 GENERIC: selected-children ( gadget -- assoc/f selection-background )
66
67 M: gadget selected-children drop f f ;
68
69 ! For text rendering
70 SYMBOL: background
71
72 SYMBOL: foreground
73
74 GENERIC: gadget-background ( gadget -- color )
75
76 M: gadget gadget-background dup interior>> pen-background ;
77
78 GENERIC: gadget-foreground ( gadget -- color )
79
80 M: gadget gadget-foreground dup interior>> pen-foreground ;
81
82 <PRIVATE
83
84 : draw-selection-background ( gadget -- )
85     selection-background get background set
86     selection-background get gl-color
87     [ { 0 0 } ] dip dim>> gl-fill-rect ;
88
89 : draw-standard-background ( object -- )
90     dup interior>> dup [ draw-interior ] [ 2drop ] if ;
91
92 : draw-background ( gadget -- )
93     origin get [
94         [
95             dup selected-gadgets get key?
96             [ draw-selection-background ]
97             [ draw-standard-background ] if
98         ] [ draw-gadget* ] bi
99     ] with-translation ;
100
101 : draw-border ( object -- )
102     dup boundary>> dup [
103         origin get [ draw-boundary ] with-translation
104     ] [ 2drop ] if ;
105
106 PRIVATE>
107
108 : (draw-gadget) ( gadget -- )
109     dup loc>> origin get v+ origin [
110         [ draw-background ] [ draw-children ] [ draw-border ] tri
111     ] with-variable ;
112
113 : >absolute ( rect -- rect )
114     origin get offset-rect ;
115
116 : change-clip ( gadget -- )
117     >absolute clip [ rect-intersect ] change ;
118
119 : with-clipping ( gadget quot -- )
120     clip get [ over change-clip do-clip call ] dip clip set do-clip ; inline
121
122 : draw-gadget ( gadget -- )
123     {
124         { [ dup visible?>> not ] [ drop ] }
125         { [ dup clipped?>> not ] [ (draw-gadget) ] }
126         [ [ (draw-gadget) ] with-clipping ]
127     } cond ;
128
129 M: gadget draw-children
130     dup children>> [
131         {
132             [ visible-children ]
133             [ selected-children ]
134             [ gadget-background ]
135             [ gadget-foreground ]
136         } cleave [
137             
138             {
139                 [ [ selected-gadgets set ] when* ]
140                 [ [ selection-background set ] when* ]
141                 [ [ background set ] when* ]
142                 [ [ foreground set ] when* ]
143             } spread
144             [ draw-gadget ] each
145         ] with-scope
146     ] [ drop ] if ;
147
148 CONSTANT: selection-color T{ rgba f 0.8 0.8 1.0 1.0 }
149
150 CONSTANT: panel-background-color
151     T{ rgba f
152         0.7843137254901961
153         0.7686274509803922
154         0.7176470588235294
155         1.0
156     }
157
158 CONSTANT: focus-border-color COLOR: dark-gray