diff --git a/Examples/LaparoscopicCamera/main.cpp b/Examples/LaparoscopicCamera/main.cpp index ead6d80a16a327b79ee43cd63326f5f994652cf9..c45a079c7eb4af9b6d2f8b0f06cdf7485ae35918 100644 --- a/Examples/LaparoscopicCamera/main.cpp +++ b/Examples/LaparoscopicCamera/main.cpp @@ -52,11 +52,52 @@ #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 "vtkNew.h" +#include "vtkAxis.h" #define SPACE_EXPLORER_DEVICE true +/// +/// \brief Create camera navigation scene +/// bool createCameraNavigationScene(std::shared_ptr<SDK> sdk, char* fileName) { + //------------------------------------------------------- + // Create scene actor 1: plane + //------------------------------------------------------- + auto staticSimulator = std::make_shared<DefaultSimulator>(sdk->getErrorLog()); + + // create a static plane scene object of given normal and position + auto staticObject = std::make_shared<StaticSceneObject>(); + + auto plane = std::make_shared<PlaneCollisionModel>( + core::Vec3d(0.0, -0.01, 0.0), + core::Vec3d(0.0, 1.0, 0.0)); + plane->getPlaneModel()->setWidth(5); + staticObject->setModel(plane); + + auto planeRendDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_FACES); + + Color grey(0.32, 0.32, 0.32, 1.0); + + planeRendDetail->setAmbientColor(grey); + planeRendDetail->setDiffuseColor(grey); + planeRendDetail->setSpecularColor(grey); + planeRendDetail->setShininess(50.0); + + plane->getPlaneModel()->setRenderDetail(planeRendDetail); + + sdk->addSceneActor(staticObject, staticSimulator); + + //------------------------------------------------------- + // Create targets + //------------------------------------------------------- auto meshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS); meshRenderDetail->setAmbientColor(Color(0.2, 0.2, 0.2, 1.0)); @@ -89,82 +130,108 @@ bool createCameraNavigationScene(std::shared_ptr<SDK> sdk, char* fileName) return true; } -int main(int ac, char** av) +/// +/// \brief Add a 2D overlay of target markers on a 3D scene +/// +void add2DOverlay(std::shared_ptr<VTKViewer> vtkViewer) { - initVTKRendering(); - initIODelegates(); - const bool useVTKRenderer = true; + vtkNew<vtkChartXY> chart; + vtkNew<vtkContextScene> chartScene; + vtkNew<vtkContextActor> chartActor; - auto sdk = SDK::createStandardSDK(); + // configure the chart + chart->SetAutoSize(true); + chart->SetSize(vtkRectf(0.0, 0.0, 300, 200)); - //------------------------------------------------------- - // Create scene actor 1: plane - //------------------------------------------------------- - auto staticSimulator = std::make_shared<DefaultSimulator>(sdk->getErrorLog()); + chart->GetAxis(0)->SetGridVisible(false); + chart->GetAxis(1)->SetGridVisible(false); - // create a static plane scene object of given normal and position - auto staticObject = std::make_shared<StaticSceneObject>(); + chart->GetAxis(0)->SetAxisVisible(false); + chart->GetAxis(1)->SetAxisVisible(false); - auto plane = std::make_shared<PlaneCollisionModel>( - core::Vec3d(0.0, -0.01, 0.0), - core::Vec3d(0.0, 1.0, 0.0)); - plane->getPlaneModel()->setWidth(5); - if (ac > 2) - plane->getPlaneModel()->setWidth(atof(av[2])); - staticObject->setModel(plane); + chart->GetAxis(0)->SetTicksVisible(false); + chart->GetAxis(1)->SetTicksVisible(false); - auto planeRendDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_FACES); + chart->GetAxis(0)->SetLabelsVisible(false); + chart->GetAxis(1)->SetLabelsVisible(false); - Color grey(0.32, 0.32, 0.32, 1.0); + chart->GetAxis(0)->SetTitle(""); + chart->GetAxis(1)->SetTitle(""); - planeRendDetail->setAmbientColor(grey); - planeRendDetail->setDiffuseColor(grey); - planeRendDetail->setSpecularColor(grey); - planeRendDetail->setShininess(50.0); + chartScene->AddItem(chart.GetPointer()); + chartActor->SetScene(chartScene.GetPointer()); - plane->getPlaneModel()->setRenderDetail(planeRendDetail); + //Add both to the renderer + vtkViewer->addChartActor(chartActor.GetPointer(), chartScene.GetPointer()); - sdk->addSceneActor(staticObject, staticSimulator); + // Create a table with some points in it... + vtkNew<vtkTable> table; - //------------------------------------------------------- - // Create camera navigation scene - //------------------------------------------------------- + vtkNew<vtkFloatArray> arrX; + arrX->SetName("X Axis"); + table->AddColumn(arrX.GetPointer()); - createCameraNavigationScene(sdk, "./Target.vtk"); + vtkNew<vtkFloatArray> arrC; + arrC->SetName("Cosine"); + table->AddColumn(arrC.GetPointer()); - //------------------------------------------------------- - // Set up the viewer - //------------------------------------------------------- + vtkNew<vtkFloatArray> arrS; + arrS->SetName("Sine"); + table->AddColumn(arrS.GetPointer()); - auto viewer = sdk->getViewerInstance(); + vtkNew<vtkFloatArray> arrT; + arrT->SetName("Tan"); + table->AddColumn(arrT.GetPointer()); - viewer->setViewerRenderDetail( - SIMMEDTK_VIEWERRENDER_GLOBALAXIS - | SIMMEDTK_VIEWERRENDER_FADEBACKGROUND - | SIMMEDTK_DISABLE_MOUSE_INTERACTION - ); + // Test charting with a few more points... + int numPoints = 100; + float range = 10.0; + double xRange[2] = { 0.0, range }; + double yRange[2] = { 0.0, range }; - // Get Scene - auto scene = sdk->getScene(0); - viewer->registerScene(scene, SMRENDERTARGET_SCREEN, "Collision pipeline demo"); + int s; + float radius = range / 6; + float inc = 2*radius / (numPoints - 1); + table->SetNumberOfRows(numPoints); + /*chart->GetAxis(0)->SetRange(xRange); + chart->GetAxis(1)->SetRange(yRange);*/ - // Setup Scene lighting - auto light1 = Light::getDefaultLighting(); - light1->lightPos.setPosition(core::Vec3d(-25.0, 10.0, 10.0)); - scene->addLight(light1); + /*chart->GetAxis(0)->SetUnscaledRange(xRange); + chart->GetAxis(1)->SetUnscaledRange(yRange);*/ - auto light2 = Light::getDefaultLighting(); - light2->lightPos.setPosition(core::Vec3d(25.0, 10.0, 10.0)); - scene->addLight(light2); + for (int i = 0; i < numPoints; ++i) + { + if (sin(i * 44 / (7 * numPoints)) < 0) + s = -1; + else + s = 1; + + table->SetValue(i, 0, range / 2 + i*inc*s); + table->SetValue(i, 1, range / 2 + radius*cos(i * 22.0 / (7 * numPoints))); + table->SetValue(i, 2, range / 2 + radius*sin(i * 22.0 / (7 * numPoints))); + } - auto light3 = Light::getDefaultLighting(); - light3->lightPos.setPosition(core::Vec3d(0.0, 25.0, 0.0)); - scene->addLight(light3); + // Add multiple line plots, setting the colors etc + vtkPlot *points = chart->AddPlot(vtkChart::LINE); + points->SetInputData(table.GetPointer(), 2, 1); + points->SetColor(0, 0, 0, 255); + points->SetWidth(1.0); + + /*vtkPlotPoints::SafeDownCast(points)->SetMarkerStyle(vtkPlotPoints::CROSS); + points = chart->AddPlot(vtkChart::LINE); + points->SetInputData(table.GetPointer(), 0, 2); + points->SetColor(0, 0, 0, 255); + points->SetWidth(1.0);*/ +} + +/// +/// \brief Create a Laparoscopic camera controller and connect +/// it to the vtk viewer +/// +std::shared_ptr<LaparoscopicCameraCoupler> addCameraController(std::shared_ptr<SDK> sdk) +{ + auto viewer = sdk->getViewerInstance(); - //------------------------------------------------------- - // Create a Laparoscopic camera controller and connect - // it to the vtk viewer - //------------------------------------------------------- auto camClient = std::make_shared<VRPNForceDevice>(); std::shared_ptr<VRPNDeviceServer> server; std::string input; @@ -214,13 +281,64 @@ int main(int ac, char** av) sdk->registerModule(server); } - // Enable screenshot - camController->enableScreenCapture(); - vtkViewer->setScreenCaptureData(camController->getScreenCaptureData()); + return camController; +} + +int main(int ac, char** av) +{ + initVTKRendering(); + initIODelegates(); + const bool useVTKRenderer = true; + + auto sdk = SDK::createStandardSDK(); + + // Create camera navigation scene + createCameraNavigationScene(sdk, "./Target.vtk"); //------------------------------------------------------- - // Run the SDK + // Set up the viewer //------------------------------------------------------- + + auto viewer = sdk->getViewerInstance(); + + viewer->setViewerRenderDetail( + SIMMEDTK_VIEWERRENDER_GLOBALAXIS + | SIMMEDTK_VIEWERRENDER_FADEBACKGROUND + | SIMMEDTK_DISABLE_MOUSE_INTERACTION + ); + + // Get Scene + auto scene = sdk->getScene(0); + viewer->registerScene(scene, SMRENDERTARGET_SCREEN, "Collision pipeline demo"); + + // Setup Scene lighting + auto light1 = Light::getDefaultLighting(); + light1->lightPos.setPosition(core::Vec3d(-25.0, 10.0, 10.0)); + scene->addLight(light1); + + auto light2 = Light::getDefaultLighting(); + light2->lightPos.setPosition(core::Vec3d(25.0, 10.0, 10.0)); + scene->addLight(light2); + + auto light3 = Light::getDefaultLighting(); + light3->lightPos.setPosition(core::Vec3d(0.0, 25.0, 0.0)); + scene->addLight(light3); + + //------------------------------------------------------- + + // add a camera controller + std::shared_ptr<LaparoscopicCameraCoupler> camController = addCameraController(sdk); + + // Enable screenshot capture + //camController->enableScreenCapture(); + + std::shared_ptr<VTKViewer> vtkViewer = std::static_pointer_cast<VTKViewer>(viewer); + //vtkViewer->setScreenCaptureData(camController->getScreenCaptureData()); + + // Add a 2D overlay on the 3D scene + add2DOverlay(vtkViewer); + + // Run the SDK sdk->run(); //cleanup diff --git a/VTKRendering/VTKViewer.cpp b/VTKRendering/VTKViewer.cpp index 7fae7d5f370f5153c6139b35e9e7ba48e37e6b02..68e94871b349cbf34a75e0e07b90e5a24408968c 100644 --- a/VTKRendering/VTKViewer.cpp +++ b/VTKRendering/VTKViewer.cpp @@ -73,25 +73,25 @@ public: updateCamera(); } - if (this->screenCaptureData != nullptr) - { - if (this->screenCaptureData->triggerScreenCapture) - { - //this->screenCaptureData->windowToImageFilter->Update(); + //if (this->screenCaptureData != nullptr) + //{ + // if (this->screenCaptureData->triggerScreenCapture) + // { + // //this->screenCaptureData->windowToImageFilter->Update(); - std::string captureName = "screenShot-" - + std::to_string(this->screenCaptureData->screenShotNumber) - + ".png"; + // std::string captureName = "screenShot-" + // + std::to_string(this->screenCaptureData->screenShotNumber) + // + ".png"; - this->screenCaptureData->pngWriter->SetFileName( - captureName.data()); + // this->screenCaptureData->pngWriter->SetFileName( + // captureName.data()); - this->screenCaptureData->pngWriter->Write(); + // this->screenCaptureData->pngWriter->Write(); - this->screenCaptureData->screenShotNumber++; - this->screenCaptureData->triggerScreenCapture = false; - } - } + // this->screenCaptureData->screenShotNumber++; + // this->screenCaptureData->triggerScreenCapture = false; + // } + //} this->renderWindow->Render(); } @@ -340,7 +340,7 @@ public: vtkNew<vtkRenderWindow> renderWindow; vtkNew<vtkRenderWindowInteractor> renderWindowInteractor; std::shared_ptr<cameraConfigurationData> cameraControllerData; - std::shared_ptr<screenShotData> screenCaptureData; + //std::shared_ptr<screenShotData> screenCaptureData; }; VTKViewer::VTKViewer() : renderer(Core::make_unique<VTKRenderer> (this)) @@ -382,15 +382,25 @@ void VTKViewer::setCameraControllerData(std::shared_ptr<cameraConfigurationData> renderer->cameraControllerData = camData; } -void VTKViewer::setScreenCaptureData(std::shared_ptr<screenShotData> data) +//void VTKViewer::setScreenCaptureData(std::shared_ptr<screenShotData> data) +//{ +// renderer->screenCaptureData = data; +// +// renderer->screenCaptureData->windowToImageFilter->SetInput( +// this->renderer->getRenderWindow()); +//} + +void VTKViewer::addChartActor(vtkContextActor* chartActor, vtkContextScene* chartScene) { - renderer->screenCaptureData = data; + vtkRenderer* rendererVtk = + this->renderer->getRenderWindow()->GetRenderers()->GetFirstRenderer(); + + rendererVtk->AddActor(chartActor); - renderer->screenCaptureData->windowToImageFilter->SetInput( - this->renderer->getRenderWindow()); + chartScene->SetRenderer(rendererVtk); } -void VTKViewer::initRenderingContext() +void VTKViewer::initResources() { this->renderer->addRenderer(); } diff --git a/VTKRendering/VTKViewer.h b/VTKRendering/VTKViewer.h index 89bf5ffa986753f5e8d5758aeac6a65fc54b355e..3aaab8345ea30935e96870c63e5bc21fa703acd5 100644 --- a/VTKRendering/VTKViewer.h +++ b/VTKRendering/VTKViewer.h @@ -93,16 +93,14 @@ public: void setCameraControllerData(std::shared_ptr<cameraConfigurationData> camData); /// - /// \brief Set the data realted to screen capture + /// \brief Set the data related to screen capture /// - void setScreenCaptureData(std::shared_ptr<screenShotData> data); + //void setScreenCaptureData(std::shared_ptr<screenShotData> data); /// /// \brief Add chart actor to the renderer /// - void addChartActor( - std::shared_ptr<vtkContextActor> chartActor, - std::shared_ptr<vtkContextScene> chartScene); + void addChartActor(vtkContextActor* chartActor, vtkContextScene* chartScene); protected: /// diff --git a/VirtualTools/LaparoscopicCameraCoupler.cpp b/VirtualTools/LaparoscopicCameraCoupler.cpp index 54cec32f3df9aa15a68154424f3dd47b2789ac4d..2e64a6a8fd9eaa64cde030d3231946fe93fbbe1d 100644 --- a/VirtualTools/LaparoscopicCameraCoupler.cpp +++ b/VirtualTools/LaparoscopicCameraCoupler.cpp @@ -155,10 +155,10 @@ void LaparoscopicCameraCoupler::exec() this->terminate(); } - if (this->inputDevice->getButton(0)) + /*if (this->inputDevice->getButton(0)) { - this->screenCaptureData->triggerScreenCapture = true; - } + this->screenCaptureData->triggerScreenCapture = true; + }*/ std::this_thread::sleep_for(poolDelay); } @@ -251,12 +251,12 @@ void LaparoscopicCameraCoupler::setBendingRadius(const double val) bendingRadius = val; } -std::shared_ptr<screenShotData> LaparoscopicCameraCoupler::getScreenCaptureData() -{ - return screenCaptureData; -} - -void LaparoscopicCameraCoupler::enableScreenCapture() -{ - this->screenCaptureData = std::make_shared<screenShotData>(); -} \ No newline at end of file +//std::shared_ptr<screenShotData> LaparoscopicCameraCoupler::getScreenCaptureData() +//{ +// return screenCaptureData; +//} +// +//void LaparoscopicCameraCoupler::enableScreenCapture() +//{ +// this->screenCaptureData = std::make_shared<screenShotData>(); +//} \ No newline at end of file diff --git a/VirtualTools/LaparoscopicCameraCoupler.h b/VirtualTools/LaparoscopicCameraCoupler.h index a944016196381bfa9aceb747762a60e8f719f399..850afd0d1e46d415a5ac107fec512818e3e71f10 100644 --- a/VirtualTools/LaparoscopicCameraCoupler.h +++ b/VirtualTools/LaparoscopicCameraCoupler.h @@ -50,34 +50,34 @@ struct cameraConfigurationData ~cameraConfigurationData(){}; }; -struct screenShotData -{ - std::shared_ptr<vtkWindowToImageFilter> windowToImageFilter; - std::shared_ptr<vtkPNGWriter> pngWriter; - bool triggerScreenCapture; - int screenShotNumber; - - screenShotData() : triggerScreenCapture(false), screenShotNumber(0) - { - windowToImageFilter = std::make_shared<vtkWindowToImageFilter>(); - - windowToImageFilter->SetMagnification(3); //set the resolution of the output - //image (3 times the current resolution - // of vtk render window) - - windowToImageFilter->SetInputBufferTypeToRGBA(); //also record the alpha - // (transparency) channel - - windowToImageFilter->ReadFrontBufferOff(); // read from the back buffer - - windowToImageFilter->Update(); - - pngWriter = std::make_shared<vtkPNGWriter>(); - pngWriter->SetInputConnection(windowToImageFilter->GetOutputPort()); - }; - - ~screenShotData(){}; -}; +//struct screenShotData +//{ +// std::shared_ptr<vtkWindowToImageFilter> windowToImageFilter; +// std::shared_ptr<vtkPNGWriter> pngWriter; +// bool triggerScreenCapture; +// int screenShotNumber; +// +// screenShotData() : triggerScreenCapture(false), screenShotNumber(0) +// { +// windowToImageFilter = std::make_shared<vtkWindowToImageFilter>(); +// +// windowToImageFilter->SetMagnification(1); // set the resolution of the output +// // image +// +// windowToImageFilter->SetInputBufferTypeToRGBA(); // also record the alpha +// // (transparency) channel +// +// windowToImageFilter->ReadFrontBufferOff(); // read from the back buffer +// +// windowToImageFilter->Update(); +// +// pngWriter = std::make_shared<vtkPNGWriter>(); +// +// pngWriter->SetInputConnection(windowToImageFilter->GetOutputPort()); +// }; +// +// ~screenShotData(){}; +//}; class LaparoscopicCameraCoupler : public Module { @@ -217,12 +217,12 @@ public: void setBendingRadius(const double val); /// - /// \brief + /// \brief Get the screen capture related data /// - std::shared_ptr<screenShotData> getScreenCaptureData(); + //std::shared_ptr<screenShotData> getScreenCaptureData(); /// - /// \brief + /// \brief Initializes screen capture capability /// void enableScreenCapture(); @@ -268,7 +268,7 @@ private: std::shared_ptr<cameraConfigurationData> cameraPosOrientData;//!< camera config data - std::shared_ptr<screenShotData> screenCaptureData; + //std::shared_ptr<screenShotData> screenCaptureData; std::shared_ptr<vtkWindowToImageFilter> windowToImageFilter; };