iMSTK
Interactive Medical Simulation Toolkit
imstkVTKAxesRenderDelegate.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 "imstkVTKAxesRenderDelegate.h"
8 #include "imstkAxesModel.h"
9 #include "imstkLogger.h"
10 
11 #include <vtkAbstractMapper.h>
12 #include <vtkAxesActor.h>
13 #include <vtkTransform.h>
14 
15 namespace imstk
16 {
17 VTKAxesRenderDelegate::VTKAxesRenderDelegate() :
18  m_axesActor(nullptr)
19 {
20 }
21 
22 void
23 VTKAxesRenderDelegate::init()
24 {
25  auto model = std::dynamic_pointer_cast<AxesModel>(m_visualModel);
26  CHECK(model != nullptr) << "VTKAxesRenderDelegate only works with AxesModel VisualModel";
27 
28  const Mat4d transform =
29  (mat4dTranslate(model->getPosition()) *
30  mat4dRotation(model->getOrientation())).transpose();
31  m_transform->SetMatrix(transform.data());
32 
33  // Setup mapper
34  {
35  m_axesActor = vtkSmartPointer<vtkAxesActor>::New();
36  m_axesActor->SetShaftType(vtkAxesActor::CYLINDER_SHAFT);
37  m_axesActor->SetAxisLabels(model->getAxesLabelsVisible());
38  const Vec3d& scale = model->getScale();
39  m_axesActor->SetTotalLength(scale[0], scale[1], scale[2]);
40  m_axesActor->SetUserTransform(m_transform);
41  m_mapper = nullptr;
42  m_actor = m_axesActor;
43  }
44 
45  update();
46  updateRenderProperties();
47 }
48 
49 void
51 {
53 
54  auto model = std::dynamic_pointer_cast<AxesModel>(m_visualModel);
55  if (static_cast<bool>(m_axesActor->GetVisibility()) != model->isVisible())
56  {
57  m_axesActor->SetVisibility(model->isVisible());
58  }
59 
60  if (model->isVisible())
61  {
62  if (static_cast<bool>(m_axesActor->GetAxisLabels()) != model->getAxesLabelsVisible())
63  {
64  m_axesActor->SetAxisLabels(model->getAxesLabelsVisible());
65  }
66 
67  const Mat4d transform =
68  (mat4dTranslate(model->getPosition()) *
69  mat4dRotation(model->getOrientation())).transpose();
70  m_transform->SetMatrix(transform.data());
71  const Vec3d& scale = model->getScale();
72  m_axesActor->SetTotalLength(scale[0], scale[1], scale[2]);
73  }
74 }
75 } // namespace imstk
void processEvents() override
Update sphere source based on the sphere geometry.
Compound Geometry.
Defines an axes that should be rendered.
virtual void processEvents()
Process the event queue, default implementation processes visualModel events and its RenderMaterial e...