7 #include "imstkVTKSurfaceMeshRenderDelegate.h" 8 #include "imstkGeometryUtilities.h" 9 #include "imstkRenderMaterial.h" 10 #include "imstkSurfaceMesh.h" 11 #include "imstkTextureDelegate.h" 12 #include "imstkTextureManager.h" 13 #include "imstkVisualModel.h" 16 #include <vtkCellData.h> 17 #include <vtkDoubleArray.h> 18 #include <vtkFloatArray.h> 19 #include <vtkOpenGLPolyDataMapper.h> 20 #include <vtkOpenGLVertexBufferObject.h> 21 #include <vtkPointData.h> 22 #include <vtkPolyData.h> 23 #include <vtkProperty.h> 24 #include <vtkTexture.h> 25 #include <vtkTransform.h> 29 VTKSurfaceMeshRenderDelegate::VTKSurfaceMeshRenderDelegate() :
30 m_polydata(vtkSmartPointer<vtkPolyData>::New()),
31 m_mappedVertexArray(vtkSmartPointer<vtkDoubleArray>::New()),
32 m_mappedNormalArray(vtkSmartPointer<vtkDoubleArray>::New())
37 VTKSurfaceMeshRenderDelegate::init()
39 m_geometry = std::dynamic_pointer_cast<SurfaceMesh>(
m_visualModel->getGeometry());
40 CHECK(m_geometry !=
nullptr) <<
"VTKSurfaceMeshRenderDelegate only works with SurfaceMesh geometry";
41 m_geometry->computeVertexToCellMap();
43 m_isDynamicMesh =
m_visualModel->getRenderMaterial()->getIsDynamicMesh();
46 m_vertices = m_isDynamicMesh ? m_geometry->getVertexPositions() : m_geometry->getInitialVertexPositions();
47 m_indices = m_geometry->getCells();
50 if (m_vertices !=
nullptr)
53 auto points = vtkSmartPointer<vtkPoints>::New();
54 points->SetNumberOfPoints(m_vertices->size());
55 points->SetData(m_mappedVertexArray);
56 m_polydata->SetPoints(points);
60 if (m_indices !=
nullptr)
62 m_cellArray = vtkSmartPointer<vtkCellArray>::New();
64 for (
const auto& t : *m_indices)
66 for (
size_t i = 0; i < 3; i++)
70 m_cellArray->InsertNextCell(3, cell);
72 m_polydata->SetPolys(m_cellArray);
76 if (m_geometry->getVertexScalars() !=
nullptr)
78 setVertexScalarBuffer(m_geometry->getVertexScalars());
82 if (m_geometry->getCellScalars() !=
nullptr)
84 setCellScalarBuffer(m_geometry->getCellScalars());
88 if (m_geometry->getVertexNormals() ==
nullptr)
90 m_geometry->computeVertexNormals();
93 m_polydata->GetPointData()->SetNormals(m_mappedNormalArray);
96 if (m_geometry->getVertexTCoords() !=
nullptr)
98 setTextureCoordinateBuffer(m_geometry->getVertexTCoords());
102 queueConnect<Event>(m_geometry, &Geometry::modified,
103 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
107 queueConnect<Event>(m_vertices, &VecDataArray<double, 3>::modified,
108 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
112 queueConnect<Event>(m_indices, &VecDataArray<int, 3>::modified,
113 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
114 &VTKSurfaceMeshRenderDelegate::indexDataModified);
117 queueConnect<Event>(m_geometry->getVertexNormals(), &VecDataArray<double, 3>::modified,
118 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
119 &VTKSurfaceMeshRenderDelegate::normalDataModified);
121 connect<Event>(m_material, &RenderMaterial::texturesModified,
122 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
127 vtkNew<vtkPolyDataMapper> mapper;
128 mapper->SetInputData(m_polydata);
129 vtkNew<vtkActor> actor;
130 actor->SetMapper(mapper);
133 if (!m_isDynamicMesh)
135 actor->SetUserTransform(m_transform);
137 if (
auto glMapper = vtkOpenGLPolyDataMapper::SafeDownCast(m_mapper))
139 glMapper->SetVBOShiftScaleMethod(vtkOpenGLVertexBufferObject::DISABLE_SHIFT_SCALE);
150 if (!m_isDynamicMesh)
153 const Mat4d& mImstk = m_geometry->getTransform();
154 vtkNew<vtkMatrix4x4> mVtk;
155 for (
int y = 0; y < 4; y++)
157 for (
int x = 0; x < 4; x++)
159 mVtk->SetElement(x, y, mImstk(x, y));
162 m_transform->SetMatrix(mVtk);
166 std::shared_ptr<VecDataArray<double, 3>> verticesPtr =
167 m_isDynamicMesh ? m_geometry->getVertexPositions() : m_geometry->getInitialVertexPositions();
168 std::shared_ptr<VecDataArray<int, 3>> indicesPtr = m_geometry->getCells();
169 std::shared_ptr<AbstractDataArray> cellScalarsPtr = m_geometry->getCellScalars();
170 std::shared_ptr<AbstractDataArray> vertexScalarsPtr = m_geometry->getVertexScalars();
171 std::shared_ptr<AbstractDataArray> textureCoordinatesPtr = m_geometry->getVertexTCoords();
173 std::shared_ptr<VecDataArray<double, 3>> normalsPtr = m_geometry->getVertexNormals();
176 std::array<Command, 9> cmds;
177 std::array<bool, 9> contains = {
false,
false,
false,
false,
false,
false,
false,
false,
false };
180 if (cmd.m_event->m_sender ==
m_visualModel.get() && !contains[0])
185 else if (cmd.m_event->m_sender == m_material.get() && !contains[1])
190 else if (cmd.m_event->m_sender == m_geometry.get() && !contains[2])
195 else if (cmd.m_event->m_sender == verticesPtr.get() && !contains[3])
200 else if (cmd.m_event->m_sender == cellScalarsPtr.get() && !contains[4])
205 else if (cmd.m_event->m_sender == vertexScalarsPtr.get() && !contains[5])
210 else if (cmd.m_event->m_sender == indicesPtr.get() && !contains[6])
215 else if (cmd.m_event->m_sender == textureCoordinatesPtr.get() && !contains[7])
220 else if (cmd.m_event->m_sender == normalsPtr.get() && !contains[8])
242 setVertexBuffer(m_isDynamicMesh ? m_geometry->getVertexPositions() :
243 m_geometry->getInitialVertexPositions());
248 if (
m_visualModel->getRenderMaterial()->getRecomputeVertexNormals())
250 m_geometry->computeVertexNormals();
251 setNormalBuffer(m_geometry->getVertexNormals());
257 VTKSurfaceMeshRenderDelegate::indexDataModified(
Event* imstkNotUsed(e))
259 setIndexBuffer(m_geometry->getCells());
263 VTKSurfaceMeshRenderDelegate::normalDataModified(
Event* imstkNotUsed(e))
265 setNormalBuffer(m_geometry->getVertexNormals());
269 VTKSurfaceMeshRenderDelegate::vertexScalarsModified(
Event* imstkNotUsed(e))
271 setVertexScalarBuffer(m_geometry->getVertexScalars());
275 VTKSurfaceMeshRenderDelegate::cellScalarsModified(
Event* imstkNotUsed(e))
277 setCellScalarBuffer(m_geometry->getCellScalars());
281 VTKSurfaceMeshRenderDelegate::textureCoordinatesModified(
Event* imstkNotUsed(e))
283 setTextureCoordinateBuffer(m_geometry->getVertexTCoords());
294 if (m_vertices != m_geometry->getVertexPositions())
296 setVertexBuffer(m_geometry->getVertexPositions());
300 m_mappedVertexArray->Modified();
303 if (m_indices != m_geometry->getCells())
305 setIndexBuffer(m_geometry->getCells());
308 if (m_normals != m_geometry->getVertexNormals())
310 setNormalBuffer(m_geometry->getVertexNormals());
313 if (
m_visualModel->getRenderMaterial()->getRecomputeVertexNormals())
315 m_geometry->computeVertexNormals();
316 setNormalBuffer(m_geometry->getVertexNormals());
324 bool normalsOutdated =
false;
325 if (m_vertices != m_geometry->getInitialVertexPositions())
327 setVertexBuffer(m_geometry->getInitialVertexPositions());
328 normalsOutdated =
true;
332 if (m_indices != m_geometry->getCells())
334 setIndexBuffer(m_geometry->getCells());
335 normalsOutdated =
true;
338 if (m_normals != m_geometry->getVertexNormals())
340 setNormalBuffer(m_geometry->getVertexNormals());
341 normalsOutdated =
false;
344 if (normalsOutdated &&
m_visualModel->getRenderMaterial()->getRecomputeVertexNormals())
346 m_geometry->computeVertexNormals();
347 setNormalBuffer(m_geometry->getVertexNormals());
351 if (m_vertexScalars != m_geometry->getVertexScalars())
353 setVertexScalarBuffer(m_geometry->getVertexScalars());
356 if (m_cellScalars != m_geometry->getCellScalars())
358 setCellScalarBuffer(m_geometry->getCellScalars());
361 if (m_textureCoordinates != m_geometry->getVertexTCoords())
363 setTextureCoordinateBuffer(m_geometry->getVertexTCoords());
372 if (material !=
nullptr)
376 initializeTextures();
384 if (m_vertices != vertices)
387 if (m_vertices !=
nullptr)
391 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
395 m_vertices = vertices;
402 m_mappedVertexArray->SetNumberOfComponents(3);
403 m_mappedVertexArray->SetArray(reinterpret_cast<double*>(m_vertices->getPointer()), m_vertices->size() * 3, 1);
404 m_mappedVertexArray->Modified();
405 m_polydata->GetPoints()->SetNumberOfPoints(m_vertices->size());
412 if (m_normals != normals)
415 if (m_normals !=
nullptr)
419 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
426 &VTKSurfaceMeshRenderDelegate::normalDataModified);
430 m_mappedNormalArray->SetNumberOfComponents(3);
431 m_mappedNormalArray->SetArray(reinterpret_cast<double*>(m_normals->getPointer()), m_normals->size() * 3, 1);
432 m_mappedNormalArray->Modified();
439 if (m_indices != indices)
442 if (m_indices !=
nullptr)
446 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
453 &VTKSurfaceMeshRenderDelegate::indexDataModified);
458 m_cellArray->Reset();
460 for (
const auto& t : *m_indices)
462 for (
size_t i = 0; i < 3; i++)
466 m_cellArray->InsertNextCell(3, cell);
468 m_cellArray->Modified();
472 VTKSurfaceMeshRenderDelegate::setVertexScalarBuffer(std::shared_ptr<AbstractDataArray> scalars)
475 if (m_vertexScalars != scalars)
478 if (m_vertexScalars !=
nullptr)
482 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
483 &AbstractDataArray::modified);
486 m_vertexScalars = scalars;
487 queueConnect<Event>(m_vertexScalars, &AbstractDataArray::modified,
489 &VTKSurfaceMeshRenderDelegate::vertexScalarsModified);
491 m_polydata->GetPointData()->SetScalars(m_mappedVertexScalarArray);
493 m_mappedVertexScalarArray->SetNumberOfComponents(m_vertexScalars->getNumberOfComponents());
494 m_mappedVertexScalarArray->SetVoidArray(m_vertexScalars->getVoidPointer(),
495 static_cast<vtkIdType
>(m_vertexScalars->size()), 1);
496 m_mappedVertexScalarArray->Modified();
500 VTKSurfaceMeshRenderDelegate::setCellScalarBuffer(std::shared_ptr<AbstractDataArray> scalars)
503 if (m_cellScalars != scalars)
506 if (m_cellScalars !=
nullptr)
510 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
511 &AbstractDataArray::modified);
514 m_cellScalars = scalars;
515 queueConnect<Event>(m_cellScalars, &AbstractDataArray::modified,
517 &VTKSurfaceMeshRenderDelegate::cellScalarsModified);
519 m_polydata->GetCellData()->SetScalars(m_mappedCellScalarArray);
521 m_mappedCellScalarArray->SetNumberOfComponents(m_cellScalars->getNumberOfComponents());
522 m_mappedCellScalarArray->SetVoidArray(m_cellScalars->getVoidPointer(),
523 static_cast<vtkIdType
>(m_cellScalars->size()), 1);
524 m_mappedCellScalarArray->Modified();
528 VTKSurfaceMeshRenderDelegate::setTextureCoordinateBuffer(std::shared_ptr<AbstractDataArray> textureCoordinates)
531 if (m_textureCoordinates != textureCoordinates)
534 if (m_textureCoordinates !=
nullptr)
538 std::static_pointer_cast<VTKSurfaceMeshRenderDelegate>(shared_from_this()),
539 &AbstractDataArray::modified);
542 m_textureCoordinates = textureCoordinates;
543 queueConnect<Event>(m_textureCoordinates, &AbstractDataArray::modified,
545 &VTKSurfaceMeshRenderDelegate::textureCoordinatesModified);
547 m_mappedTCoordsArray->SetName(m_geometry->getActiveVertexTCoords().c_str());
548 m_polydata->GetPointData()->SetTCoords(m_mappedTCoordsArray);
551 m_mappedTCoordsArray->SetNumberOfComponents(m_textureCoordinates->getNumberOfComponents());
552 m_mappedTCoordsArray->SetVoidArray(m_textureCoordinates->getVoidPointer(),
static_cast<vtkIdType
>(m_textureCoordinates->size()), 1);
553 m_mappedTCoordsArray->Modified();
556 if (m_geometry->getVertexTangents() ==
nullptr)
558 m_geometry->computeVertexTangents();
562 m_polydata->GetPointData()->SetTangents(m_mappedTangentArray);
563 m_mappedTangentArray->Modified();
570 if (material ==
nullptr)
575 unsigned int currentUnit = 0;
578 vtkSmartPointer<vtkActor> actor = vtkActor::SafeDownCast(m_actor);
579 actor->GetProperty()->RemoveAllTextures();
580 for (
int unit = 0; unit < (int)Texture::Type::None; unit++)
585 if (texture->getImageData() ==
nullptr && texture->getPath() ==
"")
591 std::shared_ptr<TextureManager<VTKTextureDelegate>> textureManager = m_textureManager.lock();
592 auto textureDelegate = textureManager->getTextureDelegate(texture);
610 vtkSmartPointer<vtkTexture> currentTexture = textureDelegate->getVtkTexture();
613 switch (texture->getType())
615 case Texture::Type::Diffuse:
617 actor->GetProperty()->SetBaseColorTexture(currentTexture);
620 case Texture::Type::Normal:
622 actor->GetProperty()->SetNormalTexture(currentTexture);
625 case Texture::Type::AmbientOcclusion:
626 case Texture::Type::ORM:
628 actor->GetProperty()->SetORMTexture(currentTexture);
631 case Texture::Type::Anistropy:
633 actor->GetProperty()->SetAnisotropyTexture(currentTexture);
636 case Texture::Type::CoatNormal:
638 actor->GetProperty()->SetCoatNormalTexture(currentTexture);
646 else if (texture->getType() == Texture::Type::Diffuse)
648 actor->SetTexture(currentTexture);
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)) ...
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
Type
Texture type - determines filtering.
void geometryModified(Event *e)
Callback for when geometry is modified.
void updateRenderProperties() override
Updates the actor and mapper properties from the currently set VisualModel.
void initializeTextures()
Initialize textures.
Delegates rendering of SurfaceMesh to VTK from VisualModel.
void vertexDataModified(Event *e)
Callback for when vertex values are modified.
Serves no function, just a database for render properties, emits events for others to observe its cha...
void texturesModified(Event *e)
Callback for when RenderMaterial textures are modified.
Physically based rendering.
void processEvents() override
Event handler.
Stores everything needed to invoke an event A call may not be present, in which case invoke doesn't d...