00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00021 #ifndef _FCD_TRANSFORM_H_
00022 #define _FCD_TRANSFORM_H_
00023
00024 class FCDocument;
00025 class FCDAnimated;
00026 class FCDSceneNode;
00027 class FCDTransform;
00028
00029 #ifndef __FCD_OBJECT_H_
00030 #include "FCDocument/FCDObject.h"
00031 #endif // __FCD_OBJECT_H_
00032 #ifndef _FM_QUATERNION_H_
00033 #include "FMath/FMQuaternion.h"
00034 #endif // _FM_QUATERNION_H_
00035 #ifndef _FCD_PARAMETER_ANIMATABLE_H_
00036 #include "FCDocument/FCDParameterAnimatable.h"
00037 #endif // _FCD_PARAMETER_ANIMATABLE_H_
00038
00048 class FCOLLADA_EXPORT FCDTransform : public FCDObject
00049 {
00050 public:
00052 enum Type
00053 {
00054 TRANSLATION,
00055 ROTATION,
00056 SCALE,
00057 MATRIX,
00058 LOOKAT,
00059 SKEW,
00060 TYPE_COUNT
00061 };
00062
00063 private:
00064 DeclareObjectType(FCDObject);
00065 FCDSceneNode* parent;
00066 DeclareParameter(fm::string, FUParameterQualifiers::SIMPLE, sid, FC("Sub-id"));
00067
00068 public:
00075 FCDTransform(FCDocument* document, FCDSceneNode* parent);
00076
00078 virtual ~FCDTransform();
00079
00083 FCDSceneNode* GetParent() { return parent; }
00084 const FCDSceneNode* GetParent() const { return parent; }
00087 DEPRECATED(3.05, SetValueChange)
00088 void SetTransformsDirtyFlag();
00089
00093 virtual FCDTransform* Clone(FCDTransform* clone = NULL) const = 0;
00094
00098 virtual Type GetType() const = 0;
00099
00103 virtual FMMatrix44 ToMatrix() const = 0;
00104
00109 inline FUParameterString& GetSubId() { return sid; }
00110 inline const FUParameterString& GetSubId() const { return sid; }
00116 void SetSubId(const fm::string& subId);
00117
00120 virtual bool IsAnimated() const = 0;
00121
00125 inline FCDAnimated* GetAnimated() { return const_cast<FCDAnimated*>(const_cast<const FCDTransform*>(this)->GetAnimated()); }
00126 virtual const FCDAnimated* GetAnimated() const = 0;
00134 virtual bool IsInverse(const FCDTransform* transform) const;
00135
00137 virtual void SetValueChange();
00138 };
00139
00146 class FCOLLADA_EXPORT FCDTTranslation : public FCDTransform
00147 {
00148 private:
00149 DeclareObjectType(FCDTransform);
00150 DeclareParameterAnimatable(FMVector3, FUParameterQualifiers::VECTOR, translation, FC("Translation"));
00151
00152 public:
00160 FCDTTranslation(FCDocument* document, FCDSceneNode* parent);
00161
00163 virtual ~FCDTTranslation();
00164
00167 virtual Type GetType() const { return TRANSLATION; }
00168
00172 inline FCDParameterAnimatableVector3& GetTranslation() { return translation; }
00173 inline const FCDParameterAnimatableVector3& GetTranslation() const { return translation; }
00177 inline void SetTranslation(const FMVector3& _translation) { translation = _translation; SetValueChange(); }
00178
00183 inline void SetTranslation(float x, float y, float z) { translation = FMVector3(x, y, z); SetValueChange(); }
00184
00187 virtual FMMatrix44 ToMatrix() const;
00188
00191 virtual bool IsAnimated() const;
00192
00196 inline FCDAnimated* GetAnimated() { return Parent::GetAnimated(); }
00197 virtual const FCDAnimated* GetAnimated() const;
00204 virtual bool IsInverse(const FCDTransform* transform) const;
00205
00209 virtual FCDTransform* Clone(FCDTransform* clone = NULL) const;
00210 };
00211
00217 class FCOLLADA_EXPORT FCDTScale : public FCDTransform
00218 {
00219 private:
00220 DeclareObjectType(FCDTransform);
00221 DeclareParameterAnimatable(FMVector3, FUParameterQualifiers::VECTOR, scale, FC("Scale"));
00222
00223 public:
00231 FCDTScale(FCDocument* document, FCDSceneNode* parent);
00232
00234 virtual ~FCDTScale();
00235
00238 virtual Type GetType() const { return SCALE; }
00239
00243 inline FCDParameterAnimatableVector3& GetScale() { return scale; }
00244 inline const FCDParameterAnimatableVector3& GetScale() const { return scale; }
00248 inline void SetScale(const FMVector3& _scale) { scale = _scale; SetValueChange(); }
00249
00254 inline void SetScale(float x, float y, float z) { scale = FMVector3(x, y, z); SetValueChange(); }
00255
00258 virtual FMMatrix44 ToMatrix() const;
00259
00262 virtual bool IsAnimated() const;
00263
00267 inline FCDAnimated* GetAnimated() { return Parent::GetAnimated(); }
00268 virtual const FCDAnimated* GetAnimated() const;
00273 virtual FCDTransform* Clone(FCDTransform* clone = NULL) const;
00274 };
00275
00283 class FCOLLADA_EXPORT FCDTRotation : public FCDTransform
00284 {
00285 private:
00286 DeclareObjectType(FCDTransform);
00287 DeclareParameterAnimatable(FMAngleAxis, FUParameterQualifiers::SIMPLE, angleAxis, FC("Angle-axis"));
00288
00289 public:
00297 FCDTRotation(FCDocument* document, FCDSceneNode* parent);
00298
00300 virtual ~FCDTRotation();
00301
00304 virtual Type GetType() const { return ROTATION; }
00305
00308 inline FCDParameterAnimatableAngleAxis& GetAngleAxis() { return angleAxis; }
00309 inline const FCDParameterAnimatableAngleAxis& GetAngleAxis() const { return angleAxis; }
00313 inline void SetAngleAxis(const FMAngleAxis& aa) { angleAxis = aa; SetValueChange(); }
00314
00318 inline FMVector3& GetAxis() { return angleAxis->axis; }
00319 inline const FMVector3& GetAxis() const { return angleAxis->axis; }
00323 inline void SetAxis(const FMVector3& axis) { angleAxis->axis = axis; SetValueChange(); }
00324
00329 inline void SetAxis(float x, float y, float z) { angleAxis->axis = FMVector3(x, y, z); SetValueChange(); }
00330
00334 inline float& GetAngle() { return angleAxis->angle; }
00335 inline const float& GetAngle() const { return angleAxis->angle; }
00339 inline void SetAngle(float a) { angleAxis->angle = a; SetValueChange(); }
00340
00344 inline void SetRotation(const FMVector3& axis, float angle) { angleAxis = FMAngleAxis(axis, angle); SetValueChange(); }
00345
00348 inline FMQuaternion GetOrientation() { return FMQuaternion(angleAxis->axis, FMath::DegToRad(angleAxis->angle)); }
00349
00352 inline void SetOrientation(const FMQuaternion& q) { q.ToAngleAxis(angleAxis->axis, angleAxis->angle); angleAxis->angle = FMath::RadToDeg(angleAxis->angle); SetValueChange(); }
00353
00356 virtual FMMatrix44 ToMatrix() const;
00357
00360 virtual bool IsAnimated() const;
00361
00366 inline FCDAnimated* GetAnimated() { return Parent::GetAnimated(); }
00367 virtual const FCDAnimated* GetAnimated() const;
00374 virtual bool IsInverse(const FCDTransform* transform) const;
00375
00379 virtual FCDTransform* Clone(FCDTransform* clone = NULL) const;
00380 };
00381
00388 class FCOLLADA_EXPORT FCDTMatrix : public FCDTransform
00389 {
00390 private:
00391 DeclareObjectType(FCDTransform);
00392 DeclareParameterAnimatable(FMMatrix44, FUParameterQualifiers::SIMPLE, transform, FC("Transform"));
00393
00394 public:
00400 FCDTMatrix(FCDocument* document, FCDSceneNode* parent);
00401
00403 virtual ~FCDTMatrix();
00404
00407 virtual Type GetType() const { return MATRIX; }
00408
00412 inline FCDParameterAnimatableMatrix44& GetTransform() { return transform; }
00413 inline const FCDParameterAnimatableMatrix44& GetTransform() const { return transform; }
00417 inline void SetTransform(const FMMatrix44& mx) { transform = mx; SetValueChange(); }
00418
00422 virtual FMMatrix44 ToMatrix() const { return transform; }
00423
00426 virtual bool IsAnimated() const;
00427
00432 inline FCDAnimated* GetAnimated() { return Parent::GetAnimated(); }
00433 virtual const FCDAnimated* GetAnimated() const;
00438 virtual FCDTransform* Clone(FCDTransform* clone = NULL) const;
00439 };
00440
00448 class FCOLLADA_EXPORT FCDTLookAt : public FCDTransform
00449 {
00450 private:
00451 DeclareObjectType(FCDTransform);
00452 DeclareParameterAnimatable(FMLookAt, FUParameterQualifiers::SIMPLE, lookAt, FC("LookAt"));
00453
00454 public:
00460 FCDTLookAt(FCDocument* document, FCDSceneNode* parent);
00461
00463 virtual ~FCDTLookAt();
00464
00467 virtual Type GetType() const { return LOOKAT; }
00468
00471 inline FCDParameterAnimatableLookAt& GetLookAt() { return lookAt; }
00472 inline const FCDParameterAnimatableLookAt& GetLookAt() const { return lookAt; }
00476 inline void SetLookAt(const FMLookAt& _lookAt) { lookAt = _lookAt; SetValueChange(); }
00477
00480 FMVector3& GetPosition() { return lookAt->position; }
00481 const FMVector3& GetPosition() const { return lookAt->position; }
00485 inline void SetPosition(const FMVector3& pos) { lookAt->position = pos; SetValueChange(); }
00486
00491 inline void SetPosition(float x, float y, float z) { lookAt->position = FMVector3(x, y, z); SetValueChange(); }
00492
00495 FMVector3& GetTarget() { return lookAt->target; }
00496 const FMVector3& GetTarget() const { return lookAt->target; }
00500 inline void SetTarget(const FMVector3& target) { lookAt->target = target; SetValueChange(); }
00501
00506 inline void SetTarget(float x, float y, float z) { lookAt->target = FMVector3(x, y, z); SetValueChange(); }
00507
00510 FMVector3& GetUp() { return lookAt->up; }
00511 const FMVector3& GetUp() const { return lookAt->up; }
00515 inline void SetUp(const FMVector3& up) { lookAt->up = up; SetValueChange(); }
00516
00521 inline void SetUp(float x, float y, float z) { lookAt->up = FMVector3(x, y, z); SetValueChange(); }
00522
00525 virtual FMMatrix44 ToMatrix() const;
00526
00530 virtual bool IsAnimated() const;
00531
00536 inline FCDAnimated* GetAnimated() { return Parent::GetAnimated(); }
00537 virtual const FCDAnimated* GetAnimated() const;
00542 virtual FCDTransform* Clone(FCDTransform* clone = NULL) const;
00543 };
00544
00552 class FCOLLADA_EXPORT FCDTSkew : public FCDTransform
00553 {
00554 private:
00555 DeclareObjectType(FCDTransform);
00556 DeclareParameterAnimatable(FMSkew, FUParameterQualifiers::SIMPLE, skew, FC("Skew"));
00557
00558 public:
00564 FCDTSkew(FCDocument* document, FCDSceneNode* parent);
00565
00567 virtual ~FCDTSkew();
00568
00571 virtual Type GetType() const { return SKEW; }
00572
00575 inline FCDParameterAnimatableSkew& GetSkew() { return skew; }
00576 inline const FCDParameterAnimatableSkew& GetSkew() const { return skew; }
00577
00580 inline void SetSkew(const FMSkew& _skew) { skew = _skew; SetValueChange(); }
00581
00584 const FMVector3& GetRotateAxis() const { return skew->rotateAxis; }
00585 FMVector3& GetRotateAxis() { return skew->rotateAxis; }
00589 inline void SetRotateAxis(const FMVector3& axis) { skew->rotateAxis = axis; SetValueChange(); }
00590
00593 inline const FMVector3& GetAroundAxis() const { return skew->aroundAxis; }
00594 inline FMVector3& GetAroundAxis() { return skew->aroundAxis; }
00598 inline void SetAroundAxis(const FMVector3& axis) { skew->aroundAxis = axis; SetValueChange(); }
00599
00602 inline const float& GetAngle() const { return skew->angle; }
00603 inline float& GetAngle() { return skew->angle; }
00607 inline void SetAngle(float angle) { skew->angle = angle; SetValueChange(); }
00608
00611 virtual FMMatrix44 ToMatrix() const;
00612
00615 virtual bool IsAnimated() const;
00616
00619 inline FCDAnimated* GetAnimated() { return Parent::GetAnimated(); }
00620 virtual const FCDAnimated* GetAnimated() const;
00625 virtual FCDTransform* Clone(FCDTransform* clone = NULL) const;
00626 };
00627
00633 class FCOLLADA_EXPORT FCDTFactory
00634 {
00635 private:
00636 FCDTFactory() {}
00637
00638 public:
00645 static FCDTransform* CreateTransform(FCDocument* document, FCDSceneNode* parent, FCDTransform::Type type);
00646 };
00647
00648 #endif // _FR_TRANSFORM_H_