osg::Action Class Reference
[Action]

Action base class. More...

#include <OSGAction.h>

Inheritance diagram for osg::Action:

osg::DrawActionBase osg::IntersectAction osg::VRMLWriteAction osg::DrawAction osg::RenderActionBase osg::RenderAction

List of all members.

Public Types

enum  ResultE { Continue, Skip, Quit }
typedef ArgsCollector< Action * > FunctorArgs
typedef TypedFunctor2Base
< ResultE, CPtrRefCallArg
< CNodePtr >, FunctorArgs
Functor

Public Member Functions

virtual ~Action (void)
 Destructor.
void registerEnterFunction (const FieldContainerType &type, const Functor &func)
void registerLeaveFunction (const FieldContainerType &type, const Functor &func)
virtual ResultE apply (std::vector< NodePtr >::iterator begin, std::vector< NodePtr >::iterator end)
virtual ResultE apply (NodePtr node)
NodePtr getActNode (void)
UInt32 getNNodes (void) const
const NodePtr getNode (int index)
void addNode (NodePtr node)
void useNodeList (void)
UInt32 getTravMask (void) const
void setTravMask (UInt32 val)
bool operator< (const Action &other)
 assignment
bool operator== (const Action &other)
 equal
bool operator!= (const Action &other)
 unequal

Static Public Member Functions

static const char * getClassname (void)
static Actioncreate (void)
 create a new action
static void setPrototype (Action *proto)
static ActiongetPrototype (void)
static void registerEnterDefault (const FieldContainerType &type, const Functor &func)
static void registerLeaveDefault (const FieldContainerType &type, const Functor &func)

Protected Member Functions

 Action (void)
 Constructor.
 Action (const Action &source)
 Copy-Constructor.
ResultE callEnter (NodePtr node)
ResultE callLeave (NodePtr node)
virtual ResultE start (void)
virtual ResultE stop (ResultE res)
ResultE recurse (NodePtr node)
ResultE callNewList (void)
virtual std::vector< Functor > * getDefaultEnterFunctors (void)
virtual std::vector< Functor > * getDefaultLeaveFunctors (void)
void setActNode (NodePtr node)

Static Protected Member Functions

static ResultE _defaultEnterFunction (CNodePtr &node, Action *action)
static ResultE _defaultLeaveFunction (CNodePtr &node, Action *action)

Protected Attributes

std::vector< Functor_enterFunctors
std::vector< Functor_leaveFunctors

Private Member Functions

ResultE callStart (void)
ResultE callStop (ResultE res)
Actionoperator= (const Action &source)
 assignment

Private Attributes

NodePtr _actNode
std::vector< NodePtr > * _actList
bool _useNewList
std::vector< NodePtr_newList
UInt32 _travMask

Static Private Attributes

static char cvsid [] = "@(#)$Id: $"
static Action_prototype = NULL
static std::vector< Functor > * _defaultEnterFunctors
static std::vector< Functor > * _defaultLeaveFunctors


Detailed Description

The action base class.

Definition at line 79 of file OSGAction.h.


Member Typedef Documentation

Definition at line 95 of file OSGAction.h.

Definition at line 99 of file OSGAction.h.


Member Enumeration Documentation

Enumerator:
Continue 
Skip 
Quit 

Definition at line 87 of file OSGAction.h.

00088     {   
00089         Continue,   // continue with my children
00090         Skip,       // skip my children
00091         // really needed? Cancel, // skip my brothers, go one step up
00092         Quit        // forget it, you're done
00093     };


Constructor & Destructor Documentation

Action::~Action ( void   )  [virtual]

Definition at line 191 of file OSGAction.cpp.

00192 {
00193 }

Action::Action ( void   )  [protected]

Action::Action ( const Action source  )  [protected]

Definition at line 165 of file OSGAction.cpp.

00165                                       :
00166     _enterFunctors( source._enterFunctors ),
00167     _leaveFunctors( source._leaveFunctors ),
00168     _travMask     ( source._travMask      )
00169 {
00170 }


