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 fbxio.h |
13 | #ifndef _FBXSDK_FILEIO_FBX_IO_H_ |
14 | #define _FBXSDK_FILEIO_FBX_IO_H_ |
15 | |
16 | #include <fbxsdk/fbxsdk_def.h> |
17 | |
18 | #include <fbxsdk/core/base/fbxstring.h> |
19 | #include <fbxsdk/core/base/fbxtime.h> |
20 | #include <fbxsdk/core/base/fbxstatus.h> |
21 | |
22 | #include <fbxsdk/fbxsdk_nsbegin.h> |
23 | |
24 | class FbxIO; |
25 | class FbxReader; |
26 | class FbxWriter; |
27 | class FbxFile; |
28 | class FbxStream; |
29 | class FbxXRefManager; |
30 | |
31 | /** |
32 | Defines the current FBX file version number in four digits. The first digit is the |
33 | major version number a the last three digits are the minor version number (e.g. 7100 = 7.1). |
34 | The following is the version history of FBX: |
35 | |
36 | \li Version 2000 - New KFCurve and embedded FBX, no FCurve/FCurve node storing. |
37 | No more .takf file like in earlier version, no history. |
38 | |
39 | \li Version 2001 - Version incremented to support FbxTime save in native (integer, not double) |
40 | format. |
41 | |
42 | \li Version 3000 - FiLMBOX 3.0 version, nothing changed in current class since version 2001. |
43 | FBX SDK 3.0 and 3.6 |
44 | |
45 | \li Version 3001 - FiLMBOX 3.0 encrypted version, only a trial. Encrypted files could only |
46 | be written in debug versions. Cannot switch to a higher version number now because any |
47 | file with a version number >= 3001 is read as encrypted. |
48 | Hence, this value now only gives file type. (3000 or less -> binary, 3001 or more -> encrypted) |
49 | FiLMBOX 3.2, FiLMBOX 3.5 and "Online" 3.51 have been released with version 3000. |
50 | |
51 | \li Version 4000 - MotionBuilder 4.0, new type in KFCurve tangents, supported in FiLMBOX 3.5 |
52 | but not by earlier versions. Version number is now stored in section footer. |
53 | Before September 3rd 2002, the version number was always 3000 in main section footer. |
54 | Now the main section footer has version number 4000. The minimum version number in footer of |
55 | an extension section is 4000. |
56 | |
57 | \li Version 4001 - ASCII Header is 4.1. MotionBuilder 4.01, to fix FCurveNode problem with |
58 | layer types in version 4000 the main section footer has version number 4001. |
59 | Now the footer for extension sections has version number 4001. |
60 | |
61 | \li Version 4050 - ASCII Header is 4.5. MotionBuilder 4.1 or 4.5 before |
62 | January 22nd 2003. This is because EvaluationProperties now have color. Now the main section footer |
63 | has version number 4050. |
64 | Now the footer for extension sections has version number 4050. |
65 | |
66 | \li Version 5000 - ASCII Header is not compatible anymore with MotionBuilder 4.0, 4.01 and 4.02 and FBX SDK 3.6 and 3.7 |
67 | MotionBuilder 4.03 and 4.1 or 4.5 from January 22nd 2003 |
68 | FBX SDK 3.6.1. New extended header to improve FBX file version management. Now the extended header and |
69 | the main section footer have version number 5000. Now the footer for extension sections has version number 5000. |
70 | |
71 | \li Version 5800 - This was a temporary version while waiting for version 6000 renders the previous versions |
72 | incompatible with MotionBuilder 6.0. For now, however, this format is needed to allow |
73 | some tools/plugins (For example Maya) to correctly detect that the file has some features that are not |
74 | completely backward compatible (For example: pivots defined with _pre/_post nodes which require a special |
75 | processing). By incrementing only the minor version we do not compromise the integrity of the |
76 | files. |
77 | |
78 | \li Version 6000 - Header version is now 6.0. |
79 | Extended header now contain a creation time stamp |
80 | that can be retrieve without parsing the main section of the file. |
81 | A creator tag (string) is now stored in the Extended header. This contain the originator (MB/FBXSDK) |
82 | of the file and the build number of the originator. |
83 | First release of the file format using the KProperties to store/retrieve information. |
84 | |
85 | \li Version 6100 - Added support for multiple attributes (mainly multiple geometry) at the node level. |
86 | The pointer to the node attribute have been replaced by a connection between the node and its attribute(s). |
87 | |
88 | \li Version 7000 - |
89 | First version of the 7.0 series; most likely very short-lived, developed for Protein, before ADP. |
90 | Supports reference cloning, external documents, blobs, unique IDs (per file), property templates. |
91 | So many changes that it was decided to break from 6.0 to keep Motion Builder intact. |
92 | |
93 | \li Version 7099 - Temporary version for FBX 2011 alpha releases. |
94 | |
95 | \li Version 7100 |
96 | Official file version for FBX 2011, add support for animation to FBX 7. |
97 | First version of FBX SDK with FBX 7 files as the default file format. |
98 | |
99 | \li Version 7200 |
100 | Added support for multiple blend shape deformers and In-Between blend-shapes on each geometry. |
101 | Moved shape(FbxShape) to its own section other than as a part of geometry section. |
102 | Add support to store blend shape deformer(FbxBlendShape), blend shape channel(FbxBlendShapeChannel), |
103 | Substance(FbxProceduralTexture) and Lines(FbxLine). |
104 | Add support to store 3 different smooth binding modes of FbxSkin, including classic linear, dual quaternion |
105 | and blended mode of previous two modes. |
106 | Added the CLAMP_PROGRESSIVE tangent mode. |
107 | The KFCurve::KeyAttrDataFloat data array now stores as integer values (ASCII mode) to to eliminate float to int precision errors. |
108 | FbxLayeredTexture now stores alphas for its sub textures. |
109 | |
110 | \li Version 7300 |
111 | Changed the way the CharacterPoses are written. |
112 | Changed light property name HotSpot and ConeAngle to InnerAngle and OuterAngle |
113 | |
114 | \li Version 7400 |
115 | Normals, tangents and binormals save the 4th component into a separate array |
116 | |
117 | \li Version 7500 |
118 | Added support for large files (>2GB). NOTE: This breaks forward compatibility (i.e. older products won't be able to open these files!!) |
119 | |
120 | */ |
121 | |
122 | //File version numbers |
123 | #define FBX_FILE_VERSION_2000 2000 //FBX 2.0 |
124 | #define FBX_FILE_VERSION_2001 2001 //FBX 2.01 |
125 | #define FBX_FILE_VERSION_3000 3000 //FBX 3.0 |
126 | #define FBX_FILE_VERSION_3001 3001 //FBX 3.01 |
127 | #define FBX_FILE_VERSION_4000 4000 //FBX 4.0 |
128 | #define FBX_FILE_VERSION_4001 4001 //FBX 4.01 |
129 | #define FBX_FILE_VERSION_4050 4050 //FBX 4.5 |
130 | #define FBX_FILE_VERSION_5000 5000 //FBX 5.0 |
131 | #define FBX_FILE_VERSION_5800 5800 //FBX 5.8 |
132 | #define FBX_FILE_VERSION_6000 6000 //FBX 6.0 |
133 | #define FBX_FILE_VERSION_6100 6100 //FBX 6.1 (guarantee compatibility with Autodesk 2010 products) |
134 | #define FBX_FILE_VERSION_7000 7000 //Compatible with 7.1, and taken as such |
135 | #define FBX_FILE_VERSION_7099 7099 //Compatible with 7.1, and taken as such |
136 | #define FBX_FILE_VERSION_7100 7100 //FBX 7.1 (guarantee compatibility with Autodesk 2011 products) |
137 | #define FBX_FILE_VERSION_7200 7200 //FBX 7.2 (guarantee compatibility with Autodesk 2012 products) |
138 | #define FBX_FILE_VERSION_7300 7300 //FBX 7.3 (guarantee compatibility with Autodesk 2013 products) |
139 | #define FBX_FILE_VERSION_7400 7400 //FBX 7.4 (guarantee compatibility with Autodesk 2014/2015 products) |
140 | #define FBX_FILE_VERSION_7500 7500 //FBX 7.5 (guarantee compatibility with Autodesk 2016 products) |
141 | |
142 | //File version compatibility strings |
143 | #define FBX_53_MB55_COMPATIBLE "FBX53_MB55" |
144 | #define FBX_60_COMPATIBLE "FBX60_MB60" |
145 | #define FBX_2005_08_COMPATIBLE "FBX200508_MB70" |
146 | #define FBX_2006_02_COMPATIBLE "FBX200602_MB75" |
147 | #define FBX_2006_08_COMPATIBLE "FBX200608" |
148 | #define FBX_2006_11_COMPATIBLE "FBX200611" |
149 | #define FBX_2009_00_COMPATIBLE "FBX200900" |
150 | #define FBX_2009_00_V7_COMPATIBLE "FBX200900v7" |
151 | #define FBX_2010_00_COMPATIBLE "FBX201000" |
152 | #define FBX_2011_00_COMPATIBLE "FBX201100" |
153 | #define FBX_2012_00_COMPATIBLE "FBX201200" |
154 | #define FBX_2013_00_COMPATIBLE "FBX201300" |
155 | #define FBX_2014_00_COMPATIBLE "FBX201400" |
156 | #define FBX_2016_00_COMPATIBLE "FBX201600" |
157 | |
158 | //Default file version number used when writing new FBX files |
159 | #define FBX_DEFAULT_FILE_VERSION FBX_FILE_VERSION_7500 |
160 | #define FBX_DEFAULT_FILE_COMPATIBILITY FBX_2016_00_COMPATIBLE |
161 | |
162 | /** Convert the FBX file version string to an integral number for <= or >= tests purposes. |
163 | * \param pFileVersion File version string. |
164 | * Some examples: |
165 | * \code |
166 | * int version; |
167 | * version = FileVersionStrToInt(FBX2012_00_COMPATIBLE); // version = 201200 |
168 | * version = FileVersionStrToInt(FBX60_COMPATIBLE); // version = 6000 |
169 | * version = FileVersionStrToInt("FBX200900"); // version = 200900 |
170 | * version = FileVersionStrToInt("Toto"); // version = 0 |
171 | * version = FileVersionStrToInt(""); // version = -1 |
172 | * \endcode |
173 | * \returns the file version number or 0 if an unsupported string value is passed. |
174 | */ |
175 | FBXSDK_DLL int FbxFileVersionStrToInt(const char* pFileVersion); |
176 | |
177 | /** \internal Used internally by readers to evaluate what is the current section */ |
178 | enum |
179 | { |
180 | FBX_NO_SECTION = -1, //!< indicate not in a valid section |
181 | FBX_MAIN_SECTION, //!< indicate currently in the main section |
182 | FBX_EXTENSION_SECTION_0 //!< indicate currently in the extention section 0 |
183 | }; |
184 | |
185 | /** Render and resolution information. |
186 | * \nosubgrouping |
187 | */ |
188 | class FBXSDK_DLL FbxIODefaultRenderResolution |
189 | { |
190 | public: |
191 | /** If the resolution data is ready. */ |
192 | bool mIsOK; |
193 | /** camera name. */ |
194 | FbxString mCameraName; |
195 | /** resolution mode. ex: "Fixed Resolution","Fixed Ratio","Fixed Width","Fixed Height","Window Size"*/ |
196 | FbxString mResolutionMode; |
197 | /** resolution width. */ |
198 | double mResolutionW; |
199 | /** resolution height. */ |
200 | double mResolutionH; |
201 | |
202 | /** |
203 | * \name Constructors and Destructor |
204 | */ |
205 | //@{ |
206 | //! Default constructor. |
207 | FbxIODefaultRenderResolution(); |
208 | //@} |
209 | |
210 | /** |
211 | * \name Member Access |
212 | */ |
213 | //@{ |
214 | //! Reset values to default. |
215 | void Reset(); |
216 | //@} |
217 | }; |
218 | |
219 | /** FBX header information used at beginning of the FBX file |
220 | * to get or set important values like the file format version number (mFileVersion). |
221 | * The file version number will be used to select a particular Reader or Writer. |
222 | * \nosubgrouping */ |
223 | class FBXSDK_DLL |
224 | { |
225 | public: |
226 | /** |
227 | * \name Constructors and Destructor |
228 | */ |
229 | //@{ |
230 | //! Default constructor. |
231 | (); |
232 | |
233 | //! Destructor. |
234 | virtual (); |
235 | //@} |
236 | |
237 | /** |
238 | * \name Public Member |
239 | */ |
240 | //@{ |
241 | |
242 | //! Reset values to default. |
243 | virtual void (); |
244 | |
245 | /** A derived class can override this function to read additional information from the file header. |
246 | * \return false in case of failure that should stop loading the file. |
247 | */ |
248 | virtual bool (FbxIO*); |
249 | //@} |
250 | |
251 | //! FbxIODefaultRenderResolution to handle default resolution values |
252 | FbxIODefaultRenderResolution ; |
253 | |
254 | //!Read only properties (not used for file write) |
255 | |
256 | //@{ |
257 | /** File version ex; 5000, 6000, 6100, 7000, 7099, 7100 |
258 | * the major part is the first digit, the minor part, 3 other digits |
259 | * ex: 7100 means version 7.1 |
260 | */ |
261 | int ; |
262 | |
263 | /** Indicates whether a creation time stamp is preset */ |
264 | bool ; |
265 | |
266 | /** Indicates whether the mCreationTimeStamp member variable contains the actual creation time of the file. */ |
267 | FbxLocalTime ; |
268 | |
269 | /** Indicates who is the creator of the file |
270 | * Ex: "FBX SDK/FBX Plugins version 2011.2" |
271 | */ |
272 | FbxString ; |
273 | |
274 | /** Indicates whether the file is created by a genuine Autodesk plug-in or not */ |
275 | bool ; |
276 | |
277 | /** The flag indicates that the header was created by a personal learning edition (PLE) of FBX. */ |
278 | bool ; |
279 | //@} |
280 | }; |
281 | |
282 | /** FbxIO represents an FBX file. |
283 | * It is primarily used by FBX importers (FbxImporter) and exporter (FbxExporter) |
284 | * when reading or writing data from or to a disk or memory. |
285 | * Most users will not use the FbxIO class directly |
286 | * but will use an instance of either FbxImporter or FbxExporter |
287 | * to read or write FBX files. |
288 | * |
289 | * An FBX file may contain binary data or ASCII data. |
290 | * A good way to learn the internal structure of a FBX file |
291 | * is to open a FBX file saved in ASCII in a text editor. |
292 | * |
293 | * Ex: to read a FBX file content using FbxIO class directly |
294 | * \code |
295 | * // Create a FbxIO object with FbxIO::Create() |
296 | * // Open the file with ProjectOpen( ... ) a NULL pointer can be passed for (FbxReader)* param |
297 | * // ProjectOpen_xxx_Section() to open a particular section |
298 | * int nbSec = FieldGetCount(); // to get the number of fields of the current section opened |
299 | * for(int i=0; i < nbSec; i++) // read all fields |
300 | * { |
301 | * // check if the field is a block |
302 | * if(FieldReadIsBlock()){ } ... Read sub fields recursively ... may contain other blocks and fields |
303 | * else |
304 | * { |
305 | * FieldReadBegin(); // navigate on the field |
306 | * char fieldType = FieldReadGetType(); // get the data type |
307 | * |
308 | * // According to the Field data type, call the appropriate read functions |
309 | * |
310 | * if(fieldType == 'S') FieldReadS(...) to read a string |
311 | * else if(fieldType == 'B') FieldReadB(...) to read a bool |
312 | * else if(fieldType == 'I') FieldReadI(...) to read a int |
313 | * ... |
314 | * FieldReadEnd(); // navigate to next field |
315 | * } |
316 | * } |
317 | * |
318 | * ProjectCloseSection() // close the section opened |
319 | * // repeat for another section ... |
320 | * // finally close the Project |
321 | * ProjectClose(); // or delete the FbxIO object created. |
322 | * \endcode |
323 | */ |
324 | class FBXSDK_DLL FbxIO |
325 | { |
326 | public: |
327 | |
328 | /** \internal Exception-safe way of setting/resetting the xref manager in a FbxIO object. |
329 | */ |
330 | struct FbxAutoResetXRefManager |
331 | { |
332 | FbxIO* mFbx; |
333 | const FbxXRefManager* mXRefManager; |
334 | |
335 | /** Default constructor */ |
336 | FbxAutoResetXRefManager(FbxIO* pFbx, FbxXRefManager& pXRefManager) |
337 | : mFbx(pFbx) |
338 | , mXRefManager(NULL) |
339 | { |
340 | if( mFbx ) |
341 | { |
342 | mXRefManager = mFbx->ProjectGetXRefManager(); |
343 | mFbx->ProjectSetXRefManager(&pXRefManager); |
344 | } |
345 | } |
346 | |
347 | /** Destructor */ |
348 | ~FbxAutoResetXRefManager() |
349 | { |
350 | if( mFbx ) |
351 | { |
352 | mFbx->ProjectSetXRefManager(mXRefManager); |
353 | } |
354 | } |
355 | }; |
356 | |
357 | enum BinaryType |
358 | { |
359 | BinaryNormal, //<! Standard FBX file field alignment using 32bit values, used by all file format version 7.4.0 or lower |
360 | BinaryLarge //<! New FBX file field alignment using 64bit values, used by all file format version 7.5.0 or higher |
361 | }; |
362 | |
363 | /** Creation function for this FbxIO class |
364 | * \param pStatus The FbxStatus object to hold error codes. |
365 | * \return a new FbxIO object pointer |
366 | */ |
367 | static FbxIO* Create(BinaryType pBinaryType, FbxStatus& pStatus){ return FbxNew< FbxIO >(pBinaryType, pStatus); } |
368 | |
369 | /** Default constructor */ |
370 | FbxIO(BinaryType pBinaryType, FbxStatus& pStatus); |
371 | |
372 | /** Destructor */ |
373 | virtual ~FbxIO(); |
374 | |
375 | /** |
376 | * \name Project Global |
377 | * The term "Project" here is an abstract name chosen to represent a group of data |
378 | * ex: a file, a stream, a memory buffer, etc. |
379 | */ |
380 | //@{ |
381 | |
382 | /** Open a project already in Memory |
383 | * \param pAddress |
384 | * \param pMaxLength |
385 | * \param pReader |
386 | * \param pCheckCRC |
387 | * \param pOpenMainSection |
388 | * \param pFileHeaderInfo |
389 | * \return \c true on success, \c false otherwise. |
390 | */ |
391 | bool (void* pAddress, FbxULong pMaxLength, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* = NULL); |
392 | |
393 | /** Open a project. |
394 | * \param pName |
395 | * \param pReader |
396 | * \param pCheckCRC |
397 | * \param pOpenMainSection |
398 | * \param pFileHeaderInfo |
399 | * \return \c true on success, \c false otherwise. |
400 | */ |
401 | bool (const char* pName, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* = NULL); |
402 | |
403 | /** Open a project. |
404 | * \param pStream |
405 | * \param pStreamData |
406 | * \param pReader |
407 | * \param pCheckCRC |
408 | * \param pOpenMainSection |
409 | * \param pFileHeaderInfo |
410 | * \return \c true on success, \c false otherwise. |
411 | */ |
412 | bool (FbxStream* pStream, void* pStreamData, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* = NULL); |
413 | |
414 | /** Open project file without necessarily an .fbx extension. |
415 | * \param pName |
416 | * \param pReader |
417 | * \param pCheckCRC |
418 | * \param pOpenMainSection |
419 | * \param pFileHeaderInfo |
420 | * \return \c true on success, \c false otherwise. |
421 | */ |
422 | bool (const char* pName, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* = NULL); |
423 | |
424 | /** Create a project in Memory |
425 | * \param pAddress |
426 | * \param pSize |
427 | * \param pWriter |
428 | * \param pBinary |
429 | * \param pEncrypted |
430 | * \param pFileHeaderInfo |
431 | * \return \c true on success, \c false otherwise. |
432 | */ |
433 | bool (void* pAddress, FbxUInt pSize, FbxWriter* pWriter, bool pBinary, bool pEncrypted, FbxIOFileHeaderInfo* = NULL); |
434 | |
435 | /** Create a project. |
436 | * \param pName |
437 | * \param pWriter |
438 | * \param pBinary |
439 | * \param pEncrypted |
440 | * \param pFileHeaderInfo |
441 | * \return \c true on success, \c false otherwise. |
442 | */ |
443 | bool (const char* pName, FbxWriter* pWriter, bool pBinary, bool pEncrypted, FbxIOFileHeaderInfo* = NULL); |
444 | |
445 | /** Create a project. |
446 | * \param pStream |
447 | * \param pStreamData |
448 | * \param pWriter |
449 | * \param pBinary |
450 | * \param pEncrypted |
451 | * \param pFileHeaderInfo |
452 | * \return \c true on success, \c false otherwise. |
453 | */ |
454 | bool (FbxStream* pStream, void* pStreamData, FbxWriter* pWriter, bool pBinary, bool pEncrypted, FbxIOFileHeaderInfo* = NULL); |
455 | |
456 | /** Create a project without necessary an .fbx extension. |
457 | * \param pName |
458 | * \param pWriter |
459 | * \param pBinary |
460 | * \param pEncrypted |
461 | * \param pFileHeaderInfo |
462 | * \return \c true on success, \c false otherwise. |
463 | */ |
464 | bool (const char* pName, FbxWriter* pWriter, bool pBinary, bool pEncrypted, FbxIOFileHeaderInfo* = NULL); |
465 | |
466 | /** Create a project, without writing out the header (yet) |
467 | * \param pName |
468 | * \param pWriter |
469 | * \param pVersion |
470 | * \param pBinary |
471 | * \param pEncrypted |
472 | * \return \c true on success, \c false otherwise. |
473 | */ |
474 | bool ProjectCreateEmpty(const char* pName, FbxWriter* pWriter, int pVersion, bool pBinary, bool pEncrypted); |
475 | |
476 | /** Create a project, without writing out the header (yet) |
477 | * \param pStream |
478 | * \param pStreamData |
479 | * \param pWriter |
480 | * \param pVersion |
481 | * \param pBinary |
482 | * \param pEncrypted |
483 | * \return \c true on success, \c false otherwise. |
484 | */ |
485 | bool ProjectCreateEmpty(FbxStream* pStream, void* pStreamData, FbxWriter* pWriter, int pVersion, bool pBinary, bool pEncrypted); |
486 | |
487 | /** Write FBX signature at the top of the file, prepare file for writing header information |
488 | * \return \c true on success, \c false otherwise. |
489 | */ |
490 | bool (); |
491 | |
492 | /** Open up the 'extended header' |
493 | * \return \c true on success, \c false otherwise. |
494 | */ |
495 | bool (); |
496 | |
497 | /** Write the contents of the extended header |
498 | * \param pExtendedHeader |
499 | * \return \c true on success, \c false otherwise. |
500 | */ |
501 | bool (const FbxIOFileHeaderInfo* ); |
502 | |
503 | /** Close the extended header |
504 | * \return \c true on success, \c false otherwise. |
505 | */ |
506 | bool (); |
507 | |
508 | /** Close up the header, prepare file for payload write. |
509 | * \return \c true on success, \c false otherwise. |
510 | */ |
511 | bool (); |
512 | |
513 | /** Close the project. |
514 | * \param pData |
515 | * \param pSize |
516 | * \return \c true on success, \c false otherwise. |
517 | */ |
518 | bool ProjectClose(void** pData=0, size_t* pSize=0); |
519 | |
520 | /** Provide the XRef Manager to use to create the .fbm folder. |
521 | * \remarks If NULL is used, the old behavior (using the .fbx's folder) is used instead. |
522 | */ |
523 | void ProjectSetXRefManager(const FbxXRefManager*); |
524 | |
525 | /** Get the XRef Manager to use. |
526 | * \return NULL if no XRef manager has been set. |
527 | */ |
528 | const FbxXRefManager* ProjectGetXRefManager() const; |
529 | |
530 | /** Select (and create) a folder to store embedded files (the .fbm |
531 | * file folder). Takes into account the settings from the XRef Manager. |
532 | * \param pXRefManager |
533 | * \param pCreatedFolder |
534 | * \param pUserDefinedFolder User defined "working folder" |
535 | * \return \c true on success, \c false otherwise. |
536 | * \remarks If this already been called successfully, uses the path |
537 | * previously created. |
538 | * |
539 | * Client application is responsible for cleaning up this folder. |
540 | * |
541 | * This will be automatically called if ProjectSetXRefManager() |
542 | * has been called before the .fbm folder needs to be created. |
543 | */ |
544 | bool ProjectCreateEmbeddedFolder(const FbxXRefManager& pXRefManager, FbxString& pCreatedFolder, const char* pUserDefinedFolder = NULL); |
545 | |
546 | /** On store event, use this function to tell if we are embedding. |
547 | * \param pValue |
548 | */ |
549 | void SetEmbedded(bool pValue); |
550 | |
551 | /** Explicitly set the embedding extraction folder. If this is never called, the FBX SDK will determine the best folder to extract embedded files. |
552 | * \param pExtractionFolder The file path name where the embedded files should be extracted. |
553 | */ |
554 | void (const char* ); |
555 | |
556 | /** Retrieve the current folder destination where the embedded files will be extracted. This might not be initialized until file I/O is performed. |
557 | */ |
558 | const char* (); |
559 | |
560 | /** Check if file is embedded or not. |
561 | * \return \c true if file is embedded, false otherwise. |
562 | */ |
563 | bool IsEmbedded() const; |
564 | |
565 | /** Check if file is binary or ASCII |
566 | * \return \c true if file is binary, false otherwise. |
567 | */ |
568 | bool IsBinary() const; |
569 | |
570 | /** Return if binary file is encrypted |
571 | * \return \c true if file is encrypted, false otherwise. |
572 | */ |
573 | bool IsEncrypted () const; |
574 | |
575 | /** Check CRC code. File must be open, binary and encrypted. |
576 | * \return \c true if CRC code is valid or file is not open, binary and encrypted. |
577 | */ |
578 | bool CheckCRC(); |
579 | |
580 | /** Return the file version number |
581 | * \return the file version number |
582 | */ |
583 | FbxUInt32 GetFileVersionNumber() const; |
584 | |
585 | /** Set the cache size for accelerated IO |
586 | * \param pCacheSize cache size to set (Kilo Byte) |
587 | */ |
588 | void CacheSize(FbxUInt32 pCacheSize); |
589 | |
590 | /** Return the current cache size |
591 | * \return the current cache size |
592 | */ |
593 | FbxUInt32 CacheSize() const; |
594 | |
595 | //@} |
596 | |
597 | /** |
598 | * \name FBX 7 Format specific functions. |
599 | |
600 | The FBX 7 format can compress internal arrays to make the file smaller. |
601 | The writer may decide not to compress all arrays, or it may even decide |
602 | not to compress anyway. Flags are written in the file to help the FBX7 reader |
603 | to know if a decompression is required, on a per-array basis. |
604 | The following functions address specific topics of the FBX 7 file format. |
605 | */ |
606 | //@{ |
607 | |
608 | //! \return Current state of the flag. |
609 | bool Fbx7Support() const; |
610 | |
611 | /** Set the flag state to tell the parser to handle FBX7 files. |
612 | * \param pSupport New flag state. |
613 | */ |
614 | void Fbx7Support(bool pSupport); |
615 | |
616 | //! \return Current State of the flag. |
617 | bool CompressArrays() const; |
618 | |
619 | /** Set the flag state. |
620 | * \param pCompress New flag state. |
621 | */ |
622 | void CompressArrays(bool pCompress); |
623 | |
624 | //! \return Current compression minimum size. |
625 | int CompressMinimumSize() const; |
626 | |
627 | /** Set the compression minimum size. |
628 | * \param pSize Threshold at which compression may embark. |
629 | */ |
630 | void CompressMinimumSize(int pSize); |
631 | |
632 | //! \return Current compression level. |
633 | int CompressLevel() const; |
634 | |
635 | /** Set the compression level. |
636 | * \param pLevel Value of the desired compression. |
637 | * \remarks The allowed range for pLevel is [0-9] where 0 equals no compression and |
638 | * 9 is as-much-as-we-can. |
639 | */ |
640 | void CompressLevel(int pLevel); |
641 | //@} |
642 | |
643 | /** |
644 | * \name Project related functions used to navigate on particular |
645 | * sections. |
646 | */ |
647 | //@{ |
648 | |
649 | /** Open the main section of a project. |
650 | * \return \c true on success, \c false otherwise. |
651 | */ |
652 | bool ProjectOpenMainSection(); |
653 | |
654 | /** Get the number of extension sections of a project. |
655 | * \return the number of extension sections of a project. |
656 | */ |
657 | int ProjectGetExtensionSectionCount() const; |
658 | |
659 | /** Open an extension section of a project. |
660 | * \param pExtensionSectionIndex |
661 | * \return \c true on success, \c false otherwise. |
662 | */ |
663 | bool ProjectOpenExtensionSection(int pExtensionSectionIndex); |
664 | |
665 | /** Create an extension section in a project, not allowed in ASCII and encrypted modes. |
666 | * \param pOverwriteLastExtensionSection |
667 | * \return \c true on success, \c false otherwise. |
668 | */ |
669 | bool ProjectCreateExtensionSection(bool pOverwriteLastExtensionSection = false); |
670 | |
671 | /** Close current section. |
672 | */ |
673 | void ProjectCloseSection(); |
674 | |
675 | /** Get current section. |
676 | * \return the current section. |
677 | */ |
678 | int ProjectGetCurrentSection() const; |
679 | |
680 | /** Get current section mode. |
681 | * \return the current section mode. |
682 | */ |
683 | int ProjectGetCurrentSectionMode() const; |
684 | |
685 | /** Get current section version. |
686 | * \return the current section version. |
687 | */ |
688 | int ProjectGetCurrentSectionVersion() const; |
689 | |
690 | /** Get the version number of a section. |
691 | * \param pSection |
692 | * \return the version number of a section. |
693 | * \remarks For main section it can be either 1000, 2000, 2001, 3000, 3001, 4000, 4001 or 4050. |
694 | * For the extension section it can be either 4000, 4001 or 4050. |
695 | * Returns 0 if section number does not exist. |
696 | */ |
697 | int ProjectGetSectionVersion(int pSection) const; |
698 | |
699 | /** Split a version number into major, minor and revision numbers. |
700 | * \param pVersion Version number to split. |
701 | * \param pMajor Integer to receive major version number. |
702 | * \param pMinor Integer to receive minor version number. |
703 | * \param pRevision Integer to receive revision version number. |
704 | */ |
705 | static void ProjectConvertVersionNumber(int pVersion, int& pMajor, int& pMinor, int& pRevision); |
706 | |
707 | /** Check the password protection flag. |
708 | * \return \c true if the current section has a password, \c false otherwise. |
709 | */ |
710 | bool IsPasswordProtected() const; |
711 | |
712 | /** Set password protection flag to \c false if the argument matches the password stored in the section. |
713 | * \param pPassword |
714 | * \return \c true if the argument matches the password stored in the section, \c false otherwise. |
715 | * \remarks This function only works in read mode. |
716 | */ |
717 | bool CheckPassword(const char* pPassword); |
718 | |
719 | /** Encrypt and store password in a section. |
720 | * \param pPassword |
721 | * \return \c true on success, \c false otherwise. |
722 | * \remarks This function only works in write mode and out of any enclosing block. |
723 | * \remarks This function must not be called more than once per section. |
724 | */ |
725 | bool WritePassword(const char* pPassword); |
726 | |
727 | //@} |
728 | |
729 | /** |
730 | * \name Directory related functions used to get or set file path information. |
731 | */ |
732 | //@{ |
733 | |
734 | /** Get project file name. |
735 | * \return project file name. |
736 | */ |
737 | const char* GetFilename() const; |
738 | |
739 | /** Get project data directory name. |
740 | * \param pAutoCreate |
741 | * \return project data directory name. |
742 | */ |
743 | FbxString GetDataDirectory(bool pAutoCreate = true); |
744 | |
745 | /** Get the current embedded folder used by this object. |
746 | * \param pCreate Whether create the media or not if no such folder is found |
747 | * \param pUserDefinedFolder User define working folder |
748 | * \return the current embedded folder used by this object. |
749 | * \remarks If ProjectCreateEmbeddedFolder has never been called this will |
750 | * return an empty string, unless we're explicitly asked to |
751 | * create it. |
752 | */ |
753 | FbxString GetMediaDirectory(bool pCreate = false, const char* pUserDefinedFolder = NULL); |
754 | |
755 | /** Get the full path of the directory to extract the template file. |
756 | * \param pTemplateName |
757 | * \param pCreate |
758 | * \return the full path of the directory to extract the template file. |
759 | */ |
760 | FbxString GetContainerTemplateDirectory(const char* pTemplateName, bool pCreate); |
761 | |
762 | /** Get the path relative to project directory. |
763 | * \param pPath |
764 | * \return the path relative to project directory. |
765 | */ |
766 | char* GetRelativePath(const char* pPath); |
767 | |
768 | /** Get the file path relative to project directory. |
769 | * \param pFilePath |
770 | * \return the file path relative to project directory. |
771 | */ |
772 | char* GetRelativeFilePath(const char* pFilePath); |
773 | |
774 | /** Get the full path of path relative to project directory. |
775 | * \param pRelativePath |
776 | * \return the full path of path relative to project directory. |
777 | */ |
778 | char* GetFullPath(const char* pRelativePath); |
779 | |
780 | /** Get the full file path of path relative to project directory. |
781 | * \param pRelativeFilePath |
782 | * \return the full file path of path relative to project directory. |
783 | */ |
784 | char* GetFullFilePath(const char* pRelativeFilePath); |
785 | |
786 | /** Get the temporary project name. |
787 | * \param pName |
788 | * \return the temporary project name. |
789 | */ |
790 | char* GetTmpProjectName(const char* pName) const; |
791 | |
792 | /** Swap from temporary project. |
793 | * \param pName |
794 | * \param pError |
795 | * \param pErrorSize |
796 | * \return \c true on success, \c false otherwise. |
797 | */ |
798 | bool SwapFromTmpProject(const char* pName, char* pError=NULL, int pErrorSize=0); |
799 | |
800 | //@} |
801 | |
802 | /** |
803 | * \name Read related functions used to get information of a field or a group of fields. |
804 | * Can be used to get the field content data or to navigate from field to field. |
805 | */ |
806 | //@{ |
807 | |
808 | /** Reset the field read position. |
809 | */ |
810 | void FieldReadResetPosition(); |
811 | |
812 | /** Get the number of fields. |
813 | * \return the number of fields. |
814 | */ |
815 | int FieldGetCount() const; |
816 | |
817 | /** Get the name of field indexed pFieldIndex. |
818 | * \param pFieldIndex |
819 | * \return the name of field indexed pFieldIndex. |
820 | */ |
821 | const char* FieldGetName(int pFieldIndex) const; |
822 | |
823 | /** Get number of instance field pFieldName has. |
824 | * \param pFieldName |
825 | * \return the number of instance field pFieldName has. |
826 | */ |
827 | int FieldGetInstanceCount(const char* pFieldName) const; |
828 | |
829 | /** Start to read field instance referred by field indexed pFieldIndex, instance indexed pInstance. |
830 | * \param pFieldIndex |
831 | * \param pInstance |
832 | * \return \c true on success, \c false otherwise. |
833 | */ |
834 | bool FieldReadBegin(int pFieldIndex, int pInstance); |
835 | |
836 | /** Start to read field pFieldName. |
837 | * \param pFieldName |
838 | * \return \c true on success, \c false otherwise. |
839 | */ |
840 | bool FieldReadBegin(const char* pFieldName); |
841 | |
842 | /** Start to read field instance referred field pFieldName, instance indexed pInstance. |
843 | * \param pFieldName |
844 | * \param pInstance |
845 | * \return \c true on success, \c false otherwise. |
846 | */ |
847 | bool FieldReadBegin(const char* pFieldName, int pInstance); |
848 | |
849 | //! Stop to read the current field. |
850 | void FieldReadEnd(); |
851 | |
852 | //! Return if current field is a block. |
853 | bool FieldReadIsBlock(); |
854 | |
855 | //! Start to read a field block. |
856 | bool FieldReadBlockBegin(); |
857 | |
858 | //! Stop to read a field block. |
859 | void FieldReadBlockEnd(); |
860 | |
861 | //! Return the number of read field. |
862 | int FieldReadGetCount() const; |
863 | |
864 | //! Return the number of field remaining to be read. |
865 | int FieldReadGetRemain() const; |
866 | |
867 | //! Return current field value type. |
868 | char FieldReadGetType() const; |
869 | |
870 | //! Return current field value as a char. |
871 | char FieldReadCH(); |
872 | |
873 | /** Return field pFieldName's value as a char. |
874 | * \param pFieldName |
875 | * \param pDefault |
876 | */ |
877 | char FieldReadCH(const char* pFieldName, char pDefault=0); |
878 | |
879 | //! Return current field value as a char pointer. |
880 | const char* FieldReadC(); |
881 | |
882 | /** Return field pFieldName's value as a char pointer. |
883 | * \param pFieldName |
884 | * \param pDefault |
885 | */ |
886 | const char* FieldReadC(const char* pFieldName, const char* pDefault="" ); |
887 | |
888 | //! Return current field value as a string (a char pointer). |
889 | const char* FieldReadS(); |
890 | |
891 | /** Return field pFieldName's value as a char pointer. |
892 | * \param pFieldName |
893 | * \param pDefault |
894 | */ |
895 | const char* FieldReadS(const char* pFieldName, const char* pDefault="" ); |
896 | |
897 | //! Return current field value as an bool. |
898 | bool FieldReadB(); |
899 | |
900 | /** Return field pFieldName's value as an integer. |
901 | * \param pFieldName |
902 | * \param pDefault |
903 | */ |
904 | bool FieldReadB(const char* pFieldName, bool pDefault = false); |
905 | |
906 | //! Return current field value as an integer. |
907 | int FieldReadI(); |
908 | |
909 | /** Return field pFieldName's value as an integer. |
910 | * \param pFieldName |
911 | * \param pDefault |
912 | */int FieldReadI(const char* pFieldName, int pDefault=0); |
913 | |
914 | //! Return current field value as an integer. |
915 | FbxLongLong FieldReadLL(); |
916 | |
917 | /** Return field pFieldName's value as an integer. |
918 | * \param pFieldName |
919 | * \param pDefault |
920 | */ |
921 | FbxLongLong FieldReadLL(const char* pFieldName, FbxLongLong pDefault=0); |
922 | |
923 | //! Return current field value as a float. |
924 | float FieldReadF(); |
925 | |
926 | /** Return field pFieldName's value as a float. |
927 | * \param pFieldName |
928 | * \param pDefault |
929 | */ |
930 | float FieldReadF(const char* pFieldName, float pDefault=0); |
931 | |
932 | //! Return current field value as a double. |
933 | double FieldReadD(); |
934 | |
935 | /** Return field pFieldName's value as a double. |
936 | * \param pFieldName |
937 | * \param pDefault |
938 | */ |
939 | double FieldReadD(const char* pFieldName, double pDefault=0); |
940 | |
941 | /** Return field pFieldName's value as a time value. |
942 | * \param pFieldName |
943 | */ |
944 | FbxTime FieldReadT(const char* pFieldName); |
945 | |
946 | //! Return field pFieldName's value as a time value. |
947 | FbxTime FieldReadT(); |
948 | |
949 | /** Return field pFieldName's value as a timespan value. |
950 | * \param pFieldName |
951 | */ |
952 | FbxTimeSpan FieldReadTS(const char* pFieldName); |
953 | |
954 | //! Return field pFieldName's value as a timespan value. |
955 | FbxTimeSpan FieldReadTS(); |
956 | |
957 | /** Return current field value as a n floats array. |
958 | * \param pValue |
959 | * \param pn |
960 | */ |
961 | void FieldReadFn(float* pValue, FbxUInt pn); |
962 | |
963 | /** Return current field value as a 3 floats array. |
964 | * \param pValue |
965 | */ |
966 | void FieldRead3F(float* pValue); |
967 | |
968 | /** Return current field value as a 4 floats array. |
969 | * \param pValue |
970 | */ |
971 | void FieldRead4F(float* pValue); |
972 | |
973 | /** Return field pFieldName's value as n floats array. |
974 | * \param pFieldName |
975 | * \param pValue |
976 | * \param pDefault |
977 | * \param pn |
978 | */ |
979 | void FieldReadFn(const char* pFieldName, float* pValue, const float *pDefault, FbxUInt pn); |
980 | |
981 | /** Return field pFieldName's value as 4 floats array. |
982 | * \param pFieldName |
983 | * \param pValue |
984 | * \param pDefault |
985 | */ |
986 | void FieldRead3F(const char* pFieldName, float* pValue, const float* pDefault=NULL); |
987 | |
988 | /** Return field pFieldName's value as 3 floats array. |
989 | * \param pFieldName |
990 | * \param pValue |
991 | * \param pDefault |
992 | */ |
993 | void FieldRead4F(const char* pFieldName, float* pValue, const float* pDefault=NULL); |
994 | |
995 | /** Return current field value as a n doubles array. |
996 | * \param pValue |
997 | * \param pn |
998 | */ |
999 | void FieldReadDn(double* pValue, FbxUInt pn); |
1000 | |
1001 | /** Return current field value as a 3 doubles array. |
1002 | * \param pValue |
1003 | */ |
1004 | void FieldRead3D(double* pValue); |
1005 | |
1006 | /** Return current field value as a 4 doubles array. |
1007 | * \param pValue |
1008 | */ |
1009 | void FieldRead4D(double* pValue); |
1010 | |
1011 | /** Return field pFieldName's value as n doubles array. |
1012 | * \param pFieldName |
1013 | * \param pValue |
1014 | * \param pDefault |
1015 | * \param pn |
1016 | */ |
1017 | void FieldReadDn(const char* pFieldName, double* pValue, const double *pDefault, FbxUInt pn); |
1018 | |
1019 | /** Return field pFieldName's value as 4 doubles array. |
1020 | * \param pFieldName |
1021 | * \param pValue |
1022 | * \param pDefault |
1023 | */ |
1024 | void FieldRead3D(const char* pFieldName, double* pValue, const double* pDefault=NULL); |
1025 | |
1026 | /** Return field pFieldName's value as 3 doubles array. |
1027 | * \param pFieldName |
1028 | * \param pValue |
1029 | * \param pDefault |
1030 | */ |
1031 | void FieldRead4D(const char* pFieldName, double* pValue, const double* pDefault=NULL); |
1032 | |
1033 | /** Return current field value as raw data. |
1034 | * \param pByteSize |
1035 | */ |
1036 | void* FieldReadR(int* pByteSize); |
1037 | |
1038 | /** Return field pFieldName's value as raw data. |
1039 | * \param pFieldName |
1040 | * \param pByteSize |
1041 | */ |
1042 | void* FieldReadR(const char* pFieldName,int* pByteSize); |
1043 | |
1044 | /** |
1045 | * \name FBX SDK 2009.3 and later |
1046 | */ |
1047 | //@{ |
1048 | //! Return field pFieldName's value as byte. |
1049 | FbxChar FieldReadByte(); |
1050 | |
1051 | /** Return field pFieldName's value as a byte value. |
1052 | * \param pFieldName |
1053 | * \param pDefault |
1054 | */ |
1055 | FbxChar FieldReadByte(const char* pFieldName, FbxChar pDefault=0); |
1056 | |
1057 | //! Return field pFieldName's value as unsigned byte. |
1058 | FbxUChar FieldReadUByte(); |
1059 | |
1060 | /** Return field pFieldName's value as an unsigned byte value. |
1061 | * \param pFieldName |
1062 | * \param pDefault |
1063 | */ |
1064 | FbxUChar FieldReadUByte(const char* pFieldName, FbxUChar pDefault=0); |
1065 | |
1066 | //! Return field pFieldName's value as short. |
1067 | FbxShort FieldReadShort(); |
1068 | |
1069 | /** Return field pFieldName's value as a short value. |
1070 | * \param pFieldName |
1071 | * \param pDefault |
1072 | */ |
1073 | FbxShort FieldReadShort(const char* pFieldName, FbxShort pDefault=0); |
1074 | |
1075 | //! Return field pFieldName's value as unsigned short. |
1076 | FbxUShort FieldReadUShort(); |
1077 | |
1078 | /** Return field pFieldName's value as an unsigned short value. |
1079 | * \param pFieldName |
1080 | * \param pDefault |
1081 | */ |
1082 | FbxUShort FieldReadUShort(const char* pFieldName, FbxUShort pDefault=0); |
1083 | |
1084 | //! Return field pFieldName's value as unsigned integer. |
1085 | unsigned int FieldReadUI(); |
1086 | |
1087 | /** Return field pFieldName's value as an unsigned int as a value. |
1088 | * \param pFieldName |
1089 | * \param pDefault |
1090 | */ |
1091 | unsigned int FieldReadUI(const char* pFieldName, unsigned int pDefault=0); |
1092 | |
1093 | //! Return field pFieldName's value as 64 bit unsigned integer. |
1094 | FbxULongLong FieldReadULL(); |
1095 | |
1096 | /** Return field pFieldName's value as an 64 bit unsigned int as a value. |
1097 | * \param pFieldName |
1098 | * \param pDefault |
1099 | */ |
1100 | FbxULongLong FieldReadULL(const char* pFieldName, FbxULongLong pDefault=0); |
1101 | |
1102 | /** Read the whole array and return the pointer to it. |
1103 | * \param pCount Nb of items in the array. |
1104 | */ |
1105 | const FbxChar* FieldReadArraySBytes( int &pCount ); |
1106 | /** Read the whole array and return the pointer to it. |
1107 | * \param pCount Nb of items in the array. |
1108 | */ |
1109 | const FbxShort* FieldReadArrayShort ( int &pCount ); |
1110 | /** Read the whole array and return the pointer to it. |
1111 | * \param pCount Nb of items in the array. |
1112 | */ |
1113 | const FbxUShort* FieldReadArrayUShort( int &pCount ); |
1114 | /** Read the whole array and return the pointer to it. |
1115 | * \param pCount Nb of items in the array. |
1116 | */ |
1117 | const unsigned int* FieldReadArrayUI ( int &pCount ); |
1118 | /** Read the whole array and return the pointer to it. |
1119 | * \param pCount Nb of items in the array. |
1120 | */ |
1121 | const FbxULongLong* FieldReadArrayULL ( int &pCount ); |
1122 | |
1123 | /** Read the whole array and return the pointer to it. |
1124 | * \param pCount Nb of items in the array. |
1125 | */ |
1126 | const FbxChar* FieldReadArray(int &pCount, const FbxChar*); |
1127 | /** Read the whole array and return the pointer to it. |
1128 | * \param pCount Nb of items in the array. |
1129 | */ |
1130 | /** Read the whole array and return the pointer to it. |
1131 | * \param pCount Nb of items in the array. |
1132 | */ |
1133 | const FbxShort* FieldReadArray(int &pCount, const FbxShort*); |
1134 | /** Read the whole array and return the pointer to it. |
1135 | * \param pCount Nb of items in the array. |
1136 | */ |
1137 | const FbxUShort* FieldReadArray(int &pCount, const FbxUShort*); |
1138 | /** Read the whole array and return the pointer to it. |
1139 | * \param pCount Nb of items in the array. |
1140 | */ |
1141 | const unsigned int* FieldReadArray(int &pCount, const unsigned int*); |
1142 | /** Read the whole array and return the pointer to it. |
1143 | * \param pCount Nb of items in the array. |
1144 | */ |
1145 | const FbxULongLong* FieldReadArray(int &pCount, const FbxULongLong*); |
1146 | //@} |
1147 | |
1148 | /** Read field and copy it into a file. |
1149 | * \param pFileName Embedded file full path+name. |
1150 | *\param pRelativeFileName Relative path+name of the embedded file. |
1151 | * \param pEmbeddedMediaDirectory Directory of the embedded media. |
1152 | * \param pIsFileCreated Status of the extraction of the embedded data. Set to \c true if the embedded media is correctly extracted in the media directory. |
1153 | * \remarks Only works when file is binary. This function is not related to flag mEmbedded. |
1154 | * \return \c false if operation failed. |
1155 | */ |
1156 | virtual bool FieldReadEmbeddedFile (FbxString& pFileName, FbxString& pRelativeFileName, const char* pEmbeddedMediaDirectory = "" , bool *pIsFileCreated=NULL); |
1157 | |
1158 | /** Read the whole array and return the pointer to it. |
1159 | * \param pCount Nb of items in the array. |
1160 | */ |
1161 | const double* FieldReadArrayD( int &pCount ); |
1162 | /** Read the whole array and return the pointer to it. |
1163 | * \param pCount Nb of items in the array. |
1164 | */ |
1165 | const float* FieldReadArrayF( int &pCount ); |
1166 | /** Read the whole array and return the pointer to it. |
1167 | * \param pCount Nb of items in the array. |
1168 | */ |
1169 | const int* FieldReadArrayI( int &pCount ); |
1170 | /** Read the whole array and return the pointer to it. |
1171 | * \param pCount Nb of items in the array. |
1172 | */ |
1173 | const FbxLongLong*FieldReadArrayLL(int &pCount ); |
1174 | /** Read the whole array and return the pointer to it. |
1175 | * \param pCount Nb of items in the array. |
1176 | */ |
1177 | const bool* FieldReadArrayB( int &pCount ); |
1178 | /** Read the whole array and return the pointer to it. |
1179 | * \param pCount Nb of items in the array. |
1180 | */ |
1181 | const FbxUChar* FieldReadArrayBytes( int &pCount ); |
1182 | |
1183 | /** Read the whole array and return the pointer to it. |
1184 | * \param pCount Nb of items in the array. |
1185 | */ |
1186 | const int* FieldReadArray(int& pCount, const int*); |
1187 | /** Read the whole array and return the pointer to it. |
1188 | * \param pCount Nb of items in the array. |
1189 | */ |
1190 | const float* FieldReadArray(int& pCount, const float*); |
1191 | /** Read the whole array and return the pointer to it. |
1192 | * \param pCount Nb of items in the array. |
1193 | */ |
1194 | const double* FieldReadArray(int& pCount, const double*); |
1195 | /** Read the whole array and return the pointer to it. |
1196 | * \param pCount Nb of items in the array. |
1197 | */ |
1198 | const FbxLongLong* FieldReadArray(int& pCount, const FbxLongLong*); |
1199 | /** Read the whole array and return the pointer to it. |
1200 | * \param pCount Nb of items in the array. |
1201 | */ |
1202 | const bool* FieldReadArray(int& pCount, const bool*); |
1203 | /** Read the whole array and return the pointer to it. |
1204 | * \param pCount Nb of items in the array. |
1205 | */ |
1206 | const FbxUChar* FieldReadArray(int& pCount, const FbxUChar*); |
1207 | |
1208 | //@} |
1209 | |
1210 | /** |
1211 | * \name Write related functions used to write information of a field or a group of fields. |
1212 | * Can be used to write the field content data or to navigate from field to field. |
1213 | */ |
1214 | //@{ |
1215 | |
1216 | /** Start to write a field called pFieldName. |
1217 | * \param pFieldName |
1218 | */ |
1219 | void FieldWriteBegin(const char* pFieldName); |
1220 | |
1221 | //! Stop to write the current field. |
1222 | void FieldWriteEnd(); |
1223 | |
1224 | //! Start to write a field block. |
1225 | void FieldWriteBlockBegin(); |
1226 | |
1227 | /** Start to write an object reference field. |
1228 | * \param pObjectType |
1229 | * \param pName |
1230 | * \param pSubType |
1231 | */ |
1232 | void FieldWriteObjectBegin(const char* pObjectType, const char* pName, const char* pSubType=NULL); |
1233 | |
1234 | //! Stop to write an object reference field. |
1235 | void FieldWriteObjectEnd(); |
1236 | |
1237 | /** Start to write a field block in file pFileName. |
1238 | * \param pFileName |
1239 | * \remarks This function is disabled but kept accessible for the FBX SDK. |
1240 | */ |
1241 | void FieldWriteBlockBegin(const char* pFileName); |
1242 | |
1243 | //! Stop to write a block of field. |
1244 | void FieldWriteBlockEnd (); |
1245 | |
1246 | /** Write field value as a char. |
1247 | * \param pValue |
1248 | */ |
1249 | void FieldWriteCH(char pValue); |
1250 | |
1251 | /** Write field pFieldName field with a char as a value. |
1252 | * \param pFieldName |
1253 | * \param pValue |
1254 | */ |
1255 | void FieldWriteCH(const char* pFieldName, char pValue); |
1256 | |
1257 | /** Write field value as char pointer pValue. |
1258 | * \param pValue |
1259 | */ |
1260 | void FieldWriteC(const char* pValue); |
1261 | |
1262 | /** Write field pFieldName with a char pointer as a value. |
1263 | * \param pFieldName |
1264 | * \param pValue |
1265 | */ |
1266 | void FieldWriteC(const char* pFieldName, const char* pValue); |
1267 | |
1268 | /** Write field value as FbxString pValue. |
1269 | * \param pValue |
1270 | */ |
1271 | void FieldWriteS(const char* pValue); |
1272 | |
1273 | /** Write field value as FbxString pValue. |
1274 | * \param pValue |
1275 | */ |
1276 | void FieldWriteS(const FbxString& pValue); |
1277 | |
1278 | /** Write field pFieldName field with a FbxString as a value. |
1279 | * \param pFieldName |
1280 | * \param pValue |
1281 | */ |
1282 | void FieldWriteS(const char* pFieldName, const char* pValue); |
1283 | |
1284 | /** Write field pFieldName field with a FbxString as a value. |
1285 | * \param pFieldName |
1286 | * \param pValue |
1287 | */ |
1288 | void FieldWriteS(const char* pFieldName, const FbxString& pValue); |
1289 | |
1290 | /** Write field value as bool. |
1291 | * \param pValue |
1292 | */ |
1293 | void FieldWriteB(bool pValue); |
1294 | |
1295 | /** Write field pFieldName field with a bool value. |
1296 | * \param pFieldName |
1297 | * \param pValue |
1298 | */ |
1299 | void FieldWriteB(const char* pFieldName, bool pValue); |
1300 | |
1301 | /** Write field value as integer. |
1302 | * \param pValue |
1303 | */ |
1304 | void FieldWriteI(int pValue); |
1305 | |
1306 | /** Write field pFieldName field with an int as a value. |
1307 | * \param pFieldName |
1308 | * \param pValue |
1309 | */ |
1310 | void FieldWriteI(const char* pFieldName, int pValue); |
1311 | |
1312 | /** Write field value as 64 bit integer. |
1313 | * \param pValue |
1314 | */ |
1315 | void FieldWriteLL(FbxLongLong pValue); |
1316 | |
1317 | /** Write field pFieldName field with an 64 bit int as a value. |
1318 | * \param pFieldName |
1319 | * \param pValue |
1320 | */ |
1321 | void FieldWriteLL(const char* pFieldName, FbxLongLong pValue); |
1322 | |
1323 | /** Write field value as float. |
1324 | * \param pValue |
1325 | * \remarks Only compatible with 1) MotionBuilder 4.0 and later 2) FBX SDK 3.6.1 and later. |
1326 | */ |
1327 | void FieldWriteF(float pValue); |
1328 | |
1329 | /** Write field pFieldName field with a float as a value. |
1330 | * \param pFieldName |
1331 | * \param pValue |
1332 | * \remarks Only compatible with 1) MotionBuilder 4.0 and later 2) FBX SDK 3.6.1 and later. |
1333 | */ |
1334 | void FieldWriteF(const char* pFieldName, float pValue); |
1335 | |
1336 | /** Write field value as double. |
1337 | * \param pValue |
1338 | */ |
1339 | void FieldWriteD(double pValue); |
1340 | |
1341 | /** Write field pFieldName field with a double as a value. |
1342 | * \param pFieldName |
1343 | * \param pValue |
1344 | */ |
1345 | void FieldWriteD(const char* pFieldName, double pValue); |
1346 | |
1347 | /** Write field value as time value. |
1348 | * \param pTime |
1349 | */ |
1350 | void FieldWriteT(FbxTime pTime); |
1351 | |
1352 | /** Write field pFieldName field with a time as a value. |
1353 | * \param pFieldName |
1354 | * \param pValue |
1355 | */ |
1356 | void FieldWriteT(const char* pFieldName,FbxTime pValue); |
1357 | |
1358 | /** Write field value as timespan value. |
1359 | * \param pTimeSpan |
1360 | */ |
1361 | void FieldWriteTS(FbxTimeSpan pTimeSpan); |
1362 | |
1363 | /** Write field pFieldName field with a timespan as a value. |
1364 | * \param pFieldName |
1365 | * \param pValue |
1366 | */ |
1367 | void FieldWriteTS(const char* pFieldName,FbxTimeSpan pValue); |
1368 | |
1369 | /** Write field value as an array of n floats (nF vector). |
1370 | * \param pValue |
1371 | * \param pn |
1372 | */ |
1373 | void FieldWriteFn(const float* pValue, FbxUInt pn); |
1374 | |
1375 | /** Write field pFieldName field with a array of n floats as a value. |
1376 | * \param pFieldName |
1377 | * \param pValue |
1378 | * \param pn |
1379 | */ |
1380 | void FieldWriteFn(const char* pFieldName, const float* pValue, FbxUInt pn); |
1381 | |
1382 | /** Write field value as an array of 3 floats (3F vector). |
1383 | * \param pValue |
1384 | */ |
1385 | void FieldWrite3F(const float* pValue); |
1386 | |
1387 | /** Write field pFieldName field with a array of 3 floats as a value. |
1388 | * \param pFieldName |
1389 | * \param pValue |
1390 | */ |
1391 | void FieldWrite3F(const char* pFieldName, const float* pValue); |
1392 | |
1393 | /** Write field value as an array of 4 floats (4F vector). |
1394 | * \param pValue |
1395 | */ |
1396 | void FieldWrite4F(const float* pValue); |
1397 | |
1398 | /** Write field pFieldName field with a array of 4 floats as a value. |
1399 | * \param pFieldName |
1400 | * \param pValue |
1401 | */ |
1402 | void FieldWrite4F(const char* pFieldName, const float* pValue); |
1403 | |
1404 | /** Write field value as an array of n doubles (nD vector). |
1405 | * \param pValue |
1406 | * \param pn |
1407 | */ |
1408 | void FieldWriteDn(const double* pValue, FbxUInt pn); |
1409 | |
1410 | /** Write field pFieldName field with a array of n doubles as a value. |
1411 | * \param pFieldName |
1412 | * \param pValue |
1413 | * \param pn |
1414 | */ |
1415 | void FieldWriteDn(const char* pFieldName, const double* pValue, FbxUInt pn); |
1416 | |
1417 | /** Write field value as an array of 3 doubles (3D vector). |
1418 | * \param pValue |
1419 | */ |
1420 | void FieldWrite3D(const double* pValue); |
1421 | |
1422 | /** Write field pFieldName field with a array of 3 doubles as a value. |
1423 | * \param pFieldName |
1424 | * \param pValue |
1425 | */ |
1426 | void FieldWrite3D(const char* pFieldName, const double* pValue); |
1427 | |
1428 | /** Write field value as an array of 4 doubles (4D vector). |
1429 | * \param pValue |
1430 | */ |
1431 | void FieldWrite4D(const double* pValue); |
1432 | |
1433 | /** Write field pFieldName field with a array of 4 doubles as a value. |
1434 | * \param pFieldName |
1435 | * \param pValue |
1436 | */ |
1437 | void FieldWrite4D(const char* pFieldName, const double* pValue); |
1438 | |
1439 | // The maximum number of value entries is, in theory, 2**32. In practice it should be a lot less than that. |
1440 | // pSize is the number of values to write from each pointer location, and stride is how much we |
1441 | // advance to get to the next value; if the stride is zero, values are tighly packed together. |
1442 | // So in total we'll write n * pSize items. |
1443 | |
1444 | /** Write array to file. |
1445 | * \param n Nb of items in the array. |
1446 | * \param pValue Pointer to the data. |
1447 | * \param pSize Size of each item in the array. |
1448 | * \param pStride Array stride. |
1449 | */ |
1450 | void FieldWriteArrayD( int n, const double* pValue, int pSize = 1, int pStride = 0 ); |
1451 | /** Write array to file. |
1452 | * \param n Nb of items in the array. |
1453 | * \param pValue Pointer to the data. |
1454 | * \param pSize Size of each item in the array. |
1455 | * \param pStride Array stride. |
1456 | */ |
1457 | void FieldWriteArrayF( int n, const float* pValue, int pSize = 1, int pStride = 0 ); |
1458 | /** Write array to file. |
1459 | * \param n Nb of items in the array. |
1460 | * \param pValue Pointer to the data. |
1461 | * \param pSize Size of each item in the array. |
1462 | * \param pStride Array stride. |
1463 | */ |
1464 | void FieldWriteArrayI( int n, const int* pValue, int pSize = 1, int pStride = 0 ); |
1465 | /** Write array to file. |
1466 | * \param n Nb of items in the array. |
1467 | * \param pValue Pointer to the data. |
1468 | * \param pSize Size of each item in the array. |
1469 | * \param pStride Array stride. |
1470 | */ |
1471 | void FieldWriteArrayLL(int n, const FbxLongLong* pValue, int pSize = 1, int pStride = 0 ); |
1472 | /** Write array to file. |
1473 | * \param n Nb of items in the array. |
1474 | * \param pValue Pointer to the data. |
1475 | * \param pSize Size of each item in the array. |
1476 | * \param pStride Array stride. |
1477 | */ |
1478 | void FieldWriteArrayB( int n, const bool* pValue, int pSize = 1, int pStride = 0 ); |
1479 | /** Write array to file. |
1480 | * \param n Nb of items in the array. |
1481 | * \param pValue Pointer to the data. |
1482 | * \param pSize Size of each item in the array. |
1483 | * \param pStride Array stride. |
1484 | */ |
1485 | void FieldWriteArrayBytes( int n, const FbxUChar* pValue, int pSize = 1, int pStride = 0 ); |
1486 | |
1487 | /** Write field value as a raw data. |
1488 | * \param pRawData |
1489 | * \param pByteSize |
1490 | */ |
1491 | void FieldWriteR(const void* pRawData, int pByteSize); |
1492 | |
1493 | /** Write field pFieldName field with raw data as a value. |
1494 | * \param pFieldName |
1495 | * \param pRawData |
1496 | * \param pByteSize |
1497 | */ |
1498 | void FieldWriteR(const char* pFieldName, const void* pRawData, int pByteSize); |
1499 | |
1500 | /** |
1501 | * \name FBX SDK 2009.3 and later |
1502 | */ |
1503 | //@{ |
1504 | |
1505 | /** Write field value as byte. |
1506 | * \param pValue |
1507 | */ |
1508 | void FieldWriteByte(FbxChar pValue); |
1509 | |
1510 | /** Write field pFieldName field with a byte value. |
1511 | * \param pFieldName |
1512 | * \param pValue |
1513 | */ |
1514 | void FieldWriteByte(const char* pFieldName, FbxChar pValue); |
1515 | |
1516 | /** Write field value as unsigned byte. |
1517 | * \param pValue |
1518 | */ |
1519 | void FieldWriteUByte(FbxUChar pValue); |
1520 | |
1521 | /** Write field pFieldName field with an unsigned byte value. |
1522 | * \param pFieldName |
1523 | * \param pValue |
1524 | */ |
1525 | void FieldWriteUByte(const char* pFieldName, FbxUChar pValue); |
1526 | |
1527 | /** Write field value as short. |
1528 | * \param pValue |
1529 | */ |
1530 | void FieldWriteShort(FbxShort pValue); |
1531 | |
1532 | /** Write field pFieldName field with a short value. |
1533 | * \param pFieldName |
1534 | * \param pValue |
1535 | */ |
1536 | void FieldWriteShort(const char* pFieldName, FbxShort pValue); |
1537 | |
1538 | /** Write field value as unsigned short. |
1539 | * \param pValue |
1540 | */ |
1541 | void FieldWriteUShort(FbxUShort pValue); |
1542 | |
1543 | /** Write field pFieldName field with an unsigned short value. |
1544 | * \param pFieldName |
1545 | * \param pValue |
1546 | */ |
1547 | void FieldWriteUShort(const char* pFieldName, FbxUShort pValue); |
1548 | |
1549 | /** Write field value as an unsigned integer. |
1550 | * \param pValue |
1551 | */ |
1552 | void FieldWriteUI(unsigned int pValue); |
1553 | |
1554 | /** Write field pFieldName field with an unsigned int as a value. |
1555 | * \param pFieldName |
1556 | * \param pValue |
1557 | */ |
1558 | void FieldWriteUI(const char* pFieldName, unsigned int pValue); |
1559 | |
1560 | /** Write field value as 64 bit unsigned integer. |
1561 | * \param pValue |
1562 | */ |
1563 | void FieldWriteULL(FbxULongLong pValue); |
1564 | |
1565 | /** Write field pFieldName field with an 64 bit unsigned int as a value. |
1566 | * \param pFieldName |
1567 | * \param pValue |
1568 | * \return void |
1569 | */ |
1570 | void FieldWriteULL(const char* pFieldName, FbxULongLong pValue); |
1571 | |
1572 | /** Write array to file. |
1573 | * \param n Nb of items in the array. |
1574 | * \param pValue Pointer to the data. |
1575 | * \param pSize Size of each item in the array. |
1576 | * \param pStride Array stride. |
1577 | */ |
1578 | void FieldWriteArraySBytes( int n, const FbxChar* pValue, int pSize = 1, int pStride = 0 ); |
1579 | /** Write array to file. |
1580 | * \param n Nb of items in the array. |
1581 | * \param pValue Pointer to the data. |
1582 | * \param pSize Size of each item in the array. |
1583 | * \param pStride Array stride. |
1584 | */ |
1585 | void FieldWriteArrayShort( int n, const FbxShort* pValue, int pSize = 1, int pStride = 0 ); |
1586 | /** Write array to file. |
1587 | * \param n Nb of items in the array. |
1588 | * \param pValue Pointer to the data. |
1589 | * \param pSize Size of each item in the array. |
1590 | * \param pStride Array stride. |
1591 | */ |
1592 | void FieldWriteArrayUShort( int n, const FbxUShort* pValue, int pSize = 1, int pStride = 0 ); |
1593 | /** Write array to file. |
1594 | * \param n Nb of items in the array. |
1595 | * \param pValue Pointer to the data. |
1596 | * \param pSize Size of each item in the array. |
1597 | * \param pStride Array stride. |
1598 | */ |
1599 | void FieldWriteArrayUI( int n, const unsigned int* pValue, int pSize = 1, int pStride = 0 ); |
1600 | /** Write array to file. |
1601 | * \param n Nb of items in the array. |
1602 | * \param pValue Pointer to the data. |
1603 | * \param pSize Size of each item in the array. |
1604 | * \param pStride Array stride. |
1605 | */ |
1606 | void FieldWriteArrayULL(int n, const FbxULongLong* pValue, int pSize = 1, int pStride = 0 ); |
1607 | //@} |
1608 | |
1609 | /** ASCII files may limit how big you can write your raw data, forcing you to break it down into chunks. |
1610 | * \return int |
1611 | */ |
1612 | int GetFieldRMaxChunkSize() const; |
1613 | |
1614 | /** Write object reference pName in the current field. |
1615 | * \param pName |
1616 | */ |
1617 | void FieldWriteObjectReference(const char* pName); |
1618 | |
1619 | /** Write object reference pName in field pFieldName. |
1620 | * \param pFieldName |
1621 | * \param pName |
1622 | */ |
1623 | void FieldWriteObjectReference(const char* pFieldName, const char* pName); |
1624 | |
1625 | /** Write field with file content as a value. |
1626 | * \param pFileName |
1627 | * \param pRelativeFileName |
1628 | * \remarks Only works when file is binary. This function is not related to flag mEmbedded. |
1629 | * \return \c false if operation failed. |
1630 | */ |
1631 | bool FieldWriteEmbeddedFile (FbxString pFileName, FbxString pRelativeFileName); |
1632 | |
1633 | /** Write comments, only effective in ASCII mode. |
1634 | * \param pFieldName |
1635 | */ |
1636 | void (const char* pFieldName); |
1637 | |
1638 | //@} |
1639 | |
1640 | #ifdef _DEBUG |
1641 | // Dump function for debugging purpose only |
1642 | void StdoutDump(); |
1643 | #endif |
1644 | |
1645 | /** Get if the embedded file is currently loaded |
1646 | * \return true if loaded, false otherwise |
1647 | * \remarks An embedded file is a file like a JPEG image used for texture or an AVI file for video. |
1648 | * When files are embedded, the size of the FBX file can be very large since other files are embedded in it. |
1649 | * FBX Version 6 and lower cannot embed files when saved in ASCII. |
1650 | * FBX Version 7 and over can embed files even when saved in ASCII mode. |
1651 | */ |
1652 | bool GetHaveLoadedEmbededFile() const; |
1653 | |
1654 | /** Get the maximum byte count written |
1655 | * \param pMemPtr The address of the memory file |
1656 | * \param[out] pSize Stores the maximum byte count written |
1657 | */ |
1658 | void GetMemoryFileInfo(void** pMemPtr, size_t& pSize) const; |
1659 | |
1660 | /** Get a internal flag to manage pre FBX version 6 data format |
1661 | * Used for backwards compatibility |
1662 | */ |
1663 | bool IsBeforeVersion6() const; |
1664 | |
1665 | /** Set a internal flag to manage pre FBX version 6 data format |
1666 | * Used for backwards compatibility |
1667 | */ |
1668 | void SetIsBeforeVersion6(bool pIsBeforeVersion6); |
1669 | |
1670 | /***************************************************************************************************************************** |
1671 | ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! ** |
1672 | *****************************************************************************************************************************/ |
1673 | #ifndef DOXYGEN_SHOULD_SKIP_THIS |
1674 | bool (FbxFile * pFile, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* = NULL); |
1675 | |
1676 | private: |
1677 | // to resolve warning C4512: 'class' : assignment operator could not be generated |
1678 | FbxIO& operator=(const FbxIO& pOther); |
1679 | |
1680 | FbxStatus& mStatus; |
1681 | |
1682 | struct InternalImpl; |
1683 | struct InternalImpl32; |
1684 | struct InternalImpl64; |
1685 | InternalImpl* mImpl; |
1686 | |
1687 | //! Project Global |
1688 | |
1689 | void ProjectClear(); |
1690 | void ProjectReset(); |
1691 | |
1692 | bool (bool , bool pCheckCRC, bool pOpenMainSection, FbxIOFileHeaderInfo* ); |
1693 | bool (FbxInt64& , FbxIOFileHeaderInfo* ); |
1694 | bool (); |
1695 | bool BinaryReadSectionPosition(); |
1696 | bool (); |
1697 | bool ASCIIReadSectionPosition(); |
1698 | |
1699 | bool (FbxIOFileHeaderInfo* ); |
1700 | bool (FbxIOFileHeaderInfo* ); |
1701 | void (); |
1702 | void (); |
1703 | |
1704 | void ReadEncryptionKey(char* pEncryptionKey); |
1705 | void WriteEncryptionKey(char* pEncryptionKey); |
1706 | |
1707 | //! Project Section |
1708 | |
1709 | bool ProjectClearSection(); |
1710 | bool ProjectOpenSection(int pSection); |
1711 | bool (); |
1712 | FbxInt64 (char* pSourceCheck); |
1713 | bool BinaryReadExtensionCode(FbxInt64 pFollowingSectionStart, FbxInt64& pSectionStart, FbxUInt32& pSectionVersion); |
1714 | void BinaryReadSectionPassword(); |
1715 | |
1716 | bool (); |
1717 | void (); |
1718 | bool BinaryWriteExtensionCode(FbxInt64 pSectionStart, FbxUInt32 pSectionVersion); |
1719 | |
1720 | FbxString GetCreationTime() const; |
1721 | void SetCreationTime(FbxString pCreationTime); |
1722 | void CreateSourceCheck(char* lSourceCheck); |
1723 | bool TestSourceCheck(char* pSourceCheck, char* pSourceCompany); |
1724 | FbxString GetMangledCreationTime(); |
1725 | void EncryptSourceCheck(char* pSourceCheck, char* pEncryptionData); |
1726 | void DecryptSourceCheck(char* pSourceCheck, const char* pEncryptionData); |
1727 | |
1728 | void EncryptPasswordV1(FbxString pOriginalPassword, FbxString &pEncryptedPassword); |
1729 | void DecryptPasswordV1(FbxString pEncryptedPassword, FbxString &pDecryptedPassword); |
1730 | |
1731 | //! Read |
1732 | |
1733 | void CheckValidityOfFieldName(const char* pFieldName); |
1734 | void GetUnusedEmbeddedName(const FbxString& pDirectory, const FbxString& pName, FbxString& pResult, bool pCreateSubdirectory); |
1735 | |
1736 | //! Get project media directory name |
1737 | FbxString GetDirectory(bool pAutoCreate, const char* pExtension); |
1738 | #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/ |
1739 | }; |
1740 | |
1741 | #include <fbxsdk/fbxsdk_nsend.h> |
1742 | |
1743 | #endif /* _FBXSDK_FILEIO_FBX_IO_H_ */ |
1744 | |