00001
00002 #include "Volume.h"
00003 #include "OpenGLWidget.h"
00004 #include <QtGui/QWidget>
00005 #include <iostream>
00006 #include <algorithm>
00007
00008
00009 using namespace std;
00010
00011
00012
00013 bool OpenGLWidget::m_textureCreated = false;
00014 bool OpenGLWidget::m_librariesInitialised = false;
00015
00016
00017 unsigned int OpenGLWidget::m_textureHandle3d = 0;
00018 unsigned int OpenGLWidget::m_textureHandle1d = 0;
00019
00020
00021 int OpenGLWidget::m_dimX = 0;
00022 int OpenGLWidget::m_dimY = 0;
00023 int OpenGLWidget::m_dimZ = 0;
00024
00025
00026 float OpenGLWidget::m_xRot = 0.0;
00027 float OpenGLWidget::m_yRot = 0.0;
00028 float OpenGLWidget::m_zRot = 0.0;
00029
00030
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
00038 int OpenGLWidget::m_lastXPosition = 0;
00039 int OpenGLWidget::m_lastYPosition = 0;
00040
00041
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
00060
00061
00062
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
00080 glDeleteFramebuffersEXT( 1, &m_fsFbo );
00081 glDeleteRenderbuffersEXT( 1, &m_fsRenderBuffer );
00082 glDeleteTextures( 1, &m_fsRenderTexture );
00083
00084
00085 glDeleteFramebuffersEXT( 1, &m_bsFbo );
00086 glDeleteRenderbuffersEXT( 1, &m_bsRenderBuffer );
00087 glDeleteTextures( 1, &m_bsRenderTexture );
00088 }
00089
00090
00091 void OpenGLWidget::initGlew()
00092 {
00093
00094 cout << "- Initializing GLEW ..." << endl;
00095 GLenum err = glewInit();
00096
00097 if (err != GLEW_OK)
00098 {
00099
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
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
00156
00157
00158 if ( !m_librariesInitialised )
00159 {
00160 initGlew();
00161 initDevIL();
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
00190
00191
00192
00193
00194
00195
00196
00197
00198
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:
00254 break;
00255 }
00256
00257 if ( m_Axis == OPENGL_3D_VIEW )
00258 this->updateGL();
00259 }
00260
00261
00262 void OpenGLWidget::paintXAxis()
00263 {
00264
00265
00266
00267
00268
00269
00270
00271
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
00283
00284
00285
00286 glBegin(GL_QUADS);
00287
00288 glTexCoord3f ( m_textureCoord, 0.0f, 0.0f);
00289 glVertex3f( -1.0f, -1.0f, -1.0f );
00290
00291
00292 glTexCoord3f( m_textureCoord, 1.0f, 0.0f);
00293 glVertex3f( 1.0f - xOffset, -1.0f, -1.0f );
00294
00295
00296 glTexCoord3f( m_textureCoord, 1.0f, 1.0f);
00297 glVertex3f( 1.0f - xOffset, 1.0f - yOffset, -1.0f );
00298
00299
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
00310
00311
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
00321
00322
00323
00324
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
00344
00345
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
00355
00356
00357
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
00377
00378
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 )
00385 {
00386 if( GLEW_EXT_texture3D )
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:
00400 paintXAxis();
00401 break;
00402
00403 case Y_AXIS:
00404 paintYAxis();
00405 break;
00406
00407 case Z_AXIS:
00408 paintZAxis();
00409 break;
00410
00411 case NO_RENDER_3D_VIEW:
00412
00413 break;
00414
00415 case RENDER_3D_VIEW:
00416 renderView();
00417 break;
00418
00419 default:
00420 break;
00421 }
00422
00423 }
00424 else
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
00446
00447
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
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477 m_invRotMatrix = rotXMtx * rotYMtx * rotZMtx;
00478
00479 m_invRotMatrix.translate( Vector( 0.5, 0.5, 0.5) );
00480
00481
00482
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
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
00502
00503
00504
00505
00506 m_invRotMatrix.scale( Vector(scaleX, scaleY, scaleZ) );
00507
00508
00509
00510
00511 m_invRotMatrix = m_invRotMatrix.GetInverse();
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524 }
00525
00526
00527 void OpenGLWidget::renderView()
00528 {
00529
00530
00531 if ( glIsEnabled( GL_TEXTURE_3D ) )
00532 glDisable( GL_TEXTURE_3D );
00533
00534
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
00549
00550
00551
00552
00553
00554
00555
00556
00557 renderFrontSideBuffer();
00558 renderBackSideBuffer();
00559
00560
00561
00562
00563 if ( m_showView == SHOW_VOLUME )
00564 doRaycasting();
00565 else
00566 testRenderedToBuffer();
00567
00568
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
00585 glUseProgram( m_shaderProgram );
00586
00587 glEnable( GL_BLEND );
00588 glBlendFunc( GL_SRC_ALPHA, GL_ZERO );
00589
00590
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
00602
00603
00604
00605
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
00613
00614
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
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
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
00657
00658
00659
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
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
00692
00693
00694
00695
00696
00697 drawQuad();
00698
00699
00700 glDisable( GL_BLEND );
00701
00702
00703
00704
00705 glUseProgram( 0 );
00706
00707 glPopMatrix();
00708 }
00709
00710
00711 void OpenGLWidget::drawQuad()
00712 {
00713 glBegin(GL_QUADS);
00714
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
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
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
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
00738
00739
00740
00741
00742
00743
00744
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
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
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
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
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
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
00825 glEnd();
00826 }
00827
00828
00829 void OpenGLWidget::drawCube()
00830 {
00831 glBegin(GL_QUADS);
00832
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
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
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
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
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
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
00887
00888
00889 glGenFramebuffersEXT( 1, &m_fsFbo );
00890 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_fsFbo );
00891
00892
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
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
00919
00920
00921
00922
00923
00924
00925 return false;
00926 }
00927 else
00928 cout << " - FBO-setup successful" << endl;
00929
00930
00931
00932
00933
00934 glGenFramebuffersEXT( 1, &m_bsFbo );
00935 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_bsFbo );
00936
00937
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
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
00977 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_fsFbo );
00978 glPushAttrib( GL_VIEWPORT_BIT );
00979 glViewport( 0, 0, this->m_viewWidth, this->m_viewHeight );
00980
00981
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
00994
00995 glEnable( GL_CULL_FACE );
00996 glCullFace( GL_FRONT );
00997
00998
00999
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
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
01018
01019
01020
01021
01022 drawBoundingCube( x, y, z );
01023
01024 glDisable( GL_CULL_FACE );
01025
01026
01027 glPopAttrib();
01028 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
01029
01030 glPopMatrix();
01031 }
01032
01033
01034 void OpenGLWidget::renderBackSideBuffer()
01035 {
01036 glPushMatrix();
01037
01038
01039 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_bsFbo );
01040 glPushAttrib( GL_VIEWPORT_BIT );
01041 glViewport( 0, 0, this->m_viewWidth, this->m_viewHeight );
01042
01043
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
01055
01056 glEnable( GL_CULL_FACE );
01057 glCullFace( GL_BACK );
01058
01059
01060
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
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
01079
01080
01081
01082
01083 drawBoundingCube( x, y, z );
01084
01085
01086
01087 glDisable( GL_CULL_FACE );
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098 glPopAttrib();
01099 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
01100
01101 glPopMatrix();
01102 }
01103
01104
01105 void OpenGLWidget::testRenderedToBuffer()
01106 {
01107
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
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
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
01192
01193
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
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
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
01268 QPainter p(&image);
01269
01270
01271 p.fillRect(image.rect(), g);
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286 QImage texture = QGLWidget::convertToGLFormat( image );
01287
01288
01289
01290 glTexImage1D(GL_TEXTURE_1D, 0, 4, texture.width(), 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.bits() );
01291
01292
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
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
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
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
01348
01349 glTexImage3D(GL_TEXTURE_3D_EXT, 0, GL_LUMINANCE,
01350 iTextureWidth, iTextureHeight, iTextureDepth,
01351 0, GL_LUMINANCE, GL_FLOAT,
01352 (void *) volume->getVolume()
01353 );
01354
01355
01356 glTexSubImage3D(GL_TEXTURE_3D_EXT, 0,
01357 0, 0, 0,
01358 iTextureWidth, iTextureHeight, iTextureDepth,
01359 GL_LUMINANCE, GL_FLOAT, (void *) volume->getVolume()
01360 );
01361
01362
01363
01364
01365
01366
01367
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
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
01403
01404
01405
01406
01407
01408
01409
01410 float delta = 2.0f;
01411
01412 switch ( key )
01413 {
01414
01415 case 87:
01416 m_xRot += delta;
01417 break;
01418
01419 case 83:
01420 m_xRot -= delta;
01421 break;
01422
01423 case 65:
01424 m_zRot += delta;
01425 break;
01426
01427 case 68:
01428 m_zRot -= delta;
01429 break;
01430
01431 case 81:
01432 m_yRot += delta;
01433 break;
01434
01435 case 69:
01436 m_yRot -= delta;
01437 break;
01438
01439 case 77:
01440 m_mbPressed = !m_mbPressed;
01441 break;
01442
01443 case 89:
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
01457
01458
01459 #define printOpenGLError() printOglError(__FILE__, __LINE__)
01460
01461 int OpenGLWidget::printOglError(char *file, int line)
01462 {
01463
01464
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
01530
01531 int scale = 1;
01532
01533 if ( 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
01551
01552 m_lastXPosition = e->x();
01553 m_lastYPosition = e->y();
01554
01555
01556 }
01557
01558 void OpenGLWidget::mouseReleaseEvent( QMouseEvent *e )
01559 {
01560
01561
01562 m_lastXPosition = 0;
01563 m_lastYPosition = 0;
01564
01565
01566 }