| 1 | /**************************************************************************************** |
| 2 | |
| 3 | Copyright (C) 2015 Autodesk, Inc. |
| 4 | All rights reserved. |
| 5 | |
| 6 | Use of this software is subject to the terms of the Autodesk license agreement |
| 7 | provided at the time of installation or download, or which otherwise accompanies |
| 8 | this software in either electronic or hard copy form. |
| 9 | |
| 10 | ****************************************************************************************/ |
| 11 | |
| 12 | //! \file fbxsystemunit.h |
| 13 | #ifndef _FBXSDK_CORE_SYSTEM_UNIT_H_ |
| 14 | #define _FBXSDK_CORE_SYSTEM_UNIT_H_ |
| 15 | |
| 16 | #include <fbxsdk/fbxsdk_def.h> |
| 17 | |
| 18 | #include <fbxsdk/core/base/fbxstring.h> |
| 19 | #include <fbxsdk/core/base/fbxarray.h> |
| 20 | |
| 21 | #include <fbxsdk/fbxsdk_nsbegin.h> |
| 22 | |
| 23 | class FbxAMatrix; |
| 24 | class FbxScene; |
| 25 | class FbxNode; |
| 26 | class FbxAnimCurveNode; |
| 27 | |
| 28 | /** \brief This class describes the units of measurement used within a particular scene. |
| 29 | * \nosubgrouping |
| 30 | */ |
| 31 | class FBXSDK_DLL FbxSystemUnit |
| 32 | { |
| 33 | public: |
| 34 | |
| 35 | /** Struct to define various options that you can use to convert the system unit of a scene. |
| 36 | * The default values are: |
| 37 | * mConvertRrsNodes = true |
| 38 | * mConvertLimits = true |
| 39 | * mConvertClusters = true |
| 40 | * mConvertLightIntensity = true |
| 41 | * mConvertPhotometricLProperties = true |
| 42 | * mConvertCameraClipPlanes = true |
| 43 | * |
| 44 | * The default configuration have been tested to give the best conversion results in the majority of the case. |
| 45 | * \remark Changing any of these values will have a direct impact on the whole scene behavior. |
| 46 | */ |
| 47 | struct ConversionOptions |
| 48 | { |
| 49 | //! This flag indicates whether or not to convert the nodes that do not inherit their parent's scale. |
| 50 | bool mConvertRrsNodes; |
| 51 | |
| 52 | //! This flag indicates whether or not to convert limits. |
| 53 | bool mConvertLimits; |
| 54 | |
| 55 | //! This flag indicates whether or not to convert clusters. |
| 56 | bool mConvertClusters; |
| 57 | |
| 58 | //! This flag indicates whether or not to convert the light intensity property. |
| 59 | bool mConvertLightIntensity; |
| 60 | |
| 61 | //! This flag indicates whether or not to convert photometric lights properties. |
| 62 | bool mConvertPhotometricLProperties; |
| 63 | |
| 64 | //! This flag indicates whether or not to convert the cameras clip planes. |
| 65 | bool mConvertCameraClipPlanes; |
| 66 | }; |
| 67 | |
| 68 | FbxSystemUnit(); |
| 69 | |
| 70 | /** Constructor. |
| 71 | * \param pScaleFactor The equivalent number of centimeters in the new system unit. |
| 72 | * For example, an inch unit uses a scale factor of 2.54. |
| 73 | * \param pMultiplier A multiplier factor of pScaleFactor. |
| 74 | */ |
| 75 | FbxSystemUnit(double pScaleFactor, double pMultiplier = 1.0); |
| 76 | |
| 77 | /** Destructor. |
| 78 | */ |
| 79 | ~FbxSystemUnit(); |
| 80 | |
| 81 | //! Predefined system unit for millimeters. |
| 82 | static const FbxSystemUnit mm; |
| 83 | |
| 84 | //! Predefined system unit for decimeters. |
| 85 | static const FbxSystemUnit dm; |
| 86 | |
| 87 | //! Predefined system unit for centimeters. |
| 88 | static const FbxSystemUnit cm; |
| 89 | |
| 90 | //! Predefined system unit for meters. |
| 91 | static const FbxSystemUnit m; |
| 92 | |
| 93 | //! Predefined system unit for kilometers. |
| 94 | static const FbxSystemUnit km; |
| 95 | |
| 96 | //! Predefined system unit for inches. |
| 97 | static const FbxSystemUnit Inch; |
| 98 | |
| 99 | //! Predefined system unit for feet. |
| 100 | static const FbxSystemUnit ; |
| 101 | |
| 102 | //! Predefined system unit for miles. |
| 103 | static const FbxSystemUnit Mile; |
| 104 | |
| 105 | //! Predefined system unit for yards. |
| 106 | static const FbxSystemUnit Yard; |
| 107 | |
| 108 | #define FBXSDK_SYSTEM_UNIT_PREDEF_COUNT 9 |
| 109 | |
| 110 | //! Points to a FbxSystemUnit array to store the predefined system units. The array size is FBXSDK_SYSTEM_UNIT_PREDEF_COUNT. |
| 111 | static const FbxSystemUnit *sPredefinedUnits; |
| 112 | |
| 113 | //! Stores the default conversion options. |
| 114 | static const ConversionOptions DefaultConversionOptions; |
| 115 | |
| 116 | /** Converts a scene from its system units to this system unit. |
| 117 | * \param pScene The scene to convert. |
| 118 | * \param pOptions Conversion options, see:FbxSystemUnit::ConversionOptions. |
| 119 | */ |
| 120 | void ConvertScene( FbxScene* pScene, const ConversionOptions& pOptions = DefaultConversionOptions ) const; |
| 121 | |
| 122 | /** Converts the child (or children) of the given node from the system unit to this system unit. |
| 123 | * Unlike the ConvertScene() method, this method does not set the axis system |
| 124 | * of the scene to which the pRoot node belongs. It also does not adjust FbxPose |
| 125 | * as they are not stored under the scene, and not under a particular node. |
| 126 | * \param pRoot The given node. |
| 127 | * \param pSrcUnit The source system unit. |
| 128 | * \param pOptions Conversion options, see:FbxSystemUnit::ConversionOptions. |
| 129 | */ |
| 130 | void ConvertChildren( FbxNode* pRoot, const FbxSystemUnit& pSrcUnit, const ConversionOptions& pOptions = DefaultConversionOptions ) const; |
| 131 | |
| 132 | /** Converts a scene from its system unit to this system unit, using the specified |
| 133 | * Fbx_Root node. This method is provided for backwards compatibility only |
| 134 | * and instead you should use ConvertScene( FbxScene* , const ConversionOptions& ) whenever possible. |
| 135 | * \param pScene The scene to convert. |
| 136 | * \param pFbxRoot The Fbx_Root node to use for conversion. |
| 137 | * \param pOptions Conversion options, see:FbxSystemUnit::ConversionOptions |
| 138 | */ |
| 139 | void ConvertScene( FbxScene* pScene, FbxNode* pFbxRoot, const ConversionOptions& pOptions = DefaultConversionOptions ) const; |
| 140 | |
| 141 | /** Returns the system unit's scale factor, relative to centimeters. |
| 142 | * This factor scales system unit values to centimeters. If you want to scale values to centimeters, use this value. |
| 143 | * Ignore the "multiplier" (returned by GetMultiplier()) value. |
| 144 | * \return The the system unit's scale factor, relative to centimeters. |
| 145 | */ |
| 146 | double GetScaleFactor() const; |
| 147 | |
| 148 | /** Returns a unit label for the current scale factor. |
| 149 | * \param pAbbreviated If \c true, returns abbreviated string. |
| 150 | * \return The unit label for the current scale factor. |
| 151 | */ |
| 152 | FbxString GetScaleFactorAsString(bool pAbbreviated = true) const; |
| 153 | |
| 154 | /** Returns a unit label for the current scale factor. |
| 155 | * The first letter of the label is in upper case and the label should be pluralized. |
| 156 | * \return The unit label for the current scale factor. |
| 157 | */ |
| 158 | FbxString GetScaleFactorAsString_Plurial() const; |
| 159 | |
| 160 | /** Returns the multiplier factor of the system unit. |
| 161 | */ |
| 162 | double GetMultiplier() const; |
| 163 | |
| 164 | /** Equivalence operator. |
| 165 | * \param pOther Another system unit compared with this system unit. |
| 166 | * \return \c True if equal, \c false otherwise. |
| 167 | */ |
| 168 | bool operator==(const FbxSystemUnit& pOther) const; |
| 169 | |
| 170 | /** Non-equivalence operator. |
| 171 | * \param pOther Another system unit compared with this system unit. |
| 172 | * \return \c True if unequal, \c false otherwise. |
| 173 | */ |
| 174 | bool operator!=(const FbxSystemUnit& pOther) const; |
| 175 | |
| 176 | /** Assignment operation. |
| 177 | * \param pSystemUnit Unit system assigned to this one. |
| 178 | */ |
| 179 | FbxSystemUnit& operator=(const FbxSystemUnit& pSystemUnit); |
| 180 | |
| 181 | /** Returns the conversion factor from this system unit to the target system unit, excluding the multiplier factor. |
| 182 | * \param pTarget The target system unit. |
| 183 | */ |
| 184 | double GetConversionFactorTo( const FbxSystemUnit& pTarget ) const; |
| 185 | |
| 186 | /** Returns the conversion factor from the source system unit to this system unit, excluding the multiplier factor. |
| 187 | * \param pSource The source system unit. |
| 188 | */ |
| 189 | double GetConversionFactorFrom( const FbxSystemUnit& pSource ) const; |
| 190 | |
| 191 | /***************************************************************************************************************************** |
| 192 | ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! ** |
| 193 | *****************************************************************************************************************************/ |
| 194 | #ifndef DOXYGEN_SHOULD_SKIP_THIS |
| 195 | private: |
| 196 | void ApplyMultiplier(FbxNode* pRoot, bool pSubChildrenOnly) const; |
| 197 | void ConvertSTProperties(FbxArray<FbxNode*>& pNodes, double pConversionFactor) const; |
| 198 | void ConvertSProperty(FbxArray<FbxNode*>& pNodes, double pConversionFactor) const; |
| 199 | void ConvertAnimCurveNode(FbxArray<FbxAnimCurveNode*>& pFCurves, double pConversionFactor) const; |
| 200 | double GetConversionFactor(double pTargetScaleFactor, double pSourceScaleFactor) const; |
| 201 | void AdjustPivots(FbxNode* pNode, double pConversionFactor, FbxAMatrix& pOriginalGlobalM ) const; |
| 202 | void AdjustLimits(FbxNode* pNode, double pConversionFactor) const; |
| 203 | void AdjustPoses(FbxScene* pScene, double pConversionFactor) const; |
| 204 | void AdjustCluster(FbxNode* pNode, double pConversionFactor) const; |
| 205 | void AdjustLightIntensity(FbxNode* pNode, const double pConversionFactor) const; |
| 206 | void AdjustPhotometricLightProperties(FbxNode* pNode, const double pConversionFactor) const; |
| 207 | void AdjustCameraClipPlanes(FbxNode* pNode, const double pConversionFactor) const; |
| 208 | void ConvertChildren(FbxNode* pRoot, const FbxSystemUnit& pSrcUnit, bool pSubChildrenOnly, const ConversionOptions& pOptions) const; |
| 209 | |
| 210 | double mScaleFactor; |
| 211 | double mMultiplier; |
| 212 | |
| 213 | friend class FbxGlobalSettings; |
| 214 | #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/ |
| 215 | }; |
| 216 | |
| 217 | #include <fbxsdk/fbxsdk_nsend.h> |
| 218 | |
| 219 | #endif /* _FBXSDK_CORE_SYSTEM_UNIT_H_ */ |
| 220 | |