From: Alex Schmidt Date: Mon, 18 Feb 2013 15:17:37 +0000 (+0100) Subject: ... X-Git-Url: http://git.treefish.org/~alex/phys/latlib.git/commitdiff_plain/2c7ea0058473eb98219ff87c64e28f31fac34b90?ds=inline ... --- diff --git a/.gitignore b/.gitignore index 393c6b3..ec81062 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ Makefile *~ neigh_test cubelooks_test +culooks_test diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c8d546..5cbe4e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,11 +14,11 @@ add_library(lat_progress progress.cpp) find_package(OpenGL REQUIRED) find_package(GLUT REQUIRED) include_directories( ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} ../ ) -add_library(lat_cubelooks cubelooks.cpp) -target_link_libraries(lat_cubelooks ${OPENGL_LIBRARIES} ${GLUT_LIBRARY}) +add_library(lat_culooks culooks.cpp) +target_link_libraries(lat_culooks ${OPENGL_LIBRARIES} ${GLUT_LIBRARY}) add_executable(neigh_test neigh_test.cpp) target_link_libraries(neigh_test lat_neigh) -add_executable(cubelooks_test cubelooks_test.cpp) -target_link_libraries(cubelooks_test lat_cubelooks) \ No newline at end of file +add_executable(culooks_test culooks_test.cpp) +target_link_libraries(culooks_test lat_culooks) \ No newline at end of file diff --git a/cubelooks.cpp b/cubelooks.cpp deleted file mode 100644 index f6b02ef..0000000 --- a/cubelooks.cpp +++ /dev/null @@ -1,347 +0,0 @@ -#include "cubelooks.h" -#include -#include -#include - -using namespace std; - -vector< pair > 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; izw / 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; - - 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() - { - cubelooks::env *Env = getEnv(); - - glClearColor(0,0,0,0); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - - 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); - //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(); - } - - static void* glutThread(void *_Env) - { - cubelooks::env *Env = (cubelooks::env *)_Env; - - //glXMakeCurrent(0, glutCreateWindow("cubelooks")); - - //glXCrateContext(0, - - //cout << Env->layout[1] << endl; - - glXMakeCurrent( Env->gDisplay, Env->gDrawable, Env->gContext ); - - //cout << "da" << endl; - - glutDisplayFunc(&displayFunc); - glutReshapeFunc(&reshapeFunc); - glutMotionFunc(&motionFunc); - glutMouseFunc(&mouseFunc); - //glutIdleFunc(&idleFunc); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable( GL_BLEND ); - - Envs.push_back( pair(pthread_self(), Env) ); - - glutMainLoop(); - } -}; - -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; iargc = argc; - Env->argv = argv; - Env->layout[0] = xcubes; - Env->layout[1] = ycubes; - Env->aspect = (double)xcubes/ycubes; - for (int icube=0; icubecubes.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; - } - - Env->gContext = glXGetCurrentContext(); - Env->gDisplay = gDisplay; - Env->gDrawable = glXGetCurrentDrawable(); - - glXMakeCurrent(0,0,0); - - pthread_create(&glThreadId, 0, &mygl::glutThread, Env); -} diff --git a/cubelooks.h b/cubelooks.h deleted file mode 100644 index 4d75332..0000000 --- a/cubelooks.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef CUBELOOKS_H -#define CUBELOOKS_H - -#include -#include -#include -#include -#include -#include -#include - - -using namespace std; - -class cubelooks -{ - public: - class cube { - public: - cube(int l); - void draw(); - int id; - float az, alt; - float zoom; - private: - void drawAll(); - void drawBox(); - static int allid; - float *plaq; - float *link; - int l; - }; - - struct env { - int *argc; - char **argv; - int layout[2]; - double aspect; - vector cubes; - int w, h; - GLXDrawable gDrawable; - Display *gDisplay; - GLXContext gContext; - }; - - cubelooks(const int& xcubes, const int& ycubes, const int& l, int *argc, char **argv); - - private: - pthread_t glThreadId; - static bool initDone; - static GLXDrawable gDrawable; - static Display *gDisplay; -}; - -#endif diff --git a/cubelooks_test.cpp b/cubelooks_test.cpp deleted file mode 100644 index fc6e3f8..0000000 --- a/cubelooks_test.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "cubelooks.h" -#include "unistd.h" -#include - -using namespace std; - -int main(int argc, char **argv) -{ - - cubelooks clooks(2,1, 6, &argc, argv); - - //sleep(2); - - //cubelooks clooks2(2,1, 6, &argc, argv); - - while(true) { - sleep(1); - } - - - return 0; -} diff --git a/culooks.cpp b/culooks.cpp new file mode 100644 index 0000000..fe8fd00 --- /dev/null +++ b/culooks.cpp @@ -0,0 +1,320 @@ +#include "culooks.h" + +#include +#include + +vector< pair > culooks::Windows; +pthread_t culooks::glThreadId; + +int culooks::windowid = 0; + +int culooks::cube::allid = 0; + +using namespace std; + +void culooks::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(); +} + +void culooks::cube::drawAll() +{ + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + glTranslatef(-1,-1,-1); + + for (int iz=0; izw / Win->layout[0]); + int row = Win->layout[1] - y / ((float)Win->h / Win->layout[1]); + + return col + row*Win->layout[0]; + } + + + static void motionFunc(int x, int y) + { + cout << x << endl; + culooks::window *Win = getWin(); + + Win->cubes.at(rotcube[0]).az += rotcube[1] - x; + Win->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) + { + culooks::window *Win = getWin(); + + if (button == 0) { + rotcube[0] = getCubeFromPos(x,y); + rotcube[1] = x; + rotcube[2] = y; + } + + if (button == 4) { + Win->cubes.at(getCubeFromPos(x,y)).zoom *= 1.1; + glutPostRedisplay(); + } + else if (button == 3) { + Win->cubes.at(getCubeFromPos(x,y)).zoom *= 0.9; + glutPostRedisplay(); + } + } + + + static void reshapeFunc(int w, int h) + { + culooks::window *Win = getWin(); + + int neww; + int newh; + + if ( w == Win->w ) { + newh = h; + neww = Win->aspect*h; + } + else if ( h == Win->h ) { + neww = w; + newh = w / Win->aspect; + } + else { + neww = ( pow(Win->aspect,2)*w + Win->aspect*h ) / ( pow(Win->aspect,2) + 1 ); + newh = ( Win->aspect*w + h ) / ( pow(Win->aspect,2) + 1 ); + } + + glutReshapeWindow(neww,newh); + glViewport(0,0,neww,newh); + + Win->w = neww; + Win->h = newh; + } + + static void displayFunc() + { + cout << ":" << glutGetWindow() << endl; + + culooks::window *Win = getWin(); + + glClearColor(0,0,0,0); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glScalef(1.0/Win->layout[0],1.0/Win->layout[1],1.0); + glTranslatef(-Win->layout[0]+1, -Win->layout[1]+1, 0); + + for (int icube=0; icube < Win->cubes.size(); icube++) { + //glScalef(1.0/Env->layout[0],1.0/Env->layout[1],1.0); + //glRotatef(2, 1, 0, 0); + Win->cubes.at(icube).draw(); + if ((icube+1)%Win->layout[0] == 0) { + glTranslatef(-2*Win->layout[0]+2, 2, 0); + } + else { + glTranslatef(2, 0, 0); + } + } + + glutSwapBuffers(); + } + + static void initWindow(int winid) + { + glutInitWindowSize(culooks::Windows[winid].second->w, culooks::Windows[winid].second->h); + glutInitWindowPosition(winid*100,winid*100); + glutCreateWindow( ("culooks / " + culooks::Windows[winid].second->name).c_str() ); + + glutDisplayFunc(&mygl::displayFunc); + glutReshapeFunc(&mygl::reshapeFunc); + glutMotionFunc(&mygl::motionFunc); + glutMouseFunc(&mygl::mouseFunc); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable( GL_BLEND ); + + culooks::Windows[winid].first = glutGetWindow(); + + culooks::Windows[winid].second->initialized = true; + } + + static void idleFunc_master() + { + for (int iwin=0; iwin < culooks::Windows.size(); iwin++) + if (!culooks::Windows[iwin].second->initialized) + initWindow(iwin); + } + + static void* glutThread(void *_wincon) + { + culooks::wincontext *wincon = (culooks::wincontext *)_wincon; + glXMakeCurrent( wincon->gDisplay, wincon->gDrawable, wincon->gContext ); + initWindow(0); + glutIdleFunc(&idleFunc_master); + glutMainLoop(); + } +}; + + +culooks::culooks (const char* name, const int& xcubes, const int& ycubes, const int& l, int *argc, char **argv) +{ + window *Win = new window; + int winsize[2]; + wincontext wincon; + + if (windowid == 0) { + glutInit(argc, argv); + glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); + } + + Win->layout[0] = xcubes; + Win->layout[1] = ycubes; + Win->aspect = (double)xcubes/ycubes; + for (int icube=0; icubecubes.push_back(newCube); + } + + if( Win->layout[0] >= Win->layout[1] ) { + winsize[0] = 640; + winsize[1] = (640.0/Win->layout[0])*Win->layout[1]; + } + else { + winsize[1] = 640; + winsize[0] = (640.0/Win->layout[1])*Win->layout[0]; + } + + Win->w = winsize[0]; + Win->h = winsize[1]; + + Win->name = name; + + Win->initialized = false; + + Windows.push_back( pair(0, Win) ); + + if (windowid == 0) { + wincon.gContext = glXGetCurrentContext(); + wincon.gDisplay = glXGetCurrentDisplay(); + wincon.gDrawable = glXGetCurrentDrawable(); + + glXMakeCurrent(0,0,0); + + pthread_create(&glThreadId, 0, &mygl::glutThread, &wincon); + } + + mywid = windowid; + windowid++; +} + +culooks::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 +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +class culooks +{ + public: + class cube { + public: + cube(int l); + void draw(); + int id; + float az, alt; + float zoom; + private: + void drawAll(); + void drawBox(); + static int allid; + float *plaq; + float *link; + int l; + }; + + struct window { + int layout[2]; + double aspect; + vector cubes; + int w, h; + int gwinid; + bool initialized; + string name; + }; + + culooks (const char* name, const int& xcubes, const int& ycubes, const int& l, int *argc, char **argv); + + static vector< pair > Windows; + + struct wincontext { + GLXDrawable gDrawable; + Display *gDisplay; + GLXContext gContext; + }; + + private: + static pthread_t glThreadId; + static int windowid; + int mywid; + +}; + +#endif diff --git a/culooks_test.cpp b/culooks_test.cpp new file mode 100644 index 0000000..b1ff0bf --- /dev/null +++ b/culooks_test.cpp @@ -0,0 +1,24 @@ +#include "culooks.h" +#include "unistd.h" +#include + +using namespace std; + +int main(int argc, char **argv) +{ + + culooks clooks("fenster1", 2,1, 6, &argc, argv); + culooks clooks2("fenster2", 4,2, 6, &argc, argv); + culooks clooks3("fenster3", 2,1, 6, &argc, argv); + + //sleep(2); + + //cubelooks clooks2(2,1, 6, &argc, argv); + + while(true) { + sleep(1); + } + + + return 0; +}