diff --git a/Source/Common/imstkNew.h b/Source/Common/imstkNew.h index e9b7d218bb80e981ef811d191786e9624ca5619b..7b83d5113638f7d2f6c1556ca5c7f2b50b1c9e53 100644 --- a/Source/Common/imstkNew.h +++ b/Source/Common/imstkNew.h @@ -75,6 +75,11 @@ public: /// operator std::shared_ptr<T>() const { return object; } + /// + /// \brief Implicit conversion + /// + operator std::weak_ptr<T>() const { return object; } + /// /// \brief Hack for multiple implicit conversions, does not work with overloads though /// as it won't know what to cast too @@ -86,6 +91,17 @@ public: return std::dynamic_pointer_cast<U>(object); } + /// + /// \brief Hack for multiple implicit conversions, does not work with overloads though + /// as it won't know what to cast too + /// + template<typename U> + operator std::weak_ptr<U>() const + { + static_assert(std::is_base_of<U, T>::value, "Argument U type not compatible with imstkNew<T>'s T"); + return std::dynamic_pointer_cast<U>(object); + } + private: imstkNew(const imstkNew<T>&) = delete; void operator=(const imstkNew<T>&) = delete; diff --git a/Source/SimulationManager/imstkKeyboardSceneControl.cpp b/Source/SimulationManager/imstkKeyboardSceneControl.cpp index 1d8c0cf14995e705b937ac6eead0a28009878f54..4b39282f1acca59eb4deb72521c84579db4f9e75 100644 --- a/Source/SimulationManager/imstkKeyboardSceneControl.cpp +++ b/Source/SimulationManager/imstkKeyboardSceneControl.cpp @@ -30,14 +30,12 @@ namespace imstk { -KeyboardSceneControl::KeyboardSceneControl() : - m_driver(nullptr), m_showFps(false) +KeyboardSceneControl::KeyboardSceneControl() { } KeyboardSceneControl::KeyboardSceneControl(std::shared_ptr<KeyboardDeviceClient> keyDevice) : - KeyboardControl(keyDevice), - m_driver(nullptr), m_showFps(false) + KeyboardControl(keyDevice) { } @@ -57,12 +55,15 @@ KeyboardSceneControl::printControls() void KeyboardSceneControl::OnKeyPress(const char key) { - if (m_sceneManager == nullptr) + auto sceneManager = m_sceneManager.lock(); + + if (sceneManager == nullptr) { LOG(WARNING) << "Keyboard control disabled: No scene manager provided"; return; } - if (m_driver == nullptr) + auto driver = m_driver.lock(); + if (driver == nullptr) { LOG(WARNING) << "Keyboard control disabled: No driver provided"; return; @@ -71,10 +72,10 @@ KeyboardSceneControl::OnKeyPress(const char key) if (key == ' ') { // To ensure consistency toggle/invert based of m_sceneManager - const bool paused = m_sceneManager->getPaused(); + const bool paused = sceneManager->getPaused(); // Resume or pause all modules - for (auto module : m_driver->getModules()) + for (auto module : driver->getModules()) { if (paused) { @@ -88,25 +89,25 @@ KeyboardSceneControl::OnKeyPress(const char key) } else if (key == 'q' || key == 'Q' || key == 'e' || key == 'E') // end Simulation { - m_driver->requestStatus(ModuleDriverStopped); + driver->requestStatus(ModuleDriverStopped); } else if (key == 'd' || key == 'D') // switch rendering mode of the modules { // To ensure consistency toggle/invert based of m_sceneManager - const bool simModeOn = m_sceneManager->getMode() == SceneManager::Mode::Simulation ? true : false; + const bool simModeOn = sceneManager->getMode() == SceneManager::Mode::Simulation ? true : false; - for (auto module : m_driver->getModules()) + for (auto module : driver->getModules()) { - std::shared_ptr<SceneManager> sceneManager = std::dynamic_pointer_cast<SceneManager>(module); - if (sceneManager != nullptr) + std::shared_ptr<SceneManager> subManager = std::dynamic_pointer_cast<SceneManager>(module); + if (subManager != nullptr) { if (simModeOn) { - sceneManager->setMode(SceneManager::Mode::Debug); + subManager->setMode(SceneManager::Mode::Debug); } else { - sceneManager->setMode(SceneManager::Mode::Simulation); + subManager->setMode(SceneManager::Mode::Simulation); } } std::shared_ptr<VTKViewer> viewer = std::dynamic_pointer_cast<VTKViewer>(module); @@ -126,7 +127,7 @@ KeyboardSceneControl::OnKeyPress(const char key) else if (key == 'p' || key == 'P') // switch framerate display { // The designated m_sceneManager framerate is displayed in all views - for (auto module : m_driver->getModules()) + for (auto module : driver->getModules()) { std::shared_ptr<VTKViewer> viewer = std::dynamic_pointer_cast<VTKViewer>(module); if (viewer != nullptr) @@ -135,7 +136,7 @@ KeyboardSceneControl::OnKeyPress(const char key) std::shared_ptr<VTKTextStatusManager> textManager = viewer->getTextStatusManager(); textManager->setStatusVisibility(VTKTextStatusManager::StatusType::FPS, m_showFps); - std::shared_ptr<Scene> activeScene = m_sceneManager->getActiveScene(); + std::shared_ptr<Scene> activeScene = sceneManager->getActiveScene(); activeScene->setEnableTaskTiming(m_showFps); std::shared_ptr<VTKRenderer> vtkRen = std::dynamic_pointer_cast<VTKRenderer>(viewer->getActiveRenderer()); vtkRen->setTimeTableVisibility(m_showFps); @@ -144,10 +145,7 @@ KeyboardSceneControl::OnKeyPress(const char key) } else if (key == 'r' || key == 'R') { - if (m_sceneManager != nullptr) - { - m_sceneManager->getActiveScene()->reset(); - } + sceneManager->getActiveScene()->reset(); } } diff --git a/Source/SimulationManager/imstkKeyboardSceneControl.h b/Source/SimulationManager/imstkKeyboardSceneControl.h index e8fcee8f332621612add306c2be377e7116c99c9..1396a8f89d7aebd55d47c7cee098b2919f6ab852 100644 --- a/Source/SimulationManager/imstkKeyboardSceneControl.h +++ b/Source/SimulationManager/imstkKeyboardSceneControl.h @@ -48,12 +48,12 @@ public: /// /// \brief The driver is used to stop the simulation /// - void setModuleDriver(std::shared_ptr<ModuleDriver> driver) { m_driver = driver; } + void setModuleDriver(std::weak_ptr<ModuleDriver> driver) { m_driver = driver; } /// /// \brief Set the scene manager whose fps we should track /// - void setSceneManager(std::shared_ptr<SceneManager> sceneManager) { m_sceneManager = sceneManager; } + void setSceneManager(std::weak_ptr<SceneManager> sceneManager) { m_sceneManager = sceneManager; } public: void printControls() override; @@ -63,8 +63,8 @@ public: void OnKeyRelease(const char key) override; protected: - std::shared_ptr<ModuleDriver> m_driver; - std::shared_ptr<SceneManager> m_sceneManager; - bool m_showFps; + std::weak_ptr<ModuleDriver> m_driver; + std::weak_ptr<SceneManager> m_sceneManager; + bool m_showFps = false; }; } \ No newline at end of file