From 497afccb07164373e0de6639e754d7d691f1926f Mon Sep 17 00:00:00 2001 From: Fabien Costantini Date: Tue, 14 Oct 2008 22:12:25 +0000 Subject: Doxygen pdf man: First version added in documentation/fltk.pdf, old doc removed, images, dox files moved to a new src directory. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6431 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- documentation/opengl.html | 467 ---------------------------------------------- 1 file changed, 467 deletions(-) delete mode 100644 documentation/opengl.html (limited to 'documentation/opengl.html') diff --git a/documentation/opengl.html b/documentation/opengl.html deleted file mode 100644 index 89a21a16c..000000000 --- a/documentation/opengl.html +++ /dev/null @@ -1,467 +0,0 @@ - - - 8 - Using OpenGL - - -

8 - Using OpenGL

- -

This chapter discusses using FLTK for your OpenGL applications. - -

Using OpenGL in FLTK

- -

The easiest way to make an OpenGL display is to subclass Fl_Gl_Window. -Your subclass must implement a draw() method which uses -OpenGL calls to draw the display. Your main program should call -redraw() when the display needs to change, and -(somewhat later) FLTK will call draw(). - -

With a bit of care you can also use OpenGL to draw into -normal FLTK windows. This allows you to use Gouraud shading for -drawing your widgets. To do this you use the gl_start() and gl_finish() functions around your -OpenGL code.

- -

You must include FLTK's <FL/gl.h> header -file. It will include the file <GL/gl.h>, define -some extra drawing functions provided by FLTK, and include the -<windows.h> header file needed by WIN32 -applications.

- -

Making a Subclass of Fl_Gl_Window

- -

To make a subclass of Fl_Gl_Window, you must provide: - -

- -

If your subclass provides static controls in the window, they -must be redrawn whenever the FL_DAMAGE_ALL bit is set -in the value returned by damage(). For double-buffered -windows you will need to surround the drawing code with the -following code to make sure that both buffers are redrawn: - -

- -
- - - - -
Note: - -

If you are using the Mesa graphics library, the call - to glDrawBuffer() is not required and will slow - down drawing considerably. The preprocessor instructions - shown above will optimize your code based upon the - graphics library used. - -

- -

Defining the Subclass

- -

To define the subclass you just subclass the -Fl_Gl_Window class: - -

- -

The draw() and handle() methods are -described below. Like any widget, you can include additional -private and public data in your class (such as scene graph -information, etc.) - -

The draw() Method

- -

The draw() method is where you actually do your -OpenGL drawing: - -

- -

The handle() Method

- -

The handle() method handles mouse and keyboard -events for the window: - -

- -

When handle() is called, the OpenGL context is not -set up! If your display changes, you should call -redraw() and let draw() do the work. Don't -call any OpenGL drawing functions from inside handle()! - -

You can call some OpenGL stuff like hit detection and texture -loading functions by doing:

- - - -

Your main program can now create one of your windows by doing -new MyWindow(...). You can also use FLUID by: - -

    - -
  1. Putting your class definition in a - MyWindow.H file.
  2. - -
  3. Creating a Fl_Box widget in FLUID.
  4. - -
  5. In the widget panel fill in the "class" - field with MyWindow. This will make FLUID - produce constructors for your new class.
  6. - -
  7. In the "Extra Code" field put #include - "MyWindow.H", so that the FLUID output - file will compile.
  8. - -
- -

You must put glwindow->show() in your main code -after calling show() on the window containing the -OpenGL window. - -

Using OpenGL in Normal FLTK Windows

- -

You can put OpenGL code into an Fl_Widget::draw() -method or into the code for a boxtype or other places with some -care. - -

Most importantly, before you show any windows, -including those that don't have OpenGL drawing, you must -initialize FLTK so that it knows it is going to use OpenGL. You -may use any of the symbols described for Fl_Gl_Window::mode() -to describe how you intend to use OpenGL:

- - - -

You can then put OpenGL drawing code anywhere you can draw -normally by surrounding it with: - -

