| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- /****************************************************************************************
-
- Copyright (C) 2015 Autodesk, Inc.
- All rights reserved.
-
- Use of this software is subject to the terms of the Autodesk license agreement
- provided at the time of installation or download, or which otherwise accompanies
- this software in either electronic or hard copy form.
-
- ****************************************************************************************/
- //! \file fbxtransforms.h
- #ifndef _FBXSDK_CORE_MATH_TRANSFORMS_H_
- #define _FBXSDK_CORE_MATH_TRANSFORMS_H_
- #include <fbxsdk/fbxsdk_def.h>
- #include <fbxsdk/core/math/fbxmath.h>
- #include <fbxsdk/core/math/fbxquaternion.h>
- #include <fbxsdk/fbxsdk_nsbegin.h>
- /** FbxLimits defines a limit range for one transform component, either translation, rotation or scaling.
- * One transform component limit contains two part: a min value and a max value limit, which means
- * that each value of the corresponding transform component cannot go beyond the range set by the
- * min and max values. Although the members are identified as X, Y and Z (the W component is ignored)
- * at this level, they are unitless values and will only have meaning within the context they are queried.
- *
- * For each limit, there is one flag to indicate if the limit is active or not. Before accessing the
- * limit info, the caller need to query the flag first to make sure that the retrieved values will be
- * meaningful.
- * \nosubgrouping
- */
- class FBXSDK_DLL FbxLimits
- {
- public:
- //! Constructor
- FbxLimits();
- //! Assignment Operator
- FbxLimits& operator=(const FbxLimits& pLimits);
- /** Retrieve the active state of this limit.
- * \return True if the limit is active.
- */
- bool GetActive() const;
- /** Set the active state of this limit.
- * \param pActive If true, this limit will become globally active.
- */
- void SetActive(const bool pActive);
- /** Get the active state of the minimum X component.
- * \return True if the X component minimum limit is active.
- */
- bool GetMinXActive() const;
- /** Get the active state of the minimum Y component.
- * \return True if the Y component minimum limit is active.
- */
- bool GetMinYActive() const;
- /** Get the active state of the minimum Z component.
- * \return True if the Z component minimum limit is active.
- */
- bool GetMinZActive() const;
- /** Get the active states of the three components of the minimum limit.
- * \param pXActive \c True if the X component minimum limit is active.
- * \param pYActive \c True if the Y component minimum limit is active.
- * \param pZActive \c True if the Z component minimum limit is active.
- */
- void GetMinActive(bool& pXActive, bool& pYActive, bool& pZActive) const;
- /** Get the minimum limits.
- * \return The current X, Y and Z values for the minimum limits.
- */
- FbxDouble3 GetMin() const;
- /** Set the active state of the minimum X component.
- * \param pActive If true, the X component minimum limit will be active.
- */
- void SetMinXActive(bool pActive);
- /** Set the active state of the minimum Y component.
- * \param pActive If true, the Y component minimum limit will be active.
- */
- void SetMinYActive(bool pActive);
- /** Set the active state of the minimum Z component.
- * \param pActive If true, the Z component minimum limit will be active.
- */
- void SetMinZActive(bool pActive);
- /** Set the active states of the three components of the minimum limits.
- * \param pXActive If true, the X component minimum limit will be active.
- * \param pYActive If true, the Y component minimum limit will be active.
- * \param pZActive If true, the Z component minimum limit will be active.
- */
- void SetMinActive(bool pXActive, bool pYActive, bool pZActive);
- /** Set the minimum limits.
- * \param pMin The X, Y and Z values for the minimum limits.
- */
- void SetMin(const FbxDouble3& pMin);
- /** Get the active state of the maximum X component.
- * \return True if the X component maximum limit is active.
- */
- bool GetMaxXActive() const;
- /** Get the active state of the maximum Y component.
- * \return True if the Y component maximum limit is active.
- */
- bool GetMaxYActive() const;
- /** Get the active state of the maximum Z component.
- * \return True if the Z component maximum limit is active.
- */
- bool GetMaxZActive() const;
- /** Get the active states of the three components of the maximum limit.
- * \param pXActive \c True if the X component maximum limit is active.
- * \param pYActive \c True if the Y component maximum limit is active.
- * \param pZActive \c True if the Z component maximum limit is active.
- */
- void GetMaxActive(bool& pXActive, bool& pYActive, bool& pZActive) const;
- /** Get the maximum limits.
- * \return The current X, Y and Z values for the maximum limits.
- */
- FbxDouble3 GetMax() const;
- /** Set the active state of the maximum X component.
- * \param pActive If true, the X component maximum limit will be active.
- */
- void SetMaxXActive(bool pActive);
- /** Set the active state of the maximum Y component.
- * \param pActive If true, the Y component maximum limit will be active.
- */
- void SetMaxYActive(bool pActive);
- /** Set the active state of the maximum Z component.
- * \param pActive If true, the Z component maximum limit will be active.
- */
- void SetMaxZActive(bool pActive);
- /** Set the active states of the three components of the maximum limits.
- * \param pXActive If true, the X component maximum limit will be active.
- * \param pYActive If true, the Y component maximum limit will be active.
- * \param pZActive If true, the Z component maximum limit will be active.
- */
- void SetMaxActive(bool pXActive, bool pYActive, bool pZActive);
- /** Set the maximum limits.
- * \param pMax The X, Y and Z values for the maximum limits.
- */
- void SetMax(const FbxDouble3& pMax);
- /** Find if any of the minimum or maximum active state are set.
- * \return If any component of the minimum or maximum active state are set, true is returned.
- * \remarks The global active state will not count when resolving this.
- */
- bool GetAnyMinMaxActive() const;
-
- /** Apply the active limits to the components of the vector provided.
- * \return The new vector clamped by active limits.
- */
- FbxDouble3 Apply(const FbxDouble3& pVector);
- /*****************************************************************************************************************************
- ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
- *****************************************************************************************************************************/
- #ifndef DOXYGEN_SHOULD_SKIP_THIS
- private:
- enum EMask {eActive=1<<0, eMinX=1<<1, eMinY=1<<2, eMinZ=1<<3, eMaxX=1<<4, eMaxY=1<<5, eMaxZ=1<<6, eAll=eMinX|eMinY|eMinZ|eMaxX|eMaxY|eMaxZ};
- FbxUInt8 mMask;
- FbxDouble3 mMin;
- FbxDouble3 mMax;
- #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
- };
- class FBXSDK_DLL FbxRotationOrder
- {
- public:
- FbxRotationOrder(FbxEuler::EOrder pOrder=FbxEuler::eOrderXYZ);
- FbxEuler::EOrder GetOrder() const;
- void SetOrder(FbxEuler::EOrder pOrder);
- void V2M(FbxAMatrix& pRM, const FbxVector4& pV);
- void M2V(FbxVector4& pV, const FbxAMatrix& pRM);
- bool V2VRef(FbxVector4& pVOut, const FbxVector4& pVIn, const FbxVector4& pVRef);
- private:
- FbxEuler::EOrder mOrder;
- };
- /** Handle transform behaviors such as pivots, limits and offets, etc.
- */
- class FBXSDK_DLL FbxTransform
- {
- public:
- enum EInheritType {eInheritRrSs, eInheritRSrs, eInheritRrs};
- FbxTransform();
- EInheritType GetInheritType() const;
- void SetInheritType(EInheritType pType);
- FbxLimits& GetTranslationLimits();
- FbxLimits& GetRotationLimits();
- FbxLimits& GetScalingLimits();
- FbxRotationOrder& GetRotationOrder();
- bool HasROffset() const;
- bool HasRPivot() const;
- bool HasSOffset() const;
- bool HasSPivot() const;
- bool HasPreRM() const;
- bool HasPostRM() const;
- void SetROffset(const FbxVector4& pROffset);
- void SetRPivot(const FbxVector4& pRPivot);
- void SetSOffset(const FbxVector4& pSOffset);
- void SetSPivot(const FbxVector4& pSPivot);
- void SetPreRM(const FbxVector4& pPreR);
- void SetPostRM(const FbxVector4& pPostR);
- bool GetRotationSpaceForLimitOnly() const;
- void SetRotationSpaceForLimitOnly(bool pRotationSpaceForLimitOnly);
- void DoF2LT(FbxVector4& pLT, const FbxVector4& pDoF, const FbxAMatrix& pLRM, const FbxAMatrix& pLSM);
- void LT2DoF(FbxVector4& pDoF, const FbxVector4& pLT, const FbxAMatrix& pLRM, const FbxAMatrix& pLSM);
- void DoF2LRM(FbxAMatrix& pLRM, const FbxVector4& pRDoF, bool pForLimit=false);
- void LRM2DoF(FbxVector4& pRDoF, const FbxAMatrix& pLRM, bool pForLimit=false);
- void LSM2GSM(FbxAMatrix& pGSM, const FbxAMatrix& pPGSM, const FbxAMatrix& pLSM, const FbxAMatrix& pLRM, const FbxVector4& pPLS);
- void GTRSM2GX(FbxAMatrix& pGX, const FbxVector4& pGT, const FbxAMatrix& pGRM, const FbxAMatrix& pGSM);
- private:
- void SumPivots(FbxVector4& pSum, const FbxAMatrix& pLRM, const FbxAMatrix& pLSM);
- class RotationSpace
- {
- public:
- enum EMask {eHasNothing=0, eHasPreRotM=1<<0, eHasPostRotM=1<<1};
- RotationSpace();
- bool HasPreRM() const;
- bool HasPostRM() const;
- void GetPreRM(FbxAMatrix& pPreRM) const;
- void GetPostRM(FbxAMatrix& pPostRM) const;
- void SetPreRM(const FbxVector4& pPreR);
- void SetPostRM(const FbxVector4& pPostR);
- void DoF2LRM(FbxAMatrix& pLRM, const FbxVector4& pRDoF);
- void LRM2DoF(FbxVector4& pRDoF, const FbxAMatrix& pLRM);
- FbxUInt8 mMask;
- FbxAMatrix mPreRM;
- FbxAMatrix mPostRM;
- FbxRotationOrder mRotationOrder;
- };
- enum EMask {eHasNothing=0, eHasRotOffset=1<<0, eHasRotPivot=1<<1, eHasScaleOffset=1<<2, eHasScalePivot=1<<3};
- FbxUInt8 mMask;
- EInheritType mInheritType;
- FbxVector4 mROffset;
- FbxVector4 mRPivot;
- FbxVector4 mSOffset;
- FbxVector4 mSPivot;
- FbxLimits mTranslationLimits;
- FbxLimits mRotationLimits;
- FbxLimits mScalingLimits;
- bool mRotationSpaceForLimitOnly;
- RotationSpace mRotationSpace;
- };
- FBXSDK_DLL bool FbxGetContinuousRotation(FbxVector4& pRes, const FbxVector4& pRot, const FbxVector4& pRef, const int* pOrder);
- FBXSDK_DLL void FbxGetContinuousRotation(FbxVector4& pRes, const FbxVector4& pRot, const FbxVector4& pRef);
- #include <fbxsdk/fbxsdk_nsend.h>
- #endif /* _FBXSDK_CORE_MATH_TRANSFORMS_H_ */
|