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
00058
00059
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
00069 volrend_->composition = SoVolumeRender::MAX_INTENSITY;
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
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
00164 transfunc_->colorMap.setNum(4*256);
00165 float *pValue = transfunc_->colorMap.startEditing();
00166
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 }