- -

gl_start() and gl_finish() set up an OpenGL -context with an orthographic projection so that 0,0 is the -lower-left corner of the window and each pixel is one unit. The -current clipping is reproduced with OpenGL glScissor() -commands. These functions also synchronize the OpenGL graphics stream -with the drawing done by other X, WIN32, or FLTK functions. - -

The same context is reused each time. If your code changes -the projection transformation or anything else you should use -glPushMatrix() and glPopMatrix() functions to -put the state back before calling gl_finish().

- -

You may want to use Fl_Window::current()->h() to -get the drawable height so that you can flip the Y -coordinates.

- -

Unfortunately, there are a bunch of limitations you must -adhere to for maximum portability:

- - - -

Do not call gl_start() or -gl_finish() when drawing into an Fl_Gl_Window! - -

OpenGL Drawing Functions

- -

FLTK provides some useful OpenGL drawing functions. They can -be freely mixed with any OpenGL calls, and are defined by -including <FL/gl.H> which you should include -instead of the OpenGL header <GL/gl.h>. - -

void gl_color(Fl_Color)

- -

Sets the current OpenGL color to a FLTK color. For -color-index modes it will use fl_xpixel(c), which is -only right if this window uses the default colormap! - -

void gl_rect(int x, int y, int w, int h) -
void gl_rectf(int x, int y, int w, int h)

- -

Outlines or fills a rectangle with the current color. If Fl_Gl_Window::ortho() -has been called, then the rectangle will exactly fill the pixel -rectangle passed. - -

void gl_font(Fl_Font fontid, int size)

- -

Sets the current OpenGL font to the same font you get by -calling fl_font(). - -

int gl_height() -
int gl_descent() -
float gl_width(const char *) -
float gl_width(const char *, int n) -
float gl_width(uchar)

- -

Returns information about the current OpenGL font. - -

void gl_draw(const char *) -
void gl_draw(const char *, int n)

- -

Draws a nul-terminated string or an array of n -characters in the current OpenGL font at the current raster -position. - -

void gl_draw(const char *, int x, int y) -
void gl_draw(const char *, int n, int x, int y) -
void gl_draw(const char *, float x, float y) -
void gl_draw(const char *, int n, float x, float y)

- -

Draws a nul-terminated string or an array of n -characters in the current OpenGL font at the given position. - -

void gl_draw(const char *, int x, int y, int w, int h, Fl_Align)

- -

Draws a string formatted into a box, with newlines and tabs -expanded, other control characters changed to ^X, and aligned -with the edges or center. Exactly the same output as fl_draw(). - -

Speeding up OpenGL

- -

Performance of Fl_Gl_Window may be improved on some types of -OpenGL implementations, in particular MESA and other software -emulators, by setting the GL_SWAP_TYPE environment -variable. This variable declares what is in the backbuffer after -you do a swapbuffers. - -

- -

This is easily tested by running the gl_overlay demo -program and seeing if the display is correct when you drag -another window over it or if you drag the window off the screen -and back on. You have to exit and run the program again for it -to see any changes to the environment variable. - -

Using OpenGL Optimizer with FLTK

- -

OpenGL -Optimizer is a scene graph toolkit for OpenGL available from -Silicon Graphics for IRIX and Microsoft Windows. It allows you -to view large scenes without writing a lot of OpenGL code. - -

OptimizerWindow Class Definition

- -

To use OpenGL Optimizer with FLTK you'll need to create a -subclass of Fl_Gl_Widget that includes several state -variables: - -

- -

The camera() Method

- -

The camera() method sets the camera (projection and -viewpoint) to use when drawing the scene. The scene is redrawn after -this call. - -

The draw() Method

- -

The draw() method performs the needed initialization and does -the actual drawing: - -

- -

The scene() Method

- -

The scene() method sets the scene to be drawn. The scene is -a collection of 3D objects in a csGroup. The scene is redrawn -after this call. - - - -- cgit v1.2.3