Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 3 4 #ifndef tools_sg_noderef 5 #define tools_sg_noderef 6 7 #include "node" 8 9 //#define TOOLS_SG_NODEREF_DEBUG 10 11 namespace tools { 12 namespace sg { 13 14 class noderef : public node { 15 public: 16 TOOLS_NODE(noderef,tools::sg::noderef,node) 17 public: 18 virtual void render(render_action& a_action) { 19 #ifdef TOOLS_SG_NODEREF_DEBUG 20 std::ostream& out = a_action.out(); 21 out << "debug : tools::sg::noderef::render : " << m_node.s_cls() << " begin : " << std::endl; 22 m_node.render(a_action); 23 out << "debug : tools::sg::noderef::render : " << m_node.s_cls() << " end," << std::endl; 24 #else 25 m_node.render(a_action); 26 #endif 27 } 28 virtual void pick(pick_action& a_action) {m_node.pick(a_action);} 29 virtual void bbox(bbox_action& a_action) {m_node.bbox(a_action);} 30 virtual void event(event_action& a_action) {m_node.event(a_action);} 31 virtual void search(search_action& a_action) { 32 if(a_action.do_path()) a_action.path_push(this); 33 m_node.search(a_action); 34 if(a_action.done()) return; 35 if(a_action.do_path()) a_action.path_pop(); 36 } 37 virtual void get_matrix(get_matrix_action& a_action) {m_node.get_matrix(a_action);} 38 virtual bool write(write_action& a_action) {return m_node.write(a_action);} 39 virtual void is_visible(visible_action& a_action) {m_node.is_visible(a_action);} 40 public: 41 noderef(node& a_node):parent(),m_node(a_node){} 42 virtual ~noderef(){} 43 public: 44 noderef(const noderef& a_from) 45 :parent(a_from) 46 ,m_node(a_from.m_node) 47 {} 48 noderef& operator=(const noderef& a_from){ 49 parent::operator=(a_from); 50 return *this; 51 } 52 const sg::node& node() const {return m_node;} 53 sg::node& node() {return m_node;} 54 protected: 55 sg::node& m_node; 56 }; 57 58 template <class NODE> 59 class clrref : public noderef { 60 public: 61 TOOLS_NODE_T(NODE,clrref,tools::sg::clrref,noderef) 62 public: 63 clrref(NODE& a_node):parent(a_node){} 64 virtual ~clrref(){ 65 NODE* _node = safe_cast<sg::node,NODE>(m_node); 66 if(_node) _node->clear(); 67 } 68 public: 69 clrref(const clrref& a_from):parent(a_from){} 70 clrref& operator=(const clrref& a_from){ 71 parent::operator=(a_from); 72 return *this; 73 } 74 }; 75 76 }} 77 78 #endif