FBX2glTF/sdk/Darwin/2019.2/include/fbxsdk/scene/geometry/fbxweightedmapping.h

140 lines
5.0 KiB
C++

/****************************************************************************************
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 fbxweightedmapping.h
#ifndef _FBXSDK_SCENE_GEOMETRY_WEIGHTED_MAPPING_H_
#define _FBXSDK_SCENE_GEOMETRY_WEIGHTED_MAPPING_H_
#include <fbxsdk/fbxsdk_def.h>
#include <fbxsdk/core/base/fbxarray.h>
#include <fbxsdk/fbxsdk_nsbegin.h>
/** Define a weighted bidirectional mapping relation on objects.
* \nosubgrouping
* There are two object set. The source object of mapping is in source set.
* The destination object is in destination set.
* Each object can have multiple mapping relation with other objects.
*/
class FBXSDK_DLL FbxWeightedMapping
{
public:
/** Object set type in the mapping relation.
*/
enum ESet
{
eSource, //!< Object is as source.
eDestination //!< Object is as destination.
};
/** Record one mapping from one object. */
struct Element
{
//! The index of another object in the mapping in the another ESet array.
int mIndex;
//! Weight of the mapping.
double mWeight;
};
/**
* \name Constructor and Destructor
*/
//@{
/** Constructor.
* Initialize the source set and destination set.
* \param pSourceSize Source set size
* \param pDestinationSize Destination set size
*/
FbxWeightedMapping(int pSourceSize, int pDestinationSize);
//! Destructor.
~FbxWeightedMapping();
//@}
/** Remove all weighted relations and give new source and destination sets sizes.
* \param pSourceSize New source set size.
* \param pDestinationSize New destination set size.
*/
void Reset(int pSourceSize, int pDestinationSize);
/** Add a weighted mapping relation.
* \param pSourceIndex Index of the source object.
* \param pDestinationIndex Index of the destination object.
* \param pWeight Weight of the mapping.
*/
void Add(int pSourceIndex, int pDestinationIndex, double pWeight);
/** Get the number of elements of a set.
* \param pSet source or destination set.
*/
int GetElementCount(ESet pSet) const;
/** Get the number of relations an element of a set is linked to.
* For example, for one object (which index is specified by pElement) in source set (specified by pSet),
* the function return how many objects (as destination) the object (as source) mapping to.
* \param pSet Source or destination set.
* \param pElement Object index in the set.
*/
int GetRelationCount(ESet pSet, int pElement) const;
/** Get one of the relations an element of a set is linked to.
* \param pSet Source or destination set.
* \param pElement Object index in the set.
* \param pIndex Relation index of the object linked to.
* \return Element gives the index of an element in the other set and the assigned weight.
*/
Element& GetRelation(ESet pSet, int pElement, int pIndex);
/** Given the index of an element in the other set, get the index of one of the relations
* an element of a set is linked to. Returns -1 if there is not relation between these elements.
* \param pSet Source or destination set.
* \param pElementInSet Object index in the set.
* \param pElementInOtherSet Object index in another set.
* \return The index of one of the relations, -1 if there is not relation between these elements.
*/
int GetRelationIndex(ESet pSet, int pElementInSet, int pElementInOtherSet) const;
/** Get the sum of the weights from the relations an element of a set is linked to.
* \param pSet Source or destination set.
* \param pElement Object index in the set.
* \param pAbsoluteValue Flag to convert negative value to positive value.
* \return The sum of the weights from the relations.
*/
double GetRelationSum(ESet pSet, int pElement, bool pAbsoluteValue) const;
/** Normalize the weights of the relations of all the elements of a set.
* \param pSet Source or destination set.
* \param pAbsoluteValue Flag to convert negative value to positive value.
*/
void Normalize(ESet pSet, bool pAbsoluteValue);
FbxWeightedMapping& operator=(const FbxWeightedMapping& pWMap);
private:
//! Remove all weighted relations.
void Clear();
FbxArray<FbxArray<Element>*> mElements[2];
};
typedef class FbxArray<FbxWeightedMapping::Element> FbxArrayTemplateElement;
typedef class FbxArray<FbxArray<FbxWeightedMapping::Element>*> FbxArrayTemplateArrayTemplateElement;
#include <fbxsdk/fbxsdk_nsend.h>
#endif /* _FBXSDK_SCENE_GEOMETRY_WEIGHTED_MAPPING_H_ */