Member Function Documentation

static const char* osg::Action::getClassname ( void   )  [inline, static]

Reimplemented in osg::DrawAction, osg::IntersectAction, and osg::VRMLWriteAction.

Definition at line 109 of file OSGAction.h.

00109 { return "Action"; }

Action * Action::create ( void   )  [static]

Reimplemented in osg::DrawAction, osg::IntersectAction, osg::RenderAction, and osg::VRMLWriteAction.

Definition at line 176 of file OSGAction.cpp.

References _prototype, and Action().

00177 {
00178     Action * act;
00179     
00180     if ( _prototype )
00181         act = new Action( *_prototype );
00182     else
00183         act = new Action();
00184     
00185     return act;
00186 }

void Action::setPrototype ( Action proto  )  [static]

Definition at line 119 of file OSGAction.cpp.

References _prototype.

00120 {
00121     _prototype = proto;
00122 }

Action * Action::getPrototype ( void   )  [static]

Reimplemented in osg::DrawAction, osg::IntersectAction, osg::RenderAction, and osg::VRMLWriteAction.

Definition at line 124 of file OSGAction.cpp.

References _prototype.

00125 {
00126     return _prototype;
00127 }

void Action::registerEnterDefault ( const FieldContainerType type,
const Functor func 
) [static]

Reimplemented in osg::DrawAction, osg::IntersectAction, and osg::RenderAction.

Definition at line 83 of file OSGAction.cpp.

References _defaultEnterFunction(), _defaultEnterFunctors, osg::TypeBase::getId(), and osg::osgTypedFunctionFunctor2CPtrRef().

00085 {
00086     if ( ! _defaultEnterFunctors )
00087         _defaultEnterFunctors = new std::vector<Action::Functor>;
00088 
00089     while(type.getId() >= _defaultEnterFunctors->size())
00090     {
00091         _defaultEnterFunctors->push_back( 
00092             osgTypedFunctionFunctor2CPtrRef<
00093                 ResultE, 
00094                 CNodePtr,
00095                 Action *                   >(&Action::_defaultEnterFunction));
00096     }
00097     
00098     (*_defaultEnterFunctors)[ type.getId() ] = func;
00099 }

void Action::registerLeaveDefault ( const FieldContainerType type,
const Functor func 
) [static]

Reimplemented in osg::DrawAction, osg::IntersectAction, and osg::RenderAction.

Definition at line 101 of file OSGAction.cpp.

References _defaultLeaveFunction(), _defaultLeaveFunctors, osg::TypeBase::getId(), and osg::osgTypedFunctionFunctor2CPtrRef().

00103 {
00104     if ( ! _defaultLeaveFunctors )
00105         _defaultLeaveFunctors = new std::vector<Action::Functor>;
00106 
00107     while(type.getId() >= _defaultLeaveFunctors->size())
00108     {
00109         _defaultLeaveFunctors->push_back( 
00110             osgTypedFunctionFunctor2CPtrRef<
00111                 ResultE, 
00112                 CNodePtr,
00113                 Action *                   >(&Action::_defaultLeaveFunction));
00114     }
00115     
00116     (*_defaultLeaveFunctors)[ type.getId() ] = func;
00117 }

void Action::registerEnterFunction ( const FieldContainerType type,
const Functor func 
)

Definition at line 201 of file OSGAction.cpp.

References _defaultEnterFunction(), _enterFunctors, osg::TypeBase::getId(), and osg::osgTypedFunctionFunctor2CPtrRef().

00203 {
00204     while ( type.getId() >= _enterFunctors.size() )
00205     {
00206         _enterFunctors.push_back(
00207             osgTypedFunctionFunctor2CPtrRef<
00208                 ResultE, 
00209                 CNodePtr,
00210                 Action *                   >(&Action::_defaultEnterFunction));
00211     }
00212     
00213     _enterFunctors[ type.getId() ] = func;
00214 }

