1 | /* |
---|
2 | Copyright (C) 2005-2006 Feeling Software Inc. |
---|
3 | MIT License: http://www.opensource.org/licenses/mit-license.php |
---|
4 | */ |
---|
5 | /* |
---|
6 | Based on the FS Import classes: |
---|
7 | Copyright (C) 2005-2006 Feeling Software Inc |
---|
8 | Copyright (C) 2005-2006 Autodesk Media Entertainment |
---|
9 | MIT License: http://www.opensource.org/licenses/mit-license.php |
---|
10 | */ |
---|
11 | |
---|
12 | /** |
---|
13 | @file FCDTransform.h |
---|
14 | This file contains the FCDTransform class and its up-classes: |
---|
15 | FCDTTranslation, FCDTScale, FCDTRotation, FCDTMatrix, FCDTLookAt and FCDTSkew. |
---|
16 | */ |
---|
17 | |
---|
18 | #ifndef _FCD_TRANSFORM_H_ |
---|
19 | #define _FCD_TRANSFORM_H_ |
---|
20 | |
---|
21 | class FCDocument; |
---|
22 | class FCDSceneNode; |
---|
23 | |
---|
24 | #include "FCDocument/FCDObject.h" |
---|
25 | |
---|
26 | /** |
---|
27 | A COLLADA transform. |
---|
28 | |
---|
29 | COLLADA supports six transformation types: translations(FCDTTranslation), |
---|
30 | rotations(FCDTRotation), scales(FCDTScale), matrices(FCDTMatrix), |
---|
31 | skews(FCDTSkew) and the 'look-at' transform(FCDTLookAt). |
---|
32 | |
---|
33 | @ingroup FCDocument |
---|
34 | */ |
---|
35 | class FCOLLADA_EXPORT FCDTransform : public FCDObject |
---|
36 | { |
---|
37 | public: |
---|
38 | /** The COLLADA transform types. */ |
---|
39 | enum Type |
---|
40 | { |
---|
41 | TRANSLATION, /**< A translation(FCDTTranslation). */ |
---|
42 | ROTATION, /**< A rotation(FCDTRotation). */ |
---|
43 | SCALE, /**< A non-uniform scale(FCDTScale). */ |
---|
44 | MATRIX, /**< A matrix multiplication(FCDTMatrix). */ |
---|
45 | LOOKAT, /**< A targeted, 'look-at' transformation(FCDTLookAt). */ |
---|
46 | SKEW /**< A skew(FCDTSkew). */ |
---|
47 | }; |
---|
48 | |
---|
49 | private: |
---|
50 | DeclareObjectType; |
---|
51 | FCDSceneNode* parent; |
---|
52 | |
---|
53 | public: |
---|
54 | /** Constructor: do not use directly. |
---|
55 | Instead, use the FCDSceneNode::AddTransform function. |
---|
56 | @param document The COLLADA document that owns the transform. |
---|
57 | @param parent The visual scene node that contains the transform. |
---|
58 | Set this pointer to NULL if this transform is not owned by a |
---|
59 | visual scene node. */ |
---|
60 | FCDTransform(FCDocument* document, FCDSceneNode* parent); |
---|
61 | |
---|
62 | /** Destructor: do not use directly. |
---|
63 | Instead, use the FCDSceneNode::ReleaseTransform function. */ |
---|
64 | virtual ~FCDTransform(); |
---|
65 | |
---|
66 | /** Retrieves the visual scene node that contains this transformation. |
---|
67 | @return The parent visual scene node. This pointer will be NULL |
---|
68 | if the transformation is not contained by a visual scene node. */ |
---|
69 | FCDSceneNode* GetParent() { return parent; } |
---|
70 | const FCDSceneNode* GetParent() const { return parent; } /**< See above. */ |
---|
71 | |
---|
72 | /** Creates a copy of a transformation. |
---|
73 | @param newParent The visual scene node that will contain the clone. |
---|
74 | @return The cloned transformation. */ |
---|
75 | virtual FCDTransform* Clone(FCDSceneNode* newParent) = 0; |
---|
76 | |
---|
77 | /** Retrieves the class type of the transformation. |
---|
78 | The class type should be used to up-case the transformation pointer. |
---|
79 | @return The class type. */ |
---|
80 | virtual Type GetType() const = 0; |
---|
81 | |
---|
82 | /** Converts the transformation into a matrix. |
---|
83 | Useful for visual scene nodes with a weird transformation stack. |
---|
84 | @return A matrix equivalent of the transformation. */ |
---|
85 | virtual FMMatrix44 ToMatrix() const = 0; |
---|
86 | |
---|
87 | /** Retrieves whether this transformation has an animation tied to its values. |
---|
88 | @return Whether the transformation is animated. */ |
---|
89 | virtual bool IsAnimated() const = 0; |
---|
90 | |
---|
91 | /** Retrieves the animated element for the transformation. |
---|
92 | @return The animated element. This pointer will be NULL if the transformation |
---|
93 | is not animated. */ |
---|
94 | virtual FCDAnimated* GetAnimated() = 0; |
---|
95 | |
---|
96 | /** Retrieves whether a given transformation is the exact opposite of |
---|
97 | this transformation. Executing two opposite transformations, one after the |
---|
98 | other will not give any resulting transformation. This function is useful |
---|
99 | to detect pivots within the transform stack. |
---|
100 | @param transform A second transformation. |
---|
101 | @return Whether the two transformations are opposites. */ |
---|
102 | virtual bool IsInverse(const FCDTransform* transform) const; |
---|
103 | |
---|
104 | /** [INTERNAL] Reads in the transformation from a given COLLADA XML tree node.
|
---|
105 | @param transformNode The COLLADA XML tree node.
|
---|
106 | @return The status of the import. If the status is not successful,
|
---|
107 | it may be dangerous to extract information from the transformation.*/
|
---|
108 | virtual FUStatus LoadFromXML(xmlNode* transformNode) = 0; |
---|
109 |
|
---|
110 | /** [INTERNAL] Writes out the transformation to the given COLLADA XML tree node.
|
---|
111 | @param parentNode The COLLADA XML parent node in which to insert the transformation.
|
---|
112 | @return The created XML tree node. */
|
---|
113 | virtual xmlNode* WriteToXML(xmlNode* parentNode) const = 0; |
---|
114 | }; |
---|
115 | |
---|
116 | /** |
---|
117 | A COLLADA translation. |
---|
118 | A translation is a simple 3D displacement. |
---|
119 | |
---|
120 | @ingroup FCDocument |
---|
121 | */ |
---|
122 | class FCOLLADA_EXPORT FCDTTranslation : public FCDTransform |
---|
123 | { |
---|
124 | private: |
---|
125 | DeclareObjectType; |
---|
126 | FMVector3 translation; |
---|
127 | |
---|
128 | public: |
---|
129 | /** Constructor: do not use directly. |
---|
130 | Instead, use the FCDSceneNode::AddTransform function with |
---|
131 | the TRANSLATION transformation type. |
---|
132 | @param document The COLLADA document that owns the translation. |
---|
133 | @param parent The visual scene node that contains the translation. |
---|
134 | Set this pointer to NULL if the translation is not owned |
---|
135 | by a visual scene node. */ |
---|
136 | FCDTTranslation(FCDocument* document, FCDSceneNode* parent); |
---|
137 | |
---|
138 | /** Destructor: do not use directly. |
---|
139 | Instead, use the FCDSceneNode::ReleaseTransform function. */ |
---|
140 | virtual ~FCDTTranslation(); |
---|
141 | |
---|
142 | /** Retrieves the transformation class type for the translation. |
---|
143 | @return The transformation class type: TRANSLATION. */ |
---|
144 | virtual Type GetType() const { return TRANSLATION; } |
---|
145 | |
---|
146 | /** Retrieves the translation 3D displacement vector. |
---|
147 | This displacement vector may be animated. |
---|
148 | @return The displacement vector. */ |
---|
149 | inline FMVector3& GetTranslation() { return translation; } |
---|
150 | inline const FMVector3& GetTranslation() const { return translation; } /**< See above. */ |
---|
151 | |
---|
152 | /** Sets the translation 3D displacement vector. |
---|
153 | @param _translation The displacement vector. */ |
---|
154 | inline void SetTranslation(const FMVector3& _translation) { translation = _translation; } |
---|
155 | |
---|
156 | /** Sets the translation 3D displacement vector. |
---|
157 | @param x The x-component displacement. |
---|
158 | @param y The y-component displacement. |
---|
159 | @param z The z-component displacement. */ |
---|
160 | inline void SetTranslation(float x, float y, float z) { translation = FMVector3(x, y, z); } |
---|
161 | |
---|
162 | /** Converts the translation into a matrix. |
---|
163 | @return A matrix equivalent of the translation. */ |
---|
164 | virtual FMMatrix44 ToMatrix() const; |
---|
165 | |
---|
166 | /** Retrieves whether this translation is affected by an animation. |
---|
167 | @return Whether the translation is animated. */ |
---|
168 | virtual bool IsAnimated() const; |
---|
169 | |
---|
170 | /** Retrieves the animated element for the translation. |
---|
171 | @see FCDAnimatedPoint3 |
---|
172 | @return The animated element. This pointer will be NULL if the translation |
---|
173 | is not animated. */ |
---|
174 | virtual FCDAnimated* GetAnimated(); |
---|
175 | |
---|
176 | /** Retrieves whether a given transform is the exact opposite of |
---|
177 | this translation. The opposite of a translation has a displacement |
---|
178 | vector with all the components multiplied by -1. |
---|
179 | @param transform A second transformation. |
---|
180 | @return Whether the two transformations are opposites. */ |
---|
181 | virtual bool IsInverse(const FCDTransform* transform) const; |
---|
182 | |
---|
183 | /** Creates a copy of the translation. |
---|
184 | @param newParent The visual scene node that will contain the clone. |
---|
185 | @return The cloned translation. */ |
---|
186 | virtual FCDTransform* Clone(FCDSceneNode* newParent); |
---|
187 | |
---|
188 | /** [INTERNAL] Reads in the translation from a given COLLADA XML tree node.
|
---|
189 | @param translationNode The COLLADA XML tree node.
|
---|
190 | @return The status of the import. If the status is not successful,
|
---|
191 | it may be dangerous to extract information from the translation.*/
|
---|
192 | virtual FUStatus LoadFromXML(xmlNode* translationNode); |
---|
193 |
|
---|
194 | /** [INTERNAL] Writes out the translation to the given COLLADA XML tree node.
|
---|
195 | @param parentNode The COLLADA XML parent node in which to insert the translation.
|
---|
196 | @return The created XML tree node. */
|
---|
197 | virtual xmlNode* WriteToXML(xmlNode* parentNode) const; |
---|
198 | }; |
---|
199 | |
---|
200 | /** |
---|
201 | A COLLADA non-uniform scale. |
---|
202 | A non-uniform scale contains three scale factors. |
---|
203 | @ingroup FCDocument |
---|
204 | */ |
---|
205 | class FCOLLADA_EXPORT FCDTScale : public FCDTransform |
---|
206 | { |
---|
207 | private: |
---|
208 | DeclareObjectType; |
---|
209 | FMVector3 scale; |
---|
210 | |
---|
211 | public: |
---|
212 | /** Constructor: do not use directly. |
---|
213 | Instead, use the FCDSceneNode::AddTransform function with |
---|
214 | the SCALE transformation type. |
---|
215 | @param document The COLLADA document that owns the non-uniform scale. |
---|
216 | @param parent The visual scene node that contains the non-uniform scale. |
---|
217 | Set this pointer to NULL if the non-uniform scale is not owned |
---|
218 | by a visual scene node. */ |
---|
219 | FCDTScale(FCDocument* document, FCDSceneNode* parent); |
---|
220 | |
---|
221 | /** Destructor: do not use directly. |
---|
222 | Instead, use the FCDSceneNode::ReleaseTransform function. */ |
---|
223 | virtual ~FCDTScale(); |
---|
224 | |
---|
225 | /** Retrieves the transformation class type for the non-uniform scale. |
---|
226 | @return The class type: SCALE. */ |
---|
227 | virtual Type GetType() const { return SCALE; } |
---|
228 | |
---|
229 | /** Retrieves the factors of the non-uniform scale. |
---|
230 | These factors may be animated. |
---|
231 | @return The scale factors. */ |
---|
232 | FMVector3& GetScale() { return scale; } |
---|
233 | const FMVector3& GetScale() const { return scale; } /**< See above. */ |
---|
234 | |
---|
235 | /** Sets the factors of the non-uniform scale. |
---|
236 | @param _scale The scale factors. */ |
---|
237 | inline void SetScale(const FMVector3& _scale) { scale = _scale; } |
---|
238 | |
---|
239 | /** Sets the factors of the non-uniform scale. |
---|
240 | @param x The x-component scale factor. |
---|
241 | @param y The y-component scale factor. |
---|
242 | @param z The z-component scale factor. */ |
---|
243 | inline void SetScale(float x, float y, float z) { scale = FMVector3(x, y, z); } |
---|
244 | |
---|
245 | /** Converts the non-uniform scale into a matrix. |
---|
246 | @return A matrix equivalent of the non-uniform scale. */ |
---|
247 | virtual FMMatrix44 ToMatrix() const; |
---|
248 | |
---|
249 | /** Retrieves whether the factors of the non-uniform scale are animated. |
---|
250 | @return Whether the scale factors are animated. */ |
---|
251 | virtual bool IsAnimated() const; |
---|
252 | |
---|
253 | /** Retrieves the animated element for the non-uniform scale factors. |
---|
254 | @see FCDAnimatedPoint3 |
---|
255 | @return The animated element. This pointer will be NULL if the |
---|
256 | scale factors are not animated. */ |
---|
257 | virtual FCDAnimated* GetAnimated(); |
---|
258 | |
---|
259 | /** Creates a copy of the non-uniform scale. |
---|
260 | @param newParent The visual scene node that will contain the clone. |
---|
261 | @return The cloned non-uniform scale. */ |
---|
262 | virtual FCDTransform* Clone(FCDSceneNode* newParent); |
---|
263 | |
---|
264 | /** [INTERNAL] Reads in the non-uniform scale from a given COLLADA XML tree node.
|
---|
265 | @param scaleNode The COLLADA XML tree node.
|
---|
266 | @return The status of the import. If the status is not successful,
|
---|
267 | it may be dangerous to extract information from the transformation.*/
|
---|
268 | virtual FUStatus LoadFromXML(xmlNode* scaleNode); |
---|
269 | |
---|
270 | /** [INTERNAL] Writes out the non-uniform scale to the given COLLADA XML tree node.
|
---|
271 | @param parentNode The COLLADA XML parent node in which to insert the transformation.
|
---|
272 | @return The created XML tree node. */
|
---|
273 | virtual xmlNode* WriteToXML(xmlNode* parentNode) const; |
---|
274 | }; |
---|
275 | |
---|
276 | /** |
---|
277 | A COLLADA angle-axis rotation. |
---|
278 | This rotation defines an axis around which the 3D points |
---|
279 | are rotated by a given angle. |
---|
280 | @todo (clock-wise/counter-clock-wise?) |
---|
281 | @ingroup FCDocument |
---|
282 | */ |
---|
283 | class FCOLLADA_EXPORT FCDTRotation : public FCDTransform |
---|
284 | { |
---|
285 | private: |
---|
286 | DeclareObjectType; |
---|
287 | float angle; |
---|
288 | FMVector3 axis; |
---|
289 | |
---|
290 | public: |
---|
291 | /** Constructor: do not use directly. |
---|
292 | Instead, use the FCDSceneNode::AddTransform function with |
---|
293 | the transformation type: ROTATION. |
---|
294 | @param document The COLLADA document that owns the rotation. |
---|
295 | @param parent The visual scene node that contains the rotation. |
---|
296 | Set this pointer to NULL if the rotation is not owned |
---|
297 | by a visual scene node. */ |
---|
298 | FCDTRotation(FCDocument* document, FCDSceneNode* parent); |
---|
299 | |
---|
300 | /** Destructor: do not use directly. |
---|
301 | Instead, use the FCDSceneNode::ReleaseTransform function. */ |
---|
302 | virtual ~FCDTRotation(); |
---|
303 | |
---|
304 | /** Retrieves the transformation class type for the rotation. |
---|
305 | @return The class type: ROTATION. */ |
---|
306 | virtual Type GetType() const { return ROTATION; } |
---|
307 | |
---|
308 | /** Retrieves the rotation axis. |
---|
309 | This 3D vector may be animated. |
---|
310 | @return The rotation axis. */ |
---|
311 | inline FMVector3& GetAxis() { return axis; } |
---|
312 | inline const FMVector3& GetAxis() const { return axis; } /**< See above. */ |
---|
313 | |
---|
314 | /** Sets the rotation axis. |
---|
315 | @param _axis The rotation axis. */ |
---|
316 | inline void SetAxis(const FMVector3& _axis) { axis = _axis; } |
---|
317 | |
---|
318 | /** Sets the rotation axis. |
---|
319 | @param x The x-component of the rotation axis. |
---|
320 | @param y The y-component of the rotation axis. |
---|
321 | @param z The z-component of the rotation axis. */ |
---|
322 | inline void SetAxis(float x, float y, float z) { axis = FMVector3(x, y, z); } |
---|
323 | |
---|
324 | /** Retrieves the rotation angle. |
---|
325 | This angle may be animated. |
---|
326 | @return The rotation angle, in degrees. */ |
---|
327 | inline float& GetAngle() { return angle; } |
---|
328 | inline const float& GetAngle() const { return angle; } /**< See above. */ |
---|
329 | |
---|
330 | /** Sets the rotation angle. |
---|
331 | @param a The rotation angle, in degrees. */ |
---|
332 | inline void SetAngle(float a) { angle = a; } |
---|
333 | |
---|
334 | /** Sets the rotation components |
---|
335 | @param _axis The rotation axis. |
---|
336 | @param a The rotation angle, in degrees. */ |
---|
337 | inline void SetRotation(const FMVector3& _axis, float a) { axis = _axis; angle = a; } |
---|
338 | |
---|
339 | /** Converts the rotation into a matrix. |
---|
340 | @return A matrix equivalent of the rotation. */ |
---|
341 | virtual FMMatrix44 ToMatrix() const; |
---|
342 | |
---|
343 | /** Retrieves whether the axis or the angle of the rotation are animated. |
---|
344 | @return Whether the rotation is animated. */ |
---|
345 | virtual bool IsAnimated() const; |
---|
346 | |
---|
347 | /** Retrieves the animated element for the angle-axis rotation. |
---|
348 | @see FCDAnimatedAngleAxis |
---|
349 | @return The animated element. This pointer will be NULL if the |
---|
350 | rotation is not animated. */ |
---|
351 | virtual FCDAnimated* GetAnimated(); |
---|
352 | |
---|
353 | /** Retrieves whether a given transform is the exact opposite of |
---|
354 | this rotation. The opposite of an angle-axis rotation has the |
---|
355 | same axis as this rotation but the angle is multiplied by -1. |
---|
356 | @param transform A second transformation. |
---|
357 | @return Whether the two rotation are opposites. */ |
---|
358 | virtual bool IsInverse(const FCDTransform* transform) const; |
---|
359 | |
---|
360 | /** Creates a copy of the angle-axis rotation. |
---|
361 | @param newParent The visual scene node that will contain the clone. |
---|
362 | @return The cloned angle-axis rotation. */ |
---|
363 | virtual FCDTransform* Clone(FCDSceneNode* newParent); |
---|
364 | |
---|
365 | /** [INTERNAL] Reads in the rotation from a given COLLADA XML tree node.
|
---|
366 | @param rotationNode The COLLADA XML tree node.
|
---|
367 | @return The status of the import. If the status is not successful,
|
---|
368 | it may be dangerous to extract information from the rotation.*/
|
---|
369 | virtual FUStatus LoadFromXML(xmlNode* rotationNode); |
---|
370 | |
---|
371 | /** [INTERNAL] Writes out the rotation to the given COLLADA XML tree node.
|
---|
372 | @param parentNode The COLLADA XML parent node in which to insert the rotation.
|
---|
373 | @return The created XML tree node. */
|
---|
374 | virtual xmlNode* WriteToXML(xmlNode* parentNode) const; |
---|
375 | }; |
---|
376 | |
---|
377 | /** |
---|
378 | A COLLADA matrix transformation. |
---|
379 | This transformation contains a matrix that should be |
---|
380 | multiplied to the local transformation matrix. |
---|
381 | @ingroup FCDocument |
---|
382 | */ |
---|
383 | class FCOLLADA_EXPORT FCDTMatrix : public FCDTransform |
---|
384 | { |
---|
385 | private: |
---|
386 | DeclareObjectType; |
---|
387 | FMMatrix44 transform; |
---|
388 | |
---|
389 | public: |
---|
390 | /** Constructor: do not use directly. |
---|
391 | Instead, use the FCDSceneNode::AddTransform function with |
---|
392 | the transformation type: MATRIX. |
---|
393 | @param document The COLLADA document that owns the transformation. |
---|
394 | @param parent The visual scene node that contains the transformation. */ |
---|
395 | FCDTMatrix(FCDocument* document, FCDSceneNode* parent); |
---|
396 | |
---|
397 | /** Destructor: do not use directly. |
---|
398 | Instead, use the FCDSceneNode::ReleaseTransform function. */ |
---|
399 | virtual ~FCDTMatrix(); |
---|
400 | |
---|
401 | /** Retrieves the transformation class type for the transformation. |
---|
402 | @return The class type: MATRIX. */ |
---|
403 | virtual Type GetType() const { return MATRIX; } |
---|
404 | |
---|
405 | /** Retrieves the matrix for the transformation. |
---|
406 | All 16 values of the matrix may be animated. |
---|
407 | @return The transformation matrix. */ |
---|
408 | FMMatrix44& GetTransform() { return transform; } |
---|
409 | const FMMatrix44& GetTransform() const { return transform; } /**< See above. */ |
---|
410 | |
---|
411 | /** Sets the matrix for the transformation. |
---|
412 | @param mx The transformation matrix. */ |
---|
413 | inline void SetTransform(const FMMatrix44& mx) { transform = mx; } |
---|
414 | |
---|
415 | /** Converts the transformation into a matrix. |
---|
416 | For matrix transformations, that's simply the transformation matrix. |
---|
417 | @return The transformation matrix. */ |
---|
418 | virtual FMMatrix44 ToMatrix() const { return transform; } |
---|
419 | |
---|
420 | /** Retrieves whether the transformation matrix is animated. |
---|
421 | @return Whether the transformation matrix is animated. */ |
---|
422 | virtual bool IsAnimated() const; |
---|
423 | |
---|
424 | /** Retrieves the animated element for the transformation matrix. |
---|
425 | @see FCDAnimatedMatrix |
---|
426 | @return The animated element. This pointer will be NULL if the |
---|
427 | transformation matrix is not animated. */ |
---|
428 | virtual FCDAnimated* GetAnimated(); |
---|
429 | |
---|
430 | /** Creates a copy of the matrix transformation. |
---|
431 | @param newParent The visual scene node that will contain the clone. |
---|
432 | @return The cloned matrix transformation. */ |
---|
433 | virtual FCDTransform* Clone(FCDSceneNode* newParent); |
---|
434 | |
---|
435 | /** [INTERNAL] Reads in the matrix transformation from a given COLLADA XML tree node.
|
---|
436 | @param matrixNode The COLLADA XML tree node.
|
---|
437 | @return The status of the import. If the status is not successful,
|
---|
438 | it may be dangerous to extract information from the transformation.*/
|
---|
439 | virtual FUStatus LoadFromXML(xmlNode* matrixNode); |
---|
440 | |
---|
441 | /** [INTERNAL] Writes out the matrix transformation to the given COLLADA XML tree node.
|
---|
442 | @param parentNode The COLLADA XML parent node in which to insert the transformation.
|
---|
443 | @return The created XML tree node. */
|
---|
444 | virtual xmlNode* WriteToXML(xmlNode* parentNode) const; |
---|
445 | }; |
---|
446 | |
---|
447 | /** |
---|
448 | A COLLADA 'look-at' transformation. |
---|
449 | This transformation type fully defines a position |
---|
450 | and an orientation with a 3D world by using three |
---|
451 | 3D vectors: the viewer's position, the position |
---|
452 | that the viewer is looking at, and the up-vector |
---|
453 | for camera rolls. */ |
---|
454 | class FCOLLADA_EXPORT FCDTLookAt : public FCDTransform |
---|
455 | { |
---|
456 | private: |
---|
457 | DeclareObjectType; |
---|
458 | FMVector3 position; |
---|
459 | FMVector3 target; |
---|
460 | FMVector3 up; |
---|
461 | |
---|
462 | public: |
---|
463 | /** Constructor: do not use directly. |
---|
464 | Instead, use the FCDSceneNode::AddTransform function with |
---|
465 | the transformation type: LOOKAT. |
---|
466 | @param document The COLLADA document that owns the transformation. |
---|
467 | @param parent The visual scene node that contains the transformation. */ |
---|
468 | FCDTLookAt(FCDocument* document, FCDSceneNode* parent); |
---|
469 | |
---|
470 | /** Destructor: do not use directly. |
---|
471 | Instead, use the FCDSceneNode::ReleaseTransform function. */ |
---|
472 | virtual ~FCDTLookAt(); |
---|
473 | |
---|
474 | /** Retrieves the transformation class type for the transformation. |
---|
475 | @return The class type: LOOKAT. */ |
---|
476 | virtual Type GetType() const { return LOOKAT; } |
---|
477 | |
---|
478 | /** Retrieves the viewer's position. |
---|
479 | @see FCDAnimatedPoint3 |
---|
480 | @return The viewer's position. */ |
---|
481 | FMVector3& GetPosition() { return position; } |
---|
482 | const FMVector3& GetPosition() const { return position; } /**< See above. */ |
---|
483 | |
---|
484 | /** Sets the viewer's position. |
---|
485 | @param pos The viewer's position. */ |
---|
486 | inline void SetPosition(const FMVector3& pos) { position = pos; } |
---|
487 | |
---|
488 | /** Sets the viewer's position. |
---|
489 | @param x The x-component of the position. |
---|
490 | @param y The y-component of the position. |
---|
491 | @param z The z-component of the position. */ |
---|
492 | inline void SetPosition(float x, float y, float z) { position = FMVector3(x, y, z); } |
---|
493 | |
---|
494 | /** Retrieves the position that the viewer is looking at. |
---|
495 | @see FCDAnimatedPoint3 |
---|
496 | @return The viewer's target. */ |
---|
497 | FMVector3& GetTarget() { return target; } |
---|
498 | const FMVector3& GetTarget() const { return target; } /**< See above. */ |
---|
499 | |
---|
500 | /** Sets the position that the viewer is looking at. |
---|
501 | @param _target The target position. */ |
---|
502 | inline void SetTarget(const FMVector3& _target) { target = _target; } |
---|
503 | |
---|
504 | /** Sets the position that the viewer is looking at. |
---|
505 | @param x The x-component of the target position. |
---|
506 | @param y The y-component of the target position. |
---|
507 | @param z The z-component of the target position. */ |
---|
508 | inline void SetTarget(float x, float y, float z) { target = FMVector3(x, y, z); } |
---|
509 | |
---|
510 | /** Retrieves the viewer's up-vector. |
---|
511 | @see FCDAnimatedPoint3 |
---|
512 | @return The up-vector. */ |
---|
513 | FMVector3& GetUp() { return up; } |
---|
514 | const FMVector3& GetUp() const { return up; } /**< See above. */ |
---|
515 | |
---|
516 | /** Sets the viewer's up-vector. |
---|
517 | @param _up The up-vector. */ |
---|
518 | inline void SetUp(const FMVector3& _up) { up = _up; } |
---|
519 | |
---|
520 | /** Sets the viewer's up-vector. |
---|
521 | @param x The x-component of the up-vector. |
---|
522 | @param y The y-component of the up-vector. |
---|
523 | @param z The z-component of the up-vector. */ |
---|
524 | inline void SetUp(float x, float y, float z) { up = FMVector3(x, y, z); } |
---|
525 | |
---|
526 | /** Converts the transformation into a matrix. |
---|
527 | @return The transformation matrix. */ |
---|
528 | virtual FMMatrix44 ToMatrix() const; |
---|
529 | |
---|
530 | /** Retrieves whether the transformation is animated. |
---|
531 | @return FCollada doesn't support animated 'look-at' transforms: false. */ |
---|
532 | virtual bool IsAnimated() const; |
---|
533 | |
---|
534 | /** Retrieves the animated element for the transformation matrix. |
---|
535 | @return FCollada doesn't support animated 'look-at' transforms: NULL. */ |
---|
536 | virtual FCDAnimated* GetAnimated(); |
---|
537 | |
---|
538 | /** Creates a copy of the transformation. |
---|
539 | @param newParent The visual scene node that will contain the clone. |
---|
540 | @return The cloned 'look-at' transformation. */ |
---|
541 | virtual FCDTransform* Clone(FCDSceneNode* newParent); |
---|
542 | |
---|
543 | /** [INTERNAL] Reads in the transformation from a given COLLADA XML tree node.
|
---|
544 | @param lookAtNode The COLLADA XML tree node.
|
---|
545 | @return The status of the import. If the status is not successful,
|
---|
546 | it may be dangerous to extract information from the transformation.*/
|
---|
547 | virtual FUStatus LoadFromXML(xmlNode* lookAtNode); |
---|
548 | |
---|
549 | /** [INTERNAL] Writes out the transformation to the given COLLADA XML tree node.
|
---|
550 | @param parentNode The COLLADA XML parent node in which to insert the transformation.
|
---|
551 | @return The created XML tree node. */
|
---|
552 | virtual xmlNode* WriteToXML(xmlNode* parentNode) const; |
---|
553 | }; |
---|
554 | |
---|
555 | /** |
---|
556 | A COLLADA skew. |
---|
557 | In COLLADA, the skew transformation follows the Renderman convention. |
---|
558 | A skew is defined by two axis and one angle: the axis which is rotated, the axis around |
---|
559 | which the rotation is done and the angle of the rotation. |
---|
560 | @ingroup FCDocument |
---|
561 | */ |
---|
562 | class FCOLLADA_EXPORT FCDTSkew : public FCDTransform |
---|
563 | { |
---|
564 | private: |
---|
565 | DeclareObjectType; |
---|
566 | FMVector3 rotateAxis; |
---|
567 | FMVector3 aroundAxis; |
---|
568 | float angle; |
---|
569 | |
---|
570 | public: |
---|
571 | /** Constructor: do not use directly. |
---|
572 | Instead, use the FCDSceneNode::AddTransform function with |
---|
573 | the transformation type: SKEW. |
---|
574 | @param document The COLLADA document that owns the skew. |
---|
575 | @param parent The visual scene node that contains the skew. */ |
---|
576 | FCDTSkew(FCDocument* document, FCDSceneNode* parent); |
---|
577 | |
---|
578 | /** Destructor: do not use directly. |
---|
579 | Instead, use the FCDSceneNode::ReleaseTransform function. */ |
---|
580 | virtual ~FCDTSkew(); |
---|
581 | |
---|
582 | /** Retrieves the transformation class type for the transformation. |
---|
583 | @return The class type: SKEW. */ |
---|
584 | virtual Type GetType() const { return SKEW; } |
---|
585 | |
---|
586 | /** Retrieves the axis which is rotated. |
---|
587 | @return The rotated axis. */ |
---|
588 | const FMVector3& GetRotateAxis() const { return rotateAxis; } |
---|
589 | |
---|
590 | /** Sets the axis which is rotated. |
---|
591 | @param axis The rotated axis. */ |
---|
592 | inline void SetRotateAxis(const FMVector3& axis) { rotateAxis = axis; } |
---|
593 | |
---|
594 | /** Retrieves the axis around which the rotation is done. |
---|
595 | @return The rotation axis. */ |
---|
596 | const FMVector3& GetAroundAxis() const { return aroundAxis; } |
---|
597 | |
---|
598 | /** Sets the axis around which the rotation is done. |
---|
599 | @param axis The rotation axis. */ |
---|
600 | inline void SetAroundAxis(const FMVector3& axis) { aroundAxis = axis; } |
---|
601 | |
---|
602 | /** Retrieves the rotation angle. |
---|
603 | @return The rotation angle. */ |
---|
604 | const float& GetAngle() { return angle; } |
---|
605 | |
---|
606 | /** Sets the rotation angle. |
---|
607 | @param _angle The rotation angle. */ |
---|
608 | inline void SetAngle(float _angle) { angle = _angle; } |
---|
609 | |
---|
610 | /** Converts the skew into a matrix. |
---|
611 | @return The transformation matrix. */ |
---|
612 | virtual FMMatrix44 ToMatrix() const; |
---|
613 | |
---|
614 | /** Retrieves whether the transformation is animated. |
---|
615 | @return FCollada doesn't support animated skews: false. */ |
---|
616 | virtual bool IsAnimated() const; |
---|
617 | |
---|
618 | /** Retrieves the animated element for the skew. |
---|
619 | @return FCollada doesn't support animated skews: NULL. */ |
---|
620 | virtual FCDAnimated* GetAnimated(); |
---|
621 | |
---|
622 | /** Creates a copy of the skew. |
---|
623 | @param newParent The visual scene node that will contain the clone. |
---|
624 | @return The cloned skew. */ |
---|
625 | virtual FCDTransform* Clone(FCDSceneNode* newParent); |
---|
626 | |
---|
627 | /** [INTERNAL] Reads in the skew from a given COLLADA XML tree node.
|
---|
628 | @param skewNode The COLLADA XML tree node.
|
---|
629 | @return The status of the import. If the status is not successful,
|
---|
630 | it may be dangerous to extract information from the skew.*/
|
---|
631 | virtual FUStatus LoadFromXML(xmlNode* skewNode); |
---|
632 | |
---|
633 | /** [INTERNAL] Writes out the skew to the given COLLADA XML tree node.
|
---|
634 | @param parentNode The COLLADA XML parent node in which to insert the skew.
|
---|
635 | @return The created XML tree node. */
|
---|
636 | virtual xmlNode* WriteToXML(xmlNode* parentNode) const; |
---|
637 | }; |
---|
638 | |
---|
639 | /** |
---|
640 | [INTERNAL] A factory for COLLADA transforms. |
---|
641 | Creates the correct transform object for a given transform type/XML tree node. |
---|
642 | To create new transforms, use the FCDSceneNode::AddTransform function. |
---|
643 | */ |
---|
644 | class FCOLLADA_EXPORT FCDTFactory |
---|
645 | { |
---|
646 | private: |
---|
647 | FCDTFactory() {} // Static class: do not instantiate. |
---|
648 | |
---|
649 | public: |
---|
650 | /** Creates a new COLLADA transform, given a transform type. |
---|
651 | @param document The COLLADA document that will own the new transform. |
---|
652 | @param parent The visual scene node that will contain the transform. |
---|
653 | @param type The type of transform object to create. |
---|
654 | @return The new COLLADA transform. This pointer will be NULL |
---|
655 | if the given type is invalid. */ |
---|
656 | static FCDTransform* CreateTransform(FCDocument* document, FCDSceneNode* parent, FCDTransform::Type type); |
---|
657 | |
---|
658 | /** [INTERNAL] Imports a COLLADA transform, given an XML tree node. |
---|
659 | @param document The COLLADA document that will own the new transform. |
---|
660 | @param parent The visual scene node that will contain the transform. |
---|
661 | @param node The XML tree node. |
---|
662 | @return The imported COLLADA transform. This pointer will be NULL |
---|
663 | if the XML tree node does not describe a COLLADA transform. */ |
---|
664 | static FCDTransform* CreateTransform(FCDocument* document, FCDSceneNode* parent, xmlNode* node); |
---|
665 | }; |
---|
666 | |
---|
667 | #endif // _FR_TRANSFORM_H_ |
---|