7 #include "imstkVTKTetrahedralMeshRenderDelegate.h" 8 #include "imstkTetrahedralMesh.h" 9 #include "imstkVisualModel.h" 10 #include "imstkRenderMaterial.h" 11 #include "imstkGeometryUtilities.h" 14 #include <vtkDataSetMapper.h> 15 #include <vtkDoubleArray.h> 16 #include <vtkUnstructuredGrid.h> 17 #include <vtkPointData.h> 18 #include <vtkTransform.h> 22 VTKTetrahedralMeshRenderDelegate::VTKTetrahedralMeshRenderDelegate() :
23 m_mesh(vtkSmartPointer<vtkUnstructuredGrid>::New()),
24 m_mappedVertexArray(vtkSmartPointer<vtkDoubleArray>::New()),
25 m_cellArray(vtkSmartPointer<vtkCellArray>::New())
30 VTKTetrahedralMeshRenderDelegate::init()
32 auto geometry = std::dynamic_pointer_cast<TetrahedralMesh>(
m_visualModel->getGeometry());
33 CHECK(geometry !=
nullptr) <<
"VTKTetrahedralMeshRenderDelegate only works with TetrahedralMesh geometry";
37 auto points = vtkSmartPointer<vtkPoints>::New();
38 points->SetNumberOfPoints(0);
40 m_mesh->SetPoints(points);
42 setVertexBuffer(geometry->getVertexPositions());
44 setIndexBuffer(geometry->getCells());
45 m_mesh->SetCells(VTK_TETRA, m_cellArray);
48 if (geometry->getVertexScalars() !=
nullptr)
51 m_mesh->GetPointData()->SetScalars(m_mappedVertexScalarArray);
55 queueConnect<Event>(geometry, &Geometry::modified,
56 std::static_pointer_cast<VTKTetrahedralMeshRenderDelegate>(shared_from_this()),
61 vtkNew<vtkDataSetMapper> mapper;
62 mapper->SetInputData(m_mesh);
63 vtkNew<vtkActor> actor;
64 actor->SetMapper(mapper);
65 actor->SetUserTransform(m_transform);
80 std::shared_ptr<VecDataArray<int, 4>> indices = geom->getCells();
83 std::array<Command, 5> cmds;
84 std::array<bool, 5> contains = {
false,
false,
false,
false,
false };
87 if (cmd.m_event->m_sender ==
m_visualModel.get() && !contains[0])
92 else if (cmd.m_event->m_sender == m_material.get() && !contains[1])
97 else if (cmd.m_event->m_sender == geom.get() && !contains[2])
102 else if (cmd.m_event->m_sender == vertices.get() && !contains[3])
107 else if (cmd.m_event->m_sender == indices.get() && !contains[4])
125 setVertexBuffer(geometry->getVertexPositions());
129 VTKTetrahedralMeshRenderDelegate::indexDataModified(
Event* imstkNotUsed(e))
132 setIndexBuffer(geometry->getCells());
141 if (m_vertices != geometry->getVertexPositions())
143 setVertexBuffer(geometry->getVertexPositions());
150 if (m_indices != geometry->getCells())
152 setIndexBuffer(geometry->getCells());
160 if (m_vertices != vertices)
163 if (m_vertices !=
nullptr)
167 std::static_pointer_cast<VTKTetrahedralMeshRenderDelegate>(shared_from_this()),
171 m_vertices = vertices;
179 m_mappedVertexArray->SetArray(reinterpret_cast<double*>(m_vertices->getPointer()), m_vertices->size() * 3, 1);
181 m_mesh->GetPoints()->SetNumberOfPoints(m_vertices->size());
188 if (m_indices != indices)
191 if (m_indices !=
nullptr)
195 std::static_pointer_cast<VTKTetrahedralMeshRenderDelegate>(shared_from_this()),
202 &VTKTetrahedralMeshRenderDelegate::indexDataModified);
206 m_cellArray->Reset();
208 for (
const auto& t : *m_indices)
210 for (
size_t i = 0; i < 4; i++)
214 m_cellArray->InsertNextCell(4, cell);
216 m_mesh->SetCells(VTK_TETRA, m_cellArray);
217 m_cellArray->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.
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)) ...
vtkSmartPointer< vtkDataArray > m_mappedVertexArray
Mapped array of vertices.
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
void processEvents() override
Process handling of messages recieved.
Represents a set of tetrahedrons & vertices via an array of Vec3d double vertices & Vec4i integer ind...
void geometryModified(Event *e)
Callback for when geometry is modified.
std::shared_ptr< VecDataArray< double, 3 > > getVertexPositions(DataType type=DataType::PostTransform) const
Returns the vector of current positions of the mesh vertices.
void updateRenderProperties() override
Updates the actor and mapper properties from the currently set VisualModel.
void vertexDataModified(Event *e)
Callback for when vertex values are modified.
Delegates rendering of TetrahedralMesh to VTK from VisualModel.
Stores everything needed to invoke an event A call may not be present, in which case invoke doesn't d...