void Action::registerLeaveFunction ( const FieldContainerType type,
const Functor func 
)

Definition at line 216 of file OSGAction.cpp.

References _defaultLeaveFunction(), _leaveFunctors, osg::TypeBase::getId(), and osg::osgTypedFunctionFunctor2CPtrRef().

00218 {
00219     while ( type.getId() >= _leaveFunctors.size() )
00220     {
00221         _leaveFunctors.push_back(
00222             osgTypedFunctionFunctor2CPtrRef<
00223                 ResultE, 
00224                 CNodePtr,
00225                 Action *                   >(&Action::_defaultLeaveFunction));
00226     }
00227     
00228     _leaveFunctors[ type.getId() ] = func;
00229 }

Action::ResultE Action::apply ( std::vector< NodePtr >::iterator  begin,
std::vector< NodePtr >::iterator  end 
) [virtual]

Reimplemented in osg::VRMLWriteAction.

Definition at line 235 of file OSGAction.cpp.

References callStart(), callStop(), Continue, osg::NullFC, Quit, recurse(), and SWARNING.

Referenced by osg::VRMLWriteAction::apply(), apply(), osg::Navigator::buttonRelease(), osg::Viewport::draw(), osg::WalkNavigator::forward(), osg::Navigator::getIntersectionPoint(), osg::Viewport::render(), osg::FBOViewport::render(), osg::WalkNavigator::right(), and osg::VRMLWriteAction::write().

00237 {
00238     Action::ResultE res = Continue;
00239     
00240     // call the start function and its' returns
00241     if ( ( res = callStart() ) != Continue )
00242         return res;     
00243     
00244     // call the given nodes
00245     
00246     for ( ; begin != end; begin ++ )
00247     {
00248         if ( *begin == NullFC )
00249         {
00250             SWARNING << "apply: encountered NullNode!" << std::endl;
00251             return Quit;            
00252         }
00253         else
00254         {
00255             res = recurse( *begin );
00256             
00257             if ( res != Continue )
00258                 break;
00259         }
00260     }
00261         
00262     // call the stop function and its' returns
00263     res = callStop( res );  
00264     
00265     return res;
00266 }

Action::ResultE Action::apply ( NodePtr  node  )  [virtual]

Reimplemented in osg::VRMLWriteAction.

Definition at line 268 of file OSGAction.cpp.

References apply(), osg::NullFC, Quit, and SWARNING.

00269 {
00270     if(node == NullFC)
00271     {
00272         SWARNING << "apply: node is Null!" << std::endl;
00273         return Quit;            
00274     }
00275 
00276     std::vector<NodePtr> nodeList;
00277 
00278     nodeList.push_back(node);
00279 
00280     return apply(nodeList.begin(), nodeList.end());
00281 }

NodePtr osg::Action::getActNode ( void   )  [inline]

UInt32 osg::Action::getNNodes ( void   )  const [inline]

Definition at line 92 of file OSGAction.inl.

References _actList, and _actNode.

Referenced by osg::Switch::draw(), osg::DistanceLOD::draw(), osg::Switch::intersect(), and osg::DrawActionBase::selectVisibles().

00093 {
00094     if ( ! _actList )
00095     {
00096         return _actNode->getNChildren();
00097     }
00098     else
00099     {
00100         return (*_actList).size();
00101     }
00102 }

const NodePtr osg::Action::getNode ( int  index  )  [inline]

Definition at line 67 of file OSGAction.inl.

References _actList, and _actNode.

Referenced by osg::Switch::draw(), osg::DistanceLOD::draw(), osg::Switch::intersect(), and osg::DrawActionBase::selectVisibles().

00068 {
00069     if ( ! _actList )
00070     {
00071         return _actNode->getChild( index );
00072     }
00073     else
00074     {
00075         return (*_actList)[ index ];
00076     }
00077 }

void osg::Action::addNode ( NodePtr  node  )  [inline]

Definition at line 80 of file OSGAction.inl.

References _newList.

