Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <gl\glew.h>
- #include <gl\glut.h>
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>
- //doby oběhu
- #define MERKUR 88
- #define VENUSE 225
- #define ZEME 365
- #define MARS 687
- #define JUPITER 4331
- #define SATURN 10759
- #define URAN 30799
- #define NEPTUN 60190
- #define MESIC 28
- //průměry (násobky země 6378km)
- #define RSLUNCE 5
- #define RMERKUR 0.383
- #define RVENUSE 0.949
- #define RZEME 1
- #define RMARS 0.533
- #define RJUPITER 11.209
- #define RSATURN 9.449
- #define RURAN 4.007
- #define RNEPTUN 3.883
- //vzdálenost od slunce (AU 149597871km)
- #define DISTANCE 10
- #define DSLUNCE 0
- #define DMERKUR (RSLUNCE + RMERKUR + 0.4*DISTANCE)
- #define DVENUSE (DMERKUR + RVENUSE + 0.7*DISTANCE)
- #define DZEME (DVENUSE + RZEME + DISTANCE)
- #define DMARS (DZEME + RMARS + 1.5*DISTANCE)
- #define DJUPITER (DMARS + RJUPITER + 5.2*DISTANCE)
- #define DSATURN (DJUPITER + RSATURN + 9.5*DISTANCE)
- #define DURAN (DSATURN + RURAN + 19.6*DISTANCE)
- #define DNEPTUN (DURAN + RNEPTUN + 30*DISTANCE)
- //textury
- GLuint textures[10];
- //konstanta pro převod AU na násobky
- //průměru země
- #define AU2ER 23455.295
- //definice PI
- #define PI 3.14159
- //globální proměnné
- const float DEG2RAD = 3.14159/180;
- enum { // operace, ktere se mohou provadet s mysi:
- ROTATE, // rotace objektu
- TRANSLATE, // posun objektu
- } operation=ROTATE;
- int xnew=0, ynew=0, znew=20; // soucasna pozice mysi, ze ktere se pocitaji rotace a posuvy
- int xold=0, yold=0, zold=20; // minula pozice mysi, ze ktere se pocitaji rotace a posuvy
- int xx, yy, zz; // bod, ve kterem se nachazi kurzor mysi
- int timerInterval=50;
- float uhel = 0;
- //9polozek
- float uhly[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
- float citac[] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
- int windowWidth; // sirka okna
- int windowHeight; // vyska okna
- //---------------------------------------------------------------------
- // Materiály
- //---------------------------------------------------------------------
- // paramatry materialu1
- GLfloat materialAmbient1[]={0.0f, 0.0f, 0.0f, 1.0f}; // ambientni slozka barvy materialu
- GLfloat materialDiffuse1[]={1.0f, 1.0f, 1.0f, 1.0f}; // difuzni slozka barvy materialu
- GLfloat materialSpecular1[]={1.0f,1.0f, 1.0f, 1.0f}; // barva odlesku
- GLfloat materialEmission1[] = {1.0,1.0,1.0,1.0}; // emise bílého světla
- GLfloat materialShininess1[]={50.0f}; // faktor odlesku
- // paramatry materialu2
- GLfloat materialEmission2[] = {0.3,0.3,0.3,1.0};
- //---------------------------------------------------------------------
- // Světla
- //---------------------------------------------------------------------
- //parametry svetla1
- GLfloat light_position1[]={0.0f, 0.0f, 0.0f, 1.0f}; // pozice svetla: nula na konci->smerove svetlo
- GLfloat lightDiffuse1[]={1.0f, 1.0f, 1.0f, 1.0f}; // difuzni slozka barvy
- GLfloat lightSpecular1[]={1.0f,1.0f, 1.0f, 1.0f}; // barva odlesku
- GLfloat lightAmbient1[]={0.0f, 0.0f, 0.0f, 1.0f}; // ambientní složka
- //---------------------------------------------------------------------
- // Pomocné funkce
- //---------------------------------------------------------------------
- void SetMaterial1(void){
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, materialAmbient1); // nastaveni ambientni slozky barvy materialu
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, materialDiffuse1); // nastaveni difuzni slozky barvy materialu
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, materialSpecular1); // nastaveni barvy odlesku
- glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, materialEmission1); // nastaveni barevne emise
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, materialShininess1); // nastaveni faktoru odlesku
- }
- void SetMaterial2(void){
- glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, materialEmission2);
- }
- void SetLight1(void){
- glLightfv(GL_LIGHT0,GL_POSITION,light_position1);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,lightDiffuse1);
- glLightfv(GL_LIGHT0,GL_AMBIENT,lightAmbient1);
- glLightfv(GL_LIGHT0,GL_SPECULAR,lightSpecular1);
- //glEnable(GL_LIGHT0);
- }
- //---------------------------------------------------------------------
- // Nacteni bitmapy ze souboru typu BMP
- //---------------------------------------------------------------------
- int bitmapLoad(int texture, const char *filename)
- {
- FILE *fin;
- int width, height, bpp=0;
- int size;
- unsigned char *bitmap;
- unsigned char bmpHeader[54]={0x42, 0x4d, // magicke cislo souboru BMP
- 0x00, 0x00, 0x00, 0x00, // velikost souboru
- 0x00, 0x00, 0x00, 0x00, // rezervovano, vzdy nastaveno na nula
- 0x36, 0x04, 0x00, 0x00, // data offset=54
- 0x28, 0x00, 0x00, 0x00, // velikost hlavicky=40
- 0x00, 0x00, 0x00, 0x00, // sirka obrazku v pixelech=?
- 0x00, 0x00, 0x00, 0x00, // vyska obrazku v pixelech=?
- 0x01, 0x00, // pocet bitovych rovin=1
- 0x08, 0x00, // pocet bitu na pixel=24
- 0x00, 0x00, 0x00, 0x00, // metoda komprimace=nic
- 0x00, 0x00, 0x00, 0x00, // velikost bitmapy
- 0x00, 0x00, 0x00, 0x00, // pocet pixelu na metr v horizontalnim smeru
- 0x00, 0x00, 0x00, 0x00, // pocet pixelu na metr ve vertikalnim smeru
- 0x00, 0x00, 0x00, 0x00, // pocet pouzitych barev
- 0x00, 0x00, 0x00, 0x00, // pocet dulezitych barev
- };
- if (!filename) return -1;
- fin=fopen(filename, "rb");
- if (!fin) return -1; // otevreni souboru se nezdarilo
- if (fread(bmpHeader, 54, 1, fin)!=1) return -1; // nacist hlavicku BMP souboru
- memcpy(&width, bmpHeader+18, 4); // sirka obrazku v pixelech
- memcpy(&height, bmpHeader+22, 4); // vyska obrazku v pixelech
- memcpy(&bpp, bmpHeader+28, 2); // pocet bitu na pixel
- if (bpp!=24) return -1;
- size=width*height*3;
- bitmap=(unsigned char *)malloc(size*sizeof(unsigned char));
- if (fread(bitmap, size, sizeof(unsigned char), fin)!=1) return -1;// nacteni rastrovych dat
- fclose(fin);
- glBindTexture(GL_TEXTURE_2D, texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height,// nacteni textury do GPU
- 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, bitmap);
- free(bitmap);
- return 0;
- }
- //---------------------------------------------------------------------
- // Nacteni a vytvoreni vsech textur
- //---------------------------------------------------------------------
- int loadTextures(void)
- {
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // zpusob ulozeni bytu v texure
- glGenTextures(5, textures); // vytvoreni jmena textur
- if (bitmapLoad(textures[0], "D:\\sun.bmp")) exit(0);
- if (bitmapLoad(textures[1], "D:\\mercury.bmp")) exit(0);
- if (bitmapLoad(textures[2], "D:\\venus.bmp")) exit(0);
- if (bitmapLoad(textures[3], "D:\\moon.bmp")) exit(0);
- if (bitmapLoad(textures[4], "D:\\earth.bmp")) exit(0);
- if (bitmapLoad(textures[5], "D:\\mars.bmp")) exit(0);
- }
- //---------------------------------------------------------------------
- // Funkce pro inicializaci vykreslovani
- //---------------------------------------------------------------------
- void onInit(void)
- {
- glClearColor(0.0, 0.0, 0.0, 0.0); // barva pro mazani color-bufferu
- glShadeModel(GL_SMOOTH); // nastaveni stinovaciho rezimu
- loadTextures(); // nacist vsechny textury
- glClearDepth(1.0f); // barva pro mazani z-bufferu
- glEnable(GL_DEPTH_TEST); // nastaveni funkce pro testovani hodnot v z-bufferu
- glDepthFunc(GL_LESS); // kterou funkci vybrat pro testovani z-bufferu
- glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);// vylepseni zobrazovani textur
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); // nastaveni vykresleni vyplnenych polygonu
- //glPointSize(10.0); // nastaveni velikosti vykreslovanych bodu
- glEnable(GL_POINT_SMOOTH);
- glEnable(GL_LINE_SMOOTH);
- //glutSetCursor(GLUT_CURSOR_NONE);
- glEnable(GL_LIGHTING); // globalni povoleni stinovani
- glEnable(GL_COLOR_MATERIAL);
- //SetMaterial1();
- SetLight1();
- }
- //---------------------------------------------------------------------
- // 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
- windowWidth=w; // zapamatovat si velikost okna
- windowHeight=h;
- }
- //---------------------------------------------------------------------
- // Nastaveni perspektivni projekce
- //---------------------------------------------------------------------
- void setPerspectiveProjection(void)
- {
- glMatrixMode(GL_PROJECTION); // zacatek modifikace projekcni matice
- glLoadIdentity(); // vymazani projekcni matice (=identita)
- gluPerspective(70.0, (double)windowWidth/(double)windowHeight, 0.1f, 999999999.0f);// nastaveni perspektivni kamery
- glMatrixMode(GL_MODELVIEW); // bude se menit modelova matice
- glLoadIdentity(); // nahrat jednotkovou matici
- }
- //--------------------------------------------------------------------
- // Kruh
- //--------------------------------------------------------------------
- void drawCircle(float radius){
- int i;
- float degInRad;
- glBegin(GL_LINE_LOOP);
- for(i=0;i<360;i++){
- //glColor3d(1.0,0.0,0.0);
- degInRad = i* DEG2RAD;
- glVertex3f(cos(degInRad)*radius,0,sin(degInRad)*radius);
- }
- glEnd();
- }
- //--------------------------------------------------------------------
- // Koule
- //--------------------------------------------------------------------
- float GetAnglePi(int citatel, int jmenovatel){
- return (((float)(citatel-1))/(float)jmenovatel)*PI;
- }
- float GetAngleTwoPi(int citatel, int jmenovatel){
- return (((float)(citatel-1))/(float)jmenovatel)*2*PI;
- }
- float GetRatio(int level, int complete){
- return ((float)level/(float)complete);
- }
- void Ball(int rovnobezek, int poledniku,GLuint textura){
- int i,j;
- float x1,x2,x3,x4;
- float y1,y2,y3,y4;
- float z1,z2,z3,z4;
- float radian1,radian2,radian3,radian4;
- for (i=1;i<=rovnobezek+1;i++){
- radian1 = GetAnglePi(i-1,rovnobezek);
- radian2 = GetAnglePi(i,rovnobezek);
- for (j=1;j<=poledniku;j++){
- radian3 = GetAngleTwoPi(j-1,poledniku);
- radian4 = GetAngleTwoPi(j,poledniku);
- x1 = 0 + ( cos(radian3) * sin(radian1));
- y1 = 0 + ( sin(radian3) * sin(radian1));
- z1 = 0 + ( cos(radian1));
- x2 = 0 + ( cos(radian4) * sin(radian1));
- y2 = 0 + ( sin(radian4) * sin(radian1));
- z2 = 0 + ( cos(radian1));
- x3 = 0 + ( cos(radian4) * sin(radian2));
- y3 = 0 + ( sin(radian4) * sin(radian2));
- z3 = 0 + ( cos(radian2));
- x4 = 0 + ( cos(radian3) * sin(radian2));
- y4 = 0 + ( sin(radian3) * sin(radian2));
- z4 = 0 + ( cos(radian2));
- glPushMatrix();
- glBindTexture(GL_TEXTURE_2D,textura);
- glTexParameterf(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MIN_FILTER,GL_COMBINE);
- glBegin(GL_TRIANGLES);
- glNormal3f(x1,y1,z1);
- glTexCoord2f(GetRatio(j-1,poledniku),GetRatio(i-1,rovnobezek));
- glVertex3f(x1,y1,z1);
- glNormal3f(x3,y3,z3);
- glTexCoord2f(GetRatio(j,poledniku),GetRatio(i,rovnobezek));
- glVertex3f(x3,y3,z3);
- glNormal3f(x4,y4,z4);
- glTexCoord2f(GetRatio(j-1,poledniku),GetRatio(i,rovnobezek));
- glVertex3f(x4,y4,z4);
- glNormal3f(x2,y2,z2);
- glTexCoord2f(GetRatio(j,poledniku),GetRatio(i-1,rovnobezek));
- glVertex3f(x2,y2,z2);
- glNormal3f(x3,y3,z3);
- glTexCoord2f(GetRatio(j,poledniku),GetRatio(i,rovnobezek));
- glVertex3f(x3,y3,z3);
- glNormal3f(x1,y1,z1);
- glTexCoord2f(GetRatio(j-1,poledniku),GetRatio(i-1,rovnobezek));
- glVertex3f(x1,y1,z1);
- glEnd();
- glPopMatrix();
- }
- }
- }
- //--------------------------------------------------------------------
- // Planetky
- //--------------------------------------------------------------------
- void Planet(double radius,GLuint textura){
- glEnable(GL_TEXTURE_2D);
- glPushMatrix();
- glRotatef(90,1,0,0);
- glScaled(radius,radius,radius);
- Ball(50,50,textura);
- glPopMatrix();
- glDisable(GL_TEXTURE_2D);
- }
- void Sun()
- {
- SetMaterial1();
- glPushMatrix();
- glRotated(uhel,0,1,0);
- Planet(35,textures[0]);
- glPopMatrix();
- SetMaterial2();
- }
- void Mercury(float distance){
- //glColor3f(0.5,0.5,0.5);
- drawCircle(distance);
- glPushMatrix();
- //rotace kolem slunce
- glRotated(uhly[0],0,1,0);
- glTranslatef(distance,0,0);
- glPushMatrix();
- //rotace kolem osy
- glRotated(uhel,0,1,0);
- Planet(4,textures[1]);
- glPopMatrix();
- glPopMatrix();
- }
- void Venus(float distance){
- //glColor3f(0.5,0.5,0.5);
- drawCircle(distance);
- glPushMatrix();
- //rotace kolem slunce
- glRotated(uhly[1],0,1,0);
- glTranslatef(distance,0,0);
- glPushMatrix();
- //rotace kolem osy
- glRotated(uhel,0,1,0);
- Planet(10,textures[2]);
- glPopMatrix();
- glPopMatrix();
- }
- void Moon(float distance){
- drawCircle(distance);
- glPushMatrix();
- //rotace kolem země
- glRotatef(uhly[3],0,1,0);
- glTranslatef(distance,0,0);
- glPushMatrix();
- glRotated(uhel,0,1,0);
- Planet(4,textures[3]);
- glPopMatrix();
- glPopMatrix();
- }
- void Earth(float distance){
- //glColor3f(0.5,0.5,0.5);
- drawCircle(distance);
- glPushMatrix();
- //rotace kolem slunce
- glRotated(uhly[2],0,1,0);
- glTranslatef(distance,0,0);
- glPushMatrix();
- glRotated(uhel,0,1,0);
- glPushMatrix();
- glRotatef(180,0,1,0);
- Planet(10,textures[4]);
- glPopMatrix();
- glPopMatrix();
- Moon(24);
- glPopMatrix();
- }
- void Mars(float distance){
- //glColor3f(0.5,0.5,0.5);
- drawCircle(distance);
- glPushMatrix();
- //rotace kolem slunce
- glRotated(uhly[1],0,1,0);
- glTranslatef(distance,0,0);
- glPushMatrix();
- //rotace kolem osy
- glRotated(uhel,0,1,0);
- Planet(5.3,textures[5]);
- glPopMatrix();
- glPopMatrix();
- }
- //--------------------------------------------------------------------
- // Tato funkce je volana pri kazdem prekresleni okna
- //--------------------------------------------------------------------
- void onDisplay(void)
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// vymazani barvoveho a z-bufferu
- setPerspectiveProjection(); // nastaveni perspektivni kamery
- glTranslatef(0.0f, 0.0f, -50.0f); // posun objektu dale od kamery
- glTranslatef(0.0f, 0.0f, znew); // priblizeni ci vzdaleni objektu podle pohybu kurzoru mysi
- glRotatef(ynew, 1.0f, 0.0f, 0.0f); // rotace objektu podle pohybu kurzoru mysi
- glRotatef(xnew, 0.0f, 1.0f, 0.0f);
- glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
- glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
- //glDisable(GL_LIGHTING);
- //glMaterialfv(GL_FRONT,GL_EMISSION,materialEmission1);
- glEnable(GL_LIGHTING);
- //glMaterialfv(GL_FRONT,GL_EMISSION,materialEmission2);
- Mercury(75);
- Venus(125);
- Earth(175);
- Mars(225);
- glFlush();
- Sun();
- glutSwapBuffers(); // a prohozeni predniho a zadniho bufferu
- }
- //---------------------------------------------------------------------
- // Tato funkce je volana pri stlaceni ASCII klavesy
- //---------------------------------------------------------------------
- void onKeyboard(unsigned char key, int x, int y)
- {
- switch (key) {
- case 27: exit(0); break; // ukonceni aplikace
- case 'q': exit(0); break; // ukonceni aplikace
- default: break;
- }
- }
- //---------------------------------------------------------------------
- // Tato funkce je volana pri preruseni casovacem
- //---------------------------------------------------------------------
- void onTimer(int value){
- int i;
- float inkrement;
- inkrement = 0.2;
- uhel+=inkrement;
- for(i = 0; i < 9; i++){
- citac[i]+=inkrement;
- }
- if(uhel >= 360) uhel-=360;
- if(citac[0]>=MERKUR) citac[0]-=MERKUR;
- if(citac[1]>=VENUSE) citac[1]-=VENUSE;
- if(citac[2]>=ZEME) citac[2]-=ZEME;
- if(citac[3]>=MESIC) citac[3]-=MESIC;
- if(citac[4]>=MARS) citac[4]-=MARS;
- if(citac[5]>=JUPITER) citac[5]-=JUPITER;
- if(citac[6]>=SATURN) citac[6]-=SATURN;
- if(citac[7]>=URAN) citac[7]-=URAN;
- if(citac[8]>=NEPTUN) citac[8]-=NEPTUN;
- uhly[0] = (citac[0]/(float)MERKUR)*360;
- uhly[1] = (citac[1]/(float)VENUSE)*360;
- uhly[2] = (citac[2]/(float)ZEME)*360;
- uhly[3] = (citac[3]/(float)MESIC)*360;
- uhly[4] = (citac[4]/(float)MARS)*360;
- uhly[5] = (citac[5]/(float)JUPITER)*360;
- uhly[6] = (citac[6]/(float)SATURN)*360;
- uhly[7] = (citac[7]/(float)URAN)*360;
- uhly[8] = (citac[8]/(float)NEPTUN)*360;
- glutPostRedisplay();
- glutTimerFunc(timerInterval, onTimer, value); // znovu pustit casovac
- }
- //---------------------------------------------------------------------
- // Tato funkce je volana pri stisku ci pusteni tlacitka mysi
- //---------------------------------------------------------------------
- void onMouseButton(int button, int state, int x, int y)
- {
- if (button==GLUT_LEFT_BUTTON) { // pri zmene stavu leveho tlacitka
- operation=ROTATE;
- if (state==GLUT_DOWN) { // pri stlaceni tlacitka
- xx=x; // zapamatovat pozici kurzoru mysi
- yy=y;
- }
- else { // pri pusteni tlacitka
- xold=xnew; // zapamatovat novy pocatek
- yold=ynew;
- }
- glutPostRedisplay(); // prekresleni sceny
- }
- if (button==GLUT_RIGHT_BUTTON) {
- operation=TRANSLATE;
- if (state==GLUT_DOWN) zz=y; // pri stlaceni tlacitka zapamatovat polohu kurzoru mysi
- else zold=znew; // pri pusteni tlacitka zapamatovat novy pocatek
- glutPostRedisplay(); // prekresleni sceny
- }
- }
- //---------------------------------------------------------------------
- // Tato funkce je volana pri pohybu mysi se stlacenym tlacitkem.
- // To, ktere tlacitko je stlaceno si musime predem zaznamenat do
- // globalni promenne stav ve funkci onMouseButton()
- //---------------------------------------------------------------------
- void onMouseMotion(int x, int y)
- {
- switch (operation) {
- case ROTATE: // stav rotace objektu
- xnew=xold+x-xx; // vypocitat novou pozici
- ynew=yold+y-yy;
- glutPostRedisplay(); // a prekreslit scenu
- break;
- case TRANSLATE: // stav priblizeni/oddaleni objektu
- znew=zold+y-zz; // vypocitat novou pozici
- glutPostRedisplay(); // a prekreslit scenu
- break;
- }
- }
- //---------------------------------------------------------------------
- // Hlavni funkce konzolove aplikace
- //---------------------------------------------------------------------
- int main(int argc, char **argv)
- {
- glutInit(&argc, argv); // inicializace knihovny GLUT
- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);// nastaveni dvou barvovych bufferu a pameti hloubky
- glutInitWindowPosition(30, 30); // pocatecni pozice leveho horniho rohu okna
- glutInitWindowSize(500, 500); // pocatecni velikost okna
- glutCreateWindow("Projekt"); // 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
- glutMouseFunc(onMouseButton); // registrace funkce volane pri stlaceni ci pusteni tlacitka
- glutMotionFunc(onMouseMotion); // registrace funkce volane pri pohybu mysi se stlacenym tlacitkem
- glutTimerFunc(timerInterval,onTimer,timerInterval);
- onInit(); // inicializace vykreslovani
- glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce
- return 0; // navratova hodnota vracena operacnimu systemu
- }
- //---------------------------------------------------------------------
- // Konec zdrojoveho souboru
- //------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement