eng_node_visitor.hh

Go to the documentation of this file.
00001 /*
00008  * LEGAL:   COPYRIGHT (C) 2007 JIM E. BROOKS
00009  *          THIS SOURCE CODE IS RELEASED UNDER THE TERMS
00010  *          OF THE GNU GENERAL PUBLIC LICENSE VERSION 2 (GPL 2).
00011  *****************************************************************************/
00012 
00013 #ifndef ENG_NODE_VISITOR_HH
00014 #define ENG_NODE_VISITOR_HH 1
00015 
00016 // Visitor depends on GraphTraversal.
00017 #include "eng_graph_traversal.hh"
00018 
00019 namespace eng {
00020 
00021 class LodNode;
00022 class PartitionNode;
00023 class TransformNode;
00024 class VertexsNode;
00025 class NormalsNode;
00026 class ModesNode;
00027 class MaterialNode;
00028 class TextureNode;
00029 class ColorsNode;
00030 class PolygonNode;
00031 class PolygonNode_TriColor1;
00032 class PolygonNode_TriColor3;
00033 class PolygonNode_QuadColor1;
00034 class PolygonNode_QuadColor4;
00035 class PolygonNode_Tex;
00036 class PolygonNode_TexTriColor1;
00037 class PolygonNode_TexTriColor3;
00038 class PolygonNode_TexQuadColor1;
00039 class PolygonNode_TexQuadColor4;
00040 class SpecialNode;
00041 
00136 class Visitor
00137 {
00138 public:
00139     // Optional root arg allows traversing a subtree of a Graph.
00140     // ctors are defined at eng_graph.cc.
00141                 Visitor( Graph& graph, Node::Ptr root );  // eng_node.cc
00142                 Visitor( Graph& graph );
00143     virtual     ~Visitor() { }
00144 
00145     // Visit regular nodes:
00146     // C++ function overloading rules should try to match
00147     // derived Node types (exact match) before base Node type (derived-to-base).
00148     virtual void    Visit( Node& node ) { }
00149     virtual void    Visit( LodNode& node ) { }
00150     virtual void    Visit( PartitionNode& node ) { }
00151     virtual void    Visit( TransformNode& node ) { }
00152     virtual void    Visit( VertexsNode& node ) { }
00153     virtual void    Visit( NormalsNode& node ) { }
00154     virtual void    Visit( ModesNode& node ) { }
00155     virtual void    Visit( MaterialNode& node ) { }
00156     virtual void    Visit( TextureNode& node ) { }
00157     virtual void    Visit( ColorsNode& node ) { }
00158     // For convenience, by default, Visit() of PolygonNode derivatives call Visit(PolygonNode&).
00159     virtual void    Visit( PolygonNode& node ) { }
00160     virtual void    Visit( PolygonNode_TriColor1& node );      // { Visit( static_cast<PolygonNode&>(node) ); }
00161     virtual void    Visit( PolygonNode_TriColor3& node );      // ditto  [eng_node.cc]
00162     virtual void    Visit( PolygonNode_QuadColor1& node );     // ditto
00163     virtual void    Visit( PolygonNode_QuadColor4& node );     // ditto
00164     virtual void    Visit( PolygonNode_Tex& node );            // ditto
00165     virtual void    Visit( PolygonNode_TexTriColor1& node );   // ditto
00166     virtual void    Visit( PolygonNode_TexTriColor3& node );   // ditto
00167     virtual void    Visit( PolygonNode_TexQuadColor1& node );  // ditto
00168     virtual void    Visit( PolygonNode_TexQuadColor4& node );  // ditto
00169     virtual void    Visit( SpecialNode& node ) { }
00170 
00174 #define DECLARE_VISIT_ANY(METHOD)                                       \
00175     void    Visit( Node& node )                      { METHOD(node); }  \
00176     void    Visit( LodNode& node )                   { METHOD(node); }  \
00177     void    Visit( PartitionNode& node )             { METHOD(node); }  \
00178     void    Visit( TransformNode& node )             { METHOD(node); }  \
00179     void    Visit( VertexsNode& node )               { METHOD(node); }  \
00180     void    Visit( NormalsNode& node )               { METHOD(node); }  \
00181     void    Visit( ModesNode& node )                 { METHOD(node); }  \
00182     void    Visit( MaterialNode& node )              { METHOD(node); }  \
00183     void    Visit( TextureNode& node )               { METHOD(node); }  \
00184     void    Visit( ColorsNode& node )                { METHOD(node); }  \
00185     void    Visit( PolygonNode& node )               { METHOD(node); }  \
00186     void    Visit( PolygonNode_TriColor1& node )     { METHOD(node); }  \
00187     void    Visit( PolygonNode_TriColor3& node )     { METHOD(node); }  \
00188     void    Visit( PolygonNode_QuadColor1& node )    { METHOD(node); }  \
00189     void    Visit( PolygonNode_QuadColor4& node )    { METHOD(node); }  \
00190     void    Visit( PolygonNode_Tex& node )           { METHOD(node); }  \
00191     void    Visit( PolygonNode_TexTriColor1& node )  { METHOD(node); }  \
00192     void    Visit( PolygonNode_TexTriColor3& node )  { METHOD(node); }  \
00193     void    Visit( PolygonNode_TexQuadColor1& node ) { METHOD(node); }  \
00194     void    Visit( PolygonNode_TexQuadColor4& node ) { METHOD(node); }  \
00195     void    Visit( SpecialNode& node )               { METHOD(node); }
00196 
00197     // Other methods for traversal:
00198     Node::Ptr       GetRootNode( void ) const { return mRoot; }
00199     virtual         operator bool() const { return not mStop; }  
00200     void            Stop( void ) { mStop = true; }
00201     virtual void    Begin( GraphTraversal::Ptr traversal ) { }   
00202     virtual void    End( void ) { }                              
00203 
00204 protected:
00205     // Which node traversal will start at.
00206     void            SetRootNode( Node::Ptr root ) { mRoot = root; }
00207 
00208 protected:
00209     Graph&      mGraph;
00210     Node::Ptr   mRoot;
00211     bool        mStop;
00212 };
00213 
00214 } // namespace eng
00215 
00216 #endif // ENG_NODE_VISITOR_HH
Palomino 3D Engine documents generated by doxygen 1.5.3 on Fri Nov 23 11:26:09 2007