// Filename: eggGroupNode.h // Created by: drose (16Jan99) // //////////////////////////////////////////////////////////////////// #ifndef EGGGROUPNODE_H #define EGGGROUPNODE_H #include #include "eggNode.h" #include #include #include #include class EggTextureCollection; class DSearchPath; //////////////////////////////////////////////////////////////////// // Class : EggGroupNode // Description : A base class for nodes in the hierarchy that are not // leaf nodes. (See also EggGroup, which is // specifically the "" node in egg.) // // An EggGroupNode is an STL-style container of pointers // to EggNodes, like a vector. Functions // push_back()/pop_back() and insert()/erase() are // provided to manipulate the list. The list may also // be operated on (read-only) via iterators and // begin()/end(). //////////////////////////////////////////////////////////////////// class EXPCL_PANDAEGG EggGroupNode : public EggNode { // This is a bit of private interface stuff that must be here as a // forward reference. This allows us to define the EggGroupNode as // an STL container. private: // We define the list of children as a list and not a vector, so we // can avoid the bad iterator-invalidating properties of vectors as // we insert/delete elements. typedef list Children; // Here begins the actual public interface to EggGroupNode. public: EggGroupNode(const string &name = "") : EggNode(name) { } EggGroupNode(const EggGroupNode ©); EggGroupNode &operator = (const EggGroupNode ©); virtual void write(ostream &out, int indent_level) const; // The EggGroupNode itself appears to be an STL container of // pointers to EggNodes. The set of children is read-only, however, // except through the limited add_child/remove_child or insert/erase // interface. The following implements this. #ifdef WIN32_VC typedef const PT(EggNode) *pointer; typedef const PT(EggNode) *const_pointer; #else typedef Children::const_pointer pointer; typedef Children::const_pointer const_pointer; #endif typedef Children::const_reference reference; typedef Children::const_reference const_reference; typedef Children::const_iterator iterator; typedef Children::const_iterator const_iterator; typedef Children::const_reverse_iterator reverse_iterator; typedef Children::const_reverse_iterator const_reverse_iterator; typedef Children::size_type size_type; typedef Children::difference_type difference_type; INLINE iterator begin() const; INLINE iterator end() const; INLINE reverse_iterator rbegin() const; INLINE reverse_iterator rend() const; INLINE bool empty() const; INLINE size_type size() const; INLINE iterator insert(iterator position, PT(EggNode) x); INLINE iterator erase(iterator position); iterator erase(iterator first, iterator last); void replace(iterator position, PT(EggNode) x); INLINE void clear(); PT(EggNode) add_child(PT(EggNode) node); PT(EggNode) remove_child(PT(EggNode) node); void steal_children(EggGroupNode &other); void resolve_filenames(const DSearchPath &searchpath); void reverse_vertex_ordering(); protected: virtual void update_under(int depth_offset); virtual void r_transform(const LMatrix4d &mat, const LMatrix4d &inv, CoordinateSystem to_cs); virtual void r_mark_coordsys(CoordinateSystem cs); CoordinateSystem find_coordsys_entry(); int find_textures(EggTextureCollection *collection); bool r_resolve_externals(const DSearchPath &searchpath, CoordinateSystem coordsys); private: Children _children; // Don't try to use these private functions. User code should add // and remove children via add_child()/remove_child(), or via the // STL-like push_back()/pop_back() or insert()/erase(), above. void prepare_add_child(EggNode *node); void prepare_remove_child(EggNode *node); public: static TypeHandle get_class_type() { return _type_handle; } static void init_type() { EggNode::init_type(); register_type(_type_handle, "EggGroupNode", EggNode::get_class_type()); } virtual TypeHandle get_type() const { return get_class_type(); } virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; friend class EggTextureCollection; }; #include "eggGroupNode.I" #endif