Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <gl/glut.h>
- #include <math.h>
- #include <stdio.h>
- // Definicja stalych
- #define DLUGOSC_BOKU 5.0
- #define OBSERWATOR_FOV_Y 30.0 //kat
- #define PI 3.1416
- #define X_OFFSET_SWIATLO 10
- #define Y_OFFSET_SWIATLO 0
- #define X_OFFSET_MAT 10
- #define Y_OFFSET_MAT 100
- #define X_OFFSET_OBIEKT 10
- #define Y_OFFSET_OBIEKT 245
- #define ID_MENU_SWIATLA 0
- #define ID_MENU_MATERIALU 1
- #define LPOZ_MENU_SWIATLA 10
- #define LPOZ_MENU_MATERIALU 5
- GLUquadricObj *orb;
- int w = 0;
- // Zmienne globalne
- double bok = DLUGOSC_BOKU;
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- float OBSERWATOR_ODLEGLOSC = 40.0;
- float OBSERWATOR_OBROT_X = 20.0;
- float OBSERWATOR_OBROT_Y = 20.0;
- float OBSERWATOR_OBROT_Z = 0.0;
- float odlmax = 90.0;
- float odlmin = 5.0;
- float N = 20;
- float r1 = 3.0;
- float h = 4.0;
- float angle = 0;
- float R1 = 10; //promien wewnetrzny
- float R2 = 12.58;
- float H = 4.83;
- GLfloat liczbaPodzialow = 4.0;
- double dAlpha = 90.0;
- GLfloat obr = 0.0;
- GLfloat or = 0.0;
- GLfloat lul = 0.0;
- GLfloat prom = 6.0;
- GLfloat obrotplanety0= 0.0;
- GLfloat spinplanety = 0.0;
- GLfloat x = 0;
- GLfloat y = 0;
- GLfloat z = 0;
- double ringInnerRadius = 10.0;
- double ringHeight = 4;
- GLfloat ringWidth = 4;
- double M_PI = 3.14159265359;
- int tryb_rysowania = 1;
- int oswietlenie1 = 1;
- int oswietlenie2 = 1;
- int material = 1;
- int trybCieni = 1;
- double DEG2RAD(double deg) {
- return deg * M_PI / 180.0;
- }
- // Tablica parametrow swiatla
- GLfloat swiatlo1[10][4] = { //reflektor bialy
- { 1.0, 1.0, 1.0, 1.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, 0.0, 1.0 }, // [3] polozenie
- { -1.0, 0.0, 0.0, 0.0 }, // [4] kierunek swiecenia
- { 0.0, 0.0, 0.0, 0.0 }, // [5] tlumienie katowe swiatla
- { 45.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
- GLfloat swiatlo2[10][4] = {
- { 1.0, 1.0, 0.0, 1.0 }, // [0] otoczenie
- { 1.0, 1.0, 0.0, 1.0 }, // [1] rozproszenie
- { 1.0, 1.0, 0.0, 1.0 }, // [2] lustrzane
- { 10.0,10.0,10.0,1.0 }, // [3] polozenie
- { 0.0, 0.0, 0.0, 1.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
- GLfloat material2[6][4] = { //matowy niebieski
- { 0.0, 0.33, 0.0, 1.000000 }, // [0] wspolczynnik odbicia swiatla otoczenia
- { 0.1, 0.44, 0.1, 1.000000 }, // [1] wspolczynnik odbicia swiatla rozproszonego
- { 0.0, 0.0, 0.0, 1.000000 }, // [2] wspolczynnik odbicia swiatla lustrzanego
- { 0.0, 0.0, 0.0, 0.0 }, // [3] polysk
- { 0.0, 0.0, 1.0, 0.0 } }; // [4] kolor swiatla emitowanego
- GLfloat material1[6][4] = { //blyszczacy żółty
- { 1,1,0, 1.000000 }, // [0] wspolczynnik odbicia swiatla otoczenia
- { 1,1,0, 1.000000 }, // [1] wspolczynnik odbicia swiatla rozproszonego
- { 0,0,0,0.000000 }, // [2] wspolczynnik odbicia swiatla lustrzanego
- { 75, 75, 75, 1.0 }, // [3] polysk
- { 0, 0, 0.0, 0.0 } }; // [4] kolor swiatla emitowanego
- GLfloat material3[6][4] = { //grafit
- { 0.105882, 0.058824, 0.113725, 1.000000 }, // [0] wspolczynnik odbicia swiatla otoczenia
- { 0.427451, 0.470588, 0.541176, 1.000000 }, // [1] wspolczynnik odbicia swiatla rozproszonego
- { 0.333333, 0.333333, 0.521569, 1.000000 }, // [2] wspolczynnik odbicia swiatla lustrzanego
- { 9.8461, 9.8461, 9.84612, 1.0 }, // [3] polysk
- { 0.0, 0.0, 0.0, 0.0 } }; // [4] kolor swiatla emitowanego
- // 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 RysujTekstRastrowy(void *font, char *tekst);
- void RysujNakladke(int N);
- void Menu(void)
- {
- char buf[255];
- // Zmiana typu rzutu z perspektywicznego na ortogonalny
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
- // Modelowanie sceny 2D (zawartosci nakladki)
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
- glDisable(GL_LIGHTING);
- // Okreslenie koloru tekstu
- glColor3f(1.0, 0.0, 1.0);
- // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
- sprintf(buf, "~Predkosc orbity 1: </>");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Przyblizenie/oddalenie: +/-");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO+90);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Obrot obs wokół osi: lewo/gora/prawo/dol i F1/F2");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO +80);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Zwiekszenie/zmiejszenie liczby podzialow: g/h");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 70);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Zmiana modelu geometrycznego bryly: p");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 60);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Wlaczanie swiatel: v b");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 50);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Zmiana materialu: 1 2 3");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 40);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Zmiana cieniowania t");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 30);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Wlacz/wylacz wektory normalne r");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 20);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Zwieksz/zmniejsz promien swiatla 1: o/u");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO + 10);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf(buf, "~Obrot orbity swiatla 1: 9/0");
- glRasterPos2i(X_OFFSET_SWIATLO, Y_OFFSET_SWIATLO);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- // Przywrocenie macierzy sprzed wywolania funkcji
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- // Odblokowanie oswietlenia
- glEnable(GL_LIGHTING);
- }
- ////////////////////////////////////////////////////////////////////////////////
- void RysujPierscien() {
- int i;
- // Sciana boczna wewnetrzna
- glColor3f(0.0, 1.0, 1.0);
- // Sciana boczna zewnetrzna
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= liczbaPodzialow; i++) {
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- }
- glEnd();
- // Dolna podstawa
- glColor3f(1.0, 1.0, 0.0);
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= liczbaPodzialow; i++) {
- glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- }
- glEnd();
- // Gorna podstawa
- glColor3f(1.0, 0.0, 1.0);
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= liczbaPodzialow; i++) {
- glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- }
- glEnd();
- }
- void RysujPierscien1() {
- int i;
- // Sciana boczna wewnetrzna
- glColor3f(0.0, 1.0, 1.0);
- // Sciana boczna zewnetrzna
- glBegin(GL_LINES);
- for (i = 0; i <= liczbaPodzialow; i++) {
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- }
- glEnd();
- // Dolna podstawa
- glColor3f(1.0, 1.0, 0.0);
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= liczbaPodzialow; i++) {
- glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- }
- glEnd();
- // Gorna podstawa
- glColor3f(1.0, 0.0, 1.0);
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= liczbaPodzialow; i++) {
- glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- }
- glEnd();
- }
- void WlaczOswietlenie(void) {
- // Odblokowanie oswietlenia
- glEnable(GL_LIGHTING);
- if (oswietlenie1 == 1) glEnable(GL_LIGHT1);
- else glDisable(GL_LIGHT1);
- if (oswietlenie2 == 1) glEnable(GL_LIGHT2);
- else glDisable(GL_LIGHT2);
- glPopMatrix();
- glPopMatrix();
- // Inicjowanie zrodla swiatla
- glPushMatrix();
- glLightfv(GL_LIGHT2, GL_AMBIENT, swiatlo2[0]);
- glLightfv(GL_LIGHT2, GL_DIFFUSE, swiatlo2[1]);
- glLightfv(GL_LIGHT2, GL_SPECULAR, swiatlo2[2]);
- glLightfv(GL_LIGHT2, GL_POSITION, swiatlo2[3]);
- glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, swiatlo2[4]);
- glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, swiatlo2[5][0]);
- glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, swiatlo2[6][0]);
- glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, swiatlo2[7][0]);
- glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, swiatlo2[8][0]);
- glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, swiatlo2[9][0]);
- glPopMatrix();
- glPushMatrix();
- glRotatef(90, 1, 0, 0);
- glColor3f(1.0, 1.0, 0.0);
- glRotatef(obr, 1, 0, 0);
- glRotatef(obrotplanety0, 0, 0, -1);
- glColor3f(0.0, 0.0, 1.0);
- glRotatef(-90.0, 1, 0, 0);
- glColor3f(1, 1, 1);
- glRotatef(obrotplanety0, 0, 1, 0);
- glTranslatef(prom, 0, 0);
- obrotplanety0 += lul;
- glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo1[0]);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo1[1]);
- glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo1[2]);
- glLightfv(GL_LIGHT1, GL_POSITION, swiatlo1[3]);
- glRotatef(obrotplanety0, -1, 0, 0);
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo1[4]);
- glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, swiatlo1[5][0]);
- glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, swiatlo1[6][0]);
- glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, swiatlo1[7][0]);
- glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, swiatlo1[8][0]);
- glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, swiatlo1[9][0]);
- glPopMatrix();
- glPopMatrix();
- }
- void DefiniujMaterial(void)
- {
- if (material == 1) {
- glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
- }
- if (material == 2) {
- glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
- }
- if (material == 3) {
- glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
- }
- }
- void RysujTekstRastrowy(void *font, char *tekst)
- {
- int i;
- for (i = 0; i < (int)strlen(tekst); i++)
- glutBitmapCharacter(font, tekst[i]);
- }
- void RysujNakladke(int N)
- {
- // Zmiana typu rzutu z perspektywicznego na ortogonalny
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
- // Modelowanie sceny 2D (zawartosci nakladki)
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
- glDisable(GL_LIGHTING);
- // Okreslenie koloru tekstu
- glColor3f(1.0, 1.0, 1.0);
- // Okreslenie koloru tekstu
- glColor3f(0.7, 1.0, 0.9);
- // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
- // Przywrocenie macierzy sprzed wywolania funkcji
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- // Odblokowanie oswietlenia
- glEnable(GL_LIGHTING);
- }
- void wektory()
- {
- double i;
- double dAlfa = 360 / N;
- double R = 15;
- glColor3f(1, 1, 1);
- glBegin(GL_LINES);
- for (i = 0; i*dAlfa <= 360.0; i++)
- {
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), -1.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth+1) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth + 1) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth-1) * cos(DEG2RAD(i * dAlpha)), ringHeight+1, (ringInnerRadius + ringWidth - 1) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth+1) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth + 1) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD(i * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
- glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), -1.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
- glVertex3f(ringInnerRadius * cos(DEG2RAD(i * dAlpha)), 0.0, ringInnerRadius * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius-1) * cos(DEG2RAD(i * dAlpha)), 0.0, (ringInnerRadius - 1) * sin(DEG2RAD(i * dAlpha)));
- }
- glEnd();
- }
- ///////////////////////////////////////////////////////////////////////////////////
- void RysujUklad() {
- glColor3f(1, 0, 0);
- glBegin(GL_LINES);
- glVertex3f(-40, 0, 0);
- glVertex3f(40, 0, 0);
- glColor3f(0, 1, 0);
- glVertex3f(0, -40, 0);
- glVertex3f(0, 40, 0);
- glColor3f(0, 0, 1);
- glVertex3f(0, 0, -40);
- glVertex3f(0, 0, 40);
- glEnd();
- }
- //////////////////////////////////////////////////////////////////////////////////
- void RysujStozek() {
- glBegin(GL_TRIANGLE_FAN);
- glColor3f(0.0, 1.0, 0.0);
- glVertex3f(0.0, 0.0, 0.0);
- for (angle = 0.0; angle <= (2.0*PI + 1 / N); angle += (2 * PI / N))
- {
- glVertex3f(r1* cos(angle), 0.0, r1* sin(angle));
- }
- glEnd();
- glBegin(GL_TRIANGLE_FAN);//sciany
- glVertex3f(0.0, h, 0.0);
- for (angle = 0.0; angle <= (2.0*PI + 1 / N); angle += (2 * PI / N))
- {
- glVertex3f(r1* cos(angle), 0.0, r1* 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)
- {
- char buf[255];
- // 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);
- Menu();
- // Narysowanie bryl
- //RysujSzescian(bok);
- //RysujUklad();
- //Planety();
- RysujPierscien();
- //RysujPierscien1();
- if (w == 1)
- {
- wektory();
- }
- glPushMatrix();
- //Wlaczenie oswietlenia
- WlaczOswietlenie();
- glPopMatrix();
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- //Wlaczenie materialow
- DefiniujMaterial();
- //Rysowanie menu
- RysujNakladke(liczbaPodzialow);
- }
- void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
- {
- switch (klawisz)
- {
- case GLUT_KEY_UP:
- OBSERWATOR_OBROT_X = (OBSERWATOR_OBROT_X >= 360.0) ? 0.0 : OBSERWATOR_OBROT_X + 1.0;
- break;
- case GLUT_KEY_DOWN:
- OBSERWATOR_OBROT_X = (OBSERWATOR_OBROT_X <= -360.0) ? 0.0 : OBSERWATOR_OBROT_X - 1.0;
- break;
- case GLUT_KEY_LEFT:
- OBSERWATOR_OBROT_Y = (OBSERWATOR_OBROT_Y <= -360.0) ? 0.0 : OBSERWATOR_OBROT_Y - 1.0;
- break;
- case GLUT_KEY_RIGHT:
- OBSERWATOR_OBROT_Y = (OBSERWATOR_OBROT_Y >= 360.0) ? 0.0 : OBSERWATOR_OBROT_Y + 1.0;
- break;
- case GLUT_KEY_F1:
- OBSERWATOR_OBROT_Z = (OBSERWATOR_OBROT_Z <= -360.0) ? 0.0 : OBSERWATOR_OBROT_Z - 1.0;
- break;
- case GLUT_KEY_F2:
- OBSERWATOR_OBROT_Z = (OBSERWATOR_OBROT_Z >= 360.0) ? 0.0 : OBSERWATOR_OBROT_Z + 1.0;
- break;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- if (klawisz == 'e')
- exit(0);
- else if (klawisz == 'r')
- {
- if (w == 1) {
- w = 0;
- }
- else
- w = 1;
- }
- else if (klawisz == '+')
- OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC > odlmin) ? OBSERWATOR_ODLEGLOSC - 1.0 : OBSERWATOR_ODLEGLOSC;
- else if (klawisz == '-')
- OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC < odlmax) ? OBSERWATOR_ODLEGLOSC + 1.0 : OBSERWATOR_ODLEGLOSC;
- else if (klawisz == 'q') {
- if (N > 4)
- N -= 1;
- }
- else if (klawisz == 'w') {
- if (N < 64)
- N += 1;
- }
- else if (klawisz == 'g')
- {
- liczbaPodzialow = (liczbaPodzialow > 4) ? liczbaPodzialow - 1 : liczbaPodzialow;
- dAlpha = 360.0 / liczbaPodzialow;
- }
- else if (klawisz == 'h')
- {
- liczbaPodzialow = (liczbaPodzialow < 64) ? liczbaPodzialow + 1 : liczbaPodzialow;
- dAlpha = 360.0 / liczbaPodzialow;
- }
- else if (klawisz == 'p') {
- tryb_rysowania = (tryb_rysowania == 1) ? 0 : 1;
- if (tryb_rysowania == 1) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- else glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- }
- else if (klawisz == 'v')
- oswietlenie1 = oswietlenie1 == 0 ? 1 : 0;
- else if (klawisz == 'b')
- oswietlenie2 = oswietlenie2 == 0 ? 1 : 0;
- else if (klawisz == '1')
- material = 1;
- else if (klawisz == '2')
- material = 2;
- else if (klawisz == '3')
- material = 3;
- else if (klawisz == '4')
- {
- or += 15;
- }
- else if (klawisz == '5')
- or-=15;
- else if (klawisz == '/')
- RysujPierscien1();
- else if (klawisz == '9')
- obr--;
- else if (klawisz == '0')
- {
- obr++;
- }
- else if (klawisz == 'o')
- {
- if (prom >0)
- {
- prom--;
- }
- }
- else if (klawisz == 'u')
- {
- if (prom < 5)
- {
- prom++;
- }
- }
- else if (klawisz == ',')
- {
- if (lul >= 0.25)
- lul = lul - 0.25;
- }
- else if (klawisz == '.')
- {
- if (lul<= 0.5)
- lul = lul + 0.25;
- }
- else if (klawisz == 't') {
- trybCieni = trybCieni == 0 ? 1 : 0;
- if (trybCieni == 0) glShadeModel(GL_SMOOTH);
- else glShadeModel(GL_FLAT);
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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);
- glutSpecialFunc(ObslugaKlawiszySpecjalnych);
- // 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