| 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 fbxreader.h |
| 13 | #ifndef _FBXSDK_FILEIO_READER_H_ |
| 14 | #define _FBXSDK_FILEIO_READER_H_ |
| 15 | |
| 16 | #include <fbxsdk/fbxsdk_def.h> |
| 17 | |
| 18 | #include <fbxsdk/core/base/fbxarray.h> |
| 19 | #include <fbxsdk/core/base/fbxstring.h> |
| 20 | #include <fbxsdk/core/base/fbxtime.h> |
| 21 | #include <fbxsdk/fileio/fbx/fbxio.h> |
| 22 | |
| 23 | #include <fbxsdk/fbxsdk_nsbegin.h> |
| 24 | |
| 25 | class FbxManager; |
| 26 | class FbxFile; |
| 27 | class FbxStream; |
| 28 | class FbxObject; |
| 29 | class FbxDocument; |
| 30 | class FbxDocumentInfo; |
| 31 | class FbxScene; |
| 32 | class FbxImporter; |
| 33 | class FbxIOSettings; |
| 34 | class FbxAxisSystem; |
| 35 | class FbxStatistics; |
| 36 | class FbxSystemUnit; |
| 37 | class FbxNode; |
| 38 | class FbxProgress; |
| 39 | class FbxTakeInfo; |
| 40 | |
| 41 | /** Base class of other readers used internally. |
| 42 | * This class provides the interfaces for reading files. |
| 43 | * |
| 44 | * The role of the reader is to effectively "read" specific file data |
| 45 | * vs the role of the importer is to select a specific reader |
| 46 | * and launch the reading of a file through that reader. |
| 47 | * \see FbxImporter |
| 48 | * |
| 49 | * ex: |
| 50 | * - FbxReaderFbx5 can read FBX 5 format files |
| 51 | * - FbxReaderFbx6 can read FBX 6 format files |
| 52 | * - FbxReaderFbx7 can read FBX 7 format files |
| 53 | * - FbxReaderCollada can read Collada files |
| 54 | * - FbxReaderDxf can read Dxf files |
| 55 | * - ... etc. |
| 56 | * |
| 57 | * A SDK user should - normally - not use this class, |
| 58 | * except if a custom reader must be created for plug-in extension, |
| 59 | * then FbxReader must be the base class for |
| 60 | * the new custom reader in that particular situation. |
| 61 | * \nosubgrouping |
| 62 | */ |
| 63 | |
| 64 | class FBXSDK_DLL FbxReader |
| 65 | { |
| 66 | public: |
| 67 | /** Constructor. |
| 68 | * \param pManager The FbxManager Object. |
| 69 | * \param pID Id for current reader. |
| 70 | * \param pStatus The FbxStatus object to hold error codes. |
| 71 | */ |
| 72 | FbxReader(FbxManager& pManager, int pID, FbxStatus& pStatus); |
| 73 | |
| 74 | /** Destructor. |
| 75 | */ |
| 76 | virtual ~FbxReader(); |
| 77 | |
| 78 | /** Information type to request. |
| 79 | * \remarks Used internally to get reader file information. |
| 80 | */ |
| 81 | enum EInfoRequest |
| 82 | { |
| 83 | eInfoExtension, //!< To get the file ext for a reader ex: "FBX". |
| 84 | eInfoDescriptions, //!< To get the file description for a reader ex: "Autodesk FBX (*.fbx)". |
| 85 | eReserved1 = 0xFBFB, |
| 86 | }; |
| 87 | |
| 88 | /** Flags for reading parts of file. |
| 89 | * \remarks Used internally when an importer is initialized to get some information very fast. |
| 90 | */ |
| 91 | enum EFileOpenSpecialFlags |
| 92 | { |
| 93 | eParseForGlobalSettings = 1, //!< Used for reading the Global settings section when an importer is initialized. |
| 94 | eParseForStatistics = 2 //!< Used for reading a group of statistics when an importer is initialized. |
| 95 | }; |
| 96 | |
| 97 | /** \internal Helper typedef for passing FbxReader creator function as argument (used internally) */ |
| 98 | typedef FbxReader* (*CreateFuncType)(FbxManager& pManager, FbxImporter& pImporter, int pSubID, int pPluginID); |
| 99 | |
| 100 | /** \internal Helper typedef for passing FbxIOSettings creator function as argument (used internally) */ |
| 101 | typedef void (*IOSettingsFillerFuncType)(FbxIOSettings& pIOS); |
| 102 | |
| 103 | /** \internal Helper typedef for passing EInfoRequest function as argument (used internally) */ |
| 104 | typedef void* (*GetInfoFuncType)(EInfoRequest pRequest, int pReaderTypeId); |
| 105 | |
| 106 | /** Returns the file version. |
| 107 | * \param pMajor Major version. |
| 108 | * \param pMinor Minor version. |
| 109 | * \param pRevision Revision version. |
| 110 | */ |
| 111 | virtual void GetVersion(int& pMajor, int& pMinor, int& pRevision){ pMajor = pMinor = pRevision = 0; } |
| 112 | |
| 113 | /** Opens the file with default flag |
| 114 | * \param pFileName Name of the File to open |
| 115 | * \return If the file opens successfully return \c true, otherwise return \c false. |
| 116 | */ |
| 117 | virtual bool FileOpen(char* pFileName) = 0; |
| 118 | |
| 119 | /** Opens the stream with default flag |
| 120 | * \param pStream stream to open |
| 121 | * \param pStreamData user-defined stream data |
| 122 | * \return If the stream opens successfully return \c true, otherwise return \c false. |
| 123 | */ |
| 124 | virtual bool FileOpen(FbxStream* pStream, void* pStreamData); |
| 125 | |
| 126 | /** Closes the file stream |
| 127 | * \return \c false |
| 128 | */ |
| 129 | virtual bool FileClose() = 0; |
| 130 | |
| 131 | /** Checks if the file stream is open. |
| 132 | * \return \c false. |
| 133 | */ |
| 134 | virtual bool IsFileOpen() = 0; |
| 135 | |
| 136 | /** Returns file stream options |
| 137 | * \param pParseFileAsNeeded Sets whether to parse file as read options |
| 138 | * \return true on success, otherwise return false. |
| 139 | */ |
| 140 | virtual bool GetReadOptions(bool pParseFileAsNeeded = true) = 0; |
| 141 | |
| 142 | /** Reads file with stream options |
| 143 | * \param pDocument FbxDocument to store the file data |
| 144 | * \return \c false. |
| 145 | */ |
| 146 | virtual bool Read(FbxDocument* pDocument) = 0; |
| 147 | |
| 148 | #ifndef FBXSDK_ENV_WINSTORE |
| 149 | /** Reads extension plug-ins name, version and parameters, so that we can remember if a plug-in was used during export. |
| 150 | * This is especially useful for extension plug-ins that modify the scene and also to warn users during import if an |
| 151 | * extension plug-in was used that could be missing. |
| 152 | * \param pParams The parameters of the extension plug-in. The properties of the objects are used |
| 153 | * as the parameters of the extension plug-in. |
| 154 | * \remark This function has no implementation in this class. Only sub-class should implement it as needed. For example, |
| 155 | * FBX 6 and FBX 7 does implement it. |
| 156 | */ |
| 157 | virtual void PluginReadParameters(FbxObject& pParams); |
| 158 | #endif /* !FBXSDK_ENV_WINSTORE */ |
| 159 | |
| 160 | /** Opens the file with specific EFileOpenSpecialFlags |
| 161 | * \param pFileName Name of the File to open. |
| 162 | * \param pFlags The EFileOpenSpecialFlags to open with |
| 163 | * \return If the file opens successfully return true, otherwise return false. |
| 164 | */ |
| 165 | virtual bool FileOpen(char* pFileName, EFileOpenSpecialFlags /*pFlags*/){ return FileOpen(pFileName); } |
| 166 | |
| 167 | /** Returns the system axis information and file system units from the file |
| 168 | * \param pAxisSystem Axis system in file |
| 169 | * \param pSystemUnits System unit in file |
| 170 | * \return \c false. |
| 171 | */ |
| 172 | virtual bool GetAxisInfo(FbxAxisSystem* /*pAxisSystem*/, FbxSystemUnit* /*pSystemUnits*/){ return false; } |
| 173 | |
| 174 | /** Returns statistics from the file |
| 175 | * \param pStats Statistics in the file. |
| 176 | * \return \c false. |
| 177 | */ |
| 178 | virtual bool GetStatistics(FbxStatistics* /*pStats*/){ return false; } |
| 179 | |
| 180 | /** Get FBX file time mode read from GlobalSettings in FBX 6.n and FBX 7.n |
| 181 | * \param pTimeMode ref to a FbxTime::EMode enum |
| 182 | * \return \c true on success, \c false otherwise. |
| 183 | * \remarks This function must be called after FbxImporter::Initialize(). |
| 184 | * Can be used for statistics (via GlobalSettings) before loading the whole scene from the file. |
| 185 | */ |
| 186 | virtual bool GetFrameRate(FbxTime::EMode& pTimeMode) { pTimeMode = FbxTime::eDefaultMode; return false; } |
| 187 | |
| 188 | |
| 189 | /** Returns the scene info from the file. |
| 190 | * \return NULL. |
| 191 | */ |
| 192 | virtual FbxDocumentInfo* GetSceneInfo(){return NULL;} |
| 193 | |
| 194 | /** Returns the list of take infos from the file. |
| 195 | * \return NULL |
| 196 | */ |
| 197 | virtual FbxArray<FbxTakeInfo*>* GetTakeInfo(){return NULL;} |
| 198 | |
| 199 | /** If default camera resolution is OK, returns information about the resolution of the render. |
| 200 | * \param pCamName Default camera name. |
| 201 | * \param pResolutionMode Default resolution mode. |
| 202 | * \param pW Default resolution width. |
| 203 | * \param pH Default resolution height. |
| 204 | * \return \c true If default camera resolution is OK, \c false Otherwise. |
| 205 | */ |
| 206 | virtual bool GetDefaultRenderResolution(FbxString& pCamName, FbxString& pResolutionMode, double& pW, double& pH); |
| 207 | |
| 208 | /** Judges if the format of the file is was created by an Autodesk plug-in. |
| 209 | * An internal (genuine) plug-in is one created by the Autodesk FBX product team. |
| 210 | * \return \c true If the file format is internal plug-in , \c false Otherwise. |
| 211 | */ |
| 212 | bool IsGenuine(); |
| 213 | |
| 214 | /** Access to a IOSettings object. |
| 215 | * \return A pointer to IOSettings used for this reader or NULL if the object |
| 216 | * has not been allocated. |
| 217 | */ |
| 218 | virtual FbxIOSettings * GetIOSettings(); |
| 219 | |
| 220 | /** Set the IOSettings pointer to be used for this reader instance. |
| 221 | * \param pIOSettings |
| 222 | */ |
| 223 | virtual void SetIOSettings(FbxIOSettings * pIOSettings); |
| 224 | |
| 225 | /** Pass a progress handler to the reader. |
| 226 | * \param pProgress FbxProgress to store the progress information. |
| 227 | */ |
| 228 | virtual void SetProgressHandler(FbxProgress* /*pProgress*/){} |
| 229 | |
| 230 | virtual void (const char* /*pExtractFolder*/){} |
| 231 | |
| 232 | /** Returns true if this reader supports FbxStream I/O. Default value is false. */ |
| 233 | virtual bool SupportsStreams() const; |
| 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 | virtual bool FileOpen(FbxFile * pFile); |
| 240 | |
| 241 | FbxStatus& GetStatus() { return mStatus; } |
| 242 | |
| 243 | protected: |
| 244 | void SetDefaultRenderResolution(const char* pCamName, const char* pResolutionMode, double pW, double pH); |
| 245 | #ifndef FBXSDK_ENV_WINSTORE |
| 246 | void PluginsReadBegin(FbxScene& pScene); |
| 247 | void PluginsRead(const char* pName, const char* pVersion); |
| 248 | void PluginsReadEnd(FbxScene& pScene); |
| 249 | #endif /* !FBXSDK_ENV_WINSTORE */ |
| 250 | FbxReader& operator=(FbxReader const&) { return *this; } |
| 251 | virtual bool CheckDuplicateNodeNames(FbxNode* pRootNode, FbxString& pDuplicateNodeNameList); |
| 252 | |
| 253 | FbxStatus& mStatus; |
| 254 | FbxManager& mManager; |
| 255 | FbxIODefaultRenderResolution* mData; |
| 256 | |
| 257 | private: |
| 258 | int mInternalID; |
| 259 | FbxIOSettings* mIOSettings; |
| 260 | |
| 261 | friend struct FbxReaderFbx7_Impl; |
| 262 | #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/ |
| 263 | }; |
| 264 | |
| 265 | //! Helper to access the IOSetting object pointer as a ref ex: IOS_REF.GetBoolProp( ... ); |
| 266 | #define IOS_REF (*GetIOSettings()) |
| 267 | |
| 268 | #include <fbxsdk/fbxsdk_nsend.h> |
| 269 | |
| 270 | #endif /* _FBXSDK_FILEIO_READER_H_ */ |
| 271 | |