summaryrefslogtreecommitdiff
path: root/documentation/Fl_Gl_Window.html
blob: 84bddd7e0f631d9987a8486cb00366f93602ea7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
<HTML>
<BODY>

<!-- NEW PAGE -->

<H2><A name=Fl_Gl_Window>class Fl_Gl_Window</A></H2>

<HR>

<H3>Class Hierarchy</H3>

<UL><PRE>
<A href=Fl_Window.html#Fl_Window>Fl_Window</A>
   |
   +----<B>Fl_Gl_Window</B>
</PRE></UL>

<H3>Include Files</H3>

<UL><PRE>
#include &lt;FL/Fl_Gl_Window.H&gt;
</PRE></UL>

<H3>Additional Libraries</H3>

<UL><PRE>
-lfltk_gl  /  fltkgl.lib
</PRE></UL>

<H3>Description</H3>
 The <TT>Fl_Gl_Window</TT> widget sets things up so OpenGL works, and
also keeps an OpenGL &quot;context&quot; for that window, so that changes to the
lighting and projection may be reused between redraws. Fl_Gl_Window
 also flushes the OpenGL streams and swaps buffers after <TT>draw()</TT>
 returns.
<P>OpenGL hardware typically provides some overlay bit planes, which
are very useful for drawing UI controls atop your 3D graphics.  If the
overlay hardware is not provided, FLTK tries to simulate the overlay,
This works pretty well if your graphics are double buffered, but not
very well for single-buffered. </P>
<H3>Methods</H3>
<CENTER>
<TABLE width=90% summary="Fl_Gl_Window methods.">
<TR><TD align=left valign=top>
<UL>
<LI><A href=#Fl_Gl_Window.Fl_Gl_Window>Fl_Gl_Window</A></LI>
<LI><A href=#Fl_Gl_Window.~Fl_Gl_Window>~Fl_Gl_Window</A></LI>
<LI><A href=#Fl_Gl_Window.can_do>can_do</A></LI>
<LI><A href=#Fl_Gl_Window.can_do_overlay>can_do_overlay</A></LI>
</UL>
</TD><TD align=left valign=top>
<UL>
<LI><A href=#Fl_Gl_Window.context>context</A></LI>
<LI><A href=#Fl_Gl_Window.draw>draw</A></LI>
<LI><A href=#Fl_Gl_Window.draw_overlay>draw_overlay</A></LI>
</UL>
</TD><TD align=left valign=top>
<UL>
<LI><A href=#Fl_Gl_Window.hide>hide</A></LI>
<LI><A href=#Fl_Gl_Window.invalidate>invalidate</A></LI>
<LI><A href=#Fl_Gl_Window.make_current>make_current</A></LI>
</UL>
</TD><TD align=left valign=top>
<UL>
<LI><A href=#Fl_Gl_Window.make_overlay_current>make_overlay_current</A></LI>
<LI><A href=#Fl_Gl_Window.mode>mode</A></LI>
<LI><A href=#Fl_Gl_Window.ortho>ortho</A></LI>
</UL>
</TD><TD align=left valign=top>
<UL>
<LI><A href=#Fl_Gl_Window.redraw_overlay>redraw_overlay</A></LI>
<LI><A href=#Fl_Gl_Window.swap_buffers>swap_buffers</A></LI>
<LI><A href=#Fl_Gl_Window.valid>valid</A></LI>
</UL>
</TD></TR>
</TABLE>
</CENTER>
<H4><A name=Fl_Gl_Window.Fl_Gl_Window>Fl_Gl_Window::Fl_Gl_Window(int x,
int y, int w, int h, const char *label = 0)</A></H4>
 Creates a new <TT>Fl_Gl_Window</TT> widget using the given position,
size, and label string. The default boxtype is <TT>FL_NO_BOX</TT>. The
default mode is <TT>FL_RGB|FL_DOUBLE|FL_DEPTH</TT>.
<H4><A name=Fl_Gl_Window.~Fl_Gl_Window>virtual
Fl_Gl_Window::~Fl_Gl_Window()</A></H4>
 The destructor removes the widget and destroys the OpenGL context
