2.50: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r19323...
[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  * interface      
16  *
17  * $Id$
18  *
19  * ***** BEGIN GPL LICENSE BLOCK *****
20  *
21  * This program is free software; you can redistribute it and/or
22  * modify it under the terms of the GNU General Public License
23  * as published by the Free Software Foundation; either version 2
24  * of the License, or (at your option) any later version.
25  *
26  * This program is distributed in the hope that it will be useful,
27  * but WITHOUT ANY WARRANTY; without even the implied warranty of
28  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29  * GNU General Public License for more details.
30  *
31  * You should have received a copy of the GNU General Public License
32  * along with this program; if not, write to the Free Software Foundation,
33  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
34  *
35  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
36  * All rights reserved.
37  *
38  * The Original Code is: all of this file.
39  *
40  * Contributor(s): none yet.
41  *
42  * ***** END GPL LICENSE BLOCK *****
43  * 
44  */
45  
46 #ifndef __KX_SG_NODERELATIONS_H__
47 #define __KX_SG_NODERELATIONS_H__
48
49 #include "SG_Spatial.h"
50 #include "SG_ParentRelation.h"
51
52 class KX_NormalParentRelation : public SG_ParentRelation
53 {
54
55 public :
56
57         /**
58          * Allocate and construct a new KX_NormalParentRelation
59          * on the heap.
60          */
61
62         static 
63                 KX_NormalParentRelation *
64         New(
65         );              
66
67         /** 
68          * Method inherited from KX_ParentRelation
69          */
70
71                 bool
72         UpdateChildCoordinates(
73                 SG_Spatial * child,
74                 const SG_Spatial * parent,
75                 bool& parentUpdated     
76         );
77
78         /** 
79          * Method inherited from KX_ParentRelation
80          */
81         
82                 SG_ParentRelation *
83         NewCopy(
84         );
85
86         ~KX_NormalParentRelation(
87         );
88
89 private :
90
91         KX_NormalParentRelation(
92         );
93
94 };
95
96
97 class KX_VertexParentRelation : public SG_ParentRelation
98 {
99
100 public :
101
102         /**
103          * Allocate and construct a new KX_VertexParentRelation
104          * on the heap.
105          */
106
107         static 
108                 KX_VertexParentRelation *
109         New(
110         );              
111
112         /** 
113          * Method inherited from KX_ParentRelation
114          */
115
116                 bool
117         UpdateChildCoordinates(
118                 SG_Spatial * child,
119                 const SG_Spatial * parent,
120                 bool& parentUpdated     
121         );
122
123         /** 
124          * Method inherited from KX_ParentRelation
125          */
126         
127                 SG_ParentRelation *
128         NewCopy(
129         );
130
131         ~KX_VertexParentRelation(
132         );
133
134                 bool
135         IsVertexRelation(
136         ) { 
137                 return true;
138         }
139
140 private :
141
142         KX_VertexParentRelation(
143         );
144
145 };
146
147
148 class KX_SlowParentRelation : public SG_ParentRelation
149 {
150
151 public :
152
153         /**
154          * Allocate and construct a new KX_VertexParentRelation
155          * on the heap.
156          */
157
158         static 
159                 KX_SlowParentRelation *
160         New(
161                 MT_Scalar relaxation
162         );              
163
164         /** 
165          * Method inherited from KX_ParentRelation
166          */
167
168                 bool
169         UpdateChildCoordinates(
170                 SG_Spatial * child,
171                 const SG_Spatial * parent,
172                 bool& parentUpdated     
173         );
174
175         /** 
176          * Method inherited from KX_ParentRelation
177          */
178         
179                 SG_ParentRelation *
180         NewCopy(
181         );
182
183                 MT_Scalar
184         GetTimeOffset(
185         ) { return m_relax; }
186         
187                 void
188         SetTimeOffset(
189                 MT_Scalar relaxation
190         ) { m_relax = relaxation; }
191
192         ~KX_SlowParentRelation(
193         );
194         
195                 bool
196         IsSlowRelation(
197         ) { 
198                 return true;
199         }
200
201 private :
202
203         KX_SlowParentRelation(
204                 MT_Scalar relaxation
205         );
206
207         // the relaxation coefficient.
208
209         MT_Scalar m_relax;
210
211         /**
212          * Looks like a hack flag to me.
213          * We need to compute valid world coordinates the first
214          * time we update spatial data of the child. This is done
215          * by just doing a normal parent relation the first time
216          * UpdateChildCoordinates is called and then doing the
217          * slow parent relation 
218          */
219
220         bool m_initialized;
221
222 };
223
224 #endif