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> 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)
105 mMaxVoxels = maxVoxels;
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 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.