//---------------------------------------------------------------------
// Ukazkovy priklad cislo 10
// Autor: Pavel Tisnovsky
//
// Program otevre jedno hlavni okno a vykresli do nej bitmapu. V teto
// bitmape je ulozen tvar pismene F. Bitmapa je vykreslena nekolikrat,
// pokazde s jinou barvou. Pro demonstraci faktu, ze se vykresluji
// pouze pixely, jejichz bit je nastaven na jednicku, je pod bitmapou
// zobrazen klasicky RGB trojuhelnik.
//---------------------------------------------------------------------
#include <GL/glut.h> // hlavickovy soubor funkci GLUTu a OpenGL
const GLubyte bitmap[24]={ // data bitmapy o rozmeru 10x12 pixelu (bitu)
0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,// zacinaji od leveho dolniho rohu!
0xc0, 0x00, 0xff, 0x00, 0xff, 0x00, 0xc0, 0x00,
0xc0, 0x00, 0xc0, 0x00, 0xff, 0xc0, 0xff, 0xc0
};
//---------------------------------------------------------------------
// Funkce pro inicializaci vykreslovani
//---------------------------------------------------------------------
void onInit(void)
{
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // zarovnani pixelu na jednotlive byty
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // barva pozadi
}
//---------------------------------------------------------------------
// Nastaveni souradneho systemu v zavislosti na velikosti okna
//---------------------------------------------------------------------
void onResize(int w, int h) // argumenty w a h reprezentuji novou velikost okna
{
glViewport(0, 0, w, h); // viditelna oblast pres cele okno
glMatrixMode(GL_PROJECTION); // zacatek modifikace projekcni matice
glLoadIdentity(); // vymazani projekcni matice (=identita)
glOrtho(0, w, 0, h, -1, 1); // mapovani abstraktnich souradnic do souradnic okna
}
//---------------------------------------------------------------------
// Tato funkce je volana pri kazdem prekresleni okna
//---------------------------------------------------------------------
void onDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT); // vymazani vsech bitovych rovin barvoveho bufferu
glBegin(GL_TRIANGLES); // na pozadi se vykresli RGB trojuhelnik
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2i(0, 0);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2i(400, 0);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2i(200, 300);
glEnd();
glColor3f(1.0f, 1.0f, 1.0f); // bila barva pro zobrazeni prvni bitmapy
glRasterPos2i(200, 200); // pozice vykresleni prvni bitmapy
glBitmap(10, 12, 0.0f, 0.0f, 0.0f, 0.0f, bitmap);// vykresleni bitmapy
glColor3f(0.0f, 0.0f, 0.5f); // tmavomodra barva pro zobrazeni druhe bitmapy
glRasterPos2i(50, 10); // pozice vykresleni druhe bitmapy
glBitmap(10, 12, 0.0f, 0.0f, 0.0f, 0.0f, bitmap);// vykresleni bitmapy
glRasterPos2i(350, 10); // POZOR! zde je barva zadana az po prikazu glRasterPos2i(),
glColor3f(0.5f, 0.0f, 0.0f); // to znamena, ze se barva dalsi bitmapy NEZMENI
glBitmap(10, 12, 0.0f, 0.0f, 0.0f, 0.0f, bitmap);// vykresleni bitmapy
glFlush(); // provedeni a vykresleni vsech zmen
}
//---------------------------------------------------------------------
// Tato funkce je volana pri stlaceni ASCII klavesy
//---------------------------------------------------------------------
void onKeyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27: exit(0); break; // pokud byla stlacena klavesa ESC, konec programu
default: break;
}
}
//---------------------------------------------------------------------
// Hlavni funkce konzolove aplikace
//---------------------------------------------------------------------
int main(int argc, char **argv)
{
glutInit(&argc, argv); // inicializace knihovny GLUT
glutCreateWindow("Priklad na OpenGL cislo 10");// vytvoreni okna pro kresleni
glutReshapeWindow(400, 400); // zmena velikosti okna
glutPositionWindow(100, 100); // pozice leveho horniho rohu okna
glutDisplayFunc(onDisplay); // registrace funkce volane pri prekreslovani okna
glutReshapeFunc(onResize); // registrace funkce volane pri zmene velikosti okna
glutKeyboardFunc(onKeyboard); // registrace funkce volani pri stlaceni klavesy
onInit(); // inicializace vykreslovani
glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce
return 0; // navratova hodnota vracena operacnimu systemu
}
//---------------------------------------------------------------------
// Konec zdrojoveho souboru
//---------------------------------------------------------------------