OpenWalnut  1.4.0
WGENodeMaskCallback.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 "WGENodeMaskCallback.h"
26 
27 WGENodeMaskCallback::WGENodeMaskCallback( boost::shared_ptr< WBoolFlag > flag ):
28  osg::NodeCallback(),
29  m_flag( flag )
30 {
31  // get change signal
32  m_connection = m_flag->getValueChangeCondition()->subscribeSignal(
33  boost::bind( &WGENodeMaskCallback::activate, this )
34  );
35 }
36 
38 {
39  // cleanup
40  m_connection.disconnect();
41 }
42 
44 {
45  if( m_flag->get() ) // only handle activation here
46  {
48  }
49 }
50 
51 void WGENodeMaskCallback::operator()( osg::Node* node, osg::NodeVisitor* nv )
52 {
53  // Deactivate the node
54  if( !m_flag->get() ) // only handle deactivation here
55  {
56  node->setNodeMask( 0x0 );
57 
58  // NOTE: this also deactivates the callback. So reactivating the node is done in a separate method
59  // connect the flag's callback to the signal, only this way, we can ensure the reactivation of a node without saving a pointer to it.
60  m_reactivateConnection = m_reactivateSignal.connect( boost::bind( &osg::Node::setNodeMask, node, 0xFFFFFFFF ) );
61  }
62 
63  traverse( node, nv );
64 }
65