KFbxPose Class Reference

#include <kfbxpose.h>

Inherits KFbxObject.

Inheritance diagram for KFbxPose:

Inheritance graph
List of all members.

Detailed Description

This class contains the description of a Pose manager.

The KFbxPose object can be setup to hold "Bind Pose" data or "Rest Pose" data.

The Bind Pose holds the transformation (translation, rotation and scaling) matrix of all the nodes implied in a link deformation. This includes the geometry being deformed, the links deforming the geometry, and recursively all the ancestors nodes of the link. The Bind Pose gives you the transformation of the nodes at the moment of the binding operation when no deformation occurs.

The Rest Pose is a snapshot of a node transformation. A Rest Pose can be used to store the position of every node of a character at a certain point in time. This pose can then be used as a reference position for animation tasks, like editing walk cycles.

One difference between the two modes is in the validation performed before adding an item and the kind of matrix stored.

In "Bind Pose" mode, the matrix is assumed to be defined in the global space, while in "Rest Pose" the type of the matrix may be specified by the caller. So local system matrices can be used. Actually, because there is one such flag for each entry (KFbxPoseInfo), it is possible to have mixed types in a KFbxPose elements. It is therefore the responsability of the caller to check for the type of the retrieved matrix and to do the appropriate conversions if required.

The validation of the data to be added consists of the following steps:

  1. If this KFbxPose object stores "Bind Poses", then add a KFbxPoseInfo only if the node is not already associated to another "Bind Pose". This check is done by visiting ALL the KFbxPose objects in the system.

The above test is only performed for the "Bind Pose" type. While the next one is always performed, no matter what kind of poses this KFbxPose object is setup to hold.

  1. If a node is already inserted in the KFbxPose internal list, then the passed matrix MUST be equal to the one already stored. If this is not the case, the Add method will return -1, indicating that no new KFbxPoseInfo has been created.

If the Add method succeeds, it will return the index of the KFbxPoseInfo structure that as been created and held by the KFbxPose object.

To ensure data integrity, the stored information can only be accessed using the provided methods (read-only). If an entry needs to be modified, the caller has to remove the KFbxPoseInfo item by calling Remove(i) and then Add a new one.

The internal list is not ordered and the search inside this is list is linear (from the first element to ... the first match or the end of the list).

Definition at line 127 of file kfbxpose.h.

Search Section

enum  KNameComponent
int Find (KName &pNodeName, char pCompareWhat=ALL_NAME_COMPONENTS)
 Look in the KFbxPose object for the given node name.
int Find (KFbxNode *pNode)
 Look in the KFbxPose object for the given node.

Error Management

enum  EError
 Error identifiers. More...
KErrorGetError ()
 Retrieve error object.
EError GetLastErrorID ()
 Get last error code.
char * GetLastErrorString ()
 Get last error string.

Utility Section

bool IsValidBindPose (KFbxNode *pRoot, double pMatrixCmpTolerance=0.0001)
 Check this bindpose and report an error if all the conditions to a valid bind pose are not met.
bool IsValidBindPoseVerbose (KFbxNode *pRoot, KArrayTemplate< KFbxNode * > &pMissingAncestors, KArrayTemplate< KFbxNode * > &pMissingDeformers, KArrayTemplate< KFbxNode * > &pMissingDeformersAncestors, KArrayTemplate< KFbxNode * > &pWrongMatrices, double pMatrixCmpTolerance=0.0001)
 Same as IsValidBindPose but slower because it will not stop as soon as a failure occurs.
bool IsValidBindPoseVerbose (KFbxNode *pRoot, KFbxUserNotification *pUserNotification, double pMatrixCmpTolerance=0.0001)
 Same as IsValidBindPose but slower because it will not stop as soon as a failure occurs.
static bool GetPosesContaining (KFbxSdkManager &pManager, KFbxNode *pNode, KArrayTemplate< KFbxPose * > &pPoseList, KArrayTemplate< int > &pIndex)
 Get the list of Poses objects that contains the node with name pNodeName.
static bool GetPosesContaining (KFbxScene *pScene, KFbxNode *pNode, KArrayTemplate< KFbxPose * > &pPoseList, KArrayTemplate< int > &pIndex)
 Get the list of Poses objects that contains the node with name pNodeName.
