diff --git a/modules/gfx/pymod/export_entity.cc b/modules/gfx/pymod/export_entity.cc index 4e555d2b8324a831ad6c5b557c4581f6fd614769..f12b54c881f19dbda61c7d6b88f2c13e24e8f4ea 100644 --- a/modules/gfx/pymod/export_entity.cc +++ b/modules/gfx/pymod/export_entity.cc @@ -238,7 +238,7 @@ void export_Entity() &Entity::SetSelection) .def("GetView", &Entity::GetView) .def("GetRenderModeName", &Entity::GetRenderModeName) - .def("GetLoadedRenderModes", &Entity::GetLoadedRenderModes) + .def("GetNotEmptyRenderModes", &Entity::GetNotEmptyRenderModes) .def("SetRenderMode", set_rm1, arg("keep")=false) .def("SetRenderMode", set_rm2) .def("SetEnableRenderMode", &Entity::SetEnableRenderMode) diff --git a/modules/gfx/src/entity.cc b/modules/gfx/src/entity.cc index 5f5695de222568b0996ac63a111fa7d52b64a81e..a352ad32d3aa016a5d53390de5a6893d3196375b 100644 --- a/modules/gfx/src/entity.cc +++ b/modules/gfx/src/entity.cc @@ -534,7 +534,7 @@ void Entity::ApplyRenderOptions(RenderMode::Type render_mode, void Entity::OptionsChanged(RenderMode::Type render_mode) { - impl::EntityRenderer* entity_renderer=this->GetOrCreateRenderer(render_mode_); + impl::EntityRenderer* entity_renderer=this->GetOrCreateRenderer(render_mode); entity_renderer->RenderOptionsChanged(); FlagRebuild(); Scene::Instance().ObjectChanged(this->GetName()); @@ -542,7 +542,6 @@ void Entity::OptionsChanged(RenderMode::Type render_mode) void Entity::OnRenderModeChange() { - GfxObj::OnRenderModeChange(); for (RendererMap::iterator i=renderer_.begin(), e=renderer_.end(); i!=e; ++i) { i->second->ClearViews(); @@ -559,6 +558,7 @@ void Entity::OnRenderModeChange() } this->ReapplyColorOps(); this->FlagRebuild(); + GfxObj::OnRenderModeChange(); } const String Entity::GetRenderModeName(RenderMode::Type mode){ @@ -592,11 +592,13 @@ bool Entity::IsRenderModeEnabled(RenderMode::Type mode){ } -RenderModeTypes Entity::GetLoadedRenderModes(){ +RenderModeTypes Entity::GetNotEmptyRenderModes(){ std::vector<RenderMode::Type> render_modes; for (RendererMap::iterator i=renderer_.begin(), e=renderer_.end(); i!=e; ++i) { - render_modes.push_back(i->first); + if(i->second->HasDataToRender()){ + render_modes.push_back(i->first); + } } return render_modes; } diff --git a/modules/gfx/src/entity.hh b/modules/gfx/src/entity.hh index 5a62719aece00d9721ebf2eb91cf14e4420d03c7..6a84f8c9ed5432d37ca90422e10dacd9d5b3b6f2 100644 --- a/modules/gfx/src/entity.hh +++ b/modules/gfx/src/entity.hh @@ -124,7 +124,7 @@ public: bool IsRenderModeEnabled(RenderMode::Type mode); - RenderModeTypes GetLoadedRenderModes(); + RenderModeTypes GetNotEmptyRenderModes(); void SetRenderMode(RenderMode::Type mode, const mol::EntityView& view, bool keep=false); diff --git a/modules/gui/src/scene_win/render_modes_node.cc b/modules/gui/src/scene_win/render_modes_node.cc index 434d0f3b068ff066776cc6e43c735073bef9e0ea..02cfae68a3803a0c02c85f942a5af4197be8f046 100644 --- a/modules/gui/src/scene_win/render_modes_node.cc +++ b/modules/gui/src/scene_win/render_modes_node.cc @@ -47,14 +47,28 @@ void RenderModesNode::RenderModeChanged(){ void RenderModesNode::Update(){ SceneWinModel* model = GostyApp::Instance()->GetSceneWin()->GetModel(); gfx::EntityP entity = boost::dynamic_pointer_cast<gfx::Entity>(this->GetGfxNode()); - gfx::RenderModeTypes render_modes = entity->GetLoadedRenderModes(); + gfx::RenderModeTypes render_modes = entity->GetNotEmptyRenderModes(); for(unsigned int i=0; i<render_modes.size();i++){ if(!render_types_.contains(render_modes[i])){ RenderModeNode* node = new RenderModeNode(entity, render_modes[i],this); model->AddNode(this, node); - render_types_.insert(render_modes[i]); + render_types_.insert(render_modes[i],node); } } + QSet<gfx::RenderMode::Type> types_to_delete; + QMap<gfx::RenderMode::Type,RenderModeNode*>::iterator type; + for (type = render_types_.begin(); type != render_types_.end(); ++type){ + if(find(render_modes.begin(), render_modes.end(), type.key()) == render_modes.end()){ + model->RemoveNode(type.value()); + types_to_delete.insert(type.key()); + } + } + + QSet<gfx::RenderMode::Type>::iterator to_delete; + for(to_delete = types_to_delete.begin(); to_delete != types_to_delete.end(); ++to_delete){ + render_types_.remove(*to_delete); + } + } gfx::GfxNodeP RenderModesNode::GetGfxNode(){ diff --git a/modules/gui/src/scene_win/render_modes_node.hh b/modules/gui/src/scene_win/render_modes_node.hh index 6fc631ea9312a1dda0b4449994884557e29bc1df..691f0d094094d2213f5973f7021cc3514f21e12b 100644 --- a/modules/gui/src/scene_win/render_modes_node.hh +++ b/modules/gui/src/scene_win/render_modes_node.hh @@ -34,6 +34,8 @@ #include <ost/gui/module_config.hh> #include <ost/gui/scene_win/label_node.hh> +#include "render_mode_node.hh" + /* Author: Stefan Scheuber */ @@ -52,7 +54,7 @@ private: void Update(); gfx::GfxNodeP node_; - QSet<gfx::RenderMode::Type> render_types_; + QMap<gfx::RenderMode::Type,RenderModeNode*> render_types_; }; }} diff --git a/modules/gui/src/scene_win/scene_win_model.cc b/modules/gui/src/scene_win/scene_win_model.cc index e65b75379cd95d44e55417e26fe59085dd7df15c..c08830f6db6a2a3bbc13b40fdea607f3f8268a38 100644 --- a/modules/gui/src/scene_win/scene_win_model.cc +++ b/modules/gui/src/scene_win/scene_win_model.cc @@ -220,7 +220,8 @@ SceneNode* SceneWinModel::GetItem(const QModelIndex &index) const bool SceneWinModel::AddNode(SceneNode* parent, SceneNode* child){ QModelIndex parent_index = GetIndexOf(parent); if(parent_index.isValid()){ - this->beginInsertRows(parent_index,0,0); + int row = parent->GetChildCount(); + this->beginInsertRows(parent_index,row,row); parent->AddChild(child); this->endInsertRows(); return true; @@ -228,6 +229,21 @@ bool SceneWinModel::AddNode(SceneNode* parent, SceneNode* child){ return false; } +bool SceneWinModel::RemoveNode(SceneNode* node){ + QModelIndex index = GetIndexOf(node); + SceneNode* parent = node->GetParent(); + if(parent && index.isValid()){ + QModelIndex parent_index = GetIndexOf(parent); + int row = node->GetRow(); + this->beginRemoveRows(parent_index,row,row); + parent->RemoveChild(node); + this->endRemoveRows(); + return true; + } + return false; +} + + void SceneWinModel::AttachRenderModeObserver(RenderModesNode* node){ render_observers_.insert(node->GetGfxNode(),node); } diff --git a/modules/gui/src/scene_win/scene_win_model.hh b/modules/gui/src/scene_win/scene_win_model.hh index b0a29dfe5a384350de4a338ed836e9792a9dd4e9..258e798bdbb443df850a2e998ae2082b1953bb71 100644 --- a/modules/gui/src/scene_win/scene_win_model.hh +++ b/modules/gui/src/scene_win/scene_win_model.hh @@ -51,6 +51,7 @@ public: virtual void Update(); bool AddNode(SceneNode* parent, SceneNode* child); + bool RemoveNode(SceneNode* node); void AttachRenderModeObserver(RenderModesNode* node); void DetachRenderModeObserver(RenderModesNode* node);