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 fbxexporter.h |
13 | #ifndef _FBXSDK_FILEIO_EXPORTER_H_ |
14 | #define _FBXSDK_FILEIO_EXPORTER_H_ |
15 | |
16 | #include <fbxsdk/fbxsdk_def.h> |
17 | |
18 | #include <fbxsdk/core/fbxevent.h> |
19 | #include <fbxsdk/core/base/fbxstring.h> |
20 | #include <fbxsdk/fileio/fbxiobase.h> |
21 | #include <fbxsdk/fileio/fbxiosettings.h> |
22 | #include <fbxsdk/fileio/fbxprogress.h> |
23 | #include <fbxsdk/utils/fbxrenamingstrategy.h> |
24 | |
25 | #include <fbxsdk/fbxsdk_nsbegin.h> |
26 | |
27 | class FbxIO; |
28 | class ; |
29 | class FbxThread; |
30 | class FbxWriter; |
31 | |
32 | struct FbxExportThreadArg; |
33 | |
34 | /** Class to export SDK objects into an FBX file. |
35 | * Normally this class is used as is. But for very special needs |
36 | * a user can override Initialize() for special purpose. |
37 | * |
38 | * An exporter will select the appropriate writer to a particular file. |
39 | * Ex: When an exporter must export an FBX 7 file, |
40 | * the exporter will ask for all registered writers if an FBX 7 file writer is available, |
41 | * then if a writer is found, the exporter will create |
42 | * the specialized FBX 7 writer and write the file. |
43 | * This way, an exporter can "write" many different type of files like FBX 5/6/7, 3DS, Obj, Dxf, Collada, etc. |
44 | * \see FbxWriter |
45 | * |
46 | * Typical workflow for using the FbxExporter class: |
47 | * -# create a SDKManager |
48 | * -# create an IOSettings object |
49 | * -# create an empty scene |
50 | * -# create an exporter |
51 | * -# initialize it with a file name |
52 | * -# set numerous options to control how the exporter will behave.\n |
53 | * ex: set IOSettings values to export Materials or Textures. |
54 | * -# call FbxExporter::Export() with the entity to export. |
55 | * |
56 | * \code |
57 | * // ex: |
58 | * // create a SdkManager |
59 | * FbxManager* lSdkManager = FbxManager::Create(); |
60 | * |
61 | * // create an IOSettings object |
62 | * FbxIOSettings* ios = FbxIOSettings::Create(lSdkManager, IOSROOT); |
63 | * |
64 | * // set some IOSettings options |
65 | * ios->SetBoolProp(EXP_FBX_MATERIAL, true); |
66 | * ios->SetBoolProp(EXP_FBX_TEXTURE, true); |
67 | * |
68 | * // create an empty scene |
69 | * FbxScene* lScene = FbxScene::Create(lSdkManager, ""); |
70 | * |
71 | * // create an exporter. |
72 | * FbxExporter* lExporter = FbxExporter::Create(lSdkManager, ""); |
73 | * |
74 | * // initialize the exporter by providing a filename and the IOSettings to use |
75 | * lExporter->Initialize("C:\\myfile.fbx", -1, ios); |
76 | * |
77 | * // export the scene. |
78 | * lExporter->Export(lScene); |
79 | * |
80 | * // destroy the exporter |
81 | * lExporter->Destroy(); |
82 | * \endcode |
83 | * |
84 | * \remarks According to the file suffix, a specialized writer will be created internally.\n |
85 | * Ex: for .fbx files a FBX Writer, for .3ds files, a 3ds writer, etc.\n |
86 | * Supported files formats: FBX 5/6/7 Binary & ASCII, Collada, DXF, OBJ, 3DS |
87 | * \nosubgrouping |
88 | */ |
89 | class FBXSDK_DLL FbxExporter : public FbxIOBase |
90 | { |
91 | FBXSDK_OBJECT_DECLARE(FbxExporter, FbxIOBase); |
92 | |
93 | public: |
94 | /** |
95 | * \name Export Functions |
96 | */ |
97 | //@{ |
98 | /** Initialize object. |
99 | * \param pFileName Name of file to access. |
100 | * \param pFileFormat file format identifier User does not need to specify it by default. |
101 | if not specified, plugin will detect the file format according to file suffix automatically. |
102 | * \param pIOSettings client IOSettings, if not specified, a default IOSettings will be created |
103 | * \return \c true on success, \c false otherwise. |
104 | * \remarks To identify the error that occurred, inspect the status object accessed |
105 | * using the GetStatus() function. |
106 | */ |
107 | virtual bool Initialize(const char* pFileName, int pFileFormat = -1, FbxIOSettings* pIOSettings = NULL); |
108 | |
109 | /** Initialize object. |
110 | * \param pStream stream to access. |
111 | * \param pStreamData user-defined stream data. |
112 | * \param pFileFormat file format identifier User does not need to specify it by default. |
113 | if not specified, plugin will request the file format from the stream. |
114 | * \param pIOSettings client IOSettings, if not specified, a default IOSettings will be created |
115 | * \return \c true on success, \c false otherwise. |
116 | * \remarks To identify the error that occurred, inspect the status object accessed |
117 | * using the GetStatus() function. |
118 | */ |
119 | virtual bool Initialize(FbxStream* pStream, void* pStreamData=NULL, int pFileFormat = -1, FbxIOSettings * pIOSettings = NULL); |
120 | |
121 | /** Setup file export options settings. |
122 | * \return \c true on success, \c false otherwise. |
123 | */ |
124 | bool GetExportOptions(); |
125 | |
126 | /** Access to a IOSettings object. |
127 | * \return The pointer to IOSettings or \c NULL \c if the object has not been allocated. |
128 | */ |
129 | FbxIOSettings* GetIOSettings(); |
130 | |
131 | /** Set the IOSettings pointer |
132 | * \param pIOSettings Pointer on a FbxIOSettings object. |
133 | */ |
134 | void SetIOSettings(FbxIOSettings* pIOSettings); |
135 | |
136 | |
137 | /** Export the document to the currently created file. |
138 | * \param pDocument Document to export. |
139 | * \param pNonBlocking If true, the export process will be executed in a new thread, allowing it to be non-blocking. |
140 | To determine if the export finished, refer to the function IsExporting(). |
141 | * \return \c true on success, \c false otherwise. |
142 | * \remarks To identify the error that occurred, inspect the status object accessed |
143 | * using the GetStatus() function. |
144 | */ |
145 | bool Export(FbxDocument* pDocument, bool pNonBlocking=false); |
146 | |
147 | #if !defined(FBXSDK_ENV_WINSTORE) && !defined(FBXSDK_ENV_EMSCRIPTEN) |
148 | /** Check if the exporter is currently exporting. |
149 | * \param pExportResult This parameter, after the export finished, will contain the result of the export success or failure. |
150 | * \return Return true if the exporter is currently exporting. |
151 | * \remarks This function will always return false if Export() was called with pNonBlocking set to false. |
152 | * This function should be used only in the context of pNonBlocking set to true. |
153 | * It is very important to periodically check if the export finished using this function, |
154 | * since it will also free up the thread's allocations when its done. |
155 | */ |
156 | bool IsExporting(bool& pExportResult); |
157 | #endif /* !FBXSDK_ENV_WINSTORE && ! FBXSDK_ENV_EMSCRIPTEN */ |
158 | |
159 | /** Get the progress status in non-blocking mode. |
160 | * \param pStatus Optional current status string. |
161 | * \return Percentage of the finished workload. |
162 | */ |
163 | float GetProgress(FbxString* pStatus=NULL); |
164 | |
165 | /** Register a callback function for progress reporting in single thread mode. |
166 | * \param pCallback Pointer of the callback function. |
167 | * \param pArgs Pointer to the arguments passed to the callback function. |
168 | */ |
169 | void SetProgressCallback(FbxProgressCallback pCallback, void* pArgs=NULL); |
170 | //@} |
171 | |
172 | /** |
173 | * \name File Format |
174 | */ |
175 | //@{ |
176 | /** Get the format of the exported file. |
177 | * \return File format identifier. |
178 | */ |
179 | int GetFileFormat(); |
180 | |
181 | /** Return \c true if the file format is a recognized FBX format. |
182 | */ |
183 | bool IsFBX(); |
184 | |
185 | /** Get the list of writable versions for the current file format. |
186 | * \return \c NULL or a null terminated array of strings. |
187 | * \remarks the strings returned match the writers registered for the current format. |
188 | * The array items can be retrieved with the following code: |
189 | * \code |
190 | * char const* const* lWV = lExporter->GetCurrentWritableVersions(); |
191 | * if (lWV) |
192 | * { |
193 | * int i = 0; |
194 | * while (lWV[i] != NULL) |
195 | * { |
196 | * printf("fmt = %s\n", lWV[i]); |
197 | * i++; |
198 | * } |
199 | * } |
200 | * \endcode |
201 | * |
202 | */ |
203 | char const* const* GetCurrentWritableVersions(); |
204 | |
205 | /** Set file version for a given file format. |
206 | * \param pVersion String description of the file format. |
207 | * \param pRenamingMode Renaming mode. |
208 | * \return \c true if mode is set correctly |
209 | */ |
210 | bool SetFileExportVersion(FbxString pVersion, FbxSceneRenamer::ERenamingMode pRenamingMode=FbxSceneRenamer::eNone); |
211 | |
212 | /** Set the resampling rate (only used when exporting to FBX 5.3 and lower) |
213 | * \param pResamplingRate resampling rate |
214 | */ |
215 | inline void SetResamplingRate(double pResamplingRate){ mResamplingRate = pResamplingRate; } |
216 | |
217 | /** Set the default rendering resolution. |
218 | * \param pCamName name of the camera. |
219 | * \param pResolutionMode resolution mode. |
220 | * \param pW width. |
221 | * \param pH height. |
222 | * \remark These values are ignored when exporting to FBX 7.x and higher. With FBX version 6.x and lower, |
223 | * the HeaderInfo is still accessible for legacy reasons and any other custom writers. For FBX filles, |
224 | * these values are used by the FBX QuickTime plug-in (obsolete now) to help it get the window size |
225 | * without loading the whole file. The information contained in the FbxIOFileHeaderInfo is a duplicate |
226 | * of AspectRatioMode, AspectWidth and AspectHeight properties defined in the FbxCamera class. |
227 | * Retrieveing the FileHeaderInfo starting from FBX 7.x will always return the uninitialized structure. |
228 | */ |
229 | void SetDefaultRenderResolution(FbxString pCamName, FbxString pResolutionMode, double pW, double pH); |
230 | |
231 | /** Get the complete file header information. |
232 | * \return valid pointer to the complete header information |
233 | */ |
234 | FbxIOFileHeaderInfo* (); |
235 | //@} |
236 | |
237 | /***************************************************************************************************************************** |
238 | ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! ** |
239 | *****************************************************************************************************************************/ |
240 | #ifndef DOXYGEN_SHOULD_SKIP_THIS |
241 | bool GetExportOptions(FbxIO* pFbxObject); |
242 | bool Export(FbxDocument* pDocument, FbxIO* pFbxObject); |
243 | |
244 | protected: |
245 | virtual void Construct(const FbxObject* pFrom); |
246 | virtual void Destruct(bool pRecursive); |
247 | virtual void SetOrCreateIOSettings(FbxIOSettings* pIOSettings, bool pAllowNULL); |
248 | |
249 | void Reset(); |
250 | bool FileCreate(); |
251 | void FileClose(); |
252 | |
253 | private: |
254 | bool ExportProcess(FbxDocument* pDocument); |
255 | |
256 | int mFileFormat; |
257 | FbxWriter* mWriter; |
258 | #if !defined(FBXSDK_ENV_WINSTORE) && !defined(FBXSDK_ENV_EMSCRIPTEN) |
259 | FbxThread* mExportThread; |
260 | FbxExportThreadArg* mExportThreadArg; |
261 | bool mExportThreadResult; |
262 | bool mIsThreadExporting; |
263 | #endif /* !FBXSDK_ENV_WINSTORE && !FBXSDK_ENV_EMSCRIPTEN */ |
264 | FbxProgress mProgress; |
265 | FbxStream* mStream; |
266 | void* mStreamData; |
267 | FbxString mStrFileVersion; |
268 | double mResamplingRate; |
269 | FbxSceneRenamer::ERenamingMode mRenamingMode; |
270 | FbxIOFileHeaderInfo* ; |
271 | FbxIOSettings* mIOSettings; |
272 | bool mClientIOSettings; |
273 | |
274 | friend void ExportThread(void*); |
275 | #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/ |
276 | }; |
277 | |
278 | //! Event that is emitted to plugins before a file is exported to the FBX format. |
279 | class FBXSDK_DLL FbxEventPreExport : public FbxEvent<FbxEventPreExport> |
280 | { |
281 | FBXSDK_EVENT_DECLARE(FbxEventPreExport); |
282 | |
283 | public: |
284 | FbxEventPreExport(FbxDocument* pDocument) : mDocument(pDocument) {}; |
285 | |
286 | //! The document to be exported |
287 | FbxDocument* mDocument; |
288 | }; |
289 | |
290 | //! Event that is emitted to plugins after a file is exported to the FBX format. |
291 | class FBXSDK_DLL FbxEventPostExport : public FbxEvent<FbxEventPostExport> |
292 | { |
293 | FBXSDK_EVENT_DECLARE(FbxEventPostExport); |
294 | |
295 | public: |
296 | FbxEventPostExport(FbxDocument* pDocument) : mDocument(pDocument) {}; |
297 | |
298 | //! The document to be exported |
299 | FbxDocument* mDocument; |
300 | }; |
301 | |
302 | #include <fbxsdk/fbxsdk_nsend.h> |
303 | |
304 | #endif /* _FBXSDK_FILEIO_EXPORTER_H_ */ |
305 | |