associated with it.
<H4><A name=Fl_Gl_Window.draw>virtual void Fl_Gl_Window::draw(void)</A></H4>
<TT>Fl_Gl_Window::draw()</TT> is a pure virtual method.  You must
subclass <TT>Fl_Gl_Window</TT> and provide an implementation for <TT>
draw()</TT>.  You may also provide an implementation of draw_overlay()
if you want to draw into the overlay planes.  You can avoid
reinitializing the viewport and lights and other things by checking <TT>
valid()</TT> at the start of <TT>draw()</TT> and only doing the
initialization if it is false.
<P>The <TT>draw()</TT> method can <I>only</I> use OpenGL calls.  Do not
attempt to call X, any of the functions in &lt;FL/fl_draw.H&gt;, or <TT>glX</TT>
 directly.  Do not call <TT>gl_start()</TT> or <TT>gl_finish()</TT>. </P>
<P>If double-buffering is enabled in the window, the back and front
buffers are swapped after this function is completed. </P>
<H4><A name=Fl_Gl_Window.mode>const int Fl_Gl_Window::mode() const
<BR> int Fl_Gl_Window::mode(int m)</A></H4>
 Set or change the OpenGL capabilites of the window.  The value can be
any of the following OR'd together:
<UL>
<LI><TT>FL_RGB</TT> - RGB color (not indexed) </LI>
<LI><TT>FL_RGB8</TT> - RGB color with at least 8 bits of each color </LI>
<LI><TT>FL_INDEX</TT> - Indexed mode </LI>
<LI><TT>FL_SINGLE</TT> - not double buffered </LI>
<LI><TT>FL_DOUBLE</TT> - double buffered </LI>
<LI><TT>FL_ACCUM</TT> - accumulation buffer </LI>
<LI><TT>FL_ALPHA</TT> - alpha channel in color </LI>
<LI><TT>FL_DEPTH</TT> - depth buffer </LI>
<LI><TT>FL_STENCIL</TT> - stencil buffer </LI>
<LI><TT>FL_MULTISAMPLE</TT> - multisample antialiasing </LI>
</UL>
<TT>FL_RGB</TT> and <TT>FL_SINGLE</TT> have a value of zero, so they
are &quot;on&quot; unless you give <TT>FL_INDEX</TT> or <TT>FL_DOUBLE</TT>.
<P>If the desired combination cannot be done, FLTK will try turning off <TT>
FL_MULTISAMPLE</TT>.  If this also fails the <TT>show()</TT> will call <TT>
Fl::error()</TT> and not show the window. </P>
<P>You can change the mode while the window is displayed.  This is most
useful for turning double-buffering on and off.  Under X this will
cause the old X window to be destroyed and a new one to be created.  If
this is a top-level window this will unfortunately also cause the
window to blink, raise to the top, and be de-iconized, and the <TT>xid()</TT>
 will change, possibly breaking other code.  It is best to make the GL
window a child of another window if you wish to do this! </P>
<H4><A name=Fl_Gl_Window.can_do>static int Fl_Gl_Window::can_do(int)
<BR> int Fl_Gl_Window::can_do() const</A></H4>
 Returns non-zero if the hardware supports the given or current OpenGL
mode.

<h4><a name=Fl_Gl_Window.context>void* Fl_Gl_Window::context() const;
<br>void Fl_Gl_Window::context(void*, int destroy_flag = false);</a></h4>

Return or set a pointer to the GLContext that this window is
using. This is a system-dependent structure, but it is portable to copy
the context from one window to another. You can also set it to NULL,
which will force FLTK to recreate the context the next time <a
href=#Fl_Gl_Window.make_current><tt>make_current()</tt></a> is called, this is
useful for getting around bugs in OpenGL implementations.

<p>If <i>destroy_flag</i> is true the context will be destroyed by
fltk when the window is destroyed, or when the <a
href=#Fl_Gl_Window.mode><tt>mode()</tt></a> is changed, or the next time
<tt>context(x)</tt> is called.