static bool GetBindPoseContaining (KFbxSdkManager &pManager, KFbxNode *pNode, KArrayTemplate< KFbxPose * > &pPoseList, KArrayTemplate< int > &pIndex)
 Get the list of BindPose objects that contains the node with name pNodeName.
static bool GetBindPoseContaining (KFbxScene *pScene, KFbxNode *pNode, KArrayTemplate< KFbxPose * > &pPoseList, KArrayTemplate< int > &pIndex)
 Get the list of BindPose objects that contains the node with name pNodeName.
static bool GetRestPoseContaining (KFbxSdkManager &pManager, KFbxNode *pNode, KArrayTemplate< KFbxPose * > &pPoseList, KArrayTemplate< int > &pIndex)
 Get the list of RestPose objects that contains the node with name pNodeName.
static bool GetRestPoseContaining (KFbxScene *pScene, KFbxNode *pNode, KArrayTemplate< KFbxPose * > &pPoseList, KArrayTemplate< int > &pIndex)
 Get the list of RestPose objects that contains the node with name pNodeName.

Public Member Functions

void SetIsBindPose (bool pIsBindPose)
 Set the type of pose.
bool IsBindPose () const
 Pose identifier flag.
bool IsRestPose ()
 Pose identifier flag.
int GetCount () const
 Get number of stored items.
int Add (KFbxNode *pNode, KFbxMatrix &pMatrix, bool pLocalMatrix=false)
 Stores the pose transformation for the given node.
void Remove (int pIndex)
 Remove the pIndexth item from the Pose object.
KName GetNodeName (int pIndex) const
 Get the node name.
KFbxNodeGetNode (int pIndex) const
 Get the node.
const KFbxMatrixGetMatrix (int pIndex) const
 Get the transform matrix.
bool IsLocalMatrix (int pIndex)
 Get the type of the matrix.
virtual KFbxObject::ENameSpace GetNameSpace () const
 Return the type ID of this class.


Member Enumeration Documentation

enum EError

Error identifiers.

  • eERROR
  • eERROR_COUNT

Definition at line 370 of file kfbxpose.h.


Member Function Documentation

void SetIsBindPose ( bool  pIsBindPose  ) 

Set the type of pose.

Parameters:
pIsBindPose If true, type will be bind pose, else rest pose.

bool IsBindPose (  )  const [inline]

Pose identifier flag.

Returns:
true if this object holds BindPose data.

Definition at line 139 of file kfbxpose.h.

bool IsRestPose (  )  [inline]

Pose identifier flag.

Returns:
true if this object holds RestPose data.

Definition at line 144 of file kfbxpose.h.

int GetCount (  )  const [inline]

Get number of stored items.

Returns:
The number of items stored.

Definition at line 149 of file kfbxpose.h.

int Add ( KFbxNode pNode,
KFbxMatrix pMatrix,
bool  pLocalMatrix = false 
)

Stores the pose transformation for the given node.

Parameters:
pNode pointer to the node for which the pose is stored.
pMatrix Pose transform of the node.
pLocalMatrix Flag to indicate if pMatrix is defined in Local or Global space.
Returns:
-1 if the function failed or the index of the stored item.

void Remove ( int  pIndex  ) 

Remove the pIndexth item from the Pose object.

Parameters:
pIndex Index of the item to be removed.

KName GetNodeName ( int  pIndex  )  const

Get the node name.

Parameters:
pIndex Index of the queried item.
Returns:
The node intial and current names.
Remarks:
If the index is invalid ann empty KName is returned.

KFbxNode* GetNode ( int  pIndex  )  const

Get the node.

Parameters:
pIndex Index of the queried item.
Returns:
A pointer to the node referenced.
Remarks:
If the index is invalid or no pointer to a node is set, returns NULL. The returned pointer will become undefined if the KFbxPose object is destroyed.

const KFbxMatrix& GetMatrix ( int  pIndex  )  const

Get the transform matrix.

Parameters:
pIndex Index of the queried item.
Returns:
A reference to the pose matrix.
Remarks:
If the index is invalid a reference to an identiy matrix is returned. The reference will become undefined if the KFbxPose object is destroyed.

