iMSTK
Interactive Medical Simulation Toolkit
imstkVTKOrientedBoxRenderDelegate.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 "imstkVTKOrientedBoxRenderDelegate.h"
8 #include "imstkOrientedBox.h"
9 #include "imstkVisualModel.h"
10 
11 #include <vtkActor.h>
12 #include <vtkCubeSource.h>
13 #include <vtkPolyDataMapper.h>
14 #include <vtkTransform.h>
15 
16 namespace imstk
17 {
18 VTKOrientedCubeRenderDelegate::VTKOrientedCubeRenderDelegate() :
19  m_cubeSource(vtkSmartPointer<vtkCubeSource>::New())
20 {
21 }
22 
23 void
24 VTKOrientedCubeRenderDelegate::init()
25 {
26  auto geometry = std::dynamic_pointer_cast<OrientedBox>(m_visualModel->getGeometry());
27  CHECK(geometry != nullptr) << "VTKOrientedCubeRenderDelegate only works with OrientedBox geometry";
28 
29  const Vec3d& extents = geometry->getExtents(Geometry::DataType::PreTransform);
30  m_cubeSource->SetCenter(0.0, 0.0, 0.0);
31  m_cubeSource->SetXLength(extents[0] * 2.0);
32  m_cubeSource->SetYLength(extents[1] * 2.0);
33  m_cubeSource->SetZLength(extents[2] * 2.0);
34 
35  const Mat4d& transform = geometry->getTransform().transpose();
36  m_transform->SetMatrix(transform.data());
37 
38  // Setup mapper
39  {
40  vtkNew<vtkPolyDataMapper> mapper;
41  mapper->SetInputConnection(m_cubeSource->GetOutputPort());
42  vtkNew<vtkActor> actor;
43  actor->SetMapper(mapper);
44  actor->SetUserTransform(m_transform);
45  m_mapper = mapper;
46  m_actor = actor;
47  }
48 
49  update();
51 }
52 
53 void
55 {
57 
58  // Events aren't used for primitives, always update
59  auto geometry = std::dynamic_pointer_cast<OrientedBox>(m_visualModel->getGeometry());
60 
61  const Vec3d& extents = geometry->getExtents(Geometry::DataType::PreTransform);
62  m_cubeSource->SetXLength(extents[0] * 2.0);
63  m_cubeSource->SetYLength(extents[1] * 2.0);
64  m_cubeSource->SetZLength(extents[2] * 2.0);
65  m_cubeSource->Modified();
66 
67  AffineTransform3d T = AffineTransform3d::Identity();
68  T.translate(geometry->getPosition(Geometry::DataType::PostTransform));
69  T.rotate(geometry->getOrientation(Geometry::DataType::PostTransform));
70  T.scale(geometry->getScaling());
71  T.matrix().transposeInPlace();
72  m_transform->SetMatrix(T.data());
73 }
74 } // namespace imstk
OrientedBox geometry, specified with extents (half lengths)
void update()
Update render delegate.
std::shared_ptr< VisualModel > m_visualModel
imstk visual model (contains data (geometry) and render specification (render material)) ...
void processEvents() override
Update cube source based on the cube geometry.
Compound Geometry.
Vec3d getExtents(DataType type=DataType::PostTransform)
Returns the extents of the cube.
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...