<H4><A name=Fl_Gl_Window.valid>char Fl_Gl_Window::valid() const
<BR> void Fl_Gl_Window::valid(char i)</A></H4>
<TT>Fl_Gl_Window::valid()</TT> is turned off when FLTK creates a new
context for this window or when the window resizes, and is turned on <I>
after</I> <TT>draw()</TT> is called.  You can use this inside your <TT>
draw()</TT> method to avoid unneccessarily initializing the OpenGL
context.  Just do this:
<UL><PRE>
void mywindow::draw() {
  if (!valid()) {
    glViewport(0,0,w(),h());
    glFrustum(...);
    glLight(...);
    ...other initialization...
  }
  ... draw your geometry here ...
}
</PRE></UL>

You can turn <TT>valid()</TT> on by calling <TT>valid(1)</TT>.  You
should only do this after fixing the transformation inside a <TT>draw()</TT>
or after <TT>make_current()</TT>.  This is done automatically after <TT>
draw()</TT> returns.
<H4><A name=Fl_Gl_Window.invalidate>void Fl_Gl_Window::invalidate()</A></H4>
 The <TT>invalidate()</TT> method turns off <TT>valid()</TT> and is
equivalent to calling <TT>value(0)</TT>.
<H4><A name=Fl_Gl_Window.ortho>void Fl_Gl_Window::ortho()</A></H4>
 Set the projection so 0,0 is in the lower left of the window and each
pixel is 1 unit wide/tall.  If you are drawing 2D images, your <TT>
draw()</TT> method may want to call this if <TT>valid()</TT> is false.
<H4><A name=Fl_Gl_Window.make_current>void Fl_Gl_Window::make_current()</A>
</H4>
 The <TT>make_current()</TT> method selects the OpenGL context for the
widget.  It is called automatically prior to the <TT>draw()</TT> method
being called and can also be used to implement feedback and/or
selection within the <TT>handle()</TT> method.
<H4><A name=Fl_Gl_Window.make_overlay_current>void
Fl_Gl_Window::make_overlay_current()</A></H4>
 The <TT>make_overlay_current()</TT> method selects the OpenGL context
for the widget's overlay.  It is called automatically prior to the <TT>
draw_overlay()</TT> method being called and can also be used to
implement feedback and/or selection within the <TT>handle()</TT>
 method.
<H4><A name=Fl_Gl_Window.swap_buffers>void Fl_Gl_Window::swap_buffers()</A>
</H4>
 The <TT>swap_buffers()</TT> method swaps the back and front buffers.
It is called automatically after the <TT>draw()</TT> method is called.
<H4><A name=Fl_Gl_Window.hide>void Fl_Gl_Window::hide()</A></H4>
 Hides the window and destroys the OpenGL context.
<H4><A name=Fl_Gl_Window.can_do_overlay>int
Fl_Gl_Window::can_do_overlay()</A></H4>
 Returns true if the hardware overlay is possible.  If this is false,
FLTK will try to simulate the overlay, with significant loss of update
speed.  Calling this will cause FLTK to open the display.
<H4><A name=Fl_Gl_Window.redraw_overlay>void
Fl_Gl_Window::redraw_overlay()</A></H4>
 This method causes <TT>draw_overlay</TT> to be called at a later time.
 Initially the overlay is clear, if you want the window to display
something in the overlay when it first appears, you must call this
immediately after you <TT>show()</TT> your window.
<H4><A name=Fl_Gl_Window.draw_overlay>virtual void
Fl_Gl_Window::draw_overlay()</A></H4>
 You must implement this virtual function if you want to draw into the
overlay.  The overlay is cleared before this is called.  You should
draw anything that is not clear using OpenGL.  You must use <TT>
gl_color(i)</TT> to choose colors (it allocates them from the colormap
using system-specific calls), and remember that you are in an indexed
OpenGL mode and drawing anything other than flat-shaded will probably
not work.
<P>Both this function and <TT>Fl_Gl_Window::draw()</TT> should check <TT>
Fl_Gl_Window::valid()</TT> and set the same transformation.  If you
don't your code may not work on other systems.  Depending on the OS,
and on whether overlays are real or simulated, the OpenGL context may
be the same or different between the overlay and main window. </P>
</BODY>
</HTML>