Referenced by osg::Switch::draw(), osg::ProxyGroup::draw(), osg::DistanceLOD::draw(), osg::Switch::intersect(), and osg::DrawActionBase::selectVisibles().

00081 {
00082     _newList.push_back( node );
00083 }

void osg::Action::useNodeList ( void   )  [inline]

UInt32 osg::Action::getTravMask ( void   )  const [inline]

Definition at line 106 of file OSGAction.inl.

References _travMask.

Referenced by recurse().

00107 {
00108     return _travMask;
00109 }

void osg::Action::setTravMask ( UInt32  val  )  [inline]

Definition at line 112 of file OSGAction.inl.

References _travMask.

Referenced by osg::Viewport::draw(), osg::Viewport::render(), and osg::FBOViewport::render().

00113 {
00114     _travMask = val;
00115 }

bool Action::operator< ( const Action other  ) 

Definition at line 458 of file OSGAction.cpp.

00459 {
00460     return this < &other;
00461 }

bool Action::operator== ( const Action other  ) 

Definition at line 466 of file OSGAction.cpp.

00467 {
00468     return false;
00469 }

bool Action::operator!= ( const Action other  ) 

Definition at line 474 of file OSGAction.cpp.

00475 {
00476     return ! (*this == other);
00477 }

Action::ResultE osg::Action::callEnter ( NodePtr  node  )  [inline, protected]

Definition at line 124 of file OSGAction.inl.

References _defaultEnterFunction(), _enterFunctors, osg::NodePtr::getCore(), getDefaultEnterFunctors(), osg::TypeBase::getId(), and osg::NodeCore::getType().

Referenced by recurse().

00125 {
00126     ResultE result;
00127 
00128     UInt32 uiFunctorIndex = node->getCore()->getType().getId();
00129     CNodePtr cnode(node);
00130 
00131     if ( uiFunctorIndex < _enterFunctors.size() )
00132         result = _enterFunctors[uiFunctorIndex].call(cnode,this);
00133     else if (  getDefaultEnterFunctors() &&
00134                 uiFunctorIndex < getDefaultEnterFunctors()->size() )
00135     {
00136         // field container registered method after this action was instantiated
00137         // copy the new functors from default vector
00138         std::vector<Functor> *defaultEnter = getDefaultEnterFunctors();
00139 
00140         while ( defaultEnter->size() > _enterFunctors.size() )
00141         {
00142             _enterFunctors.push_back( (*defaultEnter)[_enterFunctors.size()] );
00143         }
00144         result = _enterFunctors[uiFunctorIndex].call(cnode,this);
00145     }
00146     else // unknown field container
00147         result = _defaultEnterFunction(cnode,this);
00148 
00149     return result;
00150 }

Action::ResultE osg::Action::callLeave ( NodePtr  node  )  [inline, protected]

Definition at line 153 of file OSGAction.inl.

References _defaultLeaveFunction(), _leaveFunctors, osg::NodePtr::getCore(), getDefaultLeaveFunctors(), osg::TypeBase::getId(), and osg::NodeCore::getType().

Referenced by recurse().

00154 {
00155     ResultE result;
00156 
00157     UInt32 uiFunctorIndex = node->getCore()->getType().getId();
00158     CNodePtr cnode(node);
00159 
00160     if ( uiFunctorIndex < _leaveFunctors.size() )
00161         result = _leaveFunctors[uiFunctorIndex].call(cnode,this);
00162     else if (   getDefaultLeaveFunctors() &&
00163                 uiFunctorIndex < getDefaultLeaveFunctors()->size() )
00164     {
00165         // field container registered method after this action was instantiated
00166         // copy the new functors from default vector
00167         std::vector<Functor> *defaultLeave = getDefaultLeaveFunctors();
00168 
00169         while ( defaultLeave->size() > _leaveFunctors.size() )
00170         {
00171             _leaveFunctors.push_back( (*defaultLeave)[_leaveFunctors.size()] );
00172         }
00173         result = _leaveFunctors[uiFunctorIndex].call(cnode,this);
00174     }
00175     else // unknown field container
00176         result = _defaultLeaveFunction(cnode,this);
00177 
00178     return result;
00179 }

