iMSTK
Interactive Medical Simulation Toolkit
imstkVTKRenderDelegate.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 "imstkVTKRenderDelegate.h"
8 #include "imstkLogger.h"
9 #include "imstkPointSet.h"
10 #include "imstkRenderDelegateObjectFactory.h"
11 #include "imstkVisualModel.h"
12 #include "imstkVolumeRenderMaterial.h"
13 
14 #include <vtkAbstractMapper.h>
15 #include <vtkActor.h>
16 #include <vtkImageReader2.h>
17 #include <vtkImageReader2Factory.h>
18 #include <vtkTexture.h>
19 #include <vtkTransform.h>
20 
21 namespace imstk
22 {
23 VTKRenderDelegate::VTKRenderDelegate() :
24  m_transform(vtkSmartPointer<vtkTransform>::New()),
25  m_actor(nullptr),
26  m_mapper(nullptr),
27  m_visualModel(nullptr),
28  m_material(nullptr)
29 {
30 }
31 
32 void
33 VTKRenderDelegate::initialize(std::shared_ptr<VisualModel> model)
34 {
35  CHECK(model != nullptr)
36  << "VTKRenderDelegate was given null VisualModel";
37  m_visualModel = model;
38  CHECK(m_visualModel->getRenderMaterial() != nullptr)
39  << "VTKRenderDelegate was given a VisualModel " << m_visualModel->getName()
40  << " which does not have a material";
41  m_material = m_visualModel->getRenderMaterial();
42 
43  // When render material is modified call materialModified -> updateRenderProperties()
44  queueConnect<Event>(m_material, &RenderMaterial::modified,
45  shared_from_this(), &VTKRenderDelegate::materialModified);
46 
47  // When the visual model is modified call visualModelModified
48  queueConnect<Event>(m_visualModel, &VisualModel::modified,
49  shared_from_this(), &VTKRenderDelegate::visualModelModified);
50 
51  init();
52 }
53 
54 std::shared_ptr<VTKRenderDelegate>
55 VTKRenderDelegate::makeDelegate(std::shared_ptr<VisualModel> visualModel)
56 {
58 }
59 
60 void
62 {
63  // Then leave it up to subclasses to implement how to process the events
64  processEvents();
65 }
66 
67 void
69 {
70  std::shared_ptr<RenderMaterial> renderMaterial = m_visualModel->getRenderMaterial();
71 
72  // Only use the most recent event from respective sender
73  std::list<Command> cmds;
74  bool contains[2] = { false, false };
75  rforeachEvent([&](Command cmd)
76  {
77  if (cmd.m_event->m_sender == m_visualModel.get() && !contains[0])
78  {
79  cmds.push_back(cmd);
80  contains[0] = true;
81  }
82  else if (cmd.m_event->m_sender == renderMaterial.get() && !contains[1])
83  {
84  cmds.push_back(cmd);
85  contains[1] = true;
86  }
87  });
88  // Now do each event in order recieved
89  for (std::list<Command>::reverse_iterator i = cmds.rbegin(); i != cmds.rend(); i++)
90  {
91  i->invoke();
92  }
93 }
94 
95 void
97 {
98  // Remove all modified's from the old material
99  disconnect(m_material, shared_from_this(), &RenderMaterial::modified);
100 
101  m_material = m_visualModel->getRenderMaterial(); // Update handle
102 
103  // Recieve events from new material
104  queueConnect<Event>(m_material, &RenderMaterial::modified,
105  shared_from_this(), &VTKRenderDelegate::materialModified);
106 
107  // Update our render properties
109 }
110 
111 vtkSmartPointer<vtkTexture>
112 VTKRenderDelegate::getVTKTexture(std::shared_ptr<Texture> texture)
113 {
114  vtkNew<vtkImageReader2Factory> readerFactory;
115  std::string fileName = texture->getPath();
116  auto imageReader = readerFactory->CreateImageReader2(fileName.c_str());
117 
118  //imageReader.TakeReference(readerFactory->CreateImageReader2(fileName.c_str()));
119  imageReader->SetFileName(fileName.c_str());
120  imageReader->Update();
121 
122  // Create texture
123  vtkNew<vtkTexture> vtktexture;
124  //vtktexture->UseSRGBColorSpaceOn();
125  vtktexture->SetInputConnection(imageReader->GetOutputPort());
126 
127  return vtktexture;
128 }
129 } // namespace imstk
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.
void initialize(std::shared_ptr< VisualModel > model)
Setup the VTKRenderDelegate with given model.
friend void disconnect(std::shared_ptr< EventObject >, std::shared_ptr< EventObject >, std::string(*)())
Remove an observer from the sender.
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...
Compound Geometry.
void visualModelModified(Event *e)
Callback for visual model modifications.
static std::shared_ptr< VTKRenderDelegate > makeDelegate(std::shared_ptr< VisualModel > visualModel)
Instantiate proper render delegate.
void updateRenderProperties() override
Updates the actor and mapper properties from the currently set VisualModel.
void materialModified(Event *imstkNotUsed(e))
Callback for updating render properties.
virtual void processEvents()
Process the event queue, default implementation processes visualModel events and its RenderMaterial e...
static std::shared_ptr< VTKRenderDelegate > makeRenderDelegate(std::shared_ptr< VisualModel > visualModel)
attempt to create a delegate for the given visual model
Stores everything needed to invoke an event A call may not be present, in which case invoke doesn&#39;t d...