FOX GUI Library - OpenGL


Strona główna | Autor | Borland C++ 5.5 | GUI | Książki | OpenGL | Programy | Projekty | Teksty

OpenGL

Biblioteka FOX jest przygotowana do tworzenia aplikacji wykorzystujących bibliotekę OpenGL. W poniższym przykładzie przedstawię jak zbudować podstawową aplikację używającą OpenGL.

Podstawową rolę w powyższym zagadnieniu odgrywają dwie klasy: FXGLVisual i FXGLCanvas. Klasa FXGLVisual jest odpowiedzialna za uzyskanie dostępu do renderingu OpenGL. Konstruktor tej klasy ma postać:

FXGLVisual(FXApp* a,FXuint flags);

Wyjaśnienia wymaga drugi parametr konstruktora, który może przyjmować następujące wartości:

enum FXVisualOptions
{
  VISUAL_DEFAULT      = 0,            /// Default visual
  VISUAL_MONOCHROME   = 1,            /// Must be monochrome visual
  VISUAL_BEST         = 2,            /// Best (deepest) visual
  VISUAL_INDEXCOLOR   = 4,            /// Palette visual
  VISUAL_GRAYSCALE    = 8,            /// Gray scale visual
  VISUAL_TRUECOLOR    = 16,           /// Must be true color visual
  VISUAL_OWNCOLORMAP  = 32,           /// Allocate private colormap
  VISUAL_DOUBLEBUFFER = 64,           /// Double-buffered [FXGLVisual]
  VISUAL_STEREO       = 128,          /// Stereo [FXGLVisual]
  VISUAL_NOACCEL      = 256           /// No hardware acceleration [for broken h/w]
  };

W przypadku renderingu OpenGL najlepiej wybrać podwójne buforowanie (VISUAL_DOUBLEBUFFER), które umożliwia m.in. animację bez uciążliwego migotania obrazu.

Druga klasa to płótno służące do rysowania. Oto wygląd jednego z konstruktorów klasy FXGLCanvas:

FXGLCanvas(FXComposite* p,FXGLVisual *vis,FXObject* tgt=NULL,FXSelector sel=0,
           FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0);

Parametry konstruktora są nastepujące:

Po tym wstępie można już przedstawić postać konstruktora tworzącego okno z renderingiem OpenGL:

GLTestWindow::GLTestWindow(FXApp* App):
  FXMainWindow(App,"OpenGL Minimal Application",NULL,NULL,DECOR_ALL,0,0,300,300)
{
  // A Visual to drag OpenGL
  glvisual=new FXGLVisual (getApp(),VISUAL_DOUBLEBUFFER);

  // Drawing glcanvas
  glcanvas=new FXGLCanvas(this,glvisual,(FXObject*)NULL,0,LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT);

  // Add chore
  chore=getApp()->addChore(this,ID_CHORE);
}

addChore to metoda klasy FXApp, która umożliwia dodanie identyfikatora komunikatu (i celu), który ma być wywoływany podczas bezczynności programu. Ma to swoją wadę - przykładowy program przerywa rysowanie np. w trakcie wyświetlania podowiedzi do przycisków. Rozwiązaniem jest użycie stopera (klasa FXTimer). Spoóśb jego zastosowania przedstawia program gltest.cpp dołączony do biblioteki FOX.

Funkcja rysująca scenę powinna realizować poniższy schemat:

  // sprawdzenie czy konstekst renderingu jest bieżący
  if(glcanvas->makeCurrent())
  {
    // tutaj polecenia OpenGL...

    // zamiana buforów
    if (glvisual->isDoubleBuffer())
      glcanvas->swapBuffers();
   }
  // ustawienie kontekstu renderingu na niebieżący
  glcanvas->makeNonCurrent();

Wygląd okna programu w systemie Linux (Mandrake 8.1 + KDE 2.2) przedstawia rysunek:

OpenGL Minimal Applicaton


Do pobrania


© Janusz Ganczarski
JanuszG@enter.net.pl