Filling in branch from trunk
[blender.git] / source / gameengine / Ketsji / KX_SG_NodeRelationships.h
1 /**
2  * @mainpage KX_SG_NodeRelationships   
3
4  * @section 
5  *
6  * This file provides common concrete implementations of 
7  * SG_ParentRelation used by the game engine. These are
8  * KX_SlowParentRelation a slow parent relationship.
9  * KX_NormalParentRelation a normal parent relationship where 
10  * orientation and position are inherited from the parent by
11  * the child.
12  * KX_VertexParentRelation only location information is 
13  * inherited by the child. 
14  *
15  * @see SG_ParentRelation for more information about this 
16  * interface      
17  *
18  * $Id$
19  *
20  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
21  *
22  * This program is free software; you can redistribute it and/or
23  * modify it under the terms of the GNU General Public License
24  * as published by the Free Software Foundation; either version 2
25  * of the License, or (at your option) any later version. The Blender
26  * Foundation also sells licenses for use in proprietary software under
27  * the Blender License.  See http://www.blender.org/BL/ for information
28  * about this.
29  *
30  * This program is distributed in the hope that it will be useful,
31  * but WITHOUT ANY WARRANTY; without even the implied warranty of
32  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
33  * GNU General Public License for more details.
34  *
35  * You should have received a copy of the GNU General Public License
36  * along with this program; if not, write to the Free Software Foundation,
37  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
38  *
39  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
40  * All rights reserved.
41  *
42  * The Original Code is: all of this file.
43  *
44  * Contributor(s): none yet.
45  *
46  * ***** END GPL/BL DUAL LICENSE BLOCK *****
47  * 
48  */
49  
50 #ifndef __KX_SG_NODERELATIONS_H__
51 #define __KX_SG_NODERELATIONS_H__
52
53 #include "SG_Spatial.h"
54 #include "SG_ParentRelation.h"
55
56 class KX_NormalParentRelation : public SG_ParentRelation
57 {
58
59 public :
60
61         /**
62          * Allocate and construct a new KX_NormalParentRelation
63          * on the heap.
64          */
65
66         static 
67                 KX_NormalParentRelation *
68         New(
69         );              
70
71         /** 
72          * Method inherited from KX_ParentRelation
73          */
74
75                 bool
76         UpdateChildCoordinates(
77                 SG_Spatial * child,
78                 const SG_Spatial * parent
79         );
80
81         /** 
82          * Method inherited from KX_ParentRelation
83          */
84         
85                 SG_ParentRelation *
86         NewCopy(
87         );
88
89         ~KX_NormalParentRelation(
90         );
91
92 private :
93
94         KX_NormalParentRelation(
95         );
96
97 };
98
99
100 class KX_VertexParentRelation : public SG_ParentRelation
101 {
102
103 public :
104
105         /**
106          * Allocate and construct a new KX_VertexParentRelation
107          * on the heap.
108          */
109
110         static 
111                 KX_VertexParentRelation *
112         New(
113         );              
114
115         /** 
116          * Method inherited from KX_ParentRelation
117          */
118
119                 bool
120         UpdateChildCoordinates(
121                 SG_Spatial * child,
122                 const SG_Spatial * parent
123         );
124
125         /** 
126          * Method inherited from KX_ParentRelation
127          */
128         
129                 SG_ParentRelation *
130         NewCopy(
131         );
132
133         ~KX_VertexParentRelation(
134         );
135
136 private :
137
138         KX_VertexParentRelation(
139         );
140
141 };
142
143
144 class KX_SlowParentRelation : public SG_ParentRelation
145 {
146
147 public :
148
149         /**
150          * Allocate and construct a new KX_VertexParentRelation
151          * on the heap.
152          */
153
154         static 
155                 KX_SlowParentRelation *
156         New(
157                 MT_Scalar relaxation
158         );              
159
160         /** 
161          * Method inherited from KX_ParentRelation
162          */
163
164                 bool
165         UpdateChildCoordinates(
166                 SG_Spatial * child,
167                 const SG_Spatial * parent
168         );
169
170         /** 
171          * Method inherited from KX_ParentRelation
172          */
173         
174                 SG_ParentRelation *
175         NewCopy(
176         );
177
178         ~KX_SlowParentRelation(
179         );
180
181 private :
182
183         KX_SlowParentRelation(
184                 MT_Scalar relaxation
185         );
186
187         // the relaxation coefficient.
188
189         MT_Scalar m_relax;
190
191         /**
192          * Looks like a hack flag to me.
193          * We need to compute valid world coordinates the first
194          * time we update spatial data of the child. This is done
195          * by just doing a normal parent relation the first time
196          * UpdateChildCoordinates is called and then doing the
197          * slow parent relation 
198          */
199
200         bool m_initialized;
201
202 };
203
204 #endif