src/OpenGLWidget.cpp

Go to the documentation of this file.
00001 
00002 #include "Volume.h"
00003 #include "OpenGLWidget.h"
00004 #include <QtGui/QWidget>
00005 #include <iostream>
00006 #include <algorithm>
00007 //#include <QtDebug>
00008 
00009 using namespace std;
00010 
00011 
00012 // switches
00013 bool         OpenGLWidget::m_textureCreated       = false;
00014 bool         OpenGLWidget::m_librariesInitialised = false;
00015 
00016 // texture-handles
00017 unsigned int OpenGLWidget::m_textureHandle3d = 0;
00018 unsigned int OpenGLWidget::m_textureHandle1d = 0;
00019 
00020 // volume dimensions
00021 int          OpenGLWidget::m_dimX = 0;
00022 int          OpenGLWidget::m_dimY = 0;
00023 int          OpenGLWidget::m_dimZ = 0;
00024 
00025 // rotation of rendered volume
00026 float        OpenGLWidget::m_xRot = 0.0;
00027 float        OpenGLWidget::m_yRot = 0.0;
00028 float        OpenGLWidget::m_zRot = 0.0;
00029 
00030 // window size
00031 int          OpenGLWidget::m_viewWidth  = OPENGL_SLICE_VIEW_SIZE;
00032 int          OpenGLWidget::m_viewHeight = OPENGL_SLICE_VIEW_SIZE;
00033 
00034 int          OpenGLWidget::m_view3DWidth  = OPENGL_3D_VIEW_SIZE;
00035 int          OpenGLWidget::m_view3DHeight = OPENGL_3D_VIEW_SIZE;
00036 
00037 // mouse-position
00038 int          OpenGLWidget::m_lastXPosition = 0;
00039 int          OpenGLWidget::m_lastYPosition = 0;
00040 
00041 //int          OpenGLWidget::m_showView = SHOW_FRONT_SIDE;
00042 int          OpenGLWidget::m_showView = SHOW_VOLUME;
00043 
00044 
00045 
00046 OpenGLWidget::OpenGLWidget( QWidget *parent, QGLWidget* shareWidget) : QGLWidget(parent, shareWidget)
00047 {
00048   cout << "Creating new OpenGLWidget..."<< endl;
00049 
00050   m_Axis = 0;
00051   m_AxisValue = 0;
00052   m_textureCoord = 0;
00053   m_rayStepSize = 0.0;
00054   m_mbPressed = false;
00055   m_ka = m_kd = m_ks = m_kg = 0.0;
00056 
00057   m_clearColor = QColor("black");
00058 
00059   // Timer for Animation (replace for glutIdle)
00060 /*  QTimer *idleTimer = new QTimer(this);
00061   connect(idleTimer, SIGNAL(timeout()), this, SLOT(updateGL()));
00062   idleTimer->start();
00063   */
00064 }
00065 
00066 
00067 OpenGLWidget::~OpenGLWidget()
00068 {
00069   release();
00070   deleteBuffers();
00071   unloadShader();
00072 }
00073 
00074 
00075 void OpenGLWidget::deleteBuffers()
00076 {
00077   cout << "deleting buffers..." << endl;
00078 
00079   // front-side
00080   glDeleteFramebuffersEXT( 1, &m_fsFbo );
00081   glDeleteRenderbuffersEXT( 1, &m_fsRenderBuffer );
00082   glDeleteTextures( 1, &m_fsRenderTexture );
00083 
00084   // back-side
00085   glDeleteFramebuffersEXT( 1, &m_bsFbo );
00086   glDeleteRenderbuffersEXT( 1, &m_bsRenderBuffer );
00087   glDeleteTextures( 1, &m_bsRenderTexture );
00088 }
00089 
00090 
00091 void OpenGLWidget::initGlew()
00092 {
00093         // Initialize GLEW
00094         cout << "- Initializing GLEW ..." << endl;
00095         GLenum err = glewInit();
00096 
00097         if (err != GLEW_OK)
00098         {
00099                 // glewInit failed, something is seriously wrong
00100                 cerr << "Error initializing GLEW: " << glewGetErrorString(err) << endl;
00101                 return;
00102         }
00103         cout << "- GLEW initialized." << endl << endl;
00104 }
00105 
00106 
00107 void OpenGLWidget::initDevIL()
00108 {
00109   // Initialize DevIL (an image library)
00110         cout << "- Initializing DevIL ..." << endl;
00111         ilInit();
00112 
00113         if (ilGetError() != IL_NO_ERROR)
00114         {
00115                 cerr << "Error initializing DevIL" << endl;
00116                 return;
00117         }
00118 
00119         ilEnable(IL_ORIGIN_SET);
00120         ilOriginFunc(IL_ORIGIN_LOWER_LEFT);
00121         cout << "- DevIL initialized." << endl << endl;
00122 }
00123 
00124 
00125 const int OpenGLWidget::GetNextPowerOfTwo( const int iNumber )
00126 {
00127         int iPowerOfTwo = 1;
00128 
00129         while (iPowerOfTwo < iNumber)
00130                 iPowerOfTwo = iPowerOfTwo * 2;
00131 
00132         return iPowerOfTwo;
00133 }
00134 
00135 
00136 void OpenGLWidget::release()
00137 {
00138   cout << "release..." << endl;
00139 
00140   if ( m_textureHandle3d != 0 )
00141   {
00142     cout << "- deleting texture" << endl;
00143     glDeleteTextures( 1, &m_textureHandle3d );
00144     m_textureHandle3d = 0;
00145     m_textureCreated = false;
00146   }
00147 
00148   m_textureCoord = 0;
00149 }
00150 
00151 
00152 void OpenGLWidget::initializeGL()
00153 {
00154         cout << "initializeGL... " << endl;
00155         // qDebug() << "init";
00156 
00157 
00158   if ( !m_librariesInitialised )
00159   {
00160           initGlew();  // Initialize Glew Extension Wrangler
00161           initDevIL(); // Initialize Image Library Lib (for textures)
00162 
00163     if ( !glewIsSupported( "GL_VERSION_2_0" ) )
00164     {
00165       cout << "OpenGL-Version 2.0 not supported!" << endl;
00166       exit( 1 );
00167     }
00168 
00169     m_librariesInitialised = true;
00170   }
00171 
00172   if ( m_Axis == RENDER_3D_VIEW || m_Axis == NO_RENDER_3D_VIEW )
00173   {
00174     if ( !createBuffers() )
00175     {
00176       cout << "Creation of FBO's failed! Exiting now..." << endl;
00177       exit( 1 );
00178     }
00179 
00180     if ( !loadShader() )
00181     {
00182       cout << "Loading of shaders failed! Exiting now..." << endl;
00183       exit( 1 );
00184     }
00185   }
00186 
00187 
00188 
00189         // GL Init
00190 /*      glShadeModel( GL_SMOOTH );
00191         glClearDepth( 1.0f );
00192         glEnable( GL_DEPTH_TEST );
00193         glDepthFunc( GL_LEQUAL );
00194   glViewport( 0, 0, this->m_viewWidth, this->m_viewHeight );
00195 /
00196     qglClearColor(m_clearColor);
00197 //      glEnable(GL_DEPTH_TEST);
00198         glEnable(GL_CULL_FACE);
00199 */
00200 
00201   qglClearColor( m_clearColor );
00202 
00203         glMatrixMode(GL_PROJECTION);
00204         glLoadIdentity();
00205 
00206         glMatrixMode(GL_MODELVIEW);
00207         glLoadIdentity ();
00208 }
00209 
00210 
00211 void OpenGLWidget::resizeGL(int width, int height)
00212 {
00213         cout << "resizeGL... " << endl;
00214 
00215   if ( m_Axis == OPENGL_3D_VIEW )
00216   {
00217     this->m_view3DWidth  = width;
00218     this->m_view3DHeight = height;
00219   }
00220   else
00221   {
00222     this->m_viewWidth  = width;
00223     this->m_viewHeight = height;
00224   }
00225 
00226 
00227         int side = qMin(width, height);
00228         glViewport( (width - side)/2, (height - side)/2, side, side );
00229 
00230         glMatrixMode(GL_PROJECTION);
00231         glLoadIdentity();
00232 
00233         glMatrixMode(GL_MODELVIEW);
00234         glLoadIdentity();
00235 }
00236 
00237 void OpenGLWidget::setLightValue ( LIGHT_MODEL model, float value )
00238 {
00239   switch(model)
00240   {
00241   case ambient: m_ka = value;
00242     break;
00243 
00244   case diffuse: m_kd = value;
00245     break;
00246 
00247   case specular: m_ks = value;
00248     break;
00249 
00250   case gloss: m_kg = value;
00251     break;
00252 
00253   default: // do nothing
00254     break;
00255   }
00256 
00257   if ( m_Axis == OPENGL_3D_VIEW )
00258     this->updateGL();
00259 }
00260 
00261 
00262 void OpenGLWidget::paintXAxis()
00263 {
00264   /* paint yz-plane
00265 
00266     map texture with correct aspect ratio:
00267     if y > z => y = longEdge; z = shortEdge (implemented using min/max instead)
00268       => yOffset
00269 
00270     if y < z => y = shortEdge; z = longEdge (implemented using min/max instead)
00271       => xOffset
00272   */
00273 
00274   float xOffset = 0.0f;
00275   float yOffset = 0.0f;
00276 
00277   float delta = max( m_dimY, m_dimZ ) - min( m_dimY, m_dimZ );
00278 
00279   if ( m_dimY > m_dimZ ) yOffset = 2 * ( delta / max( m_dimY, m_dimZ ) );
00280   if ( m_dimY < m_dimZ ) xOffset = 2 * ( delta / max( m_dimY, m_dimZ ) );
00281 
00282   //cout << "X xOffset: " << xOffset << endl;
00283   //cout << "X yOffset: " << yOffset << endl;
00284 
00285   //draw quad with texture taken from 3d volume
00286         glBegin(GL_QUADS);
00287     // A
00288           glTexCoord3f ( m_textureCoord, 0.0f, 0.0f);
00289           glVertex3f(  -1.0f, -1.0f, -1.0f  );
00290 
00291     // B
00292           glTexCoord3f( m_textureCoord, 1.0f, 0.0f);
00293           glVertex3f(   1.0f - xOffset, -1.0f, -1.0f  );
00294 
00295           // C
00296     glTexCoord3f( m_textureCoord, 1.0f, 1.0f);
00297           glVertex3f(   1.0f - xOffset, 1.0f - yOffset, -1.0f  );
00298 
00299           // D
00300     glTexCoord3f( m_textureCoord, 0.0f, 1.0f);
00301           glVertex3f(  -1.0f, 1.0f - yOffset, -1.0f  );
00302         glEnd();
00303 
00304 }
00305 
00306 
00307 void OpenGLWidget::paintYAxis()
00308 {
00309   // paint xz-plane
00310 
00311   // map texture with correct aspect ratio:
00312   float xOffset = 0.0f;
00313   float yOffset = 0.0f;
00314 
00315   float delta = max( m_dimX, m_dimZ ) - min( m_dimX, m_dimZ );
00316 
00317   if ( m_dimX > m_dimZ ) yOffset = 2 * ( delta / max( m_dimX, m_dimZ ) );
00318   if ( m_dimX < m_dimZ ) xOffset = 2 * ( delta / max( m_dimX, m_dimZ ) );
00319 
00320   //cout << "Y xOffset: " << xOffset << endl;
00321   //cout << "Y yOffset: " << yOffset << endl;
00322 
00323 
00324   //draw quad with texture taken from 3d volume
00325         glBegin(GL_QUADS);
00326           glTexCoord3f( 0.0f,  m_textureCoord, 0.0f);
00327           glVertex3f(  -1.0f, -1.0f, -1.0f  );
00328 
00329           glTexCoord3f( 1.0f,  m_textureCoord, 0.0f);
00330           glVertex3f(   1.0f - xOffset, -1.0f, -1.0f  );
00331 
00332           glTexCoord3f( 1.0f, m_textureCoord, 1.0f);
00333           glVertex3f(   1.0f - xOffset, 1.0f - yOffset, -1.0f  );
00334 
00335           glTexCoord3f( 0.0f, m_textureCoord, 1.0f);
00336           glVertex3f(  -1.0f, 1.0f - yOffset, -1.0f  );
00337         glEnd();
00338 }
00339 
00340 
00341 void OpenGLWidget::paintZAxis()
00342 {
00343   // paint xy-plane
00344 
00345   // map texture with correct aspect ratio:
00346   float xOffset = 0.0f;
00347   float yOffset = 0.0f;
00348 
00349   float delta = max( m_dimX, m_dimY ) - min( m_dimX, m_dimY );
00350 
00351   if ( m_dimX > m_dimY ) yOffset = 2 * ( delta / max( m_dimX, m_dimY ) );
00352   if ( m_dimX < m_dimY ) xOffset = 2 * ( delta / max( m_dimX, m_dimY ) );
00353 
00354   //cout << "Z xOffset: " << xOffset << endl;
00355   //cout << "Z yOffset: " << yOffset << endl;
00356 
00357 //draw quad with texture taken from 3d volume
00358         glBegin(GL_QUADS);
00359           glTexCoord3f( 0.0f,  0.0f, m_textureCoord);
00360           glVertex3f(  -1.0f, -1.0f, -1.0f  );
00361 
00362           glTexCoord3f( 1.0f,  0.0f, m_textureCoord);
00363           glVertex3f(   1.0f - xOffset, -1.0f, -1.0f  );
00364 
00365           glTexCoord3f( 1.0f, 1.0f, m_textureCoord);
00366           glVertex3f(   1.0f - xOffset, 1.0f - yOffset, -1.0f  );
00367 
00368           glTexCoord3f( 0.0f, 1.0f, m_textureCoord);
00369           glVertex3f(  -1.0f, 1.0f - yOffset, -1.0f  );
00370         glEnd();
00371 }
00372 
00373 
00374 void OpenGLWidget::paintGL()
00375 {
00376 //  cout << "paintGL..." << endl;
00377 
00378         // m_Axis[0..SLIDER_RANGE] -> m_textureCoord[0..1]
00379         m_textureCoord = m_AxisValue / SLIDER_RANGE;
00380 
00381         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
00382         glPushMatrix();
00383 
00384         if ( m_textureCreated )   // texture is created
00385         {
00386                 if( GLEW_EXT_texture3D )  // graphics hw supports 3d textures
00387                 {
00388                         glEnable( GL_TEXTURE_3D );
00389       glBindTexture( GL_TEXTURE_3D, m_textureHandle3d );
00390 
00391                         GLenum glError = glGetError();
00392                         if (glError != GL_NO_ERROR)
00393                         {
00394                                 cerr<<"Error binding texture: " << gluErrorString(glError) << endl;
00395                         }
00396 
00397                         switch ( m_Axis )
00398                         {
00399         case X_AXIS: // x-axis
00400           paintXAxis();
00401           break;
00402 
00403         case Y_AXIS: // y-axis
00404           paintYAxis();
00405           break;
00406 
00407         case Z_AXIS: // z-axis
00408           paintZAxis();
00409           break;
00410 
00411         case NO_RENDER_3D_VIEW:
00412           // no file open -> do not render 3D-view
00413           break;
00414 
00415         case RENDER_3D_VIEW:
00416           renderView();
00417           break;
00418 
00419         default: // unkonwn
00420           break;
00421                         }
00422 
00423                 }
00424                 else // 3d texture not supported
00425                 {
00426       cout << "- 3D-texture not supported on your hardware!" << endl;
00427                 }
00428         }
00429         glPopMatrix();
00430 
00431 }
00432 
00433 
00434 float OpenGLWidget::toRad( float grad )
00435 {
00436   return (float)(2*PI* grad /360 );
00437 }
00438 
00439 
00440 void OpenGLWidget::createInvRotMatrix()
00441 {
00442 
00443   float phi = toRad( m_xRot );
00444 /*
00445   cout << "cos: " << cos( (float)(PI/2) ) << endl;
00446   cout << "cos: " << cos( (float)(2*PI * 90 /360 ) ) << endl;
00447   cout << "cos: " << cos( toRad(90) ) << endl;
00448 */
00449   Matrix rotXMtx( 1.0, 0.0, 0.0, 0.0,
00450                   0.0, cos(phi), -sin(phi), 0.0,
00451                   0.0, sin(phi),  cos(phi), 0.0,
00452                   0.0, 0.0, 0.0, 1.0);
00453 
00454   phi = toRad( m_yRot );
00455   Matrix rotYMtx( cos(phi), 0.0, sin(phi), 0.0,
00456                   0.0, 1.0, 0.0, 0.0,
00457                   -sin(phi), 0.0,  cos(phi), 0.0,
00458                   0.0, 0.0, 0.0, 1.0);
00459 
00460   phi = toRad( m_zRot );
00461   Matrix rotZMtx( cos(phi), -sin(phi), 0.0, 0.0,
00462                   sin(phi), cos(phi), 0.0, 0.0,
00463                   0.0, 0.0,  1.0, 0.0,
00464                   0.0, 0.0, 0.0, 1.0);
00465 
00466   // ( A * B )^-1 = B^-1 * A^-1
00467 
00468   //m_invRotMatrix = rotXMtx; // z ok
00469   //m_invRotMatrix = rotYMtx; // z ok, x dreht sich mit
00470   //m_invRotMatrix = rotZMtx; // z ok, y ok, 
00471 /*
00472   rotXMtx = rotXMtx.GetInverse();
00473   rotYMtx = rotYMtx.GetInverse();
00474   rotZMtx = rotZMtx.GetInverse();
00475 */
00476   //m_invRotMatrix = rotZMtx * rotYMtx * rotXMtx;
00477   m_invRotMatrix = rotXMtx * rotYMtx * rotZMtx;
00478 
00479   m_invRotMatrix.translate( Vector( 0.5, 0.5, 0.5) );
00480 
00481 
00482   // find max dimension
00483   float maxDim = 0.0;
00484 
00485   if ( m_dimX > m_dimY )
00486     if ( m_dimX > m_dimZ )
00487       maxDim = m_dimX;
00488     else
00489       maxDim = m_dimZ;
00490   else  // x < y
00491     if ( m_dimY > m_dimZ )
00492       maxDim = m_dimY;
00493     else
00494       maxDim = m_dimZ;
00495 
00496   float scaleX = m_dimX / maxDim;
00497   float scaleY = m_dimY / maxDim;
00498   float scaleZ = m_dimZ / maxDim;
00499 
00500 /*
00501   cout << "scaleX: " << scaleX
00502     << ", scaleY: " << scaleY
00503     << ", scaleZ: " << scaleZ
00504     << endl;
00505 */
00506     m_invRotMatrix.scale( Vector(scaleX, scaleY, scaleZ) );
00507 
00508 
00509 
00510   //m_invRotMatrix = m_invRotMatrix.GetTransposed();
00511   m_invRotMatrix = m_invRotMatrix.GetInverse();
00512 /*
00513   Matrix help = m_invRotMatrix.GetTransposed();
00514   float elem = 0.0;
00515   cout << "inv-rot-Matrix: " << endl;
00516   for (int i=0; i<16; i++)
00517   {
00518     cout << help.Get( i ) << " ";
00519 
00520     if ( i==3 || i==7 || i==11 || i==15 )
00521       cout << "" << endl;
00522   }
00523   */
00524 }
00525 
00526 
00527 void OpenGLWidget::renderView()
00528 {
00529 //  cout << "renderView..." << endl;
00530 
00531   if ( glIsEnabled( GL_TEXTURE_3D ) )
00532     glDisable( GL_TEXTURE_3D );
00533 
00534   // gl setup
00535   glViewport( 0, 0, this->m_view3DWidth, this->m_view3DHeight );
00536 
00537   glShadeModel( GL_SMOOTH );
00538 
00539   glEnable( GL_DEPTH_TEST );
00540         glDepthFunc( GL_LEQUAL );
00541 
00542         glClearColor( 0.0, 0.0, 0.0, 0.0 );
00543         glClearDepth( 1.0f );
00544   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
00545 
00546   glLoadIdentity();
00547 /*
00548   glRotated( m_xRot, 1.0, 0.0, 0.0 );
00549   glRotated( m_yRot, 0.0, 1.0, 0.0 );
00550   glRotated( m_zRot, 0.0, 0.0, 1.0 );
00551 
00552   glTranslatef( -0.5f, -0.5f, -0.5f );
00553   //glScaled( 10.0, 10.0, 10.0 );
00554 */
00555 
00556   // render bounding-cubes
00557   renderFrontSideBuffer();
00558   renderBackSideBuffer();
00559 
00560   //testRenderedToBuffer();
00561 
00562   // do raycasting
00563   if ( m_showView == SHOW_VOLUME )
00564     doRaycasting();
00565   else
00566     testRenderedToBuffer();
00567 
00568   // done rendering
00569   glDisable( GL_DEPTH_TEST );
00570 }
00571 
00572 
00573 void OpenGLWidget::doRaycasting()
00574 {
00575   
00576   createInvRotMatrix();
00577 
00578   glPushMatrix();
00579 
00580   glMatrixMode( GL_MODELVIEW );
00581   glLoadIdentity();
00582 
00583 
00584   // enable shader
00585   glUseProgram( m_shaderProgram );
00586 
00587   glEnable( GL_BLEND );
00588   glBlendFunc( GL_SRC_ALPHA, GL_ZERO );
00589 
00590   // set parameters
00591   int loc_renderMode = glGetUniformLocation( m_shaderProgram, "renderMode" );
00592   glUniform1i( loc_renderMode, m_renderMode );
00593 
00594   m_stepSize  = glGetUniformLocation( m_shaderProgram, "numberOfSamplesPerRay" );
00595   glUniform1f( m_stepSize, m_rayStepSize );
00596 
00597   float volumeDiagonal = sqrt( (float)(m_dimX^2 + m_dimY^2 + m_dimZ^2) );
00598   GLint loc_diagonal = glGetUniformLocation( m_shaderProgram, "maxRayLength" );
00599   glUniform1f( loc_diagonal, volumeDiagonal );
00600 
00601   // set dimensions
00602 /*  float m = 0.2;
00603   float vsX = m;
00604   float vsY = m;
00605   float vsZ = m;*/
00606 
00607   float vsX = (float) 1 / m_dimX;
00608   float vsY = (float) 1 / m_dimY;
00609   float vsZ = (float) 1 / m_dimZ;
00610 
00611   /*
00612   cout << "vsX: " << vsX << endl;
00613   cout << "vsY: " << vsY << endl;
00614   cout << "vsZ: " << vsZ << endl;
00615 */
00616 
00617   GLint loc_vsX = glGetUniformLocation( m_shaderProgram, "vsX" );
00618   glUniform1f( loc_vsX, vsX );
00619 
00620   GLint loc_vsY = glGetUniformLocation( m_shaderProgram, "vsY" );
00621   glUniform1f( loc_vsY, vsY );
00622 
00623   GLint loc_vsZ = glGetUniformLocation( m_shaderProgram, "vsZ" );
00624   glUniform1f( loc_vsZ, vsZ );
00625 /*
00626   GLint loc_vsX = glGetUniformLocation( m_shaderProgram, "vsX" );
00627   glUniform1f( loc_vsX, (float)(1/m_dimX) );
00628 
00629   GLint loc_vsY = glGetUniformLocation( m_shaderProgram, "vsY" );
00630   glUniform1f( loc_vsY, (float)(1/m_dimY) );
00631 
00632   GLint loc_vsZ = glGetUniformLocation( m_shaderProgram, "vsZ" );
00633   glUniform1f( loc_vsZ, (float)(1/m_dimZ) );
00634 /*
00635   cout << " ks: " << m_ks << endl;
00636   cout << " ka: " << m_ka << endl;
00637   cout << " kd: " << m_kd << endl;
00638   cout << " kg: " << m_kg << endl;
00639 */
00640   // set phong-params
00641   GLint loc_ka = glGetUniformLocation( m_shaderProgram, "ka" );
00642   glUniform1f( loc_ka, m_ka );
00643 
00644   GLint loc_kd = glGetUniformLocation( m_shaderProgram, "kd" );
00645   glUniform1f( loc_kd, m_kd );
00646 
00647   GLint loc_ks = glGetUniformLocation( m_shaderProgram, "ks" );
00648   glUniform1f( loc_ks, m_ks );
00649 
00650   GLint loc_kg = glGetUniformLocation( m_shaderProgram, "pn" );
00651   glUniform1f( loc_kg, m_kg );
00652 
00653   GLint loc_invRotMat = glGetUniformLocation( m_shaderProgram, "invRotMatrix" );
00654   glUniformMatrix4fv( loc_invRotMat, 1, 0, m_invRotMatrix.Get() );
00655 
00656   //glBlendFunc( GL_ONE, GL_ZERO );
00657 
00658   //glEnable( GL_TEXTURE_2D );
00659   //glTranslatef( -1.0, -1.0, 0.0 );
00660 
00661   m_volume    = glGetUniformLocation( m_shaderProgram, "volume"    );
00662   m_frontSide = glGetUniformLocation( m_shaderProgram, "frontSide" );
00663   m_backSide  = glGetUniformLocation( m_shaderProgram, "backSide"  );
00664   m_tf        = glGetUniformLocation( m_shaderProgram, "tf"        );
00665 
00666   glActiveTexture( GL_TEXTURE0 );
00667   glEnable( GL_TEXTURE_3D );
00668   glBindTexture( GL_TEXTURE_3D, m_textureHandle3d );
00669   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_NONE);
00670   glUniform1i( m_volume, 0 );
00671 
00672   glActiveTexture( GL_TEXTURE1 );
00673   glEnable( GL_TEXTURE_2D );
00674   glBindTexture( GL_TEXTURE_2D, m_fsRenderTexture );
00675   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_NONE);
00676   glUniform1i( m_frontSide, 1 );
00677 
00678   glActiveTexture( GL_TEXTURE2 );
00679   glEnable( GL_TEXTURE_2D );
00680   glBindTexture( GL_TEXTURE_2D, m_bsRenderTexture );
00681   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_NONE);
00682   glUniform1i( m_backSide, 2 );
00683 
00684   glActiveTexture( GL_TEXTURE3 );
00685   glEnable( GL_TEXTURE_1D );
00686   //glTexParameterf( GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, 0.0f );
00687   glBindTexture( GL_TEXTURE_3D, m_textureHandle1d );
00688   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_NONE);
00689   glUniform1i( m_tf, 3 );
00690 
00691 /*  float pos[] = { 1.0, 1.0, 1.0, 1.0 };
00692   glLightfv( GL_LIGHT0, GL_POSITION, pos );
00693   glEnable( GL_LIGHTING );
00694   glEnable( GL_LIGHT0 );
00695 */
00696   //glActiveTexture( GL_TEXTURE1 );
00697   drawQuad();
00698 
00699   //glDisable( GL_TEXTURE_2D );
00700   glDisable( GL_BLEND );
00701 /*
00702   glDisable( GL_LIGHTING );
00703   glDisable( GL_LIGHT0 );
00704 */
00705   glUseProgram( 0 );
00706 
00707   glPopMatrix();
00708 }
00709 
00710 
00711 void OpenGLWidget::drawQuad()
00712 {
00713   glBegin(GL_QUADS);
00714           //glColor3f( 1.0, 1.0, 1.0 );
00715   glMultiTexCoord2f( GL_TEXTURE0, 0, 0 );
00716   glMultiTexCoord2f( GL_TEXTURE1, 0, 0 );
00717   glMultiTexCoord2f( GL_TEXTURE2, 0, 0 );
00718   glVertex2f( -1.0f, -1.0f );
00719   //glVertex3f( -1.0f, -1.0f, -1.0f  );
00720 
00721   glMultiTexCoord2f( GL_TEXTURE0, 1, 0 );
00722   glMultiTexCoord2f( GL_TEXTURE1, 1, 0 );
00723   glMultiTexCoord2f( GL_TEXTURE2, 1, 0 );
00724   glVertex2f(  1.0f, -1.0f );
00725   //glVertex3f(  1.0f, -1.0f, -1.0f  );
00726 
00727   glMultiTexCoord2f( GL_TEXTURE0, 1, 1 );
00728   glMultiTexCoord2f( GL_TEXTURE1, 1, 1 );
00729   glMultiTexCoord2f( GL_TEXTURE2, 1, 1 );
00730   glVertex2f(  1.0f,  1.0f );
00731   //glVertex3f(  1.0f,  1.0f, -1.0f  );
00732 
00733   glMultiTexCoord2f( GL_TEXTURE0, 0, 1 );
00734   glMultiTexCoord2f( GL_TEXTURE1, 0, 1 );
00735   glMultiTexCoord2f( GL_TEXTURE2, 0, 1 );
00736   glVertex2f( -1.0f,  1.0f );
00737   //glVertex3f( -1.0f,  1.0f, -1.0f  );
00738 
00739 /*
00740     glNormal3f(  0.0, 0.0, 1.0 );
00741     glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0f, -1.0f, -1.0f  );
00742     glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0f, -1.0f, -1.0f  );
00743           glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0f,  1.0f, -1.0f  );
00744     glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0f,  1.0f, -1.0f  );
00745 */
00746   glEnd();
00747 }
00748 
00749 
00750 void OpenGLWidget::drawBoundingCube( float x, float y, float z )
00751 {
00752 
00753   glBegin(GL_QUADS);
00754           glColor4f( 1.0, 0.0, 0.0, 1.0 ); glVertex3f(     x, 0.0f, 0.0f  );
00755           glColor4f( 0.0, 0.0, 0.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00756     glColor4f( 0.0, 1.0, 0.0, 1.0 ); glVertex3f(  0.0f,    y, 0.0f  );
00757     glColor4f( 1.0, 1.0, 0.0, 1.0 ); glVertex3f(     x,    y, 0.0f  );
00758 
00759           glColor4f( 0.0, 0.0, 1.0, 1.0 ); glVertex3f(  0.0f, 0.0f,    z  );
00760           glColor4f( 1.0, 0.0, 1.0, 1.0 ); glVertex3f(     x, 0.0f,    z  );
00761           glColor4f( 1.0, 1.0, 1.0, 1.0 ); glVertex3f(     x,    y,    z  );
00762           glColor4f( 0.0, 1.0, 1.0, 1.0 ); glVertex3f(  0.0f,    y,    z  );
00763 
00764           glColor4f( 0.0, 0.0, 1.0, 1.0 ); glVertex3f(  0.0f, 0.0f,    z  );
00765     glColor4f( 0.0, 0.0, 0.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00766           glColor4f( 1.0, 0.0, 0.0, 1.0 ); glVertex3f(     x, 0.0f, 0.0f  );
00767     glColor4f( 1.0, 0.0, 1.0, 1.0 ); glVertex3f(     x, 0.0f,    z  );
00768 
00769           glColor4f( 0.0, 1.0, 1.0, 1.0 ); glVertex3f(  0.0f,    y,    z  );
00770           glColor4f( 1.0, 1.0, 1.0, 1.0 ); glVertex3f(     x,    y,    z  );
00771           glColor4f( 1.0, 1.0, 0.0, 1.0 ); glVertex3f(     x,    y, 0.0f  );
00772     glColor4f( 0.0, 1.0, 0.0, 1.0 ); glVertex3f(  0.0f,    y, 0.0f  );
00773 
00774           glColor4f( 0.0, 0.0, 0.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00775     glColor4f( 0.0, 0.0, 1.0, 1.0 ); glVertex3f(  0.0f, 0.0f,    z  );
00776           glColor4f( 0.0, 1.0, 1.0, 1.0 ); glVertex3f(  0.0f,    y,    z  );
00777     glColor4f( 0.0, 1.0, 0.0, 1.0 ); glVertex3f(  0.0f,    y, 0.0f  );
00778 
00779           glColor4f( 1.0, 0.0, 1.0, 1.0 ); glVertex3f(     x, 0.0f,    z  );
00780     glColor4f( 1.0, 0.0, 0.0, 1.0 ); glVertex3f(     x, 0.0f, 0.0f  );
00781           glColor4f( 1.0, 1.0, 0.0, 1.0 ); glVertex3f(     x,    y, 0.0f  );
00782           glColor4f( 1.0, 1.0, 1.0, 1.0 ); glVertex3f(     x,    y,    z  );
00783   glEnd();
00784 }
00785 
00786 
00787 void OpenGLWidget::drawBackSideCube()
00788 {
00789   glBegin(GL_QUADS);
00790           glColor3f( 1.0, 0.0, 0.0 ); glVertex3f(  1.0f, 0.0f, 0.0f  );
00791           glColor3f( 1.0, 1.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00792           //glColor3f( 0.0, 0.0, 0.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00793     glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(  0.0f, 1.0f, 0.0f  );
00794     glColor3f( 1.0, 1.0, 0.0 ); glVertex3f(  1.0f, 1.0f, 0.0f  );
00795 
00796           glColor3f( 0.0, 0.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 1.0f  );
00797           glColor3f( 1.0, 0.0, 1.0 ); glVertex3f(  1.0f, 0.0f, 1.0f  );
00798           glColor3f( 0.0, 0.0, 0.0 ); glVertex3f(  1.0f, 1.0f, 1.0f  );
00799           //glColor3f( 1.0, 1.0, 1.0 ); glVertex3f(  1.0f, 1.0f, 1.0f  );
00800           glColor3f( 0.0, 1.0, 1.0 ); glVertex3f(  0.0f, 1.0f, 1.0f  );
00801 
00802           glColor3f( 0.0, 0.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 1.0f  );
00803     glColor3f( 1.0, 1.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00804     //glColor3f( 0.0, 0.0, 0.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00805           glColor3f( 1.0, 0.0, 0.0 ); glVertex3f(  1.0f, 0.0f, 0.0f  );
00806     glColor3f( 1.0, 0.0, 1.0 ); glVertex3f(  1.0f, 0.0f, 1.0f  );
00807 
00808           glColor3f( 0.0, 1.0, 1.0 ); glVertex3f(  0.0f, 1.0f, 1.0f  );
00809           glColor3f( 0.0, 0.0, 0.0 ); glVertex3f(  1.0f, 1.0f, 1.0f  );
00810           //glColor3f( 1.0, 1.0, 1.0 ); glVertex3f(  1.0f, 1.0f, 1.0f  );
00811           glColor3f( 1.0, 1.0, 0.0 ); glVertex3f(  1.0f, 1.0f, 0.0f  );
00812     glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(  0.0f, 1.0f, 0.0f  );
00813 
00814           glColor3f( 1.0, 1.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00815           //glColor3f( 0.0, 0.0, 0.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00816     glColor3f( 0.0, 0.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 1.0f  );
00817           glColor3f( 0.0, 1.0, 1.0 ); glVertex3f(  0.0f, 1.0f, 1.0f  );
00818     glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(  0.0f, 1.0f, 0.0f  );
00819 
00820           glColor3f( 1.0, 0.0, 1.0 ); glVertex3f(  1.0f, 0.0f, 1.0f  );
00821     glColor3f( 1.0, 0.0, 0.0 ); glVertex3f(  1.0f, 0.0f, 0.0f  );
00822           glColor3f( 1.0, 1.0, 0.0 ); glVertex3f(  1.0f, 1.0f, 0.0f  );
00823           glColor3f( 0.0, 0.0, 0.0 ); glVertex3f(  1.0f, 1.0f, 1.0f  );
00824           //glColor3f( 1.0, 1.0, 1.0 ); glVertex3f(  1.0f, 1.0f, 1.0f  );
00825   glEnd();
00826 }
00827 
00828 
00829 void OpenGLWidget::drawCube()
00830 {
00831   glBegin(GL_QUADS);
00832     // back-side
00833           glColor3f( 1.0, 0.0, 0.0 );
00834     glNormal3f(  0.0, 0.0, -1.0 );
00835     glTexCoord2f( 0.0, 0.0 ); glVertex3f(  1.0f, 0.0f, 0.0f  );
00836     glTexCoord2f( 0.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00837           glTexCoord2f( 1.0, 0.0 ); glVertex3f(  0.0f, 1.0f, 0.0f  );
00838     glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0f, 1.0f, 0.0f  );
00839 
00840     // front-side
00841           glColor3f( 0.0, 1.0, 0.0 );
00842     glNormal3f(  0.0, 0.0, 1.0 );
00843           glTexCoord2f( 0.0, 0.0 ); glVertex3f(  0.0f, 0.0f, 1.0f  );
00844           glTexCoord2f( 0.0, 1.0 ); glVertex3f(  1.0f, 0.0f, 1.0f  );
00845           glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0f, 1.0f, 1.0f  );
00846           glTexCoord2f( 1.0, 1.0 ); glVertex3f(  0.0f, 1.0f, 1.0f  );
00847 
00848     // bottom-side
00849           glColor3f( 0.0, 0.0, 1.0 );
00850     glNormal3f(  0.0, -1.0, 0.0 );
00851           glTexCoord2f( 0.0, 0.0 ); glVertex3f(  0.0f, 0.0f, 1.0f  );
00852     glTexCoord2f( 0.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00853           glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0f, 0.0f, 0.0f  );
00854     glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0f, 0.0f, 1.0f  );
00855 
00856     // top-side
00857           glColor3f( 1.0, 1.0, 0.0 );
00858     glNormal3f(  0.0, 1.0, 0.0 );
00859           glTexCoord2f( 0.0, 0.0 ); glVertex3f(  0.0f, 1.0f, 1.0f  );
00860           glTexCoord2f( 0.0, 1.0 ); glVertex3f(  1.0f, 1.0f, 1.0f  );
00861           glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0f, 1.0f, 0.0f  );
00862     glTexCoord2f( 1.0, 1.0 ); glVertex3f(  0.0f, 1.0f, 0.0f  );
00863 
00864     // left-side
00865           glColor3f( 0.0, 1.0, 1.0 );
00866     glNormal3f(  -1.0, 0.0, 0.0 );
00867     glTexCoord2f( 0.0, 0.0 ); glVertex3f(  0.0f, 0.0f, 0.0f  );
00868     glTexCoord2f( 0.0, 1.0 ); glVertex3f(  0.0f, 0.0f, 1.0f  );
00869           glTexCoord2f( 1.0, 0.0 ); glVertex3f(  0.0f, 1.0f, 1.0f  );
00870     glTexCoord2f( 1.0, 1.0 ); glVertex3f(  0.0f, 1.0f, 0.0f  );
00871 
00872     // right-side
00873           glColor3f( 0.0, 0.0, 0.0 );
00874     glNormal3f(  1.0, 0.0, 0.0 );
00875           glTexCoord2f( 0.0, 0.0 ); glVertex3f(  1.0f, 0.0f, 1.0f  );
00876     glTexCoord2f( 0.0, 1.0 ); glVertex3f(  1.0f, 0.0f, 0.0f  );
00877           glTexCoord2f( 1.0, 0.0 ); glVertex3f(  1.0f, 1.0f, 0.0f  );
00878           glTexCoord2f( 1.0, 1.0 ); glVertex3f(  1.0f, 1.0f, 1.0f  );
00879   glEnd();
00880 }
00881 
00882 
00883 bool OpenGLWidget::createBuffers()
00884 {
00885 
00886   // --- FRONT SIDE ---
00887 
00888   // --- setup FBO
00889   glGenFramebuffersEXT( 1, &m_fsFbo );
00890   glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_fsFbo );
00891 
00892   // setup render-buffer
00893   glGenRenderbuffersEXT( 1, &m_fsRenderBuffer );
00894 
00895   glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_fsRenderBuffer );
00896   glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->m_view3DWidth, this->m_view3DHeight );
00897   glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_fsRenderBuffer );
00898 
00899   // setup texture
00900   glGenTextures( 1, &m_fsRenderTexture );
00901 
00902   glBindTexture( GL_TEXTURE_2D, m_fsRenderTexture );
00903   glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, this->m_view3DWidth, this->m_view3DHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
00904 
00905   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
00906   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
00907   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00908   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00909 
00910   glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_fsRenderTexture, 0 );
00911 
00912   GLenum fboStatus = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
00913 
00914   if ( fboStatus != GL_FRAMEBUFFER_COMPLETE_EXT )
00915   {
00916     cout << " - FBO-setup failed!" << endl;
00917     cout << "   Error-Code" << glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ) << endl;
00918     // Error-Codes:
00919     // 36053 == 0x8CD5 == FRAMEBUFFER_COMPLETE_EXT                       <- if everything ok
00920     // 36054 == 0x8CD6 == FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT          <- something incomplete (zero-sized width/heigth?)
00921     // 36055 == 0x8CD7 == FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT  <- misssing some attachement
00922     // 36060 == 0x8CDC == FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT         <- no texture
00923     // 36061 == 0x8CDD == FRAMEBUFFER_UNSUPPORTED_EXT                    <- if no filter for texture defined
00924 
00925     return false;
00926   }
00927   else
00928     cout << " - FBO-setup successful" << endl;
00929 
00930 
00931   // --- BACK SIDE ---
00932 
00933   // --- setup FBO
00934   glGenFramebuffersEXT( 1, &m_bsFbo );
00935   glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_bsFbo );
00936 
00937   // setup render-buffer
00938   glGenRenderbuffersEXT( 1, &m_bsRenderBuffer );
00939 
00940   glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_bsRenderBuffer );
00941   glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this->m_view3DWidth, this->m_view3DHeight );
00942   glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_bsRenderBuffer );
00943 
00944   // setup texture
00945   glGenTextures( 1, &m_bsRenderTexture );
00946 
00947   glBindTexture( GL_TEXTURE_2D, m_bsRenderTexture );
00948   glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, this->m_view3DWidth, this->m_view3DHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );
00949 
00950   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
00951   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
00952   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00953   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00954 
00955   glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_bsRenderTexture, 0 );
00956 
00957   fboStatus = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
00958 
00959   if ( fboStatus != GL_FRAMEBUFFER_COMPLETE_EXT )
00960   {
00961     cout << " - FBO-setup failed!" << endl;
00962     cout << "   Error-Code" << glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ) << endl;
00963     return false;
00964   }
00965   else
00966     cout << " - FBO-setup successful" << endl;
00967 
00968   return true;
00969 }
00970 
00971 
00972 void OpenGLWidget::renderFrontSideBuffer()
00973 {
00974   glPushMatrix();
00975 
00976   // --- bind framebuffer
00977   glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_fsFbo );
00978   glPushAttrib( GL_VIEWPORT_BIT );
00979   glViewport( 0, 0, this->m_viewWidth, this->m_viewHeight );
00980 
00981   // render
00982         glClearColor( 0.0, 0.0, 0.0, 0.0 );
00983   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
00984 
00985 
00986   glLoadIdentity();
00987 
00988   glRotated( m_xRot, 1.0, 0.0, 0.0 );
00989   glRotated( m_yRot, 0.0, 1.0, 0.0 );
00990   glRotated( m_zRot, 0.0, 0.0, 1.0 );
00991 
00992   glTranslatef( -0.5f, -0.5f, -0.5f );
00993   //glScaled( 10.0, 10.0, 10.0 );
00994 
00995   glEnable( GL_CULL_FACE );
00996         glCullFace( GL_FRONT );
00997 
00998 
00999   // find max dimension
01000   float maxDim = 0.0;
01001 
01002   if ( m_dimX > m_dimY )
01003     if ( m_dimX > m_dimZ )
01004       maxDim = m_dimX;
01005     else
01006       maxDim = m_dimZ;
01007   else  // x < y
01008     if ( m_dimY > m_dimZ )
01009       maxDim = m_dimY;
01010     else
01011       maxDim = m_dimZ;
01012 
01013   float x = m_dimX / maxDim;
01014   float y = m_dimY / maxDim;
01015   float z = m_dimZ / maxDim;
01016 /*
01017   cout << "x: " << x
01018     << ", y: " << y
01019     << ", z: " << z
01020     << endl;
01021 */
01022   drawBoundingCube( x, y, z );
01023 
01024   glDisable( GL_CULL_FACE );
01025 
01026   // unbind framebuffer
01027   glPopAttrib();
01028   glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
01029 
01030   glPopMatrix();
01031 }
01032 
01033 
01034 void OpenGLWidget::renderBackSideBuffer()
01035 {
01036   glPushMatrix();
01037 
01038   // --- bind framebuffer
01039   glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_bsFbo );
01040   glPushAttrib( GL_VIEWPORT_BIT );
01041   glViewport( 0, 0, this->m_viewWidth, this->m_viewHeight );
01042 
01043   // render
01044         glClearColor( 0.0, 0.0, 0.0, 0.0 );
01045   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
01046 
01047   glLoadIdentity();
01048 
01049   glRotated( m_xRot, 1.0, 0.0, 0.0 );
01050   glRotated( m_yRot, 0.0, 1.0, 0.0 );
01051   glRotated( m_zRot, 0.0, 0.0, 1.0 );
01052 
01053   glTranslatef( -0.5f, -0.5f, -0.5f );
01054   //glScaled( 10.0, 10.0, 10.0 );
01055 
01056   glEnable( GL_CULL_FACE );
01057         glCullFace( GL_BACK );
01058 
01059 
01060   // find max dimension
01061   float maxDim = 0.0;
01062 
01063   if ( m_dimX > m_dimY )
01064     if ( m_dimX > m_dimZ )
01065       maxDim = m_dimX;
01066     else
01067       maxDim = m_dimZ;
01068   else  // x < y
01069     if ( m_dimY > m_dimZ )
01070       maxDim = m_dimY;
01071     else
01072       maxDim = m_dimZ;
01073 
01074   float x = m_dimX / maxDim;
01075   float y = m_dimY / maxDim;
01076   float z = m_dimZ / maxDim;
01077 /*
01078   cout << "x: " << x
01079     << ", y: " << y
01080     << ", z: " << z
01081     << endl;
01082 */
01083   drawBoundingCube( x, y, z );
01084 
01085   //drawBoundingCube( 1.0, 1.0, 1.0 );
01086 
01087   glDisable( GL_CULL_FACE );
01088 
01089 /*
01090   glEnable( GL_CULL_FACE );
01091         glCullFace( GL_FRONT );
01092 
01093   drawBackSideCube();
01094 
01095   glDisable( GL_CULL_FACE );
01096 */
01097   // unbind framebuffer
01098   glPopAttrib();
01099   glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
01100 
01101   glPopMatrix();
01102 }
01103 
01104 
01105 void OpenGLWidget::testRenderedToBuffer()
01106 {
01107   // map rendered-to-texture to quad
01108   glClearColor( 0.0, 0.0, 0.0, 0.0 );
01109   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
01110 
01111   glLoadIdentity();
01112   glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
01113 
01114   //glActiveTexture( GL_TEXTURE0 );
01115 
01116   if ( m_showView == SHOW_BACK_SIDE )
01117     glBindTexture( GL_TEXTURE_2D, m_bsRenderTexture );
01118   else
01119     glBindTexture( GL_TEXTURE_2D, m_fsRenderTexture );
01120 
01121   glEnable( GL_TEXTURE_2D );
01122 
01123         glBegin(GL_QUADS);
01124           glTexCoord2f( 0.0f,  0.0f );
01125           glVertex3f(  -1.0f, -1.0f, 0.0f  );
01126 
01127           glTexCoord2f( 1.0f,  0.0f );
01128           glVertex3f(   1.0f, -1.0f, 0.0f  );
01129 
01130           glTexCoord2f( 1.0f, 1.0f );
01131           glVertex3f(   1.0f, 1.0f, 0.0f  );
01132 
01133           glTexCoord2f( 0.0f, 1.0f );
01134           glVertex3f(  -1.0f, 1.0f, 0.0f  );
01135         glEnd();
01136 
01137   glDisable( GL_TEXTURE_2D );
01138 }
01139 
01140 
01141 
01142 bool OpenGLWidget::loadShader()
01143 {
01144   cout << "loadShader..." << endl;
01145 
01146   char* vsFile = readShaderFile( "src/raycasting.vert" );
01147   char* fsFile = readShaderFile( "src/raycasting.frag" );
01148 
01149   if ( vsFile!=NULL && fsFile!=NULL )
01150   {
01151     m_vertexShader   = glCreateShader( GL_VERTEX_SHADER );
01152     m_fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
01153 
01154     const char* c_vsFile = vsFile;
01155     const char* c_fsFile = fsFile;
01156 
01157     glShaderSource( m_vertexShader,   1, &c_vsFile, NULL );
01158     glShaderSource( m_fragmentShader, 1, &c_fsFile, NULL );
01159 
01160     free( vsFile );
01161     free( fsFile );
01162 
01163     glCompileShader( m_vertexShader   );
01164     glCompileShader( m_fragmentShader );
01165 
01166         printShaderInfoLog(m_vertexShader);
01167       printShaderInfoLog(m_fragmentShader);
01168 
01169     m_shaderProgram = glCreateProgram();
01170     glAttachShader( m_shaderProgram, m_vertexShader   );
01171     glAttachShader( m_shaderProgram, m_fragmentShader );
01172 
01173     glLinkProgram( m_shaderProgram );
01174     printProgramInfoLog(m_shaderProgram);
01175 
01176 
01177     //glUseProgram( m_shaderProgram );
01178 
01179     glUseProgram( 0 );
01180 
01181     return true;
01182   }
01183   return false;
01184 }
01185 
01186 
01187 void OpenGLWidget::unloadShader()
01188 {
01189   cout << "unloadShader..." << endl;
01190 
01191   // TODO: unload shaders here!
01192 
01193   // use fixed-function again
01194   glUseProgram( 0 );
01195 
01196 }
01197 
01201 char* OpenGLWidget::readShaderFile( char* shaderFile ) {
01202 
01203         FILE *file;
01204         char *content = NULL;
01205         int   count   = 0;
01206 
01207         if ( shaderFile!=NULL ) {
01208                 fopen_s( &file, shaderFile, "rt" );
01209 
01210                 if (file != NULL) {
01211       fseek( file, 0, SEEK_END );
01212       count = ftell( file );
01213       rewind( file );
01214 
01215                         if ( count > 0 ) {
01216                                 content = (char*) malloc( sizeof(char) * (count+1) );
01217                                 count   = (int) fread( content, sizeof(char), count, file );
01218                                 content[count] = '\0';
01219                         }
01220                         fclose( file );
01221                 }
01222         }
01223         return content;
01224 }
01225 
01226 
01227 void OpenGLWidget::GenerateGradientTexture( const QGradientStops &gStops )
01228 {
01229 /*
01230   // TEST
01231   QGradientStop gs;
01232   for ( int i=0; i<gStops.size(); i++ )
01233   {
01234     gs = gStops.at(i);
01235 
01236     qreal r = gs.first;
01237     QColor c = gs.second;
01238 
01239     cout << "gs: "
01240       << "r: " << r
01241       << ", c: " <<
01242       "( " << c.red()   <<
01243       ", " << c.green() <<
01244       ", " << c.blue()  <<
01245       ", " << c.alpha() <<
01246       ")" << endl;
01247   }
01248 */
01249 
01250 
01251   // generate texture from gradient
01252   QPolygonF pts;
01253   pts << QPointF( 0, 0 ) << QPointF( TF_TEXTURE_SIZE - 1, 0 );
01254 
01255   QGradient g;
01256   g = QLinearGradient(pts.at(0), pts.at(1));
01257   g.setSpread(QGradient::PadSpread);
01258 
01259   for(int i = 0; i < gStops.size(); i++)
01260   {
01261     g.setColorAt(gStops.at(i).first, gStops.at(i).second);
01262   }
01263 
01264   QImage image = QImage(TF_TEXTURE_SIZE, 1, QImage::Format_ARGB32);
01265   image.fill(Qt::transparent);
01266 
01267   // paint to QImage
01268   QPainter p(&image);
01269 
01270   // paint gradient to QImage
01271   p.fillRect(image.rect(), g);
01272 
01273   // TEST -> Save image to file to check texture
01274   //image.save("tf_texture.tiff", "TIFF");
01275   //image.save("tf_texture.png", "PNG");
01276 
01277   //QImage alphaImage = image.alphaChannel();
01278   //alphaImage.save("tf_alpha.png", "PNG");
01279 
01280     //for(int i = 0; i < image.bytesPerLine(); i++)
01281    //{
01282      //QRgb* a = (QRgb*) image.scanLine(0);
01283      //printf("%d\n", qAlpha(*a) );
01284 
01285   // generate 1d-texture from QImage
01286   QImage texture = QGLWidget::convertToGLFormat( image );
01287 
01288   //texture.save("GLTEXTURE.TIFF", "TIFF");
01289 
01290   glTexImage1D(GL_TEXTURE_1D, 0, 4, texture.width(), 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.bits() );
01291 
01292   // set 1d parameter
01293   glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
01294         glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
01295 
01296   glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP );
01297 
01298   GLfloat bCol[] = { 0.0, 0.0, 0.0, 1.0 };
01299   glTexParameterfv(GL_TEXTURE_1D, GL_TEXTURE_BORDER_COLOR, bCol );
01300 
01301   if ( m_Axis == OPENGL_3D_VIEW )
01302     this->updateGL();
01303 }
01304 
01305 bool OpenGLWidget::create3DTexture( Volume *volume )
01306 {
01307         glGenTextures( 1, &m_textureHandle3d );
01308 
01309         GLenum glError = glGetError();
01310         if (glError != GL_NO_ERROR)
01311         {
01312                 cerr<<"Error generating texture: " << gluErrorString(glError) << endl;
01313         }
01314         else if ( m_textureHandle3d )
01315         {
01316 
01317     if( GLEW_EXT_texture3D )
01318                 {
01319                         //bind texture
01320                         glBindTexture(GL_TEXTURE_3D, m_textureHandle3d);
01321 
01322                         glError = glGetError();
01323                         if (glError != GL_NO_ERROR)
01324                         {
01325                                 cerr << "Could not bind texture: " << gluErrorString(glError) << endl;
01326                         }
01327                         else
01328                         {
01329                                 // Get Size of 3D Volume
01330         int iTextureWidth  = volume->getSizeX();
01331                                 int iTextureHeight = volume->getSizeY();
01332                                 int iTextureDepth  = volume->getSizeZ();
01333 
01334         m_dimX = volume->getSizeX();
01335         m_dimY = volume->getSizeY();
01336         m_dimZ = volume->getSizeZ();
01337 
01338                                 // Extend textures to a power of two if no GLEW_ARB_... available
01339                                 if (!GLEW_ARB_texture_non_power_of_two)
01340                                 {
01341           cout << "expand volume-tex to next power of two..." << endl;
01342                                         iTextureWidth  = GetNextPowerOfTwo( volume->getSizeX() );
01343                                         iTextureHeight = GetNextPowerOfTwo( volume->getSizeY() );
01344                                         iTextureDepth  = GetNextPowerOfTwo( volume->getSizeZ() );
01345                                 }
01346 
01347                                 // upload texture
01348 
01349                                 glTexImage3D(GL_TEXTURE_3D_EXT, 0, GL_LUMINANCE,            // target, LOD, internalFormat (?)
01350                      iTextureWidth, iTextureHeight, iTextureDepth,  // width, heigth, depth
01351                      0, GL_LUMINANCE, GL_FLOAT,     // border, format, type
01352                      (void *) volume->getVolume()   // volume
01353                      );
01354 
01355         // why do we need glTexSubImage3D?
01356         glTexSubImage3D(GL_TEXTURE_3D_EXT, 0,   // target, LOD
01357                         0, 0, 0,                // xoffset, yoffset, zoffset,
01358                         iTextureWidth, iTextureHeight, iTextureDepth,         // width, heigth, depth
01359                         GL_LUMINANCE, GL_FLOAT, (void *) volume->getVolume()  // format, type, volume
01360                         );
01361 
01362         /* org:
01363         glTexImage3D(GL_TEXTURE_3D_EXT, 0, GL_LUMINANCE, iTextureWidth, iTextureHeight, iTextureDepth, 0, GL_LUMINANCE, GL_FLOAT, NULL);
01364                                 glTexSubImage3D(GL_TEXTURE_3D_EXT, 0,   // target, LOD
01365                         0, 0, 0,                // xoffset, yoffset, zoffset,
01366                         iTextureWidth, iTextureHeight, iTextureDepth,         // width, heigth, depth
01367                         GL_LUMINANCE, GL_FLOAT, (void *) volume->getVolume()  // format, type, pixel
01368                         );
01369 */        
01370 
01371                                 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
01372                                 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
01373 
01374         glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP );
01375         glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP );
01376         glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP );
01377 
01378         GLfloat bCol[] = { 0.0, 0.0, 0.0, 1.0 };
01379         glTexParameterfv(GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, bCol );
01380 
01381         glError = glGetError();
01382                                 if (glError != GL_NO_ERROR)
01383                                 {
01384                                         cerr<<"Could not upload texture: " << gluErrorString(glError) << endl;
01385                                 }
01386 
01387         // finally report texture as created
01388         m_textureCreated = true;
01389                         }
01390                 }
01391                 else
01392                 {
01393       cout << "- 3D-texture not supported on your hardware!" << endl;
01394                 }
01395         }
01396   return m_textureCreated;
01397 }
01398 
01399 void OpenGLWidget::keyEvent( int key )
01400 {
01401   /*
01402   w = 87
01403   s = 83
01404   a = 65
01405   d = 68
01406   q = 81
01407   e = 69
01408   */
01409 
01410   float delta = 2.0f;
01411 
01412   switch ( key )
01413   {
01414 
01415   case 87: // w
01416     m_xRot += delta;
01417     break;
01418 
01419   case 83: // s
01420     m_xRot -= delta;
01421     break;
01422 
01423   case 65: // a
01424     m_zRot += delta;
01425     break;
01426 
01427   case 68: // d
01428     m_zRot -= delta;
01429     break;
01430 
01431   case 81: // q
01432     m_yRot += delta;
01433     break;
01434 
01435   case 69: // e
01436     m_yRot -= delta;
01437     break;
01438 
01439   case 77: // m
01440     m_mbPressed = !m_mbPressed;
01441     break;
01442 
01443   case 89: // y
01444     ++m_showView;
01445     if ( m_showView == 4 ) m_showView = 1;
01446     break;
01447 
01448   default:
01449     break;
01450   }
01451   this->updateGL();
01452 }
01453 
01454 
01455 
01456 // --------------------------- log methods
01457 
01458 
01459 #define printOpenGLError() printOglError(__FILE__, __LINE__)
01460 
01461 int OpenGLWidget::printOglError(char *file, int line)
01462 {
01463     //
01464     // Returns 1 if an OpenGL error occurred, 0 otherwise.
01465     //
01466     GLenum glErr;
01467     int    retCode = 0;
01468 
01469     glErr = glGetError();
01470     while (glErr != GL_NO_ERROR)
01471     {
01472         printf("glError in file %s @ line %d: %s\n", file, line, gluErrorString(glErr));
01473         retCode = 1;
01474         glErr = glGetError();
01475     }
01476     return retCode;
01477 }
01478 
01479 
01480 void OpenGLWidget::printShaderInfoLog(GLuint obj)
01481 {
01482     int infologLength = 0;
01483     int charsWritten  = 0;
01484     char *infoLog;
01485 
01486         glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLength);
01487 
01488     if (infologLength > 0)
01489     {
01490         infoLog = (char *)malloc(infologLength);
01491         glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);
01492                 printf("%s\n",infoLog);
01493         free(infoLog);
01494     }
01495 }
01496 
01497 void OpenGLWidget::printProgramInfoLog(GLuint obj)
01498 {
01499     int infologLength = 0;
01500     int charsWritten  = 0;
01501     char *infoLog;
01502 
01503         glGetProgramiv(obj, GL_INFO_LOG_LENGTH,&infologLength);
01504 
01505     if (infologLength > 0)
01506     {
01507         infoLog = (char *)malloc(infologLength);
01508         glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog);
01509                 printf("%s\n",infoLog);
01510         free(infoLog);
01511     }
01512 }
01513 
01514 
01515 
01516 void OpenGLWidget::setRenderMode( RENDER_MODE renderMode )
01517 {
01518   cout << "RenderMode: " << renderMode << endl;
01519 
01520   m_renderMode = renderMode;
01521 
01522   if ( m_Axis == OPENGL_3D_VIEW )
01523     this->updateGL();
01524 }
01525 
01526 
01527 void OpenGLWidget::mouseMoveEvent( QMouseEvent *e )
01528 {
01529   //cout << "mouse moved..." << endl;
01530 
01531   int scale = 1; // 100;
01532 
01533   if ( /* m_mbPressed && */ m_Axis == OPENGL_3D_VIEW )
01534   {
01535     int xOffset = e->x() - m_lastXPosition;
01536     int yOffset = e->y() - m_lastYPosition;
01537 
01538     m_lastXPosition = e->x();
01539     m_lastYPosition = e->y();
01540 
01541     m_zRot += (float) (xOffset / scale);
01542     m_xRot += (float) (yOffset / scale);
01543 
01544     this->updateGL();
01545   }
01546 }
01547 
01548 void OpenGLWidget::mousePressEvent( QMouseEvent *e )
01549 {
01550     //cout << "mouse pressed..." << endl;
01551 
01552     m_lastXPosition = e->x();
01553     m_lastYPosition = e->y();
01554 
01555     //m_mbPressed = true;
01556 }
01557 
01558 void OpenGLWidget::mouseReleaseEvent( QMouseEvent *e )
01559 {
01560     //cout << "mouse released..." << endl;
01561 
01562     m_lastXPosition = 0;
01563     m_lastYPosition = 0;
01564 
01565     //m_mbPressed = false;
01566 }

Generated on Mon Dec 10 18:18:11 2007 for VisLU by  doxygen 1.5.4