Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //////////////////////////////////////////////////////////////////////////////////////////
- //
- // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
- // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
- //
- //////////////////////////////////////////////////////////////////////////////////////////
- #include <glut.h>
- #include <math.h>
- #include <string.h>
- #include <stdio.h>
- #include "materials.h"
- // Definicja stalych
- #define DLUGOSC_BOKU 5.0
- #define PI 3.14159265359
- #define OBSERWATOR_FOV_Y 30.0
- // Makro przeliczajace stopnie na radiany
- #define DEG2RAD(x) ((float)(x)*M_PI/180.0)
- #define KROK_FLOAT 0.1
- #define X_OFFSET_SWIATLO 10
- #define Y_OFFSET_SWIATLO 120
- #define X_OFFSET_MAT 10
- #define Y_OFFSET_MAT 220
- #define X_OFFSET_OBIEKT 10
- #define Y_OFFSET_OBIEKT 300
- #define ID_MENU_SWIATLA 0
- #define ID_MENU_MATERIALU 1
- #define LPOZ_MENU_SWIATLA 10
- #define LPOZ_MENU_MATERIALU 5
- int sIndeks; // Wybrana pozycja w tablicy parametrow swiatla
- int mIndeks; // Wybrana pozycja w tablicy parametrow materialu
- int menu; // Identyfikator wybranego menu (menu swiatla lub menu materialu)
- // Zmienne globalne
- double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- double r2=5;
- double r1=2.5,r3=2.0;
- double h=10;
- double angle;
- double pom = 0;
- GLfloat OBSERWATOR_OBROT_X = 20.0;
- GLfloat OBSERWATOR_OBROT_Y = 20.0;
- GLfloat OBSERWATOR_OBROT_Z = 0.0;
- GLfloat OBSERWATOR_ODLEGLOSC = 20.0;
- GLfloat N=20;
- GLfloat N2=20;
- // Zerowy parametr Emission
- const GLfloat Emission[4] = {0.0 , 0.0, 0.0, 0.0};
- // Tablica parametrow swiatla
- GLfloat swiatlo[10][4];
- // Tablica parametrow materialu z jakiego wykonany jest walec
- GLfloat material[6][4];
- // Prototypy funkcji
- void RysujSzescian(double a);
- void UstawParametryWidoku(int szer, int wys);
- void WyswietlObraz(void);
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
- void WlaczOswietlenie(void);
- void DefiniujMaterial(void);
- void UstawParametryOswietlenia(int indeks, char operacja);
- void UstawParametryMaterialu(int indeks, char operacja);
- void UstawDomyslneWartosciParametrow(void);
- /////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja ustawiajaca domyslne parametry walca, materialu i zrodla swiatla
- //////////////////////////////////////////////////////////////////////////////////////////
- // Wlaczenie oswietlenia sceny
- void WlaczOswietlenie(void)
- {
- // Odblokowanie oswietlenia
- glEnable(GL_LIGHTING);
- // Odblokowanie zerowego zrodla swiatla
- glEnable(GL_LIGHT0);
- // Inicjowanie zrodla swiatla
- glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo[0]);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo[1]);
- glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo[2]);
- glLightfv(GL_LIGHT0, GL_POSITION, swiatlo[3]);
- glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo[4]);
- glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, swiatlo[5][0]);
- glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, swiatlo[6][0]);
- glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, swiatlo[7][0]);
- glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, swiatlo[8][0]);
- glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, swiatlo[9][0]);
- }
- void material2()
- {
- GLfloat param_materialu2[6][4] = {
- {0.0, 0.0, 0.0, 0.0}, // [0] wspolczynnik odbicia swiatla otoczenia
- {0.0, 0.0, 1.0, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {0.0, 0.0, 0.0, 0.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
- {0.0, 0.0, 0.0, 0.0}}; // [3] polysk
- memcpy(material[0], param_materialu2[0], 4*sizeof(GLfloat));
- memcpy(material[1], param_materialu2[1], 4*sizeof(GLfloat));
- memcpy(material[2], param_materialu2[2], 4*sizeof(GLfloat));
- memcpy(material[3], param_materialu2[3], 4*sizeof(GLfloat));
- memcpy(material[4], Emission, 4*sizeof(GLfloat));
- }
- void material1()
- {
- GLfloat param_materialu[6][4] = {
- {1.0, 1.0, 0.2, 1.0}, // [0] wspolczynnik odbicia swiatla otoczenia
- {1.0, 1.0, 0.0, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {1.0, 1.0, 0.0, 1.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
- {1.0, 1.0, 0.0, 1.0}}; // [3] polysk
- memcpy(material[0], param_materialu[0], 4*sizeof(GLfloat));
- memcpy(material[1], param_materialu[1], 4*sizeof(GLfloat));
- memcpy(material[2], param_materialu[2], 4*sizeof(GLfloat));
- memcpy(material[3], param_materialu[3], 4*sizeof(GLfloat));
- memcpy(material[4], Emission, 4*sizeof(GLfloat));
- }
- void material3()
- {
- memcpy(material[0], BronzeAmbient, 4*sizeof(GLfloat));
- memcpy(material[1], BronzeDiffuse, 4*sizeof(GLfloat));
- memcpy(material[2], BronzeSpecular, 4*sizeof(GLfloat));
- memcpy(material[3], &BronzeShininess, 4*sizeof(GLfloat));
- memcpy(material[4], Emission, 4*sizeof(GLfloat));
- }
- void UstawDomyslneWartosciParametrow(void)
- {
- // Tablica parametrow materialu
- /* GLfloat param_materialu[6][4] = {
- {0.2, 0.2, 0.2, 1.0}, // [0] wspolczynnik odbicia swiatla otoczenia
- {0.8, 0.8, 0.8, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {0.0, 0.0, 0.0, 1.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
- {0.0, 0.0, 0.0, 0.0}, // [3] polysk
- {0.0, 0.0, 0.0, 1.0}}; // [4] kolor swiatla emitowanego
- */
- // Tablica parametrow swiatla
- GLfloat param_swiatla[10][4] = {
- {0.0, 0.0, 0.0, 0.0}, // [0] otoczenie
- {1.0, 1.0, 1.0, 1.0}, // [1] rozproszenie
- {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
- {0.0, 0.0, 1.0, 1.0}, // [3] polozenie
- {0.0, 0.0, -1.0, 0.0}, // [4] kierunek swiecenia
- {0.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
- {180.0, 0.0, 0.0, 0.0},// [6] kat odciecia swiatla
- {1.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
- {0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
- {0.0, 0.0, 0.0, 0.0}}; // [9] tlumienie kwadratowe
- // Skopiowanie zawartosci tablic param_* do tablic globalnych
- memcpy(swiatlo, param_swiatla, LPOZ_MENU_SWIATLA*4*sizeof(GLfloat));
- // memcpy(material, param_materialu, LPOZ_MENU_MATERIALU*4*sizeof(GLfloat));
- // Skopiowanie Właściwości materiału - złoto
- memcpy(material[0], GoldAmbient, 4*sizeof(GLfloat));
- memcpy(material[1], GoldDiffuse, 4*sizeof(GLfloat));
- memcpy(material[2], GoldSpecular, 4*sizeof(GLfloat));
- memcpy(material[3], &GoldShininess, 4*sizeof(GLfloat));
- memcpy(material[4], Emission, 4*sizeof(GLfloat));
- // Pozostale parametry
- sIndeks = 0; // Wybrana pozycja w tablicy parametrow swiatla
- mIndeks = 0; // Wybrana pozycja w tablicy parametrow materialu
- menu = ID_MENU_SWIATLA;
- glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Zdefiniowanie walasciwosci materialu walca na podstawie zapisanych w tablcy 'material'
- // parametrow (material obowiazuje tylko do scian skierowanych przodem do obserwatora)
- void DefiniujMaterial(void)
- {
- glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Ustawienie parametrow oswietlenia sceny
- void oswietl()
- {
- GLfloat param_swiatla[10][4] = {
- {3.0, 3.0, 0.0, 0.0}, // [0] otoczenie
- {1.0, 1.0, 1.0, 1.0}, // [1] rozproszenie
- {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
- {0.0, 0.0, 1.0, 1.0}, // [3] polozenie
- {0.0, 0.0, -1.0, 0.0}, // [4] kierunek swiecenia
- {0.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
- {180.0, 0.0, 0.0, 0.0},// [6] kat odciecia swiatla
- {1.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
- {0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
- {0.0, 0.0, 0.0, 0.0}}; // [9] tlumienie kwadratowe
- memcpy(swiatlo, param_swiatla, LPOZ_MENU_SWIATLA*4*sizeof(GLfloat));
- }
- void UstawParametryOswietlenia(int indeks, char operacja)
- {
- switch(indeks)
- {
- // Parametry swiatla otoczenia, rozproszenia i odbicia lustrzanego
- case 0:
- case 1:
- case 2:
- switch(operacja)
- {
- // Zwiekszenie skladowej R o wartosc KROK_FLOAT
- case '1':
- swiatlo[indeks][0] = (swiatlo[indeks][0] >= 1.0) ? 1.0 : swiatlo[indeks][0]+ KROK_FLOAT;
- break;
- // Zmniejszenie skladowej R o wartosc KROK_FLOAT
- case '!':
- swiatlo[indeks][0] = (swiatlo[indeks][0] <= 0.1) ? 0.0 : swiatlo[indeks][0]- KROK_FLOAT;
- break;
- // Zwiekszenie skladowej G o wartosc KROK_FLOAT
- case '2':
- swiatlo[indeks][1] = (swiatlo[indeks][1] >= 1.0) ? 1.0 : swiatlo[indeks][1]+ KROK_FLOAT;
- break;
- // Zmniejszenie skladowej G o wartosc KROK_FLOAT
- case '@':
- swiatlo[indeks][1] = (swiatlo[indeks][1] <= 0.01) ? 0.0 : swiatlo[indeks][1]- KROK_FLOAT;
- break;
- // Zwiekszenie skladowej B o wartosc KROK_FLOAT
- case '3':
- swiatlo[indeks][2] = (swiatlo[indeks][2] >= 1.0) ? 1.0 : swiatlo[indeks][2]+ KROK_FLOAT;
- break;
- // Zmniejszenie skladowej B o wartosc KROK_FLOAT
- case '#':
- swiatlo[indeks][2] = (swiatlo[indeks][2] <= 0.1) ? 0.0 : swiatlo[indeks][2]- KROK_FLOAT;
- break;
- // Zwiekszenie skladowej A o wartosc KROK_FLOAT
- case '4':
- swiatlo[indeks][3] = (swiatlo[indeks][3] >= 1.0) ? 1.0 : swiatlo[indeks][3]+ KROK_FLOAT;
- break;
- // Zmniejszenie skladowej B o wartosc KROK_FLOAT
- case '$':
- swiatlo[indeks][3] = (swiatlo[indeks][3] <= 0.1) ? 0.0 : swiatlo[indeks][3]- KROK_FLOAT;
- break;
- }
- break;
- // Parametry opisujace polozenie i orientacje swiatla
- case 3:
- case 4:
- case 5:
- case 6:
- switch(operacja)
- {
- // Zwiekszenie wspolrzednej X o wartosc KROK_FLOAT
- case '1':
- swiatlo[indeks][0] += KROK_FLOAT;
- break;
- // Zmniejszenie wspolrzednej X o wartosc KROK_FLOAT
- case '!':
- swiatlo[indeks][0] -= KROK_FLOAT;
- break;
- // Zwiekszenie wspolrzednej Y o wartosc KROK_FLOAT
- case '2':
- swiatlo[indeks][1] += KROK_FLOAT;
- break;
- // Zmniejszenie wspolrzednej Y o KROK_FLOAT
- case '@':
- swiatlo[indeks][1] -= KROK_FLOAT;
- break;
- // Zwiekszenie wspolrzednej Z o wartosc KROK_FLOAT
- case '3':
- swiatlo[indeks][2] += KROK_FLOAT;
- break;
- // Zmniejszenie wspolrzednej Z o wartosc KROK_FLOAT
- case '#':
- swiatlo[indeks][2] -= KROK_FLOAT;
- break;
- // Zwiekszenie wspolrzednej W o wartosc KROK_FLOAT
- case '4':
- swiatlo[indeks][3] += KROK_FLOAT;
- break;
- // Zmniejszenie wspolrzednej W o wartosc KROK_FLOAT
- case '$':
- swiatlo[indeks][3] -= KROK_FLOAT;
- break;
- }
- break;
- case 7:
- case 8:
- case 9:
- switch(operacja)
- {
- // Zwiekszenie skladowych tlumienia wartosc KROK_FLOAT/10
- case '1':
- swiatlo[indeks][0] += KROK_FLOAT/10.0;
- break;
- // Zmniejszenie stalych tlumienia o wartosc KROK_FLOAT/10
- case '!':
- swiatlo[indeks][0] -= KROK_FLOAT/10.0;
- break;
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Ustawienie parametrow materoalu
- void UstawParametryMaterialu(int indeks, char operacja)
- {
- switch(indeks)
- {
- // Parametry odbicia swiatla swiatla otoczenia, swiatla rozproszonego, swiatla
- // kierunkowego i emitowanego
- case 0:
- case 1:
- case 2:
- case 4:
- switch(operacja)
- {
- // Zwiekszenie skladowej R o wartosc KROK_FLOAT
- case '1':
- material[indeks][0] = (material[indeks][0] >= 1.0) ? 1.0 : material[indeks][0]+ KROK_FLOAT;
- break;
- // Zmniejszenie skladowej R o wartosc KROK_FLOAT
- case '!':
- material[indeks][0] = (material[indeks][0] <= 0.1) ? 0.0 : material[indeks][0]- KROK_FLOAT;
- break;
- // Zwiekszenie skladowej G o wartosc KROK_FLOAT
- case '2':
- material[indeks][1] = (material[indeks][1] >= 1.0) ? 1.0 : material[indeks][1]+ KROK_FLOAT;
- break;
- // Zmniejszenie skladowej G o wartosc KROK_FLOAT
- case '@':
- material[indeks][1] = (material[indeks][1] <= 0.1) ? 0.0 : material[indeks][1]- KROK_FLOAT;
- break;
- // Zwiekszenie skladowej B o wartosc KROK_FLOAT
- case '3':
- material[indeks][2] = (material[indeks][2] >= 1.0) ? 1.0 : material[indeks][2]+ KROK_FLOAT;
- break;
- // Zmniejszenie skladowej B o wartosc KROK_FLOAT
- case '#':
- material[indeks][2] = (material[indeks][2] <= 0.1) ? 0.0 : material[indeks][2]- KROK_FLOAT;
- break;
- // Zwiekszenie skladowej A o wartosc KROK_FLOAT
- case '4':
- material[indeks][3] = (material[indeks][3] >= 1.0) ? 1.0 : material[indeks][3]+ KROK_FLOAT;
- break;
- // Zmniejszenie skladowej A o wartosc KROK_FLOAT
- case '$':
- material[indeks][3] = (material[indeks][3] <= 0.1) ? 0.0 : material[indeks][3]- KROK_FLOAT;
- break;
- }
- break;
- // Parametr opisujacy polysk powierzchni
- case 3:
- switch(operacja)
- {
- // Zwiekszenie skladowej R o wartosc KROK_FLOAT*10
- case '1':
- material[indeks][0] = (material[indeks][0] >= 100.0) ? 100.0 : material[indeks][0]+ KROK_FLOAT * 10.0;
- break;
- // Zmniejszenie skladowej R o wartosc KROK_FLOAT*10
- case '!':
- material[indeks][0] = (material[indeks][0] <= 0.0) ? 0.0 : material[indeks][0]- KROK_FLOAT * 10.0;
- break;
- }
- break;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
- // Srodek szescianu znajduje się w punkcie (0,0,0).
- void RysujSzescian(double a)
- {
- /* // Pocztaek tworzenia ukladu wspolrzednych
- glBegin(GL_LINES);
- // Os X
- glColor3f(1.0, 0.0, 0.0);
- glVertex3f(-40.0, 0.0, 0.0);
- glVertex3f(40.0, 0.0, 0.0);
- // Os Y
- glColor3f(0.0,1.0,0.0);
- glVertex3f(0.0, -20.0, 0.0);
- glVertex3f(0.0, 20.0, 0.0);
- // Os Z
- glColor3f(0.0,0.0,1.0);
- glVertex3f(0.0, 0.0, -20.0);
- glVertex3f(0.0, 0.0, 20.0);
- // Koniec tworzenia ukladu wspolrzednych
- glEnd();*/
- /* glColor3f(1.0,1.0,1.0);
- // Sciany boczne
- glBegin(GL_QUAD_STRIP);
- glVertex3f(a/2.0, a/2.0, a/2.0);
- glVertex3f(a/2.0, -a/2.0, a/2.0);
- glVertex3f(a/2.0, a/2.0, -a/2.0);
- glVertex3f(a/2.0, -a/2.0, -a/2.0);
- glVertex3f(-a/2.0, a/2.0, -a/2.0);
- glVertex3f(-a/2.0, -a/2.0, -a/2.0);
- glVertex3f(-a/2.0, a/2.0, a/2.0);
- glVertex3f(-a/2.0, -a/2.0, a/2.0);
- glVertex3f(a/2.0, a/2.0, a/2.0);
- glVertex3f(a/2.0, -a/2.0, a/2.0);
- glEnd();
- // Gorna sciana
- glBegin(GL_QUAD_STRIP);
- glVertex3f(-a/2.0, a/2.0, a/2.0);
- glVertex3f(a/2.0, a/2.0, a/2.0);
- glVertex3f(-a/2.0, a/2.0, -a/2.0);
- glVertex3f(a/2.0, a/2.0, -a/2.0);
- glEnd();
- // Dolna sciana
- glBegin(GL_QUAD_STRIP);
- glVertex3f(-a/2.0, -a/2.0, a/2.0);
- glVertex3f(a/2.0, -a/2.0, a/2.0);
- glVertex3f(-a/2.0, -a/2.0, -a/2.0);
- glVertex3f(a/2.0, -a/2.0, -a/2.0);
- glEnd();
- */
- /* glTranslatef(10.0,0.0 , 0.0);
- glColor3f(1.0, 1.0, 1.0);
- glBegin(GL_TRIANGLE_FAN); // dolna podstawa
- glVertex3f(0.0,0.0,0.0);
- for (angle=0.0; angle<=(2.0*PI); angle+=(2*PI/N))
- {
- glVertex3f(r1*cos(angle),0.0,r1*sin(angle));
- }
- glEnd();
- glBegin(GL_TRIANGLE_FAN); // gorna podstawa
- glVertex3f(0.0,10.0,0.0);
- for (angle=0.0; angle<=(2.0*PI); angle+=(2*PI/N))
- {
- glVertex3f(r2*cos(angle),h,r2*sin(angle));
- }
- glEnd();
- glBegin(GL_QUAD_STRIP); // scianaboczna
- for (angle=0.0; angle<=(2.0*PI+0.1); angle+=(2*PI/N))
- {
- glVertex3f(r1*cos(angle),0.0,r1*sin(angle));
- glVertex3f(r2*cos(angle),h,r2*sin(angle));
- }
- glEnd();
- glTranslatef(-10.0,0.0 , 0.0);
- */
- /////////////////////////////////
- glBegin(GL_QUAD_STRIP); // stozek
- glColor3f(1.0,0.0,0.0);
- for (angle=0.0; angle<=(PI+0.01); angle+=(PI/N))
- {
- //glNormal3f(0.0, 0.0, 1.0);
- glVertex3f(r3*cos(angle),0.0,r3*sin(angle));
- glVertex3f(r3*cos(angle),3.0,r3*sin(angle));
- }
- glEnd();
- glColor3f(1.0,1.0,0.0);
- glBegin(GL_QUAD_STRIP); // dol
- for (angle=0.0; angle<=(PI+0.01); angle+=(PI/N))
- {
- // glNormal3f(0.0, -1.0, 0.0);
- glVertex3f(0.0,0.0,0.0);
- glVertex3f(r3*cos(angle),0.0,r3*sin(angle));
- }
- glEnd();
- glColor3f(0.0,1.0,0.0);
- glBegin(GL_QUAD_STRIP); // gora
- for (angle=0.0; angle<=(PI+0.01); angle+=(PI/N))
- {
- //glNormal3f(0.0, 1.0, 0.0);
- glVertex3f(0.0,3.0,0.0);
- glVertex3f(r3*cos(angle),3.0,r3*sin(angle));
- }
- glEnd();
- //podzialy poziome
- glColor3f(1.0, 1.0, 0.0);
- for (pom=0.0; pom < 3.01; pom += (3.0 / N2))
- {
- glBegin(GL_QUAD_STRIP);
- for (angle = 0.0; angle <= (PI + 0.01); angle += (PI / N))
- {
- glVertex3f(0.0, pom, 0.0);
- glVertex3f(r3*cos(angle), pom, r3*sin(angle));
- }glEnd();
- }
- glColor3f(0.0,1.0,1.0);
- glBegin(GL_QUAD_STRIP); // bok
- /*for (angle=0.0; angle<=4.01; angle+=0.2)
- {
- glVertex3f(-2.0+angle,0.0,0.0);
- glVertex3f(-2.0+angle,3.0,0.0);
- }*/
- for (angle = 0.0; angle <= 4.01; angle += (4/N))
- {
- glVertex3f(-2.0 + angle, 0.0, 0.0);
- glVertex3f(-2.0 + angle, 3.0, 0.0);
- }
- glEnd();
- ///////////////////////////////////
- /* glBegin(GL_QUAD_STRIP); //DOL
- glVertex3f(0.0,0.0,0.0);
- for (angle=0.0; angle<=(PI+0.1); angle+=(2*PI/N))
- {
- glVertex3f(r3*cos(angle),0.0,r3*sin(angle));
- }
- glEnd();*/
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
- // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
- void UstawParametryWidoku(int szer, int wys)
- {
- // Zapamietanie wielkosci widoku
- szerokoscOkna = szer;
- wysokoscOkna = wys;
- // Ustawienie parametrow viewportu
- glViewport(0, 0, szerokoscOkna, wysokoscOkna);
- // Przejscie w tryb modyfikacji macierzy rzutowania
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja wyswietlajaca pojedyncza klatke animacji
- void WyswietlObraz(void)
- {
- // Wyczyszczenie bufora koloru i bufora glebokosci
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
- glMatrixMode(GL_MODELVIEW);
- // Zastapienie aktywnej macierzy macierza jednostkowa
- glLoadIdentity();
- // Ustalenie polozenia obserwatora
- glTranslatef(0, 0, -OBSERWATOR_ODLEGLOSC);
- glRotatef(OBSERWATOR_OBROT_X, 1, 0, 0);
- glRotatef(OBSERWATOR_OBROT_Y, 0, 1, 0);
- glRotatef(OBSERWATOR_OBROT_Z, 0, 0, 1);
- // Narysowanie szescianu
- RysujSzescian(bok);
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- if(klawisz == '+')
- bok *= 2.0;
- else if (klawisz == '-')
- bok /= 2.0;
- else if (klawisz == '1')
- OBSERWATOR_OBROT_X++;
- else if (klawisz == '!')
- OBSERWATOR_OBROT_X--;
- else if (klawisz == '2')
- OBSERWATOR_OBROT_Y++;
- else if (klawisz == '@')
- OBSERWATOR_OBROT_Y--;
- else if (klawisz == '3')
- OBSERWATOR_OBROT_Z++;
- else if (klawisz == '#')
- OBSERWATOR_OBROT_Z--;
- else if (klawisz == '4')
- {if(OBSERWATOR_ODLEGLOSC < 80 ) OBSERWATOR_ODLEGLOSC++;}
- else if (klawisz == '$')
- {if(OBSERWATOR_ODLEGLOSC > -20 ) OBSERWATOR_ODLEGLOSC--;}
- else if (klawisz == '5')
- { if (N < 64) N++;}
- else if (klawisz == '%')
- {if(N > 4 ) N--;}
- else if (klawisz == '6')
- {
- if (N2 < 64) N2++;
- }
- else if (klawisz == '^')
- {
- if (N2 > 4) N2--;
- }
- else if (klawisz == 'z')
- {
- UstawDomyslneWartosciParametrow();
- WlaczOswietlenie();
- }
- else if (klawisz == 'x')
- {
- glDisable(GL_LIGHTING);
- // Odblokowanie zerowego zrodla swiatla
- glDisable(GL_LIGHT0);
- }
- else if (klawisz == 'c')
- {
- material1();
- DefiniujMaterial();
- }
- else if (klawisz == 'v')
- {
- material2();
- DefiniujMaterial();
- }
- else if (klawisz == 'b')
- {
- material3();
- DefiniujMaterial();
- }
- else if (klawisz == 27)
- exit(0);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Glowna funkcja programu
- int main(int argc, char **argv)
- {
- // Zainicjowanie biblioteki GLUT
- glutInit(&argc, argv);
- // Ustawienie trybu wyswietlania
- glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
- // Ustawienie polozenia dolenego lewego rogu okna
- glutInitWindowPosition(100, 100);
- // Ustawienie rozmiarow okna
- glutInitWindowSize(szerokoscOkna, wysokoscOkna);
- // Utworzenie okna
- glutCreateWindow("Szescian");
- // Odblokowanie bufora glebokosci
- glEnable(GL_DEPTH_TEST);
- // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
- glClearDepth(1000.0);
- // Ustawienie koloru czyszczenia bufora ramki
- glClearColor (0.0f, 0.0f, 0.3f, 0.0f);
- // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- // Zarejestrowanie funkcji (callback) odpowiedzialnej za
- glutDisplayFunc(WyswietlObraz);
- // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
- // zmieniane sa rozmiary okna
- glutReshapeFunc(UstawParametryWidoku);
- // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
- // zadnych zadan
- glutIdleFunc(WyswietlObraz);
- // Zarejestrowanie funkcji obslugi klawiatury
- glutKeyboardFunc(ObslugaKlawiatury);
- // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
- // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement