diff --git a/modules/gfx/doc/scene.rst b/modules/gfx/doc/scene.rst index a31836aba84e028a379f012bb267d6398766c8b8..d1eb368c3a75b5b6fdd45ad80d28e5636582b7bf 100644 --- a/modules/gfx/doc/scene.rst +++ b/modules/gfx/doc/scene.rst @@ -214,7 +214,12 @@ It is interesting to note that the offset from center (`trans`) is given in rota :param obj: :type obj: :class:`GfxNode` - + + .. method:: RemoveAll() + + Remove all objects from the scene + + .. method:: RenderGL() Renders the scene. diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc index e66235742552df1b54d131abc39285fe057e8210..1f9b2c459c68217e804777b513ef4ef332dcc987 100644 --- a/modules/gfx/pymod/export_scene.cc +++ b/modules/gfx/pymod/export_scene.cc @@ -127,6 +127,7 @@ void export_Scene() .def("GetSelectionMode",&Scene::GetSelectionMode) .def("SetBlur",&Scene::SetBlur) .def("BlurSnapshot",&Scene::BlurSnapshot) + .def("RemoveAll", &Scene::RemoveAll) .def("SetShadow",&Scene::SetShadow) .def("SetShadowQuality",&Scene::SetShadowQuality) .def("AttachObserver",&Scene::AttachObserver) diff --git a/modules/gfx/src/gfx_node.cc b/modules/gfx/src/gfx_node.cc index f3a61c11ebf8da0eb9fcacc39cd154d611c6f20d..93f900980fd15afde02631f7c26790b6c7109bf3 100644 --- a/modules/gfx/src/gfx_node.cc +++ b/modules/gfx/src/gfx_node.cc @@ -16,6 +16,7 @@ // along with this library; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA //------------------------------------------------------------------------------ +#include <boost/bind.hpp> #include <ost/dyn_cast.hh> #include "gfx_node.hh" #include "gfx_object.hh" @@ -113,6 +114,17 @@ void GfxNode::Remove(GfxObjP obj) node_vector_.erase(it); } } +using boost::bind; +void GfxNode::RemoveAll() +{ + GfxNodeVector v=node_vector_; + node_vector_.clear(); + for (GfxNodeVector::iterator i=v.begin(), e=v.end(); i!=e; ++i) { + if (GfxObjP o=dyn_cast<GfxObj>(*i)) { + Scene::Instance().NotifyObservers(bind(&SceneObserver::NodeRemoved, _1, o)); + } + } +} void GfxNode::Add(GfxNodeP node) { diff --git a/modules/gfx/src/gfx_node.hh b/modules/gfx/src/gfx_node.hh index 0f7ecc2d009e7071766d7e08a84141a722f2c9cd..c91df438b41fe91a92bc910126c8534a5eb2acc6 100644 --- a/modules/gfx/src/gfx_node.hh +++ b/modules/gfx/src/gfx_node.hh @@ -68,6 +68,8 @@ class DLLEXPORT_OST_GFX GfxNode: public boost::enable_shared_from_this<GfxNode> // return name String GetName() const; + // remove all child nodes + void RemoveAll(); // change name void Rename(const String& name); diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc index 46af476261dc78f9552f4ec9f166669ec2fdbb7c..715d5ba211bd42e3b2a1c7fc9a7bf43e0fac7a96 100644 --- a/modules/gfx/src/scene.cc +++ b/modules/gfx/src/scene.cc @@ -607,6 +607,12 @@ void Scene::Remove(const GfxNodeP& go) this->RequestRedraw(); } +void Scene::RemoveAll() +{ + root_node_->RemoveAll(); + this->RequestRedraw(); +} + void Scene::Remove(const String& name) { FindNode fn(name); diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh index d86e46a6a6d9653f6cc95256714fff4331b61cfc..f4763be55f690af3cf525dfe427162118d67588e 100644 --- a/modules/gfx/src/scene.hh +++ b/modules/gfx/src/scene.hh @@ -281,6 +281,10 @@ class DLLEXPORT_OST_GFX Scene { void Remove(const GfxNodeP& go); /// remove graphical object from the scene void Remove(const String& name); + + /// \brief remove all objects from the scene + void RemoveAll(); + /// \brief rename an existing graphical object /// defunct for now bool Rename(const String& old_name, const String& new_name);