From 58b2b34bb1c1666ff13db2029da1ed8415bc4e71 Mon Sep 17 00:00:00 2001 From: Jeongseok Lee Date: Thu, 9 May 2019 08:46:22 -0700 Subject: [PATCH 1/3] Remove warning of ImGuiViewer + OSG shadow --- dart/gui/osg/WorldNode.cpp | 25 +++++++++---------- dart/gui/osg/WorldNode.hpp | 2 +- .../AtlasSimbiconEventHandler.hpp | 2 +- .../atlas_simbicon/AtlasSimbiconWidget.cpp | 18 ++++++++++--- .../atlas_simbicon/AtlasSimbiconWidget.hpp | 4 ++- .../atlas_simbicon/AtlasSimbiconWorldNode.cpp | 22 ++++++++++++++++ .../atlas_simbicon/AtlasSimbiconWorldNode.hpp | 3 +++ examples/atlas_simbicon/main.cpp | 2 +- 8 files changed, 58 insertions(+), 20 deletions(-) diff --git a/dart/gui/osg/WorldNode.cpp b/dart/gui/osg/WorldNode.cpp index a7dc5bd483e72..23c813dc5cb39 100644 --- a/dart/gui/osg/WorldNode.cpp +++ b/dart/gui/osg/WorldNode.cpp @@ -39,7 +39,6 @@ #include "dart/gui/osg/WorldNode.hpp" #include "dart/gui/osg/ShapeFrameNode.hpp" -#include "dart/gui/osg/ImGuiViewer.hpp" #include "dart/simulation/World.hpp" #include "dart/dynamics/Skeleton.hpp" @@ -329,33 +328,33 @@ bool WorldNode::isShadowed() const } //============================================================================== -void WorldNode::setShadowTechnique(::osg::ref_ptr shadowTechnique) { - if(!shadowTechnique) { +void WorldNode::setShadowTechnique(::osg::ref_ptr shadowTechnique) +{ + if(!shadowTechnique) + { mShadowed = false; - static_cast(mShadowedGroup.get())->setShadowTechnique(nullptr); + mShadowedGroup->setShadowTechnique(nullptr); } - else { - ImGuiViewer* viewer = mViewer ? dynamic_cast(mViewer) : nullptr; - if(viewer) - dtwarn << "[WorldNode] You are enabling shadows inside an ImGuiViewer. " - << "The ImGui windows may not render properly.\n"; + else + { mShadowed = true; - static_cast(mShadowedGroup.get())->setShadowTechnique(shadowTechnique.get()); + mShadowedGroup->setShadowTechnique(shadowTechnique); } } //============================================================================== -::osg::ref_ptr WorldNode::getShadowTechnique() const { +::osg::ref_ptr WorldNode::getShadowTechnique() const +{ if(!mShadowed) return nullptr; - return static_cast(mShadowedGroup.get())->getShadowTechnique(); + return mShadowedGroup->getShadowTechnique(); } //============================================================================== ::osg::ref_ptr WorldNode::createDefaultShadowTechnique(const Viewer* viewer) { ::osg::ref_ptr sm = new osgShadow::ShadowMap; // increase the resolution of default shadow texture for higher quality - int mapres = std::pow(2, 13); + auto mapres = static_cast(std::pow(2, 13)); sm->setTextureSize(::osg::Vec2s(mapres,mapres)); // we are using Light1 because this is the highest one (on up direction) sm->setLight(viewer->getLightSource(0)); diff --git a/dart/gui/osg/WorldNode.hpp b/dart/gui/osg/WorldNode.hpp index bf33906061f8d..45ff67c58a720 100644 --- a/dart/gui/osg/WorldNode.hpp +++ b/dart/gui/osg/WorldNode.hpp @@ -194,7 +194,7 @@ class WorldNode : public ::osg::Group ::osg::ref_ptr<::osg::Group> mNormalGroup; /// OSG group for shadowed objects - ::osg::ref_ptr<::osg::Group> mShadowedGroup; + ::osg::ref_ptr<::osgShadow::ShadowedScene> mShadowedGroup; /// Whether the shadows are enabled bool mShadowed; diff --git a/examples/atlas_simbicon/AtlasSimbiconEventHandler.hpp b/examples/atlas_simbicon/AtlasSimbiconEventHandler.hpp index d489779c4025b..52abfa5c3b4d9 100644 --- a/examples/atlas_simbicon/AtlasSimbiconEventHandler.hpp +++ b/examples/atlas_simbicon/AtlasSimbiconEventHandler.hpp @@ -48,7 +48,7 @@ class AtlasSimbiconEventHandler : public osgGA::GUIEventHandler const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter&) override; protected: - AtlasSimbiconWorldNode* mNode; + ::osg::ref_ptr mNode; }; #endif // DART_EXAMPLE_OSG_OSGATLASSIMBICON_ATLASSIMBICONEVENTHANDLER_HPP_ diff --git a/examples/atlas_simbicon/AtlasSimbiconWidget.cpp b/examples/atlas_simbicon/AtlasSimbiconWidget.cpp index 1e89fd42b5ba6..1c7e9d1ed83e1 100644 --- a/examples/atlas_simbicon/AtlasSimbiconWidget.cpp +++ b/examples/atlas_simbicon/AtlasSimbiconWidget.cpp @@ -60,7 +60,7 @@ AtlasSimbiconWidget::AtlasSimbiconWidget( void AtlasSimbiconWidget::render() { ImGui::SetNextWindowPos(ImVec2(10, 20)); - ImGui::SetNextWindowSize(ImVec2(360, 340)); + ImGui::SetNextWindowSize(ImVec2(360, 400)); ImGui::SetNextWindowBgAlpha(0.5f); if (!ImGui::Begin( "Atlas Control", @@ -130,8 +130,20 @@ void AtlasSimbiconWidget::render() // Headlights mGuiHeadlights = mViewer->checkHeadlights(); - ImGui::Checkbox("Headlights On/Off", &mGuiHeadlights); - mViewer->switchHeadlights(mGuiHeadlights); + if (ImGui::Checkbox("Headlights On/Off", &mGuiHeadlights)) + { + mViewer->switchHeadlights(mGuiHeadlights); + } + + // Shadow + mShadow = mNode->isShadowed(); + if (ImGui::Checkbox("Shadow On/Off", &mShadow)) + { + if (mShadow) + mNode->showShadow(); + else + mNode->hideShadow(); + } } if (ImGui::CollapsingHeader( diff --git a/examples/atlas_simbicon/AtlasSimbiconWidget.hpp b/examples/atlas_simbicon/AtlasSimbiconWidget.hpp index a1a677f545999..ba003cd5d7f63 100644 --- a/examples/atlas_simbicon/AtlasSimbiconWidget.hpp +++ b/examples/atlas_simbicon/AtlasSimbiconWidget.hpp @@ -59,7 +59,7 @@ class AtlasSimbiconWidget : public dart::gui::osg::ImGuiWidget ::osg::ref_ptr mViewer; - AtlasSimbiconWorldNode* mNode; + ::osg::ref_ptr mNode; float mGuiGravityAcc; @@ -67,6 +67,8 @@ class AtlasSimbiconWidget : public dart::gui::osg::ImGuiWidget bool mGuiHeadlights; + bool mShadow; + /// Control mode value for GUI int mGuiControlMode; diff --git a/examples/atlas_simbicon/AtlasSimbiconWorldNode.cpp b/examples/atlas_simbicon/AtlasSimbiconWorldNode.cpp index e8858735914f1..6f3f810207d62 100644 --- a/examples/atlas_simbicon/AtlasSimbiconWorldNode.cpp +++ b/examples/atlas_simbicon/AtlasSimbiconWorldNode.cpp @@ -32,6 +32,8 @@ #include "AtlasSimbiconWorldNode.hpp" +#include + //============================================================================== AtlasSimbiconWorldNode::AtlasSimbiconWorldNode( const dart::simulation::WorldPtr& world, @@ -111,3 +113,23 @@ void AtlasSimbiconWorldNode::switchToNoControl() { mController->changeStateMachine("standing", mWorld->getTime()); } + +//============================================================================== +void AtlasSimbiconWorldNode::showShadow() +{ + auto shadow + = dart::gui::osg::WorldNode::createDefaultShadowTechnique(mViewer); + if (auto sm = dynamic_cast<::osgShadow::ShadowMap*>(shadow.get())) + { + auto mapres = static_cast(std::pow(2, 12)); + sm->setTextureSize(::osg::Vec2s(mapres, mapres)); + } + + setShadowTechnique(shadow); +} + +//============================================================================== +void AtlasSimbiconWorldNode::hideShadow() +{ + setShadowTechnique(nullptr); +} diff --git a/examples/atlas_simbicon/AtlasSimbiconWorldNode.hpp b/examples/atlas_simbicon/AtlasSimbiconWorldNode.hpp index 3550bd5512860..86135c048de6d 100644 --- a/examples/atlas_simbicon/AtlasSimbiconWorldNode.hpp +++ b/examples/atlas_simbicon/AtlasSimbiconWorldNode.hpp @@ -61,6 +61,9 @@ class AtlasSimbiconWorldNode : public dart::gui::osg::RealTimeWorldNode void switchToShortStrideWalking(); void switchToNoControl(); + void showShadow(); + void hideShadow(); + protected: std::unique_ptr mController; Eigen::Vector3d mExternalForce; diff --git a/examples/atlas_simbicon/main.cpp b/examples/atlas_simbicon/main.cpp index ab4f049f0a411..38da1e5927f4d 100644 --- a/examples/atlas_simbicon/main.cpp +++ b/examples/atlas_simbicon/main.cpp @@ -69,7 +69,7 @@ int main() // Add control widget for atlas viewer->getImGuiHandler()->addWidget( - std::make_shared(viewer, node.get())); + std::make_shared(viewer, node)); // Pass in the custom event handler viewer->addEventHandler(new AtlasSimbiconEventHandler(node)); From d73635fe70e7fd3bfa85fec569b47bf161ddc5cc Mon Sep 17 00:00:00 2001 From: Jeongseok Lee Date: Thu, 9 May 2019 08:50:45 -0700 Subject: [PATCH 2/3] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5f0c26a0f421..2a3d76f0c2635 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * Added heightmap support to OSG renderer: [#1293](https://github.com/dartsim/dart/pull/1293) * Improved voxel grid and point cloud rendering performance: [#1294](https://github.com/dartsim/dart/pull/1294) * Fixed incorrect alpha value update of InteractiveFrame: [#1297](https://github.com/dartsim/dart/pull/1297) + * Removed warning of ImGuiViewer + OSG shadow: [#1312](https://github.com/dartsim/dart/pull/1312) * Examples and Tutorials From 2405a705940a135dc72520bf936dc01c3d0bbe60 Mon Sep 17 00:00:00 2001 From: Jeongseok Lee Date: Thu, 9 May 2019 09:12:59 -0700 Subject: [PATCH 3/3] Enable shadow for atlas example by default --- dart/gui/osg/WorldNode.cpp | 5 ++++- dart/gui/osg/WorldNode.hpp | 3 ++- examples/atlas_simbicon/AtlasSimbiconWorldNode.cpp | 4 ++-- examples/atlas_simbicon/main.cpp | 3 +++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/dart/gui/osg/WorldNode.cpp b/dart/gui/osg/WorldNode.cpp index 23c813dc5cb39..8c07207f0cfe6 100644 --- a/dart/gui/osg/WorldNode.cpp +++ b/dart/gui/osg/WorldNode.cpp @@ -351,7 +351,10 @@ ::osg::ref_ptr WorldNode::getShadowTechnique() const } //============================================================================== -::osg::ref_ptr WorldNode::createDefaultShadowTechnique(const Viewer* viewer) { +::osg::ref_ptr WorldNode::createDefaultShadowTechnique(const Viewer* viewer) +{ + assert(viewer); + ::osg::ref_ptr sm = new osgShadow::ShadowMap; // increase the resolution of default shadow texture for higher quality auto mapres = static_cast(std::pow(2, 13)); diff --git a/dart/gui/osg/WorldNode.hpp b/dart/gui/osg/WorldNode.hpp index 45ff67c58a720..be332f1841a23 100644 --- a/dart/gui/osg/WorldNode.hpp +++ b/dart/gui/osg/WorldNode.hpp @@ -173,7 +173,8 @@ class WorldNode : public ::osg::Group void refreshShapeFrameNode(dart::dynamics::Frame* frame); - using NodeMap = std::unordered_map; + using NodeMap = std::unordered_map< + dart::dynamics::Frame*, ::osg::ref_ptr>; /// Map from Frame pointers to FrameNode pointers NodeMap mFrameToNode; diff --git a/examples/atlas_simbicon/AtlasSimbiconWorldNode.cpp b/examples/atlas_simbicon/AtlasSimbiconWorldNode.cpp index 6f3f810207d62..319a6f0459a46 100644 --- a/examples/atlas_simbicon/AtlasSimbiconWorldNode.cpp +++ b/examples/atlas_simbicon/AtlasSimbiconWorldNode.cpp @@ -121,8 +121,8 @@ void AtlasSimbiconWorldNode::showShadow() = dart::gui::osg::WorldNode::createDefaultShadowTechnique(mViewer); if (auto sm = dynamic_cast<::osgShadow::ShadowMap*>(shadow.get())) { - auto mapres = static_cast(std::pow(2, 12)); - sm->setTextureSize(::osg::Vec2s(mapres, mapres)); + auto mapResolution = static_cast(std::pow(2, 12)); + sm->setTextureSize(::osg::Vec2s(mapResolution, mapResolution)); } setShadowTechnique(shadow); diff --git a/examples/atlas_simbicon/main.cpp b/examples/atlas_simbicon/main.cpp index 38da1e5927f4d..8a0ca60b884a2 100644 --- a/examples/atlas_simbicon/main.cpp +++ b/examples/atlas_simbicon/main.cpp @@ -67,6 +67,9 @@ int main() = new dart::gui::osg::ImGuiViewer(); viewer->addWorldNode(node); + // Enable shadow + node->showShadow(); + // Add control widget for atlas viewer->getImGuiHandler()->addWidget( std::make_shared(viewer, node));