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 <GL/glut.h>
- #include <math.h>
- #include <stdio.h>
- // Definicja stalych
- #define DLUGOSC_BOKU 5.0
- #define OBSERWATOR_FOV_Y 30.0
- #define PI 3.1416
- #define LPOZ_MAX 100
- #define LPOZ_MIN 3
- #define LPION_MAX 100
- #define LPION_MIN 3
- #define R_MAX 10.0
- #define WYS_MAX 5.0
- #define KROK_FLOAT 0.1
- #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
- #define M_PI 3.14159
- // Zmienne globalne
- double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- float OBSERWATOR_ODLEGLOSC = 100.0;
- float OBSERWATOR_OBROT_X = 20.0;
- float OBSERWATOR_OBROT_Y = 20.0;
- float OBSERWATOR_OBROT_Z = 0.0;
- float odlmax = 60.0;
- float odlmin = 5.0;
- float r1 = 3.0;
- float r2 = 3.0;
- float h = 4.0;
- float i, y, x, z;
- float angle = 0;
- float r = 10; //Wewnetrzny
- float H = 2.598;
- float R = 10 + 2.598; //R + wysokosc trojkata rownobocznego
- float R1 = 11.5;
- float R2 = 13;
- GLfloat ringInnerRadius = 15.0;
- GLfloat ringInnerRadius1;
- GLfloat bokromb = 5;
- GLfloat liczbaPodzialow = 4.0;
- GLfloat dAlpha = 90.0;
- float N = 20;
- GLfloat kat1 = 30;
- int obrot = 0, promRef = 1, kat0X = 0;
- int predKat = 1;
- int trybRys = 1;
- int trybCien = 1;
- int light1, light2, material = 1;
- GLUquadric* orbita;
- GLfloat norm1[3], norm2[3], norm3[3];
- int wektory = 1;
- // Tablica parametrow swiatla
- GLfloat swiatlo[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
- { 30.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 swiatlo1[10][4] = { //kierunkowe zielone
- {0.0, 1.0, 0.0, 0.7}, // [0] otoczenie
- {0.3, 0.3, 0.3, 0.7}, // [1] rozproszenie
- {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
- {10.0, 10.0, 10.0, 0.0}, // [3] polozenie
- { 10.0, -10.0, -10.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
- GLfloat material1[6][4] = { //fioletowy blyszczcacy
- { 0.35, 0.0, 0.45, 1.000000 }, // [0] wspolczynnik odbicia swiatla otoczenia
- { 0.6, 0.1, 0.6, 1.000000 }, // [1] wspolczynnik odbicia swiatla rozproszonego
- { 1.0, 0.9, 1.0, 1.000000 }, // [2] wspolczynnik odbicia swiatla lustrzanego
- { 75, 75, 75, 1.0 }, // [3] polysk
- { 0.0, 0.0, 0.0, 0.0 } }; // [4] kolor swiatla emitowanego
- GLfloat material2[6][4] = { //zółty matowy
- { 1.0, 1.0, 0.0, 1.000000 }, // [0] wspolczynnik odbicia swiatla otoczenia
- { 0.5, 0.5, 0.0, 1.000000 }, // [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
- { 0.0, 0.0, 0.0, 0.0 } }; // [4] kolor swiatla emitowanego
- GLfloat material3[6][4] = { //mosiądz
- { 0.329412, 0.223529, 0.027451, 1.0}, // [0] wspolczynnik odbicia swiatla otoczenia
- { 0.780392, 0.568627, 0.113725, 1.0 }, // [1] wspolczynnik odbicia swiatlarozproszonego
- { 0.992157, 0.941176, 0.807843, 1.0 }, // [2] wspolczynnik odbicia swiatla lustrzanego
- { 52.2, 52.2, 52.2, 1.0 }, // [3] polysk
- { 0.0, 0.0, 0.0, 0.0 } }; // [4] kolor swiatla emitowanego
- double DEG2RAD(double deg) {
- return deg * M_PI / 180.0;
- }
- // Prototypy funkcji
- void RysujPierscien(void);
- void UstawParametryWidoku(int szer, int wys);
- void WyswietlObraz(void);
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
- void WektNorm(GLfloat* p1, GLfloat* p2, GLfloat* p3, GLfloat* out, char flip, GLfloat* norm);
- void WlaczWektory(void);
- void WlaczOswietlenie(void);
- void RysujTekstRastrowy(void *font, char *tekst);
- void RysujNakladke(int N, int r);
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja rysujaca pierscien
- void RysujPierscien() {
- int i;
- GLfloat ringHeight = bokromb * sin(DEG2RAD(kat1 / 2));
- GLfloat ringWidth = bokromb * cos(DEG2RAD(kat1 / 2));
- // Dolna podstawa
- glColor3f(1.0, 0.0, 0.5);
- glBegin(GL_QUADS);
- glNormal3f(0.0, -1.0, 0.0);
- 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)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD((i + 1) * dAlpha)), ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD((i + 1) * dAlpha)));
- glVertex3f(ringInnerRadius * cos(DEG2RAD((i + 1) * dAlpha)), 0.0, ringInnerRadius * sin(DEG2RAD((i + 1) * dAlpha)));
- }
- glEnd();
- // Gorna podstawa
- glColor3f(0.0, 1.0, 0.6);
- glBegin(GL_QUADS);
- glNormal3f(0.0, 1.0, 0.0);
- 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)));
- glVertex3f((ringInnerRadius + ringWidth) * cos(DEG2RAD((i + 1) * dAlpha)), -ringHeight, (ringInnerRadius + ringWidth) * sin(DEG2RAD((i + 1) * dAlpha)));
- glVertex3f(ringInnerRadius * cos(DEG2RAD((i + 1) * dAlpha)), 0, ringInnerRadius * sin(DEG2RAD((i + 1) * dAlpha)));
- }
- glEnd();
- //
- ringInnerRadius1 = ringInnerRadius + ringWidth;
- //LD
- glColor3f(1.0, 1.0, 0.0);
- glBegin(GL_QUADS);
- for (i = 0; i <= liczbaPodzialow; i++) {
- glColor3f(0, 1, 0);
- glVertex3f(ringInnerRadius1 * cos(DEG2RAD(i * dAlpha)), -ringHeight, ringInnerRadius1 * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius1 + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0, (ringInnerRadius1 + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius1 + ringWidth) * cos(DEG2RAD((i + 1) * dAlpha)), 0, (ringInnerRadius1 + ringWidth) * sin(DEG2RAD((i + 1) * dAlpha)));
- glVertex3f(ringInnerRadius1 * cos(DEG2RAD((i + 1) * dAlpha)), -ringHeight, ringInnerRadius1 * sin(DEG2RAD((i + 1) * dAlpha)));
- }
- glEnd();
- //LG
- glColor3f(1.0, 0.5, 0.0);
- glBegin(GL_QUADS);
- for (i = 0; i <= liczbaPodzialow; i++) {
- glVertex3f(ringInnerRadius1 * cos(DEG2RAD(i * dAlpha)), ringHeight, ringInnerRadius1 * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius1 + ringWidth) * cos(DEG2RAD(i * dAlpha)), 0, (ringInnerRadius1 + ringWidth) * sin(DEG2RAD(i * dAlpha)));
- glVertex3f((ringInnerRadius1 + ringWidth) * cos(DEG2RAD((i + 1) * dAlpha)), 0, (ringInnerRadius1 + ringWidth) * sin(DEG2RAD((i + 1) * dAlpha)));
- glVertex3f(ringInnerRadius1 * cos(DEG2RAD((i + 1) * dAlpha)), ringHeight, ringInnerRadius1 * sin(DEG2RAD((i + 1) * dAlpha)));
- }
- glEnd();
- }
- ////////////////////////////////////////////////////
- //WEKTORY NORMALNE
- void WlaczWektory(void) {
- glBegin(GL_LINES);
- glColor3f(0, 0, 1);
- for (angle = 0.0; angle <= (2.0*PI + 0.01); angle += (2 * PI / N))
- {
- GLfloat p1[] = { r*cos(angle), 0, r*sin(angle) };
- GLfloat p2[] = { r*cos(angle + 2 * PI / N), 0, r*sin(angle + 2 * PI / N) };
- GLfloat p3[] = { R2*cos(angle + 2 * PI / N), 0, R2*sin(angle + 2 * PI / N) };
- GLfloat out[] = { 0, 0, 0 };
- WektNorm(p1, p2, p3, out, 'b', norm1);
- if (wektory == 1) {
- glVertex3f(r*cos(angle), 0, r*sin(angle));
- glVertex3f(r*cos(angle) + out[0], 0 + out[1], r*sin(angle) + out[2]);
- }
- }
- glEnd();
- glColor3f(0, 1, 0);
- glBegin(GL_LINES);
- for (angle = 0.0; angle <= (2.0*PI + 0.01); angle += (2 * PI / N))
- {
- GLfloat p1[] = { R1*cos(angle), H, R1*sin(angle) };
- GLfloat p2[] = { R1*cos(angle + 2 * PI / N), H, R1*sin(angle + 2 * PI / N) };
- GLfloat p3[] = { r*cos(angle + 2 * PI / N), 0, r*sin(angle + 2 * PI / N) };
- GLfloat out[] = { 0, 0, 0 };
- WektNorm(p1, p2, p3, out, 'b', norm2);
- if (wektory == 1) {
- glVertex3f(R1*cos(angle), H, R1*sin(angle));
- glVertex3f(R1*cos(angle) + out[0], H + out[1], R1*sin(angle) + out[2]);
- }
- }
- glEnd();
- glColor3f(1, 0, 0);
- glBegin(GL_LINES);
- for (angle = 0.0; angle <= (2.0*PI + 0.01); angle += (2 * PI / N))
- {
- GLfloat p1[] = { R2*cos(angle), 0, R2*sin(angle) };
- GLfloat p2[] = { R2*cos(angle + 2 * PI / N), 0, R2*sin(angle + 2 * PI / N) };
- GLfloat p3[] = { R1*cos(angle + 2 * PI / N), H, R1*sin(angle + 2 * PI / N) };
- GLfloat out[] = { 0, 0, 0 };
- WektNorm(p1, p2, p3, out, 'b', norm3);
- if (wektory == 1) {
- glVertex3f(R2*cos(angle), 0, R2*sin(angle));
- glVertex3f(R2*cos(angle) + out[0], 0 + out[1], R2*sin(angle) + out[2]);
- }
- }
- glEnd();
- }
- void WektNorm(GLfloat* p1, GLfloat* p2, GLfloat* p3, GLfloat* out, char flip, GLfloat* norm)
- {
- double l;
- GLfloat a[3], b[3];
- a[0] = p3[0] - p1[0];
- a[1] = p3[1] - p1[1];
- a[2] = p3[2] - p1[2];
- b[0] = p2[0] - p1[0];
- b[1] = p2[1] - p1[1];
- b[2] = p2[2] - p1[2];
- out[0] = (a[1] * b[2]) - (a[2] * b[1]);
- out[1] = (a[2] * b[0]) - (a[0] * b[2]);
- out[2] = (a[0] * b[1]) - (a[1] * b[0]);
- l = sqrt(out[0] * out[0] + out[1] * out[1] + out[2] * out[2]);
- out[0] /= l;
- out[1] /= l;
- out[2] /= l;
- if (flip == 'a')
- {
- out[0] = -out[0];
- out[1] = -out[1];
- out[2] = -out[2];
- }
- norm[0] = out[0];
- norm[1] = out[1];
- norm[2] = out[2];
- }
- void WlaczOswietlenie(void) {
- // Odblokowanie oswietlenia
- glEnable(GL_LIGHTING);
- if (light1 == 1) glEnable(GL_LIGHT1);
- else glDisable(GL_LIGHT1);
- if (light2 == 1) glEnable(GL_LIGHT2);
- else glDisable(GL_LIGHT2);
- // Inicjowanie zrodla swiatla
- glPushMatrix();
- orbita = gluNewQuadric();
- gluQuadricDrawStyle(orbita, GLU_LINE);
- glRotatef(90.0, 1, 0, 0);
- glRotatef(kat0X, 1, 0, 0);
- gluDisk(orbita, promRef, promRef, 100, 100);
- glRotatef(-90.0, 1, 0, 0);
- glColor3f(1, 1, 1);
- glRotatef(obrot, 0, 1, 0);
- glTranslatef(promRef, 0, 0);
- glutSolidSphere(0.25, 50, 50);
- obrot += predKat;
- // Inicjowanie zrodla swiatla
- glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo[0]);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo[1]);
- glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo[2]);
- glLightfv(GL_LIGHT1, GL_POSITION, swiatlo[3]);
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo[4]);
- glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, swiatlo[5][0]);
- glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, swiatlo[6][0]);
- glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, swiatlo[7][0]);
- glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, swiatlo[8][0]);
- glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, swiatlo[9][0]);
- glPopMatrix();
- glLightfv(GL_LIGHT2, GL_AMBIENT, swiatlo1[0]);
- glLightfv(GL_LIGHT2, GL_DIFFUSE, swiatlo1[1]);
- glLightfv(GL_LIGHT2, GL_SPECULAR, swiatlo1[2]);
- glLightfv(GL_LIGHT2, GL_POSITION, swiatlo1[3]);
- glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, swiatlo1[4]);
- glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, swiatlo1[5][0]);
- glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, swiatlo1[6][0]);
- glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, swiatlo1[7][0]);
- glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, swiatlo1[8][0]);
- glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, swiatlo1[9][0]);
- }
- ////////////////////////////////////
- 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, int r)
- {
- 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, 1.0, 1.0);
- sprintf_s(buf, "Pierscien:");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT-65);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, "Swiatlo:");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 80);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, " - Swiatlo pierwsze (klawisz v) - %d", light1);
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 95);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, " - Promien orbity (klawisze t, T) - %d", promRef);
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 110);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, " - Predkosc swiatla 1 (klawisze u, U) - %d", predKat);
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 125);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, " - Kat nachylenia orbity (klawisze y, Y) - %d", kat0X);
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 140);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, " - Swiatlo drugie (klawisz b) - %d", light2);
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 155);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, "Material - %d (klawisze 3-5)", material);
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 175);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, "Tryb rysowania bryly (klawisz c): %d", trybRys);
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 195);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, "Tryb cieniowania bryly (klawisz f): %d", trybCien);
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 215);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- sprintf_s(buf, "Zmiana podzialow bryly zwieksz/zmniejsz =/+");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 235);
- 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);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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 wektorow
- //Wlaczenie oswietlenia
- WlaczOswietlenie();
- //Wlaczenie materialow
- DefiniujMaterial();
- // Narysowanie szescianu
- RysujPierscien();
- //Rysowanie menu
- RysujNakladke(N, r);
- // 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 == 27)
- exit(0);
- else if (klawisz == '1')
- OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC > odlmin) ? OBSERWATOR_ODLEGLOSC - 1.0 : OBSERWATOR_ODLEGLOSC;
- else if (klawisz == '2')
- OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC < odlmax) ? OBSERWATOR_ODLEGLOSC + 1.0 : OBSERWATOR_ODLEGLOSC;
- else if (klawisz == 'w')
- OBSERWATOR_OBROT_X = OBSERWATOR_OBROT_X + 1.0;
- else if (klawisz == 's')
- OBSERWATOR_OBROT_X = OBSERWATOR_OBROT_X - 1.0;
- else if (klawisz == 'a')
- OBSERWATOR_OBROT_Y = OBSERWATOR_OBROT_Y + 1.0;
- else if (klawisz == 'd')
- OBSERWATOR_OBROT_Y = OBSERWATOR_OBROT_Y - 1.0;
- else if (klawisz == 'q')
- OBSERWATOR_OBROT_Z = OBSERWATOR_OBROT_Z + 1.0;
- else if (klawisz == 'e')
- OBSERWATOR_OBROT_Z = OBSERWATOR_OBROT_Z - 1.0;
- else if (klawisz == 'z')
- N = (N >= 6) ? N - 2.0 : N;
- else if (klawisz == 'x')
- N = (N <= 62) ? N + 2.0 : N;
- else if (klawisz == 'c') {
- trybRys = (trybRys == 1) ? 0 : 1;
- if (trybRys == 1) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- else glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- }
- else if (klawisz == 'v')
- light1 = light1 == 0 ? 1 : 0;
- else if (klawisz == 'b')
- light2 = light2 == 0 ? 1 : 0;
- else if (klawisz == '3')
- material = 1;
- else if (klawisz == '4')
- material = 2;
- else if (klawisz == '5')
- material = 3;
- else if (klawisz == 'f') {
- trybCien = trybCien == 0 ? 1 : 0;
- if (trybCien == 0) glShadeModel(GL_SMOOTH);
- else glShadeModel(GL_FLAT);
- }
- else if (klawisz == 't')
- promRef = (promRef < 20) ? promRef + 1 : promRef;
- else if (klawisz == 'T')
- promRef = (promRef > 1) ? promRef - 1 : promRef;
- else if (klawisz == 'u')
- predKat = (predKat < 3) ? predKat + 1 : predKat;
- else if (klawisz == 'U')
- predKat = (predKat > 1) ? predKat - 1 : predKat;
- else if (klawisz == 'y')
- kat0X -= 1;
- else if (klawisz == 'Y')
- kat0X += 1;
- else if (klawisz == '+')
- {
- liczbaPodzialow = (liczbaPodzialow > 4) ? liczbaPodzialow - 1 : liczbaPodzialow;
- dAlpha = 360.0 / liczbaPodzialow;
- }
- else if (klawisz == '=')
- {
- liczbaPodzialow = (liczbaPodzialow < 64) ? liczbaPodzialow + 1 : liczbaPodzialow;
- dAlpha = 360.0 / liczbaPodzialow;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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).
- // 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