]> gitweb.factorcode.org Git - factor.git/blob - library/ui/paint.factor
Minimize OpenGL state changes
[factor.git] / library / ui / paint.factor
1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien arrays freetype generic hashtables io kernel
4 math namespaces opengl sequences strings styles
5 vectors ;
6 IN: gadgets
7
8 SYMBOL: clip
9
10 : init-gl ( dim -- )
11     GL_PROJECTION glMatrixMode
12     glLoadIdentity
13     GL_MODELVIEW glMatrixMode
14     glLoadIdentity
15     { 0 0 } over <rect> clip set
16     dup first2 0 0 2swap glViewport
17     0 over first2 0 gluOrtho2D
18     first2 0 0 2swap glScissor
19     GL_SMOOTH glShadeModel
20     GL_BLEND glEnable
21     GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA glBlendFunc
22     GL_SCISSOR_TEST glEnable
23     1.0 1.0 1.0 1.0 glClearColor
24     GL_COLOR_BUFFER_BIT glClear ;
25
26 GENERIC: draw-gadget* ( gadget -- )
27
28 M: gadget draw-gadget* drop ;
29
30 GENERIC: draw-interior ( gadget interior -- )
31
32 GENERIC: draw-boundary ( gadget boundary -- )
33
34 : visible-children ( gadget -- seq ) clip get swap children-on ;
35
36 DEFER: draw-gadget
37
38 : (draw-gadget) ( gadget -- )
39     [
40         dup rect-loc translate
41         ! dup dup gadget-interior draw-interior
42         dup draw-gadget*
43         dup visible-children [ draw-gadget ] each
44         ! dup gadget-boundary draw-boundary
45         drop
46     ] with-scope ;
47
48 : change-clip ( gadget -- )
49     >absolute clip [ rect-intersect ] change ;
50
51 : clip-x/y ( loc dim -- x y )
52     >r [ first ] keep r>
53     [ second ] 2apply + world get rect-dim second swap - ;
54
55 : gl-set-clip ( loc dim -- )
56     [ clip-x/y ] keep first2 glScissor ;
57
58 : do-clip ( -- ) clip get rect-bounds gl-set-clip ;
59
60 : with-clipping ( gadget quot -- )
61     clip get >r
62     over change-clip do-clip call
63     r> clip set do-clip ; inline
64
65 : draw-gadget ( gadget -- )
66     {
67         { [ dup gadget-visible? not ] [ drop ] }
68         { [ dup gadget-clipped? not ] [ (draw-gadget) ] }
69         { [ t ] [ [ (draw-gadget) ] with-clipping ] }
70     } cond ;
71
72 : (draw-world) ( world -- )
73     dup world-handle [
74         dup rect-dim init-gl draw-gadget
75     ] with-gl-context ;
76
77 ! Pen paint properties
78 M: f draw-interior 2drop ;
79 M: f draw-boundary 2drop ;
80
81 ! Solid fill/border
82 TUPLE: solid color ;
83
84 ! Solid pen
85 : (solid) solid-color gl-color rect-dim >r origin get r> ;
86
87 M: solid draw-interior (solid) gl-fill-rect ;
88
89 M: solid draw-boundary (solid) gl-rect ;
90
91 ! Gradient pen
92 TUPLE: gradient colors ;
93
94 M: gradient draw-interior
95     origin get [
96         over gadget-orientation
97         swap gradient-colors
98         rot rect-dim
99         gl-gradient
100     ] with-translation ;
101
102 ! Polygon pen
103 TUPLE: polygon color points ;
104
105 : draw-polygon ( polygon quot -- )
106     >r dup polygon-color gl-color polygon-points r> each ;
107     inline
108
109 M: polygon draw-boundary
110     [ gl-poly ] draw-polygon drop ;
111
112 M: polygon draw-interior
113     [ gl-fill-poly ] draw-polygon drop ;
114
115 : arrow-up    { { { 3 0 } { 6 6 } { 0 6 } } } ;
116 : arrow-right { { { 0 0 } { 6 3 } { 0 6 } } } ;
117 : arrow-down  { { { 0 0 } { 6 0 } { 3 6 } } } ;
118 : arrow-left  { { { 0 3 } { 6 0 } { 6 6 } } } ;
119
120 : <polygon-gadget> ( color points -- gadget )
121     dup { 0 0 } [ max-dim vmax ] reduce
122     >r <polygon> <gadget> r> over set-rect-dim
123     [ set-gadget-interior ] keep ;