[964] | 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_ |
---|