bool IsLocalMatrix ( int  pIndex  ) 

Get the type of the matrix.

Parameters:
pIndex Index of the queried item.
Returns:
true if the matrix is defined in the Local coordinate space and false otherwise.
Remarks:
If the KFbxPose object is configured to hold BindPose data, this method will always return false.

int Find ( KName pNodeName,
char  pCompareWhat = ALL_NAME_COMPONENTS 
)

Look in the KFbxPose object for the given node name.

Parameters:
pNodeName Name of the node we are looking for.
pCompareWhat Bitwise or of the following flags: INTIALNAME_COMPONENT, CURRENTNAME_COMPONENT
Returns:
-1 if the node is not in the list. Otherwise, the index of the corresponding KFbxPoseInfo element.

int Find ( KFbxNode pNode  ) 

Look in the KFbxPose object for the given node.

Parameters:
pNode the node we are looking for.
Returns:
-1 if the node is not in the list. Otherwise, the index of the corresponding KFbxPoseInfo element.

static bool GetPosesContaining ( KFbxSdkManager pManager,
KFbxNode pNode,
KArrayTemplate< KFbxPose * > &  pPoseList,
KArrayTemplate< int > &  pIndex 
) [static]

Get the list of Poses objects that contains the node with name pNodeName.

This method will look in all the poses of all the scenes.

Parameters:
pManager Is the manager owning the poses and scenes.
pNode The node we are exploring.
pPosesList List of Bind/RestPoses that have the node.
pIndexList Indices of the node in the corresponding poses lists.
Returns:
true if the node belongs to at least one Pose (either a BindPose or a RestPose).
Remarks:
The pPosesList and pIndexList are filled by this method. The elements of the returned list must not be deleted since they still belong to the scene.

static bool GetPosesContaining ( KFbxScene pScene,
KFbxNode pNode,
KArrayTemplate< KFbxPose * > &  pPoseList,
KArrayTemplate< int > &  pIndex 
) [static]

Get the list of Poses objects that contains the node with name pNodeName.

Parameters:
pScene Is the scene owning the poses.
pNode The node we are exploring.
pPosesList List of Bind/RestPoses that have the node.
pIndexList Indices of the node in the corresponding poses lists.
Returns:
true if the node belongs to at least one Pose (either a BindPose or a RestPose).
Remarks:
The pPosesList and pIndexList are filled by this method. The elements of the returned list must not be deleted since they still belong to the scene.

static bool GetBindPoseContaining ( KFbxSdkManager pManager,
KFbxNode pNode,
KArrayTemplate< KFbxPose * > &  pPoseList,
KArrayTemplate< int > &  pIndex 
) [static]

Get the list of BindPose objects that contains the node with name pNodeName.

This method will look in all the poses of all the scenes.

Parameters:
pManager Is the manager owning the poses.
pNode The node we are exploring.
pPosesList List of BindPoses that have the node.
pIndexList Indices of the node in the corresponding poses lists.
Returns:
true if the node belongs to at least one BindPose.
Remarks:
The pPosesList and pIndexList are filled by this method. The elements of the returned list must not be deleted since they still belong to the scene.

static bool GetBindPoseContaining ( KFbxScene pScene,
KFbxNode pNode,
KArrayTemplate< KFbxPose * > &  pPoseList,
KArrayTemplate< int > &  pIndex 
) [static]

Get the list of BindPose objects that contains the node with name pNodeName.

Parameters:
pScene Is the scene owning the poses.
pNode The node we are exploring.
pPosesList List of BindPoses that have the node.
pIndexList Indices of the node in the corresponding poses lists.
Returns:
true if the node belongs to at least one BindPose.
Remarks:
The pPosesList and pIndexList are filled by this method. The elements of the returned list must not be deleted since they still belong to the scene.

static bool GetRestPoseContaining ( KFbxSdkManager pManager,
KFbxNode pNode,
KArrayTemplate< KFbxPose * > &  pPoseList,
KArrayTemplate< int > &  pIndex 
) [static]

Get the list of RestPose objects that contains the node with name pNodeName.

This method will look in all the poses of all the scenes.

