soc-2008-mxcurioni: first version of lib3ds code. It does NOT work yet and has to...
[blender.git] / source / blender / freestyle / intern / scene_graph / NodeGroup.cpp
1
2 //
3 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
4 //   with this source distribution. 
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 //
20 ///////////////////////////////////////////////////////////////////////////////
21
22 #include "NodeGroup.h"
23
24 void NodeGroup::AddChild(Node *iChild)
25 {
26   if(NULL == iChild)
27     return;
28
29   _Children.push_back(iChild);
30   iChild->addRef();
31 }
32
33 int NodeGroup::destroy()
34 {
35   /*! Node::destroy makes a release on the object 
36    *  and then returns the reference counter.
37    *  If the reference counter is equal to 0, 
38    *  that means that nobody else is linking 
39    *  this node group and that we can destroy the whole 
40    *  underlying tree.
41    *  Else, one or several Node link this node group, 
42    *  and we only returns the reference counter 
43    *  decremented by Node::destroy();
44    */
45   int refThis = Node::destroy();
46   
47   // if refThis != 0, we can't destroy the tree
48   if(0 != refThis) 
49     return refThis;
50
51   // If we are here, that means that nobody else
52   // needs our NodeGroup and we can destroy it.
53   int refCount = 0;
54   vector<Node *>::iterator node;
55   
56   for(node=_Children.begin(); node!=_Children.end(); node++)
57   {
58     refCount = (*node)->destroy();
59     if(0 == refCount)
60       delete (*node);
61   }
62
63   _Children.clear();
64   
65   return refThis;
66 }
67
68 void NodeGroup::accept(SceneVisitor& v) {
69   v.visitNodeGroup(*this);
70   
71   v.visitNodeGroupBefore(*this);
72   for(vector<Node *>::iterator node=_Children.begin(), end=_Children.end(); 
73   node!=end;
74   node++)
75     (*node)->accept(v);
76   v.visitNodeGroupAfter(*this);
77 }
78
79 void NodeGroup::DetachChildren()
80 {
81   vector<Node *>::iterator node;
82   
83   for(node=_Children.begin(); node!=_Children.end(); node++)
84   {
85     (*node)->release();
86   }
87
88   _Children.clear();
89 }
90
91 void NodeGroup::DetachChild(Node *iChild)
92 {
93   int found = 0;
94   vector<Node*>::iterator node;
95   
96   for(node=_Children.begin(); node!=_Children.end(); node++)
97   {
98     if((*node) == iChild)
99     {
100       (*node)->release();
101       _Children.erase(node);
102       found = 1;
103       break;
104     }
105   }
106 }
107
108 void NodeGroup::RetrieveChildren(vector<Node*>& oNodes){
109   oNodes = _Children;
110 }
111
112 const BBox<Vec3r>& NodeGroup::UpdateBBox()
113 {
114   vector<Node *>::iterator node;
115   clearBBox();
116   for(node=_Children.begin(); node!=_Children.end(); node++)
117   {
118     AddBBox((*node)->UpdateBBox());
119   }
120
121   return Node::UpdateBBox();
122 }