diff --git a/Examples/LaparoscopicCamera/CustomKeyPressEvent.cpp b/Examples/LaparoscopicCamera/CustomKeyPressEvent.cpp new file mode 100644 index 0000000000000000000000000000000000000000..315950ee23f9674b3ab5f65239c675fce362232c --- /dev/null +++ b/Examples/LaparoscopicCamera/CustomKeyPressEvent.cpp @@ -0,0 +1,7 @@ +// VTK includes +#include "VTKRendering/initVTKRendering.h" +#include "VTKRendering/VTKViewer.h" +#include "vtkWindowToImageFilter.h" +#include "vtkPNGWriter.h" +#include "vtkAxis.h" +#include "vtkNew.h" diff --git a/Examples/LaparoscopicCamera/main.cpp b/Examples/LaparoscopicCamera/main.cpp index 84bb3046209d2e16f7426a194541a8963a03a836..5da4ace3a69fe50304c192d045651a6a7f9667ce 100644 --- a/Examples/LaparoscopicCamera/main.cpp +++ b/Examples/LaparoscopicCamera/main.cpp @@ -8,7 +8,7 @@ #include <string> #include <cmath> -// Core SimMedTK includes +// Core iMSTK includes #include "Core/SDK.h" #include "Core/StaticSceneObject.h" #include "Devices/VRPNForceDevice.h" @@ -19,23 +19,111 @@ #include "Collision/PlaneCollisionModel.h" #include "Collision/MeshCollisionModel.h" #include "IO/initIO.h" - -// VTK includes #include "VTKRendering/initVTKRendering.h" #include "VTKRendering/VTKViewer.h" -#include "vtkWindowToImageFilter.h" -#include "vtkPNGWriter.h" -#include "vtkChartXY.h" -#include "vtkContextScene.h" -#include "vtkContextActor.h" -#include "vtkFloatArray.h" -#include "vtkPlotPoints.h" -#include "vtkTable.h" -#include "vtkAxis.h" -#include "vtkNew.h" + +// VTK includes +#include <vtkWindowToImageFilter.h> +#include <vtkPNGWriter.h> +#include <vtkChartXY.h> +#include <vtkContextScene.h> +#include <vtkContextActor.h> +#include <vtkFloatArray.h> +#include <vtkPlotPoints.h> +#include <vtkTable.h> +#include <vtkAxis.h> +#include <vtkNew.h> +#include <vtkSmartPointer.h> +#include <vtkInteractorStyleTrackballCamera.h> +#include <vtkRenderWindowInteractor.h> +#include <vtkRenderWindow.h> +#include <vtkObjectFactory.h> #define SPACE_EXPLORER_DEVICE true + +// Define custom interaction style +class ScreenCaptureKeyPressEvent : public vtkInteractorStyleTrackballCamera +{ +public: + struct screenShotData + { + vtkNew<vtkWindowToImageFilter> windowToImageFilter; + vtkNew<vtkPNGWriter> pngWriter; + bool triggerScreenCapture; + int screenShotNumber; + + screenShotData() : triggerScreenCapture(false), screenShotNumber(0) + { + windowToImageFilter->SetMagnification(1); + + windowToImageFilter->SetInputBufferTypeToRGB(); + + windowToImageFilter->ReadFrontBufferOff(); + + windowToImageFilter->Update(); + + pngWriter->SetInputConnection(windowToImageFilter->GetOutputPort()); + }; + + ~screenShotData(){}; + }; + + static ScreenCaptureKeyPressEvent* New(); + vtkTypeMacro(ScreenCaptureKeyPressEvent, vtkInteractorStyleTrackballCamera); + + virtual void OnKeyPress() + { + // Get the key press + vtkRenderWindowInteractor *rwi = this->Interactor; + std::string key = rwi->GetKeySym(); + + // Capture the screen + if (key == " ");// || key == "S") + { + this->screenCaptureData->triggerScreenCapture = true; + + if (this->screenCaptureData != nullptr) + { + if (this->screenCaptureData->triggerScreenCapture) + { + this->screenCaptureData->windowToImageFilter->Modified(); + + std::string captureName = "screenShot-" + + std::to_string(this->screenCaptureData->screenShotNumber) + + ".png"; + + this->screenCaptureData->pngWriter->SetFileName( + captureName.data()); + + this->screenCaptureData->pngWriter->Write(); + + std::cout << + "Screen shot "<< + this->screenCaptureData->screenShotNumber <<" saved.\n"; + + this->screenCaptureData->screenShotNumber++; + this->screenCaptureData->triggerScreenCapture = false; + } + } + } + + // Forward events + vtkInteractorStyleTrackballCamera::OnKeyPress(); + } + + void initialize(vtkWindow* rw) + { + this->screenCaptureData = std::make_shared<screenShotData>(); + this->screenCaptureData->windowToImageFilter->SetInput(rw); + }; + +private: + + std::shared_ptr<screenShotData> screenCaptureData; +}; +vtkStandardNewMacro(ScreenCaptureKeyPressEvent); + /// /// \brief Create camera navigation scene /// @@ -413,15 +501,19 @@ int main(int ac, char** av) //------------------------------------------------------- - // Add a camera controller - std::shared_ptr<LaparoscopicCameraController> camController = - addCameraController(sdk); + std::shared_ptr<VTKViewer> vtkViewer = std::static_pointer_cast<VTKViewer>(viewer); // Enable screenshot capture - camController->enableScreenCapture(); + auto style = vtkSmartPointer<ScreenCaptureKeyPressEvent>::New(); + style->initialize(vtkViewer->getRenderWindow()); + vtkViewer->getVtkRenderWindowInteractor()->SetInteractorStyle(style); + style->SetCurrentRenderer(vtkViewer->getVtkRenderer()); - std::shared_ptr<VTKViewer> vtkViewer = std::static_pointer_cast<VTKViewer>(viewer); - vtkViewer->setScreenCaptureData(camController->getScreenCaptureData()); + // Add a camera controller + // NOTE: This has to come after the ScreenCaptureKeyPressEvent initialization + // since for this to work the mouse events need disabled which are + // left as is after ScreenCaptureKeyPressEvent initialization + std::shared_ptr<LaparoscopicCameraController> camController = addCameraController(sdk); // Add a 2D overlay on the 3D scene add2DOverlay(vtkViewer); diff --git a/VTKRendering/VTKViewer.cpp b/VTKRendering/VTKViewer.cpp index 419dbb300e5e7bd5246b186d2037891bba51f03a..eded10a2fa209b7731710a4938cb7c78e8798fe1 100644 --- a/VTKRendering/VTKViewer.cpp +++ b/VTKRendering/VTKViewer.cpp @@ -41,6 +41,7 @@ #include <vtkAxesActor.h> #include <vtkOrientationMarkerWidget.h> + /// /// \brief Wrapper to the vtkRendering pipeline /// @@ -74,25 +75,6 @@ public: updateCamera(); } - if (this->screenCaptureData != nullptr) - { - if (this->screenCaptureData->triggerScreenCapture) - { - this->screenCaptureData->windowToImageFilter->Modified(); - - std::string captureName = "screenShot-" - + std::to_string(this->screenCaptureData->screenShotNumber) - + ".png"; - - this->screenCaptureData->pngWriter->SetFileName( - captureName.data()); - - this->screenCaptureData->pngWriter->Write(); - - this->screenCaptureData->screenShotNumber++; - this->screenCaptureData->triggerScreenCapture = false; - } - } this->renderWindow->Render(); } break; @@ -340,7 +322,6 @@ public: vtkNew<vtkRenderWindow> renderWindow; vtkNew<vtkRenderWindowInteractor> renderWindowInteractor; std::shared_ptr<cameraConfigurationData> cameraControllerData; - std::shared_ptr<screenShotData> screenCaptureData; }; VTKViewer::VTKViewer() : renderer(Core::make_unique<VTKRenderer> (this)) @@ -371,6 +352,11 @@ void VTKViewer::render() this->endModule(); } +vtkRenderWindow* VTKViewer::getRenderWindow() const +{ + return this->renderer->getRenderWindow(); +} + vtkCamera* VTKViewer::getVtkCamera() { return this->renderer->getRenderWindow()->GetRenderers()-> @@ -382,14 +368,14 @@ void VTKViewer::setCameraControllerData(std::shared_ptr<cameraConfigurationData> renderer->cameraControllerData = camData; } -void VTKViewer::setScreenCaptureData(std::shared_ptr<screenShotData> data) +vtkRenderer* VTKViewer::getVtkRenderer() { - renderer->screenCaptureData = data; - - this->renderer->getRenderWindow()->SetAlphaBitPlanes(1); + return this->renderer->getRenderWindow()->GetRenderers()->GetFirstRenderer(); +} - renderer->screenCaptureData->windowToImageFilter->SetInput( - this->renderer->getRenderWindow()); +vtkRenderWindowInteractor* VTKViewer::getVtkRenderWindowInteractor() +{ + return this->renderer->renderWindowInteractor.GetPointer(); } void VTKViewer::addChartActor(vtkContextActor* chartActor, vtkContextScene* chartScene) diff --git a/VTKRendering/VTKViewer.h b/VTKRendering/VTKViewer.h index a81a75afd47519014da465cb3ce38758ccae86c2..d124f8da1ddf4431ac009c451c4ce0f4cf99689d 100644 --- a/VTKRendering/VTKViewer.h +++ b/VTKRendering/VTKViewer.h @@ -24,12 +24,17 @@ #ifndef VTKVIEWER_H #define VTKVIEWER_H + #include "Core/ViewerBase.h" #include "VirtualTools/LaparoscopicCameraController.h" #include "vtkContextActor.h" #include "vtkContextScene.h" +#include "vtkInteractorStyleTrackballCamera.h" +#include "vtkRenderWindowInteractor.h" class vtkCamera; +class vtkRenderWindowInteractor; +class vtkRenderer; class VTKViewer : public ViewerBase { @@ -93,15 +98,22 @@ public: void setCameraControllerData(std::shared_ptr<cameraConfigurationData> camData); /// - /// \brief Set the data related to screen capture + /// \brief + /// + vtkRenderer* getVtkRenderer(); + + /// + /// \brief /// - void setScreenCaptureData(std::shared_ptr<screenShotData> data); + vtkRenderWindowInteractor* getVtkRenderWindowInteractor(); /// /// \brief Add chart actor to the renderer /// void addChartActor(vtkContextActor* chartActor, vtkContextScene* chartScene); + vtkRenderWindow* getRenderWindow() const; + protected: /// /// \brief Renders the render operation to screen @@ -156,7 +168,6 @@ protected: /// \brief Render scene /// void render() override; - private: class VTKRenderer; std::unique_ptr<VTKRenderer> renderer; diff --git a/VirtualTools/LaparoscopicCameraController.cpp b/VirtualTools/LaparoscopicCameraController.cpp index a17f1d075138f71ccdd921e77ac513ae494de5cd..80a4142fd7c9694c649e1a88684955625c53576f 100644 --- a/VirtualTools/LaparoscopicCameraController.cpp +++ b/VirtualTools/LaparoscopicCameraController.cpp @@ -156,11 +156,6 @@ void LaparoscopicCameraController::exec() this->terminate(); } - if (this->inputDevice->getButton(1)) - { - this->screenCaptureData->triggerScreenCapture = true; - } - std::this_thread::sleep_for(poolDelay); } this->inputDevice->closeDevice(); @@ -176,22 +171,22 @@ bool LaparoscopicCameraController::updateCamera() return false; } - if (this->inputDevice->getButton(0) && angleY < maxAngleY) + if (this->inputDevice->getButton(3) && angleY < maxAngleY) { angleY += deltaAngleXY; } - if (this->inputDevice->getButton(1) && angleY > minAngleY) + if (this->inputDevice->getButton(4) && angleY > minAngleY) { angleY -= deltaAngleXY; } - if (this->inputDevice->getButton(3) && angleX < maxAngleX) + if (this->inputDevice->getButton(0) && angleX < maxAngleX) { angleX += deltaAngleXY; } - if (this->inputDevice->getButton(4) && angleX > minAngleX) + if (this->inputDevice->getButton(1) && angleX > minAngleX) { angleX -= deltaAngleXY; } @@ -250,14 +245,4 @@ double LaparoscopicCameraController::getBendingRadius() const void LaparoscopicCameraController::setBendingRadius(const double val) { bendingRadius = val; -} - -std::shared_ptr<screenShotData> LaparoscopicCameraController::getScreenCaptureData() -{ - return screenCaptureData; -} - -void LaparoscopicCameraController::enableScreenCapture() -{ - this->screenCaptureData = std::make_shared<screenShotData>(); } \ No newline at end of file diff --git a/VirtualTools/LaparoscopicCameraController.h b/VirtualTools/LaparoscopicCameraController.h index 9ba2560403d3bfa7f066b118d592de31b41920bb..f0e25e0766f2d631fcfe9659de906831a42ba0f6 100644 --- a/VirtualTools/LaparoscopicCameraController.h +++ b/VirtualTools/LaparoscopicCameraController.h @@ -51,29 +51,6 @@ struct cameraConfigurationData ~cameraConfigurationData(){}; }; -struct screenShotData -{ - vtkNew<vtkWindowToImageFilter> windowToImageFilter; - vtkNew<vtkPNGWriter> pngWriter; - bool triggerScreenCapture; - int screenShotNumber; - - screenShotData() : triggerScreenCapture(false), screenShotNumber(0) - { - windowToImageFilter->SetMagnification(1); - - windowToImageFilter->SetInputBufferTypeToRGB(); - - windowToImageFilter->ReadFrontBufferOff(); - - windowToImageFilter->Update(); - - pngWriter->SetInputConnection(windowToImageFilter->GetOutputPort()); - }; - - ~screenShotData(){}; -}; - /// /// \class LaparoscopicCameraController /// @@ -218,16 +195,6 @@ public: double getBendingRadius() const; void setBendingRadius(const double val); - /// - /// \brief Get the screen capture related data - /// - std::shared_ptr<screenShotData> getScreenCaptureData(); - - /// - /// \brief Initializes screen capture capability - /// - void enableScreenCapture(); - /// /// \brief Module overrides /// @@ -271,10 +238,6 @@ private: double deltaAngleXY; std::shared_ptr<cameraConfigurationData> cameraPosOrientData;//!< camera config data - - std::shared_ptr<screenShotData> screenCaptureData; - - std::shared_ptr<vtkWindowToImageFilter> windowToImageFilter; }; #endif // iSMTK_LAPAROSCOPIC_CAMERA_COUPLER_H