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