Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*---------------------------
- Rubiks Cube in openGL and C++
- Gorjan Jovanovski
- jovanovski@gorjan.info
- www.gorjan.info
- ---------------------------*/
- #include <stdio.h>
- #include <windows.h>
- #include <stdarg.h>
- #include <math.h>
- #define GL_GLEXT_PROTOTYPES
- #include <GL/glut.h>
- #include <iostream>
- using namespace std;
- void display();
- void specialKeys();
- //Pocetna rotacija
- double rotate_y=135;
- double rotate_x=-45;
- //Poceten prostor
- float prostor = 0.1;
- //Poceten broj na kocki
- int brojnakocki = 3;
- //Poceten selektor
- float selx, sely, selz;
- int selo=1;
- int selpoz=2;
- //Poceten zoom
- int zoom = 10;
- //Pocetno nepopuneta matrica za rotacija
- bool napravena = false;
- class Cube2
- {
- public:
- //Koordinati na sekoj od 8te kjosevi
- float x1,y1,z1;
- float x2,y2,z2;
- float x3,y3,z3;
- float x4,y4,z4;
- float x5,y5,z5;
- float x6,y6,z6;
- float x7,y7,z7;
- float x8,y8,z8;
- //Indeks na kockata, ne se koristi
- int z;
- //Rotacija na kockata, se koristat za animacija
- float rotx, roty, rotz;
- //Boenje na stranite na kockite
- int tops=7, bottoms=7, lefts=7, rights=7, fronts=7, backs=7;
- Cube2()
- {
- }
- //Za animacijata
- void setRotation(float x, float y, float z)
- {
- this->rotx = x;
- this->roty = y;
- this->rotz = z;
- }
- //Postavuvanje na kockata na odredeni koordinati
- void setCube(float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3,float x4,float y4,float z4,float x5,float y5,float z5,float x6,float y6,float z6,float x7,float y7,float z7,float x8,float y8,float z8)
- {
- this->x1=x1;
- this->y1=y1;
- this->z1=z1;
- this->x2=x2;
- this->y2=y2;
- this->z2=z2;
- this->x3=x3;
- this->y3=y3;
- this->z3=z3;
- this->x4=x4;
- this->y4=y4;
- this->z4=z4;
- this->x5=x5;
- this->y5=y5;
- this->z5=z5;
- this->x6=x6;
- this->y6=y6;
- this->z6=z6;
- this->x7=x7;
- this->y7=y7;
- this->z7=z7;
- this->x8=x8;
- this->y8=y8;
- this->z8=z8;
- this->drawCube();
- }
- //Iscrtuvanje na kockata
- void drawCube()
- {
- glPushMatrix();
- glRotatef(rotx,1,0,0);
- glRotatef(roty,0,1,0);
- glRotatef(rotz,0,0,1);
- //bela - 1 - glColor3f(1, 1, 1);
- //crvena - 2 - glColor3f( 1.0, 0, 0 );
- //zuta - 3 - glColor3f( 1.0, 1.0, 0.0 );
- //plava - 4 - glColor3f( 0.0, 0.0, 1.0 );
- //zelena - 5 - glColor3f( 0.0, 1.0, 0.0 );
- //portokalova - 6 - glColor3f( 1.0, 0.5, 0.0 );
- //crna - 7 - glColor3f(0,0,0);
- //ZADNA STRANA
- switch (backs)
- {
- case 1:
- glColor3f(1, 1, 1);
- break;
- case 2:
- glColor3f(1, 0, 0);
- break;
- case 3:
- glColor3f(1, 1, 0);
- break;
- case 4:
- glColor3f(0, 0, 1);
- break;
- case 5:
- glColor3f(0, 1, 0);
- break;
- case 6:
- glColor3f(1, 0.5, 0);
- break;
- case 7:
- glColor3f(0,0,0);
- break;
- }
- glBegin(GL_POLYGON);
- glVertex3f( x1, y1, z1 ); // P1 is red
- glVertex3f( x2, y2, z2 ); // P2 is green
- glVertex3f( x6, y6, z6 ); // P2 is green
- glVertex3f( x5, y5, z5 ); // P2 is green
- glEnd();
- //Napred
- glBegin(GL_POLYGON);
- switch (fronts)
- {
- case 1:
- glColor3f(1, 1, 1);
- break;
- case 2:
- glColor3f(1, 0, 0);
- break;
- case 3:
- glColor3f(1, 1, 0);
- break;
- case 4:
- glColor3f(0, 0, 1);
- break;
- case 5:
- glColor3f(0, 1, 0);
- break;
- case 6:
- glColor3f(1, 0.5, 0);
- break;
- case 7:
- glColor3f(0,0,0);
- break;
- }
- glVertex3f( x4, y4, z4 ); // P1 is red
- glVertex3f( x3, y3, z3 ); // P2 is green
- glVertex3f( x7, y7, z7 ); // P2 is green
- glVertex3f( x8, y8, z8 ); // P2 is green
- glEnd();
- //Levo
- glBegin(GL_POLYGON);
- switch (lefts)
- {
- case 1:
- glColor3f(1, 1, 1);
- break;
- case 2:
- glColor3f(1, 0, 0);
- break;
- case 3:
- glColor3f(1, 1, 0);
- break;
- case 4:
- glColor3f(0, 0, 1);
- break;
- case 5:
- glColor3f(0, 1, 0);
- break;
- case 6:
- glColor3f(1, 0.5, 0);
- break;
- case 7:
- glColor3f(0,0,0);
- break;
- }
- glVertex3f( x2, y2, z2 ); // P1 is red
- glVertex3f( x3, y3, z3 ); // P2 is green
- glVertex3f( x7, y7, z7 ); // P2 is green
- glVertex3f( x6, y6, z6 ); // P2 is green
- glEnd();
- //Desno
- glBegin(GL_POLYGON);
- switch (rights)
- {
- case 1:
- glColor3f(1, 1, 1);
- break;
- case 2:
- glColor3f(1, 0, 0);
- break;
- case 3:
- glColor3f(1, 1, 0);
- break;
- case 4:
- glColor3f(0, 0, 1);
- break;
- case 5:
- glColor3f(0, 1, 0);
- break;
- case 6:
- glColor3f(1, 0.5, 0);
- break;
- case 7:
- glColor3f(0,0,0);
- break;
- }
- glVertex3f( x1, y1, z1 ); // P1 is red
- glVertex3f( x4, y4, z4 ); // P2 is green
- glVertex3f( x8, y8, z8 ); // P2 is green
- glVertex3f( x5, y5, z5 ); // P2 is green
- glEnd();
- //Dole
- glBegin(GL_POLYGON);
- switch (bottoms)
- {
- case 1:
- glColor3f(1, 1, 1);
- break;
- case 2:
- glColor3f(1, 0, 0);
- break;
- case 3:
- glColor3f(1, 1, 0);
- break;
- case 4:
- glColor3f(0, 0, 1);
- break;
- case 5:
- glColor3f(0, 1, 0);
- break;
- case 6:
- glColor3f(1, 0.5, 0);
- break;
- case 7:
- glColor3f(0,0,0);
- break;
- }
- glVertex3f( x6, y6, z6 ); // P1 is red
- glVertex3f( x7, y7, z7 ); // P2 is green
- glVertex3f( x8, y8, z8 ); // P2 is green
- glVertex3f( x5, y5, z5 ); // P2 is green
- glEnd();
- //Gore
- glBegin(GL_POLYGON);
- switch (tops)
- {
- case 1:
- glColor3f(1, 1, 1);
- break;
- case 2:
- glColor3f(1, 0, 0);
- break;
- case 3:
- glColor3f(1, 1, 0);
- break;
- case 4:
- glColor3f(0, 0, 1);
- break;
- case 5:
- glColor3f(0, 1, 0);
- break;
- case 6:
- glColor3f(1, 0.5, 0);
- break;
- case 7:
- glColor3f(0,0,0);
- break;
- }
- glVertex3f( x1, y1, z1 ); // P1 is red
- glVertex3f( x2, y2, z2 ); // P2 is green
- glVertex3f( x3, y3, z3 ); // P2 is green
- glVertex3f( x4, y4, z4 ); // P2 is green
- glEnd();
- glPopMatrix();
- }
- //Rotacija na boite na stranite
- void rotRight()
- {
- int tmp = fronts;
- fronts = lefts;
- lefts = backs;
- backs = rights;
- rights = tmp;
- }
- void rotLeft()
- {
- int tmp = fronts;
- fronts = rights;
- rights = backs;
- backs = lefts;
- lefts = tmp;
- }
- void rotSideLeft()
- {
- int tmp = tops;
- tops = rights;
- rights = bottoms;
- bottoms = lefts;
- lefts = tmp;
- }
- void rotSideRight()
- {
- int tmp = tops;
- tops = lefts;
- lefts = bottoms;
- bottoms = rights;
- rights = tmp;
- }
- void rotBack()
- {
- int tmp = fronts;
- fronts = bottoms;
- bottoms = backs;
- backs = tops;
- tops = tmp;
- }
- void rotFwd()
- {
- int tmp = fronts;
- fronts = tops;
- tops = backs;
- backs = bottoms;
- bottoms = tmp;
- }
- //Debug
- void print()
- {
- cout<<"x1: "<<x1<<endl;
- cout<<"y1: "<<y1<<endl;
- cout<<"z1: "<<z1<<endl;
- cout<<"x2: "<<x2<<endl;
- cout<<"y2: "<<y2<<endl;
- cout<<"z2: "<<z2<<endl;
- cout<<"x3: "<<x3<<endl;
- cout<<"y3: "<<y3<<endl;
- cout<<"z3: "<<z3<<endl;
- cout<<"x4: "<<x4<<endl;
- cout<<"y4: "<<y4<<endl;
- cout<<"z4: "<<z4<<endl;
- cout<<"x5: "<<x5<<endl;
- cout<<"y5: "<<y5<<endl;
- cout<<"z5: "<<z5<<endl;
- cout<<"x6: "<<x6<<endl;
- cout<<"y6: "<<y6<<endl;
- cout<<"z6: "<<z6<<endl;
- cout<<"x7: "<<x7<<endl;
- cout<<"y7: "<<y7<<endl;
- cout<<"z7: "<<z7<<endl;
- cout<<"x8: "<<x8<<endl;
- cout<<"y8: "<<y8<<endl;
- cout<<"z8: "<<z8<<endl;
- }
- };
- class BigCube
- {
- public:
- //Broj na kocki na eden rab
- int n;
- //Niza od kockite
- Cube2 *niza;
- //Koordinati za premetki
- int vamu;
- int tamu;
- int onamu;
- //Borjac
- int brojac = 0;
- //Paren broj na kocki?
- float parnost = 0;
- //Se koristat pri rotacii, za da se zameni kocka so druga kocka
- int** matrica;
- int** novamatrica;
- int mbroji, mbrojj;
- BigCube()
- {
- this->n = brojnakocki;
- opraviKocki();
- }
- ~BigCube()
- {
- for(int i=0; i<n*n*n; i++)
- delete &niza[i];
- delete [] niza;
- }
- //Pocetno boenje na kockata
- void colorCube()
- {
- //bela - 1 - glColor3f(1, 1, 1);
- //crvena - 2 - glColor3f( 1.0, 0, 0 );
- //zuta - 3 - glColor3f( 1.0, 1.0, 0.0 );
- //plava - 4 - glColor3f( 0.0, 0.0, 1.0 );
- //zelena - 5 - glColor3f( 0.0, 1.0, 0.0 );
- //portokalova - 6 - glColor3f( 1.0, 0.5, 0.0 );
- //crna - 7 - glColor3f(0,0,0);
- //boenje 1
- for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
- {
- for(int j=i; j<(i+brojnakocki); j++)
- {
- niza[j].tops = 6;
- }
- }
- //boenje 2
- int pluz = (brojnakocki-1)*brojnakocki;
- for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
- {
- for(int j=i; j<(i+brojnakocki); j++)
- {
- niza[j+pluz].bottoms = 5;
- }
- }
- //boenje 3
- for(int i=brojnakocki-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
- {
- niza[i].lefts = 3;
- }
- //boenje 4
- for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
- {
- niza[i].rights = 4;
- }
- //boenje 5
- for(int i=brojnakocki*brojnakocki*(brojnakocki-1); i<brojnakocki*brojnakocki*(brojnakocki-1) + brojnakocki*brojnakocki; i++)
- {
- niza[i].fronts = 2;
- }
- //boenje 6
- for(int i=brojnakocki*brojnakocki*(0); i<brojnakocki*brojnakocki*(0) + brojnakocki*brojnakocki; i++)
- {
- niza[i].backs = 1;
- }
- }
- //Funckija za rotacija na matrica za 90 stepeni
- void cyclic_roll(int &a, int &b, int &c, int &d)
- {
- int temp = a;
- a = b;
- b = c;
- c = d;
- d = temp;
- }
- //Zamena na boite na stranite na kockite sto bile rotirani
- void smeniindeksi()
- {
- Cube2 *tmpn;
- tmpn = new Cube2[n*n*n];
- for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i++)
- {
- tmpn[i] = niza[i];
- tmpn[i].setRotation(0,0,0);
- }
- for(int i=0; i<brojnakocki; i++)
- {
- for(int j=0; j<brojnakocki; j++)
- {
- cout<<"na mesto na "<<niza[matrica[i][j]].z<<" doagja "<<niza[novamatrica[i][j]].z<<endl;
- tmpn[matrica[i][j]].backs = niza[novamatrica[i][j]].backs;
- tmpn[matrica[i][j]].tops = niza[novamatrica[i][j]].tops;
- tmpn[matrica[i][j]].bottoms = niza[novamatrica[i][j]].bottoms;
- tmpn[matrica[i][j]].lefts = niza[novamatrica[i][j]].lefts;
- tmpn[matrica[i][j]].rights = niza[novamatrica[i][j]].rights;
- tmpn[matrica[i][j]].fronts = niza[novamatrica[i][j]].fronts;
- }
- }
- niza = tmpn;
- }
- //meh
- void napravimatrica()
- {
- matrica = new int*[brojnakocki];
- for(int i=0; i<brojnakocki; i++)
- {
- matrica[i] = new int[brojnakocki];
- }
- mbroji = mbrojj = 0;
- }
- //meh
- void punimatrica(int broj)
- {
- if(mbrojj==brojnakocki)
- {
- mbrojj=0;
- mbroji++;
- }
- matrica[mbroji][mbrojj] = broj;
- mbrojj++;
- }
- //meh
- void izbrisimatrica()
- {
- delete [] matrica;
- delete [] novamatrica;
- }
- //debug
- void printajmatrica()
- {
- for(int i=0; i<brojnakocki; i++)
- {
- for(int j=0; j<brojnakocki; j++)
- {
- cout<<novamatrica[i][j];
- cout<<" ";
- }
- cout<<endl;
- }
- }
- //Zemanje na matrica od indeksi na kocki sto treba da se rotiraat, i nejnino ciklicno rotiranje
- void rotirajmatica(int br)
- {
- if(selo==1) // ako e Y oska, smeni gi redicite vo matricata
- {
- int** tmpm = new int*[brojnakocki];
- for(int i=0; i<brojnakocki; i++)
- {
- tmpm[i] = new int[brojnakocki];
- }
- for(int i=brojnakocki-1; i>=0; i--)
- {
- for(int j=0; j<brojnakocki; j++)
- {
- tmpm[i][j] = matrica[brojnakocki-i-1][j];
- }
- }
- matrica = tmpm;
- }
- else if(selo==2)
- {
- //Ako e Z oska, transponiraj ja matricata
- int** tmpm = new int*[brojnakocki];
- for(int i=0; i<brojnakocki; i++)
- {
- tmpm[i] = new int[brojnakocki];
- }
- for(int i=0; i<brojnakocki; i++)
- {
- for(int j=0; j<brojnakocki; j++)
- {
- tmpm[i][j] = matrica[j][i];
- }
- }
- matrica = tmpm;
- }
- //Ako e X oska, ne pipaj nisto
- novamatrica = new int*[brojnakocki];
- for(int i=0; i<brojnakocki; i++)
- {
- novamatrica[i] = new int[brojnakocki];
- }
- for(int i=0; i<brojnakocki; i++)
- {
- for(int j=0; j<brojnakocki; j++)
- {
- novamatrica[i][j] = matrica[i][j];
- }
- }
- for(int z=0; z<br; z++)
- {
- for(int i=0; i<n/2; i++)
- for(int j=0; j<(n+1)/2; j++)
- cyclic_roll(novamatrica[i][j], novamatrica[n-1-j][i], novamatrica[n-1-i][n-1-j], novamatrica[j][n-1-i]);
- }
- smeniindeksi();
- cout<<"povikav"<<endl;
- }
- //Presmetuvanje na koordinati na kocki, se povikuva na refresh samo
- void opraviKocki()
- {
- brojac=0;
- if(napravena)
- {
- delete [] niza;
- }
- else napravena=true;
- this->n = brojnakocki;
- niza = new Cube2[n*n*n];
- float tprostor = (-1) * (n/2) * prostor;
- float vprostor = (-1) * (n/2) * prostor;
- float zprostor = (-1) * (n/2) * prostor;
- if(n%2==0)
- {
- parnost = 0.505;
- }
- for(int z = 0; z<n; z++)
- {
- if(z<(n/2))
- {
- onamu = z - (n/2);
- }
- else if(z==(n/2))
- {
- onamu = 0;
- }
- else
- {
- onamu = z - (n/2);
- }
- for(int j = 0; j<n; j++)
- {
- if(j<(n/2))
- {
- tamu = j - (n/2);
- }
- else if(j==(n/2))
- {
- tamu = 0;
- }
- else
- {
- tamu = j - (n/2);
- }
- for(int i = 0; i<n; i++)
- {
- //presmetka za lokacija
- if(i<(n/2))
- {
- vamu = i - (n/2);
- }
- else if(i==(n/2))
- {
- vamu = 0;
- }
- else
- {
- vamu = i - (n/2);
- }
- niza[brojac].setRotation(0,0,0);
- niza[brojac].setCube(parnost+vamu+tprostor-0.5,-0.5+parnost+tamu+vprostor,-0.5+parnost+onamu+zprostor,
- parnost+vamu+tprostor+0.5,-0.5+parnost+tamu+vprostor,-0.5+parnost+onamu+zprostor,
- parnost+vamu+tprostor+0.5,-0.5+parnost+tamu+vprostor,0.5+parnost+onamu+zprostor,
- parnost+vamu+tprostor-0.5,-0.5+parnost+tamu+vprostor,0.5+parnost+onamu+zprostor,
- parnost+vamu+tprostor-0.5,0.5+parnost+tamu+vprostor,-0.5+parnost+onamu+zprostor,
- parnost+vamu+tprostor+0.5,0.5+parnost+tamu+vprostor,-0.5+parnost+onamu+zprostor,
- parnost+vamu+tprostor+0.5,0.5+parnost+tamu+vprostor,0.5+parnost+onamu+zprostor,
- parnost+vamu+tprostor-0.5,0.5+parnost+tamu+vprostor,0.5+parnost+onamu+zprostor);
- niza[brojac].z = brojac;
- brojac++;
- tprostor += prostor;
- }
- vprostor += prostor;
- tprostor = (-1) * (n/2) * prostor;
- }
- zprostor += prostor;
- vprostor = (-1) * (n/2) * prostor;
- }
- colorCube();
- }
- //Iscrtuvanje na selektorot
- void drawSelector()
- {
- float x1 = selx, y1 = sely, z1 = selz;
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glColor4f(1,1,1,0.8);
- if(selo==1)
- {
- glBegin(GL_POLYGON);
- glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1, z1-1-brojnakocki/2*prostor-brojnakocki/2);
- if(brojnakocki%2==1)
- glVertex3f(x1+1+brojnakocki/2*prostor + brojnakocki/2, y1, z1-1-brojnakocki/2*prostor-brojnakocki/2);
- else
- glVertex3f(x1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, y1, z1-1-(brojnakocki/2)*prostor-brojnakocki/2);
- if(brojnakocki%2==1)
- glVertex3f(x1+1+brojnakocki/2*prostor + brojnakocki/2, y1, z1+1+brojnakocki/2*prostor+brojnakocki/2);
- else
- glVertex3f(x1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, y1, z1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2);
- if(brojnakocki%2==1)
- glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1, z1+1+brojnakocki/2*prostor+brojnakocki/2);
- else
- glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1, z1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2);
- glEnd();
- }
- else if(selo==2)
- {
- glBegin(GL_POLYGON);
- glVertex3f(x1, y1-1-brojnakocki/2*prostor - brojnakocki/2, z1-1-brojnakocki/2*prostor-brojnakocki/2);
- if(brojnakocki%2==1)
- glVertex3f(x1, y1+1+brojnakocki/2*prostor + brojnakocki/2, z1-1-brojnakocki/2*prostor-brojnakocki/2);
- else
- glVertex3f(x1, y1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, z1-1-(brojnakocki/2)*prostor-brojnakocki/2);
- if(brojnakocki%2==1)
- glVertex3f(x1, y1+1+brojnakocki/2*prostor + brojnakocki/2, z1+1+brojnakocki/2*prostor+brojnakocki/2);
- else
- glVertex3f(x1, y1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, z1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2);
- if(brojnakocki%2==1)
- glVertex3f(x1, y1-1-brojnakocki/2*prostor - brojnakocki/2, z1+1+brojnakocki/2*prostor+brojnakocki/2);
- else
- glVertex3f(x1, y1-1-brojnakocki/2*prostor - brojnakocki/2, z1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2);
- glEnd();
- }
- else
- {
- glBegin(GL_POLYGON);
- glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1-1-brojnakocki/2*prostor-brojnakocki/2, z1);
- if(brojnakocki%2==1)
- glVertex3f(x1+1+brojnakocki/2*prostor + brojnakocki/2, y1-1-brojnakocki/2*prostor-brojnakocki/2, z1);
- else
- glVertex3f(x1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, y1-1-(brojnakocki/2)*prostor-brojnakocki/2, z1);
- if(brojnakocki%2==1)
- glVertex3f(x1+1+brojnakocki/2*prostor + brojnakocki/2, y1+1+brojnakocki/2*prostor+brojnakocki/2, z1);
- else
- glVertex3f(x1+1+(brojnakocki/2 - 1)*prostor + brojnakocki/2, y1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2, z1);
- if(brojnakocki%2==1)
- glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1+1+brojnakocki/2*prostor+brojnakocki/2, z1);
- else
- glVertex3f(x1-1-brojnakocki/2*prostor - brojnakocki/2, y1+1+(brojnakocki/2 - 1)*prostor+brojnakocki/2, z1);
- glEnd();
- }
- }
- };
- BigCube *kocka;
- //Represmetka na selektorot spored lokacija
- void srediSelektor()
- {
- selx = 0;
- sely = 0;
- selz = 0;
- if(selo==1)
- {
- if(brojnakocki%2==0)
- {
- sely += (0.5);
- }
- }
- else if(selo==2)
- {
- if(brojnakocki%2==0)
- {
- selx += (0.5);
- }
- }
- else
- {
- if(brojnakocki%2==0)
- {
- selz += (0.5);
- }
- }
- if(brojnakocki%2==1)
- selpoz = (brojnakocki/2)+1;
- else selpoz = brojnakocki/2+1;
- }
- void display()
- {
- glMatrixMode(GL_MODELVIEW);
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- //Za rotacija
- glRotatef( rotate_x, 1.0, 0.0, 0.0 );
- glRotatef( (-1)*rotate_y, 0.0, 1.0, 0.0 );
- for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i++)
- {
- kocka->niza[i].drawCube();
- }
- kocka->drawSelector();
- glFlush();
- glutSwapBuffers();
- }
- void specialKeys( int key, int x, int y )
- {
- //Rotacija na golema kocka
- if (key == GLUT_KEY_RIGHT)
- rotate_y += 5;
- else if (key == GLUT_KEY_LEFT)
- rotate_y -= 5;
- else if (key == GLUT_KEY_UP)
- rotate_x += 5;
- else if (key == GLUT_KEY_DOWN)
- rotate_x -= 5;
- //Zoom
- else if (key==GLUT_KEY_PAGE_DOWN)
- {
- zoom++;
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glRotatef(180, 0, 0, 1);
- glOrtho((-1)*zoom, zoom, (-1) * zoom, zoom, -15.0, 15.0);
- glMatrixMode(GL_MODELVIEW);
- glRotatef( rotate_x, 1.0, 0.0, 0.0 );
- glRotatef( (-1)*rotate_y, 0.0, 1.0, 0.0 );
- }
- //Odzoom
- else if (key==GLUT_KEY_PAGE_UP)
- {
- zoom--;
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glRotatef(180, 0, 0, 1);
- glOrtho((-1)*zoom, zoom, (-1) * zoom, zoom, -15.0, 15.0);
- glMatrixMode(GL_MODELVIEW);
- glRotatef( rotate_x, 1.0, 0.0, 0.0 );
- glRotatef( (-1)*rotate_y, 0.0, 1.0, 0.0 );
- }
- //Osvezuvanje
- glutPostRedisplay();
- }
- void processNormalKeys(unsigned char key, int x, int y)
- {
- //Escape - exit
- if (key == 27)
- exit(0);
- //Smena broj na kocki
- else if (key>='3' && key<='9')
- {
- brojnakocki=(int) key-48;
- srediSelektor();
- kocka = new BigCube();
- }
- //Prostor++
- else if (key=='+' && prostor<0.9)
- {
- prostor += 0.1;
- srediSelektor();
- kocka = new BigCube();
- }
- //Prostor--
- else if (key=='-' && prostor>0.2)
- {
- prostor -= 0.1;
- srediSelektor();
- kocka = new BigCube();
- }
- //Smena na oskite
- else if (key=='x' || key=='y' || key=='z')
- {
- if(key=='x')
- selo=3;
- else if(key=='y')
- selo=1;
- else if (key=='z')
- selo=2;
- srediSelektor();
- }
- //Dvizenje na selektorot po oska
- else if(key=='/')
- {
- bool smena = false;
- if((selpoz == brojnakocki && brojnakocki%2==1) || (selpoz== brojnakocki && brojnakocki%2==0))
- {
- if(selo==1)
- {
- sely-=brojnakocki-1 + (brojnakocki-1)*prostor;
- }
- else if(selo==2)
- {
- selx-=brojnakocki-1 + (brojnakocki-1)*prostor;
- }
- else
- {
- selz-=brojnakocki-1 + (brojnakocki-1)*prostor;
- }
- selpoz=1;
- smena = true;
- }
- else
- {
- selpoz++;
- }
- if(!smena)
- {
- if(selo==1)
- {
- sely += (1+prostor);
- }
- else if(selo==2)
- {
- selx += (1+prostor);
- }
- else
- {
- selz += (1+prostor);
- }
- }
- smena=false;
- }
- //Rotacija na edna strana
- else if(key==',')
- {
- kocka->napravimatrica();
- int pluz = (selpoz-1)*brojnakocki;
- if(selo==1)
- {
- //Rotiraj po Y oska vo desno
- bool napuneta = false;
- for(int br=0; br<90; br++)
- {
- for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
- {
- for(int j=i; j<(i+brojnakocki); j++)
- {
- if(!napuneta) kocka->punimatrica(j+pluz);
- kocka->niza[j+pluz].setRotation(kocka->niza[j+pluz].rotx,kocka->niza[j+pluz].roty+1, kocka->niza[j+pluz].rotz);
- }
- }
- display();
- Sleep(1);
- napuneta = true;
- }
- kocka->rotirajmatica(1);
- for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
- {
- for(int j=i; j<(i+brojnakocki); j++)
- {
- kocka->niza[j+pluz].setRotation(0,0,0);
- kocka->niza[j+pluz].rotLeft();
- }
- }
- }
- else if(selo==2)
- {
- //Rotiraj po Z oska vo levo, odnosno 3 vo desno
- bool napuneta = false;
- for(int br=0; br<90; br++)
- {
- for(int i=selpoz-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
- {
- if(!napuneta) kocka->punimatrica(i);
- kocka->niza[i].setRotation(kocka->niza[i].rotx+1,kocka->niza[i].roty,kocka->niza[i].rotz);
- }
- display();
- Sleep(1);
- napuneta = true;
- }
- kocka->rotirajmatica(3);
- for(int i=selpoz-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
- {
- kocka->niza[i].setRotation(0,0,0);
- kocka->niza[i].rotBack();
- }
- }
- else
- {
- //Rotiraj po X oska vo desno
- bool napuneta = false;
- for(int br=0; br<90; br++)
- {
- for(int i=brojnakocki*brojnakocki*(selpoz-1); i<brojnakocki*brojnakocki*(selpoz-1) + brojnakocki*brojnakocki; i++)
- {
- if(!napuneta) kocka->punimatrica(i);
- kocka->niza[i].setRotation(kocka->niza[i].rotx,kocka->niza[i].roty,kocka->niza[i].rotz+1);
- }
- display();
- Sleep(1);
- napuneta = true;
- }
- kocka->rotirajmatica(1);
- for(int i=brojnakocki*brojnakocki*(selpoz-1); i<brojnakocki*brojnakocki*(selpoz-1) + brojnakocki*brojnakocki; i++)
- {
- kocka->niza[i].setRotation(0,0,0);
- kocka->niza[i].rotSideLeft();
- }
- }
- }
- //Rotacija na druga strana
- else if(key=='.')
- {
- //Rotiraj po Y oska vo levo, te. 3 pati vo desno
- kocka->napravimatrica();
- int pluz = (selpoz-1)*brojnakocki;
- if(selo==1)
- {
- bool napuneta = false;
- for(int br=0; br<90; br++)
- {
- for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
- {
- for(int j=i; j<(i+brojnakocki); j++)
- {
- if(!napuneta) kocka->punimatrica(j+pluz);
- kocka->niza[j+pluz].setRotation(kocka->niza[j+pluz].rotx,kocka->niza[j+pluz].roty-1, kocka->niza[j+pluz].rotz);
- }
- }
- display();
- Sleep(1);
- napuneta = true;
- }
- kocka->rotirajmatica(3);
- for(int i=0; i<brojnakocki*brojnakocki*brojnakocki; i+=(brojnakocki*brojnakocki))
- {
- for(int j=i; j<(i+brojnakocki); j++)
- {
- kocka->niza[j+pluz].setRotation(0,0,0);
- kocka->niza[j+pluz].rotRight();
- }
- }
- }
- else if(selo==2)
- {
- //Rotiraj po Z oska vo desno
- bool napuneta = false;
- for(int br=0; br<90; br++)
- {
- for(int i=selpoz-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
- {
- if(!napuneta) kocka->punimatrica(i);
- kocka->niza[i].setRotation(kocka->niza[i].rotx-1,kocka->niza[i].roty,kocka->niza[i].rotz);
- }
- display();
- Sleep(1);
- napuneta = true;
- }
- kocka->rotirajmatica(1);
- for(int i=selpoz-1; i<brojnakocki*brojnakocki*brojnakocki; i+=brojnakocki)
- {
- kocka->niza[i].setRotation(0,0,0);
- kocka->niza[i].rotFwd();
- }
- }
- else
- {
- //rotiraj po X oska vo levo, t.e. 3 pati vo desno
- bool napuneta = false;
- for(int br=0; br<90; br++)
- {
- for(int i=brojnakocki*brojnakocki*(selpoz-1); i<brojnakocki*brojnakocki*(selpoz-1) + brojnakocki*brojnakocki; i++)
- {
- if(!napuneta) kocka->punimatrica(i);
- kocka->niza[i].setRotation(kocka->niza[i].rotx,kocka->niza[i].roty,kocka->niza[i].rotz-1);
- }
- display();
- Sleep(1);
- napuneta = true;
- }
- kocka->rotirajmatica(3);
- for(int i=brojnakocki*brojnakocki*(selpoz-1); i<brojnakocki*brojnakocki*(selpoz-1) + brojnakocki*brojnakocki; i++)
- {
- kocka->niza[i].setRotation(0,0,0);
- kocka->niza[i].rotSideRight();
- }
- }
- }
- //Extra option, resetiranje na kockata
- else if(key=='r')
- {
- //Reset
- rotate_y=135;
- rotate_x=-45;
- prostor = 0.1;
- brojnakocki = 3;
- selo=1;
- selpoz=2;
- zoom = 10;
- kocka = new BigCube();
- srediSelektor();
- kocka->colorCube();
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-10.0, 10.0, -10.0, 10.0, -15.0, 15.0);
- glRotatef(180, 0, 0, 1);
- glMatrixMode(GL_MODELVIEW);
- }
- glutPostRedisplay();
- }
- int main(int argc, char* argv[])
- {
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- glutInitWindowSize (1000,1000);
- glutCreateWindow("Rubiks - Gordz");
- glEnable(GL_DEPTH_TEST);
- glClearColor (0.0, 0.0, 0.0, 0.0);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-10.0, 10.0, -10.0, 10.0, -15.0, 15.0);
- glRotatef(180, 0, 0, 1);
- if(!napravena)
- {
- kocka = new BigCube();
- napravena = true;
- }
- int n = brojnakocki;
- glutDisplayFunc(display);
- glutSpecialFunc(specialKeys);
- glutKeyboardFunc(processNormalKeys);
- glutMainLoop();
- delete kocka;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement