7 #include "imstkVTKImageDataRenderDelegate.h" 8 #include "imstkGeometryUtilities.h" 9 #include "imstkImageData.h" 10 #include "imstkRenderMaterial.h" 11 #include "imstkVisualModel.h" 13 #include <vtkGPUVolumeRayCastMapper.h> 14 #include <vtkImageData.h> 15 #include <vtkPointData.h> 16 #include <vtkDataArray.h> 17 #include <vtkVolume.h> 18 #include <vtkTransform.h> 22 VTKImageDataRenderDelegate::VTKImageDataRenderDelegate() :
23 m_scalarArray(nullptr),
24 m_imageDataVtk(nullptr)
29 VTKImageDataRenderDelegate::init()
31 auto imageData = std::dynamic_pointer_cast<ImageData>(
m_visualModel->getGeometry());
32 CHECK(imageData !=
nullptr) <<
"VTKImageDataRenderDelegate only works with ImageData geometry";
33 m_scalarArray = imageData->getScalars();
36 m_imageDataVtk = GeometryUtils::coupleVtkImageData(imageData);
39 queueConnect<Event>(imageData, &ImageData::modified,
40 std::static_pointer_cast<VTKImageDataRenderDelegate>(shared_from_this()),
44 queueConnect<Event>(imageData->getScalars(), &AbstractDataArray::modified,
45 std::static_pointer_cast<VTKImageDataRenderDelegate>(shared_from_this()),
50 vtkNew<vtkGPUVolumeRayCastMapper> mapper;
51 mapper->SetInputData(m_imageDataVtk);
52 vtkNew<vtkVolume> volume;
53 volume->SetMapper(mapper);
54 volume->SetUserTransform(m_transform);
70 std::list<Command> cmds;
71 bool contains[4] = {
false,
false,
false,
false };
74 if (cmd.m_event->m_sender ==
m_visualModel.get() && !contains[0])
79 else if (cmd.m_event->m_sender == m_material.get() && !contains[1])
84 else if (cmd.m_event->m_sender == geom.get() && !contains[2])
89 else if (cmd.m_event->m_sender == geom->getScalars().get() && !contains[3])
96 for (std::list<Command>::reverse_iterator i = cmds.rbegin(); i != cmds.rend(); i++)
106 vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper = vtkGPUVolumeRayCastMapper::SafeDownCast(m_mapper);
109 if (m_scalarArray != imageData->getScalars())
112 m_scalarArray = imageData->getScalars();
115 m_imageDataVtk->GetPointData()->GetScalars()->SetVoidArray(m_scalarArray->getVoidPointer(), m_scalarArray->size(), 1);
119 const Vec3i& dim = imageData->getDimensions();
120 m_imageDataVtk->SetDimensions(dim.data());
121 m_imageDataVtk->SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1);
122 const Vec3d vtkOrigin = imageData->getOrigin() + imageData->getSpacing() * 0.5;
123 m_imageDataVtk->SetOrigin(vtkOrigin.data());
124 m_imageDataVtk->SetSpacing(imageData->getSpacing().data());
126 volumeMapper->GetInput()->Modified();
133 vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper = vtkGPUVolumeRayCastMapper::SafeDownCast(m_mapper);
134 m_scalarArray = geometry->getScalars();
137 if (m_scalarArray->getVoidPointer() != m_imageDataVtk->GetPointData()->GetScalars()->GetVoidPointer(0))
139 m_imageDataVtk->GetPointData()->GetScalars()->SetVoidArray(m_scalarArray->getVoidPointer(), m_scalarArray->size(), 1);
141 volumeMapper->GetInput()->Modified();
void rforeachEvent(std::function< void(Command cmd)> func)
thread safe reverse loop over all event commands, one can implement a custom handler ...
void update()
Update render delegate.
std::shared_ptr< VisualModel > m_visualModel
imstk visual model (contains data (geometry) and render specification (render material)) ...
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
void updateRenderProperties() override
Updates the actor and mapper properties from the currently set VisualModel.
void imageDataModified(Event *e)
Callback for when the image is modified.
void processEvents() override
Update render delegate source based on the internal data.
void imageScalarsModified(Event *e)
Callback for when the image scalars are modified.
Class to represent 1, 2, or 3D image data (i.e. structured points)
Stores everything needed to invoke an event A call may not be present, in which case invoke doesn't d...