OpenWalnut  1.3.1
WROIManager.cpp
1 //---------------------------------------------------------------------------
2 //
3 // Project: OpenWalnut ( http://www.openwalnut.org )
4 //
5 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
6 // For more information see http://www.openwalnut.org/copying
7 //
8 // This file is part of OpenWalnut.
9 //
10 // OpenWalnut is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // OpenWalnut is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public License
21 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
22 //
23 //---------------------------------------------------------------------------
24 
25 #include <list>
26 #include <vector>
27 
28 #include "../common/WAssert.h"
29 
30 #include "../graphicsEngine/WGraphicsEngine.h"
31 
32 #include "WROIManager.h"
33 
35 {
36  m_properties = boost::shared_ptr< WProperties >( new WProperties( "Properties", "Module's properties" ) );
37  m_dirty = m_properties->addProperty( "dirty", "dirty flag", true );
38 }
39 
41 {
42 }
43 
44 void WROIManager::addRoi( osg::ref_ptr< WROI > newRoi )
45 {
46  // create new branch
47  boost::shared_ptr< WRMBranch > newBranch = boost::shared_ptr< WRMBranch >( new WRMBranch( shared_from_this() ) );
48  // add branch to list
49  m_branches.push_back( newBranch );
50  // add roi to branch
51  newBranch->addRoi( newRoi );
52 
53  for( std::list< boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > > >::iterator iter = m_addNotifiers.begin();
54  iter != m_addNotifiers.end(); ++iter )
55  {
56  ( **iter )( newRoi );
57  }
58 }
59 
60 void WROIManager::addRoi( osg::ref_ptr< WROI > newRoi, osg::ref_ptr< WROI > parentRoi )
61 {
62  // find branch
63  boost::shared_ptr< WRMBranch > branch;
64  for( std::list< boost::shared_ptr< WRMBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
65  {
66  if( ( *iter ).get()->contains( parentRoi ) )
67  {
68  branch = ( *iter );
69  }
70  }
71  // add roi to branch
72  branch->addRoi( newRoi );
73 
74  for( std::list< boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > > >::iterator iter = m_addNotifiers.begin();
75  iter != m_addNotifiers.end(); ++iter )
76  {
77  ( **iter )( newRoi );
78  }
79 }
80 
81 void WROIManager::removeRoi( osg::ref_ptr< WROI > roi )
82 {
83  WGraphicsEngine::getGraphicsEngine()->getScene()->remove( roi );
84 
85  for( std::list< boost::shared_ptr< WRMBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
86  {
87  ( *iter )->removeRoi( roi );
88 
89  if( ( *iter )->empty() )
90  {
91  for( std::list< boost::shared_ptr< boost::function< void( boost::shared_ptr< WRMBranch > ) > > >::iterator iter2
92  = m_removeBranchNotifiers.begin();
93  iter2 != m_removeBranchNotifiers.end();
94  ++iter2 )
95  {
96  ( **iter2 )( *iter );
97  }
98  m_branches.erase( iter );
99  break;
100  }
101  }
102  setDirty();
103 
104  for( std::list< boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > > >::iterator iter
105  = m_removeNotifiers.begin();
106  iter != m_removeNotifiers.end();
107  ++iter )
108  {
109  ( **iter )( roi );
110  }
111 }
112 
113 void WROIManager::removeBranch( osg::ref_ptr< WROI > roi )
114 {
115  for( std::list< boost::shared_ptr< WRMBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
116  {
117  if( roi == ( *iter )->getFirstRoi() )
118  {
119  ( *iter )->removeAllRois();
120  }
121 
122  if( ( *iter )->empty() )
123  {
124  for( std::list< boost::shared_ptr< boost::function< void( boost::shared_ptr< WRMBranch > ) > > >::iterator iter2
125  = m_removeBranchNotifiers.begin();
126  iter2 != m_removeBranchNotifiers.end();
127  ++iter2 )
128  {
129  ( **iter2 )( *iter );
130  }
131  m_branches.erase( iter );
132  break;
133  }
134  }
135  setDirty();
136 }
137 
138 boost::shared_ptr< WRMBranch> WROIManager::getBranch( osg::ref_ptr< WROI > roi )
139 {
140  boost::shared_ptr< WRMBranch> branch;
141 
142  for( std::list< boost::shared_ptr< WRMBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
143  {
144  if( ( *iter )->contains( roi ) )
145  {
146  branch = ( *iter );
147  }
148  }
149  return branch;
150 }
151 
153 {
154  m_dirty->set( true );
155 }
156 
157 void WROIManager::addAddNotifier( boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > > notifier )
158 {
159  boost::unique_lock< boost::shared_mutex > lock;
160  lock = boost::unique_lock< boost::shared_mutex >( m_associatedNotifiersLock );
161  m_addNotifiers.push_back( notifier );
162  lock.unlock();
163 }
164 
165 void WROIManager::removeAddNotifier( boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > > notifier )
166 {
167  boost::unique_lock< boost::shared_mutex > lock;
168  lock = boost::unique_lock< boost::shared_mutex >( m_associatedNotifiersLock );
169  std::list< boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > > >::iterator it;
170  it = std::find( m_addNotifiers.begin(), m_addNotifiers.end(), notifier );
171  if( it != m_addNotifiers.end() )
172  {
173  m_addNotifiers.erase( it );
174  }
175  lock.unlock();
176 }
177 
178 void WROIManager::addRemoveNotifier( boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > > notifier )
179 {
180  boost::unique_lock< boost::shared_mutex > lock;
181  lock = boost::unique_lock< boost::shared_mutex >( m_associatedNotifiersLock );
182  m_removeNotifiers.push_back( notifier );
183  lock.unlock();
184 }
185 
186 void WROIManager::removeRemoveNotifier( boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > > notifier )
187 {
188  boost::unique_lock< boost::shared_mutex > lock;
189  lock = boost::unique_lock< boost::shared_mutex >( m_associatedNotifiersLock );
190  std::list< boost::shared_ptr< boost::function< void( osg::ref_ptr< WROI > ) > > >::iterator it;
191  it = std::find( m_removeNotifiers.begin(), m_removeNotifiers.end(), notifier );
192  if( it != m_removeNotifiers.end() )
193  {
194  m_removeNotifiers.erase( it );
195  }
196  lock.unlock();
197 }
198 
199 void WROIManager::addRemoveBranchNotifier( boost::shared_ptr< boost::function< void( boost::shared_ptr< WRMBranch > ) > > notifier )
200 {
201  boost::unique_lock< boost::shared_mutex > lock;
202  lock = boost::unique_lock< boost::shared_mutex >( m_associatedNotifiersLock );
203  m_removeBranchNotifiers.push_back( notifier );
204  lock.unlock();
205 }
206 
207 void WROIManager::removeRemoveBranchNotifier( boost::shared_ptr< boost::function< void( boost::shared_ptr< WRMBranch > ) > > notifier )
208 {
209  boost::unique_lock< boost::shared_mutex > lock;
210  lock = boost::unique_lock< boost::shared_mutex >( m_associatedNotifiersLock );
211  std::list< boost::shared_ptr< boost::function< void( boost::shared_ptr< WRMBranch > ) > > >::iterator it;
212  it = std::find( m_removeBranchNotifiers.begin(), m_removeBranchNotifiers.end(), notifier );
213  if( it != m_removeBranchNotifiers.end() )
214  {
215  m_removeBranchNotifiers.erase( it );
216  }
217  lock.unlock();
218 }
219 
220 void WROIManager::setSelectedRoi( osg::ref_ptr< WROI > roi )
221 {
222  m_selectedRoi = roi;
223 }
224 
225 osg::ref_ptr< WROI > WROIManager::getSelectedRoi()
226 {
227  return m_selectedRoi;
228 }
229 
230 std::vector< osg::ref_ptr< WROI > > WROIManager::getRois()
231 {
232  std::vector< osg::ref_ptr< WROI > > returnVec;
233 
234  for( std::list< boost::shared_ptr< WRMBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
235  {
236  ( *iter )->getRois( returnVec );
237  }
238  return returnVec;
239 }