00001 #include "QVolRendCanvas.h"
00002
00003 bool isfirstframe = true;
00004
00005
00006 QVolRendCanvas::QVolRendCanvas(QWidget* parent ) :
00007 QObject(parent),
00008 QGLWidget(parent),
00009 m_TransferFunction(NULL),
00010 m_TransferFunction2D(NULL),
00011 m_FramebufferObject(NULL),
00012 m_MouseLastPos(0.0f,0.0f,0.0f),
00013 m_LookAtPoint(0.0f, 0.0f, 0.0f),
00014 m_CamDat(0.0f, 0.0f, 2.0f),
00015 m_lightDir(0.0f, 1.0f, 0.0f),
00016 m_modifyLight(false)
00017 {
00018 glInit ();
00019 data_loaded = false;
00020 sliceview_active = true;
00021 apply_tf_in_sv = 0;
00022 apply_tf_in_vv = 0;
00023
00024 m_MouseState = NO_DRAGGING;
00025 m_vecPosition = getSphereProjection(0.0f, 0.0f);
00026 m_LookAt = VVector(0.0f, 0.0f, 0.0f);
00027 m_Position = VVector(0.0f, 0.0f, 1.0f);
00028 m_Distance = 1.0f;
00029 m_PanOffset = VVector(0.0f, 0.0f, 0.0f);
00030 m_Rotation = VVector(0.0f, 0.0f, 0.0f);
00031 m_fAngle = 0.0f;
00032
00033 view = VVector(0.0, 0.0, 1.0);
00034 up = VVector(0.0, 1.0, 0.0);
00035
00036 side = view.getCross(up);
00037 side.normalize();
00038 up = side.getCross(view);
00039 up.normalize();
00040
00041 lview = VVector(0.0, 0.0, 1.0);
00042 lup = VVector(0.0, 1.0, 0.0);
00043
00044 lside = lview.getCross(lup);
00045 lside.normalize();
00046 lup = lside.getCross(lview);
00047 lup.normalize();
00048 m_VolumeRenderer.setLightDir(lview);
00049
00050
00051 }
00052
00053
00054 QVolRendCanvas::~QVolRendCanvas()
00055 {
00056 if(m_FramebufferObject)
00057 {
00058 delete m_FramebufferObject;
00059 }
00060 m_TransferFunction = NULL;
00061
00062
00063 m_BackgroundColor = NULL;
00064
00065
00066 }
00067
00068 void QVolRendCanvas::setObjectName(const QString &name)
00069 {
00070 }
00071
00072 void QVolRendCanvas::setBackColorPtr(VVector *v)
00073 {
00074 m_BackgroundColor = v;
00075 }
00076 void QVolRendCanvas::initializeGL()
00077 {
00078 this->makeCurrent();
00079
00080
00081 glClearColor( 0.0, 0.0, 0.0, 1.0 );
00082 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00083 glEnable(GL_DEPTH_TEST);
00084
00085 }
00086
00087 void QVolRendCanvas::resizeGL( int w, int h )
00088 {
00089 this->makeCurrent();
00090 glViewport(0, 0, w, h);
00091
00092 if(sliceview_active)
00093 {
00094
00095
00096 m_SliceRenderer.setHeight(h);
00097 m_SliceRenderer.setWidth(w);
00098 }
00099 if(m_FramebufferObject)
00100 {
00101 delete m_FramebufferObject;
00102 m_FramebufferObject = NULL;
00103 }
00104
00105 m_FramebufferObject = new VFramebufferObject(width(), height(), GL_RGBA);
00106 m_FramebufferObject->init();
00107
00108 m_VolumeRenderer.resize(w, h);
00109 }
00110
00111 VVector QVolRendCanvas::getSphereProjection(float x, float y)
00112 {
00113 VVector vecResult;
00114 vecResult.setX(cos(x) * sin(y));
00115 vecResult.setY(sin(x) * sin(y));
00116 const float fD = sqrtf(vecResult.getX() * vecResult.getX() + vecResult.getY() * vecResult.getY());
00117 vecResult.setZ(cosf((3.14159265f / 2.0f) * ((fD < 1.0f) ? fD : 1.0f)));
00118
00119 vecResult.normalize();
00120 return vecResult;
00121 }
00122
00123 VVector QVolRendCanvas::getPlaneProjection(float x, float y)
00124 {
00125 VVector vecResult;
00126 vecResult.setX(x);
00127 vecResult.setY(y);
00128 vecResult.setZ(0.0f);
00129
00130 return vecResult;
00131 }
00132
00133 void QVolRendCanvas::paintGL()
00134 {
00135 makeCurrent();
00136
00137 if(m_TransferFunction)
00138 {
00139
00140 m_SliceRenderer.setTransferFunctionHandle(m_TransferFunction->getGLHandle());
00141 m_VolumeRenderer.setTransferFunctionHandle(m_TransferFunction->getGLHandle());
00142 }
00143
00144 if(m_TransferFunction2D)
00145 {
00146 m_VolumeRenderer.setTransferFunction2DHandle(m_TransferFunction2D->getGLHandle());
00147 }
00148
00149 if(sliceview_active)
00150 {
00151 glClearColor(0.0f,0.0f,0.0f,1.0f);
00152 }
00153 else if(!sliceview_active)
00154 {
00155 float color[3] = {m_BackgroundColor->getX(),m_BackgroundColor->getY(),m_BackgroundColor->getZ()};
00156 glClearColor(m_BackgroundColor->getX(),m_BackgroundColor->getY(),m_BackgroundColor->getZ(), 0.0f);
00157 m_VolumeRenderer.setClearColor(color);
00158 }
00159
00160 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00161 glEnable(GL_DEPTH_TEST);
00162
00163
00164 if(!m_SliceRenderer.getProgramLoaded())
00165 {
00166 m_SliceRenderer.loadProgram();
00167 }
00168
00169 if(!m_VolumeRenderer.getProgramLoaded())
00170 {
00171 m_VolumeRenderer.loadProgram();
00172 }
00173
00174 if(!m_FramebufferObject)
00175 {
00176 m_FramebufferObject = new VFramebufferObject(width(), height(), GL_RGBA);
00177 m_FramebufferObject->init();
00178 }
00179
00180
00181
00182
00183 if(sliceview_active && data_loaded)
00184 {
00185 m_FramebufferObject->bind();
00186
00187 m_SliceRenderer.draw();
00188
00189 m_FramebufferObject->unbind();
00190 }
00191
00192 else if(!sliceview_active && data_loaded)
00193 {
00194 m_VolumeRenderer.drawFrontFaces();
00195 m_VolumeRenderer.drawBackFaces();
00196
00197 m_FramebufferObject->bind();
00198
00199 m_VolumeRenderer.draw();
00200
00201 m_FramebufferObject->unbind();
00202 }
00203
00204
00205 const GLenum glError = glGetError();
00206
00207 if (glError != GL_NO_ERROR)
00208 std::cout << "Error Rendering Scene to FBO " << gluErrorString(glError) << std::endl;
00209
00210 glDisable(GL_CULL_FACE);
00211
00212 m_FramebufferObject->renderToFullScreen();
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 }
00233
00234 void QVolRendCanvas::paintEvent( QPaintEvent *e )
00235 {
00236 QGLWidget::paintEvent(e);
00237 };
00238
00239 void QVolRendCanvas::mousePressEvent ( QMouseEvent * e )
00240 {
00241
00242 const VMouseEvent me(getMouseEvent(e));
00243
00244 float x = me.getPosition().getX();
00245 float y = me.getPosition().getY();
00246
00247 if(me.getLeftState())
00248 {
00249 m_MouseState = ROTATE;
00250 m_vecPosition = getPlaneProjection(x,y);
00251 m_vecPosition *= VVector((float)height(), (float)width(), 0.0f);
00252 }
00253 else if(me.getMiddleState())
00254 {
00255 m_MouseState = PAN;
00256 m_vecPosition = getPlaneProjection(x,y);
00257 }
00258 else
00259 {
00260 m_MouseState = ZOOM;
00261 m_vecPosition = getPlaneProjection(x,y);
00262 }
00263 if(m_FramebufferObject)
00264 {
00265 delete m_FramebufferObject;
00266 m_FramebufferObject = NULL;
00267
00268 m_FramebufferObject = new VFramebufferObject(256, 256, GL_RGBA);
00269 m_FramebufferObject->init();
00270 }
00271
00272 };
00273
00274 void QVolRendCanvas::mouseReleaseEvent ( QMouseEvent * e )
00275 {
00276 isfirstframe = true;
00277
00278 setCursor(QCursor(Qt::CursorShape::OpenHandCursor));
00279
00280 m_MouseState = NO_DRAGGING;
00281
00282 delete m_FramebufferObject;
00283 m_FramebufferObject = NULL;
00284 m_FramebufferObject = new VFramebufferObject(width(), height(), GL_RGBA);
00285 m_FramebufferObject->init();
00286
00287
00288 };
00289
00290 void QVolRendCanvas::mouseMoveEvent ( QMouseEvent * e )
00291 {
00292 setCursor(QCursor(Qt::CursorShape::ClosedHandCursor));
00293
00294 const VMouseEvent me(getMouseEvent(e));
00295
00296
00297
00298
00299 const VVector v = me.getPosition();
00300
00301
00302 float x = v.getX();
00303 float y = v.getY();
00304
00305 float ny = 0.0f;
00306 float nx = 0.0f;
00307
00308 switch (m_MouseState)
00309 {
00310 case ROTATE:
00311 {
00312 VVector vecPosition = getPlaneProjection(y,x);
00313 vecPosition *= VVector((float)height(), (float)width(), 0.0f);
00314 VVector vecDifference = vecPosition - m_vecPosition;
00315
00316 nx = vecDifference.getX();
00317 ny = vecDifference.getY();
00318
00319 if(isfirstframe)
00320 {
00321 nx = 0.0f;
00322 ny = 0.0f;
00323
00324 isfirstframe = false;
00325 }
00326
00327
00328
00329 m_Rotation += vecDifference / 2.0f;
00330 m_vecPosition = vecPosition;
00331 }
00332 break;
00333
00334 case PAN:
00335 {
00336 const VVector vecPosition = getPlaneProjection(x,y);
00337 const VVector vecDifference = vecPosition - m_vecPosition;
00338
00339 VVector side = -m_VolumeRenderer.getCameraSideVector() * vecDifference.getX();
00340 VVector up = -m_VolumeRenderer.getCameraUpVector() * vecDifference.getY();
00341
00342 m_PanOffset += side + up;
00343
00344 m_vecPosition = vecPosition;
00345 }
00346 break;
00347
00348 case ZOOM:
00349 {
00350 VVector vecPosition = getPlaneProjection(x,y);
00351 VVector vecDifference = vecPosition - m_vecPosition;
00352
00353 vecDifference.setX(vecDifference.getX());
00354 vecDifference.setY(vecDifference.getY());
00355 vecDifference.setZ(0.0);
00356
00357 float offset = (vecDifference.getY() > 0.0) ? sqrt(vecDifference.getDot(vecDifference)) : -sqrt(vecDifference.getDot(vecDifference));
00358 m_Distance += -offset;
00359
00360 m_vecPosition = vecPosition;
00361 }
00362 break;
00363 }
00364
00365
00366 if(m_modifyLight)
00367 {
00368
00369
00370
00371 VQuaternion rotation = VQuaternion::generateRotationY(ny);
00372 rotation.applyRotationX(nx);
00373
00374 VVector newPos = rotation.getForwardVector();
00375 VVector newUp = rotation.getUpVector();
00376
00377 newPos.normalize();
00378 newPos *= -1;
00379
00380 ny *= -0.005f;
00381 nx *= -0.005f;
00382
00383 float viewx, viewy, viewz;
00384 float sidex, sidey, sidez;
00385 float upx, upy, upz;
00386
00387 viewx = lview.getX();
00388 viewy = lview.getY();
00389 viewz = lview.getZ();
00390
00391 sidex = lside.getX();
00392 sidey = lside.getY();
00393 sidez = lside.getZ();
00394
00395 upx = lup.getX();
00396 upy = lup.getY();
00397 upz = lup.getZ();
00398
00399 float vinverse00, vinverse01, vinverse02;
00400 float vinverse10, vinverse11, vinverse12;
00401 float vinverse20, vinverse21, vinverse22;
00402
00403 vinverse00 = sidex;
00404 vinverse01 = sidey;
00405 vinverse02 = sidez;
00406
00407 vinverse10 = upx;
00408 vinverse11 = upy;
00409 vinverse12 = upz;
00410
00411 vinverse20 = viewx;
00412 vinverse21 = viewy;
00413 vinverse22 = viewz;
00414
00415
00416
00417
00418 lside.setX( 1.0 );
00419 lside.setY( 0.0 );
00420 lside.setZ( 0.0 );
00421
00422 lup.setX( 0.0 );
00423 lup.setY( 1.0 );
00424 lup.setZ( 0.0 );
00425
00426 lview.setX( 0.0 );
00427 lview.setY( 0.0 );
00428 lview.setZ( 1.0 );
00429
00430
00431 lview.normalize();
00432 lside.normalize();
00433 lup.normalize();
00434
00435 viewx = lview.getX();
00436 viewy = lview.getY();
00437 viewz = lview.getZ();
00438
00439 sidex = lside.getX();
00440 sidey = lside.getY();
00441 sidez = lside.getZ();
00442
00443 upx = lup.getX();
00444 upy = lup.getY();
00445 upz = lup.getZ();
00446
00447
00448 lview.setX( cos(-ny) * viewx + sin(-ny) * viewz );
00449
00450 lview.setZ(-sin(-ny) * viewx + cos(-ny) * viewz );
00451
00452 lside.setX( cos(-ny) * sidex + sin(-ny) * sidez );
00453
00454 lside.setZ(-sin(-ny) * sidex + cos(-ny) * sidez );
00455
00456 lview.normalize();
00457 lside.normalize();
00458 lup.normalize();
00459
00460 viewx = lview.getX();
00461 viewy = lview.getY();
00462 viewz = lview.getZ();
00463
00464 sidex = lside.getX();
00465 sidey = lside.getY();
00466 sidez = lside.getZ();
00467
00468 upx = lup.getX();
00469 upy = lup.getY();
00470 upz = lup.getZ();
00471
00472
00473
00474 lview.setY( cos(nx) * viewy - sin(nx) * viewz );
00475 lview.setZ( sin(nx) * viewy + cos(nx) * viewz );
00476
00477
00478 lup.setY( cos(nx) * upy - sin(nx) * upz );
00479 lup.setZ( sin(nx) * upy + cos(nx) * upz );
00480
00481
00482 lview.normalize();
00483 lside.normalize();
00484 lup.normalize();
00485
00486 viewx = lview.getX();
00487 viewy = lview.getY();
00488 viewz = lview.getZ();
00489
00490 sidex = lside.getX();
00491 sidey = lside.getY();
00492 sidez = lside.getZ();
00493
00494 upx = lup.getX();
00495 upy = lup.getY();
00496 upz = lup.getZ();
00497
00498 float v00, v01, v02;
00499 float v10, v11, v12;
00500 float v20, v21, v22;
00501
00502 v00 = vinverse00;
00503 v01 = vinverse10;
00504 v02 = vinverse20;
00505
00506 v10 = vinverse01;
00507 v11 = vinverse11;
00508 v12 = vinverse21;
00509
00510 v20 = vinverse02;
00511 v21 = vinverse12;
00512 v22 = vinverse22;
00513
00514
00515
00516 lview.setX( v00*viewx + v01*viewy + v02*viewz );
00517 lview.setY( v10*viewx + v11*viewy + v12*viewz );
00518 lview.setZ( v20*viewx + v21*viewy + v22*viewz );
00519
00520 lside.setX( v00*sidex + v01*sidey + v02*sidez );
00521 lside.setY( v10*sidex + v11*sidey + v12*sidez );
00522 lside.setZ( v20*sidex + v21*sidey + v22*sidez );
00523
00524 lup.setX( v00*upx + v01*upy + v02*upz );
00525 lup.setY( v10*upx + v11*upy + v12*upz );
00526 lup.setZ( v20*upx + v21*upy + v22*upz );
00527
00528 lview.normalize();
00529 lside.normalize();
00530 lup.normalize();
00531
00532 m_VolumeRenderer.setLightDir(lview);
00533 }
00534 else
00535 {
00536
00537
00538
00539 VQuaternion rotation = VQuaternion::generateRotationY(ny);
00540 rotation.applyRotationX(nx);
00541
00542 VVector newPos = rotation.getForwardVector();
00543 VVector newUp = rotation.getUpVector();
00544
00545 newPos.normalize();
00546 newPos *= -1;
00547
00548 ny *= -0.005f;
00549 nx *= -0.005f;
00550
00551 float viewx, viewy, viewz;
00552 float sidex, sidey, sidez;
00553 float upx, upy, upz;
00554
00555 viewx = view.getX();
00556 viewy = view.getY();
00557 viewz = view.getZ();
00558
00559 sidex = side.getX();
00560 sidey = side.getY();
00561 sidez = side.getZ();
00562
00563 upx = up.getX();
00564 upy = up.getY();
00565 upz = up.getZ();
00566
00567 float vinverse00, vinverse01, vinverse02;
00568 float vinverse10, vinverse11, vinverse12;
00569 float vinverse20, vinverse21, vinverse22;
00570
00571 vinverse00 = sidex;
00572 vinverse01 = sidey;
00573 vinverse02 = sidez;
00574
00575 vinverse10 = upx;
00576 vinverse11 = upy;
00577 vinverse12 = upz;
00578
00579 vinverse20 = viewx;
00580 vinverse21 = viewy;
00581 vinverse22 = viewz;
00582
00583
00584
00585
00586 side.setX( 1.0 );
00587 side.setY( 0.0 );
00588 side.setZ( 0.0 );
00589
00590 up.setX( 0.0 );
00591 up.setY( 1.0 );
00592 up.setZ( 0.0 );
00593
00594 view.setX( 0.0 );
00595 view.setY( 0.0 );
00596 view.setZ( 1.0 );
00597
00598
00599 view.normalize();
00600 side.normalize();
00601 up.normalize();
00602
00603 viewx = view.getX();
00604 viewy = view.getY();
00605 viewz = view.getZ();
00606
00607 sidex = side.getX();
00608 sidey = side.getY();
00609 sidez = side.getZ();
00610
00611 upx = up.getX();
00612 upy = up.getY();
00613 upz = up.getZ();
00614
00615
00616 view.setX( cos(-ny) * viewx + sin(-ny) * viewz );
00617
00618 view.setZ(-sin(-ny) * viewx + cos(-ny) * viewz );
00619
00620 side.setX( cos(-ny) * sidex + sin(-ny) * sidez );
00621
00622 side.setZ(-sin(-ny) * sidex + cos(-ny) * sidez );
00623
00624 view.normalize();
00625 side.normalize();
00626 up.normalize();
00627
00628 viewx = view.getX();
00629 viewy = view.getY();
00630 viewz = view.getZ();
00631
00632 sidex = side.getX();
00633 sidey = side.getY();
00634 sidez = side.getZ();
00635
00636 upx = up.getX();
00637 upy = up.getY();
00638 upz = up.getZ();
00639
00640
00641
00642 view.setY( cos(nx) * viewy - sin(nx) * viewz );
00643 view.setZ( sin(nx) * viewy + cos(nx) * viewz );
00644
00645
00646 up.setY( cos(nx) * upy - sin(nx) * upz );
00647 up.setZ( sin(nx) * upy + cos(nx) * upz );
00648
00649
00650 view.normalize();
00651 side.normalize();
00652 up.normalize();
00653
00654 viewx = view.getX();
00655 viewy = view.getY();
00656 viewz = view.getZ();
00657
00658 sidex = side.getX();
00659 sidey = side.getY();
00660 sidez = side.getZ();
00661
00662 upx = up.getX();
00663 upy = up.getY();
00664 upz = up.getZ();
00665
00666 float v00, v01, v02;
00667 float v10, v11, v12;
00668 float v20, v21, v22;
00669
00670 v00 = vinverse00;
00671 v01 = vinverse10;
00672 v02 = vinverse20;
00673
00674 v10 = vinverse01;
00675 v11 = vinverse11;
00676 v12 = vinverse21;
00677
00678 v20 = vinverse02;
00679 v21 = vinverse12;
00680 v22 = vinverse22;
00681
00682
00683
00684 view.setX( v00*viewx + v01*viewy + v02*viewz );
00685 view.setY( v10*viewx + v11*viewy + v12*viewz );
00686 view.setZ( v20*viewx + v21*viewy + v22*viewz );
00687
00688 side.setX( v00*sidex + v01*sidey + v02*sidez );
00689 side.setY( v10*sidex + v11*sidey + v12*sidez );
00690 side.setZ( v20*sidex + v21*sidey + v22*sidez );
00691
00692 up.setX( v00*upx + v01*upy + v02*upz );
00693 up.setY( v10*upx + v11*upy + v12*upz );
00694 up.setZ( v20*upx + v21*upy + v22*upz );
00695
00696 view.normalize();
00697 side.normalize();
00698 up.normalize();
00699
00700 m_VolumeRenderer.processGuiInput(m_Distance, newPos + m_PanOffset, view, up, m_LookAt + m_PanOffset);
00701 }
00702
00703
00704 };
00705
00706 void QVolRendCanvas::mouseDoubleClickEvent ( QMouseEvent * e )
00707 {
00708
00709 const VMouseEvent me(getMouseEvent(e));
00710 const VVector v = me.getPosition();
00711
00712 if (!sliceview_active)
00713 {
00714 m_MouseLastPos = VVector(0.0f,0.0f,0.0f);
00715 m_LookAtPoint = VVector(0.0f, 0.0f, 0.0f);
00716 m_CamDat = VVector(0.0f, 0.0f, 2.0f);
00717
00718 m_vecPosition = getSphereProjection(0.0f, 0.0f);
00719 m_LookAt = VVector(0.0f, 0.0f, 0.0f);
00720 m_Position = VVector(0.0f, 0.0f, 1.0f);
00721 m_Distance = 1.0f;
00722 m_PanOffset = VVector(0.0f, 0.0f, 0.0f);
00723 m_Rotation = VVector(0.0f, 0.0f, 0.0f);
00724 m_fAngle = 0.0f;
00725
00726 view = VVector(0.0, 0.0, 1.0);
00727 up = VVector(0.0, 1.0, 0.0);
00728
00729 side = view.getCross(up);
00730 side.normalize();
00731 up = side.getCross(view);
00732 up.normalize();
00733
00734 lview = VVector(0.0, 0.0, 1.0);
00735 lup = VVector(0.0, 1.0, 0.0);
00736
00737 lside = lview.getCross(lup);
00738 lside.normalize();
00739 lup = lside.getCross(lview);
00740 lup.normalize();
00741
00742 isfirstframe = true;
00743
00744
00745 VQuaternion rotation = VQuaternion::generateRotationY(0.0f);
00746 rotation.applyRotationX(0.0f);
00747
00748 VVector newPos = rotation.getForwardVector();
00749 VVector newUp = rotation.getUpVector();
00750
00751 newPos.normalize();
00752 newPos *= -1;
00753 m_VolumeRenderer.processGuiInput(m_Distance, newPos + m_PanOffset, view, up, m_LookAt + m_PanOffset);
00754
00755 return;
00756 }
00757
00758 if (m_SliceRenderer.getSliceMode() == ALL && v.getX() >= 0.0f && v.getY() >= 0.0f)
00759 {
00760 m_SliceRenderer.setSliceMode( TRANSVERSAL );
00761 repaint();
00762 return;
00763 }
00764
00765 if (m_SliceRenderer.getSliceMode() == ALL && v.getX() < 0.0f && v.getY() >= 0.0f)
00766 {
00767 m_SliceRenderer.setSliceMode( SAGGITAL );
00768 repaint();
00769 return;
00770 }
00771
00772 if (m_SliceRenderer.getSliceMode() == ALL && v.getX() < 0.0f && v.getY() < 0.0f)
00773 {
00774 m_SliceRenderer.setSliceMode( CORRONAL );
00775 repaint();
00776 return;
00777 }
00778
00779 if (m_SliceRenderer.getSliceMode() != ALL )
00780 {
00781 m_SliceRenderer.setSliceMode( ALL );
00782 repaint();
00783 return;
00784 }
00785
00786
00787 };
00788
00789 void QVolRendCanvas::keyPressEvent ( QKeyEvent * e )
00790 {
00791
00792
00793 };
00794
00795 void QVolRendCanvas::keyReleaseEvent ( QKeyEvent * e )
00796 {
00797
00798
00799 };
00800
00801 const VMouseEvent QVolRendCanvas::getMouseEvent (QMouseEvent *e)
00802 {
00803 const VVector vecPosition( (2.0f * float(e->x()) - float(width())) / float(width()),
00804 ( float(height()) - 2.0f * float(e->y())) / float(height()),
00805 0.0f);
00806 const int iButton =
00807 ((e->button() == Qt::LeftButton) ? VMouseEvent::BUTTON_LEFT :
00808 ((e->button() == Qt::MidButton) ? VMouseEvent::BUTTON_MIDDLE :
00809 ((e->button() == Qt::RightButton) ? VMouseEvent::BUTTON_RIGHT : VMouseEvent::BUTTON_NONE)));
00810
00811 const int iStateLeft = (e->buttons () & Qt::LeftButton) ? VMouseEvent::STATE_DOWN : VMouseEvent::STATE_UP;
00812 const int iStateMiddle = (e->buttons () & Qt::MidButton) ? VMouseEvent::STATE_DOWN : VMouseEvent::STATE_UP;
00813 const int iStateRight = (e->buttons () & Qt::RightButton) ? VMouseEvent::STATE_DOWN : VMouseEvent::STATE_UP;
00814
00815 const int iModifiers = ((e->modifiers() & Qt::ShiftModifier) ? VKeyboardEvent::MODIFIER_SHIFT : 0)
00816 | ((e->modifiers() & Qt::ControlModifier) ? VKeyboardEvent::MODIFIER_CTRL : 0)
00817 | ((e->modifiers() & Qt::AltModifier) ? VKeyboardEvent::MODIFIER_ALT : 0);
00818
00819 return VMouseEvent(vecPosition,iButton,iStateLeft,iStateMiddle,iStateRight,iModifiers);
00820
00821 };
00822
00823 const VKeyboardEvent QVolRendCanvas::getKeyboardEvent (QKeyEvent *e)
00824 {
00825 const int iKey = e->key();
00826
00827 const int iModifiers = ((e->modifiers() & Qt::ShiftModifier) ? VKeyboardEvent::MODIFIER_SHIFT : 0)
00828 | ((e->modifiers() & Qt::ControlModifier) ? VKeyboardEvent::MODIFIER_CTRL : 0)
00829 | ((e->modifiers() & Qt::AltModifier) ? VKeyboardEvent::MODIFIER_ALT : 0);
00830
00831 return VKeyboardEvent(iKey,iModifiers);
00832
00833 };
00834
00835 void QVolRendCanvas::redraw()
00836 {
00837 makeCurrent();
00838 paintGL();
00839 }
00840
00841 void QVolRendCanvas::activate_sliceview()
00842 {
00843 sliceview_active = true;
00844 }
00845
00846 void QVolRendCanvas::activate_volview()
00847 {
00848 sliceview_active = false;
00849 }
00850
00851 void QVolRendCanvas::setActiveSaggitalSlice(int s)
00852 {
00853 m_SliceRenderer.setActiveSaggitalSlice(s);
00854 }
00855
00856 void QVolRendCanvas::setActiveCorronalSlice(int s)
00857 {
00858 m_SliceRenderer.setActiveCorronalSlice(s);
00859 }
00860
00861 void QVolRendCanvas::setActiveTransversalSlice(int s)
00862 {
00863 m_SliceRenderer.setActiveTransversalSlice(s);
00864 }
00865
00866 bool QVolRendCanvas::load_data(QString filename, int *data)
00867 {
00868 if(data_loaded)
00869 {
00870 m_Volume.clear();
00871 data_loaded = false;
00872 }
00873
00874 makeCurrent();
00875
00876 std::string tmp(filename.toAscii());
00877
00878 data_loaded = m_Volume.loadVolume(tmp, data);
00879
00880 if (!data_loaded) return false;
00881
00882 m_SliceRenderer.setVolume(&m_Volume);
00883 m_VolumeRenderer.setVolume(&m_Volume);
00884 m_VolumeRenderer.resetProxyGeometry();
00885 m_TransferFunction->setMaxHist(data[3]);
00886
00887 repaint();
00888
00889 return true;
00890
00891 }
00892
00893 bool QVolRendCanvas::save_data(std::string filename)
00894 {
00895 return m_Volume.saveVolume(filename);
00896 }
00897
00898 void QVolRendCanvas::setApplyTFInSV(int v)
00899 {
00900 apply_tf_in_sv = v;
00901 apply_tf_in_vv = v;
00902 m_SliceRenderer.activate_tf(v);
00903 m_VolumeRenderer.activate_tf(v);
00904
00905 }
00906
00907
00908
00909 void QVolRendCanvas::rendermode_changed(int i)
00910 {
00911 std::cout << i << std::endl;
00912
00913 switch(i)
00914 {
00915 case 0:
00916 {
00917 m_RenderMode = MIP;
00918 break;
00919 }
00920 case 1:
00921 {
00922 m_RenderMode = DVR_FTB;
00923 break;
00924 }
00925 case 2:
00926 {
00927 m_RenderMode = DVR_BTF;
00928 break;
00929 }
00930 case 3:
00931 {
00932 m_RenderMode = COMB;
00933 break;
00934 }
00935 case 4:
00936 {
00937 m_RenderMode = CURVATURE;
00938 break;
00939 }
00940
00941 }
00942
00943 m_VolumeRenderer.setRenderMode(m_RenderMode);
00944 }
00945
00946 void QVolRendCanvas::lightmode_changed(int i)
00947 {
00948 std::cout << i << std::endl;
00949
00950 switch(i)
00951 {
00952
00953 case 0:
00954 {
00955 m_LightMode = PHONG;
00956 break;
00957 }
00958 case 1:
00959 {
00960 m_LightMode = TOON;
00961 break;
00962 }
00963 case 2:
00964 {
00965 m_LightMode = METAL;
00966 break;
00967 }
00968
00969 }
00970
00971 m_VolumeRenderer.setLightMode(m_LightMode);
00972 }
00973
00974
00975 void QVolRendCanvas::setOrthoProjection(bool m_orth)
00976 {
00977 m_VolumeRenderer.setOrthoMode(m_orth, width(), height());
00978 }
00979
00980 std::vector<int> * QVolRendCanvas::getDataHistogram()
00981 {
00982 return m_Volume.getHistogramPtr();
00983 }
00984
00985 unsigned char * QVolRendCanvas::getData2DHistogram()
00986 {
00987 return m_Volume.get2DHistogramPtr();
00988 }
00989
00990 void QVolRendCanvas::setTransferFunctionPtr(VTransferFunction *transfunc)
00991 {
00992 m_TransferFunction = transfunc;
00993 m_TransferFunction->setMainCanvas(this);
00994 }
00995
00996 void QVolRendCanvas::setTransferFunction2DPtr(VTransferFunction2D * transfunc)
00997 {
00998 m_TransferFunction2D = transfunc;
00999 m_TransferFunction2D->setMainCanvas(this);
01000 }
01001
01002 void QVolRendCanvas::saveImage(std::string filename)
01003 {
01004 if(m_FramebufferObject)
01005 {
01006 makeCurrent();
01007 m_FramebufferObject->saveImage(filename);
01008 }
01009 }
01010
01011 void QVolRendCanvas::flipX()
01012 {
01013 m_Volume.flipVolumeX();
01014 }
01015
01016
01017 void QVolRendCanvas::flipY()
01018 {
01019 m_Volume.flipVolumeY();
01020 }
01021
01022
01023 void QVolRendCanvas::flipZ()
01024 {
01025 m_Volume.flipVolumeZ();
01026 }
01027
01028 void QVolRendCanvas::modifyLight(bool val)
01029 {
01030 m_modifyLight = val;
01031 }
01032
01033
01034 void QVolRendCanvas::setContourMode(bool val)
01035 {
01036 m_VolumeRenderer.setContours(val);
01037 }
01038
01039 void QVolRendCanvas::setShadowMode(bool val)
01040 {
01041 m_VolumeRenderer.setShadows(val);
01042 }