This is patch #6825 (The patch missed a couple of them but
[blender-staging.git] / source / gameengine / SceneGraph / SG_Node.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32 #ifndef __SG_NODE_H
33 #define __SG_NODE_H
34
35 #include "SG_Spatial.h"
36 #include <vector>
37
38 typedef std::vector<SG_Node*> NodeList;
39
40 /**
41  * Scenegraph node.
42  */
43 class SG_Node : public SG_Spatial
44 {
45 public:
46
47         SG_Node(
48                 void* clientobj,
49                 void* clientinfo,
50                 SG_Callbacks callbacks
51         );
52
53         SG_Node(
54                 const SG_Node & other
55         );
56
57         virtual ~SG_Node();
58
59
60         /**
61          * Add a child to this object. This also informs the child of
62          * it's parent.
63          * This just stores a pointer to the child and does not
64          * make a deep copy.
65          */
66
67                 void    
68         AddChild(
69                 SG_Node* child
70         );
71
72         /** 
73          * Remove a child node from this object. This just removes the child
74          * pointer from the list of children - it does not destroy the child.
75          * This does not inform the child that this node is no longer it's parent.
76          * If the node was not a child of this object no action is performed.
77          */
78
79                 void    
80         RemoveChild(
81                 SG_Node* child
82         );
83
84         /** 
85          * Get the current list of children. Do not use this interface for
86          * adding or removing children please use the methods of this class for
87          * that.
88          * @return a reference to the list of children of this node.
89          */
90         
91                 NodeList&               
92         GetSGChildren(
93         );
94
95         /**
96          * Get the current list of children.
97          * @return a const reference to the current list of children of this node.
98          */
99
100         const 
101                 NodeList&       
102         GetSGChildren(
103         ) const;
104
105         /** 
106          * Clear the list of children associated with this node
107          */
108
109                 void                            
110         ClearSGChildren(
111         );
112
113         /**
114          * return the parent of this node if it exists.
115          */
116                 
117                 SG_Node*                        
118         GetSGParent(
119         ) const ;
120
121
122         /**
123          * Set the parent of this node. 
124          */
125
126                 void                            
127         SetSGParent(
128                 SG_Node* parent
129         );
130
131         /**
132          * Return the top node in this node's Scene graph hierarchy
133          */
134         
135         const 
136                 SG_Node* 
137         GetRootSGParent(
138         ) const;
139
140         /**
141          * Disconnect this node from it's parent
142          */
143
144                 void                            
145         DisconnectFromParent(
146         );
147
148         /**
149          * Tell this node to treat it's parent as a vertex parent.
150          */
151
152                 void    
153         SetVertexParent(
154                 bool isvertexparent
155         ) ;
156
157
158         /**             
159          * Update the spatial data of this node. Iterate through
160          * the children of this node and update their world data.
161          */
162
163                 void            
164         UpdateWorldData(
165                 double time
166         );
167
168         /**
169          * Update the simulation time of this node. Iterate through
170          * the children nodes and update their simulated time.
171          */
172
173                 void            
174         SetSimulatedTime(
175                 double time,
176                 bool recurse
177         );
178
179         /**
180          * Node replication functions.
181          */
182
183                 SG_Node*        
184         GetSGReplica(
185         );
186
187                 void            
188         Destruct(
189         );
190         
191 private:
192
193                 void            
194         ProcessSGReplica(
195                 SG_Node* replica
196         );
197
198         /**
199          * The list of children of this node.
200          */
201         NodeList m_children;
202
203         /**
204          * The parent of this node may be NULL
205          */
206         SG_Node* m_SGparent;
207
208 };
209
210 #endif //__SG_NODE_H
211