7 #include "imstkVTKOpenVRViewer.h" 8 #include "imstkCamera.h" 9 #include "imstkDeviceControl.h" 10 #include "imstkLogger.h" 11 #include "imstkOpenVRDeviceClient.h" 12 #include "imstkScene.h" 13 #include "imstkVTKInteractorStyleVR.h" 14 #include "imstkVTKRenderer.h" 16 #include "imstkVtkOpenVRRenderWindowInteractorImstk.h" 19 #include <vtkMatrix4x4.h> 20 #include <vtkOpenVRModel.h> 21 #include <vtkOpenVRRenderer.h> 22 #include <vtkOpenVRRenderWindow.h> 26 VTKOpenVRViewer::VTKOpenVRViewer(std::string name) : AbstractVTKViewer(name)
29 auto vrInteractorStyle = vtkSmartPointer<vtkInteractorStyleVR>::New();
30 m_vtkInteractorStyle = vrInteractorStyle;
33 auto iren = vtkSmartPointer<vtkOpenVRRenderWindowInteractorImstk>::New();
34 iren->SetInteractorStyle(m_vtkInteractorStyle);
37 m_vtkRenderWindow = vtkSmartPointer<vtkOpenVRRenderWindow>::New();
38 m_vtkRenderWindow->SetInteractor(iren);
39 iren->SetRenderWindow(m_vtkRenderWindow);
40 m_vtkRenderWindow->HideCursor();
42 m_vrDeviceClients.push_back(vrInteractorStyle->getLeftControllerDeviceClient());
43 m_vrDeviceClients.push_back(vrInteractorStyle->getRightControllerDeviceClient());
44 m_vrDeviceClients.push_back(vrInteractorStyle->getHmdDeviceClient());
48 VTKOpenVRViewer::setActiveScene(std::shared_ptr<Scene> scene)
51 if (scene == m_activeScene)
53 LOG(WARNING) << scene->getName() <<
" already is the viewer current scene.";
60 auto vtkRenderer = std::dynamic_pointer_cast<
VTKRenderer>(this->getActiveRenderer())->getVtkRenderer();
61 if (m_vtkRenderWindow->HasRenderer(vtkRenderer))
63 m_vtkRenderWindow->RemoveRenderer(vtkRenderer);
68 m_activeScene = scene;
71 if (!m_rendererMap.count(m_activeScene))
73 m_rendererMap[m_activeScene] = std::make_shared<VTKRenderer>(m_activeScene,
true);
77 m_rendererMap[m_activeScene]->initialize();
82 auto vtkRenderer = std::dynamic_pointer_cast<
VTKRenderer>(this->getActiveRenderer())->getVtkRenderer();
85 m_vtkRenderWindow->AddRenderer(vtkRenderer);
86 m_vtkInteractorStyle->SetCurrentRenderer(vtkRenderer);
90 VTKOpenVRViewer::setPhysicalToWorldTransform(
const Mat4d& physicalToWorldMatrix)
92 vtkSmartPointer<vtkOpenVRRenderWindow> renWin =
93 vtkOpenVRRenderWindow::SafeDownCast(m_vtkRenderWindow);
94 vtkNew<vtkMatrix4x4> mat;
95 for (
int i = 0; i < 4; i++)
97 for (
int j = 0; j < 4; j++)
99 mat->SetElement(i, j, physicalToWorldMatrix(i, j));
102 renWin->SetPhysicalToWorldMatrix(mat);
106 VTKOpenVRViewer::getPhysicalToWorldTransform()
108 vtkSmartPointer<vtkOpenVRRenderWindow> renWin =
109 vtkOpenVRRenderWindow::SafeDownCast(m_vtkRenderWindow);
111 vtkNew<vtkMatrix4x4> mat;
112 renWin->GetPhysicalToWorldMatrix(mat);
113 for (
int i = 0; i < 4; i++)
115 for (
int j = 0; j < 4; j++)
117 transform(i, j) = mat->GetElement(i, j);
128 LOG(WARNING) <<
"Missing scene, can not set rendering mode.\n" 129 <<
"Use Viewer::setCurrentScene to setup scene.";
134 this->getActiveRenderer()->setMode(mode,
true);
136 if (mode == Renderer::Mode::Debug)
138 if (!m_activeScene->hasEntity(m_debugEntity))
140 m_activeScene->addSceneObject(m_debugEntity);
143 else if (mode == Renderer::Mode::Simulation)
145 if (m_activeScene->hasEntity(m_debugEntity))
147 m_activeScene->removeSceneObject(m_debugEntity);
155 VTKOpenVRViewer::processEvents()
158 auto iren = vtkOpenVRRenderWindowInteractorImstk::SafeDownCast(m_vtkRenderWindow->GetInteractor());
160 iren->DoOneEvent(vtkOpenVRRenderWindow::SafeDownCast(m_vtkRenderWindow), ren->getVtkRenderer(),
false);
164 VTKOpenVRViewer::initModule()
166 if (!AbstractVTKViewer::initModule())
171 std::shared_ptr<VTKRenderer> ren = getActiveVtkRenderer();
176 auto iren = vtkOpenVRRenderWindowInteractorImstk::SafeDownCast(m_vtkRenderWindow->GetInteractor());
178 if (iren->HasObserver(vtkCommand::StartEvent))
180 iren->InvokeEvent(vtkCommand::StartEvent,
nullptr);
184 auto renWin = vtkOpenVRRenderWindow::SafeDownCast(m_vtkRenderWindow);
185 renWin->Initialize();
199 for (uint32_t i = 0; i < vr::k_unMaxTrackedDeviceCount; i++)
201 vtkVRModel* trackedDeviceModel = renWin->GetTrackedDeviceModel(i);
202 if (trackedDeviceModel !=
nullptr)
204 trackedDeviceModel->SetVisibility(
false);
212 VTKOpenVRViewer::updateModule()
227 std::shared_ptr<Camera> cam = getActiveScene()->getActiveCamera();
228 const Mat4d& view = cam->getView();
229 setPhysicalToWorldTransform(view);
235 getActiveScene()->updateVisuals(getDt());
237 ren->updateRenderDelegates();
243 m_vtkRenderWindow->Render();
246 std::shared_ptr<OpenVRDeviceClient>
247 VTKOpenVRViewer::getVRDeviceClient(
int deviceType)
249 auto iter = std::find_if(m_vrDeviceClients.begin(), m_vrDeviceClients.end(),
250 [&](
const std::shared_ptr<OpenVRDeviceClient>& deviceClient)
252 return static_cast<int>(deviceClient->getDeviceType()) == deviceType;
254 return (iter == m_vrDeviceClients.end()) ?
nullptr : *iter;
void addButtonActions()
Adds button actions.
Mode
Enumerations for the render mode.
VTK Interactor style for VR.
void addMovementActions()
Adds thumbstick movement actions.