13 #ifdef CX_BUILD_MEHDI_VTKMULTIVOLUME
16 #include "vtkOpenGLGPUMultiVolumeRayCastMapper.h"
17 #include <vtkVolumeProperty.h>
19 #include <vtkRenderer.h>
23 #include <vtkImageData.h>
24 #include <vtkMatrix4x4.h>
25 #include <vtkTransform.h>
32 #include <vtkRenderWindow.h>
45 ImageMapperMonitor(volume,image), mVolumeIndex(volumeIndex)
52 mapper =
dynamic_cast<vtkOpenGLGPUMultiVolumeRayCastMapper*
>(
mVolume->GetMapper());
61 mapper->RemoveClippingPlane(mVolumeIndex);
69 std::vector<vtkPlanePtr> planes =
mImage->getAllClipPlanes();
72 mapper->RemoveClippingPlane(mVolumeIndex);
77 mapper->AddClippingPlane(mVolumeIndex, planes[0]);
87 mapper->SetCropping(mVolumeIndex,
mImage->getCropping());
89 DoubleBoundingBox3D bb_d =
mImage->getCroppingBox();
91 mapper->SetCroppingRegionPlanes(mVolumeIndex, bb_d.begin());
99 mMaxVoxels(10*1000*1000)
112 MehdiGPURayCastMultiVolumeRep::~MehdiGPURayCastMultiVolumeRep()
116 MehdiGPURayCastMultiVolumeRep::MehdiGPURayCastMultiVolumeRep() :
121 void MehdiGPURayCastMultiVolumeRep::addRepActorsToViewRenderer(View* view)
123 view->getRenderer()->AddVolume(mVolume);
126 void MehdiGPURayCastMultiVolumeRep::removeRepActorsFromViewRenderer(View* view)
128 view->getRenderer()->RemoveVolume(mVolume);
131 void MehdiGPURayCastMultiVolumeRep::setImages(std::vector<ImagePtr> images)
136 this->disconnectImages();
142 this->connectImages();
145 void MehdiGPURayCastMultiVolumeRep::clearVolume()
148 mVolumeProperties.clear();
153 mVolume->ReleaseGraphicsResources(this->getView()->getRenderWindow());
154 mVolume->SetMapper(NULL);
156 mReferenceImage.reset();
157 mReferenceProperty.reset();
161 void MehdiGPURayCastMultiVolumeRep::vtkImageDataChangedSlot()
168 void MehdiGPURayCastMultiVolumeRep::transformChangedSlot()
170 this->vtkImageDataChangedSlot();
187 void MehdiGPURayCastMultiVolumeRep::setupVolume()
192 this->setupVolumeProperties();
194 this->initializeMapper();
196 for (
unsigned i=0; i<mImages.size(); ++i)
199 mMapper->SetInput(i+1, mImages[i]->getBaseVtkImageData());
200 mMapper->SetAdditionalProperty(i, mVolumeProperties[i]->getVolumeProperty() );
203 this->setupReferenceVolumeAndPropertiesAndConnectToVolume();
205 this->updateTransforms();
208 this->setupMonitor();
213 void MehdiGPURayCastMultiVolumeRep::initializeMapper()
215 mMapper = vtkOpenGLGPUMultiVolumeRayCastMapperPtr::New();
216 mMapper->setNumberOfAdditionalVolumes(mImages.size());
217 mVolume->SetMapper(mMapper);
221 void MehdiGPURayCastMultiVolumeRep::setupReferenceVolumeAndPropertiesAndConnectToVolume()
223 SSC_ASSERT(!mImages.empty());
225 mReferenceImage = this->getEnvelopingImage();
229 mReferenceProperty->setImage(mImages[0]);
230 mVolume->SetProperty( mReferenceProperty->getVolumeProperty() );
231 mMapper->SetInput(0, mReferenceImage->getBaseVtkImageData());
234 void MehdiGPURayCastMultiVolumeRep::updateTransforms()
239 SSC_ASSERT(mReferenceImage);
242 mVolume->SetUserMatrix(rMd0.getVtkMatrix());
244 for (
unsigned i=0; i<mImages.size(); ++i)
249 mMapper->SetAdditionalInputUserTransform(i, d0Mdi.getVtkTransform());
253 ImagePtr MehdiGPURayCastMultiVolumeRep::getEnvelopingImage()
257 generator->setImages(mImages);
258 generator->setMaxEnvelopeVoxels(mMaxVoxels);
259 return generator->getEnvelopingImage();
262 void MehdiGPURayCastMultiVolumeRep::disconnectImages()
264 for (
unsigned i=0; i<mImages.size(); ++i)
266 disconnect(mImages[i].get(), SIGNAL(vtkImageDataChanged()),
this, SLOT(vtkImageDataChangedSlot()));
267 disconnect(mImages[i].get(), SIGNAL(transformChanged()),
this, SLOT(transformChangedSlot()));
271 void MehdiGPURayCastMultiVolumeRep::connectImages()
273 for (
unsigned i=0; i<mImages.size(); ++i)
275 connect(mImages[i].get(), SIGNAL(vtkImageDataChanged()),
this, SLOT(vtkImageDataChangedSlot()));
276 connect(mImages[i].get(), SIGNAL(transformChanged()),
this, SLOT(transformChangedSlot()));
280 void MehdiGPURayCastMultiVolumeRep::setupMonitor()
282 mMonitors.resize(mImages.size());
283 for (
unsigned i=0; i<mImages.size(); ++i)
289 void MehdiGPURayCastMultiVolumeRep::setupVolumeProperties()
291 mVolumeProperties.clear();
292 for (
unsigned i=0; i<mImages.size(); ++i)
295 property->setImage(mImages[i]);
296 mVolumeProperties.push_back(property);
302 #endif //CX_BUILD_MEHDI_VTKMULTIVOLUME