00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00018 #ifndef _FCD_TRANSFORM_H_
00019 #define _FCD_TRANSFORM_H_
00020
00021 class FCDocument;
00022 class FCDSceneNode;
00023
00024 #include "FCDocument/FCDObject.h"
00025
00035 class FCOLLADA_EXPORT FCDTransform : public FCDObject
00036 {
00037 public:
00039 enum Type
00040 {
00041 TRANSLATION,
00042 ROTATION,
00043 SCALE,
00044 MATRIX,
00045 LOOKAT,
00046 SKEW
00047 };
00048
00049 private:
00050 DeclareObjectType;
00051 FCDSceneNode* parent;
00052
00053 public:
00060 FCDTransform(FCDocument* document, FCDSceneNode* parent);
00061
00064 virtual ~FCDTransform();
00065
00069 FCDSceneNode* GetParent() { return parent; }
00070 const FCDSceneNode* GetParent() const { return parent; }
00075 virtual FCDTransform* Clone(FCDSceneNode* newParent) = 0;
00076
00080 virtual Type GetType() const = 0;
00081
00085 virtual FMMatrix44 ToMatrix() const = 0;
00086
00089 virtual bool IsAnimated() const = 0;
00090
00094 virtual FCDAnimated* GetAnimated() = 0;
00095
00102 virtual bool IsInverse(const FCDTransform* transform) const;
00103
00108 virtual FUStatus LoadFromXML(xmlNode* transformNode) = 0;
00109
00113 virtual xmlNode* WriteToXML(xmlNode* parentNode) const = 0;
00114 };
00115
00122 class FCOLLADA_EXPORT FCDTTranslation : public FCDTransform
00123 {
00124 private:
00125 DeclareObjectType;
00126 FMVector3 translation;
00127
00128 public:
00136 FCDTTranslation(FCDocument* document, FCDSceneNode* parent);
00137
00140 virtual ~FCDTTranslation();
00141
00144 virtual Type GetType() const { return TRANSLATION; }
00145
00149 inline FMVector3& GetTranslation() { return translation; }
00150 inline const FMVector3& GetTranslation() const { return translation; }
00154 inline void SetTranslation(const FMVector3& _translation) { translation = _translation; }
00155
00160 inline void SetTranslation(float x, float y, float z) { translation = FMVector3(x, y, z); }
00161
00164 virtual FMMatrix44 ToMatrix() const;
00165
00168 virtual bool IsAnimated() const;
00169
00174 virtual FCDAnimated* GetAnimated();
00175
00181 virtual bool IsInverse(const FCDTransform* transform) const;
00182
00186 virtual FCDTransform* Clone(FCDSceneNode* newParent);
00187
00192 virtual FUStatus LoadFromXML(xmlNode* translationNode);
00193
00197 virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
00198 };
00199
00205 class FCOLLADA_EXPORT FCDTScale : public FCDTransform
00206 {
00207 private:
00208 DeclareObjectType;
00209 FMVector3 scale;
00210
00211 public:
00219 FCDTScale(FCDocument* document, FCDSceneNode* parent);
00220
00223 virtual ~FCDTScale();
00224
00227 virtual Type GetType() const { return SCALE; }
00228
00232 FMVector3& GetScale() { return scale; }
00233 const FMVector3& GetScale() const { return scale; }
00237 inline void SetScale(const FMVector3& _scale) { scale = _scale; }
00238
00243 inline void SetScale(float x, float y, float z) { scale = FMVector3(x, y, z); }
00244
00247 virtual FMMatrix44 ToMatrix() const;
00248
00251 virtual bool IsAnimated() const;
00252
00257 virtual FCDAnimated* GetAnimated();
00258
00262 virtual FCDTransform* Clone(FCDSceneNode* newParent);
00263
00268 virtual FUStatus LoadFromXML(xmlNode* scaleNode);
00269
00273 virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
00274 };
00275
00283 class FCOLLADA_EXPORT FCDTRotation : public FCDTransform
00284 {
00285 private:
00286 DeclareObjectType;
00287 float angle;
00288 FMVector3 axis;
00289
00290 public:
00298 FCDTRotation(FCDocument* document, FCDSceneNode* parent);
00299
00302 virtual ~FCDTRotation();
00303
00306 virtual Type GetType() const { return ROTATION; }
00307
00311 inline FMVector3& GetAxis() { return axis; }
00312 inline const FMVector3& GetAxis() const { return axis; }
00316 inline void SetAxis(const FMVector3& _axis) { axis = _axis; }
00317
00322 inline void SetAxis(float x, float y, float z) { axis = FMVector3(x, y, z); }
00323
00327 inline float& GetAngle() { return angle; }
00328 inline const float& GetAngle() const { return angle; }
00332 inline void SetAngle(float a) { angle = a; }
00333
00337 inline void SetRotation(const FMVector3& _axis, float a) { axis = _axis; angle = a; }
00338
00341 virtual FMMatrix44 ToMatrix() const;
00342
00345 virtual bool IsAnimated() const;
00346
00351 virtual FCDAnimated* GetAnimated();
00352
00358 virtual bool IsInverse(const FCDTransform* transform) const;
00359
00363 virtual FCDTransform* Clone(FCDSceneNode* newParent);
00364
00369 virtual FUStatus LoadFromXML(xmlNode* rotationNode);
00370
00374 virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
00375 };
00376
00383 class FCOLLADA_EXPORT FCDTMatrix : public FCDTransform
00384 {
00385 private:
00386 DeclareObjectType;
00387 FMMatrix44 transform;
00388
00389 public:
00395 FCDTMatrix(FCDocument* document, FCDSceneNode* parent);
00396
00399 virtual ~FCDTMatrix();
00400
00403 virtual Type GetType() const { return MATRIX; }
00404
00408 FMMatrix44& GetTransform() { return transform; }
00409 const FMMatrix44& GetTransform() const { return transform; }
00413 inline void SetTransform(const FMMatrix44& mx) { transform = mx; }
00414
00418 virtual FMMatrix44 ToMatrix() const { return transform; }
00419
00422 virtual bool IsAnimated() const;
00423
00428 virtual FCDAnimated* GetAnimated();
00429
00433 virtual FCDTransform* Clone(FCDSceneNode* newParent);
00434
00439 virtual FUStatus LoadFromXML(xmlNode* matrixNode);
00440
00444 virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
00445 };
00446
00454 class FCOLLADA_EXPORT FCDTLookAt : public FCDTransform
00455 {
00456 private:
00457 DeclareObjectType;
00458 FMVector3 position;
00459 FMVector3 target;
00460 FMVector3 up;
00461
00462 public:
00468 FCDTLookAt(FCDocument* document, FCDSceneNode* parent);
00469
00472 virtual ~FCDTLookAt();
00473
00476 virtual Type GetType() const { return LOOKAT; }
00477
00481 FMVector3& GetPosition() { return position; }
00482 const FMVector3& GetPosition() const { return position; }
00486 inline void SetPosition(const FMVector3& pos) { position = pos; }
00487
00492 inline void SetPosition(float x, float y, float z) { position = FMVector3(x, y, z); }
00493
00497 FMVector3& GetTarget() { return target; }
00498 const FMVector3& GetTarget() const { return target; }
00502 inline void SetTarget(const FMVector3& _target) { target = _target; }
00503
00508 inline void SetTarget(float x, float y, float z) { target = FMVector3(x, y, z); }
00509
00513 FMVector3& GetUp() { return up; }
00514 const FMVector3& GetUp() const { return up; }
00518 inline void SetUp(const FMVector3& _up) { up = _up; }
00519
00524 inline void SetUp(float x, float y, float z) { up = FMVector3(x, y, z); }
00525
00528 virtual FMMatrix44 ToMatrix() const;
00529
00532 virtual bool IsAnimated() const;
00533
00536 virtual FCDAnimated* GetAnimated();
00537
00541 virtual FCDTransform* Clone(FCDSceneNode* newParent);
00542
00547 virtual FUStatus LoadFromXML(xmlNode* lookAtNode);
00548
00552 virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
00553 };
00554
00562 class FCOLLADA_EXPORT FCDTSkew : public FCDTransform
00563 {
00564 private:
00565 DeclareObjectType;
00566 FMVector3 rotateAxis;
00567 FMVector3 aroundAxis;
00568 float angle;
00569
00570 public:
00576 FCDTSkew(FCDocument* document, FCDSceneNode* parent);
00577
00580 virtual ~FCDTSkew();
00581
00584 virtual Type GetType() const { return SKEW; }
00585
00588 const FMVector3& GetRotateAxis() const { return rotateAxis; }
00589
00592 inline void SetRotateAxis(const FMVector3& axis) { rotateAxis = axis; }
00593
00596 const FMVector3& GetAroundAxis() const { return aroundAxis; }
00597
00600 inline void SetAroundAxis(const FMVector3& axis) { aroundAxis = axis; }
00601
00604 const float& GetAngle() { return angle; }
00605
00608 inline void SetAngle(float _angle) { angle = _angle; }
00609
00612 virtual FMMatrix44 ToMatrix() const;
00613
00616 virtual bool IsAnimated() const;
00617
00620 virtual FCDAnimated* GetAnimated();
00621
00625 virtual FCDTransform* Clone(FCDSceneNode* newParent);
00626
00631 virtual FUStatus LoadFromXML(xmlNode* skewNode);
00632
00636 virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
00637 };
00638
00644 class FCOLLADA_EXPORT FCDTFactory
00645 {
00646 private:
00647 FCDTFactory() {}
00648
00649 public:
00656 static FCDTransform* CreateTransform(FCDocument* document, FCDSceneNode* parent, FCDTransform::Type type);
00657
00664 static FCDTransform* CreateTransform(FCDocument* document, FCDSceneNode* parent, xmlNode* node);
00665 };
00666
00667 #endif // _FR_TRANSFORM_H_