34 #ifdef CX_BUILD_MEHDI_VTKMULTIVOLUME 37 #include "vtkOpenGLGPUMultiVolumeRayCastMapper.h" 38 #include <vtkVolumeProperty.h> 40 #include <vtkRenderer.h> 44 #include <vtkImageData.h> 45 #include <vtkMatrix4x4.h> 46 #include <vtkTransform.h> 53 #include <vtkRenderWindow.h> 73 mapper =
dynamic_cast<vtkOpenGLGPUMultiVolumeRayCastMapper*
>(mVolume->GetMapper());
82 mapper->RemoveClippingPlane(mVolumeIndex);
90 std::vector<vtkPlanePtr> planes = mImage->getAllClipPlanes();
93 mapper->RemoveClippingPlane(mVolumeIndex);
98 mapper->AddClippingPlane(mVolumeIndex, planes[0]);
108 mapper->SetCropping(mVolumeIndex, mImage->getCropping());
110 DoubleBoundingBox3D bb_d = mImage->getCroppingBox();
112 mapper->SetCroppingRegionPlanes(mVolumeIndex, bb_d.begin());
120 mMaxVoxels(10*1000*1000)
126 mMaxVoxels = maxVoxels;
133 MehdiGPURayCastMultiVolumeRep::~MehdiGPURayCastMultiVolumeRep()
137 MehdiGPURayCastMultiVolumeRep::MehdiGPURayCastMultiVolumeRep() :
142 void MehdiGPURayCastMultiVolumeRep::addRepActorsToViewRenderer(View* view)
144 view->getRenderer()->AddVolume(mVolume);
147 void MehdiGPURayCastMultiVolumeRep::removeRepActorsFromViewRenderer(View* view)
149 view->getRenderer()->RemoveVolume(mVolume);
152 void MehdiGPURayCastMultiVolumeRep::setImages(std::vector<ImagePtr> images)
157 this->disconnectImages();
163 this->connectImages();
166 void MehdiGPURayCastMultiVolumeRep::clearVolume()
169 mVolumeProperties.clear();
174 mVolume->ReleaseGraphicsResources(this->
getView()->getRenderWindow());
175 mVolume->SetMapper(NULL);
177 mReferenceImage.reset();
178 mReferenceProperty.reset();
182 void MehdiGPURayCastMultiVolumeRep::vtkImageDataChangedSlot()
189 void MehdiGPURayCastMultiVolumeRep::transformChangedSlot()
191 this->vtkImageDataChangedSlot();
208 void MehdiGPURayCastMultiVolumeRep::setupVolume()
213 this->setupVolumeProperties();
215 this->initializeMapper();
217 for (
unsigned i=0; i<mImages.size(); ++i)
220 mMapper->SetInput(i+1, mImages[i]->getBaseVtkImageData());
221 mMapper->SetAdditionalProperty(i, mVolumeProperties[i]->getVolumeProperty() );
224 this->setupReferenceVolumeAndPropertiesAndConnectToVolume();
226 this->updateTransforms();
229 this->setupMonitor();
234 void MehdiGPURayCastMultiVolumeRep::initializeMapper()
236 mMapper = vtkOpenGLGPUMultiVolumeRayCastMapperPtr::New();
237 mMapper->setNumberOfAdditionalVolumes(mImages.size());
238 mVolume->SetMapper(mMapper);
242 void MehdiGPURayCastMultiVolumeRep::setupReferenceVolumeAndPropertiesAndConnectToVolume()
244 SSC_ASSERT(!mImages.empty());
246 mReferenceImage = this->getEnvelopingImage();
250 mReferenceProperty->setImage(mImages[0]);
251 mVolume->SetProperty( mReferenceProperty->getVolumeProperty() );
252 mMapper->SetInput(0, mReferenceImage->getBaseVtkImageData());
255 void MehdiGPURayCastMultiVolumeRep::updateTransforms()
260 SSC_ASSERT(mReferenceImage);
263 mVolume->SetUserMatrix(rMd0.getVtkMatrix());
265 for (
unsigned i=0; i<mImages.size(); ++i)
270 mMapper->SetAdditionalInputUserTransform(i, d0Mdi.getVtkTransform());
274 ImagePtr MehdiGPURayCastMultiVolumeRep::getEnvelopingImage()
278 generator->setImages(mImages);
279 generator->setMaxEnvelopeVoxels(mMaxVoxels);
280 return generator->getEnvelopingImage();
283 void MehdiGPURayCastMultiVolumeRep::disconnectImages()
285 for (
unsigned i=0; i<mImages.size(); ++i)
287 disconnect(mImages[i].
get(), SIGNAL(vtkImageDataChanged()),
this, SLOT(vtkImageDataChangedSlot()));
288 disconnect(mImages[i].
get(), SIGNAL(transformChanged()),
this, SLOT(transformChangedSlot()));
292 void MehdiGPURayCastMultiVolumeRep::connectImages()
294 for (
unsigned i=0; i<mImages.size(); ++i)
296 connect(mImages[i].
get(), SIGNAL(vtkImageDataChanged()),
this, SLOT(vtkImageDataChangedSlot()));
297 connect(mImages[i].
get(), SIGNAL(transformChanged()),
this, SLOT(transformChangedSlot()));
301 void MehdiGPURayCastMultiVolumeRep::setupMonitor()
303 mMonitors.resize(mImages.size());
304 for (
unsigned i=0; i<mImages.size(); ++i)
310 void MehdiGPURayCastMultiVolumeRep::setupVolumeProperties()
312 mVolumeProperties.clear();
313 for (
unsigned i=0; i<mImages.size(); ++i)
316 property->setImage(mImages[i]);
317 mVolumeProperties.push_back(property);
323 #endif //CX_BUILD_MEHDI_VTKMULTIVOLUME vtkSmartPointer< class vtkVolume > vtkVolumePtr
static LandmarkRepPtr New(PatientModelServicePtr dataManager, const QString &uid="")
virtual void applyCropping()
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
vtkSmartPointer< class vtkOpenGLGPUMultiVolumeRayCastMapper > vtkOpenGLGPUMultiVolumeRayCastMapperPtr
static ImageMapperMonitorPtr create(vtkVolumePtr volume, ImagePtr image, int volumeIndex)
boost::shared_ptr< class Image > ImagePtr
static ImageEnveloperPtr create()
boost::shared_ptr< class ImageMapperMonitor > ImageMapperMonitorPtr
MehdiGPURayCastMultiVolumeRepBase()
virtual void applyClipping()
virtual void clearClipping()
static VolumePropertyPtr create()
boost::shared_ptr< class VolumeProperty > VolumePropertyPtr
MehdiGPURayCastMultiVolumeRepImageMapperMonitor(vtkVolumePtr volume, ImagePtr image, int volumeIndex)
ImageMapperMonitor(vtkVolumePtr volume, ImagePtr image)
virtual void setMaxVolumeSize(long maxVoxels)
boost::shared_ptr< class ImageEnveloper > ImageEnveloperPtr
Namespace for all CustusX production code.