| 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 fbxrenamingstrategy.h |
| 13 | #ifndef _FBXSDK_UTILS_RENAMINGSTRATEGY_H_ |
| 14 | #define _FBXSDK_UTILS_RENAMINGSTRATEGY_H_ |
| 15 | |
| 16 | #include <fbxsdk/fbxsdk_def.h> |
| 17 | |
| 18 | #include <fbxsdk/core/base/fbxcharptrset.h> |
| 19 | #include <fbxsdk/utils/fbxnamehandler.h> |
| 20 | |
| 21 | #include <fbxsdk/fbxsdk_nsbegin.h> |
| 22 | |
| 23 | class FbxScene; |
| 24 | class FbxNode; |
| 25 | |
| 26 | /** This base class is an abstract implementation of a renaming strategy for avoiding name clashes. |
| 27 | * An implementation of a reader (FbxReader) or writer (FbxWriter) class must call a concrete implementation |
| 28 | * of "FbxRenamingStrategyInterface::Rename()" every time a name is imported or exported to avoid name clashes. |
| 29 | * Any class deriving from FbxRenamingStrategyBase must implement FbxRenamingStrategyInterface::Clear(), |
| 30 | * FbxRenamingStrategyInterface::Rename(), and FbxRenamingStrategyInterface::Clone(). |
| 31 | * \nosubgrouping |
| 32 | * \see FbxNameHandler FbxRenamingStrategyNumber |
| 33 | */ |
| 34 | class FBXSDK_DLL FbxRenamingStrategyInterface |
| 35 | { |
| 36 | public: |
| 37 | //! Constructor. |
| 38 | FbxRenamingStrategyInterface(); |
| 39 | |
| 40 | //! Destructor. |
| 41 | virtual ~FbxRenamingStrategyInterface (); |
| 42 | |
| 43 | //! Resets internal state regarding assigned names. |
| 44 | virtual void Clear() = 0; |
| 45 | |
| 46 | /** Rename a name if necessary to avoid name-clash issues. |
| 47 | * \param pName The name to be renamed. |
| 48 | * \return Return \c true on success, \c false otherwise. |
| 49 | */ |
| 50 | virtual bool Rename(FbxNameHandler& pName) = 0; |
| 51 | |
| 52 | /** Create a dynamic renaming strategy instance of the same type as the child class. |
| 53 | * \return New instance. |
| 54 | */ |
| 55 | virtual FbxRenamingStrategyInterface* Clone() = 0; |
| 56 | }; |
| 57 | |
| 58 | /** Implements a renaming strategy that resolves name clashes by adding number postfixes. |
| 59 | * For example, when there are three objects with the same names "MyObject", |
| 60 | * and they will be renamed to "MyObject", "MyObject1" and "MyObject2". |
| 61 | * \nosubgrouping |
| 62 | * \see FbxNameHandler FbxRenamingStrategyBase |
| 63 | */ |
| 64 | class FBXSDK_DLL FbxRenamingStrategyNumber : public FbxRenamingStrategyInterface |
| 65 | { |
| 66 | public: |
| 67 | //! Constructor. |
| 68 | FbxRenamingStrategyNumber(); |
| 69 | |
| 70 | //! Destructor. |
| 71 | virtual ~FbxRenamingStrategyNumber (); |
| 72 | |
| 73 | //! Resets internal state regarding assigned names. |
| 74 | virtual void Clear(); |
| 75 | |
| 76 | /** Rename a name if necessary to avoid name-clash issues. |
| 77 | * \param pName The name to be renamed. |
| 78 | * \return Return \c true on success, \c false otherwise. |
| 79 | */ |
| 80 | virtual bool Rename(FbxNameHandler& pName); |
| 81 | |
| 82 | /** Create a dynamic renaming strategy instance of the same type as the child class. |
| 83 | * \return New instance. |
| 84 | */ |
| 85 | virtual FbxRenamingStrategyInterface* Clone(); |
| 86 | |
| 87 | /***************************************************************************************************************************** |
| 88 | ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! ** |
| 89 | *****************************************************************************************************************************/ |
| 90 | #ifndef DOXYGEN_SHOULD_SKIP_THIS |
| 91 | private: |
| 92 | struct NameCell |
| 93 | { |
| 94 | NameCell(const char* pName) : |
| 95 | mName(pName), |
| 96 | mInstanceCount(0) |
| 97 | { |
| 98 | } |
| 99 | |
| 100 | FbxString mName; |
| 101 | int mInstanceCount; |
| 102 | }; |
| 103 | |
| 104 | FbxArray<NameCell*> mNameArray; |
| 105 | #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/ |
| 106 | }; |
| 107 | |
| 108 | /** The FbxRenamingStrategy object can be set to rename all the objects in a scene. |
| 109 | * It can remove name clashing, remove illegal characters, manage namespaces and manage backward compatibility. |
| 110 | * It is better to choose FbxSceneRenamer instead of this class to simplify the usage. |
| 111 | * \nosubgrouping |
| 112 | * \see FbxSceneRenamer |
| 113 | */ |
| 114 | class FBXSDK_DLL FbxRenamingStrategy : public FbxRenamingStrategyInterface |
| 115 | { |
| 116 | public: |
| 117 | /** \enum EDirection The mode describing the convention direction, from FBX format or to FBX format. |
| 118 | * - \e eToFBX Convert to FBX format from another format. |
| 119 | * - \e eFromFBX Convert from FBX format to another format. |
| 120 | */ |
| 121 | enum EDirection |
| 122 | { |
| 123 | eToFBX, |
| 124 | eFromFBX |
| 125 | }; |
| 126 | |
| 127 | /** Constructor. |
| 128 | * \param pMod The mode describing the convention direction, from FBX format or to FBX format. |
| 129 | * \param pOnCreationRun |
| 130 | */ |
| 131 | FbxRenamingStrategy(EDirection pMod, bool pOnCreationRun = false); |
| 132 | |
| 133 | //! Destructor. |
| 134 | virtual ~FbxRenamingStrategy(); |
| 135 | |
| 136 | /** Rename a name if necessary. |
| 137 | * \param pName The name to be renamed. |
| 138 | * \return Return \c true on success, \c false otherwise. |
| 139 | */ |
| 140 | virtual bool Rename(FbxNameHandler& pName); |
| 141 | |
| 142 | //! Resets internal state regarding assigned names. |
| 143 | virtual void Clear(); |
| 144 | |
| 145 | /** Create a dynamic renaming strategy instance of the same type as the child class. |
| 146 | * \return New instance. |
| 147 | */ |
| 148 | virtual FbxRenamingStrategyInterface* Clone(); |
| 149 | |
| 150 | /** \enum EClashType |
| 151 | * - \e eNameClashAuto |
| 152 | * - \e eNameClashType1 |
| 153 | * - \e eNameClashType2 |
| 154 | */ |
| 155 | enum EClashType |
| 156 | { |
| 157 | eNameClashAuto, |
| 158 | eNameClashType1, |
| 159 | eNameClashType2 |
| 160 | }; |
| 161 | |
| 162 | /** Setup the strategy to perform this algorithm |
| 163 | * \param pType |
| 164 | */ |
| 165 | void SetClashSoverType(EClashType pType); |
| 166 | |
| 167 | /** Returns a name with its prefix removed. |
| 168 | * \param pName A name containing a prefix. |
| 169 | * \return The part of pName following the "::" |
| 170 | */ |
| 171 | static char* NoPrefixName (const char* pName); |
| 172 | |
| 173 | /** Returns a name with its prefix removed. |
| 174 | * \param pName A name containing a prefix. |
| 175 | * \return The part of pName following the "::" |
| 176 | */ |
| 177 | static char* NoPrefixName (FbxString& pName); |
| 178 | |
| 179 | /** Get the namespace of the last renamed object. |
| 180 | * \return Char pointer to the namespace. |
| 181 | */ |
| 182 | virtual char* GetNameSpace() { return mNameSpace.Buffer(); } |
| 183 | |
| 184 | /** Sets the current scene namespace symbol. |
| 185 | * \param pNameSpaceSymbol namespace symbol. |
| 186 | */ |
| 187 | virtual void SetInNameSpaceSymbol(FbxString pNameSpaceSymbol){mInNameSpaceSymbol = pNameSpaceSymbol;} |
| 188 | |
| 189 | /** Sets the wanted scene namespace symbol. |
| 190 | * \param pNameSpaceSymbol namespace symbol. |
| 191 | */ |
| 192 | virtual void SetOutNameSpaceSymbol(FbxString pNameSpaceSymbol){mOutNameSpaceSymbol = pNameSpaceSymbol;} |
| 193 | |
| 194 | /** Sets case sensitivity for name clashing. |
| 195 | * \param pIsCaseSensitive Set to \c true to make the name clashing case sensitive. |
| 196 | */ |
| 197 | virtual void SetCaseSensibility(bool pIsCaseSensitive){mCaseSensitive = pIsCaseSensitive ;} |
| 198 | |
| 199 | /** Sets the flag for character acceptance during renaming. |
| 200 | * \param pReplaceNonAlphaNum Set to \c true to replace illegal characters with an underscore ("_"). |
| 201 | */ |
| 202 | virtual void SetReplaceNonAlphaNum(bool pReplaceNonAlphaNum){mReplaceNonAlphaNum = pReplaceNonAlphaNum;} |
| 203 | |
| 204 | /** Sets the flag for first character acceptance during renaming. |
| 205 | * \param pFirstNotNum Set to \c true to add an underscore to the name if the first character is a number. |
| 206 | */ |
| 207 | virtual void SetFirstNotNum(bool pFirstNotNum){mFirstNotNum = pFirstNotNum;} |
| 208 | |
| 209 | /** Recursively renames all the unparented namespaced objects (Prefix mode) starting from this node. |
| 210 | * \param pNode Parent node. |
| 211 | * \param pIsRoot The root node. |
| 212 | * \remarks This function adds "_NSclash" when it encounters an unparented namespaced object. |
| 213 | */ |
| 214 | virtual bool RenameUnparentNameSpace(FbxNode* pNode, bool pIsRoot = false); |
| 215 | |
| 216 | /** Recursively removes all the unparented namespaced "key" starting from this node. |
| 217 | * \param pNode Parent node. |
| 218 | * \remarks This function removes "_NSclash" when encountered. This is the opposite from RenameUnparentNameSpace. |
| 219 | */ |
| 220 | virtual bool RemoveImportNameSpaceClash(FbxNode* pNode); |
| 221 | |
| 222 | /** Recursively get all the namespace starting from this node's parent. |
| 223 | * \param pNode Parent node. |
| 224 | * \param pNameSpaceList output the namespace list from pNode's parent to the root node. |
| 225 | */ |
| 226 | virtual void GetParentsNameSpaceList(FbxNode* pNode, FbxArray<FbxString*> &pNameSpaceList); |
| 227 | |
| 228 | /** Recursively replace the namespace starting from this node to its children. |
| 229 | * \param pNode Current node. |
| 230 | * \param OldNS The old namespace to be replaced with the NewNs. |
| 231 | * \param NewNS The new namespace to replace OldNs. |
| 232 | */ |
| 233 | virtual bool PropagateNameSpaceChange(FbxNode* pNode, FbxString OldNS, FbxString NewNS); |
| 234 | |
| 235 | /***************************************************************************************************************************** |
| 236 | ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! ** |
| 237 | *****************************************************************************************************************************/ |
| 238 | #ifndef DOXYGEN_SHOULD_SKIP_THIS |
| 239 | protected: |
| 240 | virtual bool RenameToFBX(FbxNameHandler& pName); |
| 241 | virtual bool RenameFromFBX(FbxNameHandler& pName); |
| 242 | virtual FbxString& ReplaceNonAlphaNum(FbxString& pName, const char* pReplace, bool pIgnoreNameSpace); |
| 243 | |
| 244 | EDirection mMode; |
| 245 | EClashType mType; |
| 246 | |
| 247 | struct NameCell |
| 248 | { |
| 249 | NameCell(const char* pName) : |
| 250 | mName(pName), |
| 251 | mInstanceCount(0) |
| 252 | { |
| 253 | } |
| 254 | |
| 255 | FbxString mName; |
| 256 | int mInstanceCount; |
| 257 | }; |
| 258 | |
| 259 | FbxCharPtrSet mStringNameArray; |
| 260 | FbxArray<NameCell*> mExistingNsList; |
| 261 | bool mOnCreationRun; |
| 262 | bool mCaseSensitive; |
| 263 | bool mReplaceNonAlphaNum; |
| 264 | bool mFirstNotNum; |
| 265 | FbxString mNameSpace; |
| 266 | FbxString mInNameSpaceSymbol; //symbol identifying a name space |
| 267 | FbxString mOutNameSpaceSymbol; |
| 268 | #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/ |
| 269 | }; |
| 270 | |
| 271 | /** The FbxSceneRenamer provides a way to easily rename objects in a scene without using the FbxRenamingStrategy class. |
| 272 | * FbxSceneRenamer can remove name clashing and illegal characters. It also manages namespaces. |
| 273 | * |
| 274 | * Example: |
| 275 | * Maya only accepts names with letters, digits, or underscores, and we want to convert |
| 276 | * all the names of a scene from FBX format to Maya format. |
| 277 | * \code |
| 278 | * FbxSceneRenamer lSceneRenamer(pScene); |
| 279 | * lSceneRenamer.RenameFor(FbxSceneRenamer::eFBX_TO_MAYA); |
| 280 | * \endcode |
| 281 | * \nosubgrouping |
| 282 | * \see FbxRenamingStrategy |
| 283 | */ |
| 284 | class FBXSDK_DLL FbxSceneRenamer |
| 285 | { |
| 286 | public: |
| 287 | /** Constructor |
| 288 | * \param pScene A scene which contains objects to be renamed. |
| 289 | */ |
| 290 | FbxSceneRenamer(FbxScene* pScene) {mScene = pScene;}; |
| 291 | |
| 292 | //! Destructor. |
| 293 | virtual ~FbxSceneRenamer(){}; |
| 294 | |
| 295 | /** \enum ERenamingMode The Mode describing from which format to which format. |
| 296 | * - \e eNone |
| 297 | * - \e eMAYA_TO_FBX5 |
| 298 | * - \e eMAYA_TO_FBX_MB75 |
| 299 | * - \e eMAYA_TO_FBX_MB70 |
| 300 | * - \e eFBXMB75_TO_FBXMB70 |
| 301 | * - \e eFBX_TO_FBX |
| 302 | * - \e eMAYA_TO_FBX |
| 303 | * - \e eFBX_TO_MAYA |
| 304 | * - \e eLW_TO_FBX |
| 305 | * - \e eFBX_TO_LW |
| 306 | * - \e eXSI_TO_FBX |
| 307 | * - \e eFBX_TO_XSI |
| 308 | * - \e eMAX_TO_FBX |
| 309 | * - \e eFBX_TO_MAX |
| 310 | * - \e eMB_TO_FBX |
| 311 | * - \e eFBX_TO_MB |
| 312 | * - \e eDAE_TO_FBX |
| 313 | * - \e eFBX_TO_DAE |
| 314 | */ |
| 315 | enum ERenamingMode |
| 316 | { |
| 317 | eNone, |
| 318 | eMAYA_TO_FBX5, |
| 319 | eMAYA_TO_FBX_MB75, |
| 320 | eMAYA_TO_FBX_MB70, |
| 321 | eFBXMB75_TO_FBXMB70, |
| 322 | eFBX_TO_FBX, |
| 323 | eMAYA_TO_FBX, |
| 324 | eFBX_TO_MAYA, |
| 325 | eLW_TO_FBX, |
| 326 | eFBX_TO_LW, |
| 327 | eXSI_TO_FBX, |
| 328 | eFBX_TO_XSI, |
| 329 | eMAX_TO_FBX, |
| 330 | eFBX_TO_MAX, |
| 331 | eMB_TO_FBX, |
| 332 | eFBX_TO_MB, |
| 333 | eDAE_TO_FBX, |
| 334 | eFBX_TO_DAE |
| 335 | }; |
| 336 | |
| 337 | /** Rename the objects of the scene according the specific mode. |
| 338 | * \param pMode A mode describing from which format to which format. |
| 339 | */ |
| 340 | void RenameFor(ERenamingMode pMode); |
| 341 | |
| 342 | /***************************************************************************************************************************** |
| 343 | ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! ** |
| 344 | *****************************************************************************************************************************/ |
| 345 | #ifndef DOXYGEN_SHOULD_SKIP_THIS |
| 346 | private: |
| 347 | void ResolveNameClashing( bool pFromFbx, bool pIgnoreNS, bool pIsCaseSensitive, |
| 348 | bool pReplaceNonAlphaNum, bool pFirstNotNum, |
| 349 | FbxString pInNameSpaceSymbol, FbxString pOutNameSpaceSymbol, |
| 350 | bool pNoUnparentNS/*for MB < 7.5*/, bool pRemoveNameSpaceClash); |
| 351 | |
| 352 | FbxRenamingStrategyInterface* mNodeRenamingStrategy; |
| 353 | FbxScene* mScene; |
| 354 | #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/ |
| 355 | }; |
| 356 | |
| 357 | #include <fbxsdk/fbxsdk_nsend.h> |
| 358 | |
| 359 | #endif /* _FBXSDK_UTILS_RENAMINGSTRATEGY_H_ */ |
| 360 | |
| 361 | |