Eigene Dateien/Vis/src/QVolRendCanvas.cpp

Go to the documentation of this file.
00001 #include "QVolRendCanvas.h"
00002 
00003 bool isfirstframe = true;
00004 
00005 
00006 QVolRendCanvas::QVolRendCanvas(QWidget* parent /*= 0*/) : 
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         //testImage.loadImage("textures/tree.png");
00051 }
00052 
00053 
00054 QVolRendCanvas::~QVolRendCanvas()
00055 {
00056         if(m_FramebufferObject)
00057         {
00058                 delete m_FramebufferObject;
00059         }
00060         m_TransferFunction = NULL;
00061 
00062         //delete m_BackgroundColor;
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     // Set up the rendering context, define display lists etc.:
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                 //gluOrtho2D(0, w, h, 0);
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         //vecResult.setZ(cos(y));
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         /*this*/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);     // Clear Screen And Depth Buffer
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         // draw the scene:
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         /*if(!sliceview_active && data_loaded)
00216         {
00217                 m_VolumeRenderer.drawFrontFacesToSmallQuad();
00218                 m_VolumeRenderer.drawBackFacesToSmallQuad();
00219         }*/
00220 
00221         //testImage.renderToLowerRightQuad();
00222         /*if(m_TransferFunction2D)
00223         {
00224                 m_TransferFunction2D->renderTest();
00225         }*/
00226 
00227         
00228 //      m_VolumeRenderer.getNoiseTexHandle()->renderToLowerRightQuad();
00229 //      m_VolumeRenderer.getToonTexHandle()->renderToLowerRightQuad();
00230 //      m_VolumeRenderer.getMetalTexHandle()->renderToLowerRightQuad();
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                 //glViewport(0, 0, width()/2, height()/2);
00268                 m_FramebufferObject = new VFramebufferObject(256, 256, GL_RGBA);
00269                 m_FramebufferObject->init();
00270         }
00271         //m_VolumeRenderer.resize(width()/2, height()/2);
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         //glViewport(0, 0, width(), height());
00282         delete m_FramebufferObject;
00283         m_FramebufferObject = NULL;
00284         m_FramebufferObject = new VFramebufferObject(width(), height(), GL_RGBA);
00285         m_FramebufferObject->init();
00286         //m_fAngle = 0.0f;
00287         //m_vecPosition = VVector(0.0f, 0.0f, 0.0f);
00288 };
00289         
00290 void QVolRendCanvas::mouseMoveEvent ( QMouseEvent * e )
00291 {
00292         setCursor(QCursor(Qt::CursorShape::ClosedHandCursor));
00293 
00294         const VMouseEvent me(getMouseEvent(e));
00295 
00296         // v is the position of the mouse
00297         // cursor over canvas: v ranges in R, from -1 to 1 in both directions, left bottom corner is -1,-1
00298         // cursor n.o. canvas: if mouse was pressed before cursor left canvas, position is outside the range R 
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                         //vecDifference.setX(vecDifference.getX());
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                 //m_Rotation.setY(ny);
00369                 //m_Rotation.setX(nx);
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                 //transform the viewing coord system to cartesian so we can apply normal rotations
00417 
00418                 lside.setX( 1.0/*vinverse00*sidex + vinverse01*sidey + vinverse02*sidez*/ );
00419                 lside.setY( 0.0/*vinverse10*sidex + vinverse11*sidey + vinverse12*sidez*/ );
00420                 lside.setZ( 0.0/*vinverse20*sidex + vinverse21*sidey + vinverse22*sidez*/ );
00421 
00422                 lup.setX( 0.0/*vinverse00*upx + vinverse01*upy + vinverse02*upz*/ );
00423                 lup.setY( 1.0/*vinverse10*upx + vinverse11*upy + vinverse12*upz*/ );
00424                 lup.setZ( 0.0/*vinverse20*upx + vinverse21*upy + vinverse22*upz*/ );
00425 
00426                 lview.setX( 0.0/*vinverse00*viewx + vinverse01*viewy + vinverse02*viewz*/ );
00427                 lview.setY( 0.0/*vinverse10*viewx + vinverse11*viewy + vinverse12*viewz*/ );
00428                 lview.setZ( 1.0/*vinverse20*viewx + vinverse21*viewy + vinverse22*viewz*/ );
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                 //rotation around y axis (represents the up vector) with the x vector
00448                 lview.setX( cos(-ny) * viewx + sin(-ny) * viewz );
00449                 //view.setY( viewy );
00450                 lview.setZ(-sin(-ny) * viewx + cos(-ny) * viewz );
00451 
00452                 lside.setX( cos(-ny) * sidex + sin(-ny) * sidez );
00453                 //side.setY( sidey );
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                 //rotation around x axis (represents the side vector) with the y vector
00473                 //view.setX( viewx );
00474                 lview.setY( cos(nx) * viewy - sin(nx) * viewz );
00475                 lview.setZ( sin(nx) * viewy + cos(nx) * viewz );
00476 
00477                 //up.setX( upx );
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                 //transform the viewing coord system to cartesian so we can apply normal rotations
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                 //m_Rotation.setY(ny);
00537                 //m_Rotation.setX(nx);
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                 //transform the viewing coord system to cartesian so we can apply normal rotations
00585 
00586                 side.setX( 1.0/*vinverse00*sidex + vinverse01*sidey + vinverse02*sidez*/ );
00587                 side.setY( 0.0/*vinverse10*sidex + vinverse11*sidey + vinverse12*sidez*/ );
00588                 side.setZ( 0.0/*vinverse20*sidex + vinverse21*sidey + vinverse22*sidez*/ );
00589 
00590                 up.setX( 0.0/*vinverse00*upx + vinverse01*upy + vinverse02*upz*/ );
00591                 up.setY( 1.0/*vinverse10*upx + vinverse11*upy + vinverse12*upz*/ );
00592                 up.setZ( 0.0/*vinverse20*upx + vinverse21*upy + vinverse22*upz*/ );
00593 
00594                 view.setX( 0.0/*vinverse00*viewx + vinverse01*viewy + vinverse02*viewz*/ );
00595                 view.setY( 0.0/*vinverse10*viewx + vinverse11*viewy + vinverse12*viewz*/ );
00596                 view.setZ( 1.0/*vinverse20*viewx + vinverse21*viewy + vinverse22*viewz*/ );
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                 //rotation around y axis (represents the up vector) with the x vector
00616                 view.setX( cos(-ny) * viewx + sin(-ny) * viewz );
00617                 //view.setY( viewy );
00618                 view.setZ(-sin(-ny) * viewx + cos(-ny) * viewz );
00619 
00620                 side.setX( cos(-ny) * sidex + sin(-ny) * sidez );
00621                 //side.setY( sidey );
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                 //rotation around x axis (represents the side vector) with the y vector
00641                 //view.setX( viewx );
00642                 view.setY( cos(nx) * viewy - sin(nx) * viewz );
00643                 view.setZ( sin(nx) * viewy + cos(nx) * viewz );
00644 
00645                 //up.setX( upx );
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                 //transform the viewing coord system to cartesian so we can apply normal rotations
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         //const VKeyboardEvent ke(getKeyboardEvent(e));
00792 
00793 };
00794 
00795 void QVolRendCanvas::keyReleaseEvent ( QKeyEvent * e )
00796 {
00797         //const VKeyboardEvent ke(getKeyboardEvent(e));
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         /*this*/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         /*this*/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 }

Generated on Wed Dec 5 05:15:09 2007 for VolRendering by  doxygen 1.5.4