spatial_pixel_view.cpp

Go to the documentation of this file.
00001 //--------------------------------------------------
00012 //---------------------------------------------------
00013 
00014 #include "spatial_pixel_view.h"
00015 #include "../datasets/volume_pixel_dataset.h"
00016 
00017 namespace imedgine 
00018 {
00019   SpatialPixelView::SpatialPixelView()
00020   : VolumePixelView(VOXEL_VIEW),
00021     render_view_mode_(ALPHA_BLENDING),
00022     render_color_(GREY)
00023   { 
00024     createSceneGraph();   
00025   }
00026   
00027   //---------------------------------------------------
00028 
00029   SpatialPixelView::SpatialPixelView(SpatialPixelView const& src)
00030   : VolumePixelView(src),
00031     render_view_mode_(src.render_view_mode_),
00032     render_color_(src.render_color_)
00033   {
00034     createSceneGraph();
00035   }    
00036   
00037   //---------------------------------------------------
00038   
00039   SpatialPixelView::~SpatialPixelView()
00040   {
00041 #ifdef DEBUG
00042     std::cout << "Deleting SPATIAL_PIXLE_VIEW id: " << std::endl;
00043 #endif
00044   }
00045   
00046   //---------------------------------------------------
00047   
00048   view_pointer_type SpatialPixelView::clone() const 
00049   {
00050     return(view_pointer_type(new SpatialPixelView(*this)));
00051   }
00052   
00053   //-------------------------------------------------- 
00054   
00055   void SpatialPixelView::createSceneGraph()
00056   {        
00057     //View::createSceneGraph();    //the static part is not needed yet
00058     
00059     //TODO: Add function for building scene graph  
00060     current_volume_ = new SoVolumeData();
00061     root_->addChild(current_volume_);   
00062     
00063     transfunc_ = new SoTransferFunction();
00064     createColorMap();
00065     root_->addChild(transfunc_);
00066     
00067     volrend_ = new SoVolumeRender();
00068     //volrend_->interpolation = SoVolumeRender::LINEAR;
00069     volrend_->composition = SoVolumeRender::MAX_INTENSITY; // YEAH-BABE
00070     root_->addChild(volrend_); 
00071   }  
00072   
00073   //---------------------------------------------------  
00074   
00075   void SpatialPixelView::setParent(QWidget* view_parent)
00076       throw(NullPointerException)
00077   {
00078     View::setParent(view_parent);
00079     
00080     if (view_parent_ == 0)
00081     {   
00082       throw(NullPointerException("SpatialPixelView::setParent"));
00083     }
00084     
00085     render_area_.reset(new ImedgineSpatialViewer(this, view_parent_));
00086     render_area_->setSceneGraph(root_);
00087   }  
00088   
00089   //---------------------------------------------------
00090   
00091   void SpatialPixelView::setDataset(dataset_pointer_type dataset)
00092       throw(NullPointerException, InvalidCastException)   
00093   {
00094     VolumePixelView::setDataset(dataset);
00095 
00096     SbVec3s dimension(volume_dataset_->getSize()[X_DIMENSION],
00097                       volume_dataset_->getSize()[Y_DIMENSION],
00098                       volume_dataset_->getSize()[Z_DIMENSION]);
00099 
00100     current_volume_->setVolumeData(
00101         dimension, volume_dataset_->getData(), SoVolumeData::UNSIGNED_BYTE);  
00102   }
00103   
00104   //---------------------------------------------------
00105   
00106   void SpatialPixelView::onDataChangedEvent(dataset_attribute_type changed_attribute)
00107   {
00108     switch (changed_attribute)
00109     {
00110       case DATASET_ATTRIBUTE_FOCUS_POINT :
00111       case DATASET_ATTRIBUTE_TRANSFORMATION :
00112       case DATASET_ATTRIBUTE_TRANSLATION :
00113       {
00114         // ignore these events
00115         break;
00116       }
00117       case DATASET_ATTRIBUTE_INTENSITY :
00118       {
00119         updateView();
00120       }
00121       default :
00122       {}
00123     }
00124   }
00125   
00126   //---------------------------------------------------
00127   
00128   void SpatialPixelView::updateView()
00129     throw(NullPointerException)   
00130   {    
00131     if ((volume_dataset_.get() == 0) || (volume_dataset_->isDataSet() == false))
00132     {
00133       return;
00134     }
00135        
00136     if (render_area_.get() == 0)
00137     {
00138       throw(NullPointerException("SpatialPixelView::updateView"));
00139     } 
00140     
00141     SbVec3s dimension(volume_dataset_->getSize()[X_DIMENSION],
00142                       volume_dataset_->getSize()[Y_DIMENSION],
00143                       volume_dataset_->getSize()[Z_DIMENSION]);
00144 
00145     if (volume_dataset_ == 0)
00146     {   
00147       throw(NullPointerException("SpatialPixelView::updateView"));
00148     }
00149 
00150     current_volume_->setVolumeData(
00151         dimension, volume_dataset_->getData(), SoVolumeData::UNSIGNED_BYTE);
00152     render_area_->show(); 
00153   }
00154   
00155   //---------------------------------------------------
00156   
00157   void SpatialPixelView::createColorMap()
00158   {
00159       
00160     transfunc_->predefColorMap.setValue(SoTransferFunction::NONE);
00161     transfunc_->colorMapType = SoTransferFunction::RGBA;  
00162     
00163     // create transfer - function alpha = intensity
00164     transfunc_->colorMap.setNum(4*256);
00165     float *pValue = transfunc_->colorMap.startEditing();
00166     //THX to Thomas Pock for color map  
00167     for (int i = 0; i < 256; ++i)
00168     {
00169       switch (render_color_)
00170       {
00171         case GREY:
00172           pValue[4*i] = static_cast<float>(i) / 255;
00173           pValue[4*i+1] = static_cast<float>(i) / 255;
00174           pValue[4*i+2] = static_cast<float>(i) / 255;
00175           break;
00176         case RED:
00177           pValue[4*i] = static_cast<float>(i) / 255;
00178           pValue[4*i+1] = 0;
00179           pValue[4*i+2] = 0;
00180           break;
00181         case GREEN:
00182           pValue[4*i] = 0;
00183           pValue[4*i+1] = static_cast<float>(i) / 255;
00184           pValue[4*i+2] = 0;
00185           break;
00186         case BLUE:
00187           pValue[4*i] = 0;
00188           pValue[4*i+1] = 0;
00189           pValue[4*i+2] = static_cast<float>(i) / 255;
00190           break;
00191         default:
00192           break;
00193       }
00194       switch (render_view_mode_)
00195       {
00196         case STANDARD:
00197           pValue[4*i+3] = static_cast<float>(i) / 255;
00198           break;
00199         case ALPHA_BLENDING:
00200           pValue[4*i+3] = 
00201               exp(-(static_cast<float>(i)-255.0f)*(static_cast<float>(i)-255.0f) / (64.0f*64.0f));
00202           break;
00203         default:
00204           break;
00205       }
00206     }  
00207   }    
00208 }

Generated on Sun Aug 13 18:19:41 2006 for iMEDgine by  doxygen 1.4.6