7 #include "imstkVTKHexahedralMeshRenderDelegate.h" 8 #include "imstkHexahedralMesh.h" 9 #include "imstkVisualModel.h" 10 #include "imstkGeometryUtilities.h" 11 #include "imstkRenderMaterial.h" 14 #include <vtkDataSetMapper.h> 15 #include <vtkDoubleArray.h> 16 #include <vtkUnstructuredGrid.h> 17 #include <vtkPointData.h> 18 #include <vtkTransform.h> 22 VTKHexahedralMeshRenderDelegate::VTKHexahedralMeshRenderDelegate() :
23 m_mesh(vtkSmartPointer<vtkUnstructuredGrid>::New()),
24 m_mappedVertexArray(vtkSmartPointer<vtkDoubleArray>::New())
29 VTKHexahedralMeshRenderDelegate::init()
31 auto geometry = std::dynamic_pointer_cast<HexahedralMesh>(
m_visualModel->getGeometry());
32 CHECK(geometry !=
nullptr) <<
"VTKHexahedralMeshRenderDelegate only works with HexahedralMesh geometry";
33 m_vertices = geometry->getVertexPositions();
34 m_indices = geometry->getCells();
39 auto points = vtkSmartPointer<vtkPoints>::New();
40 points->SetNumberOfPoints(geometry->getNumVertices());
42 m_mesh->SetPoints(points);
46 if (geometry->getVertexScalars() !=
nullptr)
49 m_mesh->GetPointData()->SetScalars(m_mappedVertexScalarArray);
54 m_cellArray = vtkSmartPointer<vtkCellArray>::New();
56 for (
const auto& t : *m_indices)
58 for (
size_t i = 0; i < 8; ++i)
62 m_cellArray->InsertNextCell(8, cell);
64 m_mesh->SetCells(VTK_HEXAHEDRON, m_cellArray);
68 queueConnect<Event>(geometry, &Geometry::modified,
69 std::static_pointer_cast<VTKHexahedralMeshRenderDelegate>(shared_from_this()),
70 &VTKHexahedralMeshRenderDelegate::geometryModified);
73 queueConnect<Event>(geometry->getVertexPositions(), &VecDataArray<double, 3>::modified,
74 std::static_pointer_cast<VTKHexahedralMeshRenderDelegate>(shared_from_this()),
75 &VTKHexahedralMeshRenderDelegate::vertexDataModified);
79 vtkNew<vtkDataSetMapper> mapper;
80 mapper->SetInputData(m_mesh);
81 vtkNew<vtkActor> actor;
82 actor->SetMapper(mapper);
83 actor->SetUserTransform(m_transform);
100 std::list<Command> cmds;
101 bool contains[4] = {
false,
false,
false,
false };
104 if (cmd.m_event->m_sender ==
m_visualModel.get() && !contains[0])
109 else if (cmd.m_event->m_sender == m_material.get() && !contains[1])
114 else if (cmd.m_event->m_sender == geom.get() && !contains[2])
119 else if (cmd.m_event->m_sender == vertices.get() && !contains[3])
127 for (std::list<Command>::reverse_iterator i = cmds.rbegin(); i != cmds.rend(); i++)
134 VTKHexahedralMeshRenderDelegate::geometryModified(
Event* imstkNotUsed(e))
139 if (m_vertices != geometry->getVertexPositions())
142 m_vertices = geometry->getVertexPositions();
146 m_mappedVertexArray->SetArray(reinterpret_cast<double*>(m_vertices->getPointer()), m_vertices->size() * 3, 1);
152 if (m_indices != geometry->getCells())
155 m_indices = geometry->getCells();
158 m_cellArray->Reset();
160 for (
const auto& t : *m_indices)
162 for (
size_t i = 0; i < 8; ++i)
166 m_cellArray->InsertNextCell(8, cell);
168 m_mesh->SetCells(VTK_TETRA, m_cellArray);
169 m_cellArray->Modified();
175 VTKHexahedralMeshRenderDelegate::vertexDataModified(
Event* imstkNotUsed(e))
178 m_vertices = geometry->getVertexPositions();
182 m_mappedVertexArray->SetArray(reinterpret_cast<double*>(m_vertices->getPointer()), m_vertices->size() * 3, 1);
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.
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...
vtkSmartPointer< vtkDoubleArray > m_mappedVertexArray
Mapped array of vertices.
void updateRenderProperties() override
Updates the actor and mapper properties from the currently set VisualModel.
void processEvents() override
Process Events.
std::shared_ptr< VecDataArray< double, 3 > > getVertexPositions(DataType type=DataType::PostTransform) const
Returns the vector of current positions of the mesh vertices.
Stores everything needed to invoke an event A call may not be present, in which case invoke doesn't d...