]> git.treefish.org Git - phys/latlib.git/blobdiff - cubelooks.cpp
more conservative output-dir creation
[phys/latlib.git] / cubelooks.cpp
index ca675bd6a227db01ca4eaa93c9b80429880ace05..f6b02ef955cc3d27765f7924d21fc226114e4568 100644 (file)
 #include "cubelooks.h"
-#include <GL/glut.h>
 #include <iostream>
 #include <string>
+#include <math.h>
 
 using namespace std;
 
-/* GLOBAL */
 vector< pair <unsigned long int,cubelooks::env*> > Envs;
 
+bool cubelooks::initDone = false;
+GLXDrawable cubelooks::gDrawable;
+Display *cubelooks::gDisplay;
+
 int cubelooks::cube::allid = 0;
 
+void cubelooks::cube::drawBox()
+{
+  glBegin(GL_LINES);
+  
+  glVertex3f(-1.0f, 1.0f, -1.0f);      
+  glVertex3f( 1.0f, 1.0f, -1.0f);
+  glVertex3f(-1.0f, -1.0f, -1.0f);     
+  glVertex3f( 1.0f, -1.0f, -1.0f);
+  glVertex3f(-1.0f, 1.0f, 1.0f);       
+  glVertex3f( 1.0f, 1.0f, 1.0f);
+  glVertex3f(-1.0f, -1.0f, 1.0f);      
+  glVertex3f( 1.0f, -1.0f, 1.0f);
+
+  glVertex3f( 1.0f, 1.0f, -1.0f);
+  glVertex3f( 1.0f, -1.0f, -1.0f);
+  glVertex3f( -1.0f, 1.0f, -1.0f);
+  glVertex3f( -1.0f, -1.0f, -1.0f);
+  glVertex3f( 1.0f, 1.0f, 1.0f);
+  glVertex3f( 1.0f, -1.0f, 1.0f);
+  glVertex3f( -1.0f, 1.0f, 1.0f);
+  glVertex3f( -1.0f, -1.0f, 1.0f);
+
+  glVertex3f( -1.0f, -1.0f, 1.0f);
+  glVertex3f( -1.0f, -1.0f, -1.0f);
+  glVertex3f( -1.0f, 1.0f, 1.0f);
+  glVertex3f( -1.0f, 1.0f, -1.0f);
+  glVertex3f( 1.0f, -1.0f, 1.0f);
+  glVertex3f( 1.0f, -1.0f, -1.0f);
+  glVertex3f( 1.0f, 1.0f, 1.0f);
+  glVertex3f( 1.0f, 1.0f, -1.0f);
+
+  glEnd();
+}
+
+void cubelooks::cube::drawAll()
+{
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+
+  glTranslatef(-1,-1,-1);
+
+  for (int iz=0; iz<l; iz++) {
+    for (int iy=0; iy<l; iy++) {
+      for (int ix=0; ix<l; ix++) {
+       glPushMatrix();
+       glTranslatef(2.0*ix/l,2.0*iy/l,2.0*iz/l);
+       glScalef(2.0/l,2.0/l,2.0/l);
+
+       /* draw links */
+       glBegin(GL_LINES);
+       glColor4f(link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 0],
+                 link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 1],
+                 link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 2],
+                 link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 3]);
+       glVertex3f(0,0,0); glVertex3f(1,0,0);
+       glColor4f(link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 0],
+                 link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 1],
+                 link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 2],
+                 link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 3]);
+       glVertex3f(0,0,0); glVertex3f(0,1,0);
+       glColor4f(link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 0],
+                 link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 1],
+                 link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 2],
+                 link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 3]);
+       glVertex3f(0,0,0); glVertex3f(0,0,1);
+       glEnd();
+
+       /* draw plaquettes */
+       glColor4f(1,1,1,0.5);
+       glBegin(GL_QUADS);
+       glColor4f(plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 0],
+                 plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 1],
+                 plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 2],
+                 plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 3]);
+       glVertex3f(0, 0, 0); glVertex3f(1, 0, 0); glVertex3f(1, 1, 0); glVertex3f(0, 1, 0);
+       glColor4f(plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 0],
+                 plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 1],
+                 plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 2],
+                 plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 3]);
+       glVertex3f(0, 0, 0); glVertex3f(1, 0, 0); glVertex3f(1, 0, 1); glVertex3f(0, 0, 1);
+       glColor4f(plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 0],
+                 plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 1],
+                 plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 2],
+                 plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 3]);
+       glVertex3f(0, 0, 0); glVertex3f(0, 1, 0); glVertex3f(0, 1, 1); glVertex3f(0, 0, 1);
+       glEnd();
+
+       glPopMatrix();
+      }
+    }
+  }
+    
+  glPopMatrix();
+}
+
 void cubelooks::cube::draw()
 {
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+
+  //cout << zoom << endl;
+
+  glScalef(zoom, zoom, zoom);
+  glRotatef(az, 0, 1, 0);
+  glRotatef(alt, 1, 0, 0);
+
+  /*
   glBegin(GL_QUADS);
   glVertex2f(-1, -1); glVertex2f(1, -1); glVertex2f(1, 1); glVertex2f(-1, 1);
   glEnd();
+  */
+
+  //drawBox();
+  drawAll();
+
+  glPopMatrix();
 }
 
 namespace mygl 
 {
+  int rotcube[3];
+
   cubelooks::env* getEnv()
   {
     for (int ienv=0; ienv<Envs.size(); ienv++)
@@ -28,17 +144,80 @@ namespace mygl
     cerr << "Something terrible happened: Could not find env-thread-id!" << endl;
     exit(1);
   }
+
+  static int getCubeFromPos(int x, int y)
+  {
+    cubelooks::env *Env = getEnv();
+
+    int col = x / ((float)Env->w / Env->layout[0]);
+    int row = Env->layout[1] - y / ((float)Env->h / Env->layout[1]);
+
+    return col + row*Env->layout[0];
+  }
   
   static void idleFunc()
   {
     glutPostRedisplay();
   }
 
+  static void motionFunc(int x, int y)
+  {   
+    cubelooks::env *Env = getEnv();
+
+    Env->cubes.at(rotcube[0]).az += rotcube[1] - x;
+    Env->cubes.at(rotcube[0]).alt += rotcube[2] - y;
+
+    rotcube[1] = x;
+    rotcube[2] = y;
+
+    glutPostRedisplay();
+  }
+
+  static void mouseFunc(int button, int state, int x, int y)
+  {
+    cubelooks::env *Env = getEnv();
+
+    if (button == 0) {
+      rotcube[0] = getCubeFromPos(x,y);
+      rotcube[1] = x;
+      rotcube[2] = y;
+    }
+
+    if (button == 4) {
+      Env->cubes.at(getCubeFromPos(x,y)).zoom *= 1.1;
+      glutPostRedisplay();
+    }
+    else if (button == 3) {
+      Env->cubes.at(getCubeFromPos(x,y)).zoom *= 0.9;
+      glutPostRedisplay();
+    }
+  }
+
   static void reshapeFunc(int w, int h)
   {
-    glutReshapeWindow(10,10);
-    glViewport(0,0,w,h);
-    cout << w << ":" << h << endl;
+    cubelooks::env *Env = getEnv();
+
+    int neww;
+    int newh;
+
+    if ( w == Env->w ) {
+      newh = h;
+      neww = Env->aspect*h;
+    }
+    else if ( h == Env->h ) {
+      neww = w;
+      newh = w / Env->aspect;
+    }
+    else {
+      neww = ( pow(Env->aspect,2)*w + Env->aspect*h ) / ( pow(Env->aspect,2) + 1 );
+      newh = ( Env->aspect*w + h ) / ( pow(Env->aspect,2) + 1 );
+    }
+
+    glutReshapeWindow(neww,newh);
+    glViewport(0,0,neww,newh);
+
+    Env->w = neww;
+    Env->h = newh;
   }
 
   static void displayFunc()
@@ -51,10 +230,19 @@ namespace mygl
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
 
+    glScalef(1.0/Env->layout[0],1.0/Env->layout[1],1.0);
+    glTranslatef(-Env->layout[0]+1, -Env->layout[1]+1, 0);
+
     for (int icube=0; icube < Env->cubes.size(); icube++) {
-      glScalef(1.0/Env->layout[0],1.0/Env->layout[1],1.0);
+      //glScalef(1.0/Env->layout[0],1.0/Env->layout[1],1.0);
       //glRotatef(2, 1, 0, 0);
       Env->cubes.at(icube).draw();
+      if ((icube+1)%Env->layout[0] == 0) {
+       glTranslatef(-2*Env->layout[0]+2, 2, 0);
+      }
+      else {
+       glTranslatef(2, 0, 0);
+      }
     }
 
     glutSwapBuffers();
@@ -62,54 +250,98 @@ namespace mygl
 
   static void* glutThread(void *_Env)
   {
-    int winsize[2];
+    cubelooks::env *Env = (cubelooks::env *)_Env; 
 
-    cubelooks::env* Env = (cubelooks::env*)_Env;
+    //glXMakeCurrent(0, glutCreateWindow("cubelooks"));
 
-    glutInit( ((cubelooks::env*)Env)->argc, ((cubelooks::env*)Env)->argv );
-    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
-
-    if( Env->layout[0] >= Env->layout[1] ) {
-      winsize[0] = 640;
-      winsize[1] = (640.0/Env->layout[0])*Env->layout[1];
-    }
-    else {
-      winsize[1] = 640;
-      winsize[0] = (640.0/Env->layout[1])*Env->layout[0];
-    }
+    //glXCrateContext(0, 
 
-    glutInitWindowSize(winsize[0], winsize[1]);
+    //cout << Env->layout[1] << endl;
 
-    glutInitWindowPosition(0,0);
+    glXMakeCurrent( Env->gDisplay, Env->gDrawable, Env->gContext );
 
-    glutCreateWindow("cubelooks");
+    //cout << "da" << endl;
 
     glutDisplayFunc(&displayFunc);
     glutReshapeFunc(&reshapeFunc);
+    glutMotionFunc(&motionFunc);
+    glutMouseFunc(&mouseFunc);
     //glutIdleFunc(&idleFunc);
 
-    Envs.push_back( pair<unsigned long int,cubelooks::env*>(pthread_self(), (cubelooks::env*)Env) ); 
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+    glEnable( GL_BLEND );
+
+    Envs.push_back( pair<unsigned long int,cubelooks::env*>(pthread_self(), Env) );
 
     glutMainLoop();
   }
 };
 
