OpenWalnut  1.5.0dev
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 <memory>
26 
27 #include "WGENodeMaskCallback.h"
28 
29 WGENodeMaskCallback::WGENodeMaskCallback( std::shared_ptr< WBoolFlag > flag ):
30  osg::NodeCallback(),
31  m_flag( flag )
32 {
33  // get change signal
34  m_connection = m_flag->getValueChangeCondition()->subscribeSignal(
35  boost::bind( &WGENodeMaskCallback::activate, this )
36  );
37 }
38 
40 {
41  // cleanup
42  m_connection.disconnect();
43 }
44 
46 {
47  if( m_flag->get() ) // only handle activation here
48  {
50  }
51 }
52 
53 void WGENodeMaskCallback::operator()( osg::Node* node, osg::NodeVisitor* nv )
54 {
55  // Deactivate the node
56  if( !m_flag->get() ) // only handle deactivation here
57  {
58  node->setNodeMask( 0x0 );
59 
60  // NOTE: this also deactivates the callback. So reactivating the node is done in a separate method
61  // 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.
62  m_reactivateConnection = m_reactivateSignal.connect( boost::bind( &osg::Node::setNodeMask, node, 0xFFFFFFFF ) );
63  }
64 
65  traverse( node, nv );
66 }
67 
virtual ~WGENodeMaskCallback()
Destructor.
boost::signals2::connection m_connection
The subscription to the change signal of m_flag.
ReactivateSignal m_reactivateSignal
The reactivation signal.
virtual void operator()(osg::Node *node, osg::NodeVisitor *nv)
This operator gets called by OSG every update cycle.
WGENodeMaskCallback(std::shared_ptr< WBoolFlag > flag)
Creates new instance.
virtual void activate()
Gets called if m_flag changes.
std::shared_ptr< WBoolFlag > m_flag
The flag controlling the node mask.
boost::signals2::connection m_reactivateConnection
This connection gets established during the deactivation in operator() to ensure re-activation.