iMSTK
Interactive Medical Simulation Toolkit
imstkVTKCapsuleRenderDelegate.cpp
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #include "imstkVTKCapsuleRenderDelegate.h"
8 #include "imstkCapsule.h"
9 #include "imstkVisualModel.h"
10 
11 #include <vtkActor.h>
12 #include <vtkCapsuleSource.h>
13 #include <vtkPolyDataMapper.h>
14 #include <vtkTransform.h>
15 
16 namespace imstk
17 {
18 VTKCapsuleRenderDelegate::VTKCapsuleRenderDelegate() :
19  m_capsuleSource(vtkSmartPointer<vtkCapsuleSource>::New())
20 {
21 }
22 
23 void
24 VTKCapsuleRenderDelegate::init()
25 {
26  auto geometry = std::dynamic_pointer_cast<Capsule>(m_visualModel->getGeometry());
27  CHECK(geometry != nullptr) << "VTKCapsuleRenderDelegate only works with Capsule geometry";
28 
29  m_capsuleSource->SetCenter(0.0, 0.0, 0.0);
30  m_capsuleSource->SetRadius(geometry->getRadius(Geometry::DataType::PreTransform));
31  m_capsuleSource->SetCylinderLength(geometry->getLength(Geometry::DataType::PreTransform));
32  m_capsuleSource->SetLatLongTessellation(20);
33  m_capsuleSource->SetPhiResolution(20);
34  m_capsuleSource->SetThetaResolution(20);
35 
36  const Mat4d& transform = geometry->getTransform().transpose();
37  m_transform->SetMatrix(transform.data());
38 
39  // Setup mapper
40  {
41  vtkNew<vtkPolyDataMapper> mapper;
42  mapper->SetInputConnection(m_capsuleSource->GetOutputPort());
43  vtkNew<vtkActor> actor;
44  actor->SetMapper(mapper);
45  actor->SetUserTransform(m_transform);
46  m_mapper = mapper;
47  m_actor = actor;
48  }
49 
50  update();
52 }
53 
54 void
56 {
58 
59  // Don't use events for primitives, just always update
60  auto geometry = std::dynamic_pointer_cast<Capsule>(m_visualModel->getGeometry());
61 
62  m_capsuleSource->SetRadius(geometry->getRadius(Geometry::DataType::PreTransform));
63  m_capsuleSource->SetCylinderLength(geometry->getLength(Geometry::DataType::PreTransform));
64  m_capsuleSource->Modified();
65 
66  AffineTransform3d T = AffineTransform3d::Identity();
67  T.translate(geometry->getPosition(Geometry::DataType::PostTransform));
68  T.rotate(geometry->getOrientation(Geometry::DataType::PostTransform));
69  T.scale(geometry->getScaling());
70  T.matrix().transposeInPlace();
71  m_transform->SetMatrix(T.data());
72 }
73 } // namespace imstk
void processEvents() override
Update capsule source based on the capsule geometry.
void update()
Update render delegate.
std::shared_ptr< VisualModel > m_visualModel
imstk visual model (contains data (geometry) and render specification (render material)) ...
Compound Geometry.
void updateRenderProperties() override
Updates the actor and mapper properties from the currently set VisualModel.
virtual void processEvents()
Process the event queue, default implementation processes visualModel events and its RenderMaterial e...
Capsule geometry, default configuration is centered at origin with length running up and down the y a...
Definition: imstkCapsule.h:21