diff --git a/modules/gfx/src/entity.cc b/modules/gfx/src/entity.cc index c14e4e16024055a383ae500611f58ae9d77e6f95..18581ab3da301d3af70e189b2e137f18bf1b1fb1 100644 --- a/modules/gfx/src/entity.cc +++ b/modules/gfx/src/entity.cc @@ -135,6 +135,10 @@ Entity::Entity(const String& name, } +Entity::~Entity() +{ +} + impl::EntityRenderer* Entity::GetOrCreateRenderer(RenderMode::Type rm) { RendererMap::iterator rit = renderer_.find(rm); @@ -186,11 +190,11 @@ void Entity::init(RenderMode::Type rm) render_mode_=rm; trace_.ResetView(this->GetView()); sel_=this->GetView().CreateEmptyView(); - impl::EntityRenderer* r=this->GetOrCreateRenderer(rm); - if(!r) return; - r->AddView(this->GetView()); - r->UpdateViews(); + impl::EntityRenderer* renderer=this->GetOrCreateRenderer(rm); + + renderer->AddView(this->GetView()); + renderer->UpdateViews(); set_static_max_rad(); Rebuild(); @@ -297,13 +301,17 @@ bool Entity::UpdateIfNeeded() const for (RendererMap::iterator i=renderer_.begin(), e=renderer_.end(); i!=e; ++i) { EntityRenderer* renderer =i->second; - if (renderer->IsEnabled() && renderer->HasDataToRender()) { - if (renderer->IsDirty()) { - renderer->PrepareRendering(); - updated=true; - } - renderer->VA().SetOpacity(opacity_); + if (!renderer->IsEnabled()) + continue; + renderer->UpdateViews(); + if (!renderer->HasDataToRender()) + continue; + + if (renderer->IsDirty()) { + renderer->PrepareRendering(); + updated=true; } + renderer->VA().SetOpacity(opacity_); } if (updated) { this->CacheBoundingBox(); @@ -1135,22 +1143,23 @@ bool Entity::GetSeqHack() const void Entity::do_update_view() const { - // also signals an update in positions - if (update_view_) { - update_view_=false; - cached_view_=qv_.GetEntityView(); - trace_.ResetView(cached_view_); - for (RendererMap::iterator i=renderer_.begin(), - e=renderer_.end(); i!=e; ++i) { - impl::EntityRenderer* r=i->second; - if (r->IsEnabled() && r->HasDataToRender()) { - r->ClearViews(); - r->AddView(cached_view_); - r->UpdateViews(); - r->FlagPositionsDirty(); - r->PrepareRendering(); - } - } + if (!update_view_) + return; + update_view_=false; + cached_view_=qv_.GetEntityView(); + trace_.ResetView(cached_view_); + for (RendererMap::iterator + i=renderer_.begin(), e=renderer_.end(); i!=e; ++i) { + impl::EntityRenderer* renderer=i->second; + if (!renderer->IsEnabled()) + continue; + renderer->ClearViews(); + renderer->AddView(cached_view_); + renderer->UpdateViews(); + if (!renderer->HasDataToRender()) + continue; + renderer->FlagPositionsDirty(); + renderer->PrepareRendering(); } } diff --git a/modules/gfx/src/entity.hh b/modules/gfx/src/entity.hh index a9687c81c6e5d2f7c8da4b3ac67210eb7285fc3d..cddf17d990da1d87b445b177780cde120bacbeb3 100644 --- a/modules/gfx/src/entity.hh +++ b/modules/gfx/src/entity.hh @@ -89,6 +89,7 @@ public: Entity(const String& name, RenderMode::Type m, const mol::EntityView& ev); + virtual ~Entity(); virtual geom::AlignedCuboid GetBoundingBox(bool use_tf=false) const; diff --git a/modules/gfx/src/entity_fw.hh b/modules/gfx/src/entity_fw.hh index 5e00ae29cd7ffb15b3c67642cc176d341f6d1586..192ad391322da684abb6590365c8e2b89530ea56 100644 --- a/modules/gfx/src/entity_fw.hh +++ b/modules/gfx/src/entity_fw.hh @@ -20,11 +20,13 @@ #define OST_GFX_ENTITY_FW_HH #include <boost/shared_ptr.hpp> +#include <boost/weak_ptr.hpp> namespace ost { namespace gfx { class Entity; typedef boost::shared_ptr<Entity> EntityP; +typedef boost::weak_ptr<Entity> EntityW; }} diff --git a/modules/gfx/src/gfx_node.cc b/modules/gfx/src/gfx_node.cc index 59b44d162d991620c77bd58ad300f49f5d3fc8de..657068c9ef836eeb73db31a956fa627d1b1e321a 100644 --- a/modules/gfx/src/gfx_node.cc +++ b/modules/gfx/src/gfx_node.cc @@ -33,7 +33,8 @@ GfxNode::GfxNode(const String& name): {} GfxNode::~GfxNode() -{} +{ +} GfxNode::GfxNode(const GfxNode& o) {} diff --git a/modules/gfx/src/render_options/render_options.cc b/modules/gfx/src/render_options/render_options.cc index 660ffa89428a5bcbf5835e4db2f5d3f33fab4c13..5d8e7a72c5a1c11c034d1c2ac4e4a83667d8070f 100644 --- a/modules/gfx/src/render_options/render_options.cc +++ b/modules/gfx/src/render_options/render_options.cc @@ -30,32 +30,31 @@ RenderOptions::RenderOptions(){} bool RenderOptions::AddObserver(EntityP entity) { - if((std::find( this->observers_.begin(), this->observers_.end(), entity )) == this->observers_.end()) - { - this->observers_.push_back( entity ); - return true; + for (EntityWObservers::const_iterator + i = observers_.begin(), e = observers_.end(); i != e; ++i) { + if (i->lock() == entity) + return false; } - return false; + observers_.push_back(entity); + return true; } bool RenderOptions::RemoveObserver(EntityP entity) { - EntityPObservers::iterator found = std::find( this->observers_.begin(), this->observers_.end(), entity); - if( found != this->observers_.end() ){ - - this->observers_.erase(found); - return true; + for (EntityWObservers::iterator + i = observers_.begin(), e = observers_.end(); i != e; ++i) { + if (i->lock() == entity) + observers_.erase(i); + return true; } return false; } void RenderOptions::NotifyStateChange() { - EntityPObservers::const_iterator observers_it = this->observers_.begin() ; - while( observers_it != this->observers_.end() ) - { - ( *observers_it )->OptionsChanged(this->GetRenderMode()) ; - observers_it++; + for (EntityWObservers::iterator + i = observers_.begin(), e = observers_.end(); i != e; ++i) { + i->lock()->OptionsChanged(this->GetRenderMode()); } } diff --git a/modules/gfx/src/render_options/render_options.hh b/modules/gfx/src/render_options/render_options.hh index 0c2515bdb6ec8aa830d7dca2023deeac0e310858..ce9dfc60209876eea3a142f08599022c86e041a2 100644 --- a/modules/gfx/src/render_options/render_options.hh +++ b/modules/gfx/src/render_options/render_options.hh @@ -51,8 +51,8 @@ public: void NotifyStateChange(); private: - typedef std::vector< EntityP > EntityPObservers; - EntityPObservers observers_; + typedef std::vector< EntityW > EntityWObservers; + EntityWObservers observers_; }; diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc index 5c96c47ad84bdbd9cc1198c0531f4669567e2a9a..e9025cd39f7a5f6c9b4235bf995faf77442f287b 100644 --- a/modules/gfx/src/scene.cc +++ b/modules/gfx/src/scene.cc @@ -1043,6 +1043,7 @@ void Scene::Remove(const GfxNodeP& go) if(!go) return; root_node_->Remove(go); this->NotifyObservers(bind(&SceneObserver::NodeRemoved, _1,go)); + std::cerr << "Scene::Remove(node):" << go.use_count() << std::endl; } void Scene::RemoveAll() @@ -1058,7 +1059,7 @@ void Scene::Remove(const String& name) if(fn.node) { root_node_->Remove(name); if(GfxObjP go = dyn_cast<GfxObj>(fn.node)) { - this->NotifyObservers(bind(&SceneObserver::NodeRemoved, _1,go)); + this->NotifyObservers(bind(&SceneObserver::NodeRemoved, _1, go)); } } } diff --git a/modules/gui/src/scene_selection.cc b/modules/gui/src/scene_selection.cc index 2faa79d6c09bbe1c5e3092126cf42a2acbe03bfb..be66a839918dcaa10d6f71db4bcc99ff989f89b6 100644 --- a/modules/gui/src/scene_selection.cc +++ b/modules/gui/src/scene_selection.cc @@ -103,6 +103,7 @@ void SceneSelection::CenterOnObjects() { geom::AlignedCuboid pair = obj->GetBoundingBox(); min = geom::Min(min, pair.GetMin()); max = geom::Max(max, pair.GetMax()); + std::cerr << obj->GetName() << " " << min << " " << max << std::endl; changed=true; } } diff --git a/modules/gui/src/scene_win/context_menu.cc b/modules/gui/src/scene_win/context_menu.cc index 370800556aa052a3f11460a4c0578dfb2935c157..70a8c2bdcd088308fa5073fa6a8093df7fb9fbf6 100644 --- a/modules/gui/src/scene_win/context_menu.cc +++ b/modules/gui/src/scene_win/context_menu.cc @@ -199,16 +199,15 @@ void ContextMenu::ShowMenu(const QPoint& pos) flags &= ~SINGLE; } QMenu* menu = new QMenu(); - QMapIterator<QAction*, ContextActionTypes> i(actions_); + QVectorIterator<std::pair<QAction*, ContextActionTypes> > i(actions_); flags ^= NOT_VISIBLE; flags ^= NOT_HIDDEN; while (i.hasNext()) { - i.next(); - if (i.value() == (i.value() & flags)){ - menu->addAction(i.key()); - } + const std::pair<QAction*, ContextActionTypes>& value = i.next(); + if (value.second == (value.second & flags)){ + menu->addAction(value.first); + } } - if(! menu->actions().empty()){ menu->popup(pos); } @@ -216,7 +215,7 @@ void ContextMenu::ShowMenu(const QPoint& pos) } void ContextMenu::AddAction(QAction* action,ContextActionTypes type){ - actions_[action] = type; + actions_.push_back(std::make_pair(action, type)); } void ContextMenu::AddView(){ diff --git a/modules/gui/src/scene_win/context_menu.hh b/modules/gui/src/scene_win/context_menu.hh index c145164d7c3303ccca24d447497ffb465252070b..56ca0929a2693f65756584341463c24dfa09f26f 100644 --- a/modules/gui/src/scene_win/context_menu.hh +++ b/modules/gui/src/scene_win/context_menu.hh @@ -28,7 +28,7 @@ #include <ost/gui/scene_win/scene_win_model.hh> #include <QFlags> -#include <QMap> +#include <QVector> #include <QAbstractItemModel> #include <QTreeView> namespace ost { namespace gui { @@ -53,6 +53,7 @@ enum ContextActionType MAP_DSAMPLED_AVAIL=0x4000 #endif }; + Q_DECLARE_FLAGS(ContextActionTypes, ContextActionType) @@ -73,7 +74,7 @@ private slots: void DeleteView(); private: - QMap<QAction*, ContextActionTypes> actions_; + QVector<std::pair<QAction*, ContextActionTypes> > actions_; QTreeView* view_; SceneWinModel* model_; diff --git a/modules/gui/src/scene_win/entity_node.cc b/modules/gui/src/scene_win/entity_node.cc index 02dc97c54f8396bc2e986b208c727a4a52144b43..1fa74f165a1318011fb6ede4708485723469fdc7 100644 --- a/modules/gui/src/scene_win/entity_node.cc +++ b/modules/gui/src/scene_win/entity_node.cc @@ -72,7 +72,9 @@ EntityNode::EntityNode(gfx::EntityP& entity, SceneNode* parent): custom_view_ = new LabelNode("Custom Views", this); model->AddNode(this, custom_view_); - node = new EntityPartNode("Full View", entity, mol::QueryViewWrapper(entity->GetView()), this); + node = new EntityPartNode("Full View", entity, + mol::QueryViewWrapper(entity->GetView()), + this); model->AddNode(this, node); node = new CurrentSelectionNode(entity, this); diff --git a/modules/gui/src/scene_win/gfx_scene_node.cc b/modules/gui/src/scene_win/gfx_scene_node.cc index 2b7255f25c663152d5d6eb1e3a247b99bddf131b..ca06e19c844a54e5fc36bd75c627d0cd9d042d5c 100644 --- a/modules/gui/src/scene_win/gfx_scene_node.cc +++ b/modules/gui/src/scene_win/gfx_scene_node.cc @@ -25,12 +25,15 @@ #include <QFont> namespace ost { namespace gui { -GfxSceneNode::GfxSceneNode(gfx::GfxNodeP gfx_node, SceneNode* parent):SceneNode(parent),gfx_node_(gfx_node){} +GfxSceneNode::GfxSceneNode(gfx::GfxNodeP gfx_node, SceneNode* parent): + SceneNode(parent), gfx_node_(gfx_node) { } -GfxSceneNode::GfxSceneNode(gfx::GfxNodeP gfx_node, QObject* parent):SceneNode(parent),gfx_node_(gfx_node){} +GfxSceneNode::GfxSceneNode(gfx::GfxNodeP gfx_node, QObject* parent): + SceneNode(parent), gfx_node_(gfx_node) { } QVariant GfxSceneNode::GetData(int column, int role){ - if(column<0 || column > 2)return QVariant(); + if (column<0 || column > 2) + return QVariant(); if (role==Qt::CheckStateRole && column==0) { return QVariant(gfx_node_->IsVisible() ? Qt::Checked : Qt::Unchecked); @@ -52,7 +55,8 @@ int GfxSceneNode::GetColumnCount() const{ return 2; } -bool GfxSceneNode::SetData(int column, const QVariant& value, int role){ +bool GfxSceneNode::SetData(int column, const QVariant& value, int role) +{ if (column==0 && role == Qt::CheckStateRole) { if (value.toBool()) { this->GetParent()->SetData(0,value,Qt::CheckStateRole); diff --git a/modules/gui/src/scene_win/label_node.cc b/modules/gui/src/scene_win/label_node.cc index f6d2d72f549b124ca55395fbbe0f97489334ea4a..f71c832680aa5b0a8f601d61173b4f4aa6befbbe 100644 --- a/modules/gui/src/scene_win/label_node.cc +++ b/modules/gui/src/scene_win/label_node.cc @@ -52,7 +52,7 @@ bool LabelNode::SetData(int column, const QVariant& value, int role){ if (value.toBool()) { this->GetParent()->SetData(0,value,Qt::CheckStateRole); } else { - for(int i = 0; i<this->GetChildCount(); i++){ + for(int i = 0; i<this->children().size(); i++){ this->GetChild(i)->SetData(0,value,Qt::CheckStateRole); } } diff --git a/modules/gui/src/scene_win/scene_node.cc b/modules/gui/src/scene_win/scene_node.cc index 347b529a59f6d5ec8a03e3ca91fb91de231a455d..70818d1acc3d606e3650983597f234da90bacd2d 100644 --- a/modules/gui/src/scene_win/scene_node.cc +++ b/modules/gui/src/scene_win/scene_node.cc @@ -29,27 +29,15 @@ SceneNode::SceneNode(QObject* parent):QObject(parent){ parent_ = NULL; } -SceneNode* SceneNode::GetParent() const{ - return parent_; -} - -void SceneNode::AddChild(SceneNode* node){ - nodes_.append(node); -} - -void SceneNode::RemoveChild(SceneNode* node){ - nodes_.removeAll(node); -} - int SceneNode::GetChildRow(const SceneNode* node) const{ - for(int i = 0; i < nodes_.size(); i++){ - if(nodes_[i] == node)return i; + for(int i = 0; i < this->children().size(); i++){ + if (this->children()[i] == node) + return i; } return -1; } -int SceneNode::GetChildCount() const{ - return nodes_.size(); +SceneNode::~SceneNode() { } int SceneNode::GetRow() const{ @@ -59,26 +47,13 @@ int SceneNode::GetRow() const{ return 0; } -bool SceneNode::IsParent(SceneNode* node) const{ - if(node == this)return true; - for(int i = 0; i< nodes_.size(); i++){ - if(nodes_[i]==node){ - return true; - } - if(nodes_[i]->IsParent(node)) - return true; - } - return false; -} - -SceneNode* SceneNode::GetChild(int row) const{ - if(row>=0 && row<nodes_.size()){ - return nodes_[row]; - } - return NULL; +SceneNode* SceneNode::GetChild(int row) const +{ + return dynamic_cast<SceneNode*>(this->children()[row]); } -QVariant SceneNode::GetData(int column, int role){ +QVariant SceneNode::GetData(int column, int role) +{ return QVariant(); } diff --git a/modules/gui/src/scene_win/scene_node.hh b/modules/gui/src/scene_win/scene_node.hh index f701e67b5508d7b3486b8d0cb05dc912803a3258..6b183788d5e336f97e9e44e257e752d3f98905c0 100644 --- a/modules/gui/src/scene_win/scene_node.hh +++ b/modules/gui/src/scene_win/scene_node.hh @@ -39,13 +39,13 @@ class DLLEXPORT_OST_GUI SceneNode : public QObject { public: SceneNode(SceneNode* node_parent); SceneNode(QObject* parent=0); + virtual ~SceneNode(); - SceneNode* GetParent() const; - virtual void AddChild(SceneNode* node); - virtual void RemoveChild(SceneNode* node); - virtual bool IsParent(SceneNode* node) const; + SceneNode* GetParent() const { return dynamic_cast<SceneNode*>(this->parent()); } + void AddChild(SceneNode* node) { + node->setParent(this); + } virtual SceneNode* GetChild(int row) const; - virtual int GetChildCount() const; virtual int GetChildRow(const SceneNode* node) const; virtual int GetRow() const; virtual QVariant GetData(int column, int role); @@ -54,7 +54,6 @@ public: virtual int GetColumnCount() const; private: SceneNode* parent_; - SceneNodeList nodes_; }; }} diff --git a/modules/gui/src/scene_win/scene_win_model.cc b/modules/gui/src/scene_win/scene_win_model.cc index 08cebc4491118b5656a74443be5a1c8aa1a29b7d..f712174f2e6135717348d9bfc1dfcb65d06fe681 100644 --- a/modules/gui/src/scene_win/scene_win_model.cc +++ b/modules/gui/src/scene_win/scene_win_model.cc @@ -116,12 +116,9 @@ QModelIndex SceneWinModel::index(int row, int col, { SceneNode* parent_node = GetItem(parent); - SceneNode* child_node = parent_node->GetChild(row); - if (child_node) { - return createIndex(row, col, child_node); - } else { - return QModelIndex(); - } + if (parent_node->children().size() <= row) + return QModelIndex(); + return createIndex(row, col, parent_node->GetChild(row)); } QModelIndex SceneWinModel::parent(const QModelIndex& index) const @@ -141,7 +138,7 @@ int SceneWinModel::rowCount(const QModelIndex& parent) const { SceneNode* parent_node = GetItem(parent); - return parent_node->GetChildCount(); + return parent_node->children().size(); } int SceneWinModel::columnCount(const QModelIndex& parent) const @@ -270,8 +267,8 @@ void SceneWinModel::SelectionChanged(const gfx::GfxObjP& obj, void SceneWinModel::RenderModeChanged(const gfx::GfxNodeP& node) { - if(render_observers_.contains(node)){ - render_observers_[node]->RenderModeChanged(); + if(render_observers_.contains(node.get())){ + render_observers_[node.get()]->RenderModeChanged(); } } @@ -288,7 +285,7 @@ bool SceneWinModel::AddNode(SceneNode* parent, SceneNode* child) { QModelIndex parent_index=this->GetIndexOf(parent); if(parent_index.isValid()){ - int row = parent->GetChildCount(); + int row = parent->children().size(); this->beginInsertRows(parent_index,row,row); parent->AddChild(child); this->endInsertRows(); @@ -305,8 +302,9 @@ bool SceneWinModel::RemoveNode(SceneNode* node) QModelIndex parent_index =this->GetIndexOf(parent); int row = node->GetRow(); this->beginRemoveRows(parent_index,row,row); - parent->RemoveChild(node); this->endRemoveRows(); + node->setParent(NULL); + delete node; return true; } return false; @@ -315,13 +313,13 @@ bool SceneWinModel::RemoveNode(SceneNode* node) void SceneWinModel::AttachRenderModeObserver(RenderModesNode* node) { - render_observers_.insert(node->GetGfxNode(),node); + render_observers_.insert(node->GetGfxNode().get(),node); } void SceneWinModel::DetachRenderModeObserver(RenderModesNode* node) { - if(render_observers_.contains(node->GetGfxNode())){ - render_observers_.remove(node->GetGfxNode()); + if(render_observers_.contains(node->GetGfxNode().get())){ + render_observers_.remove(node->GetGfxNode().get()); } } @@ -351,7 +349,7 @@ QModelIndex SceneWinModel::GetIndex(SceneNode* node, QModelIndex parent, if(parent.isValid()){ SceneNode* parent_node =reinterpret_cast<SceneNode*>(parent.internalPointer()); if (parent_node == node) return parent; - for (int i=parent_node->GetChildCount()-1; i>=0; --i) { + for (int i=parent_node->children().size()-1; i>=0; --i) { SceneNode* child = parent_node->GetChild(i); if(child == node){ if(column<child->GetColumnCount()) diff --git a/modules/gui/src/scene_win/scene_win_model.hh b/modules/gui/src/scene_win/scene_win_model.hh index c476b16f2c1b14d8fa5fed73546a51cd172b2f38..3382331640b0e9b74166d784cb43be15095ee349 100644 --- a/modules/gui/src/scene_win/scene_win_model.hh +++ b/modules/gui/src/scene_win/scene_win_model.hh @@ -106,7 +106,7 @@ private: SceneNode* root_node_; SceneNode* scene_node_; - QMap<gfx::GfxNodeP, RenderModesNode*> render_observers_; + QMap<gfx::GfxNode*, RenderModesNode*> render_observers_; QMap<gfx::GfxNode*, SceneNode*> node_map_; };