-cubelooks::cube::cube()
+cubelooks::cube::cube(int _l)
 {
+  l = _l;
+  link = new float[l*l*l*3 * 4];
+  plaq = new float[l*l*l*3 * 4];
+  az = 30;
+  alt = -20;
+  zoom = 0.6;
   id = allid;
   allid++;
+
+  for (int i=0; i<l*l*l*3; i++) {
+    link[i*4+0]=1; link[i*4+3]=0.6;
+    plaq[i*4+1]=1; plaq[i*4+3]=0.2;
+  }
 }
 
-cubelooks::cubelooks(const int& xcubes, const int& ycubes, int *argc, char **argv)
+cubelooks::cubelooks(const int& xcubes, const int& ycubes, const int& l, int *argc, char **argv)
 {
-  Env.argc = argc;
-  Env.argv = argv;
-  Env.layout[0] = xcubes;
-  Env.layout[1] = ycubes;
+  int winsize[2];
+  GLXContext context;
+  env *Env = new env;
+
+  Env->argc = argc;
+  Env->argv = argv;
+  Env->layout[0] = xcubes;
+  Env->layout[1] = ycubes;
+  Env->aspect = (double)xcubes/ycubes;
   for (int icube=0; icube<xcubes*ycubes; icube++) {
-    cube newCube;
-    Env.cubes.push_back(newCube);
+    cube newCube(l);
+    Env->cubes.push_back(newCube);
+  }
+
+  if ( !initDone ) {
+    glutInit( Env->argc, Env->argv );
+    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
+  }
+    
+  if( Env->layout[0] >= Env->layout[1] ) {
+    winsize[0] = 640;
+    winsize[1] = (640.0/Env->layout[0])*Env->layout[1];
+  }
+  else {
+    winsize[1] = 640;
+    winsize[0] = (640.0/Env->layout[1])*Env->layout[0];
+  }
+
+  Env->w = winsize[0];
+  Env->h = winsize[1];
+
+  glutInitWindowSize(winsize[0], winsize[1]);
+  glutInitWindowPosition(0,0);
+  glutCreateWindow("cubelooks");
+
+  if ( !initDone ) {
+    gDisplay = glXGetCurrentDisplay();
+    gDrawable = glXGetCurrentDrawable();
+    initDone = true;
   }
 
-  pthread_create(&glThreadId, 0, &mygl::glutThread, &Env);
+  Env->gContext = glXGetCurrentContext();
+  Env->gDisplay = gDisplay;
+  Env->gDrawable = glXGetCurrentDrawable();
+
+  glXMakeCurrent(0,0,0);
+
+  pthread_create(&glThreadId, 0, &mygl::glutThread, Env);
 }