//---------------------------------------------------------------------
// Ukazkovy priklad cislo 11
// Autor: Pavel Tisnovsky
//
// Program otevre jedno hlavni okno a vykresli do nej nekolik bitmap.
// Je pouzito retezove vykreslovani s automatickym posuvem pocatku
// vykreslovani dalsi bitmapy. Pro demonstraci vlastnosti, ze jsou
// vykresleny pouze ty pixely bitmapy, 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)
{
int i;
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 zobrazeni radku bitmap
glRasterPos2i(40, 100); // pozice vykresleni prvni bitmapy v radku
for (i=0; i<30; i++) // vykresleni rady bitmap, ktere jsou od sebe
glBitmap(10, 12, 0.0f, 0.0f, 11.0f, 0.0f, bitmap);// vzdaleny 11 pixelu na sirku
glColor3f(1.0f, 0.0f, 0.0f); // cervena barva zobrazeni sloupce bitmap
glRasterPos2i(200, 120); // pozice vykresleni prvni bitmapy ve sloupci
for (i=0; i<18; i++) // vykresleni sloupce bitmap, ktere jsou od sebe
glBitmap(10, 12, 5.0f, 0.0f, 0.0f, 13.0f, bitmap);// vzdaleny 13 pixelu na vysku
glColor3f(0.0f, 0.0f, 1.0f); // modra barva zobrazeni dalsich bitmap
glRasterPos2i(10, 10); // pozice vykresleni prvni bitmapy ve sloupci
for (i=0; i<27; i++) // vykresleni posloupnosti bitmap s promennou
glBitmap(10, 12, 5.0f, 0.0f, (GLfloat)i, (GLfloat)(27-i), bitmap);// vzajemnou vzdalenosti
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 11");// 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
//---------------------------------------------------------------------