//---------------------------------------------------------------------
// Ukazkovy priklad cislo 12
// Autor: Pavel Tisnovsky
//
// Program otevre jedno hlavni okno a vykresli do nej nekolik bitmap.
// Pri vykreslovani bitmap se prubezne meni mod ulozeni pixelu v pameti,
// takze bity v bitmape mohou byt ruzne preskladany.
//---------------------------------------------------------------------
#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)
{
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 vykresli radek bitmap.
// Kazdy radek je specifikovan svou y-ovou pozici a barvou svych bitmap.
//---------------------------------------------------------------------
void drawBitmapRow(GLfloat red, GLfloat green, GLfloat blue, GLfloat yPosition)
{
int i;
glColor3f(red, green, blue); // specifikace barev bitmap na radku
glRasterPos2i(20, yPosition); // specifikace pozice vykresleni prvni bitmapy
for (i=0; i<24; i++) // vykresleni vsech bitmap v radku
glBitmap(10, 12, 0.0f, 0.0f, 15.0f, 0.0f, bitmap);
}
//---------------------------------------------------------------------
// Tato funkce je volana pri kazdem prekresleni okna
//---------------------------------------------------------------------
void onDisplay(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT); // vymazani vsech bitovych rovin barvoveho bufferu
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);// bity ve slove se nebudou prohazovat
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // zarovnani pixelu na jednotlive byty
drawBitmapRow(1.0f, 1.0f, 1.0f, 10.0f); // vykresleni radku bitmap
glPixelStorei(GL_UNPACK_ALIGNMENT, 2); // zarovnani pixelu na sude byty
drawBitmapRow(1.0f, 0.8f, 0.8f, 30.0f); // vykresleni radku bitmap
glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // zarovnani pixelu na 32-bitove slovo
drawBitmapRow(1.0f, 0.6f, 0.6f, 50.0f); // vykresleni radku bitmap
glPixelStorei(GL_UNPACK_ALIGNMENT, 8); // zarovnani pixelu na 64-bitove slovo
drawBitmapRow(1.0f, 0.4f, 0.4f, 70.0f); // vykresleni radku bitmap
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);// prohozeni bitu ve slove
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // zarovnani pixelu na jednotlive byty
drawBitmapRow(0.6f, 1.0f, 1.0f, 110.0f); // vykresleni radku bitmap
glPixelStorei(GL_UNPACK_ALIGNMENT, 2); // zarovnani pixelu na sude byty
drawBitmapRow(0.6f, 0.8f, 0.8f, 130.0f); // vykresleni radku bitmap
glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // zarovnani pixelu na 32-bitove slovo
drawBitmapRow(0.6f, 0.6f, 0.6f, 150.0f); // vykresleni radku bitmap
glPixelStorei(GL_UNPACK_ALIGNMENT, 8); // zarovnani pixelu na 64-bitove slovo
drawBitmapRow(0.6f, 0.4f, 0.4f, 170.0f); // vykresleni radku bitmap
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 12");// vytvoreni okna pro kresleni
glutReshapeWindow(400, 200); // 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
//---------------------------------------------------------------------