Action::ResultE Action::start ( void   )  [protected, virtual]

Reimplemented in osg::DrawActionBase, osg::DrawAction, osg::IntersectAction, and osg::RenderAction.

Definition at line 423 of file OSGAction.cpp.

References Continue.

Referenced by callStart().

00424 {
00425     return Continue;
00426 }

Action::ResultE Action::stop ( ResultE  res  )  [protected, virtual]

Reimplemented in osg::DrawActionBase, and osg::RenderAction.

Definition at line 428 of file OSGAction.cpp.

Referenced by callStop().

00429 {
00430     return res;
00431 }

Action::ResultE Action::recurse ( NodePtr  node  )  [protected]

Definition at line 288 of file OSGAction.cpp.

References _actList, _actNode, _newList, _useNewList, callEnter(), callLeave(), callNewList(), Continue, osg::NodePtr::getCore(), getTravMask(), osg::NullFC, Quit, Skip, and SWARNING.

Referenced by apply(), and callNewList().

00289 {
00290     if ( node == NullFC )
00291         return Continue;
00292 
00293     if((node->getTravMask() & getTravMask()) == 0)
00294         return Continue;
00295 
00296     if(node->getOcclusionMask() & 1)
00297         return Continue;
00298 
00299     NodeCorePtr core = node->getCore();
00300     
00301     if ( core == NullFC )
00302     {
00303         SWARNING << "recurse: core is Null,  don't know what to do!" 
00304                  << std::endl;
00305         return Quit;                    
00306     }
00307     
00308     Action::ResultE result;
00309     
00310     _actList = NULL;
00311     _actNode = node;
00312     _newList.clear();
00313     _useNewList = false;
00314     
00315     result = callEnter( node );
00316 
00317     if ( result != Continue )
00318     {
00319         if ( result == Skip )
00320             return Continue;
00321     
00322         return result;
00323     }
00324     
00325     if ( ! _newList.empty() )
00326     {
00327         result = callNewList();
00328     }
00329     else if ( ! _useNewList ) // new list is empty, but not used?
00330     {
00331         std::vector<NodePtr>::iterator it;
00332 
00333         for ( it = node->getMFChildren()->begin(); it != node->getMFChildren()->end(); it ++ )
00334         {
00335             result = recurse( *it );
00336             
00337             if ( result != Continue )
00338                 break;
00339         }
00340     }   
00341 
00342     _actNode = node;
00343     if ( result == Continue )
00344         result = callLeave( node );
00345     else
00346         callLeave( node );
00347 
00348     if ( result == Skip )
00349         return Continue;
00350         
00351     return result;
00352 }

Action::ResultE Action::callNewList ( void   )  [protected]

Definition at line 355 of file OSGAction.cpp.

References _actList, _newList, Continue, and recurse().

Referenced by callStart(), callStop(), and recurse().

00356 {
00357     Action::ResultE result = Continue;
00358 
00359     // need to make a copy, because the one in the action is cleared
00360 
00361     std::vector<NodePtr> nodeList;
00362     nodeList.swap(_newList);
00363 
00364     std::vector<NodePtr>::iterator it;
00365 
00366     _actList = &nodeList;
00367 
00368     for(it = nodeList.begin(); it != nodeList.end(); ++it)
00369     {
00370         result = recurse(*it);
00371 
00372         if(result != Continue)
00373             break;
00374     }
00375     
00376     return result;
00377 }

std::vector< Action::Functor > * Action::getDefaultEnterFunctors ( void   )  [protected, virtual]

Reimplemented in osg::DrawActionBase, osg::DrawAction, osg::IntersectAction, osg::RenderAction, and osg::VRMLWriteAction.

Definition at line 484 of file OSGAction.cpp.

References _defaultEnterFunctors.

Referenced by callEnter().

