7 #include "imstkVTKVertexLabelRenderDelegate.h" 8 #include "imstkGeometryUtilities.h" 9 #include "imstkPointSet.h" 10 #include "imstkRenderMaterial.h" 11 #include "imstkVertexLabelVisualModel.h" 13 #include <vtkActor2D.h> 14 #include <vtkDoubleArray.h> 15 #include <vtkLabeledDataMapper.h> 16 #include <vtkPolyData.h> 17 #include <vtkTextProperty.h> 21 VTKVertexLabelRenderDelegate::VTKVertexLabelRenderDelegate() :
22 m_polydata(vtkSmartPointer<vtkPolyData>::New()),
23 m_mappedVertexArray(vtkSmartPointer<vtkDoubleArray>::New())
28 VTKVertexLabelRenderDelegate::init()
30 auto vertexLabelVisualModel = std::dynamic_pointer_cast<VertexLabelVisualModel>(
m_visualModel);
31 m_geometry = std::dynamic_pointer_cast<PointSet>(
m_visualModel->getGeometry());
32 CHECK(m_geometry !=
nullptr) <<
"VTKVertexLabelRenderDelegate only works with PointSet geometry";
35 m_vertices = m_geometry->getVertexPositions();
38 if (m_vertices !=
nullptr)
41 auto points = vtkSmartPointer<vtkPoints>::New();
42 points->SetNumberOfPoints(m_geometry->getNumVertices());
43 points->SetData(m_mappedVertexArray);
44 m_polydata->SetPoints(points);
48 queueConnect<Event>(m_geometry, &Geometry::modified,
49 std::static_pointer_cast<VTKVertexLabelRenderDelegate>(shared_from_this()),
53 queueConnect<Event>(m_geometry->getVertexPositions(), &VecDataArray<double, 3>::modified,
54 std::static_pointer_cast<VTKVertexLabelRenderDelegate>(shared_from_this()),
60 vtkNew<vtkLabeledDataMapper> mapper;
61 mapper->SetInputData(m_polydata);
62 mapper->SetLabelModeToLabelIds();
64 vtkNew<vtkActor2D> actor;
65 actor->SetMapper(mapper);
78 std::shared_ptr<VecDataArray<double, 3>> verticesPtr = m_geometry->getVertexPositions();
81 std::array<Command, 5> cmds;
82 std::array<bool, 5> contains = {
false,
false,
false,
false,
false };
85 if (cmd.m_event->m_sender ==
m_visualModel.get() && !contains[0])
90 else if (cmd.m_event->m_sender == m_material.get() && !contains[1])
95 else if (cmd.m_event->m_sender == m_geometry.get() && !contains[2])
100 else if (cmd.m_event->m_sender == verticesPtr.get() && !contains[3])
118 auto labelMapper = vtkLabeledDataMapper::SafeDownCast(m_mapper);
120 labelMapper->SetLabelFormat(visualModel->getFormat().c_str());
122 const Color& color = visualModel->getTextColor();
123 labelMapper->GetLabelTextProperty()->SetColor(color.r, color.g, color.b);
124 labelMapper->GetLabelTextProperty()->SetFontSize(visualModel->getFontSize());
125 labelMapper->GetLabelTextProperty()->SetShadow(
false);
131 setVertexBuffer(m_geometry->getVertexPositions());
138 if (m_vertices != m_geometry->getVertexPositions())
140 setVertexBuffer(m_geometry->getVertexPositions());
144 m_mappedVertexArray->Modified();
151 if (m_vertices != vertices)
154 if (m_vertices !=
nullptr)
158 std::static_pointer_cast<VTKVertexLabelRenderDelegate>(shared_from_this()),
162 m_vertices = vertices;
169 m_mappedVertexArray->SetNumberOfComponents(3);
170 m_mappedVertexArray->SetArray(reinterpret_cast<double*>(m_vertices->getPointer()), m_vertices->size() * 3, 1);
171 m_mappedVertexArray->Modified();
172 m_polydata->GetPoints()->SetNumberOfPoints(m_vertices->size());
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.
void updateRenderProperties() override
Updates the actor and mapper properties from the currently set VisualModel.
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 geometryModified(Event *e)
Callback for when geometry changes.
void updateRenderProperties() override
Updates the actor and mapper properties from the currently set VisualModel.
Delegates rendering of text per PointSet vertex to VTK from VisualModel.
void processEvents() override
Update polydata source based on the mesh geometry.
void vertexDataModified(Event *e)
Callback for when vertex data changes.
Given a PointSet geometry it will render labels for each vertex with numberings.
Stores everything needed to invoke an event A call may not be present, in which case invoke doesn't d...