7 #include "imstkVTKPointSetRenderDelegate.h" 8 #include "imstkPointSet.h" 9 #include "imstkVisualModel.h" 10 #include "imstkGeometryUtilities.h" 11 #include "imstkRenderMaterial.h" 15 #include <vtkDoubleArray.h> 16 #include <vtkOpenGLPolyDataMapper.h> 17 #include <vtkOpenGLVertexBufferObject.h> 18 #include <vtkPointData.h> 19 #include <vtkTransform.h> 20 #include <vtkVertexGlyphFilter.h> 24 VTKPointSetRenderDelegate::VTKPointSetRenderDelegate() :
27 m_vertexScalars(nullptr),
28 m_polydata(vtkSmartPointer<vtkPolyData>::New()),
29 m_mappedVertexArray(vtkSmartPointer<vtkDoubleArray>::New()),
30 m_mappedVertexScalarArray(vtkSmartPointer<vtkDoubleArray>::New())
35 VTKPointSetRenderDelegate::init()
37 m_geometry = std::dynamic_pointer_cast<PointSet>(
m_visualModel->getGeometry());
38 CHECK(m_geometry !=
nullptr) <<
"VTKPointSetRenderDelegate only works with PointSet geometry";
41 m_vertices = m_geometry->getVertexPositions();
44 if (m_vertices !=
nullptr)
47 auto points = vtkSmartPointer<vtkPoints>::New();
48 points->SetNumberOfPoints(m_geometry->getNumVertices());
49 points->SetData(m_mappedVertexArray);
50 m_polydata->SetPoints(points);
54 if (m_geometry->getVertexScalars() !=
nullptr)
56 setVertexScalarBuffer(m_geometry->getVertexScalars());
60 vtkNew<vtkVertexGlyphFilter> glyphFilter;
61 glyphFilter->SetInputData(m_polydata);
62 glyphFilter->Update();
65 queueConnect<Event>(m_geometry, &Geometry::modified,
66 std::static_pointer_cast<VTKPointSetRenderDelegate>(shared_from_this()),
70 queueConnect<Event>(m_geometry->getVertexPositions(), &VecDataArray<double, 3>::modified,
71 std::static_pointer_cast<VTKPointSetRenderDelegate>(shared_from_this()),
76 vtkNew<vtkPolyDataMapper> mapper;
77 mapper->SetInputConnection(glyphFilter->GetOutputPort());
78 vtkNew<vtkActor> actor;
79 actor->SetMapper(mapper);
80 actor->SetUserTransform(m_transform);
83 if (
auto glMapper = vtkOpenGLPolyDataMapper::SafeDownCast(m_mapper.GetPointer()))
85 glMapper->SetVBOShiftScaleMethod(vtkOpenGLVertexBufferObject::DISABLE_SHIFT_SCALE);
97 std::shared_ptr<VecDataArray<double, 3>> verticesPtr = m_geometry->getVertexPositions();
98 std::shared_ptr<AbstractDataArray> vertexScalarsPtr = m_geometry->getVertexScalars();
101 std::array<Command, 5> cmds;
102 std::array<bool, 5> contains = {
false,
false,
false,
false,
false };
105 if (cmd.m_event->m_sender ==
m_visualModel.get() && !contains[0])
110 else if (cmd.m_event->m_sender == m_material.get() && !contains[1])
115 else if (cmd.m_event->m_sender == m_geometry.get() && !contains[2])
120 else if (cmd.m_event->m_sender == verticesPtr.get() && !contains[3])
125 else if (cmd.m_event->m_sender == vertexScalarsPtr.get() && !contains[4])
143 setVertexBuffer(m_geometry->getVertexPositions());
147 VTKPointSetRenderDelegate::vertexScalarsModified(
Event* imstkNotUsed(e))
149 setVertexScalarBuffer(m_geometry->getVertexScalars());
156 if (m_vertices != m_geometry->getVertexPositions())
158 setVertexBuffer(m_geometry->getVertexPositions());
162 m_mappedVertexArray->Modified();
164 if (m_vertexScalars != m_geometry->getVertexScalars())
166 setVertexScalarBuffer(m_geometry->getVertexScalars());
174 if (m_vertices != vertices)
177 if (m_vertices !=
nullptr)
181 std::static_pointer_cast<VTKPointSetRenderDelegate>(shared_from_this()),
185 m_vertices = vertices;
192 m_mappedVertexArray->SetNumberOfComponents(3);
193 m_mappedVertexArray->SetArray(reinterpret_cast<double*>(m_vertices->getPointer()), m_vertices->size() * 3, 1);
194 m_mappedVertexArray->Modified();
195 m_polydata->GetPoints()->SetNumberOfPoints(m_vertices->size());
199 VTKPointSetRenderDelegate::setVertexScalarBuffer(std::shared_ptr<AbstractDataArray> scalars)
202 if (m_vertexScalars != scalars)
205 if (m_vertexScalars !=
nullptr)
209 std::static_pointer_cast<VTKPointSetRenderDelegate>(shared_from_this()),
210 &AbstractDataArray::modified);
213 m_vertexScalars = scalars;
214 queueConnect<Event>(m_vertexScalars, &AbstractDataArray::modified,
216 &VTKPointSetRenderDelegate::vertexScalarsModified);
218 m_polydata->GetPointData()->SetScalars(m_mappedVertexScalarArray);
220 m_mappedVertexScalarArray->SetNumberOfComponents(m_vertexScalars->getNumberOfComponents());
221 m_mappedVertexScalarArray->SetVoidArray(m_vertexScalars->getVoidPointer(),
222 static_cast<vtkIdType
>(m_vertexScalars->size()), 1);
223 m_mappedVertexScalarArray->Modified();
void rforeachEvent(std::function< void(Command cmd)> func)
thread safe reverse loop over all event commands, one can implement a custom handler ...
void geometryModified(Event *e)
Callback for when geometry changes.
void update()
Update render delegate.
friend void disconnect(std::shared_ptr< EventObject >, std::shared_ptr< EventObject >, std::string(*)())
Remove an observer from the sender.
vtkSmartPointer< vtkDataArray > coupleVtkDataArray(std::shared_ptr< AbstractDataArray > imstkArray)
Coupling functions, these create vtk data objects that point to our data objects thus no copying is d...
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 vertexDataModified(Event *e)
Callback for when vertex data changes.
Delegates rendering of PointSet to VTK from VisualModel.
void updateRenderProperties() override
Updates the actor and mapper properties from the currently set VisualModel.
void processEvents() override
Update polydata source based on the mesh geometry.
Stores everything needed to invoke an event A call may not be present, in which case invoke doesn't d...