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