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