//---------------------------------------------------------------------
// Ukazkovy priklad k serii clanku OpenGL a GLU
//
// Autor: Pavel Tisnovsky
// Cislo clanku: 3
// Cislo prikladu: 2
//
// Tento program po svem spusteni zobrazi vsechna graficka primitiva
// podporovana knihovnou OpenGL. Pro nastaveni ortogonalniho pohledu
// je pouzita funkce gluOrtho2D() z nadstavbove knihovny GLU.
// Klavesou ESC je mozne program ukoncit.
//---------------------------------------------------------------------
#ifdef __BORLANDC__
#include <windows.h> // oprava chyby v nekterych Borlandskych prekladacich
#endif
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h> // hlavickovy soubor funkci GLUTu a OpenGL
#ifdef __BORLANDC__
#pragma hdrstop // konec predkompilovanych hlavicek pro Borlandske prekladace
#endif
#define WINDOW_WIDTH 450 // velikost okna
#define WINDOW_HEIGHT 450
#define WINDOW_TITLE "OpenGL a GLU, priklad 3.2" // titulek okna
//---------------------------------------------------------------------
// Nastaveni ortogonalniho pohledu pomoci funkce glOrtho()
//---------------------------------------------------------------------
void setOrthogonalView(int w, int h)
{
glMatrixMode(GL_PROJECTION); // zacatek modifikace projekcni matice
glLoadIdentity(); // vymazani projekcni matice (=identita)
gluOrtho2D(0, w, 0, h); // mapovani abstraktnich souradnic do souradnic okna
glScalef(1, -1, 1); // inverze y-ove osy, aby se y zvetsovalo smerem dolu
glTranslatef(0, -h, 0); // posun pocatku do leveho horniho rohu
}
//---------------------------------------------------------------------
// Tato funkce vykresli retezec zadanym bitmapovym fontem
//---------------------------------------------------------------------
void printGlutBitmapFont(char *string, void *font, int x, int y, float r, float g, float b)
{
glColor3f(r, g, b); // nastaveni barvy vykreslovanych bitmap
glRasterPos2i(x, y); // nastaveni pozice pocatku bitmapy
while (*string) // projit celym retezcem
glutBitmapCharacter(font, *string++); // vykresleni jednoho znaku
}
//---------------------------------------------------------------------
// Funkce pro inicializaci vykreslovani
//---------------------------------------------------------------------
void onInit(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // barva pozadi obrazku
glClearDepth(1.0f); // implicitni hloubka ulozena v pameti hloubky
glShadeModel(GL_FLAT); // nastaveni stinovaciho rezimu
glPointSize(2.0f);
glLineWidth(2.0f);
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
}
//---------------------------------------------------------------------
// 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
setOrthogonalView(w, h);
}
//--------------------------------------------------------------------
// Tato funkce je volana pri kazdem prekresleni okna
//--------------------------------------------------------------------
void onDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT); // vymazani barvoveho bufferu
printGlutBitmapFont("GL_POINTS", GLUT_BITMAP_8_BY_13, 40, 36, 1.0f, 1.0f, 1.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_POINTS); // nyni zacneme vykreslovat body
glVertex2i( 50, 50);
glVertex2i(100, 50);
glVertex2i(100, 100);
glVertex2i( 50, 100);
glEnd();
printGlutBitmapFont("GL_LINES", GLUT_BITMAP_8_BY_13, 140, 36, 1.0f, 1.0f, 1.0f);
glColor3f(1.0f, 0.0f, 1.0f);
glBegin(GL_LINES); // nyni zacneme vykreslovat usecky
glVertex2i(150, 50);
glVertex2i(200, 50);
glVertex2i(200, 100);
glVertex2i(150, 100);
glEnd();
printGlutBitmapFont("GL_LINE_STRIP", GLUT_BITMAP_8_BY_13, 220, 36, 1.0f, 1.0f, 1.0f);
glColor3f(0.0f, 1.0f, 1.0f);
glBegin(GL_LINE_STRIP); // nyni vykreslime polycaru
glVertex2i(250, 50);
glVertex2i(300, 50);
glVertex2i(300, 100);
glVertex2i(250, 100);
glEnd();
printGlutBitmapFont("GL_LINE_LOOP", GLUT_BITMAP_8_BY_13, 340, 36, 1.0f, 1.0f, 1.0f);
glColor3f(1.0f, 1.0f, 0.0f);
glBegin(GL_LINE_LOOP); // nyni vykreslime uzavrenou polycaru
glVertex2i(350, 50);
glVertex2i(400, 50);
glVertex2i(400, 100);
glVertex2i(350, 100);
glEnd();
printGlutBitmapFont("GL_TRIANGLES", GLUT_BITMAP_8_BY_13, 30, 186, 1.0f, 1.0f, 1.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_TRIANGLES); // vykresleni trojuhelniku
glVertex2i( 50, 200);
glVertex2i(100, 200);
glVertex2i(100, 250);
glVertex2i( 50, 250);
glEnd();
printGlutBitmapFont("GL_TRIANGLE_STRIP", GLUT_BITMAP_8_BY_13, 140, 186, 1.0f, 1.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLE_STRIP); // vykresleni pruhu trojuhelniku
glVertex2i(150, 200);
glVertex2i(150, 250);
glVertex2i(200, 250);
glVertex2i(200, 200);
glEnd();
printGlutBitmapFont("GL_TRIANGLE_FAN", GLUT_BITMAP_8_BY_13, 300, 186, 1.0f, 1.0f, 1.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLE_FAN); // vykresleni trsu trojuhelniku
glVertex2i(350, 200);
glVertex2i(300, 210);
glVertex2i(320, 240);
glVertex2i(340, 250);
glVertex2i(360, 250);
glVertex2i(380, 240);
glVertex2i(400, 210);
glEnd();
printGlutBitmapFont("GL_QUADS", GLUT_BITMAP_8_BY_13, 40, 331, 1.0f, 1.0f, 1.0f);
glColor3f(1.0f, 0.5f, 0.5f);
glBegin(GL_QUADS); // vykresleni ctyruhelniku
glVertex2i( 50, 350);
glVertex2i(100, 350);
glVertex2i(100, 400);
glVertex2i( 50, 400);
glEnd();
printGlutBitmapFont("GL_QUAD_STRIP", GLUT_BITMAP_8_BY_13, 170, 331, 1.0f, 1.0f, 1.0f);
glColor3f(0.5f, 0.5f, 1.0f);
glBegin(GL_QUAD_STRIP); // vykresleni pruhu ctyruhleniku
glVertex2i(150, 350);
glVertex2i(150, 400);
glVertex2i(200, 340);
glVertex2i(200, 410);
glVertex2i(250, 360);
glVertex2i(250, 390);
glVertex2i(300, 350);
glVertex2i(300, 400);
glEnd();
printGlutBitmapFont("GL_POLYGON", GLUT_BITMAP_8_BY_13, 340, 331, 1.0f, 1.0f, 1.0f);
glColor3f(0.5f, 1.0f, 0.5f);
glBegin(GL_POLYGON); // vykresleni konvexniho polygonu
glVertex2i(350, 360);
glVertex2i(370, 340);
glVertex2i(390, 340);
glVertex2i(410, 360);
glVertex2i(410, 380);
glVertex2i(390, 400);
glVertex2i(370, 400);
glVertex2i(350, 380);
glEnd();
glFlush(); // provedeni a vykresleni vsech zmen
}
//---------------------------------------------------------------------
// Tato funkce je volana pri stlaceni ASCII klavesy
//---------------------------------------------------------------------
#ifdef __BORLANDC__
#pragma option -w-par // zabranit warningum pri prekladu
#endif // u borlandskych prekladacu
void onKeyboard(unsigned char key, int x, int y)
{
if (key>='A' && key<='Z') // uprava velkych pismen na mala
key+=(unsigned char)('a'-'A'); // pro zjednoduseni prikazu switch
switch (key) {
case 27: exit(0); break; // ukonceni aplikace
case 'q': exit(0); break; // ukonceni aplikace
default: break;
}
}
#ifdef __BORLANDC__
#pragma option -w+par
#endif
//---------------------------------------------------------------------
// Hlavni funkce konzolove aplikace
//---------------------------------------------------------------------
int main(int argc, char **argv)
{
glutInit(&argc, argv); // inicializace knihovny GLUT
glutInitDisplayMode(GLUT_RGB); // nastaveni dvou barvovych bufferu a pameti hloubky
glutInitWindowPosition(30, 30); // pocatecni pozice leveho horniho rohu okna
glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);// pocatecni velikost okna
glutCreateWindow(WINDOW_TITLE); // vytvoreni okna pro kresleni
glutDisplayFunc(onDisplay); // registrace funkce volane pri prekreslovani okna
glutReshapeFunc(onResize); // registrace funkce volane pri zmene velikosti okna
glutKeyboardFunc(onKeyboard); // registrace funkce volane pri stlaceni klavesy
onInit(); // inicializace vykreslovani
glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce
return 0; // navratova hodnota vracena operacnimu systemu
}
//---------------------------------------------------------------------
// Konec zdrojoveho souboru
//---------------------------------------------------------------------