Initial revision
[blender.git] / source / gameengine / SceneGraph / SG_Spatial.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
33 #ifndef __SG_SPATIAL_H
34 #define __SG_SPATIAL_H
35
36 #include <MT_Vector3.h>
37 #include <MT_Point3.h>
38 #include <MT_Matrix3x3.h> // or Quaternion later ?
39
40 #include "SG_IObject.h"
41
42 class SG_Node;
43 class SG_ParentRelation;
44
45 class SG_Spatial : public SG_IObject
46 {
47
48 protected:
49         MT_Point3               m_localPosition;
50         MT_Matrix3x3    m_localRotation;
51         MT_Vector3              m_localScaling;
52
53         MT_Point3               m_worldPosition;
54         MT_Matrix3x3    m_worldRotation;
55         MT_Vector3              m_worldScaling;
56         
57         SG_ParentRelation * m_parent_relation;
58
59 public:
60
61         /** 
62          * Define the realtionship this node has with it's parent
63          * node. You should pass an unshared instance of an SG_ParentRelation
64          * allocated on the heap to this method. Ownership of this
65          * instance is assumed by this class. 
66          * You may call this function several times in the lifetime 
67          * of a node to change the relationship dynamically. 
68          * You must call this method before the first call to UpdateSpatialData().
69          * An assertion willl be fired at run-time in debug if this is not 
70          * the case.
71          * The relation is activated only if no controllers of this object
72          * updated the coordinates of the child.
73          */
74
75                 void
76         SetParentRelation(
77                 SG_ParentRelation *relation
78         );
79
80
81         /**
82          * Apply a translation relative to the current position.
83          * if local then the translation is assumed to be in the 
84          * local coordinates of this object. If not then the translation
85          * is assumed to be in global coordinates. In this case 
86          * you must provide a pointer to the parent of this object if it 
87          * exists otherwise if there is no parent set it to NULL
88          */ 
89
90                 void
91         RelativeTranslate(
92                 const MT_Vector3& trans,
93                 const SG_Spatial *parent,
94                 bool local
95         );
96
97                 void                            
98         SetLocalPosition(
99                 const MT_Point3& trans
100         );
101
102                 void                            
103         SetWorldPosition(
104                 const MT_Point3& trans
105         );
106         
107                 void                            
108         RelativeRotate(
109                 const MT_Matrix3x3& rot,
110                 bool local
111         );
112
113                 void                            
114         SetLocalOrientation(
115                 const MT_Matrix3x3& rot
116         );
117
118                 void                            
119         SetWorldOrientation(
120                 const MT_Matrix3x3& rot
121         );
122
123                 void                            
124         RelativeScale(
125                 const MT_Vector3& scale
126         );
127
128                 void                            
129         SetLocalScale(
130                 const MT_Vector3& scale
131         );
132
133                 void                            
134         SetWorldScale(
135                 const MT_Vector3& scale
136         );
137
138         const 
139                 MT_Point3&
140         GetLocalPosition(
141         ) const ;
142
143         const 
144                 MT_Matrix3x3&
145         GetLocalOrientation(
146         ) const ;
147
148         const 
149                 MT_Vector3&     
150         GetLocalScale(
151         ) const;
152
153         const 
154                 MT_Point3&
155         GetWorldPosition(
156         ) const ;
157
158         const 
159                 MT_Matrix3x3&   
160         GetWorldOrientation(
161         ) const ;
162
163         const 
164                 MT_Vector3&     
165         GetWorldScaling(
166         ) const ;
167
168
169         void    ComputeWorldTransforms(         const SG_Spatial *parent);
170
171         
172 protected:
173         friend SG_Controller;
174         
175         /** 
176          * Protected constructor this class is not
177          * designed for direct instantiation
178          */
179
180         SG_Spatial(
181                 void* clientobj,
182                 void* clientinfo,
183                 SG_Callbacks callbacks
184         );
185
186         SG_Spatial(
187                 const SG_Spatial& other
188         );
189
190
191         virtual ~SG_Spatial();
192
193         /** 
194          * Update the world coordinates of this spatial node. This also informs
195          * any controllers to update this object. 
196          */ 
197
198                 void 
199         UpdateSpatialData(
200                 const SG_Spatial *parent,
201                 double time
202         );
203
204 };
205 #endif //__SG_SPATIAL_H