Parameters:
pManager Is the manager owning the poses.
pNode The node we are exploring.
pPosesList List of RestPoses that have the node.
pIndexList Indices of the node in the corresponding poses lists.
Returns:
true if the node belongs to at least one RestPose.
Remarks:
The pPosesList and pIndexList are filled by this method. The elements of the returned list must not be deleted since they still belong to the scene.

static bool GetRestPoseContaining ( KFbxScene pScene,
KFbxNode pNode,
KArrayTemplate< KFbxPose * > &  pPoseList,
KArrayTemplate< int > &  pIndex 
) [static]

Get the list of RestPose objects that contains the node with name pNodeName.

Parameters:
pScene Is the scene owning the poses.
pNode The node we are exploring.
pPosesList List of RestPoses that have the node.
pIndexList Indices of the node in the corresponding poses lists.
Returns:
true if the node belongs to at least one RestPose.
Remarks:
The pPosesList and pIndexList are filled by this method. The elements of the returned list must not be deleted since they still belong to the scene.

bool IsValidBindPose ( KFbxNode pRoot,
double  pMatrixCmpTolerance = 0.0001 
)

Check this bindpose and report an error if all the conditions to a valid bind pose are not met.

The conditions are:

a) We are a BindPose. b) For every node in the bind pose, all their parent node are part of the bind pose. c) All the deforming nodes are part of the bind pose. d) All the parents of the deforming nodes are part of the bind pose. e) Each deformer relative matrix correspond to the deformer Inv(bindMatrix) * deformed Geometry bindMatrix.

Parameters:
pRoot This node is used as the stop point when visiting the parents (cannot be NULL).
pMatrixCmpTolerance Tolerance value when comparing the matrices.
Returns:
true if all the above conditions are met and false otherwise.
Remarks:
If the returned value is false, querying for the error will return the reason of the failure. As soon as one of the above conditions is not met, this method return ignoring any subsequent errors. Run the IsBindPoseVerbose if more details are needed.

bool IsValidBindPoseVerbose ( KFbxNode pRoot,
KArrayTemplate< KFbxNode * > &  pMissingAncestors,
KArrayTemplate< KFbxNode * > &  pMissingDeformers,
KArrayTemplate< KFbxNode * > &  pMissingDeformersAncestors,
KArrayTemplate< KFbxNode * > &  pWrongMatrices,
double  pMatrixCmpTolerance = 0.0001 
)

Same as IsValidBindPose but slower because it will not stop as soon as a failure occurs.

Instead, keeps running to accumulate the faulty nodes (stored in the appropriate array). It is then up to the caller to fill the UserNotification if desired.

Parameters:
pRoot This node is used as the stop point when visiting the parents (cannot be NULL).
pMissingAncestors Each ancestor missing from the BindPose is added to this list.
pMissingDeformers Each deformer missing from the BindPose is added to this list.
pMissingDeformersAncestors Each deformer ancestors missing from the BindPose is added to this list.
pWrongMatrices Nodes that yeld to a wrong matric comparisons are added to this list.
pMatrixCmpTolerance Tolerance value when comparing the matrices.

bool IsValidBindPoseVerbose ( KFbxNode pRoot,
KFbxUserNotification pUserNotification,
double  pMatrixCmpTolerance = 0.0001 
)

Same as IsValidBindPose but slower because it will not stop as soon as a failure occurs.

Instead, keeps running to accumulate the faulty nodes and send them directly to the UserNotification.

Parameters:
pRoot This node is used as the stop point when visiting the parents (cannot be NULL).
pUserNotification Pointer to the user notification where the messages will be accumulated.
pMatrixCmpTolerance Tolerance value when comparing the matrices.
Remarks:
If the pUserNotification parameter is NULL, this method will call IsValidBindPose.

KError& GetError (  ) 

Retrieve error object.

Returns:
Reference to error object.

EError GetLastErrorID (  ) 

Get last error code.

Returns:
Last error code.

char* GetLastErrorString (  ) 

Get last error string.

Returns:
Textual description of the last error.

virtual KFbxObject::ENameSpace GetNameSpace (  )  const [virtual]

Return the type ID of this class.

Returns:
Return KFbxObject::ePOSE.