diff --git a/Examples/Audio/AudioExample.cpp b/Examples/Audio/AudioExample.cpp index 9b0a0b249b27120a56b0add6175bd932d48fbfb4..8924f88f5f4e193930e39737dfe719941bf48adf 100644 --- a/Examples/Audio/AudioExample.cpp +++ b/Examples/Audio/AudioExample.cpp @@ -116,9 +116,9 @@ playMusic(const std::string& filename) int main() { - auto logger = Logger::getInstance(); - logger->addFileSink("audio-Example", "./"); - logger->addStdoutSink(); + Logger& logger = Logger::getInstance(); + logger.addFileSink("audio-Example", "./"); + logger.addStdoutSink(); #ifndef iMSTK_AUDIO_ENABLED LOG(INFO) << "Audio not enabled at build time\n"; diff --git a/Examples/PBD/PBDCollisionStairs/CMakeLists.txt b/Examples/PBD/PBDCollisionStairs/CMakeLists.txt index dae12cd242ea1bc951b823818a3371900d0b1a00..c0c0bf8fc598af7500482dcb3023681a556d4e33 100644 --- a/Examples/PBD/PBDCollisionStairs/CMakeLists.txt +++ b/Examples/PBD/PBDCollisionStairs/CMakeLists.txt @@ -31,11 +31,4 @@ SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES FOLDER Examples/PBD) #----------------------------------------------------------------------------- # Link libraries to executable #----------------------------------------------------------------------------- -target_link_libraries(${PROJECT_NAME} SimulationManager apiUtilities) - -#----------------------------------------------------------------------------- -# Set MSVC working directory to the install/bin directory -#----------------------------------------------------------------------------- -if(MSVC) # Configure running executable out of MSVC - set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${iMSTK_INSTALL_BIN_DIR}") -endif() +target_link_libraries(${PROJECT_NAME} SimulationManager apiUtilities) \ No newline at end of file diff --git a/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp b/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp index 9dc0b77c76c340005ef92458f48365d4fed1cbda..7e2cfeb60941c4df613a7ccfb049fdb195ecb9a0 100644 --- a/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp +++ b/Examples/PBD/PBDCollisionStairs/PBDCollisionStairsExample.cpp @@ -36,57 +36,58 @@ using namespace imstk; // Creates a non-manifold top part of a staircase -static std::unique_ptr<SurfaceMesh> buildStairs(int nSteps, double width, double height, double depth) +static std::unique_ptr<SurfaceMesh> +buildStairs(int nSteps, double width, double height, double depth) { - // Build stair geometry - const double halfWidth = width * 0.5; - const double halfHeight = height * 0.5; - const double halfDepth = depth * 0.5; - const double dz = depth / static_cast<double>(nSteps); - const double dy = height / static_cast<double>(nSteps); - - // Create vertices - StdVectorOfVec3d vertList; - // 4 verts per step, 2 back, then 2 bottom - vertList.reserve(nSteps * 4 + 4); - for (size_t i = 0; i < nSteps; i++) - { - const double z = static_cast<double>(dz * i) - halfDepth; - const double y1 = static_cast<double>(dy * i) - halfHeight; - vertList.push_back(Vec3d(-halfWidth, y1, z)); - vertList.push_back(Vec3d(halfWidth, y1, z)); - - const double y2 = static_cast<double>(dy * (i + 1)) - halfHeight; - vertList.push_back(Vec3d(-halfWidth, y2, z)); - vertList.push_back(Vec3d(halfWidth, y2, z)); - } - { - const double z = static_cast<double>(dz * nSteps) - halfDepth; - const double yTop = static_cast<double>(dy * nSteps) - halfHeight; - vertList.push_back(Vec3d(-halfWidth, yTop, z)); - vertList.push_back(Vec3d(halfWidth, yTop, z)); - - const double yBot = -halfHeight; - vertList.push_back(Vec3d(-halfWidth, yBot, z)); - vertList.push_back(Vec3d(halfWidth, yBot, z)); - } - - // Create cells - std::vector<SurfaceMesh::TriangleArray> triangles; - // Create sides and tops of steps - for (std::size_t i = 0; i < nSteps; ++i) - { - // Stair front side - triangles.push_back({ { i * 4 + 3, i * 4 + 1, i * 4 } }); - triangles.push_back({ { i * 4 + 2, i * 4 + 3, i * 4 } }); - // Stair top - triangles.push_back({ { (i + 1) * 4, i * 4 + 3, i * 4 + 2 } }); - triangles.push_back({ { (i + 1) * 4, (i + 1) * 4 + 1, i * 4 + 3 } }); - } - - std::unique_ptr<SurfaceMesh> stairMesh = std::make_unique<SurfaceMesh>(); - stairMesh->initialize(vertList, triangles); - return stairMesh; + // Build stair geometry + const double halfWidth = width * 0.5; + const double halfHeight = height * 0.5; + const double halfDepth = depth * 0.5; + const double dz = depth / static_cast<double>(nSteps); + const double dy = height / static_cast<double>(nSteps); + + // Create vertices + StdVectorOfVec3d vertList; + // 4 verts per step, 2 back, then 2 bottom + vertList.reserve(nSteps * 4 + 4); + for (size_t i = 0; i < nSteps; i++) + { + const double z = static_cast<double>(dz * i) - halfDepth; + const double y1 = static_cast<double>(dy * i) - halfHeight; + vertList.push_back(Vec3d(-halfWidth, y1, z)); + vertList.push_back(Vec3d(halfWidth, y1, z)); + + const double y2 = static_cast<double>(dy * (i + 1)) - halfHeight; + vertList.push_back(Vec3d(-halfWidth, y2, z)); + vertList.push_back(Vec3d(halfWidth, y2, z)); + } + { + const double z = static_cast<double>(dz * nSteps) - halfDepth; + const double yTop = static_cast<double>(dy * nSteps) - halfHeight; + vertList.push_back(Vec3d(-halfWidth, yTop, z)); + vertList.push_back(Vec3d(halfWidth, yTop, z)); + + const double yBot = -halfHeight; + vertList.push_back(Vec3d(-halfWidth, yBot, z)); + vertList.push_back(Vec3d(halfWidth, yBot, z)); + } + + // Create cells + std::vector<SurfaceMesh::TriangleArray> triangles; + // Create sides and tops of steps + for (std::size_t i = 0; i < nSteps; ++i) + { + // Stair front side + triangles.push_back({ { i* 4 + 3, i* 4 + 1, i* 4 } }); + triangles.push_back({ { i* 4 + 2, i* 4 + 3, i* 4 } }); + // Stair top + triangles.push_back({ { (i + 1) * 4, i * 4 + 3, i * 4 + 2 } }); + triangles.push_back({ { (i + 1) * 4, (i + 1) * 4 + 1, i * 4 + 3 } }); + } + + std::unique_ptr<SurfaceMesh> stairMesh = std::make_unique<SurfaceMesh>(); + stairMesh->initialize(vertList, triangles); + return stairMesh; } /// @@ -96,101 +97,101 @@ static std::unique_ptr<SurfaceMesh> buildStairs(int nSteps, double width, double int main() { - auto simManager = std::make_shared<SimulationManager>(); - auto scene = simManager->createNewScene("PbdCollision"); - scene->getCamera()->setPosition(0.0, 0.0, -30.0); - scene->getCamera()->setFocalPoint(0.0, 0.0, 0.0); - - auto deformableObj = std::make_shared<PbdObject>("DeformableObj"); - { - // Read in the dragon mesh - auto highResSurfMesh = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.obj")); - auto coarseTetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.veg")); - highResSurfMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData); - coarseTetMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData); - auto coarseSurfMesh = std::make_shared<SurfaceMesh>(); - coarseTetMesh->extractSurfaceMesh(coarseSurfMesh, true); - - // Setup parameters - auto pbdParams = std::make_shared<PBDModelConfig>(); - pbdParams->m_YoungModulus = 1000.0; - pbdParams->m_PoissonRatio = 0.3; - pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet, - PbdFEMConstraint::MaterialType::StVK); - pbdParams->m_uniformMassValue = 1.0; - pbdParams->m_gravity = Vec3d(0, -10.0, 0); - pbdParams->m_DefaultDt = 0.01; - pbdParams->m_maxIter = 5; - pbdParams->m_proximity = 0.3; - pbdParams->m_contactStiffness = 0.1; - - // Setup Model - auto pbdModel = std::make_shared<PbdModel>(); - pbdModel->setModelGeometry(coarseTetMesh); - pbdModel->configure(pbdParams); - - // Setup VisualModel - auto material = std::make_shared<RenderMaterial>(); - material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); - auto surfMeshModel = std::make_shared<VisualModel>(highResSurfMesh); - surfMeshModel->setRenderMaterial(material); - - // Setup Object - deformableObj->addVisualModel(surfMeshModel); - deformableObj->setCollidingGeometry(coarseSurfMesh); - deformableObj->setPhysicsGeometry(coarseTetMesh); - deformableObj->setPhysicsToCollidingMap(std::make_shared<OneToOneMap>(coarseTetMesh, coarseSurfMesh)); - deformableObj->setPhysicsToVisualMap(std::make_shared<TetraTriangleMap>(coarseTetMesh, highResSurfMesh)); - deformableObj->setDynamicalModel(pbdModel); - - // Add to scene - scene->addSceneObject(deformableObj); - } - - auto stairObj = std::make_shared<PbdObject>("Floor"); - { - std::shared_ptr<SurfaceMesh> stairMesh(std::move(buildStairs(15, 20.0, 10.0, 20.0))); - - // Setup parameters - auto pbdParams2 = std::make_shared<PBDModelConfig>(); - pbdParams2->m_uniformMassValue = 0.0; - pbdParams2->m_proximity = 0.1; - pbdParams2->m_contactStiffness = 1.0; - pbdParams2->m_maxIter = 0; - - // Setup model - auto pbdModel2 = std::make_shared<PbdModel>(); - pbdModel2->setModelGeometry(stairMesh); - pbdModel2->configure(pbdParams2); - - // Setup VisualModel - auto stairMaterial = std::make_shared<RenderMaterial>(); - stairMaterial->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); - auto stairMeshModel = std::make_shared<VisualModel>(stairMesh); - stairMeshModel->setRenderMaterial(stairMaterial); - - stairObj->addVisualModel(stairMeshModel); - stairObj->setDynamicalModel(pbdModel2); - stairObj->setCollidingGeometry(stairMesh); - stairObj->setVisualGeometry(stairMesh); - stairObj->setPhysicsGeometry(stairMesh); - - scene->addSceneObject(stairObj); - } - - // Collision - scene->getCollisionGraph()->addInteractionPair(deformableObj, stairObj, - CollisionDetection::Type::MeshToMeshBruteForce, - CollisionHandling::Type::PBD, - CollisionHandling::Type::None); - - // Light - auto light = std::make_shared<DirectionalLight>("light"); - light->setFocalPoint(Vec3d(5, -8, 5)); - scene->addLight(light); - - simManager->setActiveScene(scene); - simManager->start(SimulationStatus::Paused); + auto simManager = std::make_shared<SimulationManager>(); + auto scene = simManager->createNewScene("PbdCollision"); + scene->getCamera()->setPosition(0.0, 0.0, -30.0); + scene->getCamera()->setFocalPoint(0.0, 0.0, 0.0); + + auto deformableObj = std::make_shared<PbdObject>("DeformableObj"); + { + // Read in the dragon mesh + auto highResSurfMesh = std::dynamic_pointer_cast<SurfaceMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.obj")); + auto coarseTetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(MeshIO::read(iMSTK_DATA_ROOT "/asianDragon/asianDragon.veg")); + highResSurfMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData); + coarseTetMesh->translate(Vec3d(0.0f, 10.0f, 0.0f), Geometry::TransformType::ApplyToData); + auto coarseSurfMesh = std::make_shared<SurfaceMesh>(); + coarseTetMesh->extractSurfaceMesh(coarseSurfMesh, true); + + // Setup parameters + auto pbdParams = std::make_shared<PBDModelConfig>(); + pbdParams->m_YoungModulus = 1000.0; + pbdParams->m_PoissonRatio = 0.3; + pbdParams->enableFEMConstraint(PbdConstraint::Type::FEMTet, + PbdFEMConstraint::MaterialType::StVK); + pbdParams->m_uniformMassValue = 1.0; + pbdParams->m_gravity = Vec3d(0, -10.0, 0); + pbdParams->m_DefaultDt = 0.01; + pbdParams->m_maxIter = 5; + pbdParams->m_proximity = 0.3; + pbdParams->m_contactStiffness = 0.1; + + // Setup Model + auto pbdModel = std::make_shared<PbdModel>(); + pbdModel->setModelGeometry(coarseTetMesh); + pbdModel->configure(pbdParams); + + // Setup VisualModel + auto material = std::make_shared<RenderMaterial>(); + material->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); + auto surfMeshModel = std::make_shared<VisualModel>(highResSurfMesh); + surfMeshModel->setRenderMaterial(material); + + // Setup Object + deformableObj->addVisualModel(surfMeshModel); + deformableObj->setCollidingGeometry(coarseSurfMesh); + deformableObj->setPhysicsGeometry(coarseTetMesh); + deformableObj->setPhysicsToCollidingMap(std::make_shared<OneToOneMap>(coarseTetMesh, coarseSurfMesh)); + deformableObj->setPhysicsToVisualMap(std::make_shared<TetraTriangleMap>(coarseTetMesh, highResSurfMesh)); + deformableObj->setDynamicalModel(pbdModel); + + // Add to scene + scene->addSceneObject(deformableObj); + } + + auto stairObj = std::make_shared<PbdObject>("Floor"); + { + std::shared_ptr<SurfaceMesh> stairMesh(std::move(buildStairs(15, 20.0, 10.0, 20.0))); + + // Setup parameters + auto pbdParams2 = std::make_shared<PBDModelConfig>(); + pbdParams2->m_uniformMassValue = 0.0; + pbdParams2->m_proximity = 0.1; + pbdParams2->m_contactStiffness = 1.0; + pbdParams2->m_maxIter = 0; + + // Setup model + auto pbdModel2 = std::make_shared<PbdModel>(); + pbdModel2->setModelGeometry(stairMesh); + pbdModel2->configure(pbdParams2); + + // Setup VisualModel + auto stairMaterial = std::make_shared<RenderMaterial>(); + stairMaterial->setDisplayMode(RenderMaterial::DisplayMode::WireframeSurface); + auto stairMeshModel = std::make_shared<VisualModel>(stairMesh); + stairMeshModel->setRenderMaterial(stairMaterial); + + stairObj->addVisualModel(stairMeshModel); + stairObj->setDynamicalModel(pbdModel2); + stairObj->setCollidingGeometry(stairMesh); + stairObj->setVisualGeometry(stairMesh); + stairObj->setPhysicsGeometry(stairMesh); + + scene->addSceneObject(stairObj); + } + + // Collision + scene->getCollisionGraph()->addInteractionPair(deformableObj, stairObj, + CollisionDetection::Type::MeshToMeshBruteForce, + CollisionHandling::Type::PBD, + CollisionHandling::Type::None); + + // Light + auto light = std::make_shared<DirectionalLight>("light"); + light->setFocalPoint(Vec3d(5, -8, 5)); + scene->addLight(light); + + simManager->setActiveScene(scene); + simManager->start(SimulationStatus::Paused); return 0; } diff --git a/Examples/RCM/RCM.cpp b/Examples/RCM/RCM.cpp index c31dec67dd7af09264264cb1f9134ed9463edd60..5a0bb50f4cd2088d563f5d9a48b68af84d1dc4c1 100644 --- a/Examples/RCM/RCM.cpp +++ b/Examples/RCM/RCM.cpp @@ -42,9 +42,9 @@ void testRCM(const std::vector<ElemConn>& conn, const size_t numVerts); int main(int argc, char** argv) { - auto logger = Logger::getInstance(); - logger->addFileSink("rcm-Example", "./"); - logger->addStdoutSink(); + Logger& logger = Logger::getInstance(); + logger.addFileSink("rcm-Example1", "./"); + logger.addStdoutSink(); // a 2D Cartesian mesh { diff --git a/Source/Common/imstkLogger.cpp b/Source/Common/imstkLogger.cpp index 419f3799090a5d1388e5ae32421b957389fb3baa..f8fb8252a4a7648645293b1c02bd97cc20a17860 100644 --- a/Source/Common/imstkLogger.cpp +++ b/Source/Common/imstkLogger.cpp @@ -26,9 +26,6 @@ limitations under the License. namespace imstk { -Logger* Logger::m_loggerInstance = NULL; -std::mutex Logger::m_mutex; - stdSink::FontColor stdSink::GetColor(const LEVELS level) const { diff --git a/Source/Common/imstkLogger.h b/Source/Common/imstkLogger.h index 698f89471950a13e99144ca9704de22b3e416577..487711ce43728762b8b480ad9693f17765b2669e 100644 --- a/Source/Common/imstkLogger.h +++ b/Source/Common/imstkLogger.h @@ -25,6 +25,8 @@ limitations under the License. #include "imstkDataLogger.h" +#include <memory> + namespace imstk { /// @@ -69,25 +71,31 @@ using StdoutSinkHandle = g3::SinkHandle<stdSink>; /// /// \struct Logger /// -/// \brief +/// \brief lazy initialized singleton /// class Logger { public: - static Logger* getInstance() + static Logger& getInstance() { - std::lock_guard<std::mutex> myLock(m_mutex); - if (!m_loggerInstance) + // Thread safe in C++11 ("magic statics") + static Logger instance; + + if (instance.m_g3logWorker == nullptr) { - m_loggerInstance = new Logger(); + instance.initialize(); } - return m_loggerInstance; - } - ~Logger() = default; + return instance; + } - //std::shared_ptr<g3::LogWorker> getLogWorker() { return m_g3logWorker; } + // Disable copy & move constructors & assignments + Logger(const Logger&) = delete; + Logger& operator=(const Logger&) = delete; + Logger(Logger&&) = delete; + Logger& operator=(Logger&&) = delete; +public: /// /// \brief Add a sink that logs to standard output /// @@ -98,16 +106,28 @@ public: /// std::unique_ptr<FileSinkHandle> addFileSink(const std::string& name, const std::string& path); -private: - Logger() { initialize(); }; + /// + /// \brief Add your own sink + /// + template<typename T, typename DefaultLogCall> + void addSink(std::unique_ptr<T> real_sink, DefaultLogCall call) + { + m_g3logWorker->addSink(std::move(real_sink), call); + } /// /// \brief Create and initialize the logger /// void initialize(); - static Logger* m_loggerInstance; + /// + /// \brief Manual destruction of the logger members + /// + void destroy() { m_g3logWorker = nullptr; } + +private: + Logger() { initialize(); } + std::shared_ptr<g3::LogWorker> m_g3logWorker; - static std::mutex m_mutex; }; } diff --git a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp index 354c10c992fd6d171d8e535db693457beb5bcebd..d7eb96cea9e1f46d15e262e8a03a541df437c1a4 100644 --- a/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp +++ b/Source/DynamicalModels/ObjectModels/PbdConstraints/imstkPbdFETetConstraint.cpp @@ -22,6 +22,7 @@ #include "imstkPbdFETetConstraint.h" #include "imstkPbdModel.h" #include "imstkLogger.h" +#include "imstkPbdModel.h" namespace imstk { diff --git a/Source/Geometry/Mesh/imstkPointSet.cpp b/Source/Geometry/Mesh/imstkPointSet.cpp index 620d8d820ed5dc2b0a6ecf25249ea0d10ff0ab5a..4f0bd8530460c6a091f1d8e928bf34934dd6be10 100644 --- a/Source/Geometry/Mesh/imstkPointSet.cpp +++ b/Source/Geometry/Mesh/imstkPointSet.cpp @@ -160,7 +160,7 @@ PointSet::setVertexDisplacements(const StdVectorOfVec3d& diff) void PointSet::setVertexDisplacements(const Vectord& u) { - assert(u.size() == 3 * m_vertexPositions.size()); + assert(static_cast<size_t>(u.size()) == 3 * m_vertexPositions.size()); ParallelUtils::parallelFor(m_vertexPositions.size(), [&](const size_t i) { diff --git a/Source/Geometry/Reader/imstkVTKMeshIO.cpp b/Source/Geometry/Reader/imstkVTKMeshIO.cpp index 99d0f97eed3031b7b00dd85dbf74e2ab21d7f7b3..98c11b683a91b6553980288f106a5dfdc2609a75 100644 --- a/Source/Geometry/Reader/imstkVTKMeshIO.cpp +++ b/Source/Geometry/Reader/imstkVTKMeshIO.cpp @@ -104,11 +104,11 @@ VTKMeshIO::write(const std::shared_ptr<PointSet> imstkMesh, const std::string& f case MeshFileType::VTU: if (auto tetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(vMesh)) { - VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(tetMesh, filePath); + return VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(tetMesh, filePath); } else if (auto hexMesh = std::dynamic_pointer_cast<HexahedralMesh>(vMesh)) { - VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(hexMesh, filePath); + return VTKMeshIO::writeVtkUnstructuredGrid<vtkXMLUnstructuredGridWriter>(hexMesh, filePath); } else { @@ -118,11 +118,11 @@ VTKMeshIO::write(const std::shared_ptr<PointSet> imstkMesh, const std::string& f case MeshFileType::VTK: if (auto tetMesh = std::dynamic_pointer_cast<TetrahedralMesh>(vMesh)) { - VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(tetMesh, filePath); + return VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(tetMesh, filePath); } else if (auto hexMesh = std::dynamic_pointer_cast<HexahedralMesh>(vMesh)) { - VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(hexMesh, filePath); + return VTKMeshIO::writeVtkUnstructuredGrid<vtkGenericDataObjectWriter>(hexMesh, filePath); } else { @@ -181,7 +181,6 @@ VTKMeshIO::write(const std::shared_ptr<PointSet> imstkMesh, const std::string& f LOG(WARNING) << "VTKMeshIO::write error: the provided mesh is not a surface or volumetric mesh."; return false; } - return true; } template<typename ReaderType> diff --git a/Source/SimulationManager/imstkSimulationManager.cpp b/Source/SimulationManager/imstkSimulationManager.cpp index dc254ed325eb70066adb50b510f74df9b060259b..76de417d62e63286636e15512a2cf2b7e0eaf02f 100644 --- a/Source/SimulationManager/imstkSimulationManager.cpp +++ b/Source/SimulationManager/imstkSimulationManager.cpp @@ -36,15 +36,16 @@ namespace imstk SimulationManager::SimulationManager(const std::shared_ptr<simManagerConfig> config) : m_config(config) { // Initialize the logger and add optional sinks - auto logger = Logger::getInstance(); if (config->enableFileLogging) { - m_fileSinkHandle = logger->addFileSink(m_config->logFilePrefix, m_config->logPath); + Logger& logger = Logger::getInstance(); + m_fileSinkHandle = logger.addFileSink(m_config->logFilePrefix, m_config->logPath); } if (config->enableStdoutLogging) { - m_stdSinkHandle = logger->addStdoutSink(); + Logger& logger = Logger::getInstance(); + m_stdSinkHandle = logger.addStdoutSink(); } // create viewer if the selected mode is 'rendering'