#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++)
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)
{
+ cubelooks::env *Env = getEnv();
+
int neww;
int newh;
- cubelooks::env *Env = getEnv();
-
if ( w == Env->w ) {
newh = h;
neww = Env->aspect*h;
static void* glutThread(void *_Env)
{
- int winsize[2];
-
- cubelooks::env* Env = (cubelooks::env*)_Env;
-
- glutInit( ((cubelooks::env*)Env)->argc, ((cubelooks::env*)Env)->argv );
- glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
+ cubelooks::env *Env = (cubelooks::env *)_Env;
- 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];
- }
+ //glXMakeCurrent(0, glutCreateWindow("cubelooks"));
- Env->w = winsize[0];
- Env->h = winsize[1];
+ //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;
- Env.aspect = (double)xcubes/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];
}
- pthread_create(&glThreadId, 0, &mygl::glutThread, &Env);
+ 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;
+ }
+
+ Env->gContext = glXGetCurrentContext();
+ Env->gDisplay = gDisplay;
+ Env->gDrawable = glXGetCurrentDrawable();
+
+ glXMakeCurrent(0,0,0);
+
+ pthread_create(&glThreadId, 0, &mygl::glutThread, Env);
}