00485 {
00486     return _defaultEnterFunctors;
00487 }

std::vector< Action::Functor > * Action::getDefaultLeaveFunctors ( void   )  [protected, virtual]

Reimplemented in osg::DrawActionBase, osg::DrawAction, osg::IntersectAction, osg::RenderAction, and osg::VRMLWriteAction.

Definition at line 489 of file OSGAction.cpp.

References _defaultLeaveFunctors.

Referenced by callLeave().

00490 {
00491     return _defaultLeaveFunctors;
00492 }

Action::ResultE Action::_defaultEnterFunction ( CNodePtr node,
Action action 
) [static, protected]

Action::ResultE Action::_defaultLeaveFunction ( CNodePtr node,
Action action 
) [static, protected]

void osg::Action::setActNode ( NodePtr  node  )  [inline, protected]

Definition at line 61 of file OSGAction.inl.

References _actNode.

Referenced by osg::RenderAction::draw().

00062 {
00063     _actNode = node;
00064 }

Action::ResultE Action::callStart ( void   )  [private]

Definition at line 382 of file OSGAction.cpp.

References _newList, callNewList(), Continue, and start().

Referenced by apply().

00383 {
00384     Action::ResultE res = Continue;
00385     
00386     // call the start and see if it returns some nodes
00387     
00388     _newList.clear();
00389 
00390     if ( ( res = start() ) != Continue )
00391         return res;     
00392     
00393     // got some nodes? call them
00394     
00395     if ( ! _newList.empty() )
00396         res = callNewList();
00397     
00398     // return the result
00399 
00400     return res;
00401 }

Action::ResultE Action::callStop ( ResultE  res  )  [private]

Definition at line 405 of file OSGAction.cpp.

References _newList, callNewList(), Continue, and stop().

Referenced by apply().

00406 {
00407     // call the start and see if it returns some nodes
00408     
00409     _newList.clear();
00410 
00411     if ( ( res = stop( res ) ) != Continue )
00412         return res;     
00413             
00414     if ( ! _newList.empty() )
00415         res = callNewList();
00416 
00417     return res;
00418 }

Action & Action::operator= ( const Action source  )  [private]

Definition at line 438 of file OSGAction.cpp.

00439 {
00440     if (this == &source)
00441         return *this;
00442 
00443     // free mem alloced by members of 'this'
00444 
00445     
00446     // alloc new mem for members
00447 
00448     // copy 
00449 
00450     return *this;
00451 }


Member Data Documentation

std::vector<Functor> osg::Action::_enterFunctors [protected]

std::vector<Functor> osg::Action::_leaveFunctors [protected]

char Action::cvsid = "@(#)$Id: $" [static, private]

Action * Action::_prototype = NULL [static, private]

Reimplemented in osg::DrawAction, osg::IntersectAction, and osg::VRMLWriteAction.

Definition at line 291 of file OSGAction.h.

Referenced by create(), getPrototype(), and setPrototype().

std::vector< Action::Functor > * Action::_defaultEnterFunctors [static, private]

std::vector< Action::Functor > * Action::_defaultLeaveFunctors [static, private]

Definition at line 305 of file OSGAction.h.

Referenced by getActNode(), getNNodes(), getNode(), recurse(), and setActNode().

std::vector<NodePtr>* osg::Action::_actList [private]

Definition at line 307 of file OSGAction.h.

Referenced by callNewList(), getNNodes(), getNode(), and recurse().

bool osg::Action::_useNewList [private]

Definition at line 310 of file OSGAction.h.

Referenced by recurse(), and useNodeList().

std::vector<NodePtr> osg::Action::_newList [private]

Definition at line 311 of file OSGAction.h.

Referenced by addNode(), callNewList(), callStart(), callStop(), and recurse().

Definition at line 313 of file OSGAction.h.

Referenced by getTravMask(), and setTravMask().


The documentation for this class was generated from the following files:

Generated on Mon Mar 17 11:11:11 2008 for OpenSG by  doxygen 1.5.5