This appendix describes the GLUT compatibility header file supplied with
FLTK.
Using the GLUT Compatibility Header File
You should be able to compile existing GLUT source code by including
<FL/glut.H> instead of <GL/glut.h>. This can
be done by editing the source, by changing the -I switches to
the compiler, or by providing a symbolic link from GL/glut.h
to FL/glut.H.
All files calling GLUT procedures must be compiled with C++. You may
have to alter them slightly to get them to compile without warnings,
and you may have to rename them to get make to use the C++ compiler.
You must link with the FLTK library. If you call any GLUT drawing
functions that FLTK does not emulate
(glutExtensionsSupported(), glutWire*(),
glutSolid*(), and glutStroke*()), you will also have
to link with the GLUT library (after the FLTK library!)
Most of FL/glut.H is inline functions. You should take a
look at it (and maybe at test/glut.cxx in the FLTK source) if
you are having trouble porting your GLUT program.
This has been tested with most of the demo programs that come with
the GLUT 3.3 distribution.
Known Problems
The following functions and/or arguments to functions are missing,
and you will have to replace them or comment them out for your code to
compile:
- glutLayerGet(GLUT_LAYER_IN_USE)
- glutLayerGet(GLUT_HAS_OVERLAY)
- glutSetColor(), glutGetColor(), glutCopyColormap()
- glutInitDisplayMode(GLUT_STEREO)
- glutInitDisplayMode(GLUT_LUMINANCE)
- glutPushWindow()
- glutWarpPointer()
- Spaceball, buttonbox, dials, tablet functions,
glutDeviceGet()
- glutWindowStatusFunc()
- glutGet(GLUT_WINDOW_NUM_CHILDREN)
- glutGet(GLUT_SCREEN_WIDTH_MM)
- glutGet(GLUT_SCREEN_HEIGHT_MM)
- glutGet(GLUT_ELAPSED_TIME)
- glutVideoResize() missing.
Most of the symbols/enumerations have different values than
GLUT uses. This will break code that relies on the actual values.
The only symbols guaranteed to have the same values are true/false
pairs like GLUT_DOWN and GLUT_UP, mouse
buttons GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON,
GLUT_RIGHT_BUTTON, and GLUT_KEY_F1 thru
F12.
The strings passed as menu labels are not copied.
glutPostRedisplay() does not work if called from
inside a display function. You must use glutIdleFunc()
if you want your display to update continuously.
glutSwapBuffers() does not work from inside a display
function. This is on purpose, because FLTK swaps the buffers for you.
glutUseLayer() does not work well, and should only be
used to initialize transformations inside a resize callback. You
should redraw overlays by using glutOverlayDisplayFunc().
Overlays are cleared before the overlay display function is called.
glutLayerGet(GLUT_OVERLAY_DAMAGED) always returns true for
compatibility with some GLUT overlay programs. You must rewrite your
code so that gl_color() is used to choose colors in an
overlay, or you will get random overlay colors.
glutSetCursor(GLUT_CURSOR_FULL_CROSSHAIR) just
results in a small crosshair.
The fonts used by glutBitmapCharacter() and
glutBitmapWidth() may be different.
glutInit(argc,argv) will consume different switches than GLUT
does. It accepts the switches recognized by Fl::args(), and will accept any
abbreviation of these switches (such as "-di" for "-display").
Mixing GLUT and FLTK Code
You can make your GLUT window a child of a Fl_Window with the
following scheme. The biggest trick is that GLUT insists on
show()'ing the window at the point it is created, which means the
Fl_Window parent window must already be shown.
- Don't call glutInit().
- Create your Fl_Window, and any FLTK widgets.
Leave a blank area in the window for your GLUT window.
- show() the Fl_Window. Perhaps call
show(argc,argv).
- Call window->begin() so that the GLUT window will
be automatically added to it.
- Use glutInitWindowSize() and
glutInitWindowPosition() to set the location in the
parent window to put the GLUT window.
- Put your GLUT code next. It probably does not need many changes.
Call window->end() immediately after the glutCreateWindow()!
- You can call either glutMainLoop(),
Fl::run(), or loop calling Fl::wait() to run
the program.
Class Hierarchy
Fl_Gl_Window
|
+----Fl_Glut_Window
Include Files
#include <FL/glut.H>
Description
Each GLUT window is an instance of this class. You may find it useful to
manipulate instances directly rather than use GLUT window id's. These
may be created without opening the display, and thus can fit better
into FLTK's method of creating windows.
The current GLUT window is available in the global variable
glut_window.
new Fl_Glut_Window(...) is the same as
glutCreateWindow() except it does not show() the window
or make the window current.
window->make_current() is the same as
glutSetWindow(number). If the window has not had
show() called on it yet, some functions that assumme an OpenGL
context will not work. If you do show() the window, call
make_current() again to set the context.
~Fl_Glut_Window() is the same as
glutDestroyWindow().
Methods
The first constructor takes 4 int arguments to create the window with
a preset position and size. The second constructor with 2 arguments
will create the window with a preset size, but the window manager
will choose the position according to it's own whims.
Destroys the GLUT window.