]> 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 /* GLOBAL */
10 vector< pair <unsigned long int,cubelooks::env*> > Envs;
11
12 int cubelooks::cube::allid = 0;
13
14 void cubelooks::cube::draw()
15 {
16   glBegin(GL_QUADS);
17   glVertex2f(-1, -1); glVertex2f(1, -1); glVertex2f(1, 1); glVertex2f(-1, 1);
18   glEnd();
19 }
20
21 namespace mygl 
22 {
23   cubelooks::env* getEnv()
24   {
25     for (int ienv=0; ienv<Envs.size(); ienv++)
26       if ( Envs.at(ienv).first == pthread_self() ) {
27         return Envs.at(ienv).second;
28       }
29     cerr << "Something terrible happened: Could not find env-thread-id!" << endl;
30     exit(1);
31   }
32   
33   static void idleFunc()
34   {
35     glutPostRedisplay();
36   }
37
38   static void reshapeFunc(int w, int h)
39   {
40     int neww;
41     int newh;
42
43     cubelooks::env *Env = getEnv();
44
45     if ( w == Env->w ) {
46       newh = h;
47       neww = Env->aspect*h;
48     }
49     else if ( h == Env->h ) {
50       neww = w;
51       newh = w / Env->aspect;
52     }
53     else {
54       neww = ( pow(Env->aspect,2)*w + Env->aspect*h ) / ( pow(Env->aspect,2) + 1 );
55       newh = ( Env->aspect*w + h ) / ( pow(Env->aspect,2) + 1 );
56     }
57
58     glutReshapeWindow(neww,newh);
59     glViewport(0,0,neww,newh);
60
61     Env->w = neww;
62     Env->h = newh;
63   }
64
65   static void displayFunc()
66   {
67     cubelooks::env *Env = getEnv();
68
69     glClearColor(0,0,0,0);
70     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
71  
72     glMatrixMode(GL_MODELVIEW);
73     glLoadIdentity();
74
75     glScalef(1.0/Env->layout[0],1.0/Env->layout[1],1.0);
76     glTranslatef(-Env->layout[0]+1, -Env->layout[1]+1, 0);
77
78     for (int icube=0; icube < Env->cubes.size(); icube++) {
79       //glScalef(1.0/Env->layout[0],1.0/Env->layout[1],1.0);
80       //glRotatef(2, 1, 0, 0);
81       Env->cubes.at(icube).draw();
82       if ((icube+1)%Env->layout[0] == 0) {
83         glTranslatef(-2*Env->layout[0]+2, 2, 0);
84       }
85       else {
86         glTranslatef(2, 0, 0);
87       }
88     }
89
90     glutSwapBuffers();
91   }
92
93   static void* glutThread(void *_Env)
94   {
95     int winsize[2];
96
97     cubelooks::env* Env = (cubelooks::env*)_Env;
98
99     glutInit( ((cubelooks::env*)Env)->argc, ((cubelooks::env*)Env)->argv );
100     glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
101
102     if( Env->layout[0] >= Env->layout[1] ) {
103       winsize[0] = 640;
104       winsize[1] = (640.0/Env->layout[0])*Env->layout[1];
105     }
106     else {
107       winsize[1] = 640;
108       winsize[0] = (640.0/Env->layout[1])*Env->layout[0];
109     }
110
111     Env->w = winsize[0];
112     Env->h = winsize[1];
113
114     glutInitWindowSize(winsize[0], winsize[1]);
115
116     glutInitWindowPosition(0,0);
117
118     glutCreateWindow("cubelooks");
119
120     glutDisplayFunc(&displayFunc);
121     glutReshapeFunc(&reshapeFunc);
122     //glutIdleFunc(&idleFunc);
123
124     Envs.push_back( pair<unsigned long int,cubelooks::env*>(pthread_self(), (cubelooks::env*)Env) ); 
125
126     glutMainLoop();
127   }
128 };
129
130 cubelooks::cube::cube()
131 {
132   id = allid;
133   allid++;
134 }
135
136 cubelooks::cubelooks(const int& xcubes, const int& ycubes, int *argc, char **argv)
137 {
138   Env.argc = argc;
139   Env.argv = argv;
140   Env.layout[0] = xcubes;
141   Env.layout[1] = ycubes;
142   Env.aspect = (double)xcubes/ycubes;
143   for (int icube=0; icube<xcubes*ycubes; icube++) {
144     cube newCube;
145     Env.cubes.push_back(newCube);
146   }
147
148   pthread_create(&glThreadId, 0, &mygl::glutThread, &Env);
149 }