00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00013 #ifndef _FBXSDK_SCENE_POSE_H_
00014 #define _FBXSDK_SCENE_POSE_H_
00015
00016 #include <fbxsdk/fbxsdk_def.h>
00017
00018 #include <fbxsdk/core/fbxobject.h>
00019 #include <fbxsdk/core/base/fbxstring.h>
00020 #include <fbxsdk/core/base/fbxarray.h>
00021 #include <fbxsdk/core/base/fbxerror.h>
00022 #include <fbxsdk/core/math/fbxmatrix.h>
00023 #include <fbxsdk/scene/fbxgroupname.h>
00024 #include <fbxsdk/utils/fbxnamehandler.h>
00025
00026 #include <fbxsdk/fbxsdk_nsbegin.h>
00027
00031 typedef struct
00032 {
00034 FbxMatrix mMatrix;
00036 bool mMatrixIsLocal;
00038 FbxNode* mNode;
00039
00040 } FbxPoseInfo;
00041
00042 class FbxAnimStack;
00043 class FbxScene;
00044 class FbxUserNotification;
00045 class FbxPose;
00046
00047 typedef FbxArray<FbxNode*> NodeList;
00048 typedef FbxArray<FbxPose*> PoseList;
00049 typedef FbxArray<FbxPoseInfo*> PoseInfoList;
00050
00104 class FBXSDK_DLL FbxPose : public FbxObject
00105 {
00106 FBXSDK_OBJECT_DECLARE(FbxPose,FbxObject);
00107
00108 public:
00112 void SetIsBindPose(bool pIsBindPose);
00113
00117 bool IsBindPose() const { return mType == 'b'; }
00118
00122 bool IsRestPose() const { return mType == 'r'; }
00123
00127 int GetCount() const { return mPoseInfo.GetCount(); }
00128
00136 int Add(FbxNode* pNode, const FbxMatrix& pMatrix, bool pLocalMatrix = false, bool pMultipleBindPose = true);
00137
00141 void Remove(int pIndex);
00142
00148 FbxNameHandler GetNodeName(int pIndex) const;
00149
00156 FbxNode* GetNode(int pIndex) const;
00157
00164 const FbxMatrix& GetMatrix(int pIndex) const;
00165
00171 bool IsLocalMatrix(int pIndex) const;
00172
00180 enum ENameComponent
00181 {
00182 eInitialNameComponent = 1,
00183 eCurrentNameComponent = 2,
00184 eAllNameComponents = 3
00185 };
00186
00192 int Find(const FbxNameHandler& pNodeName, char pCompareWhat = eAllNameComponents) const;
00193
00198 int Find(const FbxNode* pNode) const;
00200
00215 static bool GetPosesContaining(FbxManager& pManager, FbxNode* pNode, PoseList& pPoseList, FbxArray<int>& pIndex);
00216
00226 static bool GetPosesContaining(FbxScene* pScene, FbxNode* pNode, PoseList& pPoseList, FbxArray<int>& pIndex);
00227
00238 static bool GetBindPoseContaining(FbxManager& pManager, FbxNode* pNode, PoseList& pPoseList, FbxArray<int>& pIndex);
00239
00249 static bool GetBindPoseContaining(FbxScene* pScene, FbxNode* pNode, PoseList& pPoseList, FbxArray<int>& pIndex);
00250
00261 static bool GetRestPoseContaining(FbxManager& pManager, FbxNode* pNode, PoseList& pPoseList, FbxArray<int>& pIndex);
00262
00272 static bool GetRestPoseContaining(FbxScene* pScene, FbxNode* pNode, PoseList& pPoseList, FbxArray<int>& pIndex);
00273
00290 bool IsValidBindPose(FbxNode* pRoot, double pMatrixCmpTolerance=0.0001);
00291
00303 bool IsValidBindPoseVerbose(FbxNode* pRoot, NodeList& pMissingAncestors, NodeList& pMissingDeformers, NodeList& pMissingDeformersAncestors, NodeList& pWrongMatrices, double pMatrixCmpTolerance=0.0001);
00304
00313 bool IsValidBindPoseVerbose(FbxNode* pRoot, FbxUserNotification* pUserNotification, double pMatrixCmpTolerance=0.0001);
00314
00322 FbxError& GetError();
00323
00328 enum EErrorCode
00329 {
00330 eError,
00331 eInvalidObject,
00332 eInvalidRoot,
00333 eNotAllAncestorsNodes,
00334 eNotAllDeformingNodes,
00335 eNotAllAncestorsDefinitionNodes,
00336 eRelativeMatrix,
00337 eErrorCount
00338 };
00339
00343 EErrorCode GetLastErrorID() const;
00344
00348 const char* GetLastErrorString() const;
00350
00352
00353
00354
00355
00356
00357
00359 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00360 protected:
00361 FbxPose(FbxManager& pManager, char const* pName);
00362
00363 virtual FbxObject& Copy(const FbxObject& pObject);
00364 virtual void Destruct(bool pRecursive, bool pDependents);
00365 virtual const char* GetTypeName() const;
00366
00367
00368
00369 bool ValidateParams(const FbxNode* pNode, const FbxMatrix& pMatrix, int& pPos);
00370
00371 bool LocalValidateParams(const FbxNode* pNode, const FbxMatrix& pMatrix, int& pPos);
00372 static bool GetSpecificPoseContaining(int poseType, FbxScene* pScene, FbxNode* pNode, PoseList& pPoseList, FbxArray<int>& pIndex);
00373
00374 FbxError mError;
00375
00376 private:
00377 FbxPoseInfo* GetItem(int pIndex) const;
00378 bool IsValidBindPoseCommon(FbxNode* pRoot, NodeList* pMissingAncestors, NodeList* pMissingDeformers, NodeList* pMissingDeformersAncestors, NodeList* pWrongMatrices, double pMatrixCmpTolerance=0.0001);
00379
00380 char mType;
00381 PoseInfoList mPoseInfo;
00382 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
00383 };
00384
00385 #include <fbxsdk/fbxsdk_nsend.h>
00386
00387 #endif