]> git.treefish.org Git - phys/latlib.git/blob - cubelooks.cpp
...
[phys/latlib.git] / cubelooks.cpp
1 #include "cubelooks.h"
2 #include <GL/glut.h>
3 #include <iostream>
4 #include <string>
5 #include <math.h>
6
7 using namespace std;
8
9 cubelooks::env *Env;
10
11 int cubelooks::cube::allid = 0;
12
13 void cubelooks::cube::drawBox()
14 {
15   glBegin(GL_LINES);
16   
17   glVertex3f(-1.0f, 1.0f, -1.0f);       
18   glVertex3f( 1.0f, 1.0f, -1.0f);
19   glVertex3f(-1.0f, -1.0f, -1.0f);      
20   glVertex3f( 1.0f, -1.0f, -1.0f);
21   glVertex3f(-1.0f, 1.0f, 1.0f);        
22   glVertex3f( 1.0f, 1.0f, 1.0f);
23   glVertex3f(-1.0f, -1.0f, 1.0f);       
24   glVertex3f( 1.0f, -1.0f, 1.0f);
25
26   glVertex3f( 1.0f, 1.0f, -1.0f);
27   glVertex3f( 1.0f, -1.0f, -1.0f);
28   glVertex3f( -1.0f, 1.0f, -1.0f);
29   glVertex3f( -1.0f, -1.0f, -1.0f);
30   glVertex3f( 1.0f, 1.0f, 1.0f);
31   glVertex3f( 1.0f, -1.0f, 1.0f);
32   glVertex3f( -1.0f, 1.0f, 1.0f);
33   glVertex3f( -1.0f, -1.0f, 1.0f);
34
35   glVertex3f( -1.0f, -1.0f, 1.0f);
36   glVertex3f( -1.0f, -1.0f, -1.0f);
37   glVertex3f( -1.0f, 1.0f, 1.0f);
38   glVertex3f( -1.0f, 1.0f, -1.0f);
39   glVertex3f( 1.0f, -1.0f, 1.0f);
40   glVertex3f( 1.0f, -1.0f, -1.0f);
41   glVertex3f( 1.0f, 1.0f, 1.0f);
42   glVertex3f( 1.0f, 1.0f, -1.0f);
43
44   glEnd();
45 }
46
47 void cubelooks::cube::drawAll()
48 {
49   glMatrixMode(GL_MODELVIEW);
50   glPushMatrix();
51
52   glTranslatef(-1,-1,-1);
53
54   for (int iz=0; iz<l; iz++) {
55     for (int iy=0; iy<l; iy++) {
56       for (int ix=0; ix<l; ix++) {
57         glPushMatrix();
58         glTranslatef(2.0*ix/l,2.0*iy/l,2.0*iz/l);
59         glScalef(2.0/l,2.0/l,2.0/l);
60
61         /* draw links */
62         glBegin(GL_LINES);
63         glColor4f(link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 0],
64                   link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 1],
65                   link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 2],
66                   link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 3]);
67         glVertex3f(0,0,0); glVertex3f(1,0,0);
68         glColor4f(link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 0],
69                   link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 1],
70                   link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 2],
71                   link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 3]);
72         glVertex3f(0,0,0); glVertex3f(0,1,0);
73         glColor4f(link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 0],
74                   link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 1],
75                   link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 2],
76                   link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 3]);
77         glVertex3f(0,0,0); glVertex3f(0,0,1);
78         glEnd();
79
80         /* draw plaquettes */
81         glColor4f(1,1,1,0.5);
82         glBegin(GL_QUADS);
83         glColor4f(plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 0],
84                   plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 1],
85                   plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 2],
86                   plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 3]);
87         glVertex3f(0, 0, 0); glVertex3f(1, 0, 0); glVertex3f(1, 1, 0); glVertex3f(0, 1, 0);
88         glColor4f(plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 0],
89                   plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 1],
90                   plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 2],
91                   plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 3]);
92         glVertex3f(0, 0, 0); glVertex3f(1, 0, 0); glVertex3f(1, 0, 1); glVertex3f(0, 0, 1);
93         glColor4f(plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 0],
94                   plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 1],
95                   plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 2],
96                   plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 3]);
97         glVertex3f(0, 0, 0); glVertex3f(0, 1, 0); glVertex3f(0, 1, 1); glVertex3f(0, 0, 1);
98         glEnd();
99
100         glPopMatrix();
101       }
102     }
103   }
104     
105   glPopMatrix();
106 }
107
108 void cubelooks::cube::draw()
109 {
110   glMatrixMode(GL_MODELVIEW);
111   glPushMatrix();
112
113   //cout << zoom << endl;
114
115   glScalef(zoom, zoom, zoom);
116   glRotatef(az, 0, 1, 0);
117   glRotatef(alt, 1, 0, 0);
118
119   /*
120   glBegin(GL_QUADS);
121   glVertex2f(-1, -1); glVertex2f(1, -1); glVertex2f(1, 1); glVertex2f(-1, 1);
122   glEnd();
123   */
124
125   //drawBox();
126   drawAll();
127
128   glPopMatrix();
129 }
130
131 namespace mygl 
132 {
133   int rotcube[3];
134
135   static int getCubeFromPos(int x, int y)
136   {
137     int col = x / ((float)Env->w / Env->layout[0]);
138     int row = Env->layout[1] - y / ((float)Env->h / Env->layout[1]);
139
140     return col + row*Env->layout[0];
141   }
142   
143   static void idleFunc()
144   {
145     glutPostRedisplay();
146   }
147
148   static void motionFunc(int x, int y)
149   {   
150     Env->cubes.at(rotcube[0]).az += rotcube[1] - x;
151     Env->cubes.at(rotcube[0]).alt += rotcube[2] - y;
152
153     rotcube[1] = x;
154     rotcube[2] = y;
155
156     glutPostRedisplay();
157   }
158
159   static void mouseFunc(int button, int state, int x, int y)
160   {
161     if (button == 0) {
162       rotcube[0] = getCubeFromPos(x,y);
163       rotcube[1] = x;
164       rotcube[2] = y;
165     }
166
167     if (button == 4) {
168       Env->cubes.at(getCubeFromPos(x,y)).zoom *= 1.1;
169       glutPostRedisplay();
170     }
171     else if (button == 3) {
172       Env->cubes.at(getCubeFromPos(x,y)).zoom *= 0.9;
173       glutPostRedisplay();
174     }
175   }
176
177   static void reshapeFunc(int w, int h)
178   {
179     int neww;
180     int newh;
181
182     if ( w == Env->w ) {
183       newh = h;
184       neww = Env->aspect*h;
185     }
186     else if ( h == Env->h ) {
187       neww = w;
188       newh = w / Env->aspect;
189     }
190     else {
191       neww = ( pow(Env->aspect,2)*w + Env->aspect*h ) / ( pow(Env->aspect,2) + 1 );
192       newh = ( Env->aspect*w + h ) / ( pow(Env->aspect,2) + 1 );
193     }
194
195     glutReshapeWindow(neww,newh);
196     glViewport(0,0,neww,newh);
197
198     Env->w = neww;
199     Env->h = newh;
200   }
201
202   static void displayFunc()
203   {
204     glClearColor(0,0,0,0);
205     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
206  
207     glMatrixMode(GL_MODELVIEW);
208     glLoadIdentity();
209
210     glScalef(1.0/Env->layout[0],1.0/Env->layout[1],1.0);
211     glTranslatef(-Env->layout[0]+1, -Env->layout[1]+1, 0);
212
213     for (int icube=0; icube < Env->cubes.size(); icube++) {
214       //glScalef(1.0/Env->layout[0],1.0/Env->layout[1],1.0);
215       //glRotatef(2, 1, 0, 0);
216       Env->cubes.at(icube).draw();
217       if ((icube+1)%Env->layout[0] == 0) {
218         glTranslatef(-2*Env->layout[0]+2, 2, 0);
219       }
220       else {
221         glTranslatef(2, 0, 0);
222       }
223     }
224
225     glutSwapBuffers();
226   }
227
228   static void* glutThread(void *_Env)
229   {
230     int winsize[2];
231
232     glutInit( ((cubelooks::env*)Env)->argc, ((cubelooks::env*)Env)->argv );
233     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
234
235     if( Env->layout[0] >= Env->layout[1] ) {
236       winsize[0] = 640;
237       winsize[1] = (640.0/Env->layout[0])*Env->layout[1];
238     }
239     else {
240       winsize[1] = 640;
241       winsize[0] = (640.0/Env->layout[1])*Env->layout[0];
242     }
243
244     Env->w = winsize[0];
245     Env->h = winsize[1];
246
247     glutInitWindowSize(winsize[0], winsize[1]);
248
249     glutInitWindowPosition(0,0);
250
251     glutCreateWindow("cubelooks");
252
253     glutDisplayFunc(&displayFunc);
254     glutReshapeFunc(&reshapeFunc);
255     glutMotionFunc(&motionFunc);
256     glutMouseFunc(&mouseFunc);
257     //glutIdleFunc(&idleFunc);
258
259     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
260     glEnable( GL_BLEND );
261
262     glutMainLoop();
263   }
264 };
265
266 cubelooks::cube::cube(int _l)
267 {
268   l = _l;
269   link = new float[l*l*l*3 * 4];
270   plaq = new float[l*l*l*3 * 4];
271   az = 30;
272   alt = -20;
273   zoom = 0.6;
274   id = allid;
275   allid++;
276
277   for (int i=0; i<l*l*l*3; i++) {
278     link[i*4+0]=1; link[i*4+3]=0.6;
279     plaq[i*4+1]=1; plaq[i*4+3]=0.2;
280   }
281 }
282
283 cubelooks::cubelooks(const int& xcubes, const int& ycubes, const int& l, int *argc, char **argv)
284 {
285   _Env.argc = argc;
286   _Env.argv = argv;
287   _Env.layout[0] = xcubes;
288   _Env.layout[1] = ycubes;
289   _Env.aspect = (double)xcubes/ycubes;
290   for (int icube=0; icube<xcubes*ycubes; icube++) {
291     cube newCube(l);
292     _Env.cubes.push_back(newCube);
293   }
294
295   Env = &_Env;
296
297   pthread_create(&glThreadId, 0, &mygl::glutThread, NULL);
298
299   sleep(2);
300 }