瀏覽代碼

Azure CI build support. (#182)

Azure build support.
Pär Winzell 6 年之前
父節點
當前提交
7fc7120487
共有 100 個文件被更改,包括 31980 次插入0 次删除
  1. 9 0
      .gitattributes
  2. 101 0
      azure-pipelines.yml
  3. 3 0
      sdk/Darwin/2019.2/FBX_SDK_Online_Documentation.html
  4. 1128 0
      sdk/Darwin/2019.2/License.rtf
  5. 277 0
      sdk/Darwin/2019.2/include/fbxsdk.h
  6. 420 0
      sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxalloc.h
  7. 238 0
      sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxarch.h
  8. 93 0
      sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxdebug.h
  9. 511 0
      sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxnew.h
  10. 97 0
      sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxstdcompliant.h
  11. 264 0
      sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxtypes.h
  12. 489 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxarray.h
  13. 90 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxbitset.h
  14. 95 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxcharptrset.h
  15. 213 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxcontainerallocators.h
  16. 324 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxdynamicarray.h
  17. 257 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxfile.h
  18. 80 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxfolder.h
  19. 411 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxhashmap.h
  20. 262 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxintrusivelist.h
  21. 408 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxmap.h
  22. 67 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxmemorypool.h
  23. 115 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxmultimap.h
  24. 62 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxpair.h
  25. 1398 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxredblacktree.h
  26. 227 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxset.h
  27. 120 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxstatus.h
  28. 505 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxstring.h
  29. 368 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxstringlist.h
  30. 648 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxtime.h
  31. 99 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxtimecode.h
  32. 172 0
      sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxutils.h
  33. 166 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxclassid.h
  34. 312 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxconnectionpoint.h
  35. 267 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxdatatypes.h
  36. 94 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxemitter.h
  37. 188 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxevent.h
  38. 129 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxeventhandler.h
  39. 121 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxlistener.h
  40. 86 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxloadingstrategy.h
  41. 555 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxmanager.h
  42. 49 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxmodule.h
  43. 1557 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxobject.h
  44. 96 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxperipheral.h
  45. 264 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxplugin.h
  46. 74 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxplugincontainer.h
  47. 1240 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxproperty.h
  48. 146 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxpropertydef.h
  49. 576 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxpropertyhandle.h
  50. 1747 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxpropertypage.h
  51. 1178 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxpropertytypes.h
  52. 260 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxquery.h
  53. 57 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxqueryevent.h
  54. 58 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxscopedloadingdirectory.h
  55. 64 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxscopedloadingfilename.h
  56. 126 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxstream.h
  57. 135 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxsymbol.h
  58. 219 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxsystemunit.h
  59. 227 0
      sdk/Darwin/2019.2/include/fbxsdk/core/fbxxref.h
  60. 340 0
      sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxaffinematrix.h
  61. 325 0
      sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxdualquaternion.h
  62. 512 0
      sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxmath.h
  63. 281 0
      sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxmatrix.h
  64. 333 0
      sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxquaternion.h
  65. 282 0
      sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxtransforms.h
  66. 259 0
      sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxvector2.h
  67. 324 0
      sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxvector4.h
  68. 58 0
      sdk/Darwin/2019.2/include/fbxsdk/core/sync/fbxatomic.h
  69. 44 0
      sdk/Darwin/2019.2/include/fbxsdk/core/sync/fbxclock.h
  70. 188 0
      sdk/Darwin/2019.2/include/fbxsdk/core/sync/fbxsync.h
  71. 99 0
      sdk/Darwin/2019.2/include/fbxsdk/core/sync/fbxthread.h
  72. 55 0
      sdk/Darwin/2019.2/include/fbxsdk/fbxsdk_def.h
  73. 17 0
      sdk/Darwin/2019.2/include/fbxsdk/fbxsdk_nsbegin.h
  74. 16 0
      sdk/Darwin/2019.2/include/fbxsdk/fbxsdk_nsend.h
  75. 57 0
      sdk/Darwin/2019.2/include/fbxsdk/fbxsdk_version.h
  76. 90 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladaanimationelement.h
  77. 275 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladaelement.h
  78. 133 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladaiostream.h
  79. 71 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladanamespace.h
  80. 472 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladatokens.h
  81. 394 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladautils.h
  82. 557 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxreadercollada14.h
  83. 570 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxwritercollada14.h
  84. 1746 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxio.h
  85. 256 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxreaderfbx5.h
  86. 1102 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxreaderfbx6.h
  87. 180 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxreaderfbx7.h
  88. 211 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxwriterfbx5.h
  89. 311 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxwriterfbx6.h
  90. 72 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxwriterfbx7.h
  91. 64 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxbase64coder.h
  92. 304 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxexporter.h
  93. 133 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxexternaldocreflistener.h
  94. 1087 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxfiletokens.h
  95. 168 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxglobalcamerasettings.h
  96. 229 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxgloballightsettings.h
  97. 315 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxglobalsettings.h
  98. 48 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxgobo.h
  99. 393 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbximporter.h
  100. 67 0
      sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxiobase.h

+ 9 - 0
.gitattributes

@@ -1,5 +1,14 @@
+# FBX SDK
+*.a filter=lfs diff=lfs merge=lfs -text
+*.dylib filter=lfs diff=lfs merge=lfs -text
+*.so filter=lfs diff=lfs merge=lfs -text
+*.dll filter=lfs diff=lfs merge=lfs -text
+*.lib filter=lfs diff=lfs merge=lfs -text
+
+# TEST FILES
 *.glb filter=lfs diff=lfs merge=lfs -text
 *.fbx filter=lfs diff=lfs merge=lfs -text
 *.tga filter=lfs diff=lfs merge=lfs -text
 *.png filter=lfs diff=lfs merge=lfs -text
 *.jpg filter=lfs diff=lfs merge=lfs -text
+

+ 101 - 0
azure-pipelines.yml

@@ -0,0 +1,101 @@
+# C/C++ with GCC
+# Build your C/C++ project with GCC using make.
+# Add steps that publish test results, save build artifacts, deploy, and more:
+# https://docs.microsoft.com/azure/devops/pipelines/apps/c-cpp/gcc
+
+jobs:
+- job: Linux
+  pool:
+    vmImage: 'Ubuntu 16.04'
+
+  steps:
+  - task: UsePythonVersion@0
+    inputs:
+      versionSpec: '3.6'
+      architecture: 'x64'
+
+  - script: python -m pip install --upgrade pip setuptools wheel
+    displayName: 'Install Python tools'
+
+  - script: |
+      pip install conan
+      conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan
+    displayName: 'Install & configure Conan'
+
+  - script: |
+      conan install . -i build -s build_type=Release -e FBXSDK_SDKS=sdk
+    displayName: 'Resolve binary dependencies and build CMake files.'
+
+  - script: |
+      conan build -bf build .
+      mv build/FBX2glTF build/FBX2glTF-linux-x64
+    displayName: 'Build FBX2glTF'
+
+  - task: PublishBuildArtifacts@1
+    inputs:
+      pathtoPublish: 'build/FBX2glTF-linux-x64'
+      artifactName: 'binaries'
+
+- job: Mac
+  pool:
+    vmImage: 'macOS-10.14'
+
+  steps:
+  - task: UsePythonVersion@0
+    inputs:
+      versionSpec: '3.6'
+      architecture: 'x64'
+
+  - script: python -m pip install --upgrade pip setuptools wheel
+    displayName: 'Install Python tools'
+
+  - script: |
+      pip install conan
+      conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan
+    displayName: 'Install Conan'
+
+  - script: |
+      conan install . -i build -s compiler=apple-clang -s compiler=apple-clang -s compiler.version=10.0 -s compiler.libcxx=libc++ -s build_type=Release -e FBXSDK_SDKS=sdk
+    displayName: 'Resolve binary dependencies and build CMake files.'
+
+  - script: |
+      conan build -bf build .
+      mv build/FBX2glTF build/FBX2glTF-darwin-x64
+    displayName: 'Build FBX2glTF'
+
+  - task: PublishBuildArtifacts@1
+    inputs:
+      pathtoPublish: 'build/FBX2glTF-darwin-x64'
+      artifactName: 'binaries'
+
+- job: Windows
+  pool:
+    vmImage: 'vs2017-win2016'
+
+  steps:
+  - task: UsePythonVersion@0
+    inputs:
+      versionSpec: '3.6'
+      architecture: 'x64'
+
+  - script: python -m pip install --upgrade pip setuptools wheel
+    displayName: 'Install Python tools'
+
+  - script: |
+      pip install conan
+      conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan
+    displayName: 'Install Conan'
+
+  - script: |
+      conan install . -i build -s build_type=Release -e FBXSDK_SDKS=sdk
+    displayName: 'Resolve binary dependencies and build CMake files.'
+
+  - script: |
+      conan build -bf build .
+      move build\Release\FBX2glTF.exe build\Release\FBX2glTF-windows-x64.exe
+    displayName: 'Build FBX2glTF'
+
+  - task: PublishBuildArtifacts@1
+    inputs:
+      pathtoPublish: 'build/Release/FBX2glTF-windows-x64.exe'
+      artifactName: 'binaries'

+ 3 - 0
sdk/Darwin/2019.2/FBX_SDK_Online_Documentation.html

@@ -0,0 +1,3 @@
+<html>
+<meta http-equiv="refresh" content="0; URL=http://www.autodesk.com/fbx-sdkdoc-2019-enu">
+</html> 

+ 1128 - 0
sdk/Darwin/2019.2/License.rtf

@@ -0,0 +1,1128 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1041\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
+{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;}
+{\f39\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\fdbmajor\f31501\fbidi \fmodern\fcharset128\fprq1{\*\panose 020b0609070205080204}MS Gothic{\*\falt \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e};}{\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}
+{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\fdbminor\f31505\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
+{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f40\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f41\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\f43\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f44\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f45\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f46\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\f47\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f48\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f50\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f51\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}
+{\f53\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f54\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f55\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f56\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}
+{\f57\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f58\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f152\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
+{\f150\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f151\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
+{\f153\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f154\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
+{\f157\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f432\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}{\f430\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;}
+{\f431\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f433\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f434\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}{\f437\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;}
+{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
+{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
+{\fdbmajor\f31520\fbidi \fmodern\fcharset0\fprq1 MS Gothic Western{\*\falt \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e};}{\fdbmajor\f31518\fbidi \fmodern\fcharset238\fprq1 MS Gothic CE{\*\falt \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e};}
+{\fdbmajor\f31519\fbidi \fmodern\fcharset204\fprq1 MS Gothic Cyr{\*\falt \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e};}{\fdbmajor\f31521\fbidi \fmodern\fcharset161\fprq1 MS Gothic Greek{\*\falt \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e};}
+{\fdbmajor\f31522\fbidi \fmodern\fcharset162\fprq1 MS Gothic Tur{\*\falt \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e};}{\fdbmajor\f31525\fbidi \fmodern\fcharset186\fprq1 MS Gothic Baltic{\*\falt \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e};}
+{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;}{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}
+{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);}
+{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
+{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
+{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
+{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
+{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31560\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
+{\fdbminor\f31558\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\fdbminor\f31559\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
+{\fdbminor\f31561\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\fdbminor\f31562\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}
+{\fdbminor\f31565\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
+{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
+{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
+{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
+\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red31\green73\blue125;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa160\sl259\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 
+\ltrch\fcs0 \fs22\lang1033\langfe1041\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1041 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa160\sl259\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1041\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1041 \snext11 \ssemihidden \sunhideused 
+Normal Table;}}{\*\rsidtbl \rsid4142109\rsid5905377}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator Roberto Regalino}{\creatim\yr2017\mo1\dy30\hr11\min42}
+{\revtim\yr2017\mo1\dy30\hr11\min43}{\version2}{\edmins1}{\nofpages20}{\nofwords14481}{\nofchars82543}{\nofcharsws96831}{\vern57441}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}
+\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect 
+\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701
+\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot5905377 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2
+\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6
+\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang 
+{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qr \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1041\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1041 {
+\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf2\insrsid4142109 
+\par }\pard \ltrpar\qc \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Autodesk
+\par \hich\af1\dbch\af31505\loch\f1 LICENSE AND SERVICES AGREEMENT
+\par \hich\af1\dbch\af31505\loch\f1 Autodesk}{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\super\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'ae}{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1  FBX}{
+\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\super\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'ae}{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\insrsid5905377 \hich\af1\dbch\af31505\loch\f1  SDK 2019}{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 
+\par 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 READ CAREFULLY:}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1   AUTODESK LICENSES THE SOFTWARE AND OTHER LICENSED MATERIALS ONLY ON THE CONDITION THAT LICENSEE ACCEPTS ALL OF THE TERMS CONTAINED OR REFERENCED IN THIS AGREEMENT.
+\par \hich\af1\dbch\af31505\loch\f1 \hich\f1 By selecting the \'93\loch\f1 \hich\f1 I accept\'94\loch\f1 
+ button or other button or mechanism designed to acknowledge agreement to the terms of an electronic copy of this Agreement, or by installing, downloading, accessing, or otherwise copying or using all or any portion of the Autod
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+sk Materials, (i) you accept this Agreement on behalf of the entity for which you are authorized to act (e.g., an employer) and acknowledge that such entity is legally bound by this Agreement (and you agree to act in a manner consistent with this Agreemen
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+) or, if there is no such entity for which you are authorized to act, you accept this Agreement on behalf of yourself as an individual and acknowledge that you are legally bound by this Agreement, and (ii) you represent and warrant that you have the right
+,\hich\af1\dbch\af31505\loch\f1 
+ power and authority to act on behalf of and bind such entity (if any) or yourself.  You may not accept this Agreement on behalf of another entity unless you are an employee or other agent of such other entity with the right, power and authority to act on
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 behalf of such other entity.
+\par \hich\af1\dbch\af31505\loch\f1 \hich\f1 
+If Licensee is unwilling to accept this Agreement, or you do not have the right, power and authority to act on behalf of and bind such entity or yourself as an individual (if there is no such entity), (a) DO NOT SELECT THE \'93\loch\f1 I A
+\hich\af1\dbch\af31505\loch\f1 \hich\f1 CCEPT\'94\loch\f1 
+ BUTTON OR OTHERWISE CLICK ON ANY BUTTON OR OTHER MECHANISM DESIGNED TO ACKNOWLEDGE AGREEMENT, AND DO NOT INSTALL, DOWNLOAD, ACCESS, OR OTHERWISE COPY OR USE ALL OR ANY PORTION OF THE AUTODESK MATERIALS; AND (b) WITHIN THIRTY (30) DAYS FROM THE DATE
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+OF ACQUIRING THE AUTODESK MATERIALS, LICENSEE MAY RETURN THE AUTODESK MATERIALS (INCLUDING ANY COPIES) TO THE ENTITY FROM WHICH THEY WERE ACQUIRED FOR A REFUND OF THE APPLICABLE LICENSE FEES PAID BY THE LICENSEE.  
+\par \hich\af1\dbch\af31505\loch\f1 \hich\f1 The words \'93\loch\f1 \hich\f1 Autodesk", \'93\loch\f1 \hich\f1 Agreement\'94\loch\f1 \hich\f1  and \'93\loch\f1 Li\hich\af1\dbch\af31505\loch\f1 \hich\f1 censee\'94\loch\f1 
+ and other capitalized terms used in this Agreement are defined terms.  The definitions can be found in Exhibit A (if the terms are not defined in the main body of the Agreement).
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 License Grant}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  Subject to and conditioned on Licensee\loch\af1\dbch\af31505\hich\f1 \rquote \loch\f1 
+s continuous compliance with this Agreement, Autodesk grants Licensee a nonexclusive, nonsublicensable, nontransferable, limited license to Install and Access the Licensed SDK and User Documentation, in each case solely (a) in the Territory, (b) }{
+\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 within th\hich\af1\dbch\af31505\loch\f1 e scope of the License Type and Permitted }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 Number}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid4142109 \hich\af1\dbch\af31505\loch\f1  specified in the applicable License Identification, and (c) in accordance with the other terms of this Agreement, to:
+
+\par }\pard \ltrpar\ql \li720\ri0\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.1.1\~\~\~\~\~\~ (a)\~\~\~\~
+use the SDK for development, research, internal, educational, or comme\hich\af1\dbch\af31505\loch\f1 rcial purposes:
+\par }\pard \ltrpar\ql \fi1440\li720\ri0\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 \hich\f1 
+(i) to create a software product with the capability to read and/or write and/or translate Licensee files, which software product links to the Library (\'93\loch\f1 \hich\f1 Developed Software\'94\loch\f1 ); and/or
+\par \hich\af1\dbch\af31505\loch\f1 (ii) to modify the Sample Code(s) solely to create an obje\hich\af1\dbch\af31505\loch\f1 \hich\f1 ct code version(s) (\'93\loch\f1 \hich\f1 Modified Code(s)\'94\loch\f1 ); and/or
+\par }\pard \ltrpar\ql \fi720\li720\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 (b)\~\~\~\~\~
+reproduce the Library to link to the Developed Software.
+\par }\pard \ltrpar\ql \li720\ri0\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.1.2\~\~\~\~\~\~(a)\~\~\~\~\~
+incorporate the executable version of the Developed Software into; and/or
+\par }\pard \ltrpar\ql \fi720\li720\ri0\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 (b)\~\~\~\~\~\hich\af1\dbch\af31505\loch\f1 
+incorporate the Modified Code(s) into; and/or
+\par \hich\af1\dbch\af31505\loch\f1 (c)\~\~\~\~\~link the Library, in binary code form to;
+\par }\pard \ltrpar\ql \li720\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 \hich\f1 software products developed by Licensee (\'93\loch\f1 
+\hich\f1 Licensee Product(s)\'94\loch\f1 ) for Licensee\hich\f1 \rquote \loch\f1 s Internal Business Needs.
+\par }\pard \ltrpar\ql \fi720\li720\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.1.3\~\~\~reproduce, distribute and sublicense free of cha
+\hich\af1\dbch\af31505\loch\f1 \hich\f1 rge or for a fee Licensee Product(s) provided that Licensee must sublicense the Software, the Developed Software, the Library, the Sample Code(s) and the Modified Code(s) \'93\loch\f1 \hich\f1 as is\'94\loch\f1 
+, without warranty of any kind.
+\par }\pard \ltrpar\ql \li720\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Various License Types are described in Exhibit
+\hich\af1\dbch\af31505\loch\f1  B.  }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+In any case where the License Identification does not specify a License Type or Permitted Number or Territory, or there is no License Identification, the License Type will, by default, be the Stand-alone (Individual) License and the Territory will be 
+\hich\af1\dbch\af31505\loch\f1 worldwide, subject to the Export Control requirements herein.
+\par }\pard \ltrpar\ql \fi720\li720\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.1.4\~\~\~\~\~\~
+ Licensee shall reproduce and apply any copyright or other proprietary rights notices included on or embedded in the Software, or any part thereof, to any copies of the Software or an\hich\af1\dbch\af31505\loch\f1 
+y part thereof, or to the Developed Software, in any form.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \f0\insrsid4142109 
+\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.1.5\~\~\~\~\~\~
+ Licensee shall place the following statement in the copyright area of either: (i) the end-user License and/or terms of use for the Developed Software; or (ii) the \hich\f1 \lquote \loch\f1 About Box\hich\f1 \rquote \loch\f1  or similar
+\hich\af1\dbch\af31505\loch\f1 
+ notice page of the Developed Software; and Licensee shall also include the following statement in the copyright area of either: (a) the on-line documentation regarding the Developed Software; or (b) any other document related to Developed Software that c
+\hich\af1\dbch\af31505\loch\f1 o\hich\af1\dbch\af31505\loch\f1 ntains copyright information:}{\rtlch\fcs1 \af0 \ltrch\fcs0 \f0\insrsid4142109 
+\par }\pard \ltrpar\ql \li720\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'93\loch\f1 \hich\f1 This software contains Autodesk\'ae\loch\f1 
+\hich\f1  FBX\'ae\loch\f1  code developed }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid5905377 \hich\af1\dbch\af31505\loch\f1 by Autodesk, Inc. Copyright 2018}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 \hich\f1  Autodesk, Inc. All rights, reserved. Such code is provided \'93\loch\f1 \hich\f1 as is\'94\loch\f1  and Autodesk, Inc. disclaims any and all warranties, whether express or \hich\af1\dbch\af31505\loch\f1 
+implied, including without limitation the implied warranties of merchantability, fitness for a particular purpose or non-infringement of third party rights. In no event shall Autodesk, Inc. be liable for any direct, indirect, incidental, special, exemplar
+\hich\af1\dbch\af31505\loch\f1 y\hich\af1\dbch\af31505\loch\f1 
+, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort 
+\hich\af1\dbch\af31505\loch\f1 (\hich\af1\dbch\af31505\loch\f1 \hich\f1 including negligence or otherwise) arising in any way out of such code.\'94}{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Upgrades and Previous Versions}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx1440\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.2.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Effect of Upgrades}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  If Autodesk or a Reseller provides Licensee with an Upgrade to other Licensed Materials previously licensed to License\hich\af1\dbch\af31505\loch\f1 \hich\f1 
+e, the Licensed Materials previously licensed to Licensee and any other Autodesk Materials relating thereto will thereafter be deemed to be a \'93\loch\f1 \hich\f1 Previous Version.\'94\loch\f1 
+  Except as set forth in Section 1.2.2 (Exception for Relationship Program Licensees), the lic\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+nse grant and other rights with respect to any Previous Version will terminate one hundred twenty (120) days after Installation of the Upgrade.  Within such one hundred twenty (120) day period, except as set forth in Section 1.2.2 (Exception for Relations
+\hich\af1\dbch\af31505\loch\f1 h\hich\af1\dbch\af31505\loch\f1 
+ip Program Licensees), (a) Licensee must cease all use of any Previous Version and Uninstall all copies of the Previous Version, and (b) upon expiration of such period, such Previous Version will no longer constitute Licensed Materials but rather will be 
+\hich\af1\dbch\af31505\loch\f1 d\hich\af1\dbch\af31505\loch\f1 eemed to be Excluded Materials and Licensee will no longer have a license for any such Previous Version.  At Autodesk\hich\f1 \rquote \loch\f1 
+s request, Licensee agrees to destroy or return to Autodesk or the Reseller from which they were acquired all copies of the Previous Vers\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 
+on.  Autodesk reserves the right to require Licensee to show satisfactory proof that all copies of any Previous Version have been Uninstalled and, if so requested by Autodesk, destroyed or returned to Autodesk or the Reseller from which they were acquired
+.
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.2.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Exception for Relationship Program Licensees}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  The termination of rights as to Previous Versions described in Section 1.2.1 (Effect of Upgrades) may not apply to Licensee if and to the extent (a) Licensee participates in a Relationship Program and t\hich\af1\dbch\af31505\loch\f1 
+he Relationship Program Terms authorize Licensee to retain such Previous Versions or (b) otherwise authorized in writing by Autodesk.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.3\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Additional Terms}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  The Licensed Materials (or portions thereof) may be subject to terms (e.g., terms accompanying such Licensed Materials or made available in connection with ordering, installing, downloading, accessing, using or copying such Licensed Materials) that are
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 in addition to or different from the terms set forth in this Agreement, and Licensee agrees to comply with such terms.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.4\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Other Materials}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  If Autodesk provides or makes available to Licensee any additional materials associated with the Licensed Materials\hich\af1\dbch\af31505\loch\f1 
+, including any corrections, patches, service packs, updates or upgrades to, or new versions of, the Licensed Materials (including Upgrades) or any Supplemental Materials or User Documentation for the Licensed Materials, (a) such additional materials may 
+\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 
+nclude or be subject to other terms in addition to or different from the terms set forth in this Agreement (including, without limitation, additional or different fees, license terms, or restrictions on use), and Licensee agrees to comply with such terms,
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+or (b) if there are no other terms for such additional materials, they will (except as otherwise provided by Section 1.2 (Upgrades and Previous Versions)) be subject to the same terms (including, without limitation, the licenses, applicable License Type a
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 
+d Permitted Number, and other terms of this Agreement) as the Licensed Materials to which such additional materials apply.  In no event will the foregoing result in any rights with respect to Excluded Materials.
+\par \hich\af1\dbch\af31505\loch\f1 1.5\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Authorized Users}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Licensee may permit t\hich\af1\dbch\af31505\loch\f1 he Licensed Materials to be Installed and/or Accessed only by Licensee\hich\f1 \rquote \loch\f1 
+s Personnel (except as otherwise designated in the applicable License Type), and any such Installation or Access will be subject to any other requirements imposed by this Agreement and\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+the applicable License Type and Permitted Number.  Licensee will be responsible for compliance with this Agreement by Licensee\hich\f1 \rquote \loch\f1 
+s Personnel and any other persons who may have Access to the Autodesk Materials through Licensee (whether or not such Access is \hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 
+uthorized by Autodesk or within the scope of the applicable License Type and Permitted Number).
+\par \hich\af1\dbch\af31505\loch\f1 1.6\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Third-Party Licensed Materials}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 .  The Autodesk Materials may contain or be accompanied by third-party software, data or other materials that are subject to a\hich\af1\dbch\af31505\loch\f1 \hich\f1 
+nd provided in accordance with terms that are in addition to or different from the terms set forth in this Agreement.  Such terms may be included or referenced in or with such third-party software, data or other materials (e.g., in the \'93\loch\f1 
+\hich\f1 About box\'94\loch\f1 ) or a w\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 b page specified by Autodesk (the URL for which may be obtained on Autodesk\hich\f1 \rquote \loch\f1 
+s website or on request to Autodesk).  Licensee agrees to comply with such terms.  In addition, Licensee will take sole responsibility for obtaining and complying with any license\hich\af1\dbch\af31505\loch\f1 s\hich\af1\dbch\af31505\loch\f1 
+ that may be necessary to use third-party software, data or other materials that Licensee uses or obtains for use in conjunction with the Licensed Materials.  Licensee acknowledges and agrees that Autodesk has no responsibility for, and makes no represent
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 tions or warranties regarding, such third-party software, data or other materials or Licensee\hich\f1 \rquote \loch\f1 s use of such third-party software, data or other materials.
+\par \hich\af1\dbch\af31505\loch\f1 1.7\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Relationship Programs}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Autodesk may offer to Licensee, and (if so) Licensee may participate in o\hich\af1\dbch\af31505\loch\f1 
+ne (1) or more Relationship Programs applicable to the Licensed Materials licensed to Licensee under this Agreement (and such Relationship Programs may include rights in addition to or different from those set forth in this Agreement).  Any Relationship P
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 ograms are subject to Autodesk\hich\f1 \rquote \loch\f1 
+s terms therefor, which terms are set forth in the applicable Relationship Program Terms.  Licensee agrees that if it requests, accepts, or makes use of any Relationship Program, Licensee will be bound by such terms, as they\hich\af1\dbch\af31505\loch\f1 
+ \hich\af1\dbch\af31505\loch\f1 
+may be modified from time to time in accordance with the applicable Relationship Program Terms (and such terms, as so modified from time to time, are a part of and incorporated by reference into this Agreement), and Licensee agrees to comply with such ter
+\hich\af1\dbch\af31505\loch\f1 m\hich\af1\dbch\af31505\loch\f1 s.  Licensee acknowledges that Autodesk may require a further acceptance of such terms as a condition to participation in a Relationship Program.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.8\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Services}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Autodesk may provide, and Licensee may elect to receive or benefit from, certain Services from \hich\af1\dbch\af31505\loch\f1 time to time.  Any Services are subject to Autodesk\hich\f1 \rquote \loch\f1 
+s terms therefor, which terms are set forth in the applicable Services Terms.  Licensee agrees that if it requests, accepts, or makes use of any Services, Licensee will be bound by such terms, as they ma\hich\af1\dbch\af31505\loch\f1 y
+\hich\af1\dbch\af31505\loch\f1 
+ be modified from time to time in accordance with the applicable Services Terms (and such terms, as so modified from time to time, are a part of and incorporated by reference into this Agreement), and Licensee agrees to comply with such terms.  Licensee a
+\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 knowledges that Autodesk may require a further acceptance of such terms as a condition to providing Services.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.9\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Archival Copy}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  Licensee\hich\f1 \rquote \loch\f1 
+s license under Section 1.1 (License Grant) includes the right to make a single archival copy of the Licensed Materia\hich\af1\dbch\af31505\loch\f1 
+ls in the Territory, provided that (a) the single-copy limitation will not apply to copies made as an incidental part of a routine backup of Licensee\hich\f1 \rquote \loch\f1 
+s entire computer system on which the Licensed Materials are Installed in accordance with this Agreement,\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+where such backup includes the making of copies of substantially all other software on such computer system and (b) any archival copy may be Accessed or Installed (other than on a backup storage medium from which the Licensed Materials cannot be Accessed)
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+only when and for so long as the primary copy of the Licensed Materials is inaccessible and inoperable.  Copies of the Licensed Materials that are Installed and are in excess of the Permitted Number at any time while the primary copy of the Licensed Mater
+\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 als is also Accessible are not "archival copies" as permitted under this Section 1.9 (Archival Copy).
+\par \hich\af1\dbch\af31505\loch\f1 1.10\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Nature of Licenses}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Licensee acknowledges and agrees that when Licensee acquires a license of Licensed Materials, (including through a Relationship \hich\af1\dbch\af31505\loch\f1 Program or Services), Licensee\hich\f1 \rquote \loch\f1 
+s acquisition is neither contingent on the delivery of any future features or functionality nor subject to any public or other comments (oral, written or otherwise) made by Autodesk regarding future features or functionality.
+\par \hich\af1\dbch\af31505\loch\f1 1.11\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Feedback}{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\insrsid4142109 .
+\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Licensee hereby grants Autodesk, under all of Licensee\hich\f1 \rquote \loch\f1 
+s intellectual property and proprietary rights, the following worldwide, exclusive, transferable, perpetual, irrevocable, royalty-free, fully paid-up rights: (1) to make, have made, use\hich\af1\dbch\af31505\loch\f1 
+, copy, modify, and create derivative works of the Feedback as part of or in connection with any Autodesk product, technology, service, content, material, specification or documentation (including without limitation in connection with the marketing or sal
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+ thereof); (2) to publicly perform or display, import, broadcast, transmit, distribute, license, offer to sell and sell, rent, lease or lend copies of the Feedback (and derivative works thereof and improvements thereon); and (3) to sublicense to third par
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 ies the foregoing rights, including the right to sublicense to further third parties}{\rtlch\fcs1 \af0\afs18 \ltrch\fcs0 \f0\fs18\insrsid4142109 .}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 \hich\f1   \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Feedback}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  shall mean all suggestions, comments, input, ideas, reports, information or know-how (whether in oral or written form) provided by Licensee to Autodesk or an \hich\af1\dbch\af31505\loch\f1 
+Autodesk affiliate in connection with Licensee\hich\f1 \rquote \loch\f1 s evaluation of or use of the Licensed Materials.  Feedback does not include any artwork or sample content created by Licensee using the Licensed Materials.}{\rtlch\fcs1 \af0\afs18 
+\ltrch\fcs0 \f0\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 License Limitations; Prohibitions}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Limitations\hich\af1\dbch\af31505\loch\f1  and Exclusions}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 .}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx1440\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.1.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 No License Granted; Unauthorized Activities}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  The parties acknowledge and agree that, notwithstanding anything to the contrary in this Agreement, no license is granted (whether expressly, by implication or otherwise) under this Agree\hich\af1\dbch\af31505\loch\f1 
+ment (and this Agreement expressly excludes any right) (a) to Excluded Materials, (b) to any Autodesk Materials that Licensee did not acquire lawfully or that Licensee acquired in violation of or in a manner inconsistent with this Agreement, (c) for Insta
+\hich\af1\dbch\af31505\loch\f1 l\hich\af1\dbch\af31505\loch\f1 
+lation of or Access to the Licensed Materials beyond the applicable license term (whether a fixed term or Relationship Program period or term) or outside the scope of the applicable License Type or Permitted Number, (d) for Installation of the Licensed Ma
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 erials on any Computer other than a Computer owned or leased, and controlled}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\uldb\cf2\insrsid4142109 ,}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1  by Li\hich\af1\dbch\af31505\loch\f1 
+censee, unless otherwise authorized in writing by Autodesk, (e) to distribute, rent, loan, lease, sell, sublicense, transfer or otherwise provide all or any portion of the Autodesk Materials to any person or entity except as expressly set forth in this Ag
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+eement or as expressly authorized in writing by Autodesk, (f) to provide or make available any features or functionality of the Autodesk Materials to any person or entity (other than to and for Licensee itself for the purpose specified in the applicable L
+\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 
+cense Type), whether or not over a network and whether or not on a hosted basis, (g) except as otherwise expressly provided with respect to a specific License Type, to Install or Access or allow the Installation of or Access to the Autodesk Materials over
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+the Internet or other non-local network, including, without limitation, use in connection with a wide area network (WAN), virtual private network (VPN), virtualization, Web hosting, time-sharing, service bureau, software as a service, cloud or other servi
+\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 
+e or technology, (h) to remove, alter or obscure any proprietary notices, labels or marks in the Autodesk Materials, (i) to decompile, disassemble or otherwise reverse engineer the Autodesk Materials, or (j) to translate, adapt, arrange, or create derivat
+\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 ve works based on, or otherwise modify the Autodesk Materials for any purpose.
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.1.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Licensed Materials as a Single Product}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  The Licensed Materials are licensed to Licensee as a single product and the applicable components may not be separated for Install\hich\af1\dbch\af31505\loch\f1 
+ation or Access (and all such components must be Installed and Accessed on the same Computer except as authorized in writing by Autodesk).
+\par \hich\af1\dbch\af31505\loch\f1 2.1.3\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Territory}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Except as otherwise authorized in writing by Autodesk, the licenses granted in this Agreement are g\hich\af1\dbch\af31505\loch\f1 ranted only for the Territory.  Nothing in this Agreement permits Licensee (including, without limitation, Licensee
+\hich\f1 \rquote \loch\f1 s Personnel, if any) to Install or Access the Licensed Materials outside of the Territory.
+\par \hich\af1\dbch\af31505\loch\f1 2.1.4\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Effect of Unauthorized Use}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Licensee will \hich\af1\dbch\af31505\loch\f1 \hich\f1 
+not engage in, and will not permit or assist any third party to engage in any of the uses or activities prohibited (or any uses or activities inconsistent with the limitations described) in this Section 2.1 (Limitations and Exclusions) (collectively, \'93
+\loch\f1 Una\hich\af1\dbch\af31505\loch\f1 u\hich\af1\dbch\af31505\loch\f1 \hich\f1 thorized Uses\'94\loch\f1 ).  Any such Unauthorized Use, and any Installation}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1  of or Access to the Licensed Materials provided under this Agreement, outside of the scope of the applicable license grants (including, without limitation, outside the applicable License Typ\hich\af1\dbch\af31505\loch\f1 
+e and/or Permitted Number) or otherwise not in accordance with this Agreement, constitute or result in infringement of Autodesk\hich\f1 \rquote \loch\f1 
+s intellectual property rights as well as a breach of this Agreement.  Licensee will notify Autodesk promptly of any such Unaut\hich\af1\dbch\af31505\loch\f1 h\hich\af1\dbch\af31505\loch\f1 orized Uses or other unauthorized Installation or Access.
+\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang4105\langfe1041\langnp4105\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.1.5\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\lang4105\langfe1041\langnp4105\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 Use of Open Source Software by Licensee}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang4105\langfe1041\langnp4105\insrsid4142109 .\~\hich\af1\dbch\af31505\loch\f1 
+ If Licensee uses any third party software (including free or Open Source Software), whether or not in conjunction with the Software, Licensee shall en\hich\af1\dbch\af31505\loch\f1 
+sure that its use does not: (i) create, or purport to create, obligations of Autodesk or any of its affiliates with respect to the Software; (ii) grant, or purport to grant, to any third party any rights to or immunities under Autodesk\hich\f1 \rquote 
+\loch\f1 s or any of its aff\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 liates intellectual property rights; or (iii) cause the Software to be subject to any licensing terms other than those set forth in this Agreement.}{\rtlch\fcs1 
+\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Circumvention}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx1440\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.2.1\tab 
+Licensee may not (i) utilize any equipment, device, software, or other means to (\hich\af1\dbch\af31505\loch\f1 
+or designed to) circumvent or remove any form of technical protection used by Autodesk in connection with the Autodesk Materials, or (ii) Install or Access the Autodesk Materials with any product code, authorization code, serial number, or other copy-prot
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+ction device not supplied by Autodesk directly or through a Reseller.  Without limitation of the generality of the foregoing, Licensee may not utilize any equipment, device, software, or other means to (or designed to) circumvent or remove the Autodesk Li
+\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 ense Manager or any tool or technical protection measure provided or made available by Autodesk for managing, monitoring or controlling Installation of or Access to Autodesk Materials.
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.2.2\tab \hich\af1\dbch\af31505\loch\f1 
+Licensee may not utilize any equipment, device, software, or other means to (or designed to) circumvent or remove any usage restrictions, or to enable functionality disabled by Autodesk, in connection with the Excluded Materials.  Licensee may not bypass 
+\hich\af1\dbch\af31505\loch\f1 o\hich\af1\dbch\af31505\loch\f1 
+r delete any functionality or technical limitations of the Autodesk Materials that (or that are designed to) prevent or inhibit the unauthorized copying of, Installation or Access to the Excluded Materials.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 3.\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 All Rights Reserved}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Autodesk and its licensors\hich\af1\dbch\af31505\loch\f1 
+ retain title to and ownership of, and all other rights with respect to, the Autodesk Materials and all copies thereof, including, without limitation, any related copyrights, trademarks, trade secrets, patents, and other intellectual property rights.  Lic
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+nsee has only the limited licenses granted with respect to the Licensed Materials expressly set forth in this Agreement, and Licensee has no other rights, implied or otherwise.  Licensee acknowledges and agrees that the Autodesk Materials are licensed, no
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+ sold, and that rights to Install and Access the Licensed Materials are acquired only under the license from Autodesk.  The structure and organization of Software included in the Autodesk Materials, any source code or similar materials relating to such So
+\hich\af1\dbch\af31505\loch\f1 f\hich\af1\dbch\af31505\loch\f1 
+tware, any API Information and Development Materials (both as described in Section 1.11 (APIs)), and any other Licensed Materials identified as confidential or proprietary are valuable trade secrets of, and confidential and proprietary information of, Aut
+\hich\af1\dbch\af31505\loch\f1 o\hich\af1\dbch\af31505\loch\f1 desk and its suppliers, and (a) may not be distributed, disclosed or otherwise provided to third parties, and (b) may be used only internally and only in conjunction with and for Licensee
+\hich\f1 \rquote \loch\f1 s own authorized internal use of the Licensed Materials.  
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 4.\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Privac\hich\af1\dbch\af31505\loch\f1 y; Use of Information; Connectivity}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 4.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Privacy and Use of Information}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Licensee acknowledges and agrees that Licensee (and third parties acting on Licensee\hich\f1 \rquote \loch\f1 s behalf) may provide, and Autodesk and its Resellers (and third parties acting on behalf of Autod\hich\af1\dbch\af31505\loch\f1 
+esk and its Resellers) may obtain, certain information and data with respect to Licensee (including, without limitation, personal information) and Licensee\hich\f1 \rquote \loch\f1 
+s business in connection with this Agreement, including, without limitation, information and data p\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+ovided to or obtained by Autodesk and its Resellers (or third parties acting on behalf of Autodesk and its Resellers) through the Customer Information Form and otherwise, in connection with ordering, registration, activation, updating, validating entitlem
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+nt to, auditing, monitoring Installation of and Access to Autodesk Materials, Relationship Programs and Services and managing the relationship with Licensee.  Licensee hereby consents to Autodesk maintaining, using, storing and disclosing such information
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 and data (including, without limitation, personal information, if any) in conformity with Autodesk\hich\f1 \rquote \loch\f1 
+s policies on privacy and data protection, as such policies may be updated from time to time, including without limitation Autodesk\hich\f1 \rquote \loch\f1 s Privacy Statement, as \hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 
+urrently located at }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 HYPERLINK "http://usa.autodesk.com/privacy/"}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid5905377 {\*\datafield 
+00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5a00000068007400740070003a002f002f007500730061002e006100750074006f006400650073006b002e0063006f006d002f0070007200690076006100630079002f000000795881f43b1d7f48af2c825dc4852763
+00000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\cf2\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 http://usa.autodesk.com/privacy/}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  Without limitation of the generality of the foregoing, Licensee acknowledges and agrees that: (a) Autodesk may from time to time prompt Licensee (and thir\hich\af1\dbch\af31505\loch\f1 
+d parties acting on Licensee\hich\f1 \rquote \loch\f1 s behalf) to provide express agreement to the terms of Autodesk\hich\f1 \rquote \loch\f1 
+s Privacy Statement and/or express agreement to specific uses of information and data (including, without limitation, personal information); (b) Autodesk may prov\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 
+de information and data, including, without limitation, information and data about Licensee\hich\f1 \rquote \loch\f1 s use of Autodesk Materials, Relationship Programs, and Licensee\hich\f1 \rquote \loch\f1 
+s support requests, to Autodesk subsidiaries and affiliates, Resellers and other third parties in \hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 
+onnection with the provision, maintenance, administration or usage of Licensed Materials, Relationship Programs or Services or in connection with enforcement of any agreements relating to Licensed Materials, Relationship Programs or Services; and (c) Auto
+\hich\af1\dbch\af31505\loch\f1 d\hich\af1\dbch\af31505\loch\f1 
+esk may make cross-border transfers of such information and data, including to jurisdictions with privacy or data protection laws that are less protective of Licensee than the jurisdiction in which Licensee is domiciled.  Licensee acknowledges and agrees 
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 hat such policies may be changed from time to time by Autodesk and that, effective upon posting on Autodesk\hich\f1 \rquote \loch\f1 
+s website or other written notice from Autodesk, Licensee will be subject to such changes.  
+\par \hich\af1\dbch\af31505\loch\f1 4.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Connectivity}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Certain Licensed Materials may facil\hich\af1\dbch\af31505\loch\f1 itate or require Licensee\hich\f1 \rquote \loch\f1 
+s access to and use of content and services that are hosted on websites maintained by Autodesk or by third parties.  In some cases, such content and services may appear to be a feature or function within, or extension of, the Lic
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 nsed Materials on Licensee\hich\f1 \rquote \loch\f1 s Computer even though hosted on such websites.  Accessing such content or services and use of Licensed Materials may cause Licensee
+\hich\f1 \rquote \loch\f1 s Computer, without additional notice, to connect automatically to the Internet (transitorily, \hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 
+ntermittently or on a regular basis) and to communicate with an Autodesk or third-party website\hich\f1 \emdash \loch\f1 
+for example, for purposes of providing Licensee with additional information, features and functionality or to validate that the Licensed Materials and/or conte\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 
+t or services are being used as permitted under this Agreement or other applicable terms.  Such connectivity to Autodesk websites is governed by Autodesk\hich\f1 \rquote \loch\f1 
+s policies on privacy and data protection described in this Section 4 (Privacy; Use of Information; C\hich\af1\dbch\af31505\loch\f1 o\hich\af1\dbch\af31505\loch\f1 
+nnectivity).  Such connectivity to websites of third parties is governed by the terms (including the disclaimers and notices) found on such sites or otherwise associated with the third-party content or services.  Autodesk does not control, endorse, or acc
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+pt responsibility for any such third-party content or services, and any dealings between Licensee and any third party in connection with such content or services, including, without limitation, such third party\hich\f1 \rquote \loch\f1 
+s privacy policies, use of personal informat\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 
+on, delivery of and payment for goods and services, and any other terms associated with such dealings, are solely between Licensee and such third party.  Autodesk may at any time, for any reason, modify or discontinue the availability of any third-party c
+\hich\af1\dbch\af31505\loch\f1 o\hich\af1\dbch\af31505\loch\f1 ntent or services. Access to and use of certain content and services (whether of Autodesk or third parties) may require assent to separate terms and/or payment of additional fees.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 5.\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Limited Warranty and Disclaimers }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 5.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Limited Warranty}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  Autodesk warrant\hich\af1\dbch\af31505\loch\f1 \hich\f1 
+s that, as of the date on which the Licensed Materials are delivered to Licensee and for ninety (90) days thereafter or if the license term is shorter, such shorter period (\'93\loch\f1 \hich\f1 Warranty Period\'94\loch\f1 
+), the Licensed Materials will provide the general features and f\hich\af1\dbch\af31505\loch\f1 u\hich\af1\dbch\af31505\loch\f1 nctions described in the User Documentation portion of the Licensed Materials.  Autodesk's entire liability and Licensee
+\hich\f1 \rquote \loch\f1 \hich\f1 s exclusive remedy during the Warranty Period (\'93\loch\f1 \hich\f1 Limited Warranty\'94\loch\f1 ) will be, with the exception of any statutory warranty or remedy tha\hich\af1\dbch\af31505\loch\f1 t
+\hich\af1\dbch\af31505\loch\f1 
+ cannot be excluded or limited under law, at Autodesk's option, (i) to attempt to correct or work around errors, if any, or (ii) to refund the license fees, if any, paid by Licensee and terminate this Agreement or the license specific to such Licensed Mat
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 rials.  Such refund is subject to the return, during the Warranty Period, of the Autodesk Materials, with a copy of Licensee\hich\f1 \rquote \loch\f1 s License Identification, to Licensee
+\hich\f1 \rquote \loch\f1 s local Autodesk office or the Reseller from which Licensee acquired the Autodesk Materials.\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+ THE LIMITED WARRANTY SET FORTH IN THIS SECTION GIVES LICENSEE SPECIFIC LEGAL RIGHTS.  LICENSEE MAY HAVE ADDITIONAL LEGAL RIGHTS UNDER LAW WHICH VARY FROM JURISDICTION TO JURISDICTION.  AUTODESK DOES NOT SEEK TO LIMIT LICENSEE\hich\f1 \rquote \loch\f1 
+S WARRANTY RIGHTS TO ANY EXT\hich\af1\dbch\af31505\loch\f1 E\hich\af1\dbch\af31505\loch\f1 NT NOT PERMITTED BY LAW.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 5.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Disclaimer}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  EXCEPT FOR THE EXPRESS LIMITED WARRANTY PROVIDED IN SECTION 5.1 (LIMITED WARRANTY), AND TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, AUTODESK AND ITS SUPPLIERS MAKE, AND LICENSEE RECEIVES, NO WARRANTIES, REPR\hich\af1\dbch\af31505\loch\f1 
+ESENTATIONS, OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED (INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NONINFRINGEMENT, OR WARRANTIES OTHERWISE IMPLIED BY STATUTE OR FROM A COURSE OF DEAL
+\hich\af1\dbch\af31505\loch\f1 I\hich\af1\dbch\af31505\loch\f1 
+NG OR USAGE OF TRADE) WITH RESPECT TO ANY AUTODESK MATERIALS, RELATIONSHIP PROGRAMS, OR SERVICES (PURSUANT TO A RELATIONSHIP PROGRAM OR OTHERWISE).  ANY STATEMENTS OR REPRESENTATIONS ABOUT THE AUTODESK MATERIALS, RELATIONSHIP PROGRAMS OR SERVICES AND THEI
+\hich\af1\dbch\af31505\loch\f1 R\hich\af1\dbch\af31505\loch\f1 
+ FEATURES OR FUNCTIONALITY IN THE LICENSED MATERIALS OR ANY COMMUNICATION WITH LICENSEE ARE FOR INFORMATION PURPOSES ONLY, AND DO NOT CONSTITUTE A WARRANTY, REPRESENTATION, OR CONDITION.  WITHOUT LIMITING THE FOREGOING, AUTODESK DOES NOT WARRANT:  (a) THA
+\hich\af1\dbch\af31505\loch\f1 T\hich\af1\dbch\af31505\loch\f1 
+ THE OPERATION OR OUTPUT OF THE LICENSED MATERIALS OR SERVICES WILL BE UNINTERRUPTED, ERROR-FREE, SECURE, ACCURATE, RELIABLE, OR COMPLETE, WHETHER OR NOT UNDER A RELATIONSHIP PROGRAM OR SUPPORT BY AUTODESK OR ANY THIRD PARTY; (b) THAT ERRORS WILL BE CORRE
+\hich\af1\dbch\af31505\loch\f1 C\hich\af1\dbch\af31505\loch\f1 TED BY AUTODESK OR ANY THIRD PARTY; OR (c) THAT AUTODESK OR ANY THIRD PARTY WILL RESOLVE ANY PARTICULAR SUPPORT REQUEST OR THAT SUCH RESOLUTION WILL MEET LICENSEE\hich\f1 \rquote \loch\f1 
+S REQUIREMENTS OR EXPECTATIONS.  NOTHING IN THE FOREGOING RESTRICTS THE EFFECT OF WARRANTIES\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+OR CONDITIONS WHICH MAY BE IMPLIED BY LAW WHICH CANNOT BE EXCLUDED, RESTRICTED OR MODIFIED NOTWITHSTANDING A CONTRACTUAL RESTRICTION TO THE CONTRARY.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \caps\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+ WITHOUT LIMITING THE FOREGOING, Autodesk }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 AND ITS SUPPLIERS MAKE, AND LICENSEE RECEIVES, }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \caps\f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 no warranties that\hich\af1\dbch\af31505\loch\f1 
+: (I) future versions of the SDK, Library and/or Sample Code(s), if any, will contain features similar to or the same as the SDK, Library and/or Sample Code(s), respectively or will be compatible with the SDK, Library and/or Sample Code(s), respectively; 
+\hich\af1\dbch\af31505\loch\f1 (\hich\af1\dbch\af31505\loch\f1 II) the Software or the SDK, Library and/or Sample Code(s) will meet LICENSEE requirements; or (iii) operation of the SDK, Library or Sample Code(s) will be uninterrupted or error-free.}{
+\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 6.\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Warnings}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 6.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Functionality Limitations}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  The Licensed Materials and\hich\af1\dbch\af31505\loch\f1 
+ Services (except for Licensed Materials designed for non-commercial use, such as Autodesk Materials designed to be used for household or other consumer purposes or licensed only for purposes of educational or individual learning) are commercial professio
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 al tools intended to be used by trained professionals only.  Particularly in the case of commercial professional use, the Licensed Materials and Services are not a substitute for Licensee
+\hich\f1 \rquote \loch\f1 s professional judgment or independent testing.  The Licensed Mater\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 
+als and Services are intended only to assist Licensee with its design, analysis, simulation, estimation, testing and/or other activities and are not a substitute for Licensee\hich\f1 \rquote \loch\f1 
+s own independent design, analysis, simulation, estimation, testing, and/or othe\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+ activities, including those with respect to product stress, safety and utility.  Due to the large variety of potential applications for the Licensed Materials and Services, the Licensed Materials and Services have not been tested in all situations under 
+\hich\af1\dbch\af31505\loch\f1 w\hich\af1\dbch\af31505\loch\f1 
+hich they may be used.  Autodesk will not be liable in any manner whatsoever for the results obtained through use of the Licensed Materials or Services.  Persons using the Licensed Materials or Services are responsible for the supervision, management, and
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+control of the Licensed Materials and Services and the results of using the Licensed Materials and Services.  This responsibility includes, without limitation, the determination of appropriate uses for the Licensed Materials and Services and the selection
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+of the Licensed Materials, Services and other computer programs and materials to help achieve intended results.  Persons using the Licensed Materials or Services are also responsible for establishing the adequacy of independent procedures for testing the 
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+eliability, accuracy, completeness, and other characteristics of any output of the Licensed Materials or Services, including, without limitation, all items designed with the assistance of the Licensed Materials or Services.  Licensee further acknowledges 
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 nd agrees that the Licensed Materials form part of Licensee\hich\f1 \rquote \loch\f1 
+s total unique hardware and software environment to deliver specific functionality, and that the Licensed Materials and Services provided by Autodesk may not achieve the results Licensee desires \hich\af1\dbch\af31505\loch\f1 w
+\hich\af1\dbch\af31505\loch\f1 ithin Licensee\hich\f1 \rquote \loch\f1 s design, analysis, simulation, estimation, and/or testing constraints.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 6.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Activation Codes and Security}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 .
+\par \hich\af1\dbch\af31505\loch\f1 6.2.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Activation Code Required for Installation/Access and Continued Use}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  Installation of and Access to the Licensed Materials requir\hich\af1\dbch\af31505\loch\f1 
+e, and the continued use thereof may from time to time require, activation codes issued by Autodesk.  Registration may be required before an activation code is issued by Autodesk.  Licensee will provide Autodesk and its Reseller with any information requi
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 ed for such registration and agrees that any information provided to Autodesk or its Reseller will be accurate and current.  Licensee will also maintain and update Licensee\hich\f1 \rquote 
+\loch\f1 s registration information, on an ongoing basis, through customer data registratio\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 
+ processes, including without limitation the Customer Information Form, which may be provided by Autodesk.  Licensee acknowledges and agrees that Autodesk may use such information in accordance with its Privacy Statement (as described or referenced in Sec
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 ion 4 (Privacy; Use of Information; Connectivity)).
+\par \hich\af1\dbch\af31505\loch\f1 6.2.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Disabling Access}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  LICENSEE ACKNOWLEDGES AND AGREES THAT INSTALLATION OF AND ACCESS TO LICENSED MATERIALS MAY BE DISABLED BY THE ACTIVATION, SECURITY, AND TECHNICAL PROTECTION MECHANISMS IF LICENSEE TRIES TO TRANSFER ALL OR A PART OF THE LICENSED MATERIALS TO ANOTHER COM
+\hich\af1\dbch\af31505\loch\f1 P\hich\af1\dbch\af31505\loch\f1 
+UTER, IF LICENSEE TAMPERS WITH THE TECHNICAL PROTECTION MECHANISMS OR DATE-SETTING MECHANISMS ON A COMPUTER OR IN THE LICENSED MATERIALS, IF LICENSEE USES THE LICENSED MATERIALS PAST AN APPLICABLE RELATIONSHIP PROGRAM PERIOD OR FIXED TERM, OR IF LICENSEE 
+\hich\af1\dbch\af31505\loch\f1 U\hich\af1\dbch\af31505\loch\f1 NDERTAKES CERTAIN OTHER ACTIONS THAT AFFECT THE SECURITY MODE OR UNDER OTHER CIRCUMSTANCES AND THAT, IN ANY SUCH EVENT, LICENSEE\hich\f1 \rquote \loch\f1 S ACCESS TO LICENSEE\hich\f1 \rquote 
+\loch\f1 S WORK PRODUCT AND OTHER DATA MAY BE AFFECTED.  MORE INFORMATION IS CONTAINED IN THE APPLICABLE LICENSED \hich\af1\dbch\af31505\loch\f1 M\hich\af1\dbch\af31505\loch\f1 ATERIALS OR AVAILABLE FROM AUTODESK ON REQUEST.
+\par \hich\af1\dbch\af31505\loch\f1 6.2.3\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Effect of Activation Codes}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Licensee acknowledges and agrees that receipt of an activation code (whether or not provided to Licensee in error) will not constitute evidence of or affect the scope of Lic\hich\af1\dbch\af31505\loch\f1 ensee\hich\f1 \rquote \loch\f1 
+s license rights.  Those rights will be only as set forth in this Agreement and the applicable License Identification.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 6.3\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Affected Data}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Work product and other data created with Licensed Materials made available under certain License Types, includi\hich\af1\dbch\af31505\loch\f1 
+ng licenses that limit the permitted purpose to educational purposes or personal learning purposes, may contain certain notices and limitations that make the work product and other data usable only in certain circumstances (e.g., only in the education fie
+\hich\af1\dbch\af31505\loch\f1 l\hich\af1\dbch\af31505\loch\f1 
+d).  In addition, if Licensee combines or links work product or other data created with such Licensed Materials with work product or other data otherwise created, then such other work product or data may also be affected by these notices and limitations. 
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+Autodesk will have no responsibility or liability whatsoever if Licensee combines or links work product or other data created with such Licensed Materials with work product or other data otherwise created.  In addition, Licensee will not }{\rtlch\fcs1 
+\af1\afs18 \ltrch\fcs0 \f1\fs18\cf1\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 remove, }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 alter or o\hich\af1\dbch\af31505\loch\f1 bscure}{\rtlch\fcs1 \af1\afs18 
+\ltrch\fcs0 \f1\fs18\cf1\insrsid4142109 \hich\af1\dbch\af31505\loch\f1  any such notices or limitations.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 7.\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Limitations of Liability}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 7.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Limitation on Type and Amount of Liability}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  IN NO EVENT WILL AUTODESK OR ITS SUPPLIERS HAVE ANY LIABILITY (DIRECTLY OR INDIRECTLY) FOR ANY INCIDENTAL, SPECIAL, INDIRECT, CONSEQUENTIAL\hich\af1\dbch\af31505\loch\f1 
+ OR PUNITIVE DAMAGES; FOR LOSS OF PROFITS, USE, REVENUE, OR DATA; OR FOR BUSINESS INTERRUPTION (REGARDLESS OF THE LEGAL THEORY FOR SEEKING SUCH DAMAGES OR OTHER LIABILITY).  IN ADDITION, THE LIABILITY OF AUTODESK AND ITS SUPPLIERS ARISING OUT OF OR RELATI
+\hich\af1\dbch\af31505\loch\f1 N\hich\af1\dbch\af31505\loch\f1 
+G TO ANY AUTODESK MATERIALS, RELATIONSHIP PROGRAMS OR SERVICES WILL NOT EXCEED THE AMOUNT PAID OR PAYABLE BY LICENSEE FOR SUCH AUTODESK MATERIALS, RELATIONSHIP PROGRAMS, OR SERVICES, RESPECTIVELY.  
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 7.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Application of and Basis for Limitations}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  THE LIMITA\hich\af1\dbch\af31505\loch\f1 
+TIONS OF LIABILITY IN THIS SECTION 7 (LIMITATIONS OF LIABILITY) WILL APPLY TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW TO ANY DAMAGES OR OTHER LIABILITY, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, WHETHER DERIVED FROM CONTRACT, TORT (
+\hich\af1\dbch\af31505\loch\f1 I\hich\af1\dbch\af31505\loch\f1 
+NCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE, EVEN IF AUTODESK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LIABILITY AND REGARDLESS OF WHETHER THE LIMITED REMEDIES AVAILABLE HEREUNDER FAIL OF THEIR ESSENTIAL PURPOSE.  ALSO, LICENSEE AGREES THAT 
+\hich\af1\dbch\af31505\loch\f1 T\hich\af1\dbch\af31505\loch\f1 
+HE LICENSE, RELATIONSHIP PROGRAMS AND SERVICES FEES AND OTHER FEES CHARGED BY AUTODESK AND PAID BY LICENSEE ARE BASED ON AND REFLECTIVE OF THE ALLOCATION OF RISK CONTEMPLATED BY THIS SECTION 7 (LIMITATIONS OF LIABILITY) AND THAT THE LIABILITY LIMITATIONS 
+\hich\af1\dbch\af31505\loch\f1 I\hich\af1\dbch\af31505\loch\f1 N THIS SECTION 7 (LIMITATIONS OF LIABILITY) ARE AN ESSENTIAL ELEMENT OF THE AGREEMENT BETWEEN THE PARTIES.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 8.\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Term and Termination}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 8.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Term; Termination or Suspension}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Each license under this Agreement, with respect to each specific set of Licensed Materials covered by this Agreement, will become effective as of the latest to occur of: (a) this Agreement becoming effective, (b) payment by Licensee of the applicable f
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+es, excluding licenses (such as evaluation licenses) where no fees are required, (c) delivery of the specific Licensed Materials, and (d) in the case of Autodesk Materials provided in connection with a Relationship Program, upon commencement of the applic
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 ble Relationship Program period or fixed term. Each of Autodesk or Licensee may terminate this Agreement, Licensee\hich\f1 \rquote \loch\f1 s license as to Licensed Materials, Licensee
+\hich\f1 \rquote \loch\f1 s Relationship Program, and/or the provision of Services relating to the Licensed Materials if \hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+he other party is in breach of this Agreement and fails to cure such breach within ten (10) days after written notice of the breach; however, if Licensee is in breach of Section 1 (License) or Section 2 (License Limitations; Prohibitions), Autodesk may te
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 minate this Agreement, Licensee\hich\f1 \rquote \loch\f1 s license as to Licensed Materials, Licensee\hich\f1 \rquote \loch\f1 
+s Relationship Program, and/or the provision of Services relating to the Licensed Materials immediately upon written notice of the breach.  In addition, Autodesk may, as an alter\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 
+ative to termination, suspend Licensee\hich\f1 \rquote \loch\f1 s license as to the Licensed Materials, Licensee\hich\f1 \rquote \loch\f1 
+s Relationship Program, the provision of Services relating to the Licensed Materials, and/or other Autodesk obligations or Licensee rights under this Agreement (or und\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+r other terms, if any, relating to materials associated with the Licensed Materials), if Licensee fails to make a payment to Autodesk or a Reseller or otherwise fails to comply with the provisions of this Agreement or other terms relating to any such lice
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 
+se, Relationship Program, Services, or other associated materials.  Autodesk may also terminate this Agreement if Licensee becomes subject to bankruptcy proceedings, becomes insolvent, or makes an arrangement with Licensee\hich\f1 \rquote \loch\f1 
+s creditors.  This Agreement wil\hich\af1\dbch\af31505\loch\f1 l\hich\af1\dbch\af31505\loch\f1  terminate automatically without further notice or action by Autodesk if Licensee goes into liquidation.  
+\par \hich\af1\dbch\af31505\loch\f1 Licensee acknowledges and agrees that Autodesk may assign or sub-contract any of its rights or obligations under this Agreement.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 8.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Effect of Termin\hich\af1\dbch\af31505\loch\f1 ation of Agreement or License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Upon termination or expiration of this Agreement, the licenses granted hereunder will terminate.  Upon termination or expiration of any license granted to Licensee, Licensee must cease all use of Autodesk Materials to which 
+\hich\af1\dbch\af31505\loch\f1 such license applies, any Relationship Program (including, without limitation, associated services), and any Services and Uninstall all copies of the Autodesk Materials.  At Autodesk\hich\f1 \rquote \loch\f1 
+s request, Licensee agrees to destroy or return to Autodesk or the Resel\hich\af1\dbch\af31505\loch\f1 l\hich\af1\dbch\af31505\loch\f1 
+er from which they were acquired all Autodesk Materials.  Autodesk reserves the right to require Licensee to show satisfactory proof that all copies of the Autodesk Materials have been Uninstalled and, if so requested by Autodesk, destroyed or returned to
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 Autodesk or the Reseller from which they were acquired.  If Licensee\hich\f1 \rquote \loch\f1 s Relationship Program is terminated or expires, but this Agreement and Licensee\hich\f1 \rquote 
+\loch\f1 s license to the Licensed Materials remains in effect, any rights of Licensee based on the Relationship P\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+ogram (including, without limitation, rights with respect to Previous Versions) will terminate, and (unless otherwise authorized by the Relationship Program Terms) Licensee must comply with the obligations of Section 1.2.1 (Effect of Upgrades) with respec
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1  to (including the obligations to cease use of, Uninstall and destroy or return) all copies of such Previous Versions.
+\par \hich\af1\dbch\af31505\loch\f1 8.3\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Survival}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Sections 1.3 (Additional Terms), 1.4 (Other Materials), 1.5 (Authorized Users), 1.6 (Third-Party Licensed Materials), 1.11\hich\af1\dbch\af31505\loch\f1 
+ (APIs), 2.1.1 (No License Granted;Unauthorized Activities), 2.1.4 (Effect of Unauthorized Use), 2.2 (Circumvention), 3 (All Rights Reserved), 4 (Privacy; Use of Information; Connectivity), 5.2 (Disclaimer), 6 (Warnings), 7 (Limitations of Liability), 8 (
+\hich\af1\dbch\af31505\loch\f1 T\hich\af1\dbch\af31505\loch\f1 erm and Termination), and 9 (General Provisions) and Exhibit A will survive any termination or expiration of this Agreement.}{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\insrsid4142109 
+
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\keepn\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 9.\tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 General Provisions}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 9.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Notices}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  Notices in connection with this Agreement by either party will be in writing and will be sent b
+\hich\af1\dbch\af31505\loch\f1 
+y electronic mail, postal service, or a delivery service (such as UPS, FedEx or DHL), except that Licensee may not provide notice to Autodesk of an Autodesk breach or provide notice of termination of this Agreement by electronic mail.  Notices from Autode
+\hich\af1\dbch\af31505\loch\f1 s\hich\af1\dbch\af31505\loch\f1 
+k to Licensee will be effective (a) in the case of notices by email, one (1) day after sending to the email address provided to Autodesk, or (b) in the case of notices by mail or delivery service, five (5) days after sending by regular post or delivery se
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 vice to the address provided to Autodesk.  Licensee hereby consents to service of process being effected on Licensee by registered mail sent to the address set forth on Licensee\hich\f1 
+\rquote \loch\f1 s Customer Information Form (or, if no Customer Information Form has been pro\hich\af1\dbch\af31505\loch\f1 v\hich\af1\dbch\af31505\loch\f1 ided, Licensee\hich\f1 \rquote \loch\f1 
+s last address known by Autodesk) if so permitted by applicable law.  Notices from Licensee to Autodesk will be effective (a) in the case of notices by email, one (1) day after sending to (and receipt by Autodesk at) CopyrightAgent@autodesk.
+\hich\af1\dbch\af31505\loch\f1 
+com, or (b) in the case of notices by mail or delivery service, when received by Autodesk at Autodesk, Inc., 111 McInnis Parkway, San Rafael, California 94903, USA, Attention: Copyright Agent.  If Licensee participates in a Relationship Program, either pa
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 ty may also provide notice as set forth in the Relationship Program Terms.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 9.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Governing Law and Jurisdiction}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  This Agreement will be governed by and construed in accordance with the laws of (a) Switzerland if Licensee acquired the Autodesk Materials in a\hich\af1\dbch\af31505\loch\f1 
+ country in Europe, Africa or the Middle East, (b) Singapore if Licensee acquired the Autodesk Materials in a country in Asia, Oceania or the Asia-Pacific region, or (c) the State of California (and, to the extent controlling, the federal laws of the Unit
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+d States) if Licensee acquired the Autodesk Materials in a country in the Americas (including the Caribbean) or any other country not specified in this Section 9.2 (Governing Law and Jurisdiction).  The laws of such jurisdictions shall govern without refe
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+ence to the conflicts-of-laws rules thereof.  The UN Convention on Contracts for the International Sale of Goods and the Uniform Computer Information Transaction Act shall not apply to (and are excluded from the laws governing) this Agreement.  In additio
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 
+, each party agrees that any claim, action or dispute arising under or relating to this Agreement will be brought exclusively in (and the parties will be subject to the exclusive jurisdiction of) the Superior Court of the State of California, County of Ma
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+in, or the United States District Court for the Northern District of California in San Francisco, except that if Licensee has acquired the Autodesk Materials in (a) a country in Europe, Africa or the Middle East, any such claim or dispute will be brought 
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+xclusively in (and the parties will be subject to the exclusive jurisdiction of) the courts of Switzerland, or (b) a country in Asia, Oceania or the Asia-Pacific region, any such claim or dispute will be brought exclusively in (and the parties will be sub
+\hich\af1\dbch\af31505\loch\f1 j\hich\af1\dbch\af31505\loch\f1 
+ect to the exclusive jurisdiction of) the courts of Singapore.  Nothing in the foregoing will prevent Autodesk from bringing an action for infringement of intellectual property rights in any country where such infringement is alleged to occur.
+\par \hich\af1\dbch\af31505\loch\f1 9.3\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 No Assig\hich\af1\dbch\af31505\loch\f1 nment; Insolvency}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 
+.  Licensee may not assign this Agreement or any rights hereunder (whether by purchase of stock or assets, merger, change of control, operation of law, or otherwise) without Autodesk's prior written consent, which may be withheld in Autode
+\hich\af1\dbch\af31505\loch\f1 
+sk's sole and absolute discretion, and any unauthorized purported assignment by Licensee will be void.  In the context of any bankruptcy or similar proceeding, Licensee acknowledges and agrees this Agreement is and shall be treated as an executory contrac
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+ that may not be assumed and/or assigned without Autodesk's prior written consent, which consent may be withheld in Autodesk's sole and absolute discretion whether pursuant to Section 365(c)(1) of Title 11 of the United States Code or any other applicable
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+law respecting the treatment of executory contracts within bankruptcy. Any assignment (regardless of how or on what basis the assignment may occur) will be conditioned on compliance with the following: at least thirty (30) days before assigning or agreein
+\hich\af1\dbch\af31505\loch\f1 g\hich\af1\dbch\af31505\loch\f1 
+ to any assignment of rights under this Agreement (including transferring any copies of or right to use the Software), (a) Licensee must provide written notice to Autodesk, Uninstall all copies of the Software, and (without limitation of the generality of
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+Section 9.7 (Audits)) allow Autodesk or its designee to inspect the records, systems and facilities of (or operated for) Licensee and its subsidiaries and affiliates to verify (by any means available to Autodesk, whether remotely or on premises) that all 
+\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 
+opies of the Software have been Uninstalled, (b) the proposed assignee must agree to comply (and Licensee must ensure that the assignee will comply) with all of the obligations of this Agreement with respect to such Software, which agreement must provide 
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 hat Autodesk is a third-party beneficiary of the assignee\hich\f1 \rquote \loch\f1 
+s agreement, and the assignee must provide a copy of the agreement to Autodesk, and (c) Licensee and proposed assignee must comply with all other transfer procedures identified by Autodesk.
+\par \hich\af1\dbch\af31505\loch\f1 9.4\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Auto\hich\af1\dbch\af31505\loch\f1 desk Subsidiaries and Affiliates}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Licensee acknowledges and agrees that Autodesk may arrange to have its subsidiaries and affiliates engage in activities in connection with this Agreement, including, without limitation, delivering Autodesk Materials and p\hich\af1\dbch\af31505\loch\f1 
+roviding Relationship Programs and Services, provided that Autodesk (and not such subsidiaries and affiliates) will remain subject to the obligations of Autodesk under this Agreement.  Licensee also agrees that Autodesk\hich\f1 \rquote \loch\f1 
+s subsidiaries and affiliates may e\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 force (including taking actions for breach of) this Agreement.
+\par \hich\af1\dbch\af31505\loch\f1 9.5\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Exceptions to Prohibitions; Severability}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 .  
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 9.5.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Exceptions to Prohibitions}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+. The prohibitions contained in this Agreement will not apply where and to the extent applicable law does not all\hich\af1\dbch\af31505\loch\f1 
+ow such prohibitions to be enforced.  Licensee may have other rights under the laws of the state or country within the Territory where the Licensed Materials are acquired, and this Agreement does not change Licensee\hich\f1 \rquote \loch\f1 
+s rights under the laws of such state o\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+ country if and to the extent the laws of such state or country do not permit this Agreement to do so.  Licensee will bear the burden of proof to demonstrate that applicable law does not allow (i) the enforcement of such prohibitions; or (ii) this Agreeme
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 t to change particular rights in a state or country (and that Licensee has not exceeded the bounds of the unenforceable prohibitions and unchangeable rights).
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 9.5.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Severability}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 . If and to the extent any provision of this Agreement is held illegal, invalid
+\hich\af1\dbch\af31505\loch\f1 
+, or unenforceable in whole or in part under applicable law, such provision or such portion thereof will be ineffective as to the jurisdiction in which it is illegal, invalid, or unenforceable to the extent of its illegality, invalidity, or unenforceabili
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+y and will be deemed modified to the extent necessary to conform to applicable law so as to give the maximum effect to the intent of the parties.  The illegality, invalidity, or unenforceability of such provision in that jurisdiction will not in any way a
+\hich\af1\dbch\af31505\loch\f1 f\hich\af1\dbch\af31505\loch\f1 fect the legality, validity, or enforceability of such provision or any other provision of this Agreement in any other jurisdiction.
+\par \hich\af1\dbch\af31505\loch\f1 9.6\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 No Waiver}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  No term or provision of this Agreement will be considered waived, and no breach excused, unless such waiver\hich\af1\dbch\af31505\loch\f1 
+ is in writing signed on behalf of the party against which the waiver is asserted.  No waiver (whether express or implied) will constitute consent to, waiver of, or excuse of any other, different, or subsequent breach.
+\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 9.7\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Audits}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  Licensee agrees that Aut\hich\af1\dbch\af31505\loch\f1 
+odesk has the right to require an audit (electronic or otherwise) of the Autodesk Materials and the Installation thereof and Access thereto.  As part of any such audit, Autodesk or its authorized representative will have the right, on fifteen (15) days
+\hich\f1 \rquote \loch\f1  p\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 ior notice to Licensee, to inspect Licensee\hich\f1 \rquote \loch\f1 
+s records, systems and facilities, including machine IDs, serial numbers and related information, to verify that the use of any and all Autodesk Materials is in conformance with this Agreement.  Licensee will pr\hich\af1\dbch\af31505\loch\f1 o
+\hich\af1\dbch\af31505\loch\f1 vide full cooperation to enable any such audit.  If Autodesk determines that Licensee\hich\f1 \rquote \loch\f1 
+s use is not in conformity with the Agreement, Licensee will obtain immediately and pay for valid license(s) to bring Licensee\hich\f1 \rquote \loch\f1 s use into compliance with this Agreement \hich\af1\dbch\af31505\loch\f1 a
+\hich\af1\dbch\af31505\loch\f1 
+nd other applicable terms and pay the reasonable costs of the audit.  In addition to such payment rights, Autodesk reserves the right to seek any other remedies available at law or in equity, whether under this Agreement or otherwise.
+\par \hich\af1\dbch\af31505\loch\f1 9.8\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Language}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  The En
+\hich\af1\dbch\af31505\loch\f1 
+glish language version of this Agreement is legally binding in case of any inconsistencies between the English version and any translations.  If Licensee purchased the license for the Licensed Materials in Canada, Licensee agrees to the following: The par
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 ies hereto confirm that it is their wish that this Agreement, as well as other documents relating hereto, including notices, have been and shall be written in the English language only. }{
+\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\lang3084\langfe1041\langnp3084\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 \hich\f1 Les parties ci-dessus confirment leur d\'e9\loch\f1 sir que cet accord ainsi que t\hich\af1\dbch\af31505\loch\f1 \hich\f1 
+ous les documents, y compris tous avis qui s'y rattachent, soient r\'e9\loch\f1 \hich\f1 dig\'e9\loch\f1 s en langue anglaise.
+\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 9.9\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Construction}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  Ambiguities in this Agreement will not be construed against the drafter.
+\par \hich\af1\dbch\af31505\loch\f1 9.10\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Force Majeure}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Autodesk will not be liable for any loss, damage \hich\af1\dbch\af31505\loch\f1 or penalty resulting from delays or failures in performance resulting from acts of God, supplier delay or other causes beyond Autodesk's reasonable control.
+\par \hich\af1\dbch\af31505\loch\f1 9.11\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 U.S. Government Rights}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  For U.S. Government procurements, all Autodesk Materials are deemed t\hich\af1\dbch\af31505\loch\f1 \hich\f1 
+o be commercial computer software as defined in FAR 12.212 and subject to restricted rights as defined in FAR Section 52.227-19 "Commercial Computer Software - Restricted Rights" and DFARS 227.7202, \'93\loch\f1 
+Rights in Commercial Computer Software or Commercial Co\hich\af1\dbch\af31505\loch\f1 m\hich\af1\dbch\af31505\loch\f1 \hich\f1 puter Software Documentation\'94\loch\f1 
+, as applicable, and any successor regulations. Any use, modification, reproduction release, performance, display or disclosure of the Autodesk Materials by the U.S. Government shall be solely in accordance with license rights
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 and restrictions described herein.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 9.12\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Export Control}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  Licensee acknowledges and agrees that the Autodesk Materials and Services (including any data submitted by Licensee in connection with a Service and any Licensee-specific output generated by a Servic\hich\af1\dbch\af31505\loch\f1 
+e) are subject to compliance with United States and other applicable country export control and trade sanctions laws, rules and regulations, including, without limitation the regulations promulgated by the U.S. Department of Commerce and the U.S. Departme
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 t of the Treasury (collectively, "Export Control Laws").  Licensee represents, warrants and covenants that neither Licensee nor Licensee\hich\f1 \rquote \loch\f1 
+s Personnel (i) are a citizen or resident of, or located within, a nation that is subject to U.S. trade sanctions or o\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+her significant trade restrictions (including, without limitation, Cuba, Iran, Sudan, Syria and North Korea), (ii) are identified on any of the U.S. government restricted party lists (including, without limitation, the U.S. Treasury Department's List of S
+\hich\af1\dbch\af31505\loch\f1 p\hich\af1\dbch\af31505\loch\f1 ecially Designated Nationals and Blocked Persons, the U.S. Department of Commerce\hich\f1 \rquote \loch\f1 s Denied Party List, Entity List and Unverified List and the U.S. Department of State
+\hich\f1 \rquote \loch\f1 s proliferation-related lists), (iii) will, unless otherwise authorized under the Expor\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+ Control Laws, use Autodesk Materials or Services in any restricted end use, including, without limitation, design, analysis, simulation, estimation, testing, or other activities related to nuclear, chemical/biological weapons, rocket systems or unmanned 
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 
+ir vehicles applications, or (iv) will use the Autodesk Materials or Services to disclose, transfer, download, export, or re-export, directly or indirectly, any Licensee-specific output generated by the Autodesk Materials or Services, Licensee content, th
+\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 
+rd party content, or any other content or material to any country, entity, or party that is ineligible to receive such items under the Export Control Laws or other laws or regulations to which Licensee may be subject.  Licensee understands that the requir
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+ments and restrictions of the Export Control Laws as applicable to Licensee may vary depending on the Autodesk Materials or Services provided under this Agreement and may change over time.  Licensee shall be solely responsible for (i) determining the prec
+\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 se controls applicable to the Autodesk Materials or Services, and (ii) complying with the Export Control Laws and monitoring any modifications to them.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 9.13\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Entire Agreement}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  This Agreement and any other terms referenced in this Agreement (such as the Rel
+\hich\af1\dbch\af31505\loch\f1 
+ationship Program Terms and the Services Terms) constitute the entire agreement between the parties (and merge and supersede any prior or contemporaneous agreements, discussions, communications, agreements, representations, warranties, advertising or unde
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+standings) with respect to the subject matter hereof, except that particular Autodesk Materials may be subject to additional or different terms associated with such Autodesk Materials.  The parties acknowledge that, in entering into this Agreement, they a
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+e not relying on any agreements, discussions, communications, agreements, representations, warranties, advertising or understandings other than as expressly set forth in this Agreement.  Licensee acknowledges and agrees that Autodesk may add to or change 
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+he Relationship Program Terms and the Services Terms from time to time, provided that Autodesk will provide written notice of the additions or changes (and may allow Licensee not to renew, may permit Licensee to terminate, and may offer other options with
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+respect to Relationship Programs or Services) before the additions or changes are effective as to Licensee.  In the event of a conflict between this Agreement and any other terms of Autodesk (including, without limitation, the Relationship Program Terms, 
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+he Services Terms, or such additional or different terms), the other terms will apply.  Terms stipulated by Licensee in any communication by Licensee which purport to vary this Agreement or such other terms will be void and of no effect unless agreed in a
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+writing signed by an authorized representative of Autodesk.  Any other modifications to this Agreement will also be invalid unless agreed to in a writing signed by an authorized representative of Autodesk.
+\par }\pard \ltrpar\ql \fi-360\li360\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\tx1080\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 10.\tab \tab }{\rtlch\fcs1 \ab\af1\afs18 
+\ltrch\fcs0 \b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Additional Terms.}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+This Section 10 (Additional Terms) applies to the following Software that may be included within the Licensed Materials: (i) Autodesk Maya; (ii) Autodesk Softimage; (iii) Autodesk 3ds Max; and (iv) Autodesk 3ds Max Design.
+\par \hich\af1\dbch\af31505\loch\f1 10.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Rendering}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 .
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 10.1.1\tab With regar\hich\af1\dbch\af31505\loch\f1 
+d to the Rendering Software (defined below), in addition to any other license granted in this Agreement, Licensee may allow the Rendering Software to be Installed or Accessed on a Networked Basis, solely for Licensee\hich\f1 \rquote \loch\f1 
+s Internal Business Needs, specificall\hich\af1\dbch\af31505\loch\f1 y\hich\af1\dbch\af31505\loch\f1 
+ to render files created with the Software.  However, if the Rendering Software is mental ray, and the Software is provided with a finite number of mental ray rendering nodes, then with regard to mental ray the foregoing is restricted to that number of me
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 tal ray rendering nodes.
+\par \hich\af1\dbch\af31505\loch\f1 10.1.2\tab 
+With regard to the mental ray Batch Software (defined below), in addition to any other license granted in this Agreement, Licensee may allow the mental ray Batch Software to be Installed or Accessed on a Networked Basis, sol\hich\af1\dbch\af31505\loch\f1 
+ely for Licensee\hich\f1 \rquote \loch\f1 
+s Internal Business Needs, and used (i) specifically to render files created with the Software; or (ii) by the Rendering Software specifically to render files created with the Software. The total number of CPUs used by the mental ray Batc
+\hich\af1\dbch\af31505\loch\f1 h\hich\af1\dbch\af31505\loch\f1  Software cannot exceed the number specified in the License Identification.
+\par \hich\af1\dbch\af31505\loch\f1 10.1.3\tab With regard to the mental ray Standalone (defined below), Licensee may allow the mental ray Standalone to be Installed or Accessed, on a Networked Basis, solely on Computing\hich\af1\dbch\af31505\loch\f1 
+ Device(s) (defined below) solely for Licensee\hich\f1 \rquote \loch\f1 \hich\f1 
+s Internal Business Needs specifically to render files created with the Software.  With regard to mental ray Standalone, any reference in the Agreement to Computer is hereby deleted and \'93\loch\f1 \hich\f1 Computing Device(s)\'94\loch\f1  
+\hich\af1\dbch\af31505\loch\f1 s\hich\af1\dbch\af31505\loch\f1 ubstituted therefor.
+\par \hich\af1\dbch\af31505\loch\f1 10.1.4\tab 
+With regard to the mental ray Satellite (defined below) for each of Autodesk 3ds Max, Autodesk Maya and Autodesk Softimage Software each mental ray Satellite executable(s) may run on one (1) or more host no more than four (4) cl
+\hich\af1\dbch\af31505\loch\f1 \hich\f1 ient Computing Devices. With regard to mental ray Satellite, any reference in the Agreement to Computer is hereby deleted and \'93\loch\f1 \hich\f1 Computing Device(s)\'94\loch\f1  substituted therefor.
+\par \hich\af1\dbch\af31505\loch\f1 10.1.5\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Definitions}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 .
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 (1)\tab \hich\f1 \'93\loch\f1 \hich\f1 mental ray Standalone\'94
+\loch\f1  means the mental ray Standalone client\hich\af1\dbch\af31505\loch\f1 /server executable, including the mental ray standard shader libraries and utility programs, used specifically for rendering files created with the Software.
+\par \hich\af1\dbch\af31505\loch\f1 (2)\tab \hich\f1 \'93\loch\f1 \hich\f1 Rendering Software\'94\loch\f1  means a subset of the Software used specifically for rendering files crea\hich\af1\dbch\af31505\loch\f1 ted with the Software.
+\par \hich\af1\dbch\af31505\loch\f1 (3)\tab \hich\f1 \'93\loch\f1 \hich\f1 mental ray Batch Software\'94\loch\f1 
+ means a subset of the Software used: (i) specifically for rendering files created with the Software or (ii) by the Rendering Software specifically for rendering files created with the Software.
+\par \hich\af1\dbch\af31505\loch\f1 (4)\tab \hich\f1 \'93\loch\f1 me\hich\af1\dbch\af31505\loch\f1 \hich\f1 ntal ray Satellite\'94\loch\f1 
+ means the mental ray Satellite server executable, including the mental ray standard shader libraries.  mental ray Satellite is functionally equivalent to the mental ray Standalone server executable, used specifically for rendering file
+\hich\af1\dbch\af31505\loch\f1 s\hich\af1\dbch\af31505\loch\f1  created with the Software except it is not able to read and write files in the complete mi2 format.
+\par \hich\af1\dbch\af31505\loch\f1 (5)\tab \hich\f1 \'93\loch\f1 \hich\f1 Computing Device\'94\loch\f1  means (i) a single electronic assembly with a maximum of: (a) four (4) CPUs (regardless of the number of cores in each CPU) each CPU
+\hich\af1\dbch\af31505\loch\f1 
+ having one or more microprocessors, (b) four (4) discrete GPU-based computing boards; or (ii) a software implementation of the single electronic assembly, (a so-called 'virtual machine') described in (i) above, which single electronic assembly  accepts i
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 formation in digital or similar form and manipulates the information for a specific result based on a sequence of instructions.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 10.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Exceptions}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  
+\par \hich\af1\dbch\af31505\loch\f1 10.2.1\tab This Section 10.2 (Exceptions) applies to the Autodesk Media & Entertainment 3D entertainment Software\hich\af1\dbch\af31505\loch\f1 
+ that may be included within the Licensed Materials. Notwithstanding the provisions set forth in Section 2.1.1 (No License Granted; Unauthorized Activities) if: (i) the Redistributable Component (defined below) operates with the Software and with Licensee
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+Application; and (ii) the Redistributable Component is linked to Licensee Application; then Licensee may reproduce and distribute the Redistributable Component and Licensee Application together, subject to Licensee\hich\f1 \rquote \loch\f1 
+s strict adherence to all of the followi\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 g terms and conditions:
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\tx1080\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 (a)\tab 
+the class identifications for any classes of objects Licensee created shall be different from and clearly distinguishable from the class identifications used by Autodesk;
+\par \hich\af1\dbch\af31505\loch\f1 (b)\tab modified Sample (defined below) code and any resultin\hich\af1\dbch\af31505\loch\f1 g binary files in Licensee Application are identified as developed by Licensee, and not by Autodesk;
+\par \hich\af1\dbch\af31505\loch\f1 (c)\tab Licensee Application has Licensee\hich\f1 \rquote \loch\f1 s copyright notice;
+\par \hich\af1\dbch\af31505\loch\f1 (d)\tab any Modification (defined below), and resulting binary files, shall include the copyright not\hich\af1\dbch\af31505\loch\f1 
+ices of Autodesk, Inc. as well as the following statement: "This software contains copyrighted code owned by Autodesk, Inc. but has been modified and is not endorsed by Autodesk, Inc."  The language of the copyright notice and the statement shall be in th
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1  same language as the Software language;
+\par \hich\af1\dbch\af31505\loch\f1 (e)\tab distribution is strictly for not-for-profit purposes;
+\par \hich\af1\dbch\af31505\loch\f1 (f)\tab distribution is either in binary form or text form; 
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx1080\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 (g)\tab \hich\af1\dbch\af31505\loch\f1 
+distribution is subject to a standard form of click-through end-user license agreement which license agreement, among other things:  (1) protects Autodesk's interests consistent with the terms of this Agreement; and (2) prohibits the redistribution of the
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 Redistributable Component;
+\par \hich\af1\dbch\af31505\loch\f1 (h)\tab 
+if the Redistributable Component operates with the Autodesk 3ds Max Software and/or Autodesk 3ds Max Design Software and with Licensee Application then prior to reproduction and distribution of the Redistributable Component a
+\hich\af1\dbch\af31505\loch\f1 nd Licensee Application all MIDI files have been excluded from the Redistributable Component and Licensee Application; and 
+\par \hich\af1\dbch\af31505\loch\f1 (i)\tab Licensee agrees to defend, indemnify and hold harmless Autodesk and its subsidiaries and affiliates from and against any and all\hich\af1\dbch\af31505\loch\f1 
+ damages, costs, losses, liabilities, expenses and settlement amounts incurred in connection with any suit, claim or action by any third party alleging that the Redistributable Component and/or Licensee Application infringes or misappropriates any patent,
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+copyrights, moral rights, trademark, trade secret and design rights, whether registered or unregistered, and including any application for registration of any of the foregoing and all rights or forms of protections of a similar nature having equivalent or
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 similar effect to any of these, which may subsist anywhere in the world, of such third party.
+\par }\pard \ltrpar\ql \fi-360\li360\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 10.2.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Definitions}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 .
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 (1)\tab \hich\af1\dbch\af31505\loch\f1 
+"Licensee Application" means, with regard to the Software, a Modification made by Licensee for designing, developing, and testing an application program made by Licensee.
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 (2)\tab 
+"Modification" means any: (i) addition to the substance of a Sample or any additi\hich\af1\dbch\af31505\loch\f1 
+on to the substance of the contents of a file containing a Sample; (ii) any deletion from the structure of a Sample, or any deletion from the structure of the contents of a file containing a Sample; and/or (iii) any new file that contains any part of a Sa
+\hich\af1\dbch\af31505\loch\f1 m\hich\af1\dbch\af31505\loch\f1 ple; all of which, in Autodesk\hich\f1 \rquote \loch\f1 s sole discretion, ensures that the Sample is not the primary source of value.
+\par \hich\af1\dbch\af31505\loch\f1 (3)\tab "Redistributable Component" means the Sample(s) and/or a Modification.
+\par \hich\af1\dbch\af31505\loch\f1 (4)\tab "Sample(s)" means sample source code, or individual animations, sti\hich\af1\dbch\af31505\loch\f1 
+ll images, and/or audio files contained in the Software, and located in the samples directory, the examples subdirectory, samples files or any similar type directory or file.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 10.3\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Additional Terms; Certain Softimage Materials}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  This Section 10.3 (Additiona
+\hich\af1\dbch\af31505\loch\f1 l Terms; Certain Softimage Materials) applies to the following Software that may be included within the Licensed Materials: (i) Autodesk Softimage Mod Tool software; and (ii) Autodesk Softimage Mod Tool Pro software.
+\par \hich\af1\dbch\af31505\loch\f1 10.3.1\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Autodesk Softimage Mod Tool Soft\hich\af1\dbch\af31505\loch\f1 ware}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 .  In the event the Software is Autodesk Softimage Mod Tool Software then the applicable Exhibit B License Type is B. 4. (}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 Educational Stand-alone (Individual) License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 ).
+\par \hich\af1\dbch\af31505\loch\f1 10.3.2\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Autodesk Softimage Mod Tool Pro Software}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 .  In the event the Software is Auto\hich\af1\dbch\af31505\loch\f1 desk Softimage Mod Tool Pro Software, then the applicable Exhibit B License Type is B. 1. (Stand-alone (Individual) License), however, Licensee\hich\f1 
+\rquote \loch\f1 s Internal Business Needs are limited to the design, development and testing of an application program designed\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 to function with the Software for Licensee\hich\f1 \rquote 
+\loch\f1 s internal use in producing multimedia content in conjunction with Licensee\hich\f1 \rquote \loch\f1 s valid XNA}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\super\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'ae}{\rtlch\fcs1 \af1\afs18 
+\ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1  Creators Club Online Premium Membership.
+\par }\pard \ltrpar\ql \fi-360\li360\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 11.\tab \tab }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Additional Terms: Quantity Take Off}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 . 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 \hich\f1 
+This Section 11 (Additional Terms; Quantity Take Off) applies to the Quantity Take Off Software that may be included within the Licensed Materials (\'93\loch\f1 \hich\f1 QTO Software\'94\loch\f1 ):
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 11.1\tab 
+The QTO Software is based in part on the work of the Independent JPEG Group.
+\par \hich\af1\dbch\af31505\loch\f1 11.2\tab Port\hich\af1\dbch\af31505\loch\f1 \hich\f1 ions of the QTO Software include Crystal Reports Runtime Software (\'93\loch\f1 \hich\f1 Runtime Software\'94\loch\f1 \hich\f1 
+) licensed from Business Objects Software Ltd (\'93\loch\f1 \hich\f1 Business Objects\'94\loch\f1 ). Licensee\hich\f1 \rquote \loch\f1 s use of the Runtime Software is subject to the following terms:
+\par }\pard \ltrpar\ql \fi720\li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx1080\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 (a)\tab Licensee agrees not to al
+\hich\af1\dbch\af31505\loch\f1 ter disassemble, decompile, translate, adapt or reverse-engineer the Runtime Software or the report file (.RPT) format; 
+\par \hich\af1\dbch\af31505\loch\f1 (b)\tab Licensee agrees not to distribute the Runtime Software with any general-purpose report writing, data analysis or report delivery pr\hich\af1\dbch\af31505\loch\f1 
+oduct or any other product that performs the same or similar functions as Business Objects\hich\f1 \rquote \loch\f1  product offerings; 
+\par \hich\af1\dbch\af31505\loch\f1 (c)\tab Licensee agrees not to use the Runtime Software to create for distribution a product that is generally competitive with Business Objects' pr\hich\af1\dbch\af31505\loch\f1 oduct offerings; 
+\par \hich\af1\dbch\af31505\loch\f1 (d)\tab 
+Licensee agrees not to use the Runtime Software to create for distribution a product that converts the report file (.RPT) format to an alternative report file format used by any general-purpose report writing, data analysis or report 
+\hich\af1\dbch\af31505\loch\f1 delivery product that is not the property of Business Objects; and
+\par \hich\af1\dbch\af31505\loch\f1 (e)\tab Licensee agrees not to use the Crystal Reports Software on a rental or timesharing basis or to operate a service bureau facility for the benefit of third-parties. 
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 11.3\tab BUSINESS OBJECTS\hich\af1\dbch\af31505\loch\f1 
+ AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. BUSINESS OBJECTS AND ITS SUPPLIERS SHALL HAVE NO L
+\hich\af1\dbch\af31505\loch\f1 I\hich\af1\dbch\af31505\loch\f1 ABILITY WHATSOEVER UNDER THIS AGREEMENT OR IN CONNECTION WITH THE CRYSTAL REPORTS SOFTWARE.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx360\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 12.\tab 
+Autodesk download technology may use the Akamai NetSession Interface, which may utilize a limited amount of your upload bandwidth and PC resources to connect yo\hich\af1\dbch\af31505\loch\f1 
+u to a peered network and improve speed and reliability of Web content. The Akamai NetSession Interface is secure client-side networking technology that harnesses the power of your computer to deliver software and media available on the Akamai network. Yo
+\hich\af1\dbch\af31505\loch\f1 u\hich\af1\dbch\af31505\loch\f1 
+r Akamai NetSession Interface works collectively with other Akamai NetSession Interfaces, along with thousands of Akamai edge servers, and runs as a networking service utilizing a limited amount of your computer's available resources. More information abo
+\hich\af1\dbch\af31505\loch\f1 u\hich\af1\dbch\af31505\loch\f1 t the Akamai NetSession Interface is available here: }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+HYPERLINK "http://www.akamai.com/client"}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid5905377 {\*\datafield 
+00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5200000068007400740070003a002f002f007700770077002e0061006b0061006d00610069002e0063006f006d002f0063006c00690065006e0074000000795881f43b1d7f48af2c825dc485276300000000a5ab0000}
+}}{\fldrslt {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\cf2\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 http://www.akamai.com/client}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 . By clicking "Accept" and using the Autodesk download technology, you accept the Akamai License Agreement }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf17\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 (}
+{\field{\*\fldinst {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 HYPERLINK "http://www.ak\hich\af1\dbch\af31505\loch\f1 amai.com/eula"}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid5905377 {\*\datafield 
+00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b4e00000068007400740070003a002f002f007700770077002e0061006b0061006d00610069002e0063006f006d002f00650075006c0061000000795881f43b1d7f48af2c825dc485276300000000a5ab0000}}
+}{\fldrslt {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\cf2\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 http://www.akamai.com/eula}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\cf17\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 )}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1  in addition to the Autodesk License and Service Agreement.}{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 
+\b\f1\fs18\kerning28\insrsid4142109 
+\par }\pard \ltrpar\qc \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\kerning28\insrsid4142109 
+\par \hich\af1\dbch\af31505\loch\f1 Exhibit A
+\par }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\ul\kerning28\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Definitions
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Access}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94\loch\f1 \hich\f1  or \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 Accessible}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means, with respect to a computer program or other materials, (a) to use or execute the computer prog
+\hich\af1\dbch\af31505\loch\f1 ram or other materials or (b) to use or otherwise benefit from the features or functionality of the computer program or other materials.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Agreement}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94\loch\f1 
+ means this License and Services Agreement, including all exhibits and schedules thereto, as the License \hich\af1\dbch\af31505\loch\f1 and Services Agreement may be amended from time to time in accordance with the terms thereof.
+\par \hich\af1\dbch\af31505\loch\f1 3.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Authorized User}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 
+\'94\loch\f1  means any individual person who Installs or Accesses, or is authorized to Install or Access, any of the Licensed Materials.
+\par \hich\af1\dbch\af31505\loch\f1 4.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Autodesk}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  mea\hich\af1\dbch\af31505\loch\f1 \hich\f1 ns Autodesk, Inc., a Delaware corporation, except that if, Licensee acquires a license to the Autodesk Materials in (a) a country in Europe, Africa or the Middle East, \'93\loch\f1 \hich\f1 Autodesk\'94
+\loch\f1 \hich\f1  means Autodesk Development S\'e0\loch\f1 rl or (b) a country in Asia, Oceania or the Asi\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 \hich\f1 -Pacific region, \'93\loch\f1 \hich\f1 Autodesk\'94\loch\f1 
+ means Autodesk Asia Pte Ltd.
+\par \hich\af1\dbch\af31505\loch\f1 5.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Autodesk License Manager}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means the tool known as Autodesk License Manager or any future Autodesk tool for managing, monitoring or controlling Installation of or Access to Autodesk Materials.
+\par \hich\af1\dbch\af31505\loch\f1 6.\tab \loch\af1\dbch\af31505\hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Autodesk Materials}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1 
+ means any materials distributed or made available by Autodesk, directly or indirectly, including Software, Supplemental Materials, User Documentation and Excluded Materials (whether or not licensed to Licensee).
+\par \hich\af1\dbch\af31505\loch\f1 7.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Computer}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means (i)\hich\af1\dbch\af31505\loch\f1 
+ a single electronic device, with one or more central processing units (CPUs), that accepts information in digital or similar form and manipulates the information for a specific result based on a sequence of instructions, or (ii) a software implementation
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 of such a device (or so-called virtual machine).
+\par \hich\af1\dbch\af31505\loch\f1 8.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Customer Information Form}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means a form completed by or on behalf of Licensee and submitted to Autodesk or a Reseller, directly or indirectly, in connection with Licensee\hich\f1 \rquote \loch\f1 s order for a license of Autodes
+\hich\af1\dbch\af31505\loch\f1 k Materials, Relationship Program or Services.
+\par \hich\af1\dbch\af31505\loch\f1 9.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Educational Licensee}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means a Licensee who is also (a) a Qualified Educational Institution, (b) Faculty, (c) Student or (d) Other Authorized Educational Licensee.  An Educational Licensee may be required t
+\hich\af1\dbch\af31505\loch\f1 o show proof of eligibility if requested by Autodesk.  Autodesk, in its sole discretion, retains the right to determine the eligibility of an Educational Licensee. 
+\par \hich\af1\dbch\af31505\loch\f1 10. \tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Educational Purposes}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means (i) in the case of a Qualified Educational Institution, F\hich\af1\dbch\af31505\loch\f1 
+aculty or Other Authorized Educational Licensees, purposes directly related to learning, teaching, training, research and development that are part of the instructional functions performed by a Qualified Educational Institution or Other Authorized Educati
+\hich\af1\dbch\af31505\loch\f1 o\hich\af1\dbch\af31505\loch\f1 \hich\f1 nal Licensee and (ii) in the case of Students, purposes related to learning, training, research or development.  \'93\loch\f1 \hich\f1 Educational Purposes\'94\loch\f1 
+ does not include commercial, professional or any other for-profit purposes.
+\par \hich\af1\dbch\af31505\loch\f1 11.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Evaluation Purposes}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means purposes of \hich\af1\dbch\af31505\loch\f1 
+evaluation and demonstration of the capabilities of the Software or Supplemental Materials but excludes competitive analysis and any commercial, professional, or other for-profit purposes.
+\par \hich\af1\dbch\af31505\loch\f1 12.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Excluded Materials}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\hich\af1\dbch\af31505\loch\f1 
+ means any materials, including Software, Supplemental Materials or User Documentation (and including, without limitation, any computer programs, modules or components of a computer program, functionality or features of a computer program, explanatory pri
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 
+ted or electronic materials, content or other materials, if any), that may be provided or become available to Licensee, by any means, or that are on any media delivered to Licensee, for which (a) Licensee does not have a License Identification, or (b) Lic
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+nsee has not paid (and continued to pay) the applicable fees.  Licensee acknowledges that Excluded Materials are included on media or via download for convenience of the licensing mechanism used by Autodesk, and inclusion does not in any way authorize, ex
+\hich\af1\dbch\af31505\loch\f1 p\hich\af1\dbch\af31505\loch\f1 ressly or impliedly, a right to use such Excluded Materials.
+\par \hich\af1\dbch\af31505\loch\f1 13.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Faculty}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means an individual person who is an employee or independent contractor working for a Qualified Educational Institution.
+\par \hich\af1\dbch\af31505\loch\f1 14.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Install}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1 \hich\f1  and \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Installation}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94\loch\f1 
+ means, with respect to a co\hich\af1\dbch\af31505\loch\f1 mputer program or other materials, to copy the program or other materials onto a hard disk or other storage medium.
+\par \hich\af1\dbch\af31505\loch\f1 15.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 License Identification}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means one or more designations by Autodesk that set forth the License Type (among other things) for Licensee\hich\f1 \rquote \loch\f1 s \hich\af1\dbch\af31505\loch\f1 \hich\f1 
+license of the Licensed Materials.  The License Identification may be (a) located (i) in the Licensed Materials (e.g., in an \'93\loch\f1 \hich\f1 About\'94\loch\f1 
+ box, license information dialog box, or text file of Software), (ii) on or with Autodesk packaging, or (iii) in a written \hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 
+onfirmation or other notice issued to Licensee by Autodesk and transmitted via email, facsimile, physical delivery, or otherwise, or (b) obtained from Autodesk on request.  For clarification, License Identification does not include a designation, confirma
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 ion, packaging or other document provided by a Reseller or other third party.
+\par \hich\af1\dbch\af31505\loch\f1 16.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 License Type}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means a type of license specified by Autodesk for Autodesk Materials, including the types set forth in Exhibit B.  License Type includes the terms specified by\hich\af1\dbch\af31505\loch\f1 
+ Autodesk for each type of license, including the applicable terms set forth in Exhibit B.  License Type is determined by Autodesk and may be specified in the applicable License Identification.
+\par \hich\af1\dbch\af31505\loch\f1 17.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Licensed Materials}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means Software, Supplemental Material\hich\af1\dbch\af31505\loch\f1 \hich\f1 s and User Documentation (a) downloaded by clicking on the \'93\loch\f1 \hich\f1 I accept\'94\loch\f1 
+ button or other button or mechanism associated with this Agreement or by otherwise indicating assent to this Agreement, (b) delivered prepackaged with this Agreement, or (c) otherwise a\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 
+companied by this Agreement, provided that (i) in the case of Software, the Software is identified in an applicable License Identification, and (ii) Licensee has paid (and continues to pay) the applicable fees.  Licensed Materials also includes Supplement
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 
+l Materials and User Documentation that Autodesk provides or makes available to Licensee for use with Software licensed under this Agreement if there are no separate terms for such materials specified by Autodesk.  Licensed Materials includes, without lim
+\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 tation, any error corrections, patches, service packs, updates and upgrades to, and new versions of, the Licensed Materials that Autodesk provides or makes available to Licensee under Licensee
+\hich\f1 \rquote \loch\f1 s then-current license.  Licensee acknowledges that availabili\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+y of Upgrades and new versions may be subject to additional fees and the Relationship Program Terms.  In addition, Licensed Materials includes, without limitation, any Previous Versions and other Autodesk Materials that Licensee receives or retains pursua
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 
+t to the Relationship Program Terms, but only for so long as and to the extent expressly authorized by the Relationship Program Terms.  Notwithstanding the foregoing (or any other provision of this Agreement), Licensed Materials in all cases excludes Excl
+\hich\af1\dbch\af31505\loch\f1 u\hich\af1\dbch\af31505\loch\f1 ded Materials.
+\par \hich\af1\dbch\af31505\loch\f1 18.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Licensee}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means (a) the company or other legal entity on behalf of which Autodesk Materials are acquired, if the Autodesk Materials are acquired on behalf of such an entity (e.g., by an employee, independent contractor, or other authori
+\hich\af1\dbch\af31505\loch\f1 \hich\f1 zed representative), or (b) if there is no such entity, the individual who accepts this Agreement (e.g., by selecting the \'93\loch\f1 \hich\f1 I accept\'94\loch\f1 
+ button or other button or mechanism associated with this Agreement or otherwise indicating assent to this Agreement, or by\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 \hich\f1 
+installing, downloading, accessing, or otherwise copying or using all or any portion of the Autodesk Materials).  For clarification, \'93\loch\f1 \hich\f1 Licensee\'94\loch\f1 
+ refers only to a single, specifically identified legal entity or individual, and does not include any subsidiar\hich\af1\dbch\af31505\loch\f1 y\hich\af1\dbch\af31505\loch\f1 
+ or affiliate of any such legal entity or individual or any other related person.
+\par \hich\af1\dbch\af31505\loch\f1 19.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Licensee\hich\f1 \rquote \loch\f1 s Internal Business Needs}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means, in reference to Licensed Materials, the use of such Licensed Materials (and the features and functionality thereof) by License\hich\af1\dbch\af31505\loch\f1 e\hich\f1 \rquote 
+\loch\f1 s own Personnel to meet the internal requirements of Licensee\hich\f1 \rquote \loch\f1 
+s business in the ordinary course of such business, provided that Internal Business Needs will in no event include providing or making available such Licensed Materials (or the features or fu\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1 
+ctionality thereof) to any third party.
+\par \hich\af1\dbch\af31505\loch\f1 20.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Networked Basis}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 
+\'94\loch\f1  means a computing environment that includes a Computer acting as a file server which allows the Licensed Materials Installed on such Computer to be uploaded and Installed to, and operated, viewe\hich\af1\dbch\af31505\loch\f1 
+d or otherwise Accessed from, other Computers through a local area network connection or through a VPN connection subject to compliance with the VPN Requirements.
+\par \hich\af1\dbch\af31505\loch\f1 21.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Open Source}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means any software code that: (a) contains, or is derived in any manner, (i\hich\af1\dbch\af31505\loch\f1 
+n whole or in part), from any software that is distributed as free software, open source software, shareware (e.g., Linux), or similar licensing or distribution models; and (b) is subject to any agreement with terms requiring that using, copying, modifyin
+\hich\af1\dbch\af31505\loch\f1 g\hich\af1\dbch\af31505\loch\f1 
+ or redistributing the software requires that such software and/or the derivative works of such software be: (i) disclosed and/or distributed in source code form; (ii) be licensed for the purpose of making derivative works; and/or (iii) be redistributed f
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 ee of charge; including, without limitation, software licensed or distributed under any of the following licenses or distribution models, or licenses or distribution models similar to, GNU
+\hich\f1 \rquote \loch\f1 s General Public License (GPL) or Lesser/Library GPL (LGPL).
+\par \hich\af1\dbch\af31505\loch\f1 22.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 O\hich\af1\dbch\af31505\loch\f1 ther Authorized Educational Licensee}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means a Licensee described at }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+HYPERLINK "http://www.autodesk.com/educationterms"}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid5905377 {\*\datafield 
+00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6600000068007400740070003a002f002f007700770077002e006100750074006f006400650073006b002e0063006f006d002f0065006400750063006100740069006f006e007400650072006d0073000000795881f4
+3b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\cf2\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 http://www.autodesk.com/educationterms}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 
+\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1  or as otherwise authorized in writing by Autodesk.
+\par \hich\af1\dbch\af31505\loch\f1 23.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Permitted Number}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 
+\'94\loch\f1  means a maximum number\hich\af1\dbch\af31505\loch\f1 
+ (e.g., number of authorized users, number of concurrent users, number of computers, sessions, etc.) applicable to a license of the Licensed Materials and to the License Type associated with such license.  Such number is determined by Autodesk and may be 
+\hich\af1\dbch\af31505\loch\f1 s\hich\af1\dbch\af31505\loch\f1 pecified in the applicable License Identification.
+\par \hich\af1\dbch\af31505\loch\f1 24.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Personal Learning Purposes}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means (i) personal learning as a Student or (ii) in the case of a non-Student, personal learning, excluding (a) in-person or online classroom learning in any degree-grantin\hich\af1\dbch\af31505\loch\f1 
+g or certificate granting program, and (b) learning related to any commercial, professional or other for-profit purposes.
+\par \hich\af1\dbch\af31505\loch\f1 25.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Personnel}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means (a) Licensee\hich\f1 \rquote \loch\f1 s individual employees and (b) individual persons who are independent contractors working on Licens\hich\af1\dbch\af31505\loch\f1 ee\hich\f1 \rquote \loch\f1 
+s premises and who Install and Access the Licensed Materials only on and through Computers owned or leased and controlled by Licensee.
+\par \hich\af1\dbch\af31505\loch\f1 26.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Previous Versions}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means, as to any then-current release of Licensed Materials, a prior release of the Licensed M\hich\af1\dbch\af31505\loch\f1 
+aterials as to which such then-current release is a successor or substitute (as determined by Autodesk).
+\par \hich\af1\dbch\af31505\loch\f1 27.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Qualified Educational Institution}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means an educational institution which has been accredited by an authorized governmental agency within its appl\hich\af1\dbch\af31505\loch\f1 
+icable local, state, provincial, federal, or national government and has the primary purpose of teaching its enrolled students. Examples, without limitation, of entities that are included and excluded from this definition are described at }
+{\field{\*\fldinst {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 HYPERLINK "http:/\hich\af1\dbch\af31505\loch\f1 /www.autodesk.com/educationterms"}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid5905377 
+{\*\datafield 
+00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6600000068007400740070003a002f002f007700770077002e006100750074006f006400650073006b002e0063006f006d002f0065006400750063006100740069006f006e007400650072006d0073000000795881f4
+3b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\cf2\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 http://www.autodesk.com/educationterms}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 
+\af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 . 
+\par \hich\af1\dbch\af31505\loch\f1 28.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Relationship Program}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means (i) Subscription or (ii) a rental program offered generally by Autodesk pursuant to which Autodesk makes available Licensed Materials.
+\par \hich\af1\dbch\af31505\loch\f1 29. \tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Relat\hich\af1\dbch\af31505\loch\f1 ionship Program Terms}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means the terms for a Relationship Program set forth at }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+HYPERLINK "http://usa.autodesk.com/company/legal-notices-trademarks/support-terms-and-conditions"}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid5905377 {\*\datafield 
+00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90bc400000068007400740070003a002f002f007500730061002e006100750074006f006400650073006b002e0063006f006d002f0063006f006d00700061006e0079002f006c006500670061006c002d006e006f007400
+69006300650073002d00740072006100640065006d00610072006b0073002f0073007500700070006f00720074002d007400650072006d0073002d0061006e0064002d0063006f006e0064006900740069006f006e0073000000795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 
+\af1\afs18 \ltrch\fcs0 \f1\fs18\ul\cf2\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 http://usa.autodesk.com/company/legal-notices-trademarks/support-terms-and-condi\hich\af1\dbch\af31505\loch\f1 tions}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {
+\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1  or any successor or supplemental web page of Autodesk (the URL for which may be obtained on Autodesk\hich\f1 \rquote \loch\f1 s website or on request).
+\par \hich\af1\dbch\af31505\loch\f1 30. \tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Reseller}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means a distributor or reseller authorized directly or indirectly by Autodesk to distribute authentic Au\hich\af1\dbch\af31505\loch\f1 todesk Materials to Licensee.
+\par \hich\af1\dbch\af31505\loch\f1 31.\tab \hich\f1 \'94}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Services}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means services (including the results of services) provided or made available by Autodesk, including, without limitation, support services, storage, simulation and testing services, training and other benefits, \hich\af1\dbch\af31505\loch\f1 
+but excluding services provided or made available as part of a Relationship Program.
+\par \hich\af1\dbch\af31505\loch\f1 32.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Services Terms}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 
+\'94\loch\f1  means the terms for Services set forth at a location where a user may order or register for, or that is displayed in connection with ordering or regis\hich\af1\dbch\af31505\loch\f1 
+tering for, such Services (e.g., a web page) or, if there are no such terms, at }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+HYPERLINK "http://usa.autodesk.com/company/legal-notices-trademarks/terms-of-service"}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid5905377 {\*\datafield 
+00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90bac00000068007400740070003a002f002f007500730061002e006100750074006f006400650073006b002e0063006f006d002f0063006f006d00700061006e0079002f006c006500670061006c002d006e006f007400
+69006300650073002d00740072006100640065006d00610072006b0073002f007400650072006d0073002d006f0066002d0073006500720076006900630065000000795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\cf2\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 http://usa.autodesk.com/company/legal-notices-trademarks/terms-of-service}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1  (if the Servic\hich\af1\dbch\af31505\loch\f1 es are web services) or }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+HYPERLINK "http://usa.autodesk.com/company/legal-notices-trademarks/terms-of-use"}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid5905377 {\*\datafield 
+00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90ba400000068007400740070003a002f002f007500730061002e006100750074006f006400650073006b002e0063006f006d002f0063006f006d00700061006e0079002f006c006500670061006c002d006e006f007400
+69006300650073002d00740072006100640065006d00610072006b0073002f007400650072006d0073002d006f0066002d007500730065000000795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\cf2\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 http://usa.autodesk.com/company/legal-notices-trademarks/terms-of-use}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+ for all other Services) or any successor or supplemental web pages of Autodesk.
+\par \hich\af1\dbch\af31505\loch\f1 33.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Software}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1 \hich\f1  means the Autodesk FBX SDK computer program, or a module or component of a computer program, including the software development kit (\'93\loch\f1 \hich\f1 SDK\'94\loch\f1 \hich\f1 ) distributed or made available by Autodesk.  The term 
+\'93\loch\f1 \hich\f1 Software\'94\hich\af1\dbch\af31505\loch\f1  may also refer to functions and features of a computer program.
+\par \hich\af1\dbch\af31505\loch\f1 34.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Stand-alone Basis}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means (i) the Licensed Materials are Installed on a single Computer and (ii) the Licensed Materials cannot be Installed on, or operated, viewed or otherwise Accessed f\hich\af1\dbch\af31505\loch\f1 
+rom or through any other Computer (e.g., through a network connection of any kind).
+\par \hich\af1\dbch\af31505\loch\f1 35.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Student}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means an individual person enrolled as a student at a Qualified Educational Institution. 
+\par \hich\af1\dbch\af31505\loch\f1 36.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Subscription}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  is the program offered generally by Autodesk unde\hich\af1\dbch\af31505\loch\f1 
+r which Autodesk provides (among other things) updates and upgrades to, new versions of, and certain other support, services and training relating to Autodesk Materials.
+\par \hich\af1\dbch\af31505\loch\f1 37.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Supplemental Materials}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means materials, other than Software and related User Doc\hich\af1\dbch\af31505\loch\f1 
+umentation, that are distributed or made available by Autodesk for use with Software.  Supplemental Materials include, without limitation, (a) content, such as sample drawings and designs, modules for drawings and designs, and representations of elements 
+\hich\af1\dbch\af31505\loch\f1 u\hich\af1\dbch\af31505\loch\f1 
+sed in drawings and designs (e.g., buildings, parts of buildings, fixtures, furniture, bridges, roads, characters, backgrounds, settings and animations), (b) background materials, such as building codes and descriptions of building practices, (c) tools fo
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+ rendering the output of the Software, such as fonts, and (d) Development Materials, application programming interfaces (APIs), and other similar developer materials (including API Information).
+\par \hich\af1\dbch\af31505\loch\f1 37\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Territory}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  (a) means the country, countries or jurisdicti\hich\af1\dbch\af31505\loch\f1 
+on(s) specified in the License Identification, or (b) if there is no such License Identification, or no country or jurisdiction is specified in the License Identification, means the country in which Licensee acquires a license to the Autodesk Materials.  
+\hich\af1\dbch\af31505\loch\f1 I\hich\af1\dbch\af31505\loch\f1 
+f the License Identification specifies, or Licensee acquires the Autodesk Materials in, a member country of the European Union or the European Free Trade Association, Territory means all the countries of the European Union and the European Free Trade Asso
+\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 iation.
+\par \hich\af1\dbch\af31505\loch\f1 38.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Uninstall}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means to remove or disable a copy of Autodesk Materials from a hard drive or other storage medium through any means or otherwise to destroy or make unusable a copy of the Autodesk Materials.
+\par \hich\af1\dbch\af31505\loch\f1 39.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Upgrade}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 \'94
+\loch\f1  means a full commercial ver\hich\af1\dbch\af31505\loch\f1 
+sion of Licensed Materials (a) which is a successor to or substitute for a qualifying prior release (and may incorporate error corrections, patches, service packs and updates and upgrades to, and may enhance or add to the features or functionality of, the
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+prior release) or different release of Licensed Materials, (b) is provided to a Licensee who has previously licensed the applicable qualifying prior or different release from Autodesk and (c) for which Autodesk generally charges a separate fee or makes av
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 
+ilable solely to customers under a Relationship Program.  Whether Autodesk Materials are an Upgrade may be specified in the applicable License Identification.  Whether Autodesk Materials are an Upgrade and whether Licensee has met the qualifications to li
+\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 ense particular Autodesk Materials as an Upgrade are determined by Autodesk.
+\par \hich\af1\dbch\af31505\loch\f1 40.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 User Documentation}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\loch\af1\dbch\af31505\hich\f1 \'94\loch\f1  means the explanatory or instructional materials for Software or Supplemental Materials (including materials regarding use of the Software or Supplemental\hich\af1\dbch\af31505\loch\f1 
+ Materials), whether in printed or electronic form, that Autodesk or a Reseller incorporates in the Software or Supplemental Materials (or the packaging for the Software or Supplemental Materials) or otherwise provides to its customers when or after such 
+\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 ustomers license, acquire or Install the Software or Supplemental Materials.
+\par \hich\af1\dbch\af31505\loch\f1 41.\tab \hich\f1 \'93}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 VPN Requirements}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \loch\af1\dbch\af31505\hich\f1 
+\'94\loch\f1 \hich\f1  means (i) the Licensed Materials are Accessed through a secure virtual private network (\'93\loch\f1 \hich\f1 VPN\'94\loch\f1 ); (ii) the maximum number of concurrent users Accessing the Li\hich\af1\dbch\af31505\loch\f1 
+censed Materials (on a Networked Basis or through the VPN) does not exceed the Permitted Number at any time; (iii) all copies of the Licensed Materials are Installed and Accessed exclusively in conjunction with the technical protection device (if any) sup
+\hich\af1\dbch\af31505\loch\f1 p\hich\af1\dbch\af31505\loch\f1 lied with the Licensed Materials; and (iv) the VPN connection is secure and complies with current industry standard encryption and protection mechanisms.
+\par }\pard \ltrpar\qc \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\insrsid4142109 
+\par 
+\par \hich\af1\dbch\af31505\loch\f1 Exhibit B
+\par }{\rtlch\fcs1 \ab\af1\afs18 \ltrch\fcs0 \b\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 License Types
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 1.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Stand-alone (Individual) License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 \hich\f1 
+.  If the License Identification identifies the License Type as a \'93\loch\f1 \hich\f1 Stand-alone License\'94\loch\f1 \hich\f1  or as an \'93\loch\f1 
+Individual License," Licensee may Install a single primary copy of the specific release of the Licensed Materials designated in the applicable License Identi\hich\af1\dbch\af31505\loch\f1 f\hich\af1\dbch\af31505\loch\f1 
+ication on one (1) Computer, on a Stand-alone Basis, and permit Access to such primary copy of the Licensed Materials solely by Licensee\hich\f1 \rquote \loch\f1 s Personnel, and solely for Licensee\hich\f1 \rquote \loch\f1 
+s Internal Business Needs.  Licensee may also Install a single additional copy of\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+such Licensed Materials on one (1) additional Computer, on a Stand-alone Basis; provided that (i) such additional copy of the Licensed Materials is Accessed solely by the same person as the primary copy; (ii) such person is Licensee (if Licensee is an ind
+\hich\af1\dbch\af31505\loch\f1 i\hich\af1\dbch\af31505\loch\f1 vidual) or an employee of Licensee; (iii) such person Accesses the additional copy solely to perform work while away from that person\hich\f1 \rquote \loch\f1 
+s usual work location and solely for Licensee\hich\f1 \rquote \loch\f1 s Internal Business Needs; and (iv) the primary and additional copies are n\hich\af1\dbch\af31505\loch\f1 o\hich\af1\dbch\af31505\loch\f1 
+t Accessed at the same time.  Stand-alone (Individual) License is for a perpetual term, except as otherwise provided in this Agreement.
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 2.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Multi-seat Stand-alone License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 \hich\f1 .  If the License Identification identifies the License Type as a 
+\'93\loch\f1 Multi-seat Stand-alo\hich\af1\dbch\af31505\loch\f1 
+ne License," Licensee may Install primary copies of the specific release of the Licensed Materials designated in the applicable License Identification on up to the Permitted Number of Computers, on a Stand-alone Basis, and permit Access to such copies of 
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 he Licensed Materials solely by Licensee\hich\f1 \rquote \loch\f1 s Personnel, and solely for Licensee\hich\f1 \rquote \loch\f1 
+s Internal Business Needs.  Licensee may also Install additional copies of such Licensed Materials on additional Computers in an amount up to the Permitted Number of Computers, \hich\af1\dbch\af31505\loch\f1 o\hich\af1\dbch\af31505\loch\f1 
+n a Stand-alone Basis; provided that (i) each additional copy of such Licensed Materials is Accessed solely by the same person as the primary copy; (ii) such person is Licensee (if Licensee is an individual) or an employee of Licensee; (iii) such person A
+\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 cesses the additional copy solely to perform work while away from that person\hich\f1 \rquote \loch\f1 s usual work location and solely for Licensee\hich\f1 \rquote \loch\f1 
+s Internal Business Needs; and (iv) the primary and additional copies are not Accessed at the same time.  Multi-seat Stand-alone Li\hich\af1\dbch\af31505\loch\f1 c\hich\af1\dbch\af31505\loch\f1 
+ense is for a perpetual term, except as otherwise provided in this Agreement.
+\par \hich\af1\dbch\af31505\loch\f1 3.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Network License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 \hich\f1 
+.  If the License Identification identifies the License Type for the Licensed Materials as a \'93\loch\f1 Network License," Licensee may Install copies of the specific rele\hich\af1\dbch\af31505\loch\f1 
+ase of the Licensed Materials designated in the applicable License Identification on a Computer and permit Access to such Licensed Materials on multiple Computers, on a Networked Basis, solely by Licensee\hich\f1 \rquote \loch\f1 
+s Personnel, solely for Licensee\hich\f1 \rquote \loch\f1 s Internal Busine\hich\af1\dbch\af31505\loch\f1 s\hich\af1\dbch\af31505\loch\f1 
+s Needs, only so long as the maximum number of concurrent Authorized Users does not exceed the Permitted Number of Authorized Users or other limits imposed by the Autodesk License Manager (if any).  Licensee may, at Licensee\hich\f1 \rquote \loch\f1 
+s option, also Install the Lic\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+nsed Materials on a Hot Backup Server; provided that Licensee may Access the Licensed Materials on the Hot Backup Server only during the time period when, and solely for as long as, the primary Installed copy of the Licensed Materials is inoperable and on
+\hich\af1\dbch\af31505\loch\f1 l\hich\af1\dbch\af31505\loch\f1 \hich\f1 y subject to the same terms and conditions as are applicable to the primary Installed copy.  A \'93\loch\f1 \hich\f1 Hot Backup Server\'94\loch\f1 
+ means a file server Computer that has a second copy of the Software and Supplemental Materials Installed but that is not permitted to be Acc\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+ssible except when the primary Installed copy of the Software and Supplemental Materials are inoperable and only for so long as such primary Installed copy is inoperable.  A Network License is for a perpetual term, except as otherwise provided in this Agr
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 ement.
+\par \hich\af1\dbch\af31505\loch\f1 4.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Educational Stand-alone (Individual) License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 .\~
+\hich\af1\dbch\af31505\loch\f1 \hich\f1  If the License Identification identifies the License Type as an \'93\loch\f1 \hich\f1 Educational Stand-alone (Individual) License,\'94\loch\f1 
+ an Educational Licensee may Install a copy of the specific release of the Licensed Mate\hich\af1\dbch\af31505\loch\f1 
+rials designated in the applicable License Identification on one (1) Computer, subject to certain functional limitations described in Section 6.3 (Affected Data), on a Stand-alone Basis, and permit Access to such copy of the Licensed Materials solely by a
+\hich\af1\dbch\af31505\loch\f1 n\hich\af1\dbch\af31505\loch\f1  Educational Licensee solely for Educational Purposes.\~
+ An Educational Stand-alone (Individual) License is for a fixed term specified in the applicable License Identification or, if no such term is specified, the term is thirty-six (36) months from Instal\hich\af1\dbch\af31505\loch\f1 l
+\hich\af1\dbch\af31505\loch\f1 ation or as otherwise authorized in writing by Autodesk.
+\par \hich\af1\dbch\af31505\loch\f1 5.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Educational Multi-seat Stand-alone License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 \hich\f1 .  If the License Identification identifies the License Type as an \'93\loch\f1 \hich\f1 Educational Multi-seat Stand-alone License,\'94\loch\f1  an Educational Licensee may Install copie
+\hich\af1\dbch\af31505\loch\f1 
+s of the specific release of the Licensed Materials designated in the applicable License Identification on up to the Permitted Number of Computers, subject to certain functional limitations described in Section 6.3 (Affected Data), on a Stand-alone Basis,
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 
+and permit Access to such copies of the Licensed Materials solely by Educational Licensees solely for Educational Purposes.  An Educational Multi-seat Stand-alone License is for a fixed term specified in the applicable License Identification or, if no suc
+\hich\af1\dbch\af31505\loch\f1 h\hich\af1\dbch\af31505\loch\f1  term is specified, the term is thirty-six (36) months from Installation or as otherwise authorized in writing by Autodesk.
+\par \hich\af1\dbch\af31505\loch\f1 6.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Educational Network License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+\hich\f1 .  If the License Identification identifies the License Type as an \'93\loch\f1 \hich\f1 Educational Network License,\'94\loch\f1  an E\hich\af1\dbch\af31505\loch\f1 
+ducational Licensee may Install copies of the specific release of the Licensed Materials designated in the applicable License Identification on a single file server Computer, subject to certain functional limitations described in Section 6.3 (Affected Dat
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 
+), and Access such Licensed Materials on multiple Computers on a Networked Basis, and permit Access to such copies of the Licensed Materials solely by Educational Licensees solely for Educational Purposes, only so long as the maximum number of concurrent 
+\hich\af1\dbch\af31505\loch\f1 A\hich\af1\dbch\af31505\loch\f1 
+uthorized Users does not exceed the Permitted Number of Authorized Users.  An Educational Network License is for a fixed term specified in the applicable License Identification or, if no such term is specified, the term is thirty-six (36) months from Inst
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 llation or as otherwise authorized in writing by Autodesk.
+\par \hich\af1\dbch\af31505\loch\f1 7.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Personal Learning License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+\hich\f1 .  If the License Identification identifies the License Type as a \'93\loch\f1 \hich\f1 Personal Learning License\'94\loch\f1 , Licensee may Install a copy of the specific release of the Licensed Materi\hich\af1\dbch\af31505\loch\f1 
+als designated in the applicable License Identification on one (1) Computer, subject to certain functional limitations described in Section 6.3 (Affected Data), on a Stand-alone Basis, and permit Access to such copy of the Licensed Materials solely by Lic
+\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 
+nsee, as an individual, solely for Personal Learning Purposes and only at and from locations that are not labs or classrooms and are not operated for commercial, professional or for-profit purposes.  A Personal Learning License Stand-alone is for a fixed 
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 erm specified in the applicable License Identification.  If no such term is specified, the term is thirteen (13) months from Installation.
+\par \hich\af1\dbch\af31505\loch\f1 8.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Evaluation/Demonstration/Trial}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+\hich\f1 .  If Autodesk identifies the License Type as a \'93\loch\f1 \hich\f1 demonstration\'94\loch\f1 \hich\f1 , \'93\loch\f1 \hich\f1 evaluation\'94\loch\f1 \hich\f1 , \'93\loch\f1 tria\hich\af1\dbch\af31505\loch\f1 \hich\f1 l,\'94\loch\f1 \hich\f1  
+\'93\loch\f1 \hich\f1 not for resale\'94\loch\f1 \hich\f1  or \'93\loch\f1 \hich\f1 NFR\'94\loch\f1 \hich\f1  version (each, an \'93\loch\f1 \hich\f1 Evaluation License\'94\loch\f1 
+) in the applicable License Identification, Licensee may Install a copy of the specific release of the Licensed Materials designated in the applicable License Identification on one (1) Co\hich\af1\dbch\af31505\loch\f1 m\hich\af1\dbch\af31505\loch\f1 
+puter, subject to certain functional limitations described in Section 6.3 (Affected Data), on a Stand-alone Basis, and permit Access to such copy of the Licensed Materials, solely by Licensee\hich\f1 \rquote \loch\f1 
+s Personnel, solely for Evaluation Purposes, only so long as th\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1  maximum number of concurrent Authorized Users does not exceed one (1), and only from Licensee\hich\f1 \rquote \loch\f1 
+s work location.  An Evaluation License is for a fixed term specified in the applicable License Identification, or if no such term is specified, the term is thi\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+ty (30) days from Installation or as otherwise authorized in writing by Autodesk.
+\par \hich\af1\dbch\af31505\loch\f1 9.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Fixed Term/Limited Duration/Rental License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\hich\af1\dbch\af31505\loch\f1 .  If Autodesk identifies a license in the applicable License Identification as being for a specified period or limited duration \hich\af1\dbch\af31505\loch\f1 or as having a fixed term or as a rental license, Licensee
+\hich\f1 \rquote \loch\f1 s right to Install and Access the Licensed Materials will continue only for the period, duration or term specified in the License Identification.  Such Installation and Access will be in accordanc\hich\af1\dbch\af31505\loch\f1 e
+\hich\af1\dbch\af31505\loch\f1 
+ with and subject to the applicable License Type and Permitted Number.  If Autodesk identifies a license in the applicable License Identification as being for a specified period or limited duration, or as having a fixed term, or a rental license but no pe
+\hich\af1\dbch\af31505\loch\f1 r\hich\af1\dbch\af31505\loch\f1 
+iod, duration or term is specified in the License Identification, the period, duration or term will be ninety (90) days from Installation (or the period specified in Sections B.6 (Educational Network License), B.7 (Personal Learning License) or B.8 (Evalu
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 tion/Demonstration/Trial) of this Exhibit B with respect to the licenses described in those sections).
+\par }\pard \ltrpar\ql \li0\ri0\sa120\sl276\slmult1\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 10.\tab }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 
+\f1\fs18\ul\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 Session Specific Network License}{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 \hich\af1\dbch\af31505\loch\f1 
+.  If the License Identification identifies the License Type as a "Session Specific Network License", Licensee may in\hich\af1\dbch\af31505\loch\f1 
+stall one (1) copy of the specific release of the Licensed Materials designated in the applicable License Identification on a Computer and permit Access to such Licensed Materials from multiple Computers through a Supported Virtualization Application, on 
+\hich\af1\dbch\af31505\loch\f1 a\hich\af1\dbch\af31505\loch\f1 
+ Networked Basis, solely by Licensee's Personnel, solely for Licensee's Internal Business needs, only so long as the maximum number of concurrent Sessions does not exceed the Permitted Number or other limits imposed by the Autodesk License Manager tool (i
+\hich\af1\dbch\af31505\loch\f1 f\hich\af1\dbch\af31505\loch\f1 \hich\f1  any).  For purposes of this Session Specific Network License, (a) a \'93\loch\f1 \hich\f1 Session\'94\loch\f1 \hich\f1 
+ is defined as a single interactive information exchange between two Computers that are connected through a Supported Virtualization Application, and (b) \'93\loch\f1 Supported Virtualizati\hich\af1\dbch\af31505\loch\f1 o\hich\af1\dbch\af31505\loch\f1 
+\hich\f1 n Application(s)\'94\loch\f1 
+ are those third party virtualization applications or methods that are specifically identified as supported by Autodesk in the User Documentation for the Licensed Materials.  With respect to the applicable Supported Virtualization Applica
+\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 
+ion, Licensee agrees to activate any available session tracking mechanism, not disable any such session tracking mechanism and to retain all records generated by such session tracking mechanism.  A Session Specific Network License is for a perpetual term,
+\hich\af1\dbch\af31505\loch\f1  \hich\af1\dbch\af31505\loch\f1 except as otherwise provided in this Agreement.
+\par 
+\par 
+\par 
+\par }{\rtlch\fcs1 \af1\afs18 \ltrch\fcs0 \f1\fs18\insrsid4142109 
+\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
+9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
+5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
+b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
+0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
+a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
+c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
+0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
+a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
+6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
+4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
+4757e8d3f729e245eb2b260a0238fd010000ffff0300504b030414000600080000002100aa5225dfc60600008b1a0000160000007468656d652f7468656d652f
+7468656d65312e786d6cec595d8bdb46147d2ff43f08bd3bfe92fcb1c41b6cd9ceb6d94d42eca4e4716c8fadc98e344633de8d0981923c160aa569e943037deb
+43691b48a02fe9afd936a54d217fa17746b63c638fbb9b2585a5640d8b343af7ce997bafce1d4997afdc8fa87384134e58dc708b970aae83e3211b9178d2706f
+f7bbb99aeb7081e211a22cc60d778eb97b65f7c30f2ea31d11e2083b601ff31dd4704321a63bf93c1fc230e297d814c7706dcc920809384d26f951828ec16f44
+f3a542a1928f10895d274611b8bd311e932176fad2a5bbbb74dea1701a0b2e078634e949d7d8b050d8d1615122f89c0734718e106db830cf881df7f17de13a14
+7101171a6e41fdb9f9ddcb79b4b330a2628bad66d7557f0bbb85c1e8b0a4e64c26836c52cff3bd4a33f3af00546ce23ad54ea553c9fc29001a0e61a52917dda7
+dfaab7dafe02ab81d2438bef76b55d2e1a78cd7f798373d3973f03af40a97f6f03dfed06104503af4029dedfc07b5eb51478065e81527c65035f2d34db5ed5c0
+2b5048497cb8812ef89572b05c6d061933ba6785d77daf5b2d2d9caf50500d5975c929c62c16db6a2d42f758d2058004522448ec88f9148fd110aa3840940c12
+e2ec93490885374531e3305c2815ba8532fc973f4f1da988a01d8c346bc90b98f08d21c9c7e1c3844c45c3fd18bcba1ae4cdcb1fdfbc7cee9c3c7a71f2e89793
+c78f4f1efd9c3a32acf6503cd1ad5e7fffc5df4f3f75fe7afeddeb275fd9f15cc7fffed367bffdfaa51d082b5d85e0d5d7cffe78f1ecd5379ffff9c3130bbc99
+a0810eef930873e73a3e766eb10816a6426032c783e4ed2cfa2122ba45339e701423398bc57f478406fafa1c5164c1b5b019c13b09488c0d787576cf20dc0b93
+9920168fd7c2c8001e30465b2cb146e19a9c4b0b737f164fec9327331d770ba123dbdc018a8dfc766653d05662731984d8a07993a258a0098eb170e4357688b1
+6575770931e27a408609e36c2c9cbbc46921620d499f0c8c6a5a19ed9108f232b711847c1bb139b8e3b418b5adba8d8f4c24dc15885ac8f73135c27815cd048a
+6c2efb28a27ac0f791086d247bf364a8e33a5c40a6279832a733c29cdb6c6e24b05e2de9d7405eec693fa0f3c84426821cda7cee23c674649b1d06218aa6366c
+8fc4a18efd881f428922e7261336f80133ef10790e7940f1d674df21d848f7e96a701b9455a7b42a107965965872791533a37e7b733a4658490d08bfa1e71189
+4f15f73559f7ff5b5907217df5ed53cbaa2eaaa0371362bda3f6d6647c1b6e5dbc03968cc8c5d7ee369ac53731dc2e9b0decbd74bf976ef77f2fdddbeee7772f
+d82b8d06f9965bc574abae36eed1d67dfb9850da13738af7b9daba73e84ca32e0c4a3bf5cc8ab3e7b8690887f24e86090cdc2441cac64998f88488b017a229ec
+ef8bae7432e10bd713ee4c19876dbf1ab6fa96783a8b0ed8287d5c2d16e5a3692a1e1c89d578c1cfc6e15143a4e84a75f50896b9576c27ea51794940dabe0d09
+6d329344d942a2ba1c9441520fe610340b09b5b277c2a26e615193ee97a9da6001d4b2acc0d6c9810d57c3f53d30012378a242148f649ed2542fb3ab92f92e33
+bd2d984605c03e625901ab4cd725d7adcb93ab4b4bed0c99364868e566925091513d8c87688417d52947cf42e36d735d5fa5d4a02743a1e683d25ad1a8d6fe8d
+c579730d76ebda40635d2968ec1c37dc4ad9879219a269c31dc3633f1c4653a81d2eb7bc884ee0ddd95024e90d7f1e6599265cb4110fd3802bd149d520220227
+0e2551c395cbcfd24063a5218a5bb104827061c9d541562e1a3948ba99643c1ee3a1d0d3ae8dc848a7a7a0f0a95658af2af3f383a5259b41ba7be1e8d819d059
+720b4189f9d5a20ce0887078fb534ca33922f03a3313b255fdad35a685eceaef13550da5e3884e43b4e828ba98a77025e5191d7596c5403b5bac1902aa8564d1
+080713d960f5a01add34eb1a2987ad5df7742319394d34573dd35015d935ed2a66ccb06c036bb13c5f93d7582d430c9aa677f854bad725b7bed4bab57d42d625
+20e059fc2c5df70c0d41a3b69acca026196fcab0d4ecc5a8d93b960b3c85da599a84a6fa95a5dbb5b8653dc23a1d0c9eabf383dd7ad5c2d078b9af549156df3d
+f44f136c700fc4a30d2f81675470954af8f09020d810f5d49e24950db845ee8bc5ad0147ce2c210df741c16f7a41c90f72859adfc97965af90abf9cd72aee9fb
+e562c72f16daadd243682c228c8a7efacda50bafa2e87cf1e5458d6f7c7d89966fdb2e0d599467eaeb4a5e11575f5f8aa5ed5f5f1c02a2f3a052ead6cbf55625
+572f37bb39afddaae5ea41a5956b57826abbdb0efc5abdfbd0758e14d86b9603afd2a9e52ac520c8799582a45fabe7aa5ea9d4f4aacd5ac76b3e5c6c6360e5a9
+7c2c6201e155bc76ff010000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f
+7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be
+9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980
+ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5b
+babac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c0200001300000000000000000000000000000000005b436f6e74656e
+745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f
+2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000190200007468656d652f7468656d652f74
+68656d654d616e616765722e786d6c504b01022d0014000600080000002100aa5225dfc60600008b1a00001600000000000000000000000000d6020000746865
+6d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b0100002700000000000000000000000000d00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000cb0a00000000}
+{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
+617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
+6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
+656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
+{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;
+\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;
+\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;
+\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9;
+\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;
+\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;
+\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;
+\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Table;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 1;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 2;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 2;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 3;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 2;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 6;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 2;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 6;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 2;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Contemporary;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Elegant;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Professional;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 2;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Theme;\lsdsemihidden1 \lsdlocked0 Placeholder Text;
+\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;
+\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;
+\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1;
+\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision;
+\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;
+\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1;
+\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;
+\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;
+\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;
+\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;
+\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;
+\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;
+\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;
+\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;
+\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;
+\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
+\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;
+\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6;
+\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;
+\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;
+\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
+\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography;
+\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4;
+\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4;
+\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1;
+\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1;
+\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2;
+\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2;
+\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3;
+\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4;
+\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4;
+\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5;
+\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5;
+\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6;
+\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6;
+\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark;
+\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1;
+\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1;
+\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2;
+\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3;
+\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3;
+\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4;
+\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4;
+\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5;
+\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5;
+\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6;
+\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000
+4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000
+d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000003013
+e2fa177bd201feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000105000000000000}}

+ 277 - 0
sdk/Darwin/2019.2/include/fbxsdk.h

@@ -0,0 +1,277 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2016 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxsdk.h
+#ifndef _FBXSDK_H_
+#define _FBXSDK_H_
+
+/**
+  * \mainpage FBX SDK Reference
+  * <p>
+  * \section welcome Welcome to the FBX SDK Reference
+  * The FBX SDK Reference contains reference information on every header file, 
+  * namespace, class, method, enum, typedef, variable, and other C++ elements 
+  * that comprise the FBX software development kit (SDK).
+  * <p>
+  * The FBX SDK Reference is organized into the following sections:
+  * <ul><li>Class List: an alphabetical list of FBX SDK classes
+  *     <li>Class Hierarchy: a textual representation of the FBX SDK class structure
+  *     <li>Graphical Class Hierarchy: a graphical representation of the FBX SDK class structure
+  *     <li>File List: an alphabetical list of all documented header files</ul>
+  * <p>
+  * \section otherdocumentation Other Documentation
+  * Apart from this reference guide, an FBX SDK Programming Guide and many FBX 
+  * SDK examples are also provided.
+  * <p>
+  * \section aboutFBXSDK About the FBX SDK
+  * The FBX SDK is a C++ software development kit (SDK) that lets you import 
+  * and export 3D scenes using the Autodesk FBX file format. The FBX SDK 
+  * reads FBX files created with FiLMBOX version 2.5 and later and writes FBX 
+  * files compatible with MotionBuilder version 6.0 and up. 
+  */
+
+#pragma pack(push, 8)	//FBXSDK is compiled with default value (8)
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#ifndef FBXSDK_NAMESPACE_USING
+	#define FBXSDK_NAMESPACE_USING 1
+#endif
+
+//---------------------------------------------------------------------------------------
+//Core Base Includes
+#include <fbxsdk/core/base/fbxarray.h>
+#include <fbxsdk/core/base/fbxbitset.h>
+#include <fbxsdk/core/base/fbxcharptrset.h>
+#include <fbxsdk/core/base/fbxcontainerallocators.h>
+#include <fbxsdk/core/base/fbxdynamicarray.h>
+#include <fbxsdk/core/base/fbxstatus.h>
+#include <fbxsdk/core/base/fbxfile.h>
+#ifndef FBXSDK_ENV_WINSTORE
+	#include <fbxsdk/core/base/fbxfolder.h>
+#endif
+#include <fbxsdk/core/base/fbxhashmap.h>
+#include <fbxsdk/core/base/fbxintrusivelist.h>
+#include <fbxsdk/core/base/fbxmap.h>
+#include <fbxsdk/core/base/fbxmemorypool.h>
+#include <fbxsdk/core/base/fbxpair.h>
+#include <fbxsdk/core/base/fbxset.h>
+#include <fbxsdk/core/base/fbxstring.h>
+#include <fbxsdk/core/base/fbxstringlist.h>
+#include <fbxsdk/core/base/fbxtime.h>
+#include <fbxsdk/core/base/fbxtimecode.h>
+#include <fbxsdk/core/base/fbxutils.h>
+
+//---------------------------------------------------------------------------------------
+//Core Math Includes
+#include <fbxsdk/core/math/fbxmath.h>
+#include <fbxsdk/core/math/fbxdualquaternion.h>
+#include <fbxsdk/core/math/fbxmatrix.h>
+#include <fbxsdk/core/math/fbxquaternion.h>
+#include <fbxsdk/core/math/fbxvector2.h>
+#include <fbxsdk/core/math/fbxvector4.h>
+
+//---------------------------------------------------------------------------------------
+//Core Sync Includes
+#ifndef FBXSDK_ENV_WINSTORE
+	#include <fbxsdk/core/sync/fbxatomic.h>
+	#include <fbxsdk/core/sync/fbxclock.h>
+	#include <fbxsdk/core/sync/fbxsync.h>
+	#include <fbxsdk/core/sync/fbxthread.h>
+#endif /* !FBXSDK_ENV_WINSTORE */
+
+//---------------------------------------------------------------------------------------
+//Core Includes
+#include <fbxsdk/core/fbxclassid.h>
+#include <fbxsdk/core/fbxconnectionpoint.h>
+#include <fbxsdk/core/fbxdatatypes.h>
+#ifndef FBXSDK_ENV_WINSTORE
+	#include <fbxsdk/core/fbxmodule.h>
+	#include <fbxsdk/core/fbxloadingstrategy.h>
+#endif /* !FBXSDK_ENV_WINSTORE */
+#include <fbxsdk/core/fbxmanager.h>
+#include <fbxsdk/core/fbxobject.h>
+#include <fbxsdk/core/fbxperipheral.h>
+#ifndef FBXSDK_ENV_WINSTORE
+	#include <fbxsdk/core/fbxplugin.h>
+	#include <fbxsdk/core/fbxplugincontainer.h>
+#endif /* !FBXSDK_ENV_WINSTORE */
+#include <fbxsdk/core/fbxproperty.h>
+#include <fbxsdk/core/fbxpropertydef.h>
+#include <fbxsdk/core/fbxpropertyhandle.h>
+#include <fbxsdk/core/fbxpropertypage.h>
+#include <fbxsdk/core/fbxpropertytypes.h>
+#include <fbxsdk/core/fbxquery.h>
+#include <fbxsdk/core/fbxqueryevent.h>
+#ifndef FBXSDK_ENV_WINSTORE
+	#include <fbxsdk/core/fbxscopedloadingdirectory.h>
+	#include <fbxsdk/core/fbxscopedloadingfilename.h>
+#endif /* !FBXSDK_ENV_WINSTORE */
+#include <fbxsdk/core/fbxxref.h>
+
+//---------------------------------------------------------------------------------------
+//File I/O Includes
+#include <fbxsdk/fileio/fbxexporter.h>
+#include <fbxsdk/fileio/fbxexternaldocreflistener.h>
+#include <fbxsdk/fileio/fbxfiletokens.h>
+#include <fbxsdk/fileio/fbxglobalcamerasettings.h>
+#include <fbxsdk/fileio/fbxgloballightsettings.h>
+#include <fbxsdk/fileio/fbxgobo.h>
+#include <fbxsdk/fileio/fbximporter.h>
+#include <fbxsdk/fileio/fbxiobase.h>
+#include <fbxsdk/fileio/fbxiopluginregistry.h>
+#include <fbxsdk/fileio/fbxiosettings.h>
+#include <fbxsdk/fileio/fbxstatisticsfbx.h>
+#include <fbxsdk/fileio/fbxstatistics.h>
+
+//---------------------------------------------------------------------------------------
+//Scene Includes
+#include <fbxsdk/scene/fbxaudio.h>
+#include <fbxsdk/scene/fbxaudiolayer.h>
+#include <fbxsdk/scene/fbxcollection.h>
+#include <fbxsdk/scene/fbxcollectionexclusive.h>
+#include <fbxsdk/scene/fbxcontainer.h>
+#include <fbxsdk/scene/fbxcontainertemplate.h>
+#include <fbxsdk/scene/fbxdisplaylayer.h>
+#include <fbxsdk/scene/fbxdocument.h>
+#include <fbxsdk/scene/fbxdocumentinfo.h>
+#include <fbxsdk/scene/fbxenvironment.h>
+#include <fbxsdk/scene/fbxgroupname.h>
+#include <fbxsdk/scene/fbxlibrary.h>
+#include <fbxsdk/scene/fbxmediaclip.h>
+#include <fbxsdk/scene/fbxobjectmetadata.h>
+#include <fbxsdk/scene/fbxpose.h>
+#include <fbxsdk/scene/fbxreference.h>
+#include <fbxsdk/scene/fbxscene.h>
+#include <fbxsdk/scene/fbxselectionset.h>
+#include <fbxsdk/scene/fbxselectionnode.h>
+#include <fbxsdk/scene/fbxtakeinfo.h>
+#include <fbxsdk/scene/fbxthumbnail.h>
+#include <fbxsdk/scene/fbxvideo.h>
+
+//---------------------------------------------------------------------------------------
+//Scene Animation Includes
+#include <fbxsdk/scene/animation/fbxanimcurve.h>
+#include <fbxsdk/scene/animation/fbxanimcurvebase.h>
+#include <fbxsdk/scene/animation/fbxanimcurvefilters.h>
+#include <fbxsdk/scene/animation/fbxanimcurvenode.h>
+#include <fbxsdk/scene/animation/fbxanimevalclassic.h>
+#include <fbxsdk/scene/animation/fbxanimevalstate.h>
+#include <fbxsdk/scene/animation/fbxanimevaluator.h>
+#include <fbxsdk/scene/animation/fbxanimlayer.h>
+#include <fbxsdk/scene/animation/fbxanimstack.h>
+#include <fbxsdk/scene/animation/fbxanimutilities.h>
+
+//---------------------------------------------------------------------------------------
+//Scene Constraint Includes
+#include <fbxsdk/scene/constraint/fbxcharacternodename.h>
+#include <fbxsdk/scene/constraint/fbxcharacter.h>
+#include <fbxsdk/scene/constraint/fbxcharacterpose.h>
+#include <fbxsdk/scene/constraint/fbxconstraint.h>
+#include <fbxsdk/scene/constraint/fbxconstraintaim.h>
+#include <fbxsdk/scene/constraint/fbxconstraintcustom.h>
+#include <fbxsdk/scene/constraint/fbxconstraintparent.h>
+#include <fbxsdk/scene/constraint/fbxconstraintposition.h>
+#include <fbxsdk/scene/constraint/fbxconstraintrotation.h>
+#include <fbxsdk/scene/constraint/fbxconstraintscale.h>
+#include <fbxsdk/scene/constraint/fbxconstraintsinglechainik.h>
+#include <fbxsdk/scene/constraint/fbxconstraintutils.h>
+#include <fbxsdk/scene/constraint/fbxcontrolset.h>
+#include <fbxsdk/scene/constraint/fbxhik2fbxcharacter.h>
+
+//---------------------------------------------------------------------------------------
+//Scene Geometry Includes
+#include <fbxsdk/scene/geometry/fbxblendshape.h>
+#include <fbxsdk/scene/geometry/fbxblendshapechannel.h>
+#include <fbxsdk/scene/geometry/fbxcache.h>
+#include <fbxsdk/scene/geometry/fbxcachedeffect.h>
+#include <fbxsdk/scene/geometry/fbxcamera.h>
+#include <fbxsdk/scene/geometry/fbxcamerastereo.h>
+#include <fbxsdk/scene/geometry/fbxcameraswitcher.h>
+#include <fbxsdk/scene/geometry/fbxcluster.h>
+#include <fbxsdk/scene/geometry/fbxdeformer.h>
+#include <fbxsdk/scene/geometry/fbxgenericnode.h>
+#include <fbxsdk/scene/geometry/fbxgeometry.h>
+#include <fbxsdk/scene/geometry/fbxgeometrybase.h>
+#include <fbxsdk/scene/geometry/fbxgeometryweightedmap.h>
+#include <fbxsdk/scene/geometry/fbxlight.h>
+#include <fbxsdk/scene/geometry/fbxlimitsutilities.h>
+#include <fbxsdk/scene/geometry/fbxline.h>
+#include <fbxsdk/scene/geometry/fbxlodgroup.h>
+#include <fbxsdk/scene/geometry/fbxmarker.h>
+#include <fbxsdk/scene/geometry/fbxmesh.h>
+#include <fbxsdk/scene/geometry/fbxnode.h>
+#include <fbxsdk/scene/geometry/fbxnodeattribute.h>
+#include <fbxsdk/scene/geometry/fbxnull.h>
+#include <fbxsdk/scene/geometry/fbxnurbs.h>
+#include <fbxsdk/scene/geometry/fbxnurbscurve.h>
+#include <fbxsdk/scene/geometry/fbxnurbssurface.h>
+#include <fbxsdk/scene/geometry/fbxopticalreference.h>
+#include <fbxsdk/scene/geometry/fbxpatch.h>
+#include <fbxsdk/scene/geometry/fbxproceduralgeometry.h>
+#include <fbxsdk/scene/geometry/fbxshape.h>
+#include <fbxsdk/scene/geometry/fbxskeleton.h>
+#include <fbxsdk/scene/geometry/fbxskin.h>
+#include <fbxsdk/scene/geometry/fbxsubdeformer.h>
+#include <fbxsdk/scene/geometry/fbxsubdiv.h>
+#include <fbxsdk/scene/geometry/fbxtrimnurbssurface.h>
+#include <fbxsdk/scene/geometry/fbxvertexcachedeformer.h>
+#include <fbxsdk/scene/geometry/fbxweightedmapping.h>
+
+//---------------------------------------------------------------------------------------
+//Scene Shading Includes
+#include <fbxsdk/scene/shading/fbxshadingconventions.h>
+#include <fbxsdk/scene/shading/fbxbindingsentryview.h>
+#include <fbxsdk/scene/shading/fbxbindingtable.h>
+#include <fbxsdk/scene/shading/fbxbindingtableentry.h>
+#include <fbxsdk/scene/shading/fbxbindingoperator.h>
+#include <fbxsdk/scene/shading/fbxconstantentryview.h>
+#include <fbxsdk/scene/shading/fbxentryview.h>
+#include <fbxsdk/scene/shading/fbxfiletexture.h>
+#include <fbxsdk/scene/shading/fbximplementation.h>
+#include <fbxsdk/scene/shading/fbximplementationfilter.h>
+#include <fbxsdk/scene/shading/fbximplementationutils.h>
+#include <fbxsdk/scene/shading/fbxlayeredtexture.h>
+#include <fbxsdk/scene/shading/fbxoperatorentryview.h>
+#include <fbxsdk/scene/shading/fbxproceduraltexture.h>
+#include <fbxsdk/scene/shading/fbxpropertyentryview.h>
+#include <fbxsdk/scene/shading/fbxsemanticentryview.h>
+#include <fbxsdk/scene/shading/fbxsurfacelambert.h>
+#include <fbxsdk/scene/shading/fbxsurfacematerial.h>
+#include <fbxsdk/scene/shading/fbxsurfacephong.h>
+#include <fbxsdk/scene/shading/fbxtexture.h>
+
+//---------------------------------------------------------------------------------------
+//Utilities Includes
+#include <fbxsdk/utils/fbxdeformationsevaluator.h>
+#include <fbxsdk/utils/fbxprocessor.h>
+#include <fbxsdk/utils/fbxprocessorxref.h>
+#include <fbxsdk/utils/fbxprocessorxrefuserlib.h>
+#include <fbxsdk/utils/fbxprocessorshaderdependency.h>
+#include <fbxsdk/utils/fbxclonemanager.h>
+#include <fbxsdk/utils/fbxgeometryconverter.h>
+#include <fbxsdk/utils/fbxmanipulators.h>
+#include <fbxsdk/utils/fbxmaterialconverter.h>
+#include <fbxsdk/utils/fbxrenamingstrategyfbx5.h>
+#include <fbxsdk/utils/fbxrenamingstrategyfbx6.h>
+#include <fbxsdk/utils/fbxrenamingstrategyutilities.h>
+#include <fbxsdk/utils/fbxrootnodeutility.h>
+#include <fbxsdk/utils/fbxusernotification.h>
+#include <fbxsdk/utils/fbxscenecheckutility.h>
+
+//---------------------------------------------------------------------------------------
+#if defined(FBXSDK_NAMESPACE) && (FBXSDK_NAMESPACE_USING == 1)
+	using namespace FBXSDK_NAMESPACE;
+#endif
+
+#pragma pack(pop)
+
+#endif /* _FBXSDK_H_ */

+ 420 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxalloc.h

@@ -0,0 +1,420 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+/** \file fbxalloc.h
+  * Allocation functions definition.
+  *
+  * It is possible to override memory allocation functions throughout the FBX SDK by
+  * providing system memory allocation functions using the handler set functions below.
+  * The Microsoft Windows implementation in debug mode allows to specify where the
+  * allocations happen by providing the standard block type, file name and line number.
+  */
+#ifndef _FBXSDK_CORE_ARCH_ALLOC_H_
+#define _FBXSDK_CORE_ARCH_ALLOC_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#if defined(_DEBUG) && defined(FBXSDK_ENV_WIN)
+	#include <crtdbg.h>
+#endif
+
+#if defined(FBXSDK_ENV_MAC)
+	#include <malloc/malloc.h>
+#else
+	#include <malloc.h>
+#endif
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+#if defined(FBXSDK_CPU_32) && !defined(FBXSDK_ENV_IOS)
+	#define FBXSDK_MEMORY_ALIGNMENT ((size_t)8U)
+#else
+	#define FBXSDK_MEMORY_ALIGNMENT ((size_t)16U)
+#endif
+
+#define FBXSDK_MEMORY_COPY(dst, src, size) {memcpy(dst,src,size);}
+
+typedef void*	(*FbxMallocProc)(size_t);			//! Function pointer signature used to replace "malloc"
+typedef void*	(*FbxCallocProc)(size_t, size_t);	//! Function pointer signature used to replace "calloc"
+typedef void*	(*FbxReallocProc)(void*, size_t);	//! Function pointer signature used to replace "realloc"
+typedef void	(*FbxFreeProc)(void*);				//! Function pointer signature used to replace "free"
+
+/** Set the global memory allocation function used internally by the FBX SDK.
+* \param pHandler Function pointer that implements the necessary procedure to allocate memory in the system. */
+FBXSDK_DLL void FbxSetMallocHandler(FbxMallocProc pHandler);
+
+/** Set the global zero'd memory allocation function used internally by the FBX SDK.
+* \param pHandler Function pointer that implements the necessary procedure to allocate zero'd memory in the system. */
+FBXSDK_DLL void FbxSetCallocHandler(FbxCallocProc pHandler);
+
+/** Set the global memory re-allocation function used internally by the FBX SDK.
+* \param pHandler Function pointer that implements the necessary procedure to re-allocate memory in the system. */
+FBXSDK_DLL void FbxSetReallocHandler(FbxReallocProc pHandler);
+
+/** Set the global memory freeing function used internally by the FBX SDK.
+* \param pHandler Function pointer that implements the necessary procedure to free memory in the system. */
+FBXSDK_DLL void FbxSetFreeHandler(FbxFreeProc pHandler);
+
+/** Get the global memory allocation function used internally by the FBX SDK.
+* \return pHandler Function pointer on FBX's internal malloc */
+FBXSDK_DLL FbxMallocProc FbxGetMallocHandler();
+
+/** Get the global zero'd memory allocation function used internally by the FBX SDK.
+* \return pHandler Function pointer on FBX's internal calloc */
+FBXSDK_DLL FbxCallocProc FbxGetCallocHandler();
+
+/** Get the global memory re-allocation function used internally by the FBX SDK.
+* \return pHandler Function pointer on FBX's internal realloc */
+FBXSDK_DLL FbxReallocProc FbxGetReallocHandler();
+
+/** Get the global memory freeing function used internally by the FBX SDK.
+* \return pHandler Function pointer on FBX's internal free */
+FBXSDK_DLL FbxFreeProc FbxGetFreeHandler();
+
+/** Get the default global memory allocation function used internally by the FBX SDK.
+* \return pHandler Function pointer on FBX's internal malloc */
+FBXSDK_DLL FbxMallocProc FbxGetDefaultMallocHandler();
+
+/** Get the default global zero'd memory allocation function used internally by the FBX SDK.
+* \return pHandler Function pointer on FBX's internal calloc */
+FBXSDK_DLL FbxCallocProc FbxGetDefaultCallocHandler();
+
+/** Get the default global memory re-allocation function used internally by the FBX SDK.
+* \return pHandler Function pointer on FBX's internal realloc */
+FBXSDK_DLL FbxReallocProc FbxGetDefaultReallocHandler();
+
+/** Get the default global memory freeing function used internally by the FBX SDK.
+* \return pHandler Function pointer on FBX's internal free */
+FBXSDK_DLL FbxFreeProc FbxGetDefaultFreeHandler();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FBXSDK_DLL size_t FbxAllocSize(size_t pNbItems, size_t pItemSize);
+	FBXSDK_DLL void* FbxMalloc(size_t pSize);
+	FBXSDK_DLL void* FbxCalloc(size_t pCount, size_t pSize);
+	FBXSDK_DLL void* FbxRealloc(void* pData, size_t pSize);
+	FBXSDK_DLL void FbxFree(void* pData);
+	FBXSDK_DLL char* FbxStrDup(const char* pString);
+	FBXSDK_DLL wchar_t* FbxStrDupWC(const wchar_t* pString);
+
+	//These versions of allocators use the default system mallocs, and on Windows we also pass the debugging parameters.
+	//If you define FBXSDK_ALLOC_DEBUG in your project, the FBX SDK will use these debug versions everywhere.
+	FBXSDK_DLL void* FbxMallocDebug(size_t pSize, int pBlock, const char* pFile, int pLine);
+	FBXSDK_DLL void* FbxCallocDebug(size_t pCount, size_t pSize, int pBlock, const char* pFile, int pLine);
+	FBXSDK_DLL void* FbxReallocDebug(void* pData, size_t pSize, int pBlock, const char* pFile, int pLine);
+	FBXSDK_DLL void FbxFreeDebug(void* pData, int pBlock);
+
+	//When FBXSDK_ALLOC_DEBUG is defined, redirect allocation calls to the debug version.
+	#if defined(FBXSDK_ALLOC_DEBUG)
+		#define FbxMalloc(s) FbxMallocDebug(s, _NORMAL_BLOCK, __FILE__, __LINE__)
+		#define FbxCalloc(c, s) FbxCallocDebug(c, s, _NORMAL_BLOCK, __FILE__, __LINE__)
+		#define FbxRealloc(p, s) FbxReallocDebug(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
+		#define FbxFree(p) FbxFreeDebug(p, _NORMAL_BLOCK)
+	#endif
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+
+//! Deletion policy for pointer template classes that uses the delete operator.
+template <class Type> class FbxDeletionPolicyDefault
+{
+public:
+	//! Destruction policy implementation.
+	static inline void DeleteIt(Type** pPtr)
+	{
+		if( *pPtr )
+		{
+			delete *pPtr;
+			*pPtr = NULL;
+		}
+	}
+};
+
+//! Deletion policy for pointer template classes that uses the FbxDelete() function.
+template<typename T> void FbxDelete(T* p);
+template<typename T> void FbxDelete(const T* p);
+template <class Type> class FbxDeletionPolicyDelete
+{
+public:
+	//! Destruction policy implementation.
+	static inline void DeleteIt(Type** mPtr)
+	{
+		if( *mPtr )
+		{
+			FbxDelete(*mPtr);
+			*mPtr = NULL;
+		}
+	}
+};
+
+//! Deletion policy for pointer template classes that uses the FbxFree() function.
+template <class Type> class FbxDeletionPolicyFree
+{
+public:
+	//! Destruction policy implementation.
+	static inline void DeleteIt(Type** pPtr)
+	{
+		if( *pPtr )
+		{
+			FbxFree(*pPtr);
+			*pPtr = NULL;
+		}
+	}
+};
+
+//! Deletion policy for pointer template classes that uses the Destroy() function.
+template <class Type> class FbxDeletionPolicyObject
+{
+public:
+	//! Destruction policy implementation.
+	static inline void DeleteIt(Type** pPtr)
+	{
+		if( *pPtr )
+		{
+			(*pPtr)->Destroy();
+			*pPtr = NULL;
+		}
+	}
+};
+
+/** FbxAutoPtr mimics the \c auto_ptr class template implementation available in the C++ Standard Library. The \c auto_ptr template
+* class describes an object that stores a pointer to a single allocated object of type Type* that ensures that the object to which
+* it points gets destroyed automatically when control leaves a scope. */
+template<class Type, class Policy=FbxDeletionPolicyDefault<Type> > class FbxAutoPtr
+{
+public:
+	//! Construct from a pointer.
+	explicit FbxAutoPtr(Type* pPtr=0) : mPtr(pPtr){}
+
+	//! Destructor.
+	~FbxAutoPtr() { Policy::DeleteIt(&mPtr); }
+
+	//! Retrieve the pointer it holds.
+	inline Type* Get() const { return mPtr; }
+
+	//! Member access operator.
+	inline Type* operator->() const { return mPtr; }
+
+	//! Convert to a Type pointer.
+	inline operator Type* () const { return mPtr; }
+
+	//! Dereference operator.
+	inline Type& operator*() const { return *mPtr; }
+
+	//! Logical not operator.
+	inline bool operator!() const { return mPtr == 0; }
+
+	//! Convert to boolean value.
+	inline operator bool () const { return mPtr != 0; }
+
+	//! Reset the scoped pointer by swapping with another pointer.
+	inline void Reset(Type* pPtr=0)
+	{
+		FBX_ASSERT(pPtr == 0 || pPtr != mPtr);	//Catch self-reset errors
+		FbxAutoPtr<Type, Policy>(pPtr).Swap(*this);
+	}
+
+	//! Swap with another pointer.
+	inline void Swap(FbxAutoPtr& pOther)
+	{
+		Type* TmpPtr = pOther.mPtr;
+		pOther.mPtr = mPtr;
+		mPtr = TmpPtr;
+	}
+
+	//! Release the pointer, so that it won't perform deletion in its destruction.
+	inline Type* Release()
+	{
+		Type* TmpPtr = mPtr;
+		mPtr = NULL;
+		return TmpPtr;
+	}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+	FbxAutoPtr(const FbxAutoPtr&);
+	FbxAutoPtr& operator=(const FbxAutoPtr&);
+
+	Type* mPtr;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+//! Scoped pointer for FbxMalloc allocations, which call FbxFree() to deallocate.
+template <class Type> class FbxAutoFreePtr : public FbxAutoPtr<Type, FbxDeletionPolicyFree<Type> >
+{
+public:
+	//! Construct from a pointer.
+    explicit FbxAutoFreePtr(Type* pPtr=0) : FbxAutoPtr<Type, FbxDeletionPolicyFree<Type> >(pPtr){}
+};
+
+//! Scoped pointer for FbxNew allocations, which call FbxDelete() to deallocate.
+template <class Type> class FbxAutoDeletePtr : public FbxAutoPtr<Type, FbxDeletionPolicyDelete<Type> >
+{
+public:
+	//! Construct from a pointer.
+    explicit FbxAutoDeletePtr(Type* pPtr=0) : FbxAutoPtr<Type, FbxDeletionPolicyDelete<Type> >(pPtr){}
+};
+
+//! Scoped pointer for FbxObject derived classes, which call Destroy() to deallocate.
+template <class Type> class FbxAutoDestroyPtr : public FbxAutoPtr<Type, FbxDeletionPolicyObject<Type> >
+{
+public:
+	//! Construct from a pointer.
+    explicit FbxAutoDestroyPtr(Type* pPtr=0) : FbxAutoPtr<Type, FbxDeletionPolicyObject<Type> >(pPtr){}
+};
+
+
+/** FbxSharedPtr class describes an object that stores a pointer to a single allocated object of type 
+* Type* that ensures that the object to which it points gets destroyed automatically when the control 
+* leaves a scope and the reference count is 0. */
+class RefCount
+{
+public:
+ 	RefCount()	{ Init(); };
+	~RefCount() { Init(); };
+
+	void    Init()   { count = 0; }
+	void	IncRef() { count++; }
+	int	    DecRef() { count--; if (count < 0) count = 0; return count; }
+	
+private:
+	int  count;
+};
+
+template<class Type, class Policy=FbxDeletionPolicyDefault<Type> > class FbxSharedPtr
+{
+public:
+	// Default constructor.
+	FbxSharedPtr() : 
+		mPtr(0),
+		mRef(0)
+	{}
+
+	//! Construct from a pointer.
+	explicit FbxSharedPtr(Type* pPtr) : 
+		mPtr(pPtr),
+		mRef(0)
+	{ 
+		if (pPtr != 0) 
+		{
+			mRef = (RefCount*)FbxMalloc(sizeof(RefCount)); 
+			mRef->Init();
+			mRef->IncRef(); 
+		}
+	}
+
+	//! Copy constructor
+	FbxSharedPtr(const FbxSharedPtr& pSPtr) : 
+		mPtr(pSPtr.mPtr), 
+		mRef(pSPtr.mRef) 
+	{ 
+		if (pSPtr.mPtr != 0 && mRef != 0) 
+			mRef->IncRef(); 
+	}
+
+	// Assignment operator
+	FbxSharedPtr& operator=(const FbxSharedPtr& pSPtr)
+	{
+		if (this != &pSPtr) // avoid self assignment
+		{
+			Reset();
+
+			if (pSPtr.mPtr)
+			{
+				mPtr = pSPtr.mPtr;
+				mRef = pSPtr.mRef;
+				FBX_ASSERT(mRef != NULL);
+				mRef->IncRef();
+			}
+		}
+		return *this;
+	}
+
+	//! Destructor.
+	~FbxSharedPtr() { Destroy(); }
+
+	void Destroy() { Reset(); }
+
+	//! Retrieve the pointer it holds.
+	inline Type* Get() const { return mPtr; }
+
+	//! Member access operator.
+	inline Type* operator->() const { return mPtr; }
+
+	//! Convert to a Type pointer.
+	inline operator Type* () const { return mPtr; }
+
+	//! Dereference operator.
+	inline Type& operator*() const { return *mPtr; }
+
+	//! Logical not operator.
+	inline bool operator!() const { return mPtr == 0; }
+
+	//! Convert to boolean value.
+	inline operator bool () const { return mPtr != 0; }
+
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+	void Reset() 
+	{		
+		if (mRef)
+		{
+			FBX_ASSERT(mPtr != 0);
+			if (mRef->DecRef() == 0)
+			{
+				Policy::DeleteIt(&mPtr); 
+				FbxFree(mRef);
+				mRef = NULL;
+			}
+		}
+	}
+
+	Type* mPtr;
+	RefCount* mRef;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+//! Scoped pointer for FbxMalloc allocations, which call FbxFree() to deallocate.
+template <class Type> class FbxSharedFreePtr : public FbxSharedPtr<Type, FbxDeletionPolicyFree<Type> >
+{
+public:
+	//! Construct from a pointer.
+    explicit FbxSharedFreePtr(Type* pPtr=0) : FbxSharedPtr<Type, FbxDeletionPolicyFree<Type> >(pPtr){}
+};
+
+//! Scoped pointer for FbxNew allocations, which call FbxDelete() to deallocate.
+template <class Type> class FbxSharedDeletePtr : public FbxSharedPtr<Type, FbxDeletionPolicyDelete<Type> >
+{
+public:
+	//! Construct from a pointer.
+    explicit FbxSharedDeletePtr(Type* pPtr=0) : FbxSharedPtr<Type, FbxDeletionPolicyDelete<Type> >(pPtr){}
+};
+
+//! Scoped pointer for FbxObject derived classes, which call Destroy() to deallocate.
+template <class Type> class FbxSharedDestroyPtr : public FbxSharedPtr<Type, FbxDeletionPolicyObject<Type> >
+{
+public:
+	//! Construct from a pointer.
+    explicit FbxSharedDestroyPtr(Type* pPtr=0) : FbxSharedPtr<Type, FbxDeletionPolicyObject<Type> >(pPtr){}
+};
+
+
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_ARCH_ALLOC_H_ */

+ 238 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxarch.h

@@ -0,0 +1,238 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+/** \file fbxarch.h
+  * Architecture definition.
+  * 
+  * List of available preprocessor defines that can appear on various systems:
+  *
+  * Operating System Environment:
+  *    FBXSDK_ENV_WIN (Windows)
+  *    FBXSDK_ENV_WINSTORE (Windows Store App)
+  *    FBXSDK_ENV_MAC (MacOSX)
+  *    FBXSDK_ENV_IOS (iOS)
+  *    FBXSDK_ENV_LINUX (Linux)
+  *
+  * Architecture:
+  *    FBXSDK_ARCH_IX86 (Intel x86)
+  *    FBXSDK_ARCH_AMD64 (AMD64)
+  *    FBXSDK_ARCH_ARM (Advanced RISC Machine)
+  *
+  * Processor:
+  *    FBXSDK_CPU_32 (32bit processor)
+  *    FBXSDK_CPU_64 (64bit processor)
+  *
+  * Compiler:
+  *    FBXSDK_COMPILER_MSC (Microsoft Compiler)
+  *    FBXSDK_COMPILER_GNU (GNU Compiler)
+  *    FBXSDK_COMPILER_INTEL (Intel Compiler)
+  *    FBXSDK_COMPILER_CLANG (Clang Compiler)
+  *
+  * These definitions are based on the information found here:
+  * http://predef.sourceforge.net/index.php
+  *
+  */
+#ifndef _FBXSDK_CORE_ARCH_ARCH_H_
+#define _FBXSDK_CORE_ARCH_ARCH_H_
+
+#if defined(_WIN32) || defined(_WIN64) //Microsoft Windows ------------------------------
+
+	#define FBXSDK_ENV_WIN 1
+
+	#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+		#define FBXSDK_ENV_WINSTORE 1
+	#endif
+
+	#if defined(_M_X64)
+		#define FBXSDK_ARCH_AMD64 1
+		#define FBXSDK_CPU_64 1
+	#elif defined(_M_IX86)
+		#define FBXSDK_ARCH_IX86 1
+		#define FBXSDK_CPU_32 1
+	#elif defined(_M_ARM)
+		#define FBXSDK_ARCH_ARM 1
+		#define FBXSDK_CPU_32 1
+	#else
+		#error Unsupported architecture!
+	#endif
+
+	#if defined(_MSC_VER)
+		#define FBXSDK_COMPILER_MSC 1
+	#elif defined(__GNUC__)
+		#define FBXSDK_COMPILER_GNU 1
+	#elif defined(__ICL)
+		#define FBXSDK_COMPILER_INTEL 1
+	#else
+		#error Unsupported compiler!
+	#endif
+
+#elif defined(__APPLE__) || defined(__MACH__) //Apple MacOS/X ---------------------------
+
+    #include "TargetConditionals.h"
+
+	#define FBXSDK_ENV_MAC 1
+
+    #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
+        #define FBXSDK_ENV_IOS 1
+    #endif
+
+	#if defined(__i386__)
+		#define FBXSDK_ARCH_IX86 1
+		#define FBXSDK_CPU_32 1
+	#elif defined(__x86_64__) || defined(__x86_64)
+		#define FBXSDK_ARCH_AMD64 1
+		#define FBXSDK_CPU_64 1
+	#elif defined(__arm__)
+		#define FBXSDK_ARCH_ARM 1
+		#define FBXSDK_CPU_32 1
+    #elif defined(__arm64__)
+        #define FBXSDK_ARCH_ARM 1
+        #define FBXSDK_CPU_64 1
+	#else
+		#error Unsupported architecture!
+	#endif
+
+	#if defined(__GNUC__)
+		#define FBXSDK_COMPILER_GNU 1
+	#endif
+
+    #if defined(__clang__)
+        #define FBXSDK_COMPILER_CLANG 1
+	#endif
+
+	#if !defined(FBXSDK_COMPILER_GNU) && !defined(FBXSDK_COMPILER_CLANG)
+		#error Unsupported compiler!
+	#endif
+
+#elif defined(__linux__) || defined(__CYGWIN__) || defined(EMSCRIPTEN) || defined(ANDROID) //Linux ---------------------------------
+
+	#define FBXSDK_ENV_LINUX 1
+
+  	#if defined(EMSCRIPTEN)
+  		#define FBXSDK_ENV_EMSCRIPTEN 1
+  	#endif
+
+	#if defined(ANDROID)
+		#define FBXSDK_ENV_ANDROID 1
+	#endif
+
+	#if defined(__i386__)
+		#define FBXSDK_ARCH_IX86 1
+		#define FBXSDK_CPU_32 1
+	#elif defined(__x86_64__) || defined(__x86_64)
+		#define FBXSDK_ARCH_AMD64 1
+		#define FBXSDK_CPU_64 1
+    #elif defined(__arm__)
+		#define FBXSDK_ARCH_ARM 1
+		#define FBXSDK_CPU_32 1
+	#elif defined(EMSCRIPTEN)
+  		#define FBXSDK_ARCH_AMD64 1
+		#define FBXSDK_CPU_64 1
+  	#else
+		#error Unsupported architecture!
+	#endif
+
+	#if defined(__GNUC__)
+		#define FBXSDK_COMPILER_GNU 1
+	#elif defined(EMSCRIPTEN)
+  		#define FBXSDK_COMPILER_EMSCRIPTEN 1 
+	#else
+		#error Unsupported compiler!
+	#endif
+ #else
+	#error Unsupported platform!
+#endif
+
+//---------------------------------------------------------------------------------------
+//Compiler Specifics
+#if defined(FBXSDK_SHARED)
+	#if defined(FBXSDK_COMPILER_MSC) || defined(FBXSDK_COMPILER_INTEL)
+		#define FBXSDK_DLLIMPORT __declspec(dllimport)
+		#define FBXSDK_DLLEXPORT __declspec(dllexport)
+	#elif defined(FBXSDK_COMPILER_GNU) && (__GNUC__ >= 4)
+		#define FBXSDK_DLLIMPORT __attribute__((visibility("default")))
+		#define FBXSDK_DLLEXPORT __attribute__((visibility("default")))
+	#else
+		#define FBXSDK_DLLIMPORT
+		#define FBXSDK_DLLEXPORT
+	#endif
+#else
+	#define FBXSDK_DLLIMPORT
+	#define FBXSDK_DLLEXPORT
+#endif
+
+#ifndef FBXSDK_DLL
+	#define FBXSDK_DLL FBXSDK_DLLIMPORT
+#endif
+
+#if defined(FBXSDK_COMPILER_MSC)
+	#pragma warning(disable : 4251)	//'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
+    #if _MSC_VER >= 1300 // 7.1
+        #define FBX_DEPRECATED __declspec(deprecated)
+    #else
+        #define FBX_DEPRECATED
+    #endif
+#elif defined(FBXSDK_COMPILER_GNU) || defined(FBXSDK_COMPILER_EMSCRIPTEN)
+    #define FBX_DEPRECATED __attribute__((deprecated))
+#elif defined(FBXSDK_COMPILER_INTEL)
+    #if __INTEL_COMPILER >= 810
+        #define FBX_DEPRECATED __declspec(deprecated)
+    #else
+        #define FBX_DEPRECATED
+    #endif
+#else
+	#error Unsupported compiler!
+#endif
+
+#ifdef FBXSDK_COMPILER_CLANG
+	#define FBX_UNUSED(p) _Pragma(FBX_STRINGIFY(unused(p)))
+#else
+	#define FBX_UNUSED(p) (void)(p)
+#endif
+
+//---------------------------------------------------------------------------------------
+//Platform Standardization
+#ifndef NULL
+	#if defined(__GNUG__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
+		#define NULL (__null)
+	#else	
+    	#if defined(__cplusplus)
+    		#define NULL 0
+    	#else
+    		#define NULL ((void*)0)
+    	#endif
+    #endif
+#endif
+
+#if !defined(_MAX_PATH)
+	#define _MAX_PATH 260
+#endif
+
+#if defined(FBXSDK_ENV_WIN)
+	#define snprintf _snprintf //for stdio.h platform compatibility
+#endif
+
+#if !defined(FBXSDK_COMPILER_MSC)
+	#ifndef strcmpi
+		#define strcmpi strcasecmp
+	#endif
+	#ifndef stricmp
+		#define stricmp strcasecmp
+	#endif
+	#ifndef strncmpi
+		#define strncmpi strncasecmp
+	#endif
+	#ifndef strnicmp
+		#define strnicmp strncasecmp
+	#endif
+#endif
+
+#endif /* _FBXSDK_CORE_ARCH_ARCH_H_ */

+ 93 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxdebug.h

@@ -0,0 +1,93 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+/** \file fbxdebug.h
+  * Debugging macros and functions.
+  * 
+  * All macros and functions are removed in release builds. To enable asserts, a debug build is required as well
+  * as the environment variable "FBXSDK_ASSERT" set to 1 is also required. By default, assertions will pop-up
+  * a window. It is possible to disable the pop-up on the Windows platform by calling the following code:
+  * \code
+  * _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
+  * \endcode
+  */
+#ifndef _FBXSDK_CORE_ARCH_DEBUG_H_
+#define _FBXSDK_CORE_ARCH_DEBUG_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** If this environment variable is set to 1, the FBX SDK will assert in debug builds */
+#define FBXSDK_ASSERT_ENVSTR "FBXSDK_ASSERT"
+
+/** The assertion procedure signature. If a different assertion procedure must be provided, it should have this signature.
+* \param pFileName The file name where the assertion occurred.
+* \param pFunctionName The function name where the assertion occurred.
+* \param pLineNumber The line number in the file where the assertion occurred.
+* \param pMessage The message to display when the assertion occurs. */
+typedef void (*FbxAssertProc)(const char* pFileName, const char* pFunctionName, const unsigned int pLineNumber, const char* pMessage);
+
+/** Change the procedure used when assertion occurs.
+* \param pAssertProc The procedure to be called when assertions occurs. */
+FBXSDK_DLL void FbxAssertSetProc(FbxAssertProc pAssertProc);
+
+//! Change the procedure back to the default one.
+FBXSDK_DLL void FbxAssertSetDefaultProc();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+FBXSDK_DLL void _FbxAssert(const char* pFileName, const char* pFunctionName, const unsigned int pLineNumber, bool pFormat, const char* pMessage, ...);
+FBXSDK_DLL void _FbxTrace(const char* pMessage, ...);
+
+#ifdef _DEBUG
+    template <bool x> struct FbxStaticAssertType;
+    template<> struct FbxStaticAssertType<true>			{enum{value=1};};
+    template<> struct FbxStaticAssertType<false>		{enum{value=-1};};
+	#define FBX_ASSERT(Condition)						{if(!(Condition)){_FbxAssert(__FILE__,__FUNCTION__,__LINE__,false,#Condition);}}
+	#define FBX_ASSERT_MSG(Condition, Message, ...)		{if(!(Condition)){_FbxAssert(__FILE__,__FUNCTION__,__LINE__,true,Message,##__VA_ARGS__);}}
+	#define FBX_ASSERT_NOW(Message, ...)				_FbxAssert(__FILE__,__FUNCTION__,__LINE__,true,Message,##__VA_ARGS__);
+	#define FBX_ASSERT_RETURN(Condition)				{if(!(Condition)){FBX_ASSERT_NOW(#Condition); return;}}
+	#define FBX_ASSERT_RETURN_VALUE(Condition, Value)	{if(!(Condition)){FBX_ASSERT_NOW(#Condition); return Value;}}
+	#define FBX_ASSERT_STATIC(Condition)				typedef char FbxBuildBreakIfFalse[FbxStaticAssertType<(bool)(Condition)>::value];
+	#define FBX_TRACE(Message, ...)						{_FbxTrace(Message,##__VA_ARGS__);}
+#else
+	#define FBX_ASSERT(Condition)						((void)0)
+	#define FBX_ASSERT_MSG(Condition, Message, ...)		((void)0)
+	#define FBX_ASSERT_NOW(Message, ...)				((void)0)
+	#define FBX_ASSERT_RETURN(Condition)				if(!(Condition)){return;}
+	#define FBX_ASSERT_RETURN_VALUE(Condition, Value)	if(!(Condition)){return Value;}
+	#define FBX_ASSERT_STATIC(Condition)
+	#define FBX_TRACE(Message, ...)						((void)0)
+#endif
+
+template<typename T> struct FbxIncompatibleWithArray{ enum {value = 0}; };
+
+#define FBXSDK_INCOMPATIBLE_WITH_ARRAY_TEMPLATE(T)\
+	struct FbxIncompatibleWithArray< T >{\
+		union {\
+			T t();\
+		} catcherr;\
+		enum {value = 1};}
+
+#define FBXSDK_INCOMPATIBLE_WITH_ARRAY(T)\
+	template<> FBXSDK_INCOMPATIBLE_WITH_ARRAY_TEMPLATE(T)
+
+#define FBXSDK_IS_INCOMPATIBLE_WITH_ARRAY(T) ((bool) FbxIncompatibleWithArray<T>::value)
+
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_ARCH_DEBUG_H_ */

+ 511 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxnew.h

@@ -0,0 +1,511 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+/** \file fbxnew.h
+  * New operator override templates.
+  *
+  * Instead of overloading the operator new in the FBX SDK, we provide a set of templates
+  * that are used internally to create objects. This mechanic allows the FBX SDK to call
+  * a different memory allocator.
+  * \see FbxSetMallocHandler FbxSetCallocHandler FbxSetReallocHandler FbxSetFreeHandler FbxSetMSizeHandler
+  */
+#ifndef _FBXSDK_CORE_ARCH_NEW_H_
+#define _FBXSDK_CORE_ARCH_NEW_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <new>
+
+#if defined(FBXSDK_COMPILER_MSC)
+	#pragma warning(push)
+	#pragma warning(disable : 4345) //warning C4345: behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized
+#endif
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+//Type traits for primitive types
+template<typename T> struct FbxSimpleType { enum {value = 0}; };
+template<typename T> struct FbxSimpleType<T*> { enum {value = 1}; };
+template<typename T> struct FbxSimpleType<const T> { enum {value = FbxSimpleType<T>::value}; };
+template<typename T, size_t n> struct FbxSimpleType<T[n]> { enum {value = FbxSimpleType<T>::value}; };
+
+#define FBXSDK_DEFINE_SIMPLE_TYPE(T) template<> struct FbxSimpleType<T>{ union {T t;} catcherr; enum {value = 1};}
+
+FBXSDK_DEFINE_SIMPLE_TYPE(bool);
+FBXSDK_DEFINE_SIMPLE_TYPE(char);
+FBXSDK_DEFINE_SIMPLE_TYPE(unsigned char);
+FBXSDK_DEFINE_SIMPLE_TYPE(short);
+FBXSDK_DEFINE_SIMPLE_TYPE(unsigned short);
+FBXSDK_DEFINE_SIMPLE_TYPE(int);
+FBXSDK_DEFINE_SIMPLE_TYPE(unsigned int);
+FBXSDK_DEFINE_SIMPLE_TYPE(long);
+FBXSDK_DEFINE_SIMPLE_TYPE(unsigned long);
+FBXSDK_DEFINE_SIMPLE_TYPE(float);
+FBXSDK_DEFINE_SIMPLE_TYPE(double);
+FBXSDK_DEFINE_SIMPLE_TYPE(long double);
+FBXSDK_DEFINE_SIMPLE_TYPE(long long);
+FBXSDK_DEFINE_SIMPLE_TYPE(unsigned long long);
+
+#define FBXSDK_IS_SIMPLE_TYPE(T) ((bool)FbxSimpleType<T>::value)
+
+template<typename T> T* FbxNew()
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T();
+}
+
+template<typename T, typename T1> T* FbxNew(T1& p1)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1);
+}
+
+template<typename T, typename T1> T* FbxNew(const T1& p1)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1);
+}
+
+template<typename T, typename T1, typename T2> T* FbxNew(T1& p1, T2& p2)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2);
+}
+
+template<typename T, typename T1, typename T2> T* FbxNew(T1& p1, const T2& p2)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2);
+}
+
+template<typename T, typename T1, typename T2> T* FbxNew(const T1& p1, T2& p2)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2);
+}
+
+template<typename T, typename T1, typename T2> T* FbxNew(const T1& p1, const T2& p2)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2);
+}
+
+template<typename T, typename T1, typename T2, typename T3> T* FbxNew(T1& p1, T2& p2, T3& p3)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3);
+}
+
+template<typename T, typename T1, typename T2, typename T3> T* FbxNew(T1& p1, T2& p2, const T3& p3)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3);
+}
+
+template<typename T, typename T1, typename T2, typename T3> T* FbxNew(T1& p1, const T2& p2, T3& p3)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3);
+}
+
+template<typename T, typename T1, typename T2, typename T3> T* FbxNew(T1& p1, const T2& p2, const T3& p3)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3);
+}
+
+template<typename T, typename T1, typename T2, typename T3> T* FbxNew(const T1& p1, T2& p2, T3& p3)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3);
+}
+
+template<typename T, typename T1, typename T2, typename T3> T* FbxNew(const T1& p1, T2& p2, const T3& p3)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3);
+}
+
+template<typename T, typename T1, typename T2, typename T3> T* FbxNew(const T1& p1, const T2& p2, T3& p3)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3);
+}
+
+template<typename T, typename T1, typename T2, typename T3> T* FbxNew(const T1& p1, const T2& p2, const T3& p3)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(T1& p1, T2& p2, T3& p3, T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(T1& p1, T2& p2, T3& p3, const T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(T1& p1, T2& p2, const T3& p3, T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(T1& p1, T2& p2, const T3& p3, const T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(T1& p1, const T2& p2, T3& p3, T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(T1& p1, const T2& p2, T3& p3, const T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(T1& p1, const T2& p2, const T3& p3, T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(T1& p1, const T2& p2, const T3& p3, const T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(const T1& p1, T2& p2, T3& p3, T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(const T1& p1, T2& p2, T3& p3, const T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(const T1& p1, T2& p2, const T3& p3, T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(const T1& p1, T2& p2, const T3& p3, const T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(const T1& p1, const T2& p2, T3& p3, T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(const T1& p1, const T2& p2, T3& p3, const T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1, p2, p3, p4);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(T1& p1, T2& p2, T3& p3, T4& p4, T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, T2& p2, T3& p3, T4& p4, T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, const T2& p2, T3& p3, T4& p4, T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, T2& p2, const T3& p3, T4& p4, T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, T2& p2, T3& p3, const T4& p4, T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, T2& p2, T3& p3, T4& p4, const T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, T4& p4, T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, const T2& p2, T3& p3, const T4& p4, T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, const T2& p2, T3& p3, T4& p4, const T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, T4& p4, const T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5, const T6& p6)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5,p6);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5, const T6& p6, const T7& p7)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5,p6,p7);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5, const T6& p6, const T7& p7, const T8& p8)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5,p6,p7,p8);
+}
+
+template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> T* FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5, const T6& p6, const T7& p7, const T8& p8, const T9& p9)
+{
+	T* p = (T*)FbxMalloc(sizeof(T));
+	return new(p)T(p1,p2,p3,p4,p5,p6,p7,p8,p9);
+}
+
+template<typename T> void FbxDelete(T* p)
+{
+	if( p )
+	{
+		((T*)p)->~T();
+		FbxFree(p);
+	}
+}
+
+template<typename T> void FbxDelete(const T* p)
+{
+	if( p )
+	{
+		((T*)p)->~T();
+		FbxFree(const_cast<T*>(p));
+	}
+}
+
+template<typename T> T* FbxNewArray(const int n)
+{
+	size_t lSize = FbxAllocSize((size_t)n, sizeof(T));
+	if( FBXSDK_IS_SIMPLE_TYPE(T) )
+	{
+		return (T*)FbxMalloc(lSize);
+	}
+	else
+	{
+		void* pTmp = FbxMalloc(lSize + sizeof(int));
+		T* p = (T*)((int*)pTmp+1);
+		*((int*)pTmp) = n;
+		for( int i = 0; i < n; ++i )
+		{
+			new((T*)p+i)T;	//in-place new, not allocating memory so it is safe.
+		}
+		return p;
+	}
+}
+
+template<typename T> void FbxDeleteArray(T* p)
+{
+	if( p )
+	{
+		if( !FBXSDK_IS_SIMPLE_TYPE(T) )
+		{
+			for( int i = 0; i < ((int*)p)[-1]; ++i )
+			{
+				((T*)p)[i].~T();
+			}
+			FbxFree((int*)p-1);
+		}
+		else
+		{
+			FbxFree((void*)p);
+		}
+	}
+}
+
+#define FBXSDK_FRIEND_NEW()\
+	template<typename T>\
+	friend T* FBXSDK_NAMESPACE::FbxNew();\
+	template<typename T, typename T1>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1);\
+	template<typename T, typename T1>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1);\
+	template<typename T, typename T1, typename T2>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, T2& p2);\
+	template<typename T, typename T1, typename T2>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, const T2& p2);\
+	template<typename T, typename T1, typename T2>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2);\
+	template<typename T, typename T1, typename T2>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2);\
+	template<typename T, typename T1, typename T2, typename T3>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, T2& p2, T3& p3);\
+	template<typename T, typename T1, typename T2, typename T3>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, T2& p2, const T3& p3);\
+	template<typename T, typename T1, typename T2, typename T3>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, const T2& p2, T3& p3);\
+	template<typename T, typename T1, typename T2, typename T3>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, const T2& p2, const T3& p3);\
+	template<typename T, typename T1, typename T2, typename T3>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, T3& p3);\
+	template<typename T, typename T1, typename T2, typename T3>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, const T3& p3);\
+	template<typename T, typename T1, typename T2, typename T3>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, T3& p3);\
+	template<typename T, typename T1, typename T2, typename T3>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3);\
+    \
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, T2& p2, T3& p3, T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, T2& p2, T3& p3, const T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, T2& p2, const T3& p3, T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, T2& p2, const T3& p3, const T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, const T2& p2, T3& p3, T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, const T2& p2, T3& p3, const T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, const T2& p2, const T3& p3, T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, const T2& p2, const T3& p3, const T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, T3& p3, T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, T3& p3, const T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, const T3& p3, T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, const T3& p3, const T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, T3& p3, T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, T3& p3, const T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, T4& p4);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4);\
+    \
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(T1& p1, T2& p2, T3& p3, T4& p4, T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, T3& p3, T4& p4, T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, T3& p3, T4& p4, T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, const T3& p3, T4& p4, T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, T3& p3, const T4& p4, T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, T2& p2, T3& p3, T4& p4, const T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, T4& p4, T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, T3& p3, const T4& p4, T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, T3& p3, T4& p4, const T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, T4& p4, const T5& p5);\
+    template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5>\
+    friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5);\
+    \
+	template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5, const T6& p6);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5, const T6& p6, const T7& p7);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5, const T6& p6, const T7& p7, const T8& p8);\
+	template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>\
+	friend T* FBXSDK_NAMESPACE::FbxNew(const T1& p1, const T2& p2, const T3& p3, const T4& p4, const T5& p5, const T6& p6, const T7& p7, const T8& p8, const T9& p9);\
+	template<typename T>\
+	friend void FBXSDK_NAMESPACE::FbxDelete(T* p);\
+	template<typename T>\
+	friend void FBXSDK_NAMESPACE::FbxDelete(const T* p);\
+	template<typename T>\
+	friend T* FBXSDK_NAMESPACE::FbxNewArray(const int n);\
+	template<typename T>\
+	friend void FBXSDK_NAMESPACE::FbxDeleteArray(T* p);
+
+#ifdef FBXSDK_COMPILER_MSC
+	#pragma warning(pop)
+#endif
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_ARCH_NEW_H_ */

+ 97 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxstdcompliant.h

@@ -0,0 +1,97 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+/** \file fbxstdcompliant.h
+* Macros to properly support the CRT secure functions. */
+#ifndef _FBXSDK_CORE_ARCH_STDCOMPLIANT_H_
+#define _FBXSDK_CORE_ARCH_STDCOMPLIANT_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+#if defined(FBXSDK_ENV_WIN)
+	#define FBXSDK_printf							printf_s
+	#define FBXSDK_fprintf							fprintf_s
+	inline int FBXSDK_sprintf(char* dst, size_t dstsize, const char* format, ...){ va_list vl; va_start(vl, format); int ret = vsprintf_s(dst, dstsize, format, vl); va_end(vl); return ret; }
+	inline int FBXSDK_snprintf(char* dst, size_t dstsize, const char* format, ...){ va_list vl; va_start(vl, format); int ret = vsnprintf_s(dst, dstsize, _TRUNCATE, format, vl); va_end(vl); return ret; }
+	inline int FBXSDK_vsprintf(char* dst, size_t dstsize, const char* format, va_list vl){ return vsprintf_s(dst, dstsize, format, vl); }
+	inline int FBXSDK_vsnprintf(char* dst, size_t dstsize, const char* format, va_list vl){ return vsnprintf_s(dst, dstsize, _TRUNCATE, format, vl); }
+	#define FBXSDK_stricmp(dst, src)				_stricmp(dst, src)
+	#define FBXSDK_strnicmp(dst, src, count)		_strnicmp(dst, src, count)
+	#define FBXSDK_strcpy(dst, size, src)			strcpy_s(dst, size, src)
+	#define FBXSDK_strncpy(dst, size, src, count)	strncpy_s(dst, size, src, count)
+	#define FBXSDK_strcat(dst, size, src)			strcat_s(dst, size, src)
+	#define FBXSDK_strtok(str, delim, ctx)			strtok_s(str, delim, ctx)
+	#define FBXSDK_wcscpy(dst, size, src)			wcscpy_s(dst, size, src)
+	#define FBXSDK_wcscat(dst, size, src)			wcscat_s(dst, size, src)
+#if !defined(FBXSDK_ENV_WINSTORE)
+	#define FBXSDK_getpid							_getpid
+	#define FBXSDK_getcwd							_getcwd
+#else
+	inline int FBXSDK_getpid(){ return 0; }
+	inline char* FBXSDK_getcwd(char*,int){ return NULL; }
+#endif
+	#define FBXSDK_localtime(ptm, time)				{ struct tm tms; ptm = &tms; localtime_s(ptm, time); }
+	#define FBXSDK_gmtime(ptm, time)				{ struct tm tms; ptm = &tms; gmtime_s(ptm, time); }
+	#define FBXSDK_fopen(fp, name, mode)			fopen_s(&fp, name, mode)
+
+#elif defined(FBXSDK_ENV_MAC) || defined(FBXSDK_ENV_LINUX)
+	#define FBXSDK_printf							printf
+	#define FBXSDK_fprintf							fprintf
+	inline int FBXSDK_sprintf(char* dst, size_t dstsize, const char* format, ...){ va_list vl; va_start(vl, format); int ret = vsprintf(dst, format, vl); va_end(vl); return ret; }
+	inline int FBXSDK_snprintf(char* dst, size_t dstsize, const char* format, ...){ va_list vl; va_start(vl, format); int ret = vsnprintf(dst, dstsize, format, vl); va_end(vl); return ret; }
+	inline int FBXSDK_vsprintf(char* dst, size_t dstsize, const char* format, va_list vl){ return vsprintf(dst, format, vl); }
+	inline int FBXSDK_vsnprintf(char* dst, size_t dstsize, const char* format, va_list vl){ return vsnprintf(dst, dstsize, format, vl); }
+	#define FBXSDK_stricmp(dst, src)				stricmp(dst, src)
+	#define FBXSDK_strnicmp(dst, src, count)		strnicmp(dst, src, count)
+	#define FBXSDK_strcpy(dst, size, src)			strcpy(dst, src)
+	#define FBXSDK_strncpy(dst, size, src, count)	strncpy(dst, src, count)
+	#define FBXSDK_strcat(dst, size, src)			strcat(dst, src)
+	#define FBXSDK_strtok(str, delim, ctx)			strtok(str, delim)
+	#define FBXSDK_wcscpy(dst, size, src)			wcscpy(dst, src)
+	#define FBXSDK_wcscat(dst, size, src)			wcscat_s(dst, src)
+	#define FBXSDK_getpid							getpid	
+	#define FBXSDK_getcwd							getcwd
+	#define FBXSDK_localtime(tm, time)				tm=localtime(time)
+	#define FBXSDK_gmtime(tm, time)					tm=gmtime(time)
+	#define FBXSDK_fopen(fp, name, mode)			fp=fopen(name, mode)
+
+#else
+	#error Unsupported platform!
+#endif
+
+#define FBXSDK_strdup								FbxStrDup
+
+//The scanf family functions cannot easily be used in both secure and non-secure versions because
+//Microsoft's secure version expects the size of the string/char* arguments following their address.
+//On Unix machines the scanf family functions do not have this behavior and trying to use the same
+//calls would result in compiler errors because the arguments would not match the format string.
+//Using the following macros in the code will simply desable the warning at compile time.
+#if defined(FBXSDK_COMPILER_MSC) && (_MSC_VER >= 1300)
+	#define FBXSDK_CRT_SECURE_NO_WARNING_BEGIN\
+	{\
+		__pragma(warning(push))\
+		__pragma(warning(disable : 4996))\
+	}
+    
+	#define FBXSDK_CRT_SECURE_NO_WARNING_END\
+	{\
+		__pragma(warning(pop))\
+	}
+#else
+	#define FBXSDK_CRT_SECURE_NO_WARNING_BEGIN
+	#define FBXSDK_CRT_SECURE_NO_WARNING_END
+#endif
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_ARCH_STDCOMPLIANT_H_ */

+ 264 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/arch/fbxtypes.h

@@ -0,0 +1,264 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+/** \file fbxtypes.h
+  * Basic types definition.
+  *
+  * Standard basic types used across the FBX SDK. There is also platform independent
+  * definitions that guarantee size across operating systems. The FBXSDK_SYSTEM_IS_LP64
+  * define is set to 1 when the operating system defines the "long" C++ type as 64-bit.
+  */
+#ifndef _FBXSDK_CORE_ARCH_TYPES_H_
+#define _FBXSDK_CORE_ARCH_TYPES_H_
+
+#include <fbxsdk/core/arch/fbxarch.h>
+
+//Note: On MacOSX and Linux 64-bit, long is defined as 64-bits while on Windows
+//it is still a 32-bits for backward compatibility. We stick with Windows standard.
+#if defined(FBXSDK_CPU_64) && !defined(FBXSDK_ENV_WIN)
+	#define FBXSDK_SYSTEM_IS_LP64 1
+#endif
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxObject;
+
+typedef bool			FbxBool;
+typedef signed char		FbxChar;
+typedef unsigned char	FbxUChar;
+typedef signed short	FbxShort;
+typedef unsigned short	FbxUShort;
+typedef signed int		FbxInt;
+typedef unsigned int	FbxUInt;
+typedef float			FbxFloat;
+typedef double			FbxDouble;
+
+typedef FbxBool*		FbxBoolPtr;
+typedef FbxChar*		FbxCharPtr;
+typedef FbxUChar*		FbxUCharPtr;
+typedef FbxShort*		FbxShortPtr;
+typedef FbxUShort*		FbxUShortPtr;
+typedef FbxInt*			FbxIntPtr;
+typedef FbxUInt*		FbxUIntPtr;
+typedef FbxFloat*		FbxFloatPtr;
+typedef FbxDouble*		FbxDoublePtr;
+
+typedef FbxInt			FbxEnum;
+typedef FbxObject*		FbxReference;
+
+//-------------------------------------------------------------------------------------
+//Architecture independent defines (guarantee size)
+#if defined(FBXSDK_COMPILER_MSC)
+	#define FBXSDK_LONGLONG(x)	(x##i64)
+	#define FBXSDK_ULONGLONG(x)	(x##Ui64)
+
+	typedef signed __int8		FbxInt8;
+	typedef unsigned __int8		FbxUInt8;
+	typedef signed __int16		FbxInt16;
+	typedef unsigned __int16	FbxUInt16;
+	typedef signed __int32		FbxInt32;
+	typedef unsigned __int32	FbxUInt32;
+	typedef signed __int64		FbxInt64;
+	typedef unsigned __int64	FbxUInt64;
+#else
+	#define FBXSDK_LONGLONG(x)	(x##LL)
+	#define FBXSDK_ULONGLONG(x)	(x##ULL)
+
+	typedef signed char			FbxInt8;
+	typedef unsigned char		FbxUInt8;
+	typedef signed short		FbxInt16;
+	typedef unsigned short		FbxUInt16;
+	typedef signed int			FbxInt32;
+	typedef unsigned int		FbxUInt32;
+	typedef signed long long	FbxInt64;
+	typedef unsigned long long	FbxUInt64;
+#endif
+
+#ifdef FBXSDK_SYSTEM_IS_LP64
+	typedef signed int			FbxLong;
+	typedef unsigned int		FbxULong;
+#else
+	typedef signed long			FbxLong;
+	typedef unsigned long		FbxULong;
+#endif
+typedef FbxInt64				FbxLongLong;
+typedef FbxUInt64				FbxULongLong;
+
+typedef FbxLong*				FbxLongPtr;
+typedef FbxULong*				FbxULongPtr;
+typedef FbxLongLong*			FbxLongLongPtr;
+typedef FbxULongLong*			FbxULongLongPtr;
+
+
+#if defined(FBXSDK_ENV_EMSCRIPTEN)
+	typedef FbxInt32 			__int32_t;
+	typedef FbxUInt32			__uint32_t;
+	typedef FbxInt64  			__int64_t;
+	typedef FbxUInt64			__uint64_t;
+#endif
+
+//-------------------------------------------------------------------------------------
+//Minimum and Maximum values for types
+#define FBXSDK_CHAR_MIN			-128
+#define FBXSDK_CHAR_MAX			127
+#define FBXSDK_UCHAR_MIN		0
+#define FBXSDK_UCHAR_MAX		255
+#define FBXSDK_SHORT_MIN		-32768
+#define FBXSDK_SHORT_MAX		32767
+#define FBXSDK_USHORT_MIN		0
+#define FBXSDK_USHORT_MAX		65535
+#define FBXSDK_INT_MIN			0x80000000
+#define FBXSDK_INT_MAX			0x7fffffff
+#define FBXSDK_UINT_MIN			0
+#define FBXSDK_UINT_MAX			0xffffffff
+#define FBXSDK_LONG_MIN			FBXSDK_INT_MIN
+#define FBXSDK_LONG_MAX			FBXSDK_INT_MAX
+#define FBXSDK_ULONG_MIN		FBXSDK_UINT_MIN
+#define FBXSDK_ULONG_MAX		FBXSDK_UINT_MAX
+#define FBXSDK_LONGLONG_MIN		FBXSDK_LONGLONG(0x8000000000000000)
+#define FBXSDK_LONGLONG_MAX		FBXSDK_LONGLONG(0x7fffffffffffffff)
+#define FBXSDK_ULONGLONG_MIN	FBXSDK_ULONGLONG(0)
+#define FBXSDK_ULONGLONG_MAX	FBXSDK_ULONGLONG(0xffffffffffffffff)
+#define FBXSDK_FLOAT_MIN		FLT_MIN
+#define FBXSDK_FLOAT_MAX		FLT_MAX
+#define FBXSDK_FLOAT_EPSILON	FLT_EPSILON
+#define FBXSDK_DOUBLE_MIN		DBL_MIN
+#define FBXSDK_DOUBLE_MAX		DBL_MAX
+#define FBXSDK_DOUBLE_EPSILON	DBL_EPSILON
+#define FBXSDK_TOLERANCE		(1.0e-6)
+
+//-------------------------------------------------------------------------------------
+//Handle and atomic definition (size change depending of architecture)
+#if defined(FBXSDK_CPU_32)
+	typedef FbxUInt32			FbxHandle;
+	#define FBXSDK_REF_MIN		FBXSDK_UINT_MIN
+	#define FBXSDK_REF_MAX		FBXSDK_UINT_MAX
+
+	typedef FbxLong				FbxAtomic;
+	#define FBXSDK_ATOMIC_MIN	FBXSDK_LONG_MIN
+	#define FBXSDK_ATOMIC_MAX	FBXSDK_LONG_MAX
+#elif defined(FBXSDK_CPU_64)
+	typedef FbxUInt64			FbxHandle;
+	#define FBXSDK_REF_MIN		FBXSDK_ULONGLONG_MIN
+	#define FBXSDK_REF_MAX		FBXSDK_ULONGLONG_MAX
+
+	typedef FbxInt64			FbxAtomic;
+	#define FBXSDK_ATOMIC_MIN	FBXSDK_LONGLONG_MIN
+	#define FBXSDK_ATOMIC_MAX	FBXSDK_LONGLONG_MAX
+#else
+	#error Unsupported architecture!
+#endif
+
+//-------------------------------------------------------------------------------------
+//Various utility functions for fbxsdk basic types
+inline FbxChar				FbxMin(const FbxChar){ return FBXSDK_CHAR_MIN; }
+inline FbxUChar				FbxMin(const FbxUChar){ return FBXSDK_UCHAR_MIN; }
+inline FbxShort				FbxMin(const FbxShort){ return FBXSDK_SHORT_MIN; }
+inline FbxUShort			FbxMin(const FbxUShort){ return FBXSDK_USHORT_MIN; }
+inline FbxInt				FbxMin(const FbxInt){ return FBXSDK_INT_MIN; }
+inline FbxUInt				FbxMin(const FbxUInt){ return FBXSDK_UINT_MIN; }
+inline FbxLongLong			FbxMin(const FbxLongLong){ return FBXSDK_LONGLONG_MIN; }
+inline FbxULongLong			FbxMin(const FbxULongLong){ return FBXSDK_ULONGLONG_MIN; }
+inline FbxFloat				FbxMin(const FbxFloat){ return FBXSDK_FLOAT_MIN; }
+inline FbxDouble			FbxMin(const FbxDouble){ return FBXSDK_DOUBLE_MIN; }
+
+inline FbxChar				FbxMax(const FbxChar){ return FBXSDK_CHAR_MAX; }
+inline FbxUChar				FbxMax(const FbxUChar){ return FBXSDK_UCHAR_MAX; }
+inline FbxShort				FbxMax(const FbxShort){ return FBXSDK_SHORT_MAX; }
+inline FbxUShort			FbxMax(const FbxUShort){ return FBXSDK_USHORT_MAX; }
+inline FbxInt				FbxMax(const FbxInt){ return FBXSDK_INT_MAX; }
+inline FbxUInt				FbxMax(const FbxUInt){ return FBXSDK_UINT_MAX; }
+inline FbxLongLong			FbxMax(const FbxLongLong){ return FBXSDK_LONGLONG_MAX; }
+inline FbxULongLong			FbxMax(const FbxULongLong){ return FBXSDK_ULONGLONG_MAX; }
+inline FbxFloat				FbxMax(const FbxFloat){ return FBXSDK_FLOAT_MAX; }
+inline FbxDouble			FbxMax(const FbxDouble){ return FBXSDK_DOUBLE_MAX; }
+
+#ifndef FBXSDK_SYSTEM_IS_LP64
+	inline FbxLong			FbxMin(const FbxLong){ return FBXSDK_LONG_MIN; }
+	inline FbxULong			FbxMin(const FbxULong){ return FBXSDK_ULONG_MIN; }
+	inline FbxLong			FbxMax(const FbxLong){ return FBXSDK_LONG_MAX; }
+	inline FbxULong			FbxMax(const FbxULong){ return FBXSDK_ULONG_MAX; }
+#endif
+
+template<class T> inline T	FbxMin(const T){};
+template<class T> inline T	FbxMax(const T){};
+
+template<class T> inline T	FbxMin(const T x, const T y){ return (x < y) ? x : y; }
+template<class T> inline T	FbxMax(const T x, const T y){ return (x > y) ? x : y; }
+
+//-------------------------------------------------------------------------------------
+//Vector Template Types
+template<class T> class FBXSDK_DLL FbxVectorTemplate2
+{
+public:
+	inline FbxVectorTemplate2(){ *this = T(0); }
+	inline explicit FbxVectorTemplate2(T pValue){ *this = pValue; }
+	inline FbxVectorTemplate2(T pData0, T pData1){ mData[0] = pData0; mData[1] = pData1; }
+	inline ~FbxVectorTemplate2(){}
+	inline T& operator[](int pIndex){ return mData[pIndex]; }
+	inline const T& operator[](int pIndex) const { return mData[pIndex]; }
+	inline FbxVectorTemplate2<T>& operator=(const T& pValue){ mData[0] = pValue; mData[1] = pValue; return *this; }
+	inline FbxVectorTemplate2<T>& operator=(const FbxVectorTemplate2<T>& pVector){ mData[0] = pVector.mData[0]; mData[1] = pVector.mData[1]; return *this; }
+	inline bool operator==(const FbxVectorTemplate2<T>& pVector) const { return ((mData[0] == pVector.mData[0]) && (mData[1] == pVector.mData[1])); }
+	inline bool operator!=(const FbxVectorTemplate2<T>& pVector) const { return !operator==( pVector ); }
+	inline T* Buffer(){ return mData; }
+	inline const T* Buffer() const { return mData; }
+	T mData[2];
+};
+
+template<class T> class FBXSDK_DLL FbxVectorTemplate3
+{
+public:
+	inline FbxVectorTemplate3(){ *this = T(0); }
+	inline explicit FbxVectorTemplate3(T pValue){ *this = pValue; }
+	inline FbxVectorTemplate3(T pData0, T pData1, T pData2){ mData[0] = pData0; mData[1] = pData1; mData[2] = pData2; }
+	inline ~FbxVectorTemplate3(){}
+	inline T& operator[](int pIndex) { return mData[pIndex]; }
+	inline const T& operator[](int pIndex) const { return mData[pIndex]; }
+	inline operator FbxVectorTemplate2<T>& () const { return *((FbxVectorTemplate2<T>*)this); }
+	inline FbxVectorTemplate3<T>& operator=(T const &pValue){ mData[0] = pValue; mData[1] = pValue; mData[2] = pValue; return *this; }
+	inline FbxVectorTemplate3<T>& operator=(const FbxVectorTemplate2<T>& pVector){ mData[0] = pVector.mData[0]; mData[1] = pVector.mData[1]; return *this; }
+	inline FbxVectorTemplate3<T>& operator=(const FbxVectorTemplate3<T>& pVector){ mData[0] = pVector.mData[0]; mData[1] = pVector.mData[1]; mData[2] = pVector.mData[2]; return *this; }
+	inline bool operator==(const FbxVectorTemplate3<T>& pVector) const { return ((mData[0] == pVector.mData[0]) && (mData[1] == pVector.mData[1]) && (mData[2] == pVector.mData[2])); }
+	inline bool operator!=(const FbxVectorTemplate3<T>& pVector) const { return !operator==(pVector); }
+	inline T* Buffer(){ return mData; }
+	inline const T* Buffer() const { return mData; }
+	T mData[3];
+};
+
+template<class T> class FBXSDK_DLL FbxVectorTemplate4
+{
+public:
+	inline FbxVectorTemplate4(){ *this = T(0); }
+	inline explicit FbxVectorTemplate4(T pValue){ *this = pValue; }
+	inline FbxVectorTemplate4(T pData0, T pData1, T pData2, T pData3){ mData[0] = pData0; mData[1] = pData1; mData[2] = pData2; mData[3] = pData3; }
+	inline ~FbxVectorTemplate4(){}
+	inline T& operator[](int pIndex){ return mData[pIndex]; }
+	inline const T& operator[](int pIndex) const { return mData[pIndex]; }
+	inline operator FbxVectorTemplate3<T>& () const { return *((FbxVectorTemplate3<T>*)this); }
+	inline FbxVectorTemplate4<T>& operator=(const T& pValue){ mData[0] = pValue; mData[1] = pValue; mData[2] = pValue; mData[3] = pValue; return *this; }
+	inline FbxVectorTemplate4<T>& operator=(const FbxVectorTemplate3<T>& pValue){ mData[0] = pValue[0]; mData[1] = pValue[1]; mData[2] = pValue[2]; return *this; }
+	inline FbxVectorTemplate4<T>& operator=(const FbxVectorTemplate4<T>& pVector){ mData[0] = pVector.mData[0]; mData[1] = pVector.mData[1]; mData[2] = pVector.mData[2]; mData[3] = pVector.mData[3]; return *this; }
+	inline bool operator==(const FbxVectorTemplate4<T>& pVector) const { return ((mData[0] == pVector.mData[0]) && (mData[1] == pVector.mData[1]) && (mData[2] == pVector.mData[2]) && (mData[3] == pVector.mData[3])); }
+	inline bool operator!=(const FbxVectorTemplate4<T>& pVector) const { return !operator==( pVector ); }
+	inline T* Buffer(){ return mData; }
+	inline const T* Buffer() const { return mData; }
+	T mData[4];
+};
+
+typedef FbxVectorTemplate2<FbxDouble> FbxDouble2;
+typedef FbxVectorTemplate3<FbxDouble> FbxDouble3;
+typedef FbxVectorTemplate4<FbxDouble> FbxDouble4;
+typedef FbxVectorTemplate4<FbxDouble4> FbxDouble4x4;
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_ARCH_TYPES_H_ */

+ 489 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxarray.h

@@ -0,0 +1,489 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2017 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxarray.h
+#ifndef _FBXSDK_CORE_BASE_ARRAY_H_
+#define _FBXSDK_CORE_BASE_ARRAY_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Class for array of basic elements such as pointers and basic types. This class will not
+* call constructor and destructor for elements, thus it is not suitable for object references.
+* Memory allocations are always done in a single contiguous memory region. */
+template <class T> class FbxArray
+{
+public:
+	//! Element compare function pointer definition
+	typedef int (*CompareFunc)(const void*, const void*);
+
+	//! Constructor.
+	FbxArray() : mSize(0), mCapacity(0), mArray(NULL){}
+
+	//! Reserve constructor.
+	FbxArray(const int pCapacity) : mSize(0), mCapacity(0), mArray(NULL){ if( pCapacity > 0 ) Reserve(pCapacity); }
+
+	//! Copy constructor.
+	FbxArray(const FbxArray& pArray) : mSize(0), mCapacity(0), mArray(NULL){ *this = pArray; }
+
+	/** Destructor.
+	* \remark The destructor for each element will not be called. */
+	~FbxArray(){ Clear(); }
+
+	/** Insert an element at the given position, growing the array if capacity is not sufficient.
+	* \param pIndex Position where to insert the element. Must be a positive value.
+	* \param pElement Element to insert in the array.
+	* \param pCompact If \c true and capacity is exceeded, grow capacity by one, otherwise double capacity (default).
+	* \return -1 if insert failed, otherwise the position of the inserted element in the array.
+	* \remark If the given index is greater than Size(), the element is appended at the end. Use compact mode only if you need to save memory. */
+	inline int InsertAt(const int pIndex, const T& pElement, bool pCompact=false)
+	{
+		FBX_ASSERT_RETURN_VALUE(pIndex >= 0, -1);
+		int lIndex = FbxMin(pIndex, mSize);
+		if( mSize >= mCapacity )
+		{
+			T lElement = pElement;	//Copy element because we might move memory
+			int lNewCapacity = FbxMax(pCompact ? mCapacity + 1 : mCapacity * 2, 1);	//We always double capacity when not compacting
+			T* lArray = Allocate(lNewCapacity);
+			FBX_ASSERT_RETURN_VALUE(lArray, -1);
+			mArray = lArray;
+			mCapacity = lNewCapacity;
+			return InsertAt(pIndex, lElement);	//Insert copied element because reference might be moved
+		}
+
+		if( lIndex < mSize )	//Move elements to leave a space open to insert the new element
+		{
+			//If pElement is inside memmove range, copy element and insert copy instead
+			if( (&pElement >= &mArray[lIndex]) && (&pElement < &mArray[mSize]) )
+			{
+				T lElement = pElement;
+				return InsertAt(pIndex, lElement);
+			}
+			memmove(&mArray[lIndex + 1], &mArray[lIndex], (mSize - lIndex) * sizeof(T));
+		}
+
+		memcpy(&mArray[lIndex], &pElement, sizeof(T));
+		mSize++;
+
+		return lIndex;
+	}
+
+	/** Append an element at the end of the array, doubling the array if capacity is not sufficient.
+	* \param pElement Element to append to the array.
+	* \return -1 if add failed, otherwise the position of the added element in the array. */
+	inline int Add(const T& pElement)
+	{
+		return InsertAt(mSize, pElement);
+	}
+
+	/** Append an element at the end of array, if not already present, doubling the array if capacity is not sufficient.
+	* \param pElement Element to append to the array.
+	* \return -1 if add failed, otherwise the position of the added element in the array. */
+	inline int AddUnique(const T& pElement)
+	{
+		int lIndex = Find(pElement);
+		return ( lIndex == -1 ) ? Add(pElement) : lIndex;
+	}
+
+	/** Append an element at the end of the array, growing the array by one element if capacity is not sufficient.
+	* \param pElement Element to append to the array.
+	* \return -1 if add failed, otherwise the position of the added element in the array. */
+	inline int AddCompact(const T& pElement)
+	{
+		return InsertAt(mSize, pElement, true);
+	}
+
+	/** Retrieve the number of element contained in the array. To increase the capacity without increasing the size, please use Reserve().
+	* \return The number of element in the array.
+	* \remark The size of the array cannot exceed its capacity. */
+	inline int Size() const { return mSize; }
+
+	/** Retrieve the current allocated memory capacity of the array.
+	* \return The capacity of the array in number of element.
+	* \remark The capacity will always be greater or equal to its size. */
+	inline int Capacity() const { return mCapacity; }
+
+	/** Retrieve a reference of the element at given index position in the array.
+	* \param pIndex Position of element in the array.
+	* \return A reference to the element at the specified position in the array.
+	* \remark No error will be thrown if the index is out of bounds. */
+	inline T& operator[](const int pIndex) const
+	{
+	#ifdef _DEBUG
+		FBX_ASSERT_MSG(pIndex >= 0, "Index is out of range!");
+		if( pIndex >= mSize )
+		{
+			if( pIndex < mCapacity )
+			{
+				FBX_ASSERT_NOW("Index is out of range, but not outside of capacity! Call SetAt() to use reserved memory.");
+			}
+			else FBX_ASSERT_NOW("Index is out of range!");
+		}
+	#endif
+		return (T&)mArray[pIndex];
+	}
+
+	/** Retrieve a copy of the element at given index position in the array.
+	* \param pIndex Position of element in the array.
+	* \return The value of the element at the specified position in the array.
+	* \remark No error will be thrown if the index is out of bounds. */
+	inline T GetAt(const int pIndex) const
+	{
+		return operator[](pIndex);
+	}
+
+	/** Retrieve a copy of the first element.
+	* \return Copy of the first element.
+	* \remark The array should have at least one element and no error will be thrown if the array is empty. */
+	inline T GetFirst() const
+	{
+		return GetAt(0);
+	}
+
+	/** Retrieve a copy of the last element.
+	* \return Copy of the last element.
+	* \remark The array should have at least one element and no error will be thrown if the array is empty. */
+	inline T GetLast() const
+	{
+		return GetAt(mSize-1);
+	}
+
+	/** Find first matching element, from first to last.
+	* \param pElement The element to be compared to each of the elements.
+	* \param pStartIndex The position to start searching from.
+	* \return Position of first matching element or -1 if there is no matching element. */
+	inline int Find(const T& pElement, const int pStartIndex=0) const
+	{
+		FBX_ASSERT_RETURN_VALUE(pStartIndex >= 0, -1);
+		for( int i = pStartIndex; i < mSize; ++i )
+		{
+			if( operator[](i) == pElement ) return i;
+		}
+		return -1;
+	}
+
+	/** Find first matching element, from last to first.
+	* \param pElement The element to be compared to each of the elements.
+	* \param pStartIndex The position to start searching from.
+	* \return Position of first matching element or -1 if there is no matching element. */
+	inline int FindReverse(const T& pElement, const int pStartIndex=FBXSDK_INT_MAX) const
+	{
+		for( int i = FbxMin(pStartIndex, mSize-1); i >= 0; --i )
+		{
+			if( operator[](i) == pElement ) return i;
+		}
+		return -1;
+	}
+
+	/** Request for allocation of additional memory without inserting new elements. After the memory has been reserved, please use SetAt() to initialize elements.
+	* \param pCapacity The number of additional element memory allocation requested.
+	* \return \c true if the memory allocation succeeded or if the capacity is unchanged, \c false otherwise.
+	* \remark If the requested capacity is less than or equal to the current capacity, this call has no effect. In either case, Size() is unchanged. */
+	inline bool Reserve(const int pCapacity)
+	{
+		FBX_ASSERT_RETURN_VALUE(pCapacity > 0, false);
+		if( pCapacity > mCapacity )
+		{
+			T* lArray = Allocate(pCapacity);
+			FBX_ASSERT_RETURN_VALUE(lArray, false);
+			mArray = lArray;
+			mCapacity = pCapacity;
+
+			//Initialize new memory to zero
+			memset(&mArray[mSize], 0, (mCapacity - mSize) * sizeof(T));
+		}
+		return true;
+	}
+
+	/** Set the element at given position in the array.
+	* \param pIndex Position of element in the array.
+	* \param pElement The new element.
+	* \remark If the index is outside range, and outside capacity, this call has no effect. However, if index is
+	* within capacity range, element count is increased such that Size() will become pIndex + 1. */
+	inline void SetAt(const int pIndex, const T& pElement)
+	{
+		FBX_ASSERT_RETURN(pIndex >= 0 && pIndex < mCapacity);
+		if( pIndex >= mSize ) mSize = pIndex + 1;
+		if( mArray ) memcpy(&mArray[pIndex], &pElement, sizeof(T));
+	}
+
+	/** Set the value of the first element.
+	* \param pElement The new value of the last element.
+	* \remark The array should have at least one element and no error will be thrown if the array is empty. */
+	inline void SetFirst(const T& pElement)
+	{
+		SetAt(0, pElement);
+	}
+
+	/** Set the value of the last element.
+	* \param pElement The new value of the last element.
+	* \remark The array should have at least one element and no error will be thrown if the array is empty. */
+	inline void SetLast(const T& pElement)
+	{
+		SetAt(mSize-1, pElement);
+	}
+
+	/** Remove an element at the given position in the array.
+	* \param pIndex Position of the element to remove.
+	* \return Removed element.
+	* \remark No error will be thrown if the index is out of bounds. */
+	inline T RemoveAt(const int pIndex)
+	{
+		T lElement = GetAt(pIndex);
+		if( pIndex + 1 < mSize )
+		{
+			memmove(&mArray[pIndex], &mArray[pIndex + 1], (mSize - pIndex - 1) * sizeof(T));
+		}
+		mSize--;
+		return lElement;
+	}
+
+	/** Remove the first element in the array.
+	* \return Removed element.
+	* \remark The array should have at least one element and no error will be thrown if the array is empty. */
+	inline T RemoveFirst()
+	{
+		return RemoveAt(0);
+	}
+
+	/** Remove the last element in the array.
+	* \return Removed element.
+	* \remark The array should have at least one element and no error will be thrown if the array is empty. */
+	inline T RemoveLast()
+	{
+		return RemoveAt(mSize-1);
+	}
+
+	/** Remove first matching element in the array.
+	* \param pElement Element to be removed.
+	* \return \c true if a matching element is found and removed, \c false otherwise. */
+	inline bool RemoveIt(const T& pElement)
+	{
+		int Index = Find(pElement);
+		if( Index >= 0 )
+		{
+			RemoveAt(Index);
+			return true;
+		}
+		return false;
+	}
+
+	/** Remove a range of elements at the given position in the array.
+	* \param pIndex Begin position of the elements to remove.
+	* \param pCount The count of elements to remove.
+	* \return \c true if successful, otherwise \c false. */
+	inline void RemoveRange(const int pIndex, const int pCount)
+	{
+		FBX_ASSERT_RETURN(pIndex >= 0);
+		FBX_ASSERT_RETURN(pCount >= 0);
+		if( pIndex + pCount < mSize )
+		{
+			memmove(&mArray[pIndex], &mArray[pIndex + pCount], (mSize - pIndex - pCount) * sizeof(T));
+		}
+		mSize -= pCount;
+	}
+
+	/** Inserts or erases elements at the end such that Size() becomes pSize, increasing capacity if needed. Please use SetAt() to initialize any new elements.
+	* \param pSize The new count of elements to set the array to. Must be greater or equal to zero.
+	* \return \c true if the memory (re)allocation succeeded, \c false otherwise.
+	* \remark If the requested element count is less than or equal to the current count, elements are freed from memory. Otherwise, the array grows and elements are unchanged. */
+	inline bool Resize(const int pSize)
+	{
+		if( pSize == mSize && mSize == mCapacity ) return true;
+
+		if( pSize == 0 )
+		{
+			Clear();
+			return true;
+		}
+
+		FBX_ASSERT_RETURN_VALUE(pSize > 0, false);
+		if( pSize != mCapacity )
+		{
+			T* lArray = Allocate(pSize);
+			FBX_ASSERT_RETURN_VALUE(lArray, false);
+			mArray = lArray;
+		}
+
+		if( pSize > mCapacity )	//Initialize new memory to zero
+		{
+			memset(&mArray[mSize], 0, (pSize - mSize) * sizeof(T));
+		}
+
+		mSize = pSize;
+		mCapacity = pSize;
+		return true;
+	}
+
+	/** Increase size of array by the specified size.
+	* \param pSize The size to add to the array size.
+	* \return \c true if operation succeeded, \c false otherwise. */
+	inline bool Grow(const int pSize)
+	{
+		return Resize(mSize + pSize);
+	}
+
+	/** Reduce size of array by the specified size.
+	* \param pSize The size to remove from the array size.
+	* \return \c true if operation succeeded, \c false otherwise. */
+	inline bool Shrink(const int pSize)
+	{
+		return Resize(mSize - pSize);
+	}
+
+	/** Compact the array so that its capacity is the same as its size.
+	* \return \c true if operation succeeded, \c false otherwise. */
+	inline bool Compact()
+	{
+		return Resize(mSize);
+	}
+
+	/** Reset the number of element to zero and free the memory allocated.
+	* \remark This only free the memory allocated by the array, and doesn't call the destructor of each element. */
+	inline void Clear()
+	{
+		if( mArray != NULL )
+		{
+			mSize = 0;
+			mCapacity = 0;
+			FbxFree(mArray);
+			mArray = NULL;
+		}
+	}
+
+	/** Sort the array using the specified compare function pointer
+	* \param pCompareFunc The compare function to use to sort elements. */
+	inline void Sort(CompareFunc pCompareFunc)
+	{
+		qsort(mArray, mSize, sizeof(T), pCompareFunc);
+	}
+
+	//! Get pointer to internal array of elements.
+	inline T* GetArray() const { return mArray ? (T*)mArray : NULL; }
+
+	//! Cast operator.
+	inline operator T* (){ return mArray ? (T*)mArray : NULL; }
+
+	/** Append another array at the end of this array.
+	* \param pOther The other array to append to this array. */
+	inline void AddArray(const FbxArray<T>& pOther)
+	{
+		if( Grow(pOther.mSize) )
+		{
+			memcpy(&mArray[mSize - pOther.mSize], pOther.mArray, pOther.mSize * sizeof(T));
+		}
+	}
+
+	/** Append the elements of another array at the end of this array if they are not present.
+	* \param pOther Another array. */
+	inline void AddArrayNoDuplicate(const FbxArray<T>& pOther)
+	{
+		for( int i = 0, c = pOther.mSize; i < c; ++i )
+		{
+			AddUnique(pOther[i]);
+		}
+	}
+
+	/** Remove the elements of another array from this array is they are present.
+	* \param pOther Another array. */
+	inline void RemoveArray(const FbxArray<T>& pOther)
+	{
+		for( int i = 0, c = pOther.mSize; i < c; ++i )
+		{
+			RemoveIt(pOther[i]);
+		}
+	}
+
+	/** Operator to copy elements of an array.
+	* \return this array containing a copy of pOther elements. */
+	inline FbxArray<T>& operator=(const FbxArray<T>& pOther)
+	{
+		if( this != &pOther )
+		{
+			if( Resize(pOther.mSize) )
+			{
+				memcpy(mArray, pOther.mArray, pOther.mSize * sizeof(T));
+			}
+		}
+		return *this;
+	}
+
+	/** Operator to compare elements of an array.
+	* \return \c true if the two arrays are equal, otherwise \c false. */
+	inline bool operator==(const FbxArray<T>& pOther) const
+	{
+		if( this == &pOther ) return true;
+		if( mSize != pOther.mSize ) return false;
+		return memcmp(mArray, pOther.mArray, sizeof(T) * mSize) == 0;
+	}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	inline int GetCount() const { return mSize; }
+
+private:
+	inline T* Allocate(const int pCapacity)
+	{
+		return (T*)FbxRealloc(mArray, FbxAllocSize(pCapacity, sizeof(T)));
+	}
+
+	int	mSize;
+	int	mCapacity;
+	T*	mArray;
+
+#if defined(FBXSDK_COMPILER_MSC)
+    //Previously class FbxArray is for pointers. Somehow, it's used to store other types. Here's a compile-time checking for known incompatible classes.
+    //If it happens you find new incompatible ones, declare them with macro FBXSDK_INCOMPATIBLE_WITH_ARRAY. Also see file fbxstring.h.
+    FBX_ASSERT_STATIC(FBXSDK_IS_SIMPLE_TYPE(T) || __is_enum(T) || (__has_trivial_constructor(T)&&__has_trivial_destructor(T)) || !FBXSDK_IS_INCOMPATIBLE_WITH_ARRAY(T));
+#endif
+
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+//! Call FbxFree on each element of the array, and then clear it.
+template <class T> inline void FbxArrayFree(FbxArray<T>& pArray)
+{
+	for( int i = 0, c = pArray.Size(); i < c; ++i )
+	{
+		FbxFree(pArray[i]);
+	}
+	pArray.Clear();
+}
+
+//! Call FbxDelete on each element of the array, and then clear it.
+template <class T> inline void FbxArrayDelete(FbxArray<T>& pArray)
+{
+	for( int i = 0, c = pArray.Size(); i < c; ++i )
+	{
+		FbxDelete(pArray[i]);
+	}
+	pArray.Clear();
+}
+
+//! Call Destroy on each element of the array, and then clear it.
+template <class T> inline void FbxArrayDestroy(FbxArray<T>& pArray)
+{
+	for( int i = 0, c = pArray.Size(); i < c; ++i )
+	{
+		(pArray[i])->Destroy();
+	}
+	pArray.Clear();
+}
+
+//! Make sure to break build if someone try to make FbxArray<FbxArray<T>>, which is not supported.
+template <class T> FBXSDK_INCOMPATIBLE_WITH_ARRAY_TEMPLATE(FbxArray<T>);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_ARRAY_H_ */

+ 90 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxbitset.h

@@ -0,0 +1,90 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxbitset.h
+#ifndef _FBXSDK_CORE_BASE_BITSET_H_
+#define _FBXSDK_CORE_BASE_BITSET_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** An automatic growing array of bit.
+  *
+  * The bit array will automatically grow when specifying bit indexes that are greater
+  * than the array size when calling SetBit or UnsetBit. Indexes can vary from 0 to
+  * FBXSDK_UINT_MAX-1. When an invalid index is returned from any functions, FBXSDK_UINT_MAX
+  * is returned. The bit array is not thread safe.
+  */
+class FBXSDK_DLL FbxBitSet
+{
+public:
+	/** Constructor.
+	  * \param pInitialSize Initial bit array size in bit count (not in byte count!).
+	  */
+	FbxBitSet(const FbxUInt pInitialSize=0);
+
+	//! Destructor.
+	virtual ~FbxBitSet();
+
+	/** Set the bit at the specified bit index to true regardless of its current value.
+	  * \param pBitIndex The bit index in the array in the range of [0, FBXSDK_UINT_MAX-1].
+	  */
+	void SetBit(const FbxUInt pBitIndex);
+
+	/** Set all the bits to the specified value regardless of their current value.
+	  * \param pValue The boolean value to set to all bits.
+	  */
+	void SetAllBits(const bool pValue);
+
+	/** Set the bit at the specified bit index to false regardless of its current value.
+	  * \param pBitIndex The bit index in the array in the range of [0, FBXSDK_UINT_MAX-1].
+	  */
+	void UnsetBit(const FbxUInt pBitIndex);
+
+	/** Get the bit boolean value at the specified bit index.
+	  * \param pBitIndex The bit index in the array in the range of [0, FBXSDK_UINT_MAX-1].
+	  * \return True if the bit is set, false otherwise.
+	  */
+	bool GetBit(const FbxUInt pBitIndex) const;
+
+	/** Get the bit index of the first bit that is currently set.
+	  * \return The bit index of the first set bit, FBXSDK_UINT_MAX if none found.
+	  */
+	FbxUInt GetFirstSetBitIndex() const;
+
+	/** Get the bit index of the last bit that is currently set.
+	  * \return The bit index of the last set bit, FBXSDK_UINT_MAX if none found.
+	  */
+	FbxUInt GetLastSetBitIndex() const;
+
+	/** Get the bit index of the next set bit after the specified bit index.
+	  * \param pBitIndex The start bit index in the array in the range of [0, FBXSDK_UINT_MAX-1].
+	  * \return The bit index of the next set bit, FBXSDK_UINT_MAX if none found.
+	  */
+	FbxUInt GetNextSetBitIndex(const FbxUInt pBitIndex) const;
+
+	/** Get the bit index of the previous set bit before the specified bit index.
+	  * \param pBitIndex The start bit index in the array in the range of [0, FBXSDK_UINT_MAX-1].
+	  * \return The bit index of the previous set bit, FBXSDK_UINT_MAX if none found.
+	  */
+	FbxUInt GetPreviousSetBitIndex(const FbxUInt pBitIndex) const;
+
+private:
+	void Grow(const FbxUInt pNewSize);
+
+	void* mData;
+	FbxUInt mSize;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_BITSET_H_ */

+ 95 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxcharptrset.h

@@ -0,0 +1,95 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxcharptrset.h
+#ifndef _FBXSDK_CORE_BASE_CHARPTRSET_H_
+#define _FBXSDK_CORE_BASE_CHARPTRSET_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** This class contains the data structure support for char pointer set.
+  */
+class FBXSDK_DLL FbxCharPtrSet
+{
+public:
+	/** Class constructor
+	* \param pItemPerBlock Number of item per block. Default is 20. */
+	FbxCharPtrSet(int pItemPerBlock=20);
+
+	//! Class destructor
+	~FbxCharPtrSet();
+
+	/** Add a new item.
+	* \param pReference char pointer reference to the item.
+	* \param pItem FbxHandle to the item. */
+	void Add(const char* pReference, FbxHandle pItem);
+
+	/** Removes an item.
+	* \param pReference char reference to the item.
+	* \return true if successful. */
+	bool Remove(const char* pReference);
+
+	/** Get an item's reference.
+	* \param pReference char reference to the item.
+	* \param PIndex index to the item.
+	* \return FbxHandle to the item, NULL if fails. */
+	FbxHandle Get(const char* pReference, int* PIndex=NULL);
+
+	/** Get an item's reference from index.
+	* \param pIndex index to the item.
+	* \return FbxHandle to the item, NULL if fails. */
+	FbxHandle& operator[](int pIndex);
+
+	/** Get an item's reference from index.
+	* \param pIndex index to the item.
+	* \param pReference char reference to the item.
+	* \return FbxHandle to the item, NULL if fails. */
+	FbxHandle GetFromIndex(int pIndex, const char** pReference=NULL);
+
+	/** Removes an item by index.
+	* \param pIndex index to the item. */
+	void RemoveFromIndex(int pIndex);
+
+	/** Get the number of item in the array.
+	* \return the number of element in the set. */
+	inline int GetCount() const { return mCharPtrSetCount; }
+
+	//! Sorts the array.
+	void Sort();
+
+	//! Clears the array.
+	void Clear();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	struct CharPtrSet;
+
+	inline void SetCaseSensitive(bool pIsCaseSensitive){ mIsCaseSensitive = pIsCaseSensitive; }
+
+private:
+	CharPtrSet*	FindEqual(const char* pReference) const;
+
+	CharPtrSet*	mCharPtrSetArray;
+	int			mCharPtrSetCount;
+	int			mBlockCount;
+	int			mItemPerBlock;
+	bool		mIsChanged;
+	bool		mIsCaseSensitive;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_CHARPTRSET_H_ */

+ 213 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxcontainerallocators.h

@@ -0,0 +1,213 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxcontainerallocators.h
+#ifndef _FBXSDK_CORE_BASE_CONTAINER_ALLOCATORS_H_
+#define _FBXSDK_CORE_BASE_CONTAINER_ALLOCATORS_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** An allocator class for use as a template parameter to one of the
+  * container class (FbxMap, FbxSet, FbxDynamicArray...) must implement these.
+  */
+class FBXSDK_DLL FbxBaseAllocator
+{
+public:
+	/** The class constructor.  
+	  * \param pRecordSize the size of one record held by the container. 
+	  * \remarks The parameter pRecordSize is not necessarily the same 
+	  *  size as of the value type, since the
+	  *  container may wrap the value into a private class.
+	  */
+	FbxBaseAllocator(const size_t pRecordSize) :
+		mRecordSize(pRecordSize)
+	{
+	}
+
+	/** This tells the allocator that we are about to call AllocateRecords
+	  * one or many times to allocate pRecordCount records. 
+	  * \param pRecordCount
+	  * \remarks This gives the allocator a chance to do whatever it deems necessary
+	  * to optimize subsequent allocations, for example, by preallocating a
+	  * sufficiently large pool of memory.
+	  */
+	void Reserve(const size_t /*pRecordCount*/)
+	{
+		// By default, ignore all preallocating requests.
+	}
+
+	/** Returns a pointer to a uninitialized continuous block of memory
+	  * able to hold pRecordCount * pRecordSize  bytes.  
+	  * \param pRecordCount
+	  * \remarks pRecordSize was defined in the Constructor description, above.
+	  */
+	void* AllocateRecords(const size_t pRecordCount=1)
+	{
+		return FbxMalloc(FbxAllocSize(pRecordCount, mRecordSize));
+	}
+
+	/** Frees a block of memory returned by AllocateRecords. 
+	  * \param pRecord
+	  */
+	void FreeMemory(void* pRecord)
+	{
+		FbxFree(pRecord);
+	}
+
+	/** \return the size of each record allocated. 
+	  */
+	size_t GetRecordSize() const
+	{
+		return mRecordSize;
+	}
+
+private:
+	size_t mRecordSize;
+};
+
+/** This allocator only frees the allocated memory when it is deleted.
+  * This is a good allocator for building dictionaries, where we only
+  * add things to a container, but never remove them.
+  */
+class FbxHungryAllocator
+{
+public:
+	FbxHungryAllocator(size_t pRecordSize) :
+		mRecordSize(pRecordSize),
+		mRecordPoolSize(0),
+		mData(NULL)
+	{
+	}
+
+	FbxHungryAllocator(const FbxHungryAllocator& pOther) :
+		mRecordSize(pOther.mRecordSize),
+		mRecordPoolSize(pOther.mRecordPoolSize),
+		mData(NULL)
+	{
+	}
+
+	~FbxHungryAllocator()
+	{
+		MemoryBlock* lCurrent = mData;
+		MemoryBlock* lNext = lCurrent ? lCurrent->mNextBlock : 0;
+		while (lCurrent)
+		{
+			FbxDelete(lCurrent);
+			lCurrent = lNext;
+			lNext = lCurrent ? lCurrent->mNextBlock : 0;
+		}
+	}
+
+	void Reserve(const size_t pRecordCount)
+	{
+		MemoryBlock* lMem = FbxNew< MemoryBlock >(pRecordCount* mRecordSize);
+		lMem->mNextBlock = mData;
+		mData = lMem;
+		mRecordPoolSize += pRecordCount;
+	}
+
+	void* AllocateRecords(const size_t pRecordCount = 1)
+	{
+		MemoryBlock* lBlock = mData;
+		void* lRecord = NULL;
+
+		while( (lBlock != NULL) && ((lRecord = lBlock->GetChunk(pRecordCount * mRecordSize)) == NULL) )
+		{
+			lBlock = lBlock->mNextBlock;
+		}
+
+		if( lRecord == NULL )
+		{
+			size_t lNumRecordToAllocate = mRecordPoolSize / 8 == 0 ? 2 : mRecordPoolSize / 8;
+			if( lNumRecordToAllocate < pRecordCount )
+			{
+				lNumRecordToAllocate = pRecordCount;
+			}
+			Reserve(lNumRecordToAllocate);
+			lRecord = AllocateRecords(pRecordCount);
+		}
+		return lRecord;
+	}
+
+	void FreeMemory(void* /*pRecord*/)
+	{
+		// "Hungry": release memory only when the allocator is destroyed.
+	}
+
+	size_t GetRecordSize() const
+	{
+		return mRecordSize;
+	}
+
+	FbxHungryAllocator& operator=(const FbxHungryAllocator& pOther)
+	{
+		if( this != &pOther )
+		{
+			// The next call to AllocateRecords() may skip over currently reserved
+			// records if the size changes drastically, but otherwise GetChunk()
+			// is size-oblivious.
+			if( mRecordSize < pOther.mRecordSize )
+			{
+				mRecordPoolSize = 0;
+			}
+
+			mRecordSize = pOther.mRecordSize;
+		}
+		return(*this);
+	}
+
+private:
+	class MemoryBlock
+	{
+	public:
+		MemoryBlock(size_t pSize) :
+			mNextBlock(NULL),
+			mData(NULL),
+			mFreeData(NULL),
+			mEnd(NULL)
+		{
+			mData = FbxMalloc(pSize);
+			mFreeData = mData;
+			mEnd = reinterpret_cast<char*>(mData) + pSize;
+		}
+
+		~MemoryBlock()
+		{
+			FbxFree(mData);
+		}
+
+		void* GetChunk(const size_t pSize)
+		{
+			if( reinterpret_cast<char*>(mFreeData) + pSize < mEnd )
+			{
+				void* lChunk = mFreeData;
+				mFreeData = reinterpret_cast<char*>(mFreeData) + pSize;
+				return lChunk;
+			}
+			return NULL;
+		}
+
+		MemoryBlock*	mNextBlock;
+		void*			mData;
+		void*			mFreeData;
+		void*			mEnd;
+	};
+
+	size_t			mRecordSize;
+	size_t			mRecordPoolSize;
+	MemoryBlock*	mData;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_CONTAINER_ALLOCATORS_H_ */

+ 324 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxdynamicarray.h

@@ -0,0 +1,324 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxdynamicarray.h
+#ifndef _FBXSDK_CORE_BASE_DYNAMICARRAY_H_
+#define _FBXSDK_CORE_BASE_DYNAMICARRAY_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxcontainerallocators.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Template class for dynamic array holding objects.
+  * \nosubgrouping
+  * \see FbxStaticArray
+  */
+template <typename Type, typename Allocator=FbxBaseAllocator> class FbxDynamicArray
+{
+public:
+	//! Default constructor.
+	FbxDynamicArray() :
+		mArray(NULL),
+		mCapacity(0),
+		mSize(0),
+		mAllocator(sizeof(Type))
+	{
+	}
+
+	/** Constructor.
+	* \param pInitialSize initial capacity of this array */
+	FbxDynamicArray(const size_t pInitialSize) :
+		mArray(NULL),
+		mCapacity(0),
+		mSize(0),
+		mAllocator(sizeof(Type))
+	{
+		Reserve(pInitialSize);
+	}
+
+	/** Copy constructor.
+	* \remarks The copy constructor of \c Type will be 
+	* invoked in order to copy the value of elements to the
+	* new array.
+	*/
+	FbxDynamicArray(const FbxDynamicArray& pArray) :
+		mArray(NULL),
+		mCapacity(0),
+		mSize(0),
+		mAllocator(sizeof(Type))
+	{
+		Reserve(pArray.mCapacity);
+		CopyArray(mArray, pArray.mArray, pArray.mSize);
+		mSize = pArray.mSize;
+	}
+
+	//! Destructor.
+	~FbxDynamicArray()
+	{
+		for( size_t i = 0; i < mSize; ++i )
+		{
+			mArray[i].~Type();
+		}
+		mAllocator.FreeMemory(mArray);
+	}
+
+	//! Gets the current capacity of the array.
+	size_t Capacity() const
+	{
+		return mCapacity;
+	}
+
+	//! Gets the size of the array.
+	size_t Size() const
+	{
+		return mSize;
+	}
+
+	/** Assures that sufficient memory is allocated to hold n objects in the array, and increases the capacity if necessary.
+	* \param pCount Number of objects to reserve */
+	void Reserve(const size_t pCount)
+	{
+		if( pCount > mCapacity )
+		{
+			//We don't use mAllocator.PreAllocate, because we want our array to be continuous in memory.
+			Type* lNewArray = (Type*)mAllocator.AllocateRecords(pCount);
+			MoveArray(lNewArray, mArray, mSize);
+			mAllocator.FreeMemory(mArray);
+			mArray = lNewArray;
+			mCapacity = pCount;
+		}
+	}
+
+	/** Appends n objects at the end of the array.
+	* \param pItem object to append
+	* \param pNCopies number of copies to append */
+	void PushBack(const Type& pItem, const size_t pNCopies = 1)
+	{
+		if( mSize + pNCopies > mCapacity )
+		{
+			size_t lNewSize = mCapacity + mCapacity / 2;	//grow by 50%
+			if( mSize + pNCopies > lNewSize )
+			{
+				lNewSize = mSize + pNCopies;
+			}
+			Reserve(lNewSize);
+		}
+		FBX_ASSERT(mSize + pNCopies <= mCapacity);
+		Fill(mArray + mSize, pItem, pNCopies);
+		mSize += pNCopies;
+	}
+
+	/** Inserts n objects at the specified position.
+	* \param pIndex position index
+	* \param pItem object to insert
+	* \param pNCopies number of copies to append */
+	void Insert(const size_t pIndex, const Type& pItem, const size_t pNCopies=1)
+	{
+		FBX_ASSERT(pIndex >= 0);
+		FBX_ASSERT(pIndex <= mSize);
+		Type lValue = pItem; // in case pItem is in array
+		if( pNCopies == 0 )
+		{
+		}
+		else if( pIndex >= mSize )
+		{
+			PushBack(pItem, pNCopies);
+		}
+		else if( mSize + pNCopies > mCapacity )
+		{
+			size_t lNewSize = mCapacity + mCapacity / 2;	//not enough room, grow by 50%
+			if( mSize + pNCopies > lNewSize )
+			{
+				lNewSize = mSize + pNCopies;
+			}
+
+			Type* lNewArray = (Type*)mAllocator.AllocateRecords(lNewSize);
+			MoveArray(lNewArray, mArray, pIndex); // copy prefix
+			Fill(lNewArray + pIndex, pItem, pNCopies); // copy values
+			MoveArray(lNewArray + pIndex + pNCopies, mArray + pIndex, mSize - pIndex); // copy suffix
+			mAllocator.FreeMemory(mArray);
+			mArray = lNewArray;
+			mSize += pNCopies;
+			mCapacity = lNewSize;
+		}
+		else
+		{
+			// copy suffix backwards
+			MoveArrayBackwards(mArray + pIndex + pNCopies, mArray + pIndex, mSize - pIndex);
+			Fill(mArray + pIndex, pItem, pNCopies); // copy values
+			mSize += pNCopies;
+		}
+	}
+
+	/** Removes n objects at the end.
+	* \param pNElements number of objects to remove */
+	void PopBack(size_t pNElements=1)
+	{
+		FBX_ASSERT(pNElements <= mSize);
+		for( size_t i = mSize - pNElements; i < mSize; ++i )
+		{
+			mArray[i].~Type();
+		}
+		mSize -= pNElements;
+	}
+
+	/** Removes n objects at the specified position.
+	* \param pIndex position index
+	* \param pNElements number of objects to remove */
+	void Remove(const size_t pIndex, size_t pNElements=1)
+	{
+		FBX_ASSERT(pIndex >= 0);
+		FBX_ASSERT(pIndex <= mSize);
+		FBX_ASSERT(pIndex + pNElements <= mSize);
+		if( pIndex + pNElements >= mSize )
+		{
+			PopBack(pNElements);
+		}
+		else
+		{            
+			for( size_t i = pIndex; i < pIndex + pNElements; ++i )
+			{
+				mArray[i].~Type();
+			}
+			MoveOverlappingArray(&mArray[pIndex], &mArray[pIndex + pNElements], mSize - pIndex - pNElements);
+			mSize -= pNElements;
+		}
+	}
+
+	/** Gets nth object in the array.
+	* \param pIndex position index */
+	Type& operator[](const size_t pIndex)
+	{
+		return mArray[pIndex];
+	}
+
+	/** Gets nth object in the array.
+	* \param pIndex position index */
+	const Type& operator[](const size_t pIndex) const
+	{
+		return mArray[pIndex];
+	}
+
+	/** Retrieve the first item in the array.
+	* \return The first item in the array. */
+	Type& First()
+	{
+		return operator[](0);
+	}
+
+	/** Retrieve the first item in the array.
+	* \return The first item in the array. */
+	const Type& First() const
+	{
+		return operator[](0);
+	}
+
+	/** Retrieve the last item in the array.
+	* \return The last item in the array. */
+	Type& Last()
+	{
+		return operator[](mSize-1);
+	}
+
+	/** Retrieve the last item in the array.
+	* \return The last item in the array. */
+	const Type& Last() const
+	{
+		return operator[](mSize-1);
+	}
+
+	/** Find first matching element, from first to last.
+	* \param pItem The item to try to find in the array.
+	* \param pStartIndex The index to start searching from.
+	* \return Index of the first matching item, otherwise returns -1 (equivalent of SIZE_MAX for size_t). */
+	size_t Find(const Type& pItem, const size_t pStartIndex=0) const
+	{
+		for( size_t i = pStartIndex; i < mSize; ++i )
+		{
+			if( operator[](i) == pItem ) return i;
+		}
+		return -1;
+	}
+
+	/** Assignment operator.
+	* \remarks The copy constructor of \c Type will be invoked in order to copy the value of elements to the new array. */
+	FbxDynamicArray& operator=(const FbxDynamicArray& pArray)
+	{
+		Reserve(pArray.mCapacity);
+		CopyArray(mArray, pArray.mArray, pArray.mSize);
+		mSize = pArray.mSize;
+		return *this;
+	}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+	static void CopyArray(Type* pDest, const Type* pSrc, size_t pCount)
+	{
+		for( int i = 0; i < int(pCount); i++ )
+		{
+			new(&(pDest[i])) Type(pSrc[i]);	//in-place new won't allocate memory, so it is safe
+		}
+	}
+
+	static void MoveArray(Type* pDest, const Type* pSrc, size_t pCount)
+	{
+		for( int i = 0; i < int(pCount); i++ )
+		{
+			new(&(pDest[i])) Type(pSrc[i]);	//in-place new won't allocate memory, so it is safe
+		}
+
+		for( int i = 0; i < int(pCount); i++ )
+		{
+			pSrc[i].~Type();
+		}
+	}
+
+	static void MoveOverlappingArray(Type* pDest, const Type* pSrc, size_t pCount)
+	{
+		for( int i = 0; i < int(pCount); i++ )
+		{
+			new(&(pDest[i])) Type(pSrc[i]);	//in-place new won't allocate memory, so it is safe
+			pSrc[i].~Type();
+		}
+	}
+
+	static void MoveArrayBackwards(Type* pDest, const Type* pSrc, size_t pCount)
+	{
+		for( int i = 0; i < int(pCount); ++i )
+		{
+			new(&(pDest[pCount-1-i])) Type(pSrc[pCount-1-i]);	//in-place new won't allocate memory, so it is safe
+			pSrc[pCount-1-i].~Type();
+		}
+	}
+
+	static void Fill(Type* pDest, const Type& pItem, size_t pCount)
+	{
+		for( int i = 0; i < int(pCount); i++ )
+		{
+			new(&(pDest[i])) Type(pItem);	//in-place new won't allocate memory, so it is safe
+		}
+	}
+
+    Type*		mArray;
+    size_t		mCapacity;
+    size_t		mSize;
+    Allocator	mAllocator;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_DYNAMICARRAY_H_ */

+ 257 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxfile.h

@@ -0,0 +1,257 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxfile.h
+#ifndef _FBXSDK_CORE_BASE_FILE_H_
+#define _FBXSDK_CORE_BASE_FILE_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxStream;
+
+/**
+    Class for interfacing with files, providing a similar interface for files independant of the OS or filesystem.
+*/
+class FBXSDK_DLL FbxFile
+{
+public:
+	enum EMode {eNone, eReadOnly, eReadWrite, eCreateWriteOnly, eCreateReadWrite, eCreateAppend};
+	enum ESeekPos {eBegin, eCurrent, eEnd};
+
+    FbxFile();
+    virtual ~FbxFile();
+
+	/** Opens a file on disk using the specified read/write mode.
+	  * \param pFileName_UTF8 Filename in UTF8 (compatible with ASCII)
+      * \param pMode Mode in which to open the file, e.g. eReadOnly, eCreateReadWrite, etc.
+      * \param pBinary Whether the file is to be opened in binary or text mode.
+	  * \return True if opening is successful.
+	  */
+    virtual bool        Open(const char* pFileName_UTF8, const EMode pMode=eCreateReadWrite, const bool pBinary=true);
+
+	/** Opens a file from a data stream using the specified read/write mode.
+	  * \param pStream Stream instance with which the file will be read/written
+      * \param pStreamData User-defined data to pass as a parameter to the stream's Open() method.
+      * \param pMode Deprecated/Unused.
+	  * \return True if opening is successful.
+	  */
+    virtual bool        Open(FbxStream* pStream, void* pStreamData, const char* pMode);
+
+	/** Closes a file, freeing its handle.
+	  * \return True if closing is successful.
+	  */
+    virtual bool        Close();
+
+    /** Seek to a specific position in the file, starting from either beginning, current position or end
+	  * \param pOffset Offset to seek to (advance the file position cursor) starting from pSeekPos
+      * \param pSeekPos Starting position from which to seek to.  Beginning, current position or end.
+	  */
+    virtual void		Seek(const FbxInt64 pOffset, const ESeekPos pSeekPos=eBegin);
+
+	/** Returns the position at which the file cursor currently is.  For example, will be ==0 for beginning and ==FileSize for end.
+	  * \return The position at which the file cursor currently is.
+	  */
+    virtual FbxInt64	Tell() const;
+
+	/** Read a part of the file into a buffer
+      * \param pDstBuf Pre-allocated buffer in which to read data
+      * \param pSize Size of the data chunk to be read in bytes
+	  * \return Number of bytes read.
+	  */
+    virtual	size_t		Read(void* pDstBuf, const size_t pSize);
+
+	/** Read a part of the file as a string into a buffer
+      * \param pDstBuf Pre-allocated buffer in which to read the string
+      * \param pDstSize Size of the data chunk to be read in characters
+      * \param pStopAtFirstWhiteSpace If true, will stop reading at first white space, otherwise it will stop at the first line feed (\n)
+	  * \return Pointer on the data read.  Equivalent to parameter pDstBuf
+	  */
+	virtual char*		ReadString(char* pDstBuf, const size_t pDstSize, bool pStopAtFirstWhiteSpace=false);
+
+	/** Write a buffer to an opened file
+      * \param pSrcBuf Pre-allocated buffer from which to write data
+      * \param pSize Size of the data chunk to be written in bytes
+	  * \return Number of bytes written.
+	  */
+    virtual size_t		Write(const void* pSrcBuf, const size_t pSize);
+
+	/** Write a formatted string to an opened file
+      * \param pFormat Pre-allocated format buffer from which to write data
+      * \param ... Variable number of arguments describing the values in the previous parameter. 
+	  * \return True if data was successfully written
+	  */
+    virtual bool		WriteFormat(const char* pFormat, ...);
+
+	/** Modify the size of a file. Null characters ('\0') are appended if the file is extended. 
+      * If the file is truncated, all data from the end of the shortened file to the original length of the file is lost.
+      * Please note that this function considers the current file cursor as the beginning of the file.
+      * It is therefore required to use Seek(0) prior to calling it if we want the size specified by the
+      * pSize parameter to be absolute.
+      * \param pSize New desired file size
+	  * \return True if file was successfully truncated
+	  */
+    virtual bool		Truncate(const FbxInt64 pSize);
+
+	/** Checks whether the current file cursor position is at the end of file.
+	  * \return True if the cursor is at the end of file, false otherwise.
+	  */
+    virtual bool		EndOfFile() const;
+
+	/** Gets the size of the currently opened file.
+	  * \return File size
+	  */
+	virtual FbxInt64	GetSize();
+
+    /** Unused function in this default implementation.  Must be implemented by memory files.       
+      * \param pMemPtr Unused
+	  * \param pSize Unused
+	  */
+	virtual void		GetMemoryFileInfo(void** pMemPtr, size_t pSize);
+
+	/** Checks whether the file is currently opened.
+	  * \return True if file is opened, false otherwise
+	  */
+    bool                IsOpen() const;
+
+	/** Checks whether the file is currently opened with a user-provided streaming interface instead of just the file name
+	  * \return True if file has been opened with a stream interface, false otherwise
+	  */
+    bool                IsStream() const;
+
+	/** Returns the full file path name, as provided when opening it.
+	  * \return File full path
+	  */
+    const char*			GetFilePathName() const;
+
+	/** Returns the mode with which the file was opened, when calling the Open() method.
+	  * \return Mode with which the file was opened
+	  */
+    EMode				GetFileMode() const;
+
+	/** Returns last encountered error when performing any operation on the file.
+	  * \return Last error code
+	  */
+    int                 GetLastError();
+
+	/** Resets the current error code and the end of file indicator of the opened file
+	  */
+    void                ClearError();
+
+protected:
+	FILE*				mFilePtr;
+    FbxStream*          mStreamPtr;
+	bool                mIsOpen;
+	bool                mIsStream;
+	EMode				mMode;
+	FbxString			mFileName;
+};
+
+class FBXSDK_DLL FbxFileUtils
+{
+public:
+	/** Delete a file from disk.
+	  * \param pFileName_UTF8 The file to be deleted.
+	  * \return True if delete is successful.
+	  */
+    static bool Delete(const char* pFileName_UTF8);
+
+	/** Rename a file on disk.
+	  * \param pFileName_UTF8 The file to be renamed.
+	  * \param pNewName_UTF8 The new file name upon rename.
+	  * \return True if rename is successful.
+	  */
+    static bool Rename(const char* pFileName_UTF8, const char* pNewName_UTF8);
+
+	/** Copy one file's content to another file (if the destination file not exist, it will be created).
+	  * \param pDestination_UTF8 The destination file path
+	  * \param pSource_UTF8 The source file path
+	  * \return Return true if copy is successfully.
+	  */
+	static bool Copy(const char* pDestination_UTF8, const char* pSource_UTF8);
+
+	//! Get given file's size.
+	static FbxInt64 Size(const char* pFilePath_UTF8);
+
+	/** Find if the specified file exist.
+	  * \param pFilePath_UTF8 The file path to test against.
+	  * \return Returns true if the file exist.
+	  */
+	static bool Exist(const char* pFilePath_UTF8);
+
+	/** Find if the specified file is in read-only mode.
+	  * \param pFilePath_UTF8 The file path to test against.
+	  * \return Returns true if the file is in read-only mode.
+	  */
+	static bool IsReadOnly(const char* pFilePath_UTF8);
+
+	// We return a KLong that in fact is a cast of a time_t.
+	//! Get given file's last date.
+	static FbxLong GetLastDate(const char* pPath_UTF8);
+
+	//! Set the given file's last date as the given date.
+	static bool SetLastDate(const char* pPath_UTF8, FbxLong pTime);
+
+	/** Get some content of a file.
+	  * \param pStr The content get from file.
+	  * \param pSize The size of content.
+	  * \param pStream The opened stream of file.
+	  */
+	static char* FGets(char* pStr, int pSize, FILE* pStream);
+};
+
+template<class T> inline const T FbxSwab(const T x)
+{
+	switch( sizeof(x) )
+	{
+		case 2:
+		{
+			FbxUInt8 t[2];
+			t[0] = ((FbxUInt8*)&x)[1];
+			t[1] = ((FbxUInt8*)&x)[0];
+			return *(T*)&t;
+		}
+
+		case 4:
+		{
+			FbxUInt8 t[4];
+			t[0] = ((FbxUInt8*)&x)[3];
+			t[1] = ((FbxUInt8*)&x)[2];
+			t[2] = ((FbxUInt8*)&x)[1];
+			t[3] = ((FbxUInt8*)&x)[0];
+			return *(T*)&t;
+		}
+
+		case 8:
+		{
+			FbxUInt8 t[8];
+			t[0] = ((FbxUInt8*)&x)[7];
+			t[1] = ((FbxUInt8*)&x)[6];
+			t[2] = ((FbxUInt8*)&x)[5];
+			t[3] = ((FbxUInt8*)&x)[4];
+			t[4] = ((FbxUInt8*)&x)[3];
+			t[5] = ((FbxUInt8*)&x)[2];
+			t[6] = ((FbxUInt8*)&x)[1];
+			t[7] = ((FbxUInt8*)&x)[0];
+			return *(T*)&t;
+		}
+
+		default:
+			return x;
+	}
+}
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_FILE_H_ */

+ 80 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxfolder.h

@@ -0,0 +1,80 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxfolder.h
+#ifndef _FBXSDK_CORE_BASE_FOLDER_H_
+#define _FBXSDK_CORE_BASE_FOLDER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#ifndef FBXSDK_ENV_WINSTORE
+
+#include <fbxsdk/core/base/fbxstring.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Class for iterating into file system folders and the items contained. */
+class FBXSDK_DLL FbxFolder
+{
+public:
+	//! The different entry type that can be found in folders.
+	enum EEntryType
+	{
+		eRegularEntry,	//!< Regular entry, such as file.
+		eFolderEntry	//!< Folder entry that potentially contain more files.
+	};
+
+	/** Open the specified folder for browsing its content.
+	* \param pFolderPath_UTF8 The folder path to open.
+	* \return True if the folder path was successfully open, false otherwise. */
+	bool Open(const char* pFolderPath_UTF8);
+
+	/** Get the next item in the folder.
+	* \return True if another item was found after the current one. */
+	bool Next();
+
+	/** Get the type of the current entry in the folder.
+	* \return The entry type. */
+	EEntryType GetEntryType() const;
+
+	/** Retrieve the name of the current entry in the folder.
+	* \return The name of the current entry. */
+	FbxString GetEntryName() const;
+
+	/** Retrieve the extension name of the current entry.
+	* \return The extension name of the current entry. */
+	char* GetEntryExtension() const;
+
+	/** Close the folder when done browsing its content. */
+	void Close();
+
+	/** Find out if the folder was successfully opened the last time Open was called.
+	* \return True if the folder is currently open. */
+	bool IsOpen() const;
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxFolder();
+	~FbxFolder();
+
+private:
+	struct FolderImpl;
+	FolderImpl* mImpl;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE */
+
+#endif /* _FBXSDK_CORE_BASE_FOLDER_H_ */

+ 411 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxhashmap.h

@@ -0,0 +1,411 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxhashmap.h
+#ifndef _FBXSDK_CORE_BASE_HASHMAP_H_
+#define _FBXSDK_CORE_BASE_HASHMAP_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxarray.h>
+#include <fbxsdk/core/base/fbxmap.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+template<class T> class FbxNoOpDestruct { public: static inline void DoIt(T&) {} };
+template<class T> class FbxPtrDestruct  { public: static inline void DoIt(T& v) { FbxDelete(v); v = NULL; } };
+
+//True if equal, false otherwise
+template<class T> class FbxDefaultComparator{ public: static inline bool CompareIt( const T& t1, const T& t2 ) { return t1 == t2; } };
+
+/** \brief This object represents a standard hash map.  You must provide the typename of KEY and VALUE as well
+    as the typename of the class that contains the hash function to use to hash values.   The hash class must
+    overload operator() and be built like this.
+    \code
+    class SimpleHash
+    {
+    public:
+        inline unsigned int operator() ( const int pKey ) const
+        {
+            return pKey;
+        }
+    };
+    \endcode
+  * \nosubgrouping
+  */
+template< typename KEY, typename VALUE, typename HASH, class Destruct = FbxNoOpDestruct<VALUE>, class Comparator = FbxDefaultComparator<KEY> >
+class FbxHashMap
+{
+public:
+	typedef KEY KeyType;
+	typedef VALUE ValueType;
+	typedef HASH HashFunctorType;
+
+private:
+
+	class ListItem
+	{
+	public:
+		ListItem* mNext;
+		ValueType mValue;
+		KeyType mKey;
+
+		ListItem()
+			:
+		mNext(NULL)
+		{
+		}
+
+        ~ListItem()
+        {
+            Destruct::DoIt(mValue);        
+        }
+	};
+
+public:
+    /**
+    Iterate through every element in a hash map.
+    */
+	class Iterator
+	{
+	public:
+
+		typedef ListItem ListItemType;
+		typedef FbxPair< KeyType, ValueType > KeyValuePair;
+
+        /**
+        Copy constructor
+        */
+		Iterator( const Iterator& pOther )
+			:
+			mMap( pOther.mMap ),
+			mBucketIndex( pOther.mBucketIndex ),
+			mCurrentItem( pOther.mCurrentItem )
+		{
+
+		}
+
+        /**
+        Destructor
+        */
+		~Iterator(){};
+
+        /**
+        Used to dereference an iterator and give it a behavior more similar to a pointer.
+        \return The KeyValuePair currently referenced by the iterator
+        */
+		KeyValuePair operator*() const
+		{
+			KeyValuePair lItem;
+
+			if( mCurrentItem )
+			{
+				lItem.mFirst = mCurrentItem->mKey;
+				lItem.mSecond = mCurrentItem->mValue;
+				return lItem;
+			}
+
+			FBX_ASSERT_NOW("Accessing out of bounds iterator");
+
+			return lItem;
+		}
+
+        /**
+        Advances the iterator to the next keyvaluepair in the hashmap.  It does not wrap around so 
+        advancing after reaching the last element will not point back to the first one.
+        */
+		void Next()
+		{
+			if( !mCurrentItem )
+				return;
+
+			if( mCurrentItem->mNext )
+			{
+				mCurrentItem = mCurrentItem->mNext;
+				return;
+			}
+			else
+			{
+				mBucketIndex++;
+				for( ; mBucketIndex < mMap->mBuckets.GetCount(); ++mBucketIndex )
+				{
+					if( mMap->mBuckets[ mBucketIndex ] )
+					{
+						mCurrentItem = mMap->mBuckets[ mBucketIndex ];
+						return;
+					}
+				}
+				
+				if( mBucketIndex >= mMap->mBuckets.GetCount() )
+				{
+					*this = mMap->End();
+					return;
+				}
+			}
+		}
+
+        /**
+        Check equivalence between two iterators.  There are 3 conditions for equivalence between 2 iterators:
+        1) Item being referenced by the iterator must be equivalent
+        2) They must point at the same index
+        3) They must point on the same map
+        \return true if both iterators are equal, false otherwise
+        */
+		bool operator==( const Iterator& pOther ) const
+		{
+			return	mCurrentItem == pOther.mCurrentItem && 
+					mBucketIndex == pOther.mBucketIndex &&
+					mMap == pOther.mMap;
+		}
+
+        /**
+        Check inequivalence between 2 iterators.  Please see operator== for more information.
+        \return true if both iterators are NOT equal, false if they are
+        */
+		bool operator!=( const Iterator& pOther ) const
+		{
+			return !(*this == pOther);
+		}
+
+		/**
+        Assign the current iterator to the one on the right hand side of the operator.  After assignment they will
+        reference the same object, at the same index, in the same map.
+        \return The new iterator
+        */
+		Iterator& operator=( const Iterator& pOther )
+		{
+			this->mBucketIndex = pOther.mBucketIndex;
+			this->mMap = pOther.mMap;
+			this->mCurrentItem = pOther.mCurrentItem;
+			return *this;
+		}
+
+    private:
+		const FbxHashMap* mMap;		
+
+		int mBucketIndex;
+		ListItemType* mCurrentItem;
+		
+		Iterator(const FbxHashMap* pMap, int pBucketIndex, ListItemType* pCurrentItem)
+			:
+			mMap( pMap ),
+			mBucketIndex(pBucketIndex),
+			mCurrentItem(pCurrentItem)
+		{
+
+		}
+
+		friend class FbxHashMap;
+	};
+	
+	/**
+    Construct a FbxHashMap with an user-defined maximum number of elements.
+    \param pBucketSize Initial maximum number of elements.
+    */
+	FbxHashMap( int pBucketSize )
+	{
+		mBuckets.Resize( pBucketSize );
+	}
+
+	/**
+    Construct a FbxHashMap with the default maximum number of elements (30)
+    */
+    FbxHashMap()
+    {
+        mBuckets.Resize(30);
+    }
+
+	/**
+    Clear all elements in the hash map before destroying itself
+    */
+	~FbxHashMap()
+	{
+		Clear();
+		mBuckets.Clear();
+	}
+
+	/**
+    Calls operator delete on all elements of the hashmap, de-allocating all memory and destroying them
+    */
+	void Clear()
+	{
+		for( int i = 0; i < mBuckets.GetCount(); ++i)
+		{
+			if( mBuckets[i] )
+			{
+				ListItem* lNext = mBuckets[i]->mNext;
+				while( lNext )
+				{
+					ListItem* lNextNext = lNext->mNext;
+					FbxDelete(lNext);
+					lNext = lNextNext;
+				}
+
+				FbxDelete(mBuckets[i]);
+				mBuckets[i] = NULL;
+			}
+		}
+	}
+
+	/**
+    Find an element in the hashmap.  If no element exist with the specified key, returns an iterator pointing on the
+    end of the map (not an actual KeyValuePair).
+    \param pKey The value of the key corresponding to the element
+    \return An Iterator referencing that element
+    */
+	const Iterator Find( const KeyType& pKey ) const
+	{
+		unsigned int lIndex = mHashFunctor(pKey);
+		lIndex = lIndex % mBuckets.GetCount();
+		ListItem* lItem = mBuckets[lIndex];
+		while( lItem )
+		{
+            if( Comparator::CompareIt( lItem->mKey, pKey ) )
+			{
+				Iterator lIt( this, lIndex, lItem );
+				return lIt;
+			}
+			lItem = lItem->mNext;
+		}
+		
+		return End();
+	}
+	
+	/**
+    Remove an element in the hashmap.
+    \param pKey The key value of the element to remove
+    \return The value of the element that was just deleted.  If the element does not exist, a value created with its default constructor will be returned
+    */
+	VALUE Remove( const KEY& pKey )
+    {
+		unsigned int lIndex = mHashFunctor(pKey);
+		lIndex = lIndex % mBuckets.GetCount();
+		ListItem* lItem = mBuckets.GetAt(lIndex);
+        ListItem* lLastItem = NULL;
+		
+        while( lItem )
+		{
+			if( lItem->mKey == pKey )
+			{
+                if( lLastItem )
+                    lLastItem->mNext = lItem->mNext;
+
+                if( mBuckets.GetAt(lIndex) == lItem ) 
+                    mBuckets.SetAt(lIndex, lItem->mNext );
+
+                VALUE lValue = lItem->mValue;
+                FbxDelete(lItem);
+                
+                return lValue;
+			}
+
+            lLastItem = lItem;
+			lItem = lItem->mNext;
+		}
+		
+        return VALUE();
+    }
+
+    /** Add or retrieve a KeyValuePair from the Hashmap.  If there is already an entry in the map for an element
+    with key value specified in parameter, the value will be returned.  Otherwise, a new entry will be created
+    with this key value and the default value for ValueType will be returned.  It can be modified using the 
+    assignment operator
+    \param pKey The key for which to retrieve/add a value.
+    \return Value of the element referenced by the key specified in parameter.
+    */
+	ValueType& operator[]( const KeyType& pKey )
+	{
+        unsigned int lIndex = 0;
+		Iterator lIt = InternalFind( pKey, lIndex);
+		if( lIt != End() )
+		{
+			return lIt.mCurrentItem->mValue;
+		}
+
+		lIndex = lIndex % mBuckets.GetCount();
+		ListItem* lItem = FbxNew< ListItem >();
+		lItem->mNext = NULL;
+		lItem->mKey = pKey;
+
+		if( !mBuckets.GetAt(lIndex) )
+		{
+			mBuckets.SetAt(lIndex, lItem);
+		}
+		else
+		{
+			lItem->mNext = mBuckets.GetAt(lIndex);
+			mBuckets.SetAt(lIndex, lItem);
+		}
+
+		return lItem->mValue;
+	}
+
+    /** Returns an iterator pointing on the first non-null element in the map
+    \return An iterator pointing on the first non-null element in the map.
+    */
+	Iterator Start() const
+	{
+		for( int i = 0; i < mBuckets.GetCount(); ++i )
+		{
+			if( mBuckets[i] )
+			{
+				Iterator lIt( this, i, mBuckets[i] );
+				return lIt;
+			}
+		}
+
+		return End();
+	}
+
+    /** Returns an iterator pointing on the last element in the map.  This is not an actual KeyValuePair but 
+    * but an iterator pointing on a null element. 
+    \return Iterator pointing on a null value at the end of the map
+    */
+	Iterator End() const
+	{
+		Iterator lIt( this, 0, NULL );
+		return lIt;
+	}
+
+private:
+
+    // Avoid calculating the hashvalue twice
+	const Iterator InternalFind( const KeyType& pKey, unsigned int& pOutCalculatedIndex ) const
+	{
+		pOutCalculatedIndex = mHashFunctor(pKey);
+		unsigned int lIndex = pOutCalculatedIndex % mBuckets.GetCount();
+		ListItem* lItem = mBuckets[lIndex];
+		while( lItem )
+		{
+            if( Comparator::CompareIt( lItem->mKey, pKey ) )
+			{
+				Iterator lIt( this, lIndex, lItem );
+				return lIt;
+			}
+			lItem = lItem->mNext;
+		}
+		
+		return End();
+	}
+
+
+	// not implemented yet!
+	FbxHashMap( const FbxHashMap& pOther ) {};
+
+	FbxArray<ListItem*> mBuckets;
+	HashFunctorType mHashFunctor;
+
+	friend class Iterator;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_HASHMAP_H_ */

+ 262 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxintrusivelist.h

@@ -0,0 +1,262 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxintrusivelist.h
+#ifndef _FBXSDK_CORE_BASE_INTRUSIVE_LIST_H_
+#define _FBXSDK_CORE_BASE_INTRUSIVE_LIST_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+#define FBXSDK_INTRUSIVE_LIST_NODE(Class, NodeCount)\
+    public: inline FbxListNode<Class>& GetListNode(int index = 0){ return this->mNode[index]; }\
+    private: FbxListNode<Class> mNode[NodeCount];
+
+template <typename T> class FbxListNode
+{
+    typedef FbxListNode<T> NodeT; 
+
+public:
+	explicit FbxListNode(T* pData = 0):mNext(0),mPrev(0),mData(pData){}
+	~FbxListNode(){ Disconnect(); }
+
+	void Disconnect()
+	{
+		if ( mPrev != 0 )
+			mPrev->mNext = mNext;
+
+		if ( mNext != 0 )
+			mNext->mPrev = mPrev;
+
+		mPrev = mNext = 0;
+	}
+
+	NodeT*	mNext;
+	NodeT*	mPrev;
+	T*		mData;
+};
+
+//-----------------------------------------------------------------
+// template arg T: Type listed
+//          arg NodeIndex: If an object listed has  multiple list node, which
+//                         index corresponds to the right node
+template <typename T, int NodeIndex=0> class FbxIntrusiveList
+{
+public:
+    typedef T         allocator_type;
+    typedef T         value_type;
+    typedef T&        reference;
+    typedef const T&  const_reference;
+    typedef T*        pointer;
+    typedef const T*  const_pointer;
+
+    typedef FbxListNode<T> NodeT;
+
+    // Construction / Destruction
+    FbxIntrusiveList():mHead(0)
+    {
+        mHead.mNext = mHead.mPrev = &mHead;
+    }
+    ~FbxIntrusiveList()
+    {
+        while(!Empty())
+            Begin().Get()->Disconnect();  // LINUXNote:  should be Erase(Begin()); but there's an issue with gcc 4.2
+    };
+
+    // true if the list's size is 0.
+    bool Empty() const
+    {
+        return ((mHead.mNext==&mHead)&&(mHead.mPrev==&mHead));
+    }
+
+    // Back Insertion Sequence  Inserts a new element at the end.  
+    void PushBack(T& pElement)
+    {
+        NodeT* pNode = &pElement.GetListNode(NodeIndex);
+        pNode->mData = &pElement;
+
+        if (Empty())
+        {
+            pNode->mNext = &mHead;
+            pNode->mPrev = &mHead;
+            mHead.mNext = pNode;
+            mHead.mPrev = pNode;
+        }
+        else
+        {
+            pNode->mNext = &mHead;
+            pNode->mPrev = mHead.mPrev;
+
+            pNode->mPrev->mNext = pNode;
+            mHead.mPrev = pNode;
+        }
+    }
+
+    void PushFront(T& pElement)
+    {
+        NodeT* pNode = &pElement.GetListNode(NodeIndex);
+        pNode->mData = &pElement;
+
+        if (Empty())
+        {
+            pNode->mNext = &mHead;
+            pNode->mPrev = &mHead;
+            mHead.mNext = pNode;
+            mHead.mPrev = pNode;
+        }
+        else
+        {
+            pNode->mNext = mHead.mNext;
+            pNode->mPrev = &mHead;
+
+            pNode->mNext->mPrev = pNode;
+            mHead.mNext = pNode;
+        }
+    }
+
+    void PopFront()
+    {
+        iterator begin = Begin();
+        Erase(begin);
+    }
+
+    void PopBack()
+    {
+        Erase(--(End()));
+    }
+
+public:
+    class IntrusiveListIterator
+    {
+    public:
+        explicit IntrusiveListIterator(NodeT* ptr=0):mPtr(ptr){}
+
+        // pre-increment
+        IntrusiveListIterator& operator++()
+        {
+            mPtr = mPtr->mNext;return (*this);
+        }
+        // post-increment
+        const IntrusiveListIterator operator++(int)
+        {
+            IntrusiveListIterator temp = *this;
+            ++*this;
+            return (temp);
+        }
+        // pre-decrement
+        IntrusiveListIterator& operator--()
+        {
+            mPtr = mPtr->mPrev;return *this;
+        }
+        // post-decrement
+        const IntrusiveListIterator operator--(int)
+        {
+            IntrusiveListIterator temp = *this;
+            --*this;
+            return (temp);
+        }
+        IntrusiveListIterator& operator=(const IntrusiveListIterator &other){mPtr = other.mPtr; return *this;}
+
+        reference operator*() const { return *(mPtr->mData); }
+        pointer operator->() const { return (&**this); }
+        bool operator==(const IntrusiveListIterator& other)const{ return mPtr==other.mPtr; } 
+        bool operator!=(const IntrusiveListIterator& other)const{ return !(*this == other); } 
+
+        inline NodeT* Get()const { return mPtr; }
+
+    private:
+        NodeT* mPtr;
+    };
+
+    class  IntrusiveListConstIterator
+    {
+    public:
+        explicit IntrusiveListConstIterator(const NodeT* ptr=0):mPtr(ptr){}
+
+       // pre-increment
+        IntrusiveListConstIterator& operator++()
+        {
+            mPtr = mPtr->mNext;return (*this);
+        }
+        // post-increment
+        const IntrusiveListConstIterator operator++(int)
+        {
+            IntrusiveListConstIterator temp = *this;
+            ++*this;
+            return (temp);
+        }
+        // pre-decrement
+        IntrusiveListConstIterator& operator--()
+        {
+            mPtr = mPtr->mPrev;return *this;
+        }
+        // post-decrement
+        const IntrusiveListConstIterator operator--(int)
+        {
+            IntrusiveListConstIterator temp = *this;
+            --*this;
+            return (temp);
+        }
+        IntrusiveListConstIterator& operator=(const IntrusiveListConstIterator &other){mPtr = other.mPtr; return *this;}
+
+        const_reference operator*() const { return *(mPtr->mData); }
+        const_pointer operator->() const { return (&**this); }
+        bool operator==(const IntrusiveListConstIterator& other)const{ return mPtr==other.mPtr; } 
+        bool operator!=(const IntrusiveListConstIterator& other)const{ return !(*this == other); } 
+
+        inline const NodeT* Get()const { return mPtr; }
+
+    private:
+        mutable const NodeT* mPtr;
+    };
+
+    // --- Iterator definitions ---
+    typedef IntrusiveListIterator iterator;
+    typedef IntrusiveListConstIterator const_iterator;
+
+    // iterator support
+    inline iterator Begin() { return iterator(mHead.mNext); }
+    inline const_iterator Begin() const { return const_iterator(mHead.mNext); }
+    inline iterator End() { return iterator(&mHead); }
+    inline const_iterator End() const { return const_iterator(&mHead); }
+
+    // Because there is no real use, for the reverse iterators, 
+    // they have not been implemented. 
+
+    reference Front(){return (*Begin());}
+    const_reference Front() const { return (*Begin()); }
+    reference Back(){ return (*(--End())); }
+    const_reference Back() const{ return (*(--End())); }
+
+    iterator& Erase(iterator& it)
+    {
+        it.Get()->Disconnect();
+        return (++it);
+    }
+private:
+    NodeT mHead;
+
+    // Not copyable
+    FbxIntrusiveList(const FbxIntrusiveList&);
+    FbxIntrusiveList& operator=(const FbxIntrusiveList& Right){return (*this);}
+};
+
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_INTRUSIVE_LIST_H_ */

+ 408 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxmap.h

@@ -0,0 +1,408 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxmap.h
+#ifndef _FBXSDK_CORE_BASE_MAP_H_
+#define _FBXSDK_CORE_BASE_MAP_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+#include <fbxsdk/core/base/fbxredblacktree.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxObject;
+
+/** Default compare functor for FbxMap and FbxSet, which assumes operator < is defined.
+Here is examples of different compare class implementations:
+With Key = int
+\code
+class IntCompare
+{
+    inline int operator()(int pKeyA, int pKeyB) const
+    {
+        return pKeyA < pKeyB ? -1 : (pKeyA > pKeyB ? 1 : 0);
+    }
+};
+\endcode
+With Key = Class
+\code
+class ClassCompare
+{
+	inline int operator()(const Class& pKeyA, const Class& pKeyB) const
+	{
+		return pKeyA < pKeyB ? -1 : (pKeyA > pKeyB ? 1 : 0);
+	}
+};
+\endcode
+With Key = char*
+\code
+class StrCompare
+{
+	inline int operator()(const char* pKeyA, const char* pKeyB) const
+	{
+		return strcmp(pKeyA, pKeyB);
+	}
+};
+\endcode
+*/
+template <typename Type> struct FbxLessCompare
+{
+    inline int operator()(const Type& pLeft, const Type& pRight) const
+    {
+        return (pLeft < pRight) ? -1 : ((pRight < pLeft) ? 1 : 0);
+    }
+};
+
+/** This class implements an efficient map based on key comparison, which stores key-value pairs.
+It executes insertion, deletion and query operations in O(log(n)) time. */
+template <typename Key, typename Type, typename Compare=FbxLessCompare<Key>, typename Allocator=FbxBaseAllocator> class FbxMap
+{
+protected:
+	//! This class defines the key-value pairs used by the map.
+	class KeyValuePair : private FbxPair<const Key, Type>
+	{
+	/*****************************************************************************************************************************
+	** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+	*****************************************************************************************************************************/
+	#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	public:
+		typedef const Key	KeyType;
+		typedef const Key	ConstKeyType;
+		typedef Type		ValueType;
+		typedef const Type	ConstValueType;
+
+		KeyValuePair(const Key& pFirst, const Type& pSecond) : FbxPair<const Key, Type>(pFirst, pSecond){}
+		ConstKeyType& GetKey() const { return this->mFirst; }
+		KeyType& GetKey(){ return this->mFirst; }
+		ConstValueType& GetValue() const { return this->mSecond; }
+		ValueType& GetValue(){ return this->mSecond; }
+	#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+	};
+
+	//! Declaration of the storage type used by the map.
+	typedef FbxRedBlackTree<KeyValuePair, Compare, Allocator> StorageType;
+
+public:
+	typedef Type									ValueType;
+	typedef Key										KeyType;
+	typedef typename StorageType::RecordType		RecordType;
+	typedef typename StorageType::IteratorType		Iterator;
+	typedef typename StorageType::ConstIteratorType	ConstIterator;
+
+	/** Preallocate memory.
+	* \param pRecordCount The number of elements. */
+	inline void Reserve(unsigned int pRecordCount)
+	{
+		mTree.Reserve(pRecordCount);
+	}
+
+	//! Retrieve the number of key-value pairs it holds.
+	inline int GetSize() const
+	{
+		return mTree.GetSize();
+	}
+
+	/** Insert a key-value pair.
+	* \param pKey The key.
+	* \param pValue The value.
+	* \return If the key is already present in the map, returns the existing pair and false; else returns the pointer to the new key-value and true. */
+	inline FbxPair<RecordType*, bool> Insert(const KeyType& pKey, const ValueType& pValue)
+	{
+		return mTree.Insert(KeyValuePair(pKey, pValue));
+	}
+
+	/** Delete a key-value pair.
+	* \param pKey The key.
+	* \return \c true if success, \c false if key is not found. */
+	inline bool Remove(const KeyType& pKey)
+	{
+		return mTree.Remove(pKey);
+	}
+
+	//! Clear the map.
+	inline void Clear()
+	{
+		mTree.Clear();
+	}
+
+	//! Query whether the map is empty.
+	inline bool Empty() const
+	{
+		return mTree.Empty();
+	}
+
+	//! Retrieve the begin iterator of the map.
+	Iterator Begin()
+	{
+		return Iterator(Minimum());
+	}
+
+	//! Retrieve the end iterator of the map.
+	Iterator End()
+	{
+		return Iterator();
+	}
+
+	//! Retrieve the begin iterator of the map.
+	ConstIterator Begin() const
+	{
+		return ConstIterator(Minimum());
+	}
+
+	//! Retrieve the end iterator of the map.
+	ConstIterator End() const
+	{
+		return ConstIterator();
+	}
+
+	/** Query a key.
+	* \param pKey The key.
+	* \return A key-value pair if success, NULL if the key is not found. */
+	inline const RecordType* Find(const KeyType& pKey) const
+	{
+		return mTree.Find(pKey);
+	}
+
+	/** Query a key.
+	* \param pKey The key.
+	* \return A key-value pair if success, NULL if it's not found. */
+	inline RecordType* Find(const KeyType& pKey)
+	{
+		return mTree.Find(pKey);
+	}
+
+	/** Find the key-value pair with the smallest key greater than a specified key.
+	* \param pKey The key.
+	* \return The found key-value pair. */
+	inline const RecordType* UpperBound(const KeyType& pKey) const
+	{
+		return mTree.UpperBound(pKey);
+	}
+
+	/** Find the key-value pair with the smallest key greater than a specified key.
+	* \param pKey The key.
+	* \return The found key-value pair. */
+	inline RecordType* UpperBound(const KeyType& pKey)
+	{
+		return mTree.UpperBound(pKey);
+	}
+
+	/** Retrieve the reference of the value in the key-value pairs in map.
+	* \param pKey The key.
+	* \return The reference of the value.
+	* \remark If the key is not found, a new key-value pair will be inserted. */
+	inline ValueType& operator[](const KeyType& pKey)
+	{
+		RecordType* lRecord = Find(pKey);
+
+		if( !lRecord )
+		{
+			lRecord = Insert(pKey, ValueType()).mFirst;
+		}
+
+		return lRecord->GetValue();
+	}
+
+	//! Retrieve the key-value pair which is the minimum key in map.
+	inline const RecordType* Minimum() const
+	{
+		return mTree.Minimum();
+	}
+
+	//! Retrieve the key-value pair which is the minimum key in map.
+	inline RecordType* Minimum()
+	{
+		return mTree.Minimum();
+	}
+
+	//! Retrieve the key-value pair which is the maximum key in map.
+	inline const RecordType* Maximum() const
+	{
+		return mTree.Maximum();
+	}
+
+	//! Retrieve the key-value pair which is the maximum key in map.
+	inline RecordType* Maximum()
+	{
+		return mTree.Maximum();
+	}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	inline FbxMap(){}
+	inline FbxMap(const FbxMap& pMap) : mTree(pMap.mTree){}
+	inline ~FbxMap(){ Clear(); }
+
+private:
+	StorageType mTree;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/** A simple map class representing a dictionary-like data structure.
+* \nosubgrouping */
+template <class Key, class Type, class Compare> class FbxSimpleMap
+{
+public:
+    typedef typename FbxMap<Key, Type, Compare>::RecordType* Iterator;
+
+	/** Add a key-value pair as an element.
+	* \param pKey The new key.
+	* \param pValue The new value. */
+	inline void Add(const Key& pKey, const Type& pValue)
+	{
+		mMap.Insert(pKey, pValue);
+	}
+
+	/** Find an element with a given key.
+	* \param pKey The given key.
+	* \return The iterator pointing to the found element or NULL if fails. */
+	inline Iterator Find(const Key& pKey) const
+	{
+		return (Iterator)mMap.Find(pKey);
+	}
+
+	/** Find an element with a given value.
+	* \param pValue The given value.
+	* \return The iterator pointing to the found element or NULL if fails. */
+	inline Iterator Find(const Type& pValue) const
+	{
+		Iterator lIterator = GetFirst();
+		while( lIterator )
+		{
+			if( lIterator->GetValue() == pValue )
+			{
+				return lIterator;
+			}
+			lIterator = GetNext(lIterator);
+		}
+		return 0;
+	}
+
+	/** Remove an element from the map.
+	* \param pIterator The given element. */
+	inline void Remove(Iterator pIterator)
+	{
+		if( pIterator ) mMap.Remove(pIterator->GetKey());
+	}
+
+	/** Get the first element.
+	* \return The the heading element. */
+	inline Iterator GetFirst() const
+	{
+		return (Iterator)mMap.Minimum();
+	}
+
+	/** Get the next element of a given element.
+	* \param pIterator The given element.
+	* \return The next element. */
+	inline Iterator GetNext(Iterator pIterator) const
+	{
+		return (Iterator)pIterator ? pIterator->Successor() : 0;
+	}
+
+	//! Remove all of the elements.
+	inline void Clear() 
+	{
+		mMap.Clear();
+	}
+
+	/** Reserve the space for given number elements.
+	* \param pSize The given number. */
+	inline void Reserve(int pSize)
+	{
+		mMap.Reserve(pSize);
+	}
+
+	/** Query the count of elements in the map.
+	* \return The count of elements. */
+	inline int GetCount() const
+	{
+		return mMap.GetSize();
+	}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	inline FbxSimpleMap(){}
+
+private:
+    FbxMap<Key, Type, Compare> mMap;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/** This class template declare a simple FbxObject map.
+* \nosubgrouping */
+template <class Type, class Compare> class FbxObjectMap : public FbxSimpleMap<Type, FbxObject*, Compare>
+{
+public:
+    //! Constructor
+    inline FbxObjectMap(){}
+
+    /** Get the object contained in an element.
+      * \param pIterator The given element.
+      * \return The object.
+      */
+    inline FbxObject* Get(typename FbxSimpleMap<Type, FbxObject*, Compare>::Iterator pIterator)
+    {
+        return pIterator ? pIterator->GetValue() : 0;
+    }
+};
+
+/** A class that maps strings to objects with a basic string comparator.
+* \nosubgrouping */
+class FbxObjectStringMap : public FbxObjectMap<FbxString, FbxStringCompare>
+{
+public:
+    //! Constructor
+    inline FbxObjectStringMap(){}
+};
+
+//! Call FbxFree on each element of the map, and then clear it.
+template <typename K, typename V, typename C, typename A> inline void FbxMapFree(FbxMap<K, V, C, A>& pMap)
+{
+	for( typename FbxMap<K, V, C, A>::Iterator i = pMap.Begin(); i != pMap.End(); ++i )
+	{
+		FbxFree(i->GetValue());
+	}
+	pMap.Clear();
+}
+
+//! Call FbxDelete on each element of the map, and then clear it.
+template <typename K, typename V, typename C, typename A> inline void FbxMapDelete(FbxMap<K, V, C, A>& pMap)
+{
+	for( typename FbxMap<K, V, C, A>::Iterator i = pMap.Begin(); i != pMap.End(); ++i )
+	{
+		FbxDelete(i->GetValue());
+	}
+	pMap.Clear();
+}
+
+//! Call Destroy on each element of the map, and then clear it.
+template <typename K, typename V, typename C, typename A> inline void FbxMapDestroy(FbxMap<K, V, C, A>& pMap)
+{
+	for( typename FbxMap<K, V, C, A>::Iterator i = pMap.Begin(); i != pMap.End(); ++i )
+	{
+		i->GetValue()->Destroy();
+	}
+	pMap.Clear();
+}
+
+template class FbxSimpleMap<FbxString, FbxObject*, FbxStringCompare>;
+template class FbxObjectMap<FbxString, FbxStringCompare>;
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_MAP_H_ */

+ 67 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxmemorypool.h

@@ -0,0 +1,67 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxmemorypool.h
+#ifndef _FBXSDK_CORE_BASE_MEMORY_H_
+#define _FBXSDK_CORE_BASE_MEMORY_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/sync/fbxatomic.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** \brief Class to create a simple fixed-size-blocks memory pool to allocate memory dynamically. */
+class FBXSDK_DLL FbxMemoryPool
+{
+public:
+	/** Memory pool constructor.
+	* \param pBlockSize		The size of one memory block.
+	* \param pBlockCount	The count of block that should be pre-allocated.
+	* \param pResizable		Whether memory pool can grow if no block are availalbe upon calling Allocate.
+	* \param pConcurrent	Whether the pool supports concurrent allocation and release operations.
+	* \remark				All memory blocks must be released before the memory pool is destroyed, otherwise a memory leak will occur. */
+	FbxMemoryPool(size_t pBlockSize, FbxInt64 pBlockCount=0, bool pResizable=true, bool pConcurrent=true);
+
+	/** Memory pool destructor. Upon destruction, all memory blocks of the pool will be de-allocated. */
+	~FbxMemoryPool();
+
+	/** Free memory of all memory blocks from this memory pool, also effectively resetting the block count to zero.
+	* \remark The block size and alignment/resize/concurrent support will remain unchanged. */
+	void Reset();
+
+	/** Allocate or lock a memory block for usage.
+	* \return An memory block pointer that can be NULL if the memory pool cannot grow in size and no blocks are available. */
+	void* Allocate();
+
+	/** Dispose or unlock a memory block.
+	* \param pMemBlock A pointer to the memory block to release. This will not free the block's memory, instead simply putting it back in the available stack. */
+	void Release(void* pMemBlock);
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+    void*		Pop();
+
+	FbxInt64	mMaxBlockCount;
+    FbxAtomic	mFreeBlockCount;
+    void*		mFreeBlocksStack;
+    size_t		mBlockSize;
+    bool		mResizable;
+    bool		mSupportConcurrentAccess;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_MEMORY_H_ */

+ 115 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxmultimap.h

@@ -0,0 +1,115 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxmultimap.h
+#ifndef _FBXSDK_CORE_BASE_MULTIMAP_H_
+#define _FBXSDK_CORE_BASE_MULTIMAP_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Class to manipulate a map that can contain multiple times the same key.
+* \nosubgrouping */
+class FBXSDK_DLL FbxMultiMap
+{
+public:
+	struct Pair
+	{
+		FbxHandle mKey;
+		FbxHandle mItem;
+	};
+
+	/** If can't find the matching item,append a item at the end of the array.
+	* If find the matching item ,insert the new item before the matching item. 
+    * \param pKey The value of Key in new item, also is the character for matching.
+	* \param pItem The value of Item in new item.
+	* \return If add successfully return true,otherwise return false.
+    */
+    bool Add(FbxHandle pKey, FbxHandle pItem);
+	
+	/** Remove the first matching item, whose reference is the same as given.
+	* \param pKey The given reference.
+	* \return If remove successfully return true,otherwise return false.
+	*/
+    bool Remove(FbxHandle pKey);
+	
+	/** Remove all the matching item, whose item is the same as given.
+	* \param pItem The given item.
+	* \return If remove successfully return true,otherwise return false.
+	*/
+    bool RemoveItem(FbxHandle pItem);
+
+    /** Set first matching item with the given parameter.
+    * \param pKey The character for matching.
+	* \param pItem  The value of Item that the matching item will be set.
+	* \return If set successfully return true,otherwise return false.
+    */
+    bool SetItem(FbxHandle pKey, FbxHandle pItem);
+
+    /** Get first matching item with the given parameter.
+    * \param pKey The character for matching.
+	* \param pIndex The pointer to the index of the matching item.
+	* \return The value of Item in the matching item.
+    * \remarks If there are multiple elements that match the character, the index returned is unspecified.
+    */
+    FbxHandle Get(FbxHandle pKey, int* pIndex=NULL);
+
+	//! Delete the array.
+    void Clear();
+
+	/** Get the item of the given index.
+    * \param pIndex The index for matching.
+	* \param pKey The pointer to the Key of the matching item.
+	* \return The value of Item in the matching item.
+    */
+    FbxHandle GetFromIndex(int pIndex, FbxHandle* pKey=NULL);
+
+	/** Remove the item of the given index
+	* \param pIndex The given index.
+	* \return If remove successfully return true,otherwise return false.
+	*/
+    bool RemoveFromIndex(int pIndex);
+
+	/** Get number of items in the array.
+	* \return The number of items in the array. */
+    int GetCount() const { return mSetCount; }
+
+	/** Swap the value of Key and Item in every item of array, and sort the new array with the value of Key. */
+    void Swap();
+
+	/** Sort the array according the value of Key in each item. */
+    void Sort();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxMultiMap(int pItemPerBlock=20);
+	FbxMultiMap(const FbxMultiMap& pOther);
+	~FbxMultiMap();
+
+    FbxMultiMap& operator=(const FbxMultiMap&);
+
+private:
+    Pair*	FindEqual(FbxHandle pKey) const;
+
+    Pair*	mSetArray;
+    int		mSetCount;
+    int		mBlockCount;
+    int		mItemPerBlock;
+    bool	mIsChanged;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_MULTIMAP_H_ */

+ 62 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxpair.h

@@ -0,0 +1,62 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxpair.h
+#ifndef _FBXSDK_CORE_BASE_PAIR_H_
+#define _FBXSDK_CORE_BASE_PAIR_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** This class template holds a pair of objects.
+* \nosubgrouping */
+template <typename First, typename Second> class FbxPair
+{
+public:
+	//! Constructor.
+	inline FbxPair() : mFirst(), mSecond() {}
+
+	/** Constructor.
+	* \param pFirst The first object.
+	* \param pSecond The second object. */
+	inline FbxPair(const First& pFirst, const Second& pSecond) : mFirst(pFirst), mSecond(pSecond) {}
+
+	/** Assignment operator.
+	* \param pOther The pair to be copied. */
+	inline FbxPair<First, Second>& operator=(const FbxPair<First, Second>& pOther)
+	{
+		mFirst = pOther.mFirst;
+		mSecond = pOther.mSecond;
+		return *this;
+	}
+
+	/** Comparison operator.
+	* \param pOther The pair to be compared. */
+	inline bool operator==(const FbxPair<First, Second>& pOther)
+	{
+		return mFirst == pOther.mFirst && mSecond == pOther.mSecond;
+	}
+
+	/** Inverse comparison operator.
+	* \param pOther The pair to be compared. */
+	inline bool operator!=(const FbxPair<First, Second>& pOther)
+	{
+		return !operator==(pOther);
+	}
+
+	First mFirst;	//!< The first object in the pair.
+	Second mSecond;	//!< The second object in the pair.
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_PAIR_H_ */

+ 1398 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxredblacktree.h

@@ -0,0 +1,1398 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxredblacktree.h
+#ifndef _FBXSDK_CORE_BASE_REDBLACKTREE_H_
+#define _FBXSDK_CORE_BASE_REDBLACKTREE_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxcontainerallocators.h>
+#include <fbxsdk/core/base/fbxpair.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+template <typename RecordType> class FbxRedBlackConstIterator;
+
+template <typename RecordType> class FbxRedBlackIterator
+{
+public:
+    FbxRedBlackIterator() : mRecord(0) {}
+    FbxRedBlackIterator(RecordType* pRecord) : mRecord(pRecord) {}
+    FbxRedBlackIterator(const FbxRedBlackIterator<RecordType>& pV) : mRecord(pV.mRecord) {}
+
+    FbxRedBlackIterator& operator++()
+    {
+        FBX_ASSERT( mRecord != NULL );
+        mRecord = mRecord->Successor();
+        return *this;
+    }
+
+    const FbxRedBlackIterator operator++(int)
+    {
+        FbxRedBlackIterator t(*this);
+        operator++();
+        return t;
+    }
+
+	FbxRedBlackIterator& operator+=(int pCount)
+	{
+		FBX_ASSERT( mRecord != NULL );
+		for( int i = 0; i < pCount; ++i )
+		{
+			if( !mRecord ) break;
+			mRecord = mRecord->Successor();
+		}
+		return *this;
+	}
+
+    FbxRedBlackIterator& operator--()
+    {
+        FBX_ASSERT( mRecord );
+        mRecord = mRecord->Predecessor();
+        return *this;
+    }
+
+    const FbxRedBlackIterator operator--(int)
+    {
+        FbxRedBlackIterator t(*this);
+        operator--();
+        return t;
+    }
+
+	FbxRedBlackIterator& operator-=(int pCount)
+	{
+		FBX_ASSERT( mRecord != NULL );
+		for( int i = 0; i < pCount; ++i )
+		{
+			if( !mRecord ) break;
+			mRecord = mRecord->Predecessor();
+		}
+		return *this;
+	}
+
+    const RecordType& operator*() const
+    {
+        FBX_ASSERT( mRecord );
+
+        return *mRecord;
+    }
+
+    RecordType& operator*()
+    {
+        FBX_ASSERT( mRecord );
+
+        return *mRecord;
+    }
+
+    const RecordType* operator->() const
+    {
+        FBX_ASSERT( mRecord );
+
+        return mRecord;
+    }
+
+    RecordType* operator->()
+    {
+        FBX_ASSERT( mRecord );
+
+        return mRecord;
+    }
+
+    inline bool operator==(const FbxRedBlackIterator& pOther) const
+    {
+        return mRecord == pOther.mRecord;
+    }
+
+    inline bool operator !=(const FbxRedBlackIterator& pOther) const
+    {
+        return mRecord != pOther.mRecord;
+    }
+
+protected:
+    RecordType* mRecord;
+
+    friend class FbxRedBlackConstIterator<RecordType>;
+};
+
+template <typename RecordType> class FbxRedBlackConstIterator
+{
+public:
+    FbxRedBlackConstIterator() : mRecord(0) {}
+    FbxRedBlackConstIterator(const RecordType* pRecord) : mRecord(pRecord) {}
+    FbxRedBlackConstIterator(const FbxRedBlackIterator<RecordType>& pV) : mRecord(pV.mRecord) {}
+    FbxRedBlackConstIterator(const FbxRedBlackConstIterator<RecordType>& pV) : mRecord(pV.mRecord) {}
+
+    FbxRedBlackConstIterator & operator++()
+    {
+        FBX_ASSERT( mRecord != NULL );
+        mRecord = mRecord->Successor();
+        return *this;
+    }
+
+    const FbxRedBlackConstIterator operator++(int)
+    {
+        FbxRedBlackConstIterator t(*this);
+        operator++();
+        return t;
+    }
+
+	FbxRedBlackConstIterator& operator+=(int pCount)
+	{
+		FBX_ASSERT( mRecord != NULL );
+		for( int i = 0; i < pCount; ++i )
+		{
+			if( !mRecord ) break;
+			mRecord = mRecord->Successor();
+		}
+		return *this;
+	}
+
+    FbxRedBlackConstIterator & operator--()
+    {
+        FBX_ASSERT( mRecord );
+        mRecord = mRecord->Predecessor();
+        return *this;
+    }
+
+    const FbxRedBlackConstIterator operator--(int)
+    {
+        FbxRedBlackConstIterator t(*this);
+        operator--();
+        return t;
+    }
+
+	FbxRedBlackConstIterator& operator-=(int pCount)
+	{
+		FBX_ASSERT( mRecord != NULL );
+		for( int i = 0; i < pCount; ++i )
+		{
+			if( !mRecord ) break;
+			mRecord = mRecord->Predecessor();
+		}
+		return *this;
+	}
+
+    const RecordType& operator*() const
+    {
+        FBX_ASSERT( mRecord );
+
+        return *mRecord;
+    }
+
+    const RecordType& operator*()
+    {
+        FBX_ASSERT( mRecord );
+
+        return *mRecord;
+    }
+
+    const RecordType* operator->() const
+    {
+        FBX_ASSERT( mRecord );
+
+        return mRecord;
+    }
+
+    const RecordType* operator->()
+    {
+        FBX_ASSERT( mRecord );
+
+        return mRecord;
+    }
+
+    inline bool operator==(const FbxRedBlackConstIterator& pOther) const
+    {
+        return mRecord == pOther.mRecord;
+    }
+
+    inline bool operator !=(const FbxRedBlackConstIterator& pOther) const
+    {
+        return mRecord != pOther.mRecord;
+    }
+
+protected:
+    const RecordType* mRecord;
+
+    friend class FbxRedBlackIterator<RecordType>;
+};
+
+//! Implements an efficient ordered data storage.
+template <typename Type, typename Compare, typename Allocator> class FbxRedBlackTree
+{
+public:
+    typedef Type DataType;
+    typedef typename Type::KeyType         KeyType;
+    typedef typename Type::ConstKeyType    ConstKeyType;
+    typedef typename Type::ValueType       ValueType;
+    typedef typename Type::ConstValueType  ConstValueType;
+    typedef Allocator AllocatorType;
+
+    /**
+       This class represents a node in the tree. It contains the key,
+       the value, and internal tree management data.
+    */
+    class RecordType
+    {
+    public:
+        inline ConstKeyType& GetKey() const { return mData.GetKey(); }
+        inline ConstValueType& GetValue() const { return mData.GetValue(); }
+        inline ValueType& GetValue() { return mData.GetValue(); }
+
+        inline const RecordType* Minimum() const
+        {
+            const RecordType* lParent = 0;
+            const RecordType* lNode = this;
+            while (lNode != 0)
+            {
+                lParent = lNode;
+                lNode = lNode->mLeftChild;
+            }
+
+            return lParent;
+        }
+
+        inline RecordType* Minimum()
+        {
+            RecordType* lParent = 0;
+            RecordType* lNode = this;
+            while (lNode != 0)
+            {
+                lParent = lNode;
+                lNode = lNode->mLeftChild;
+            }
+
+            return lParent;
+        }
+
+        inline const RecordType* Maximum() const
+        {
+            const RecordType* lParent = 0;
+            const RecordType* lNode = this;
+            while (lNode != 0)
+            {
+                lParent = lNode;
+                lNode = lNode->mRightChild;
+            }
+
+            return lParent;
+        }
+
+        inline RecordType* Maximum()
+        {
+            RecordType* lParent = 0;
+            RecordType* lNode = this;
+            while (lNode != 0)
+            {
+                lParent = lNode;
+                lNode = lNode->mRightChild;
+            }
+
+            return lParent;
+        }
+
+        inline const RecordType* Predecessor() const
+        {
+            if (mLeftChild)
+            {
+                return mLeftChild->Maximum();
+            }
+            else
+            {
+                const RecordType* lParent = mParent;
+                const RecordType* lNode = this;
+
+                while (lParent && lParent->mLefttChild == lNode)
+                {
+                    lNode = lParent;
+                    lParent = lParent->mParent;
+                }
+
+                return lParent;
+            }
+        }
+
+        inline RecordType* Predecessor()
+        {
+            if (mLeftChild)
+            {
+                return mLeftChild->Maximum();
+            }
+            else
+            {
+                RecordType* lParent = mParent;
+                RecordType* lNode = this;
+
+                while (lParent && lParent->mLeftChild == lNode)
+                {
+                    lNode = lParent;
+                    lParent = lParent->mParent;
+                }
+
+                return lParent;
+            }
+        }
+
+        inline const RecordType* Successor() const
+        {
+            if (mRightChild)
+            {
+                return mRightChild->Minimum();
+            }
+            else
+            {
+                const RecordType* lParent = mParent;
+                const RecordType* lNode = this;
+
+                while (lParent && lParent->mRightChild == lNode)
+                {
+                    lNode = lParent;
+                    lParent = lParent->mParent;
+                }
+
+                return lParent;
+            }
+        }
+
+        inline RecordType* Successor()
+        {
+            if (mRightChild)
+            {
+                return mRightChild->Minimum();
+            }
+            else
+            {
+                RecordType* lParent = mParent;
+                RecordType* lNode = this;
+
+                while (lParent && lParent->mRightChild == lNode)
+                {
+                    lNode = lParent;
+                    lParent = lParent->mParent;
+                }
+
+                return lParent;
+            }
+        }
+
+        inline int GetBlackDepth() { return mBlackDepth; }
+
+    private:
+        enum ETreeType {eRed, eBlack};
+
+        inline RecordType(const DataType& pData)
+            : mData(pData)
+            , mParent(0)
+            , mLeftChild(0)
+            , mRightChild(0)
+            , mColor(eRed)
+            , mBlackDepth(0)
+        {
+        }
+
+        inline RecordType(const RecordType& pRecordType)
+            : mData(pRecordType.mData)
+            , mParent(0)
+            , mLeftChild(0)
+            , mRightChild(0)
+            , mColor(pRecordType.mColor)
+            , mBlackDepth(pRecordType.mBlackDepth)
+        {
+        }
+
+        DataType mData;
+
+        friend class FbxRedBlackTree;
+
+        RecordType* mParent;
+        RecordType* mLeftChild;
+        RecordType* mRightChild;
+        unsigned int mColor:2;
+        unsigned int mBlackDepth:30;
+    };
+
+public:
+    typedef FbxRedBlackConstIterator<RecordType>  ConstIteratorType;
+    typedef FbxRedBlackIterator<RecordType>       IteratorType;
+
+    inline FbxRedBlackTree() : mRoot(0), mSize(0), mAllocator(sizeof(RecordType)) {}
+    inline FbxRedBlackTree(const FbxRedBlackTree& pTree) : mRoot(0), mSize(0), mAllocator(sizeof(RecordType)) { operator=(pTree); }
+    inline ~FbxRedBlackTree() { Clear(); }
+
+    /** Deep copy pTree in this. 
+	* \param pTree The tree to copy in this tree. */
+    inline FbxRedBlackTree& operator=(const FbxRedBlackTree& pTree)
+    {
+        if( this != &pTree )
+        {
+            Clear();
+
+            mAllocator = pTree.mAllocator;
+
+            if( pTree.mRoot )
+            {
+                void* lBuffer = mAllocator.AllocateRecords();
+                mRoot = new(lBuffer) RecordType(*(pTree.mRoot));	//in-place new won't allocate memory, so it is safe
+                mRoot->mLeftChild = DuplicateSubTree(pTree.mRoot->mLeftChild);
+                mRoot->mRightChild = DuplicateSubTree(pTree.mRoot->mRightChild);
+
+                if (mRoot->mLeftChild)
+                {
+                    mRoot->mLeftChild->mParent = mRoot;
+                }
+
+                if (mRoot->mRightChild)
+                {
+                    mRoot->mRightChild->mParent = mRoot;
+                }
+            }
+            else
+            {
+                FBX_ASSERT( pTree.mSize == 0 );
+                FBX_ASSERT( mRoot == 0 );
+            }
+
+            mSize = pTree.mSize;
+        }
+
+        return *this;
+    }
+
+    inline bool operator==(const FbxRedBlackTree& pTree) const
+    {
+        // Check a few quick shortcuts
+        if( this == &pTree )
+            return true;
+
+        if( GetSize() != pTree.GetSize() )
+            return false;
+
+        // Iterator through all nodes; if we reach the end of both iterators at the same
+        // time then we have two iterators that match.
+        ConstIteratorType End;
+        ConstIteratorType Iter1(Minimum());
+        ConstIteratorType Iter2(pTree.Minimum());
+
+        while( (Iter1 != End) && (Iter2 != End) &&
+               (Iter1->GetKey() == Iter2->GetKey()) &&
+               (Iter1->GetValue() == Iter2->GetValue()) )
+        {
+            ++Iter1;
+            ++Iter2;
+        }
+
+        return Iter1 == End && Iter2 == End;
+    }
+
+    /** Ask Allocator to reserve space to hold pRecordCount elements. 
+      * \param pRecordCount
+      */
+    inline void Reserve(unsigned int pRecordCount)
+    {
+        mAllocator.Reserve(pRecordCount);
+    }
+
+    /** Get the number of elements in the tree. Takes O(1) time.
+      * \return The number of elements in the tree.
+      */
+    inline int GetSize() const { return mSize; }
+
+    inline bool Empty() const { return mSize == 0; }
+
+    /** Insert a new element in the tree. Takes O(log n) time.
+      * \param pData The element to insert.
+      * \return If pData.GetKey() is already present in the tree, returns the
+      *         existing record and false; else returns the new record and true.
+      */
+    inline FbxPair<RecordType*, bool> Insert(const DataType& pData)
+    {
+        Compare lCompareKeys;
+        bool lResult = false;
+        RecordType* lParent = 0;
+        RecordType* lNode = mRoot;
+        while (lNode != 0)
+        {
+            const KeyType& lNodeKey = lNode->GetKey();
+            const KeyType& lDataKey = pData.GetKey();
+
+            if (lCompareKeys(lNodeKey, lDataKey) < 0)
+            {
+                lParent = lNode;
+                lNode = lNode->mRightChild;
+            }
+            else if (lCompareKeys(lNodeKey, lDataKey) > 0)
+            {
+                lParent = lNode;
+                lNode = lNode->mLeftChild;
+            }
+            else
+            {
+                break;
+            }
+        }
+
+        if (lNode == 0)
+        {
+            void* lBuffer = mAllocator.AllocateRecords();
+            lNode = new(lBuffer) RecordType(pData);	//in-place new won't allocate memory, so it is safe
+            mSize++;
+
+			FBX_ASSERT(lNode == lBuffer);
+
+            if (lParent)
+            {
+                if (lCompareKeys(lParent->GetKey(), pData.GetKey()) < 0)
+                {
+                    FBX_ASSERT(lParent->mRightChild == 0);
+                    lParent->mRightChild = lNode;
+                    lNode->mParent = lParent;
+                }
+                else
+                {
+                    FBX_ASSERT(lParent->mLeftChild == 0);
+                    lParent->mLeftChild = lNode;
+                    lNode->mParent = lParent;
+                }
+            }
+            else
+            {
+                mRoot = lNode;
+            }
+
+            // Fix red black tree property
+            FixNodesAfterInsertion(lNode);
+
+            lResult = true;
+        }
+
+        return FbxPair<RecordType*, bool>(lNode, lResult);
+    }
+
+    /** Remove an element identified by a key from the tree. Takes O(log n) time.
+      * \param pKey The key identifying the element to remove.
+      */
+    inline bool Remove(const KeyType& pKey)
+    {
+        Compare lCompareKeys;
+        bool lResult = false;
+        RecordType* lNode = mRoot;
+        while (lNode != 0)
+        {
+            if (lCompareKeys(lNode->GetKey(), pKey) < 0)
+            {
+                lNode = lNode->mRightChild;
+            }
+            else if (lCompareKeys(lNode->GetKey(), pKey) > 0)
+            {
+                lNode = lNode->mLeftChild;
+            }
+            else
+            {
+                break;
+            }
+        }
+
+        if (lNode)
+        {
+            RemoveNode(lNode);
+            mSize--;
+            lNode->~RecordType();
+            mAllocator.FreeMemory(lNode);
+
+            lResult = true;
+        }
+
+        return lResult;
+    }
+
+    /** Remove all elements from the tree. Takes O(n) time. Recursive.
+      */
+    inline void Clear()
+    {
+        if (mRoot)
+        {
+            ClearSubTree(mRoot->mLeftChild);
+            ClearSubTree(mRoot->mRightChild);
+            mRoot->~RecordType();
+            mAllocator.FreeMemory(mRoot);
+            mRoot = 0;
+            mSize = 0;
+        }
+    }
+
+    /** Find the smallest element in the tree.
+      * Takes O(log n) time.
+      */
+    inline const RecordType* Minimum() const
+    {
+        if (0 != mRoot)
+        {
+            return mRoot->Minimum();
+        }
+        else
+        {
+            return 0;
+        }
+    }
+
+    /** Find the smallest element in the tree.
+      * Takes O(log n) time.
+      */
+    inline RecordType* Minimum()
+    {
+        if (0 != mRoot)
+        {
+            return mRoot->Minimum();
+        }
+        else
+        {
+            return 0;
+        }
+    }
+
+    /** Find the largest element in the tree.
+      * Takes O(log n) time.
+      */
+    inline const RecordType* Maximum() const
+    {
+        if (0 != mRoot)
+        {
+            return mRoot->Maximum();
+        }
+        else
+        {
+            return 0;
+        }
+    }
+
+    /** Find the largest element in the tree.
+      * Takes O(log n) time.
+      */
+    inline RecordType* Maximum()
+    {
+        if (0 != mRoot)
+        {
+            return mRoot->Maximum();
+        }
+        else
+        {
+            return 0;
+        }
+    }
+
+    /** Find the key-value pair with key pKey.
+      * Takes O(log n) time.
+      * \param pKey The key to look for.
+      */
+    inline const RecordType* Find(const KeyType& pKey) const
+    {
+        Compare lCompareKeys;
+        const RecordType* lNode = mRoot;
+        while (lNode != 0)
+        {
+            if (lCompareKeys(lNode->GetKey(), pKey) < 0)
+            {
+                lNode = lNode->mRightChild;
+            }
+            else if (lCompareKeys(lNode->GetKey(), pKey) > 0)
+            {
+                lNode = lNode->mLeftChild;
+            }
+            else
+            {
+                break;
+            }
+        }
+
+        return lNode;
+    }
+
+    /** Find the key-value pair with key pKey.
+      * Takes O(log n) time.
+      * \param pKey The key to look for.
+      */
+    inline RecordType* Find(const KeyType& pKey)
+    {
+        Compare lCompareKeys;
+        RecordType* lNode = mRoot;
+        while (lNode != 0)
+        {
+            if (lCompareKeys(lNode->GetKey(), pKey) < 0)
+            {
+                lNode = lNode->mRightChild;
+            }
+            else if (lCompareKeys(lNode->GetKey(), pKey) > 0)
+            {
+                lNode = lNode->mLeftChild;
+            }
+            else
+            {
+                break;
+            }
+        }
+
+        return lNode;
+    }
+
+    /** Find the key-value pair with the smallest key greater than pKey.
+      * Takes O(log n) time.
+      * \param pKey The key to look for.
+      */
+    inline const RecordType* UpperBound(const KeyType& pKey) const
+    {
+        Compare lCompareKeys;
+        const RecordType* lNode = mRoot;
+        const RecordType* lCandidate = 0;
+        while (lNode != 0)
+        {
+            if (lCompareKeys(lNode->GetKey(), pKey) <= 0)
+            {
+                lNode = lNode->mRightChild;
+            }
+            else if (lCompareKeys(lNode->GetKey(), pKey) > 0)
+            {
+                lCandidate = lNode;
+                lNode = lNode->mLeftChild;
+            }
+        }
+        
+        return lCandidate;
+    }
+
+    /** Find the key-value pair with the smallest key greater than pKey.
+      * Takes O(log n) time.
+      * \param pKey The key to look for.
+      */
+    inline RecordType* UpperBound(const KeyType& pKey)
+    {
+        Compare lCompareKeys;
+        RecordType* lNode = mRoot;
+        RecordType* lCandidate = 0;
+        while (lNode != 0)
+        {
+            if (lCompareKeys(lNode->GetKey(), pKey) <= 0)
+            {
+                lNode = lNode->mRightChild;
+            }
+            else if (lCompareKeys(lNode->GetKey(), pKey) > 0)
+            {
+                lCandidate = lNode;
+                lNode = lNode->mLeftChild;
+            }
+        }
+        
+        return lCandidate;
+    }
+
+protected:
+    RecordType* mRoot;
+    int mSize;
+
+    AllocatorType mAllocator;
+
+    inline RecordType* DuplicateSubTree(const RecordType* pNode)
+    {
+        RecordType* lNewSubTree = 0;
+
+        if (pNode)
+        {
+            void* lBuffer = mAllocator.AllocateRecords();
+            lNewSubTree = new(lBuffer) RecordType(*pNode);	//in-place new won't allocate memory, so it is safe
+            lNewSubTree->mLeftChild = DuplicateSubTree(pNode->mLeftChild);
+            lNewSubTree->mRightChild = DuplicateSubTree(pNode->mRightChild);
+
+            if (lNewSubTree->mLeftChild)
+            {
+                lNewSubTree->mLeftChild->mParent = lNewSubTree;
+            }
+
+            if (lNewSubTree->mRightChild)
+            {
+                lNewSubTree->mRightChild->mParent = lNewSubTree;
+            }
+        }
+
+        return lNewSubTree;
+    }
+
+    inline void FixNodesAfterInsertion(RecordType* pNode)
+    {
+        RecordType* lNode = pNode;
+        bool lDone = false;
+
+        while (!lDone)
+        {
+            lDone = true;
+
+            if (lNode->mParent == 0)
+            {
+                lNode->mColor = RecordType::eBlack;
+            }
+            else if (lNode->mParent->mColor == RecordType::eRed)
+            {
+                RecordType* lUncle = 0;
+                if (lNode->mParent == lNode->mParent->mParent->mLeftChild)
+                {
+                    lUncle = lNode->mParent->mParent->mRightChild;
+                }
+                else if (lNode->mParent == lNode->mParent->mParent->mRightChild)
+                {
+                    lUncle = lNode->mParent->mParent->mLeftChild;
+                }
+
+                // since lNode->mParent is red, lNode->mParent->mParent exists
+
+                if (lUncle && lUncle->mColor == RecordType::eRed)
+                {
+                    lNode->mParent->mColor = RecordType::eBlack;
+                    lUncle->mColor = RecordType::eBlack;
+                    lNode->mParent->mParent->mColor = RecordType::eRed;
+                    lNode = lNode->mParent->mParent;
+
+                    lDone = false;
+                }
+                else
+                {
+                    if ((lNode == lNode->mParent->mRightChild) &&
+                        (lNode->mParent == lNode->mParent->mParent->mLeftChild))
+                    {
+                        LeftRotate(lNode->mParent);
+                        lNode = lNode->mLeftChild;
+                    }
+                    else if ((lNode == lNode->mParent->mLeftChild) &&
+                            (lNode->mParent == lNode->mParent->mParent->mRightChild))
+                    {
+                        RightRotate(lNode->mParent);
+                        lNode = lNode->mRightChild;
+                    }
+
+                    lNode->mParent->mColor = RecordType::eBlack;
+                    lNode->mParent->mParent->mColor = RecordType::eRed;
+                    if ((lNode == lNode->mParent->mLeftChild) &&
+                        (lNode->mParent == lNode->mParent->mParent->mLeftChild))
+                    {
+                        RightRotate(lNode->mParent->mParent);
+                    }
+                    else
+                    {
+                        LeftRotate(lNode->mParent->mParent);
+                    }
+                }
+            }
+        }
+
+        mRoot->mColor = RecordType::eBlack;
+    }
+
+    inline void LeftRotate(RecordType* pNode)
+    {
+		FBX_ASSERT_RETURN(pNode);
+
+        RecordType* lNode = pNode->mRightChild;
+		FBX_ASSERT_RETURN(lNode);
+
+	#ifdef _DEBUG
+        RecordType* A = pNode->mLeftChild;
+        RecordType* B = lNode->mLeftChild;
+        RecordType* C = lNode->mRightChild;
+        RecordType* Z = pNode->mParent;
+	#endif
+
+        pNode->mRightChild = lNode->mLeftChild;
+        if (pNode->mRightChild)
+        {
+            pNode->mRightChild->mParent = pNode;
+        }
+
+        lNode->mParent = pNode->mParent;
+        if (pNode->mParent == 0)
+        {
+            FBX_ASSERT(mRoot == pNode);
+            mRoot = lNode;
+        }
+        else if (pNode == pNode->mParent->mLeftChild)
+        {
+            pNode->mParent->mLeftChild = lNode;
+        }
+        else
+        {
+            pNode->mParent->mRightChild = lNode;
+        }
+        pNode->mParent = lNode;
+        lNode->mLeftChild = pNode;
+
+        FBX_ASSERT(pNode->mLeftChild == A);
+        FBX_ASSERT(pNode->mRightChild == B);
+        FBX_ASSERT(pNode->mParent == lNode);
+
+        FBX_ASSERT(lNode->mLeftChild == pNode);
+        FBX_ASSERT(lNode->mRightChild == C);
+        FBX_ASSERT(lNode->mParent == Z);
+
+        FBX_ASSERT(A == 0 || A->mParent == pNode);
+        FBX_ASSERT(B == 0 || B->mParent == pNode);
+        FBX_ASSERT(C == 0 || C->mParent == lNode);
+        FBX_ASSERT(Z == 0 || Z->mLeftChild == lNode || Z->mRightChild == lNode);
+    }
+
+    inline void RightRotate(RecordType* pNode)
+    {
+        RecordType* lNode = pNode->mLeftChild;
+
+	#ifdef _DEBUG
+        RecordType* A = lNode->mLeftChild;
+        RecordType* B = lNode->mRightChild;
+        RecordType* C = pNode->mRightChild;
+        RecordType* Z = pNode->mParent;
+	#endif
+
+        pNode->mLeftChild = lNode->mRightChild;
+        if (pNode->mLeftChild)
+        {
+            pNode->mLeftChild->mParent = pNode;
+        }
+
+        lNode->mParent = pNode->mParent;
+        if (pNode->mParent == 0)
+        {
+            FBX_ASSERT(mRoot == pNode);
+            mRoot = lNode;
+        }
+        else if (pNode == pNode->mParent->mRightChild)
+        {
+            pNode->mParent->mRightChild = lNode;
+        }
+        else
+        {
+            pNode->mParent->mLeftChild = lNode;
+        }
+        pNode->mParent = lNode;
+        lNode->mRightChild = pNode;
+
+        FBX_ASSERT(lNode->mLeftChild == A);
+        FBX_ASSERT(lNode->mRightChild == pNode);
+        FBX_ASSERT(lNode->mParent == Z);
+
+        FBX_ASSERT(pNode->mLeftChild == B);
+        FBX_ASSERT(pNode->mRightChild == C);
+        FBX_ASSERT(pNode->mParent == lNode);
+
+        FBX_ASSERT(A == 0 || A->mParent == lNode);
+        FBX_ASSERT(B == 0 || B->mParent == pNode);
+        FBX_ASSERT(C == 0 || C->mParent == pNode);
+        FBX_ASSERT(Z == 0 || Z->mLeftChild == lNode || Z->mRightChild == lNode);
+    }
+
+    inline void RemoveNode(RecordType* pNode)
+    {
+        if (pNode->mLeftChild == 0)
+        {
+            if (pNode->mRightChild == 0)
+            {
+                if (pNode->mParent)
+                {
+                    if (pNode->mParent->mLeftChild == pNode)
+                    {
+                        pNode->mParent->mLeftChild = 0;
+                    }
+                    else if (pNode->mParent->mRightChild == pNode)
+                    {
+                        pNode->mParent->mRightChild = 0;
+                    }
+                    else
+                    {
+                        FBX_ASSERT_NOW("Node not found in FbxRedBlackTree");
+                    }
+                }
+                else
+                {
+                    FBX_ASSERT(mRoot == pNode);
+                    mRoot = 0;
+                }
+
+                if (pNode->mColor == RecordType::eBlack)
+                {
+                    FixNodesAfterRemoval(pNode->mParent, 0);
+                }
+            }
+            else
+            {
+                if (pNode->mParent)
+                {
+                    if (pNode->mParent->mLeftChild == pNode)
+                    {
+                        pNode->mParent->mLeftChild = pNode->mRightChild;
+                        pNode->mRightChild->mParent = pNode->mParent;
+                    }
+                    else if (pNode->mParent->mRightChild == pNode)
+                    {
+                        pNode->mParent->mRightChild = pNode->mRightChild;
+                        pNode->mRightChild->mParent = pNode->mParent;
+                    }
+                    else
+                    {
+                        FBX_ASSERT_NOW("Node not found in FbxRedBlackTree");
+                    }
+                }
+                else
+                {
+                    FBX_ASSERT(mRoot == pNode);
+                    mRoot = pNode->mRightChild;
+                    pNode->mRightChild->mParent = 0;
+                }
+
+                if (pNode->mColor == RecordType::eBlack)
+                {
+                    FixNodesAfterRemoval(pNode->mRightChild->mParent, pNode->mRightChild);
+                }
+            }
+        }
+        else
+        {
+            if (pNode->mRightChild == 0)
+            {
+                if (pNode->mParent)
+                {
+                    if (pNode->mParent->mLeftChild == pNode)
+                    {
+                        pNode->mParent->mLeftChild = pNode->mLeftChild;
+                        pNode->mLeftChild->mParent = pNode->mParent;
+                    }
+                    else if (pNode->mParent->mRightChild == pNode)
+                    {
+                        pNode->mParent->mRightChild = pNode->mLeftChild;
+                        pNode->mLeftChild->mParent = pNode->mParent;
+                    }
+                    else
+                    {
+                        FBX_ASSERT_NOW("Node not found in FbxRedBlackTree");
+                    }
+                }
+                else
+                {
+                    FBX_ASSERT(mRoot == pNode);
+                    mRoot = pNode->mLeftChild;
+                    pNode->mLeftChild->mParent = 0;
+                }
+
+                if (pNode->mColor == RecordType::eBlack)
+                {
+                    FixNodesAfterRemoval(pNode->mLeftChild->mParent, pNode->mLeftChild);
+                }
+            }
+            else
+            {
+                RecordType* lMinRightNode = pNode->mRightChild->Minimum();
+                RemoveNode(lMinRightNode);
+
+                lMinRightNode->mColor = pNode->mColor;
+                ReplaceNode(pNode, lMinRightNode);
+            }
+        }
+
+        pNode->mParent = 0;
+        pNode->mLeftChild = 0;
+        pNode->mRightChild = 0;
+    }
+
+    inline void ReplaceNode(RecordType* pNodeToReplace, RecordType* pReplacement)
+    {
+        pReplacement->mParent = pNodeToReplace->mParent;
+        if (pNodeToReplace->mParent)
+        {
+            if (pNodeToReplace->mParent->mLeftChild == pNodeToReplace)
+            {
+                pNodeToReplace->mParent->mLeftChild = pReplacement;
+            }
+            else if (pNodeToReplace->mParent->mRightChild == pNodeToReplace)
+            {
+                pNodeToReplace->mParent->mRightChild = pReplacement;
+            }
+        }
+        else
+        {
+            FBX_ASSERT(mRoot == pNodeToReplace);
+            mRoot = pReplacement;
+        }
+
+        pReplacement->mLeftChild = pNodeToReplace->mLeftChild;
+        if (pReplacement->mLeftChild)
+        {
+            pReplacement->mLeftChild->mParent = pReplacement;
+        }
+
+        pReplacement->mRightChild = pNodeToReplace->mRightChild;
+        if (pReplacement->mRightChild)
+        {
+            pReplacement->mRightChild->mParent = pReplacement;
+        }
+    }
+
+    inline RecordType* Sibling(const RecordType* pParent, const RecordType* pNode) const
+    {
+        if (pParent)
+        {
+            if (pParent->mLeftChild == pNode)
+            {
+                return pParent->mRightChild;
+            }
+            else if (pParent->mRightChild == pNode)
+            {
+                return pParent->mLeftChild;
+            }
+        }
+
+        return 0;
+    }
+
+    inline bool IsBlack(const RecordType* pNode)
+    {
+        return ((pNode == 0) || (pNode->mColor == RecordType::eBlack));
+    }
+
+    inline void FixNodesAfterRemoval(RecordType* pParent, RecordType* pNode)
+    {
+        RecordType* lParent = pParent;
+        RecordType* lNode = pNode;
+        bool lDone = false;
+
+        while (!lDone)
+        {
+            lDone = true;
+
+            if (!IsBlack(lNode))
+            {
+                lNode->mColor = RecordType::eBlack;
+            }
+            else if (lParent != NULL)
+            {
+                RecordType* lSibling = Sibling(lParent, lNode);
+
+                if (!IsBlack(lSibling))
+                {
+                    lParent->mColor = RecordType::eRed;
+                    lSibling->mColor = RecordType::eBlack;
+                    if (lNode == lParent->mLeftChild)
+                    {
+                        LeftRotate(lParent);
+                    }
+                    else
+                    {
+                        RightRotate(lParent);
+                    }
+
+                    // update sibling: it may have change after rotation
+                    // parent was not affected by this rotation
+                    lSibling = Sibling(lParent, lNode);
+                }
+
+                /* check this for null sibling */
+                if (lSibling &&
+                    IsBlack(lParent) &&
+                    IsBlack(lSibling) &&
+                    IsBlack(lSibling->mLeftChild) &&
+                    IsBlack(lSibling->mRightChild))
+                {
+                    lSibling->mColor = RecordType::eRed;
+                    lNode = lParent;
+                    lParent = lParent->mParent;
+                    lDone = false;
+                }
+                else
+                {
+                    if (!IsBlack(lParent) &&
+                        IsBlack(lSibling) &&
+                        ((lSibling == 0) || IsBlack(lSibling->mLeftChild)) &&
+                        ((lSibling == 0) || IsBlack(lSibling->mRightChild)))
+                    {
+                        if (lSibling)
+                        {
+                            lSibling->mColor = RecordType::eRed;
+                        }
+                        lParent->mColor = RecordType::eBlack;
+                    }
+                    else if( lSibling != 0 )
+                    {
+                        if ((lNode == lParent->mLeftChild) &&
+                            IsBlack(lSibling) &&
+                            !IsBlack(lSibling->mLeftChild) &&
+                            IsBlack(lSibling->mRightChild))
+                        {
+                            lSibling->mColor = RecordType::eRed;
+                            lSibling->mLeftChild->mColor = RecordType::eBlack;
+                            RightRotate(lSibling);
+                        }
+                        else if ((lNode == lParent->mRightChild) &&
+                                 IsBlack(lSibling) &&
+                                 IsBlack(lSibling->mLeftChild) &&
+                                 !IsBlack(lSibling->mRightChild))
+                        {
+                            lSibling->mColor = RecordType::eRed;
+                            lSibling->mRightChild->mColor = RecordType::eBlack;
+                            LeftRotate(lSibling);
+                        }
+
+                        // update sibling: it may have change after rotation
+                        lSibling = Sibling(lParent, lNode);
+                        FBX_ASSERT(lSibling != 0 && lParent != 0); // lSibling is now
+                                                 // the former red
+                                                 // child of the
+                                                 // former sibling
+
+						if( lSibling != 0 && lParent != 0 )
+						{
+							lSibling->mColor = lParent->mColor;
+							lParent->mColor = RecordType::eBlack;
+							if (lNode == lParent->mLeftChild)
+							{
+								if (lSibling->mRightChild)
+								{
+									lSibling->mRightChild->mColor = RecordType::eBlack;
+								}
+								LeftRotate(lParent);
+							}
+							else
+							{
+								if (lSibling->mLeftChild)
+								{
+									lSibling->mLeftChild->mColor = RecordType::eBlack;
+								}
+								RightRotate(lParent);
+							}
+						}
+                    }
+                }
+            }
+        }
+
+        if (mRoot)
+        {
+            mRoot->mColor = RecordType::eBlack;
+        }
+    }
+
+    inline void ClearSubTree(RecordType* pNode)
+    {
+        if (pNode)
+        {
+            ClearSubTree(pNode->mLeftChild);
+            ClearSubTree(pNode->mRightChild);
+            pNode->~RecordType();
+            mAllocator.FreeMemory(pNode);
+        }
+    }
+
+    inline int GetSubTreeSize(RecordType* pNode) const
+    {
+        if (pNode)
+        {
+            return GetSubTreeSize(pNode->mLeftChild) + GetSubTreeSize(pNode->mRightChild) + 1;
+        }
+        else
+        {
+            return 0;
+        }
+    }
+
+#if 0
+    inline void IsSane()
+    {
+        FBX_ASSERT((mRoot == 0) || (mRoot->mColor == RecordType::eBlack));
+        FBX_ASSERT(((mRoot == 0) && (mSize == 0)) || (mRoot != 0) && (mSize != 0));
+        IsSubTreeSane(mRoot);
+
+        ComputeBlackDepth(mRoot, 0);
+
+        RecordType* lNode = mRoot;
+        unsigned int lLeafBlackDepth = 0;
+        while (lNode)
+        {
+            if (lNode->mLeftChild == 0)
+            {
+                lLeafBlackDepth = lNode->mBlackDepth + ((lNode->mColor == RecordType::eBlack) ? 1 : 0);
+            }
+
+            lNode = lNode->mLeftChild;
+        }
+
+        CheckLeavesBlackDepth(mRoot, lLeafBlackDepth);
+    }
+
+    inline void IsSubTreeSane(const RecordType* pNode) const
+    {
+        Compare lCompareKeys;
+
+        if (pNode)
+        {
+            FBX_ASSERT(pNode != pNode->mParent);
+            FBX_ASSERT(pNode != pNode->mLeftChild);
+            FBX_ASSERT(pNode != pNode->mRightChild);
+
+            // Check for two consecutive red nodes
+            FBX_ASSERT((pNode->mColor == RecordType::eBlack) ||
+                     (pNode->mLeftChild == NULL) ||
+                     (pNode->mLeftChild->mColor == RecordType::eBlack));
+
+            FBX_ASSERT((pNode->mColor == RecordType::eBlack) ||
+                     (pNode->mRightChild == NULL) ||
+                     (pNode->mRightChild->mColor == RecordType::eBlack));
+
+            // Check key ordering
+            FBX_ASSERT((pNode->mLeftChild == 0 ||
+                      lCompareKeys(pNode->GetKey(), pNode->mLeftChild->GetKey()) > 0));
+
+            FBX_ASSERT((pNode->mRightChild == 0 ||
+                      lCompareKeys(pNode->GetKey(), pNode->mRightChild->GetKey()) < 0));
+
+            IsSubTreeSane(pNode->mLeftChild);
+            IsSubTreeSane(pNode->mRightChild);
+        }
+    }
+
+	inline void ComputeBlackDepth(RecordType* pNode, unsigned int pDepth)
+	{
+		if( pNode )
+		{
+			pNode->mBlackDepth = pDepth;
+			if( pNode->mColor == RecordType::eBlack )
+			{
+				pDepth++;
+			}
+			ComputeBlackDepth(pNode->mLeftChild, pDepth);
+			ComputeBlackDepth(pNode->mRightChild, pDepth);
+		}
+	}
+
+	inline void CheckLeavesBlackDepth(RecordType* pNode, unsigned int pBlackDepth)
+	{
+		if( pNode )
+		{
+			if( pNode->mLeftChild == 0 || pNode->mRightChild == 0 )
+			{
+				FBX_ASSERT((pNode->mBlackDepth + ((pNode->mColor == RecordType::eBlack) ? 1 : 0)) == pBlackDepth);
+			}
+			CheckLeavesBlackDepth(pNode->mLeftChild, pBlackDepth);
+			CheckLeavesBlackDepth(pNode->mRightChild, pBlackDepth);
+		}
+	}
+#endif
+};
+
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /*_FBXSDK_CORE_BASE_REDBLACKTREE_H_ */

+ 227 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxset.h

@@ -0,0 +1,227 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxset.h
+#ifndef _FBXSDK_CORE_BASE_SET_H_
+#define _FBXSDK_CORE_BASE_SET_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxredblacktree.h>
+#include <fbxsdk/core/base/fbxmap.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** This class implements an efficient set based on value comparison, which stores values.
+* It executes insertion, deletion and query operations in O(log(n)) time. */
+template <typename Type, typename Compare=FbxLessCompare<Type>, typename Allocator=FbxBaseAllocator> class FbxSet
+{
+protected:
+	//! This class defines the value type used by the set.
+	class Value
+	{
+	/*****************************************************************************************************************************
+	** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+	*****************************************************************************************************************************/
+	#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	public:
+		typedef const Type KeyType;
+		typedef const Type ConstKeyType;
+		typedef const Type ValueType;
+		typedef const Type ConstValueType;
+
+		inline Value(const Type& pValue) : mValue(pValue){}
+		inline KeyType& GetKey() const { return mValue; }
+		inline ConstKeyType& GetKey(){ return mValue; }
+		inline ValueType& GetValue() const { return mValue; }
+		inline ConstValueType& GetValue(){ return mValue; }
+
+	protected:
+		ValueType mValue;
+
+	private:
+		Value& operator=(const Value&);
+	#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+	};
+
+	//! Declaration of the storage type used by the set.
+	typedef FbxRedBlackTree<Value, Compare, Allocator> StorageType;
+
+public:
+	typedef Type ValueType;
+	typedef typename StorageType::RecordType        RecordType;
+	typedef typename StorageType::IteratorType      Iterator;
+	typedef typename StorageType::ConstIteratorType ConstIterator;
+
+	/** Preallocate memory.
+	* \param pRecordCount The number of elements.
+	*/
+	inline void Reserve(unsigned int pRecordCount)
+	{
+		mTree.Reserve(pRecordCount);
+	}
+
+	//! Retrieve the number of values it holds.
+	inline int GetSize() const
+	{
+		return mTree.GetSize();
+	}
+
+	/** Insert a value.
+	* \param pValue The value.
+	* \return If the value is already present in the map, returns the existing value and false; else returns the pointer to the new value and true. */
+	inline FbxPair<RecordType*, bool> Insert(const ValueType& pValue)
+	{
+		return mTree.Insert(Value(pValue));
+	}
+
+	/** Delete a value.
+	* \param pValue The value.
+	* \return \c true if success, \c false if value is not found. */
+	inline int Remove(const ValueType& pValue)
+	{
+		return mTree.Remove(pValue);
+	}
+
+	//! Clear the set.
+	inline void Clear()
+	{
+		mTree.Clear();
+	}
+
+	//! Query whether the set is empty.
+	inline bool Empty() const
+	{
+		return mTree.Empty();
+	}
+
+	//! Retrieve the begin iterator of the set.
+	Iterator Begin()
+	{
+		return Iterator(Minimum());
+	}
+
+	//! Retrieve the end iterator of the set.
+	Iterator End()
+	{
+		return Iterator();
+	}
+
+	//! Retrieve the begin iterator of the set.
+	ConstIterator Begin() const
+	{
+		return ConstIterator(Minimum());
+	}
+
+	//! Retrieve the end iterator of the set.
+	ConstIterator End() const
+	{
+		return ConstIterator();
+	}
+
+	/** Find a given value in the set.
+	* \param pValue The value to find.
+	* \return The value in the set, or NULL if the value is not found in the set. */
+	inline const RecordType* Find(const ValueType& pValue) const
+	{
+		return mTree.Find(pValue);
+	}
+
+	/** Find a given value in the set.
+	* \param pValue The value to find.
+	* \return The value in the set, or NULL if the value is not found in the set. */
+	inline RecordType* Find(const ValueType& pValue)
+	{
+		return mTree.Find(pValue);
+	}
+
+	//! Retrieve the minimum value in the set.
+	inline const RecordType* Minimum() const
+	{
+		return mTree.Minimum();
+	}
+
+	//! Retrieve the minimum value in the set.
+	inline RecordType* Minimum()
+	{
+		return mTree.Minimum();
+	}
+
+	//! Retrieve the maximum value in the set.
+	inline const RecordType* Maximum() const
+	{
+		return mTree.Maximum();
+	}
+
+	//! Retrieve the maximum value in the set.
+	inline RecordType* Maximum()
+	{
+		return mTree.Maximum();
+	}
+
+	//! Equality operator.
+	inline bool operator==(const FbxSet<Type, Compare, Allocator>& pOther) const
+	{
+		return (this == &pOther) || (mTree == pOther.mTree);
+	}
+
+	//! Inequality operator.
+	inline bool operator != (const FbxSet<Type, Compare, Allocator>& pOther) const
+	{
+		return !(*this == pOther);
+	}
+
+	/** Intersect with another set.
+	* \param pOther The other set.
+	* \return The intersection set of the two sets. */
+	inline FbxSet Intersect(const FbxSet& pOther) const
+	{
+		FbxSet lReturn;
+		ConstIterator lBegin = Begin();
+		for (; lBegin != End(); ++lBegin)
+		{
+			if (pOther.Find(lBegin->GetValue()) != NULL)
+				lReturn.Insert(lBegin->GetValue());
+		}
+		return lReturn;
+	}
+
+	/** Unite with another set.
+	* \param pOther The other set.
+	* \return The union set of the two sets (no duplicated items). */
+	inline FbxSet Union(const FbxSet& pOther) const
+	{
+		FbxSet lReturn(*this);
+		ConstIterator lBegin = pOther.Begin();
+		for (; lBegin != End(); ++lBegin)
+		{
+			if (Find(lBegin->GetValue()) == NULL)
+				lReturn.Insert(lBegin->GetValue());
+		}
+		return lReturn;
+	}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    inline FbxSet(){}
+    inline FbxSet(const FbxSet& pSet) : mTree(pSet.mTree){}
+    inline ~FbxSet(){ Clear(); }
+
+private:
+    StorageType mTree;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_SET_H_ */

+ 120 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxstatus.h

@@ -0,0 +1,120 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2016 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxstatus.h
+#ifndef _FBXSDK_CORE_BASE_STATUS_H_
+#define _FBXSDK_CORE_BASE_STATUS_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** This class facilitates the testing/reporting of errors.  It encapsulates the
+  * status code and the internal FBXSDK error code as returned by the API functions.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxStatus
+{
+public:
+
+
+    //! Available status codes.
+    enum EStatusCode {        
+        eSuccess = 0,                           //!< Operation was successful
+        eFailure,                               //!< Operation failed
+        eInsufficientMemory,                    //!< Operation failed due to insufficient memory
+        eInvalidParameter,                      //!< An invalid parameter was provided
+        eIndexOutOfRange,                       //!< Index value outside the valid range
+        ePasswordError,                         //!< Operation on FBX file password failed
+        eInvalidFileVersion,                    //!< File version not supported (anymore or yet)
+        eInvalidFile,                           //!< Operation on the file access failed
+		eSceneCheckFail							//!< Scene validation failure
+    };
+
+    //! Default constructor.
+    FbxStatus();
+
+    FbxStatus(EStatusCode pCode);
+    FbxStatus(const FbxStatus& rhs);
+
+    FbxStatus&      operator=(const FbxStatus& rhs);
+
+    /** Equivalence operator.
+      * \param rhs Status object to compare.
+      * \return \c True if all the members of \e rhs are equal to this instance members and \c False otherwise.
+      */
+    bool            operator==(const FbxStatus& rhs)    const   { return (mCode == rhs.mCode); }
+    /** Equivalence operator.
+      * \param pCode Status code to compare.
+      * \return \c True if the code member of this instance equals \e pCode and \c False otherwise.
+      */
+    bool            operator==(const EStatusCode pCode) const   { return (mCode == pCode); }
+    /** Non-Equivalence operator.
+      * \param rhs Status object to compare.
+      * \return \c True if at least one member of \e rhs is not equal to this instance member and \c True otherwise.
+      */
+    bool            operator!=(const FbxStatus& rhs)    const   { return (mCode != rhs.mCode); }
+    /** Non-Equivalence operator.
+      * \param rhs Status code to compare.
+      * \return \c True if the code member of this instance equals \e rhs and \c False otherwise.
+      */
+    bool            operator!=(const EStatusCode rhs)   const   { return (mCode != rhs); }
+
+    /** The conversion operator that converts a FbxStatus object to bool.
+      *	The result it returns will be \c True if the FbxStatus does not contain
+      * an error, and \c False if it does.
+      */
+    operator        bool() const    { return mCode==eSuccess; }
+
+    /** Determines whether there is an error.
+      * \return \c True if an error occured and \c False if the operation was sucessful.
+      */
+    bool            Error() const   { return !this->operator bool(); }
+
+    //! Clear error code and message from the instance. After this call, it will behave as if it contained eSuccess.
+    void            Clear();
+
+    //! Retrieve the type of error that occurred, as specified in the enumeration.
+    EStatusCode     GetCode() const { return mCode; }
+
+    /** Change the current code of the instance.
+      * \param rhs New code value.
+      */
+    void            SetCode(const EStatusCode rhs);
+
+    /** Change the current code of the instance.
+      * \param rhs New code value.
+      * \param pErrorMsg Optional error description string. This string can have formatting characters
+      *                  The function will use the vsnprintf function to assemble the final string
+      *                  using an internal buffer of 4096 characters.
+      */
+    void            SetCode(const EStatusCode rhs, const char* pErrorMsg, ...);
+
+    //! Get the error message string corresponding to the current code.
+    const char*     GetErrorString() const;
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+private:
+    EStatusCode     mCode;
+    FbxString       mErrorString;
+
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS */
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_STATUS_H_ */

+ 505 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxstring.h

@@ -0,0 +1,505 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxstring.h
+#ifndef _FBXSDK_CORE_BASE_STRING_H_
+#define _FBXSDK_CORE_BASE_STRING_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Convert string from UTF8 to wide-char
+* \param pInUTF8 Input string
+* \param pOutWideChar output string
+* \param pOutWideCharSize size of the allocated output string buffer
+* \remark Output buffer should be release by caller */
+FBXSDK_DLL void FbxUTF8ToWC(const char* pInUTF8, wchar_t*& pOutWideChar, size_t* pOutWideCharSize=NULL);
+
+/** Convert string from wide-char to UTF8
+* \param pInWideChar input string
+* \param pOutUTF8 output string
+* \param pOutUTF8Size size of the allocated output string buffer
+* \remark Output buffer should be release by caller */
+FBXSDK_DLL void FbxWCToUTF8(const wchar_t* pInWideChar, char*& pOutUTF8, size_t* pOutUTF8Size=NULL);
+
+#if defined(FBXSDK_ENV_WIN)
+	/** Convert string from wide-char to ANSI
+	* \param pInWideChar input string
+	* \param pOutANSI output string
+	* \param pOutANSISize size of the allocated output string buffer
+	* \remark Output buffer should be release by caller */
+	FBXSDK_DLL void FbxWCToAnsi(const wchar_t* pInWideChar, char*& pOutANSI, size_t* pOutANSISize=NULL);
+
+	/** Convert string from ANSI to wide-char
+	* \param pInANSI input string
+	* \param pOutWideChar output string
+	* \param pOutWideCharSize size of the allocated output string buffer
+	* \remark Output buffer should be release by caller */
+	FBXSDK_DLL void FbxAnsiToWC(const char* pInANSI, wchar_t*& pOutWideChar, size_t* pOutWideCharSize=NULL);
+
+	/** Convert string from ANSI to UTF8
+	* \param pInANSI input string
+	* \param outUTF8 output string
+	* \param pOutUTF8Size size of the allocated output string buffer
+	* \remark Output buffer should be release by caller */
+	FBXSDK_DLL void FbxAnsiToUTF8(const char* pInANSI, char*& pOutUTF8, size_t* pOutUTF8Size=NULL);
+
+	/** Convert string from UTF8 to ANSI
+	* \param pInUTF8 input string
+	* \param pOutANSI output string
+	* \param pOutANSISize size of the allocated output string buffer
+	* \remark Output buffer should be release by caller */
+	FBXSDK_DLL void FbxUTF8ToAnsi(const char* pInUTF8, char*& pOutANSI, size_t* pOutANSISize=NULL);
+#endif
+
+/** Utility class to manipulate strings.
+* \nosubgrouping */
+class FBXSDK_DLL FbxString
+{
+public:
+	/**
+	* \name Constructors and Destructor
+	*/
+	//@{
+		//! Default constructor.
+		FbxString();
+
+		/** Copy constructor.
+		* \param pString The FbxString to be copied. */
+		FbxString(const FbxString& pString);
+
+		/** String constructor.
+		* \param pString The string used to construct FbxString. */
+		FbxString(const char* pString);
+
+		/** Character constructor.
+		* \param pChar The character used to construct FbxString.
+		* \param pNbRepeat The number of times to repeat the character. Default value is 1 */
+		FbxString(char pChar, size_t pNbRepeat=1);
+
+		/** String constructor with maximum length.
+		* \param pCharPtr The string used to construct FbxString. 
+		* \param pLength  Maximum length. */
+		FbxString(const char* pCharPtr, size_t pLength);
+
+		/** Integer constructor.
+		* \param pValue The int value used to construct FbxString. */
+		FbxString(const int pValue);
+
+		/** Float constructor.
+		* \param pValue The float value used to construct FbxString. */
+		FbxString(const float pValue);
+
+		/** Double constructor.
+		* \param pValue The double value used to construct FbxString. */
+		FbxString(const double pValue);
+
+		//! Destructor.
+		~FbxString();
+	//@}
+
+	/**
+	* \name Buffer Access and Validation
+	*/
+	//@{
+		//! Get string length like "C" strlen().
+		size_t GetLen() const;
+
+		//! Get string length like "C" strlen().
+		size_t Size() const;
+
+		//! Return \c true if string length equal zero.
+		bool IsEmpty() const;
+
+		//! Discard the content of the string.
+		FbxString& Clear();
+
+		/** Access by reference.
+		* \param pIndex   The index.
+		* \return The reference of the char at pIndex. */
+		char& operator[](int pIndex);
+
+		/** Access by copy.
+		* \param pIndex   The index.
+		* \return The char at pIndex. */
+		char operator[](int pIndex) const;
+
+		//! Non-const buffer access.
+		char* Buffer();
+
+		//! Const buffer access.
+		const char* Buffer()const;
+	//@}
+
+	/**
+	* \name String Operations
+	*/
+	//@{
+		/** FbxString assignment operator.
+		* \param pString The FbxString to be assigned. */
+		const FbxString& operator=(const FbxString& pString);
+
+		/** Character assignment operator.
+		* \param pChar The character to be assigned. */
+		const FbxString& operator=(char pChar);
+
+		/** String assignment operator.
+		* \param pString The string to be assigned. */
+		const FbxString& operator=(const char* pString);
+
+		/** Int assignment operator.
+		* \param pValue The int value to be assigned. */
+		const FbxString& operator=(int pValue);
+
+		/** Float assignment operator.
+		* \param pValue The float value to be assigned. */
+		const FbxString& operator=(float pValue);
+
+		/** Double assignment operator.
+		* \param pValue The double value to be assigned. */
+		const FbxString& operator=(double pValue);
+
+		/** FbxString append.
+		* \param pString The FbxString to be appended. */
+		const FbxString& operator+=(const FbxString& pString);
+
+		/** Character append.
+		* \param pChar  The character to be appended. */
+		const FbxString& operator+=(char pChar);
+
+		/** String append.
+		* \param pString The string to be appended. */
+		const FbxString& operator+=(const char* pString);
+
+		/** Integer append.
+		* \param pValue The int value to be appended. */
+		const FbxString& operator+=(int pValue);
+
+		/** Float append.
+		* \param pValue The float value to be appended. */
+		const FbxString& operator+=(float pValue);
+
+		/** Double append.
+		* \param pValue The double value to be appended. */
+		const FbxString& operator+=(double pValue);
+
+		/** Equality operator.
+		* \param pString The FbxString to be compared. */
+		bool operator== (const FbxString& pString) const;
+
+		/** Inequality operator.
+		* \param pString The FbxString to be compared. */
+		bool operator!= (const FbxString& pString) const;
+
+		/** Inferior to operator.
+		* \param pString The FbxString to be compared. */
+		bool operator< (const FbxString& pString) const;
+
+		/** Inferior or equal to operator.
+		* \param pString The FbxString to be compared. */
+		bool operator<= (const FbxString& pString) const;
+
+		/** Superior or equal to operator.
+		* \param pString The FbxString to be compared. */
+		bool operator>= (const FbxString& pString) const;
+
+		/** Superior to operator.
+		* \param pString The FbxString to be compared. */
+		bool operator> (const FbxString& pString) const;
+
+		/** Equality operator.
+		* \param pString The string to be compared. */
+		bool operator== (const char* pString) const;
+
+		/** Inequality operator.
+		* \param pString The string to be compared. */
+		bool operator!= (const char* pString) const;
+
+		/** Inferior to operator.
+		* \param pString The string to be compared. */
+		bool operator< (const char* pString) const;
+
+		/** Inferior or equal to operator.
+		* \param pString The string to be compared. */
+		bool operator<= (const char* pString) const;
+
+		/** Superior or equal to operator.
+		* \param pString The string to be compared. */
+		bool operator>= (const char* pString) const;
+
+		/** Superior to operator.
+		* \param pString The string to be compared. */
+		bool operator> (const char* pString) const;
+
+		/** FbxString concatenation.
+		* \param pString1 FbxString 1 to be concatenated to FbxString 2.
+		* \param pString2 FbxString 2 to be concatenated to FbxString 1 */
+		friend FBXSDK_DLL FbxString operator+(const FbxString& pString1, const FbxString& pString2);
+
+		/** Character concatenation.
+		* \param pString  FbxString to be concatenated to Character.
+		* \param pChar  Character to be concatenated to FbxString */
+		friend FBXSDK_DLL FbxString operator+(const FbxString& pString, char pChar);
+
+		/** Character concatenation.
+		* \param pChar  Character to be concatenated to FbxString
+		* \param pString  FbxString to be concatenated to Character. */
+		friend FBXSDK_DLL FbxString operator+(char pChar, const FbxString& pString);
+
+		/** String concatenation.
+		* \param pString1  FbxString to be concatenated to String.
+		* \param pString2  String to be concatenated to FbxString */
+		friend FBXSDK_DLL FbxString operator+(const FbxString& pString1, const char* pString2);
+
+		/** String concatenation.
+		* \param pString1  String to be concatenated to FbxString
+		* \param pString2  FbxString to be concatenated to String. */
+		friend FBXSDK_DLL FbxString operator+(const char* pString1, const FbxString& pString2);
+
+		/** Integer concatenation.
+		* \param pString  FbxString to be concatenated to Integer.
+		* \param pValue  Integer to be concatenated to FbxString */
+		friend FBXSDK_DLL FbxString operator+(const FbxString& pString, int pValue);
+
+		/** Integer concatenation.
+		* \param pValue  Integer to be concatenated to FbxString 
+		* \param pString  FbxString to be concatenated to Integer. */
+		friend FBXSDK_DLL FbxString operator+(int pValue, const FbxString& pString);
+
+		/** Float concatenation.
+		* \param pString  FbxString to be concatenated to Float.
+		* \param pValue  Float to be concatenated to FbxString */
+		friend FBXSDK_DLL FbxString operator+(const FbxString& pString, float pValue);
+
+		/** Float concatenation.
+		* \param pValue  Float to be concatenated to FbxString
+		* \param pString  FbxString to be concatenated to Float. */
+		friend FBXSDK_DLL FbxString operator+( float pValue, const FbxString& pString);
+
+		/** Double concatenation.
+		* \param pString  FbxString to be concatenated to Double.
+		* \param pValue  Double to be concatenated to FbxString */
+		friend FBXSDK_DLL FbxString operator+(const FbxString& pString, double pValue);
+
+		//! Cast operator.
+		operator const char*() const;
+
+		/** String assignment function with maximum length.
+		  * \param pString The string to be assigned.
+		  * \param pLength The maximum length of string to be assigned. */
+		const FbxString& Copy(const char* pString, size_t pLength);
+
+		/** Append as "C" strncat().
+		* \param pString The string to be appended.
+		* \param pLength The length of chars to be appended. */
+		const FbxString& Append(const char* pString, size_t pLength);
+
+		/** Compare as "C" strcmp().
+		* \param pString    The string to be compared. */
+		int Compare(const char* pString) const;
+
+		/** Compare as "C" stricmp().
+		* \param pString    The string to be compared. */
+		int CompareNoCase(const char* pString) const;
+
+		/** Swap the contents of two strings.
+		* \param pString The FbxString to be swapped. */
+		void Swap(FbxString& pString);
+
+		//! Uppercase conversion.
+		FbxString Upper() const;
+
+		//! Lowercase conversion.
+		FbxString Lower() const;
+	//@}
+
+    /**
+    * \name Substring Extraction
+    */
+    //@{
+		/** Extract middle string for a given length.
+		* \param pFirst The start index of FbxString to be extracted.
+		* \param pCount The length of sub-string to be extracted. */
+		FbxString Mid(size_t pFirst, size_t pCount) const;
+
+		/** Extract middle string up to the end.
+		* \param pFirst The start index of FbxString to be extracted. */
+		FbxString Mid(size_t pFirst) const;
+
+		/** Extract left string.
+		* \param pCount The length of sub-string to be extracted. */
+		FbxString Left(size_t pCount) const;
+
+		/** Extract right string.
+		* \param pCount The length of sub-string to be extracted. */
+		FbxString Right(size_t pCount) const;
+	//@}
+
+	/**
+	* \name Padding
+	*/
+	//@{
+		/** \enum EPaddingType      Padding types.
+		* - \e eRight
+		* - \e eLeft
+		* - \e eBoth */
+		enum EPaddingType {eRight, eLeft, eBoth};
+
+		/** Add padding characters.
+		* \param pPadding The padding type.
+		* \param pLen The length limit of FbxString after padding. 
+		* \param pCar The character to be padded. */
+		FbxString Pad(EPaddingType pPadding, size_t pLen, char pCar=' ') const;
+
+		/** Remove padding characters.
+		* \param pPadding The padding type.
+		* \param pCar The character to be padded. 
+		* \remark If pCar == '\0' the function will remove all the characters that are tested by isspace(). */
+		FbxString UnPad(EPaddingType pPadding, char pCar='\0') const;
+	//@}
+
+	/**
+	* \name Search
+	*/
+	//@{
+		/** Look for a single character match, like "C" strchr().
+		* \param pChar The character to look for.
+		* \param pStartPosition  Start position to look for.
+		* \return Index or -1 if not found. */
+		int Find(char pChar, size_t pStartPosition=0) const;
+
+		/** Look for a substring match, like "C" strstr().
+		* \param pStrSub The substring to look for.
+		* \param pStartPosition  Start position to look for.
+		* \return Starting index or -1 if not found. */
+		int Find(const char* pStrSub, size_t pStartPosition=0) const;
+
+		/** Look for the last occurrence of character in string, like "C" strrchr().
+		* \param pChar The character to look for.
+		* \return Index or -1 if not found. */
+		int ReverseFind(char pChar) const;
+
+		/** Look for a single character match, like "C" strpbrk().
+		* \param pStrCharSet The character set.
+		* \param pStartPosition The start position.
+		* \return Index or -1 if not found. */
+		int FindOneOf(const char* pStrCharSet, size_t pStartPosition=0) const;
+
+		/** Replace a substring.
+		* \param pFind The substring to look for.
+		* \param pReplaceBy The string to replace by.
+		* \param pStartPosition The start position. 
+		* \return \c true if substring found and replaced. */
+		bool FindAndReplace(const char* pFind, const char* pReplaceBy, size_t pStartPosition=0);
+
+		/** Replace all occurrence of a substring.
+		* \param pFind The substring to look for.
+		* \param pReplaceBy The string to replace by.
+		* \return \c true if something got replaced. */
+		bool ReplaceAll(const char* pFind, const char* pReplaceBy);
+
+        /** Replace all occurrence of character to find by replacement character.
+		* \param pFind The character to look for.
+		* \param pReplaceBy The character to replace by.
+		* \return \c true if character found and replaced. */
+		bool ReplaceAll(char pFind, char pReplaceBy);
+	//@}
+
+	/**
+	* \name Token Extraction
+	*/
+	//@{
+		/** Get number of tokens.
+		* \param pSpans The span
+		* \return The number of tokens. */
+		int GetTokenCount(const char* pSpans) const;
+
+		/** Get token at given index.
+		* \param pTokenIndex The token index.
+		* \param pSpans The span */
+		FbxString GetToken(int pTokenIndex, const char* pSpans) const;
+	//@}
+
+private:
+	// Lengths/sizes in characters. 
+	// Note: an extra character is always allocated.
+	char* mData; // Actual string (zero terminated).
+
+	FbxString(size_t pSrc1Len, const char* pSrc1Data, size_t pSrc2Len, const char* pSrc2Data); // Previously ConcatCopy
+	void Init();
+
+	//! Invalidate string.
+	void Invalidate();
+
+	void FreeBuffer();
+	void FreeBuffer(char *&pOldData);
+
+	bool AllocCopy(FbxString& pDest, size_t pCopyLen, size_t pCopyIndex) const;
+	bool AllocBuffer(size_t pLen);
+	bool AllocBuffer(size_t pLen, char*& pOldData);
+
+	bool AssignCopy(size_t pSrcLen, const char* pSrcData);
+	bool ConcatInPlace(size_t pSrcLen, const char* pSrcData);
+
+	bool IsIn(char pChar, const char* pString) const;
+	bool InternalFindAndReplace(const char* pFind, const char* pReplaceBy, size_t& pStartPosition); 
+};
+
+FBXSDK_INCOMPATIBLE_WITH_ARRAY(FbxString);
+
+//! FbxString concatenation.
+FBXSDK_DLL FbxString operator+(const FbxString& pString1, const FbxString& pString2);
+
+//! Character concatenation.
+FBXSDK_DLL FbxString operator+(const FbxString& pString, char pChar);
+
+//! String concatenation.
+FBXSDK_DLL FbxString operator+(const FbxString& pString1, const char* pString2);
+
+//! Integer concatenation.
+FBXSDK_DLL FbxString operator+(const FbxString& pString, int pValue);
+
+//! Float concatenation.
+FBXSDK_DLL FbxString operator+(const FbxString& pString, float pValue);
+
+//! Double concatenation.
+FBXSDK_DLL FbxString operator+(const FbxString& pString, double pValue);
+
+//! Functor to compare FbxString
+struct FbxStringCompare { inline int operator()(const FbxString& pKeyA, const FbxString& pKeyB) const { return pKeyA.Compare(pKeyB); } };
+
+//! Functor to compare FbxString without case sensitivity
+struct FbxStringCompareNoCase { inline int operator()(const FbxString& pKeyA, const FbxString& pKeyB) const { return pKeyA.CompareNoCase(pKeyB); } };
+
+//! Functor to compare "C" strings
+struct FbxCharPtrCompare { inline int operator()(const char* pKeyA, const char* pKeyB) const { return strcmp(pKeyA, pKeyB); } };
+
+//! Functor to compare "C" strings without case sensitivity
+struct FbxCharPtrCompareNoCase { inline int operator()(const char* pKeyA, const char* pKeyB) const { return FBXSDK_stricmp(pKeyA, pKeyB); } };
+
+/** Remove the given char in the given string.
+* \param pString The given string.
+* \param pToRemove The given char that ought to be removed.
+* \remarks Strings used in this function are case-sensitive. */
+inline void FbxRemoveChar(FbxString& pString, char pToRemove)
+{
+    int lPos = pString.ReverseFind(pToRemove);
+    while( lPos >= 0 )
+    {
+        pString = pString.Left(lPos) + pString.Mid(lPos + 1);
+        lPos = pString.ReverseFind(pToRemove);
+    }
+}
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_STRING_H_ */

+ 368 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxstringlist.h

@@ -0,0 +1,368 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxstringlist.h
+#ifndef _FBXSDK_CORE_BASE_STRING_LIST_H_
+#define _FBXSDK_CORE_BASE_STRING_LIST_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxarray.h>
+#include <fbxsdk/core/base/fbxstring.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+//! Wraps a string (FbxString) and a pointer (FbxHandle).
+class FbxStringListItem
+{
+public:
+    FbxStringListItem(){ mReference = 0; }
+    FbxStringListItem(const char* pString, FbxHandle pRef=0){ mString = pString; mReference = pRef; }
+
+    FbxString	mString; 
+    FbxHandle		mReference;
+};
+
+inline int FbxCompareStringListSort(const void* E1, const void* E2)
+{
+	return FBXSDK_stricmp((*(FbxStringListItem**)E1)->mString.Buffer(), (*(FbxStringListItem**)E2)->mString.Buffer());
+}
+
+inline int FbxCompareStringListFindEqual(const void* E1, const void* E2)
+{
+	return FBXSDK_stricmp((*(FbxStringListItem*)E1).mString.Buffer(), (*(FbxStringListItem**)E2)->mString.Buffer());
+}
+
+inline int FbxCompareCaseSensitiveStringList(const void *E1,const void *E2)
+{
+	return strcmp((*(FbxStringListItem*)E1).mString.Buffer(), (*(FbxStringListItem**)E2)->mString.Buffer());
+}
+ 
+//! Base class of FbxStringList.
+template <class Type> class FbxStringListT
+{
+protected:
+    FbxArray<Type*> mList;
+
+public:
+	/**
+     * \name Operation With The Array 
+     */
+   //@{
+
+	 /** Append a item at the end of the array.
+    * \return Index of appended pointer.
+    */
+    int		AddItem( Type* pItem )		{ return mList.Add( pItem ); }
+
+    /** Insert a item in the array.
+    * \param pIndex Position where to insert the item.
+    * \param pItem  Item to insert.
+    * \return Position of the inserted item in the array.
+    * \remarks If the given index is out of range, the pointer is appended at the end of the array.
+    */
+	int		InsertItemAt( int pIndex, Type* pItem )	{ return mList.InsertAt( pIndex, pItem ); }
+
+	//! Access item at given index.
+    Type*   GetItemAt( int pIndex )	const	{ return mList[pIndex]; }
+
+	/** Find first matching item.
+    * \return Index of first matching item found or -1 if there is no matching element.
+    */
+    int		FindItem( Type* pItem )	const	{ return mList.Find( pItem ); }
+	//}@
+
+public : 
+    /**
+     * \name Constructor and Destructor
+     */
+   //@{
+
+	//! Default constructor.
+    FbxStringListT()
+    {
+    }
+
+	//! Destructor.
+    virtual ~FbxStringListT() { Clear(); }
+	//}@
+
+	//!Remove the item at the end of the array and delete the associated object.
+    void RemoveLast() { RemoveAt( mList.GetCount()-1 ); }
+
+	/** Get number of items in the array.
+     * \return The number of items in the array.
+     */
+    inline int		GetCount() const { return mList.GetCount(); }
+
+	//! Access the string in the item at given index.
+    FbxString&   operator[](int pIndex) { return mList[pIndex]->mString; }
+
+    //! Access the value of reference in the item at given index.
+    FbxHandle		GetReferenceAt(int pIndex) const { return mList[pIndex]->mReference; }
+
+    //! Set the value of reference at given index.        
+    void			SetReferenceAt(int pIndex, FbxHandle pRef) { mList[pIndex]->mReference = pRef; }
+
+	//! Access the pointer of string at given index.
+    char*		GetStringAt(int pIndex) const { if (pIndex<mList.GetCount()) return mList[pIndex]->mString.Buffer(); else return NULL; }
+    
+	//! Set string at given index.
+	virtual bool	SetStringAt(int pIndex, const char* pString) 
+    { 
+	    if (pIndex<mList.GetCount()) 
+	    {
+		    mList[pIndex]->mString = pString; 
+		    return true;
+	    } else return false; 
+    }
+   
+    /** Find first matching item.
+    * \return Index of first matching item found or -1 if  there is no
+    * matching element.
+    */
+    int Find( Type& pItem ) const
+    { 
+	    for (int Count=0; Count<mList.GetCount(); Count++) {
+		    if (mList[Count]==&pItem) {
+			    return Count;
+		    }
+	    }
+	    return -1;
+    }
+
+	/** Find first matching item which has the same reference as given parameter.
+    * \return Index of first matching item found or -1 if  there is no
+    * matching element.
+    */
+    int FindIndex( FbxHandle pReference ) const
+    { 
+	    for (int Count=0; Count<mList.GetCount(); Count++) {
+		    if (mList[Count]->mReference==pReference) {
+			    return Count;
+		    }
+	    }
+	    return -1;
+    }
+
+	/** Find first matching item in array whose string address is the same as given pointer.
+    * \return Index of first matching item found or -1 if  there is no
+    * matching element.
+    */
+    int FindIndex( const char* pString ) const
+    { 
+	    for (int lCount=0; lCount<mList.GetCount(); lCount++) {
+		    if (mList[lCount]->mString==pString) {
+			    return lCount;
+		    }
+	    }
+	    return -1;
+    }
+
+	/** Access the value of reference of the first matching item in array 
+	* whose string address is the same as given pointer.
+    * \return The value of reference of the first matching item found or NULL if  there is no
+    * matching element.
+    */
+    FbxHandle FindReference(const char* pString ) const
+    {
+    int lIndex = FindIndex( pString );
+	    if (lIndex!=-1) {
+		    return mList[lIndex]->mReference;
+	    }
+	    return 0; // NULL
+    }
+
+	//! Remove first matching item.
+    bool Remove ( Type& pItem )
+    {
+    int lIndex = Find( pItem );
+        if (lIndex>=0) {
+		    RemoveAt( lIndex );
+		    return true;
+	    }
+	    return false;
+    }
+
+	//! Remove first matching item in array whose string address is the same as given pointer.
+    bool Remove (const char* pString )
+    {
+    int lIndex = FindIndex( pString );
+        if (lIndex>=0) {
+		    RemoveAt( lIndex );
+		    return true;
+	    }
+	    return false;
+    }
+
+	//! Remove first matching item.
+    bool RemoveIt ( Type& pItem )
+    {
+    int lIndex = Find( pItem );
+        if (lIndex>=0) {
+		    RemoveAt( lIndex );
+		    return true;
+	    }
+	    return false;
+    }
+
+	//! Sort the array by the string of every item,not case sensitive.
+    void Sort( )
+    {
+	    qsort( &(mList.GetArray()[0]),mList.GetCount(),sizeof(FbxStringListItem*),FbxCompareStringListSort );
+    }
+
+    /** Find first matching item which has the same string as given parameter,not case sensitive.
+    * \return the pointer of matching item found or NULL if  there is no
+    * matching element.
+	* \remark To cast the returned pointer to the FbxStringListItem you need a double indirection: (FbxStringListItem**)
+    */
+	void* FindEqual(const char* pString) const
+    {
+    FbxStringListItem Key(pString);  
+    
+	    if (mList.GetCount() != 0)
+	    {
+		    return bsearch ( &Key, &(mList.GetArray()[0]),mList.GetCount(),sizeof(FbxStringListItem*),FbxCompareStringListFindEqual );
+	    }
+	    else
+	    {
+		    return NULL ;
+	    }
+    }
+
+	/** Find first matching item which has the same string as given parameter, case sensitive.
+    * \return the pointer of matching item found or NULL if  there is no
+    * matching element.
+	* \remark To cast the returned pointer to the FbxStringListItem you need a double indirection: (FbxStringListItem**)
+    */
+	void* FindCaseSensitive(const char* pString) const
+	{
+    FbxStringListItem Key(pString);  
+    
+	    if (mList.GetCount() != 0)
+	    {
+		    return bsearch ( &Key, &(mList.GetArray()[0]),mList.GetCount(),sizeof(FbxStringListItem*), FbxCompareCaseSensitiveStringList);
+	    }
+	    else
+	    {
+		    return NULL ;
+	    }
+	
+	}
+
+
+	//! Add a new item at the end of array.
+    int Add( const char* pString, FbxHandle pItem=0 ) 
+    { 
+	    return InsertAt( mList.GetCount(),pString,pItem ); 
+    }
+
+    virtual int InsertAt( int pIndex, const char* pString, FbxHandle pItem=0 ) 
+    { 
+	    return mList.InsertAt( pIndex,FbxNew< Type >( pString,(FbxHandle)pItem )); 
+    }
+
+    /** Remove the item at the given position in the array and delete the associated object.
+    * \param pIndex Position of the item to remove.
+    * \remarks If the index is not valid, nothing is performed. Otherwise,
+    * the item is removed from the array and the items are shifted to fill the
+    * empty slot.
+    */
+	virtual void RemoveAt(int pIndex)
+    { 
+	    FbxDelete(mList.RemoveAt(pIndex));
+    }
+
+	//! Delete the array.
+    virtual void Clear()
+    {
+		FbxArrayDelete(mList);
+    }
+
+	/** Get the string of all the item.
+    * \return The text of string, each item's string separated by '~'.
+    */
+   virtual void GetText(FbxString& pText) const
+    {
+	    int	lCount;
+	    for (lCount=0; lCount<mList.GetCount(); lCount++) 
+        {
+            pText += mList[lCount]->mString;
+            if (lCount<mList.GetCount()-1) 
+            {               
+                pText += "~";               
+            }
+	    }
+    }
+
+    /** Clear the array and set the array's new items with the substring separated by '~' from the given string.
+    * \param pList The string which used to generate the new items.
+	* \return The last index of the item in the new array.
+    * \remarks The number of items in the new array is the same as the number of substrings, 
+	* and the string of each item is decided by the content of each substring.
+    */ 
+    virtual int SetText(const char* pList)
+    {
+    int		lPos=0, lOldPos = 0;
+    int		lLastIndex=0;
+    FbxString	lName=pList;
+
+	    Clear();
+	    for (lPos=0; lName.Buffer()[lPos]!=0; lPos++) {
+    	    if (lName.Buffer()[lPos]=='~') {
+        	    lName.Buffer()[lPos]=0;
+        	    lLastIndex = Add(lName.Buffer()+lOldPos);
+        	    lOldPos=lPos+1;
+    	    }
+	    }
+
+	    if(lOldPos != lPos)
+	    {
+	        lLastIndex = Add(lName.Buffer()+lOldPos);
+	    }
+	    return lLastIndex;
+    } 
+
+
+};
+
+/** Array that stores pairs of FbxString and a pointer.
+  */
+class FBXSDK_DLL FbxStringList : public FbxStringListT<FbxStringListItem>
+{
+public:
+	/**
+	  * \name Constructors
+	  */
+	//@{
+		//! Default constructor.
+		FbxStringList(); 
+
+		//! Copy constructor.
+		FbxStringList( const FbxStringList& pOriginal );
+	//@}
+
+	/**
+	 * \name Assignment Operators
+	 */
+	//@{
+		//! FbxStringList assignment function.
+		void CopyFrom( const FbxStringList* pOriginal  );
+
+		//! FbxStringList assignment operator.
+		FbxStringList& operator=(const FbxStringList& pOriginal);
+	//@}
+};
+	  
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_STRING_LIST_H_ */

+ 648 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxtime.h

@@ -0,0 +1,648 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxtime.h
+#ifndef _FBXSDK_CORE_BASE_TIME_H_
+#define _FBXSDK_CORE_BASE_TIME_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxtimecode.h>
+#include <fbxsdk/core/base/fbxstring.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+#define FBXSDK_TIME_INFINITE		FbxTime(FBXSDK_TC_INFINITY)
+#define FBXSDK_TIME_MINUS_INFINITE	FbxTime(FBXSDK_TC_MINFINITY)
+#define FBXSDK_TIME_ZERO			FbxTime(FBXSDK_TC_ZERO)
+#define FBXSDK_TIME_EPSILON			FbxTime(FBXSDK_TC_EPSILON)
+#define FBXSDK_TIME_ONE_SECOND		FbxTime(FBXSDK_TC_SECOND)
+#define FBXSDK_TIME_ONE_MINUTE		FbxTime(FBXSDK_TC_MINUTE)
+#define FBXSDK_TIME_ONE_HOUR		FbxTime(FBXSDK_TC_HOUR)
+#define FBXSDK_TIME_ASSERT_EPSILON	0.5
+#define FBXSDK_TIME_FORWARD			1
+#define FBXSDK_TIME_BACKWARD		-1
+
+class FbxTimeModeObject;
+
+/** Class to encapsulate time units.
+  * \nosubgrouping
+  * FbxTime can measure time in hour, minute, second, frame, field, residual and also combination of these units.
+  * It is recommended to use FbxTime for all time related operations. For example, currently it is used in FbxGlobalSettings,
+  * FbxGlobalTimeSettings, FbxCache, all curve filters and all animation-related classes, etc.
+  * FbxTime is just used to represent a moment, to represent a period of time, FbxTimeSpan should be used.
+  * \see FbxTimeSpan
+  */
+class FBXSDK_DLL FbxTime 
+{
+public:
+	/** Long long constructor.
+	  * \param pTime Initial value defined as a 64bit integer.
+	  */
+	FbxTime(const FbxLongLong pTime=0){ mTime = pTime; }
+
+	/**
+	  * \name Time Modes and Protocols
+	  */
+    //@{
+		/** Time modes.
+		  * \remarks
+		  * EMode \c eNTSCDropFrame is used for broadcasting operations where 
+		  * clock time must be (almost) in sync with time code. To bring back color 
+		  * NTSC time code with clock time, this mode drops 2 frames per minute
+		  * except for every 10 minutes (00, 10, 20, 30, 40, 50). 108 frames are 
+		  * dropped per hour. Over 24 hours the error is 2 frames and 1/4 of a 
+		  * frame. A time-code of 01:00:03:18 equals a clock time of 01:00:00:00
+		  * 
+		  * \par
+		  * EMode \c eNTSCFullFrame represents a time address and therefore is NOT 
+		  * IN SYNC with clock time. A time code of 01:00:00:00 equals a clock time 
+		  * of 01:00:03:18.
+		  * 
+		  * - \e eDefaultMode		
+		  * - \e eFrames120			120 frames/s
+		  * - \e eFrames100			100 frames/s
+		  * - \e eFrames60          60 frames/s
+		  * - \e eFrames50          50 frames/s
+		  * - \e eFrames48          48 frame/s
+		  * - \e eFrames30          30 frames/s (black and white NTSC)
+		  * - \e eFrames30Drop		30 frames/s (use when display in frame is selected, equivalent to NTSC drop)
+		  * - \e eNTSCDropFrame		~29.97 frames/s drop color NTSC
+		  * - \e eNTSCFullFrame		~29.97 frames/s color NTSC
+		  * - \e ePAL				25 frames/s	PAL/SECAM
+		  * - \e eFrames24			24 frames/s Film/Cinema
+		  * - \e eFrames1000		1000 milli/s (use for date time)
+		  * - \e eFilmFullFrame		~23.976 frames/s
+		  * - \e eCustom            Custom frame rate value
+		  * - \e eFrames96			96 frames/s
+		  * - \e eFrames72			72 frames/s
+		  * - \e eFrames59dot94		~59.94 frames/s
+		  * - \e eModesCount		Number of time modes
+		  */
+		enum EMode
+		{
+			eDefaultMode,
+			eFrames120,
+			eFrames100,
+			eFrames60,
+			eFrames50,
+			eFrames48,
+			eFrames30,
+			eFrames30Drop,
+			eNTSCDropFrame,
+			eNTSCFullFrame,
+			ePAL,
+			eFrames24,
+			eFrames1000,
+			eFilmFullFrame,
+			eCustom,
+			eFrames96,
+			eFrames72,
+			eFrames59dot94,
+			eModesCount
+		};
+
+		/** Time protocols enumaration
+		  * - \e eSMPTE				SMPTE EProtocol
+		  * - \e eFrameCount		Frame count
+		  * - \e eDefaultProtocol	Default protocol (initialized to eFRAMES)
+		  */
+		enum EProtocol {eSMPTE, eFrameCount, eDefaultProtocol};
+
+		/** Set default time mode.
+		  * \param pTimeMode  Time mode identifier.
+		  * \param pFrameRate Custom framerate, only have effect in case of pTimeMode = FbxTime::eCustom
+		  * \remarks It is meaningless to set default time mode to \c eDefaultMode.
+		  */
+		static void SetGlobalTimeMode(EMode pTimeMode, double pFrameRate=0.0);
+
+		/** Get default time mode.
+		  * \return Currently set time mode identifier.
+		  * \remarks Default time mode initial value is eFrames30.
+		  */
+		static EMode GetGlobalTimeMode();
+
+		/** Set default time protocol.
+		  * \param pTimeProtocol Time protocol identifier.
+		  * \remarks It is meaningless to set default time protocol to \c eDefaultProtocol.
+		  */
+		static void SetGlobalTimeProtocol(EProtocol pTimeProtocol);
+
+		/** Get default time protocol.
+		  * \return Currently set time protocol identifier.
+		  * \remarks Default time protocol initial value is eSMPTE.
+		  */
+		static EProtocol GetGlobalTimeProtocol();
+
+		/** Get frame rate associated with time mode, in frames per second.
+		  * \param pTimeMode Time mode identifier.
+		  * \return Frame rate value.
+		  */
+		static double GetFrameRate(EMode pTimeMode);
+
+		/** Get time mode associated with frame rate.
+		  * \param pFrameRate The frame rate value.
+		  * \param pPrecision The tolerance value.
+		  * \return The corresponding time mode identifier or \c eDefaultMode if no time 
+		  * mode associated to the given frame rate is found.
+		  */
+		static EMode ConvertFrameRateToTimeMode(double pFrameRate, double pPrecision=0.00000001);
+	//@}
+	
+	/**
+	  * \name Time Conversion
+	  */
+	//@{
+		/** Set time in internal format.
+		  * \param pTime Time value to set.
+		  */
+		inline void Set(FbxLongLong pTime){ mTime = pTime; }
+
+		/** Get time in internal format.
+		  * \return Time value.
+		  */
+		inline FbxLongLong Get() const { return mTime; }
+
+		/** Set time in milliseconds.
+		  * \param pMilliSeconds Time value to set.
+		  */
+		inline void SetMilliSeconds(FbxLongLong pMilliSeconds){ mTime = pMilliSeconds * FBXSDK_TC_MILLISECOND; }
+
+		/** Get time in milliseconds.
+		  * \return Time value.
+		  */
+		inline FbxLongLong GetMilliSeconds() const { return mTime / FBXSDK_TC_MILLISECOND; }
+
+		/** Set time in seconds.
+		  * \param pTime Time value to set.
+		  */
+		void SetSecondDouble(double pTime);
+
+		/** Get time in seconds.
+		  * \return Time value.
+		  */
+		double GetSecondDouble() const;
+
+		/** Set time in hour/minute/second/frame/field format.
+		  * \param pHour The hours value.
+		  * \param pMinute    The minutes value.
+		  * \param pSecond    The seconds value.
+		  * \param pFrame     The frames values.
+		  * \param pField     The field value.
+		  * \param pTimeMode  Time mode identifier.
+		  * \remarks Parameters pHour, pMinute, pSecond, pFrame and pField are summed together.
+		  * For example, it is possible to set the time to 83 seconds in the following
+		  * ways: SetTime(0,1,23) or SetTime(0,0,83).
+		  */
+		void SetTime(int pHour, int pMinute, int pSecond, int pFrame=0, int pField=0, EMode pTimeMode=eDefaultMode);
+
+		/** Set time in hour/minute/second/frame/field/residual format.
+		  * \param pHour The hours value.
+		  * \param pMinute       The minutes value.
+		  * \param pSecond       The seconds value.
+		  * \param pFrame        The frames values.
+		  * \param pField        The field value.
+		  * \param pResidual     The hundredths of frame value.
+		  * \param pTimeMode     Time mode identifier.
+		  * \remarks Parameters pHour, pMinute, pSecond, pFrame, pField and pResidual 
+		  * are summed together, just like above.
+		  * pResidual represents hundredths of frame, and won't necessarily
+		  * correspond to an exact internal value.
+		  *
+		  * \remarks The time mode can't have a default value, because
+		  *         otherwise SetTime(int, int, int, int, int, int)
+		  *         would be ambiguous. Please specify DEFAULT_MODE.
+		  */
+		void SetTime(int pHour, int pMinute, int pSecond, int pFrame, int pField, int pResidual, EMode pTimeMode);
+
+		/** Get time in hour/minute/second/frame/field/residual format.
+		  * \param pHour       The returned hours value.
+		  * \param pMinute     The returned minutes value.
+		  * \param pSecond     The returned seconds value.
+		  * \param pFrame      The returned frames values.
+		  * \param pField      The returned field value.
+		  * \param pResidual   The returned hundredths of frame value.
+		  * \param pTimeMode   The time mode identifier which will dictate the extraction algorithm.
+		  * \return \c true if the pTimeMode parameter is a valid identifier and thus the extraction
+		  * succeeded. If the function returns \c false, all the values are set to 0.
+		  */
+		bool GetTime(int& pHour, int& pMinute, int& pSecond, int& pFrame, int& pField, int& pResidual, EMode pTimeMode=eDefaultMode) const;
+
+		/** Snaps a time value to the time value associated with the nearest frame.
+		  * \param pRound  If \c true the return value is rounded to the nearest integer.
+		  * \return        The snapped time value.
+		  */
+		FbxTime	GetFramedTime(bool pRound=true) const;
+
+		/** Set time in frame format.
+		  * \param pFrames The number of frames.
+		  * \param pTimeMode The time mode identifier which will dictate the extraction algorithm.
+		  */
+		void SetFrame(FbxLongLong pFrames, EMode pTimeMode=eDefaultMode);
+
+		/** Set time in frame format, including fractions.
+		  * \param pFrames The number of frames in decimal value.
+		  * \param pTimeMode The time mode identifier which will dictate the extraction algorithm.
+		  */
+		void SetFramePrecise(FbxDouble pFrames, EMode pTimeMode=eDefaultMode);
+
+		/** Get number of hours in time.
+		  * \return Hours value.
+		  */
+		int GetHourCount() const;
+
+		/** Get number of minutes in time.
+		  * \return Minutes value.
+		  */
+		int GetMinuteCount() const;
+
+		/** Get number of seconds in time.
+		  * \return Seconds value.
+		  */
+		int GetSecondCount() const;
+
+		/** Get number of frames in time.
+		  * \param pTimeMode Time mode identifier.
+		  * \return Integer value representing the frame count.
+		  */
+		FbxLongLong GetFrameCount(EMode pTimeMode=eDefaultMode) const;
+
+		/** Get precise number of frames in time, including fractions.
+		  * \param pTimeMode Time mode identifier.
+		  * \return Decimal value representing the frame count, including fractions.
+		  */
+		FbxDouble GetFrameCountPrecise(EMode pTimeMode=eDefaultMode) const;
+
+		/** Get number of fields in time.
+		  * \param pTimeMode Time mode identifier.
+		  * \return Fields value.
+		  */
+		FbxLongLong GetFieldCount(EMode pTimeMode=eDefaultMode) const;
+
+		/** Get residual time exceeding last full field.
+		  * \param pTimeMode Time mode identifier.
+		  * \return Residual value.
+		  */
+		int GetResidual(EMode pTimeMode=eDefaultMode) const;
+
+		/** Test for Drop Frame mode
+		  * \param pTimeMode Time mode identifier.
+		  * \return True if the pTimeMode is a Drop Frame mode.
+		  */
+		static bool IsDropFrame(EMode pTimeMode=eDefaultMode);
+
+		/** Separator char between second and frame.
+		  * \param pTimeMode Time mode identifier.
+		  * \return ';' is returned if pTimeMode is a DropFrame mode otherwise ':'.
+		  */
+		char GetFrameSeparator(EMode pTimeMode=eDefaultMode) const;
+
+		/** Get time in a human readable format.
+		  * \param pTimeString An array large enough to contain a minimum of 19 characters.
+          * \param pTimeStringSize Size of the pTimeString buffer used with secure functions.
+		  * \param pInfo The amount of information if time protocol is \c eSMPTE:
+		  * <ul><li>1 means hours only
+		  *     <li>2 means hours and minutes
+		  *     <li>3 means hours, minutes and seconds
+		  *     <li>4 means hours, minutes, seconds and frames
+		  *     <li>5 means hours, minutes, seconds, frames and field
+		  *     <li>6 means hours, minutes, seconds, frames, field and residual value</ul>
+		  * \param pTimeMode Requested time mode.
+		  * \param pTimeFormat Requested time protocol.
+		  * \return pTimeString parameter filled with a time value or set to a empty string
+		  * if parameter pInfo is not valid.
+		  */
+		char* GetTimeString(char* pTimeString, const FbxUShort& pTimeStringSize, int pInfo=5, EMode pTimeMode=eDefaultMode, EProtocol pTimeFormat=eDefaultProtocol) const;
+
+		enum EElement {eHours, eMinutes, eSeconds, eFrames, eField, eResidual};
+
+		/** Get the time in a human readable format.
+		* \param pStart The starting element type used to format the time string.
+		* \param pEnd The last element type used to format the time string.
+		* \param pTimeMode The time mode requested.
+		* \param pTimeFormat The time format requested.
+		* \return The human readable time string. */
+		FbxString GetTimeString(EElement pStart=eHours, EElement pEnd=eResidual, EMode pTimeMode=eDefaultMode, EProtocol pTimeFormat=eDefaultProtocol) const;
+
+        /** Set time in a human readable format.
+		  * \param pTime An array of a maximum of 18 characters.
+		  * If time protocol is \c eSMPTE, pTimeString must be formatted this way:
+		  * "[hours:]minutes[:seconds[.frames[.fields]]]". Hours, minutes, seconds, 
+		  * frames and fields are parsed as integers and brackets indicate optional 
+		  * parts. 
+		  * If time protocol is \c eFRAME, pTimeString must be formatted this way:
+		  * "frames". Frames is parsed as a 64 bits integer.
+		  * \param pTimeMode   Given time mode.
+		  * \param pTimeFormat Given time protocol.
+		  * \return True if the set time string succeed, otherwise return false.
+		  */
+		bool SetTimeString(const char* pTime, EMode pTimeMode=eDefaultMode, EProtocol pTimeFormat=eDefaultProtocol);
+    //@}
+
+	/**
+	  * \name Time Operators
+	  */
+	//@{
+		/** Equality operator.
+		  * \param pTime The FbxTime to be compared.
+		  * \return \c true if equal, \c false otherwise.
+		  */
+		inline bool operator==(const FbxTime& pTime) const { return mTime == pTime.mTime; }
+
+		/** Inequality operator.
+		  * \param pTime The FbxTime to be compared.
+		  * \return \c true if unequal, \c false otherwise.
+		  */
+		inline bool operator!=(const FbxTime& pTime) const { return mTime != pTime.mTime; }
+
+		/** Superior or equal to operator.
+		  * \param pTime The FbxTime to be compared.
+		  * \return \c true if this FbxTime is superior or equal to the passed FbxTime, \c false otherwise.
+		  */
+		inline bool operator>=(const FbxTime& pTime) const { return mTime >= pTime.mTime; }
+
+		/** Inferior or equal to operator.
+		  * \param pTime The FbxTime to be compared.
+		  * \return \c true if this FbxTime is inferior or equal to the passed FbxTime, \c false otherwise.
+		  */
+		inline bool operator<=(const FbxTime& pTime) const { return mTime <= pTime.mTime; }
+
+		/** Superior to operator.
+		  * \param pTime The FbxTime to be compared.
+		  * \return \c true if this FbxTime is superior to the passed FbxTime, \c false otherwise.
+		  */
+		inline bool operator>(const FbxTime& pTime) const { return mTime > pTime.mTime; }
+
+		/** Inferior to operator.
+		  * \param pTime The FbxTime to be compared.
+		  * \return \c true if this FbxTime is inferior to the passed FbxTime, \c false otherwise.
+		  */
+		inline bool operator<(const FbxTime& pTime) const { return mTime < pTime.mTime; } 
+
+		/** Assignment operator.
+		  * \param pTime The FbxTime to be assigned.
+		  */
+		inline FbxTime& operator=(const FbxTime& pTime) { mTime = pTime.mTime; return *this; }
+
+		/** Addition operator.
+		  * \param  pTime The FbxTime to be added.
+		  * \return This FbxTime after addition.
+		  */
+		inline FbxTime& operator+=(const FbxTime& pTime) { mTime += pTime.mTime; return *this; }
+
+		/** Subtraction operator.
+		  * \param pTime The FbxTime to be subtracted.
+		  * \return This FbxTime after subtraction.
+		  */
+		inline FbxTime& operator-=(const FbxTime& pTime) { mTime -= pTime.mTime; return *this; }
+
+		/** Addition operator.
+		  * \param pTime The FbxTime to be added.
+		  * \return A temporary FbxTime after addition. 
+		  */
+		FbxTime operator+(const FbxTime& pTime) const;
+
+		/** Subtraction operator.
+		  * \param pTime The FbxTime to be subtracted.
+		  * \return A temporary FbxTime after subtraction. 
+		  */
+		FbxTime operator-(const FbxTime& pTime) const;
+
+		/** Multiplication operator.
+		  * \param Mult Multiply this FbxTime by int Mult.
+		  * \return A temporary FbxTime after multiplication. 
+		  */
+		FbxTime operator*(const int Mult) const;
+
+		/** Division operator.
+		  * \param pTime Divide this FbxTime by pTime.
+		  * \return A temporary FbxTime after division. 
+		  */
+		FbxTime operator/(const FbxTime& pTime) const;
+
+		/** Multiplication operator.
+		  * \param pTime Multiply this FbxTime by pTime.
+		  * \return A temporary FbxTime after multiplication. 
+		  */
+		FbxTime operator*(const FbxTime& pTime) const;
+/*
+		//! Increment time of one unit of the internal format (prefix form).
+		inline FbxTime& operator++() { mTime += 1; return (*this); }
+
+		//! Increment time of one unit of the internal format (postfix form).
+		inline const FbxTime operator++(int) { FbxTime lOld = *this; ++(*this); return lOld; }
+
+		//! Decrement time of one unit of the internal format (prefix form).
+		inline FbxTime& operator--() { mTime -= 1; return (*this); }
+
+		//! Decrement time of one unit of the internal format (postfix form).
+		inline const FbxTime operator--(int) { FbxTime lOld = *this; --(*this); return lOld; }*/
+	//@}
+
+	/** One frame value for a specified time mode.
+	  * \param pTimeMode Time mode identifier.
+	  * \return the time code of a one frame.
+	  */
+	static FbxLongLong GetOneFrameValue(EMode pTimeMode=eDefaultMode);
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	// Keep compatibility with old fbx format
+	enum EOldMode
+	{
+		eOLD_DEFAULT_MODE,		//Default mode set using FbxTime::SetGlobalTimeMode(EMode pTimeMode)
+		eOLD_CINEMA,			//24 frameOLD_s/s
+		eOLD_PAL,				//25 frameOLD_s/s	 PAL/SECAM
+		eOLD_FRAMES30,			//30 frameOLD_s/s	 BLACK & WHITE NTSC
+		eOLD_NTSC_DROP_FRAME,   //29.97002617 frameOLD_s/s COLOR NTSC
+		eOLD_FRAMES50,			//50 frameOLD_s/s
+		eOLD_FRAMES60,			//60 frameOLD_s/s
+		eOLD_FRAMES100,			//100 frameOLD_s/s
+		eOLD_FRAMES120,			//120 frameOLD_s/s
+		eOLD_NTSC_FULL_FRAME,	//29.97002617 frameOLD_s/s COLOR NTSC
+		eOLD_FRAMES30_DROP,		//30 frameOLD_s/s
+		eOLD_FRAMES1000			//1000 frameOLD_s/s
+	};
+
+private:
+	FbxLongLong					mTime; //In 1 / 46,186,158,000 Seconds
+
+	static EMode				gsGlobalTimeMode;
+	static EProtocol			gsGlobalTimeProtocol;
+	static FbxTimeModeObject*	gsTimeObject;
+
+	void InternalSetTime(int pHour, int pMinute, int pSecond, FbxLongLong pFrame, int pField, EMode pTimeMode);
+
+    friend FBXSDK_DLL FbxTime::EMode		FbxGetGlobalTimeMode();
+	friend FBXSDK_DLL FbxTimeModeObject*	FbxGetGlobalTimeModeObject();
+    friend FBXSDK_DLL FbxTime::EProtocol	FbxGetGlobalTimeFormat();
+	friend FBXSDK_DLL void					FbxSetGlobalTimeMode(FbxTime::EMode pTimeMode, double pFrameRate);
+    friend FBXSDK_DLL void					FbxSetGlobalTimeFormat(FbxTime::EProtocol pTimeFormat);
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/** FbxTime in seconds constructor.
+  * \param pTime 
+  */
+FBXSDK_DLL inline FbxTime FbxTimeSeconds(const FbxDouble& pTime=0.0)
+{
+	FbxTime lTime;
+	lTime.SetSecondDouble(pTime);
+	return lTime;
+}
+
+/** Class to encapsulate time intervals.
+  * \nosubgrouping
+  * \see FbxTime 
+  */
+class FBXSDK_DLL FbxTimeSpan
+{
+public:
+	//! Constructor.
+	FbxTimeSpan() {}
+
+	/** Constructor.
+	  * \param pStart Beginning of the time interval.
+	  * \param pStop  Ending of the time interval.
+	  */
+	FbxTimeSpan(FbxTime pStart, FbxTime pStop){ mStart = pStart; mStop = pStop; }
+
+	/** Set start and stop time.
+	  * \param pStart Beginning of the time interval.
+	  * \param pStop  Ending of the time interval.
+	  */
+	inline void Set(FbxTime pStart, FbxTime pStop){ mStart = pStart; mStop = pStop; }
+
+	/** Set start time.
+	  * \param pStart Beginning of the time interval.
+	  */
+	inline void SetStart(FbxTime pStart){ mStart = pStart; }
+
+	/** Set stop time.
+	  * \param pStop  Ending of the time interval.
+	  */
+	inline void SetStop(FbxTime pStop){ mStop = pStop; }
+
+	/** Get start time.
+	  * \return Beginning of time interval.
+	  */
+	inline FbxTime GetStart() const { return mStart; }
+
+	/** Get stop time.
+	  * \return Ending of time interval.
+	  */
+	inline FbxTime GetStop() const { return mStop; }
+
+	/** Get time interval in absolute value.
+	  * \return Time interval.
+	  */
+	inline FbxTime GetDuration() const { if( mStop > mStart ) return mStop - mStart; else return mStart - mStop; }
+
+	/** Get time interval.
+	  * \return Signed time interval.
+	  */
+	inline FbxTime GetSignedDuration() const { return mStop - mStart; }
+
+	/** Get direction of the time interval.
+	  * \return \c FBXSDK_TIME_FORWARD if time interval is forward, \c FBXSDK_TIME_BACKWARD if backward.
+	  */
+	inline int GetDirection() const { if( mStop >= mStart ) return FBXSDK_TIME_FORWARD; else return FBXSDK_TIME_BACKWARD; }
+
+	/** Return \c true if the time is inside the timespan.
+	  * \param pTime Judge whether pTime is inside the timespan.
+	  * \return \c True if is, \c false otherwise.
+	  */
+	bool IsInside(FbxTime pTime) const;
+
+	/** Return the intersection of the two time spans.
+	  * \param pTime 
+	  * \return The intersection of pTime and this FbxTimeSpan.
+	  */
+	FbxTimeSpan Intersect(const FbxTimeSpan& pTime) const;
+
+	/** Inequality operator.
+	  * \param pTime FbxTimeSpan compared with this one.
+	  * \return \c True if unequal, \c false otherwise.
+	  */
+	bool operator!=(const FbxTimeSpan& pTime) const;
+
+	/** Equality operator.
+	  * \param pTime FbxTimeSpan compared with this one.
+	  * \return \c True if equal, \c false otherwise.
+	  */
+	bool operator==(const FbxTimeSpan& pTime) const;
+
+	/** Unite with another FbxTimeSpan
+	  * \param pSpan The FbxTimeSpan
+	  * \param pDirection FBXSDK_TIME_FORWARD or FBXSDK_TIME_BACKWARD
+	  * \remarks This function assumes both of the FbxTimeSpan objects are in the same direction.
+	  * Use FBXSDK_TIME_FORWARD when start < stop in both timespan
+	  * Use FBXSDK_TIME_BACKWARD when start > stop in both timespan
+	  */
+	void UnionAssignment(const FbxTimeSpan& pSpan, int pDirection=FBXSDK_TIME_FORWARD);
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+	FbxTime mStart;
+	FbxTime mStop;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+class FBXSDK_DLL FbxLocalTime
+{
+public:
+	FbxLocalTime();
+
+	int mYear;
+	int mMonth;
+	int mDay;
+	int mHour;
+	int mMinute;
+	int mSecond;
+	int mMillisecond;
+};
+
+FBXSDK_DLL void					FbxGetCurrentLocalTime(FbxLocalTime& pLocalTime);
+
+FBXSDK_DLL FbxTime::EMode		FbxGetGlobalTimeMode();
+FBXSDK_DLL FbxTimeModeObject*	FbxGetGlobalTimeModeObject();
+FBXSDK_DLL FbxTime::EProtocol	FbxGetGlobalTimeFormat();
+FBXSDK_DLL void					FbxSetGlobalTimeMode(FbxTime::EMode pTimeMode, double pFrameRate=0.0);
+FBXSDK_DLL void					FbxSetGlobalTimeFormat(FbxTime::EProtocol pTimeFormat);
+
+// Use those functions to keep the compatibility with old time mode since we added new time mode.
+FBXSDK_DLL FbxTime::EOldMode		FbxGetOldTimeModeCorrespondance(FbxTime::EMode pMode);
+FBXSDK_DLL FbxTime::EMode		FbxGetTimeModeFromOldValue(FbxTime::EOldMode pOldMode);
+
+// We now store the framerate instead of the time mode.
+FBXSDK_DLL FbxTime::EMode		FbxGetTimeModeFromFrameRate(char* pFrameRate);
+FBXSDK_DLL void					FbxGetControlStringList(char* pControlString, FbxTime::EProtocol pTimeFormat);
+FBXSDK_DLL const char*			FbxGetGlobalFrameRateString(FbxTime::EMode pTimeMode);
+FBXSDK_DLL const char*			FbxGetGlobalTimeModeString(FbxTime::EMode pTimeMode);
+FBXSDK_DLL double				FbxGetFrameRate(FbxTime::EMode pTimeMode);
+
+// Time format
+FBXSDK_DLL FbxTime::EProtocol	FbxSelectionToTimeFormat(int pSelection);
+FBXSDK_DLL FbxTime::EMode		FbxSelectionToTimeMode(int pSelection);
+FBXSDK_DLL int					FbxTimeToSelection(FbxTime::EMode pTimeMode=FbxTime::eDefaultMode, int pTimeFormat=FbxTime::eDefaultProtocol);
+FBXSDK_DLL const char*			FbxGetTimeModeName(FbxTime::EMode pTimeMode);
+FBXSDK_DLL int					FbxGetFrameRateStringListIndex(FbxTime::EMode pTimeMode);
+FBXSDK_DLL bool					FbxIsValidCustomFrameRate(double pFramerate);
+FBXSDK_DLL bool					FbxGetNearestCustomFrameRate(double pFramerate, double& pNearestRate);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_TIME_H_ */

+ 99 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxtimecode.h

@@ -0,0 +1,99 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxtimecode.h
+#ifndef _FBXSDK_CORE_BASE_TIMECODE_H_
+#define _FBXSDK_CORE_BASE_TIMECODE_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+#define FBXSDK_TC_ZERO					FBXSDK_LONGLONG(0)  
+#define FBXSDK_TC_EPSILON				FBXSDK_LONGLONG(1)
+#define FBXSDK_TC_MINFINITY				FBXSDK_LONGLONG(-0x7fffffffffffffff)
+#define FBXSDK_TC_INFINITY				FBXSDK_LONGLONG(0x7fffffffffffffff)
+#define FBXSDK_TC_FIX_DEN				FBXSDK_LONGLONG(100000000)
+
+#define FBXSDK_TC_MILLISECOND			FBXSDK_LONGLONG(46186158) 
+#define FBXSDK_TC_SECOND				FbxLongLong(FBXSDK_TC_MILLISECOND*1000)
+#define FBXSDK_TC_MINUTE				FbxLongLong(FBXSDK_TC_SECOND*60)
+#define FBXSDK_TC_HOUR					FbxLongLong(FBXSDK_TC_MINUTE*60)
+#define FBXSDK_TC_DAY					FbxLongLong(FBXSDK_TC_HOUR*24)
+
+// Frame @ 30 Hz
+#define FBXSDK_TC_NTSC_FIELD			FbxLongLong(FBXSDK_TC_SECOND/30/2)
+#define FBXSDK_TC_NTSC_FRAME			FbxLongLong(FBXSDK_TC_SECOND/30)
+
+// Frame @ 29.9700299700 Hz
+#define FBXSDK_TC_MNTSC_FIELD			FbxLongLong(FBXSDK_TC_MNTSC_FRAME/2)
+#define FBXSDK_TC_MNTSC_FRAME			FbxLongLong(FBXSDK_TC_SECOND/30*1001/1000)
+#define FBXSDK_TC_MNTSC_2_FRAMES		FbxLongLong(FBXSDK_TC_MNTSC_FRAME*2)
+#define FBXSDK_TC_MNTSC_30_FRAMES		FbxLongLong(FBXSDK_TC_MNTSC_FRAME*30)
+#define FBXSDK_TC_MNTSC_1798_FRAMES		FbxLongLong(FBXSDK_TC_MNTSC_FRAME*1798)		// leap minute
+#define FBXSDK_TC_MNTSC_1800_FRAMES		FbxLongLong(FBXSDK_TC_MNTSC_FRAME*1800)		// ~1 minute
+#define FBXSDK_TC_MNTSC_17982_FRAMES	FbxLongLong(FBXSDK_TC_MNTSC_FRAME*17982)	// ~10 minutes
+#define FBXSDK_TC_MNTSC_107892_FRAMES	FbxLongLong(FBXSDK_TC_MNTSC_FRAME*107892)	// ~1 hour
+#define FBXSDK_TC_MNTSC_108000_FRAMES	FbxLongLong(FBXSDK_TC_MNTSC_FRAME*108000)
+
+// For 29.9700299700 non-drop, btw : same values as with 23.976
+#define FBXSDK_TC_MNTSC_1_SECOND		FbxLongLong(FBXSDK_TC_MNTSC_FRAME*30)		// 1 frame * 30
+#define FBXSDK_TC_MNTSC_1_MINUTE		FbxLongLong(FBXSDK_TC_MNTSC_1_SECOND*60)	// 1 minute (1800 frames)
+#define FBXSDK_TC_MNTSC_1_HOUR			FbxLongLong(FBXSDK_TC_MNTSC_1_SECOND*3600)	// 1 hour
+
+#define FBXSDK_TC_MNTSC_NUM				FbxULong(FBXSDK_TC_FIX_DEN*1000*30/1001)
+#define FBXSDK_TC_MNTSC_DEN				FBXSDK_TC_FIX_DEN
+
+// Frame @ 25 Hz
+#define FBXSDK_TC_PAL_FIELD				FbxLongLong(FBXSDK_TC_SECOND/25/2)
+#define FBXSDK_TC_PAL_FRAME				FbxLongLong(FBXSDK_TC_SECOND/25)
+
+// Frame @ 24 Hz
+#define FBXSDK_TC_FILM_FRAME			FbxLongLong(FBXSDK_TC_SECOND/24)
+
+// Frame @ 23.9760239760 Hz
+#define FBXSDK_TC_MFILM_FIELD			FbxLongLong(FBXSDK_TC_MFILM_FRAME/2)
+#define FBXSDK_TC_MFILM_FRAME			FbxLongLong(FBXSDK_TC_SECOND/24*1001/1000)
+#define FBXSDK_TC_MFILM_1_SECOND		FbxLongLong(FBXSDK_TC_MFILM_FRAME*24)		// 1 frame * 24   
+#define FBXSDK_TC_MFILM_1_MINUTE		FbxLongLong(FBXSDK_TC_MFILM_1_SECOND*60)	// 1 minute (1440 frames)
+#define FBXSDK_TC_MFILM_1_HOUR			FbxLongLong(FBXSDK_TC_MFILM_1_SECOND*3600)	// 1 hour
+
+#define FBXSDK_TC_MFILM_NUM				FbxULong(FBXSDK_TC_FIX_DEN*1000*24/1001)
+#define FBXSDK_TC_MFILM_DEN				FBXSDK_TC_FIX_DEN
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+#define FBXSDK_TC_REM(quot, num, den)		((quot) = (num) / (den), (quot) * (den))
+#define FBXSDK_TC_HOUR_REM(quot, num, den)	((quot) = ((num - (-FbxLongLong(num < 0) & (den - 1))) / (den)), (quot) * (den))
+
+FBXSDK_DLL FbxLongLong FbxTCSeconds(FbxLongLong pTime);
+FBXSDK_DLL FbxLongLong FbxTCMinutes(FbxLongLong pTime);
+FBXSDK_DLL FbxLongLong FbxTCHours(FbxLongLong pTime);
+FBXSDK_DLL FbxLongLong FbxTCSetRate(int pHour, int pMinute, int pSecond, FbxLongLong pFrame, FbxLongLong pPeriod);
+FBXSDK_DLL FbxLongLong FbxTCGetRate(FbxLongLong pTime, int& pHour, int& pMinute, int& pSecond, int& pFrame, FbxLongLong pPeriod);
+FBXSDK_DLL FbxLongLong FbxTCSetNTSC(int pHour, int pMinute, int pSecond, FbxLongLong pFrame, int pField);
+FBXSDK_DLL FbxLongLong FbxTCGetNTSC(FbxLongLong pTime, int& pHour, int& pMinute, int& pSecond, int& pFrame, int& pField);
+FBXSDK_DLL FbxLongLong FbxTCSetMNTSCnd(int pHour, int pMinute, int pSecond, FbxLongLong pFrame, int pField);
+FBXSDK_DLL FbxLongLong FbxTCGetMNTSCnd(FbxLongLong pTime, int& pHour, int& pMinute, int& pSecond, int& pFrame, int& pField);
+FBXSDK_DLL FbxLongLong FbxTCSetMNTSC_2Xnd(int pHour, int pMinute, int pSecond, FbxLongLong pFrame, int pField);
+FBXSDK_DLL FbxLongLong FbxTCGetMNTSC_2Xnd(FbxLongLong pTime, int& pHour, int& pMinute, int& pSecond, int& pFrame, int& pField);
+FBXSDK_DLL FbxLongLong FbxTCSetMNTSC(int pHour, int pMinute, int pSecond, FbxLongLong pFrame, int pField);
+FBXSDK_DLL FbxLongLong FbxTCGetMNTSC(FbxLongLong pTime, int& pHour, int& pMinute, int& pSecond, int& pFrame, int& pField);
+FBXSDK_DLL FbxLongLong FbxTCSetPAL(int pHour, int pMinute, int pSecond, FbxLongLong pFrame, int pField);
+FBXSDK_DLL FbxLongLong FbxTCGetPAL(FbxLongLong pTime, int& pHour, int& pMinute, int& pSecond, int& pFrame, int& pField);
+FBXSDK_DLL FbxLongLong FbxTCSetFILM(int pHour, int pMinute, int pSecond, FbxLongLong pFrame);
+FBXSDK_DLL FbxLongLong FbxTCGetFILM(FbxLongLong pTime, int& pHour, int& pMinute, int& pSecond, int& pFrame);
+FBXSDK_DLL FbxLongLong FbxTCSetFILMND(int pHour, int pMinute, int pSecond, FbxLongLong pFrame, int pField);
+FBXSDK_DLL FbxLongLong FbxTCGetFILMND(FbxLongLong pTime, int& pHour, int& pMinute, int& pSecond, int& pFrame, int& pField);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_TIMECODE_H_ */

+ 172 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/base/fbxutils.h

@@ -0,0 +1,172 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxutils.h
+#ifndef _FBXSDK_CORE_BASE_UTILITIES_H_
+#define _FBXSDK_CORE_BASE_UTILITIES_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+#include <fbxsdk/core/base/fbxstatus.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+#ifndef FBXSDK_ENV_WINSTORE
+	/** Retrieve the environment variable value.
+	* \return A new string containing the environment variable value. */
+	FBXSDK_DLL FbxString FbxGetEnv(const char* pEnvVar);
+
+	/** Get the application directory
+	* \return The application directory. */
+	FBXSDK_DLL FbxString FbxGetApplicationDirectory();
+#endif
+
+/** Retrieve the system temporary folder path name.
+* \return A new string containing the system temporary folder path name. */
+FBXSDK_DLL FbxString FbxGetSystemTempPath();
+
+/** Override the system temporary folder path name.
+  * \param pPathUTF8 The system temporary folder to use for override.
+  * \return True if the system temporary folder path has been set and False otherwise.
+  * \remark The system temporary folder is limited to _MAX_PATH characters. Trying to set
+  * a longer value will fail and the current system temporary folder path is left unchanged.
+  */
+FBXSDK_DLL bool FbxSetSystemTempPath(const char* pPathUTF8);
+
+/** Retrieve the working directory of the system in UTF8 format.
+* \return A string that contain the current working directory of the system. */
+FBXSDK_DLL FbxString FbxGetCurrentWorkPath();
+
+/** Change the working directory of the system. */
+FBXSDK_DLL void FbxSetCurrentWorkPath(const char* pPath_UTF8);
+
+class FBXSDK_DLL FbxPathUtils
+{
+public:
+	/** Bind together a root path with a file path.
+	  * \param pRootPath The root path that will get binded to the file path.
+	  * \param pFilePath The file path to bind to the root path.
+	  * \param pCleanPath If true, the resulting path will be cleaned via FbxPathUtils::Clean().
+	  * \return Both paths binded together forming a new file path.
+	  * \remark If the file path is already a full valid path, pFilePath is returned.
+	  */
+	static FbxString Bind(const char* pRootPath, const char* pFilePath, bool pCleanPath=true);
+
+	/** Extract the folder name from the given file path.
+	  * \param pFilePath The given file path.
+	  * \return The folder name. If there isn't any '\\' or '/' in  the given file path, it will return pFilePath.
+	  */
+	static FbxString GetFolderName(const char* pFilePath);
+
+	/** Extract file name from the given file path.
+	  * \param pFilePath The given file path.
+	  * \param pWithExtension Decide the file name with extension or without extension.
+	  * If it is true, return the file name with extension;
+	  * if it is false, return the file name without extension.
+	  */
+	static FbxString GetFileName(const char* pFilePath, bool pWithExtension=true);
+
+	/** Extract the file extension in the given file path.
+	  * \param pFilePath The file path to extract the extension.
+	  * \return The file extension without the '.' character.
+	  * \remark Return empty string if the file path doesn't contain a valid extension.
+	  */
+	static FbxString GetExtensionName(const char* pFilePath);
+
+	/** Change or append a file extension to the specified file path.
+	  * \param pFilePath The file path to change the file extension
+	  * \param pExtension The extension to change or append to the file path.
+	  * \return The file path with the file extension changed/added.
+	  * \remark If the file path doesn't end with a valid file name, pFilePath is returned.
+	  */
+	static FbxString ChangeExtension(const char* pFilePath, const char* pExtension);
+
+	//! Test if the given path is relative path, if it is return true.
+	static bool IsRelative(const char* pPath);
+
+	/** Get the given new path's relative path to the given root path.
+	  * \param pRootPath The given root path
+	  * \param pNewPath The given new path. If it is only file name, the default directory is work directory.
+	  * \return The relative path.
+	  * \remarks If the given two paths have the same drive, the function will turn  '\\' in the relative path to  '/'.
+	  */
+	static FbxString GetRelativePath(const char* pRootPath, const char* pNewPath);
+
+	//! Get the given new path's relative path to the given root path.
+	static FbxString GetRelativeFilePath(const char* pRootPath, const char* pNewFilePath);
+
+	/** Get the full path of given path (if the given path is relative path,
+	  * it will take current directory as default root path.)
+	  */
+	static FbxString Resolve(const char* pRelPath);
+
+	//! Clean the redundant and useless denotations in given path name.
+	static FbxString Clean(const char* pPath);
+
+	/** Generate full safe file path name you can use to create new file.
+	  * \param pFolder The folder where the file name should be attempted to be created.
+	  * \param pPrefix The prefix of generated file name.
+	  * \return A valid file path that can safely be used to create a new file.
+	  */
+	static FbxString GenerateFileName(const char* pFolder, const char* pPrefix);
+
+	/** Verify if the specified folder path exist.
+	* \param pFolderPathUTF8 The folder path to test its existance.
+	* \return True if the folder path exist, false otherwise.
+	* \remark This function work for relative paths. It will search from the current work path. */
+	static bool Exist(const char* pFolderPathUTF8);
+
+	/** Create the specified folder path if it doesn't exist.
+	* \param pFolderPathUTF8 The folder path to create, in UTF8 encoding.
+	* \return True if folder path already exist, or if it was successfully created, false otherwise.
+	* \remark This function will create multiple folders if needed, and it also work for relative paths. */
+	static bool Create(const char* pFolderPathUTF8);
+
+	/** Delete the specified folder path and all its content recursively.
+	* \param pFolderPathUTF8 The folder path to delete, in UTF8 encoding.
+	* \return True if folder path was successfully deleted, false otherwise.
+	* \remark This function work for relative paths. It will search from the current work path. */
+	static bool Delete(const char* pFolderPathUTF8);
+
+#ifndef FBXSDK_ENV_WINSTORE
+	/** Verify if the folder contains items or not.
+	* \param pFolderPath_UTF8 The folder path to test if it contains items.
+	* \return True if the folder contain any kind of entry type. */
+	static bool IsEmpty(const char* pFolderPath_UTF8);
+#endif
+};
+
+/** Global accessor to an FbxStatus object.
+* This object is not used internally by the FBX SDK. It is provided for convenience and its usage is shown in the custom reader/writers samples. */
+class FBXSDK_DLL FbxStatusGlobal
+{
+public:
+	static FbxStatus& GetRef() 
+	{ 
+		if( !mStatusPtr )
+		{ 
+			mStatusPtr = FbxNew<FbxStatus>(); 
+		} 
+		return *mStatusPtr; 
+	}
+
+private:
+	FbxStatusGlobal(){ mStatusPtr = NULL; }
+	~FbxStatusGlobal(){ FbxDelete<FbxStatus>(mStatusPtr); }
+	static FbxStatusGlobal sgFbxStatusGlobal;
+	static FbxStatus* mStatusPtr;
+};
+
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_BASE_UTILITIES_H_ */

+ 166 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxclassid.h

@@ -0,0 +1,166 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxclassid.h
+#ifndef _FBXSDK_CORE_CLASSID_H_
+#define _FBXSDK_CORE_CLASSID_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxClassIdInfo;
+class FbxObject;
+class FbxPropertyHandle;
+class FbxManager;
+
+//! The function pointer type for object constructor functions.
+typedef FbxObject* (*FbxObjectCreateProc)(FbxManager& pManager, const char* pName, const FbxObject* pFrom);
+
+/** Internal class used to differentiate objects during run-time. Essentially, each class has an unique ClassId, that the
+* system can request in order to test if the class match the description. This class implement the necessary tools to be able
+* to perform hierarchic class testing. This means that a class B that inherits from the class A will answer yes to a "Is A"
+* query of type A or B, but will answer no to a class C that can still inherit from A. All class must inherit from FbxObject
+* before they can have their own ClassId. When using the standard macros to create new types of objects in the FBX SDK, a
+* static ClassId will automatically be generated for that new class.
+*
+* When objects are exported to an FBX file, their class type is maintained using 3 sort of strings. They are the Object Type
+* string, the Object Sub Type string and the Object Type Prefix. There is no good or bad way to choose the value of these
+* identifiers, but it is preferable to use meaningful values to keep the ASCII version of FBX readable and easy to understand.
+* \see FbxObject */
+class FBXSDK_DLL FbxClassId
+{
+public:
+	//! Constructor.
+	FbxClassId();
+
+	/** Advanced constructor were we can specify the general parameters for this ClassId.
+	* \param pClassName The name of the class represented.
+	* \param pParentClassId The parent ClassId of this class.
+	* \param pConstructor A function pointer to a construction method for this ClassId.
+	* \param pFBXType The FBX file Object Type string associated to this class.
+	* \param pFBXSubType The FBX file Object Sub Type string associated to this class. */
+	FbxClassId(const char* pClassName, const FbxClassId& pParentClassId, FbxObjectCreateProc pConstructor=0, const char* pFBXType=NULL, const char* pFBXSubType=NULL);
+
+	//! Destructor.
+	void Destroy();
+
+	/** Retrieve the class name.
+	* \return The class identification string name. */
+	const char* GetName() const;
+
+    /** Retrieve the parent ClassId.
+	* \return The parent ClassId. */
+	FbxClassId GetParent() const;
+
+	/** Create an instance of this class.
+	* \param pManager The FBX SDK Manager to be used to instantiate this object. This allow the object to use the same memory manager as the provided manager.
+	* \param pName The name to assign to this new object instance.
+	* \param pFrom An object to clone if it matches the same ClassId. This is an optional parameter.
+	* \return The newly created instance of this class. */
+	FbxObject* Create(FbxManager& pManager, const char* pName, const FbxObject* pFrom);
+
+	/** Override the function pointer method to construct this object.
+	* \param pConstructor A newly defined function pointer to a construction method to replace the existing one.
+	* \return True if the operation was successful. */
+	bool Override(FbxObjectCreateProc pConstructor);
+
+	/** Test if this class is a hierarchical children of the specified class type. This is the standard method to differentiate object classes.
+	* \param pId The class type to test against self.
+	* \return True if the object is a hierarchical children of the type specified.
+	* \remark This function will perform a complete search until it reaches the top level class, but it will stop as soon as one ClassId matches the test. */
+	bool Is(const FbxClassId& pId) const;
+
+	/** Equivalence operator.
+	* \param pClassId The class type to test against self.
+	* \return \c true if the ClassId is exactly the same, \c false otherwise.
+	* \remark This function only perform direct equality test, and doesn't test hierarchic children. */
+	bool operator==(const FbxClassId& pClassId) const;
+
+	/** Inequivalence operator.
+	* \param pClassId The class type to test against self.
+	* \return \c true if the ClassId is not the same, \c false otherwise.
+	* \remark This function only perform direct inequality test, and doesn't test hierarchic children. */
+	bool operator!=(const FbxClassId& pClassId) const;
+
+	/** Retrieve the FBX file Object Type string associated to this class.
+	* \param pAskParent If \c true, retrieve the parent ClassId, but only if self ClassId is not valid.
+	* \return The FBX file Object Type string associated to this class. */
+	const char* GetFbxFileTypeName(bool pAskParent=false) const;
+
+	/** Retrieve the FBX file Object Sub Type string associated to this class.
+	* \return The FBX file Object Sub Type string associated to this class. */
+	const char* GetFbxFileSubTypeName() const;
+
+	/** Find out if self ClassId is valid or not.
+	* \return \c true if self ClassId is valid, \c false otherwise. */
+	inline bool IsValid() const { return mClassInfo ? true : false; }
+    
+	/** Set the Object Type Prefix string associated to this class. This will change the "ObjectTypePrefix::" found in front
+	* of object name in the FBX file. This is useful to differentiate objects by their name without using the Object Type or
+	* Sub Type strings in the file.
+	* \param pObjectTypePrefix The Object Type prefix string. */
+	void SetObjectTypePrefix(const char* pObjectTypePrefix);
+
+	/** Retrieve the Object Type Prefix string associated to this class.
+	* \return The Object Type Prefix string. */
+	const char* GetObjectTypePrefix();
+   
+	/** Retrieve the root property handle of this class. This is useful to access the default property hierarchy for this
+	* class. This allow users to retrieve information such as the default value for all properties of this class.
+	* \return The root property handle for this class. */
+	FbxPropertyHandle* GetRootClassDefaultPropertyHandle();
+
+	/** Increase the instance reference count for this class type.
+	* \return the new count of reference to this class after increment. */
+	int ClassInstanceIncRef();
+
+	/** Decrease the instance reference count for this class type.
+	* \return the new count of reference to this class after decrement. */
+	int ClassInstanceDecRef();
+	 
+	/** Retrieve the instance reference count for this class type.
+	* \return The reference count of this class type. */
+	int GetInstanceRef();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	inline FbxClassIdInfo* GetClassIdInfo() { return mClassInfo; }
+    inline const FbxClassIdInfo* GetClassIdInfo() const { return mClassInfo; }
+
+private:
+	FbxClassId(FbxClassIdInfo* mClassInfo);
+
+	bool SetFbxFileTypeName(const char* pName);
+	bool SetFbxFileSubTypeName(const char* pName);
+
+	FbxClassIdInfo* mClassInfo;
+
+	friend class FbxManager;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+//! Functor to compare FbxClassId
+struct FbxClassIdCompare
+{
+	inline int operator()(const FbxClassId& pKeyA, const FbxClassId& pKeyB) const
+	{
+		const FbxClassIdInfo* lKeyA = pKeyA.GetClassIdInfo();
+		const FbxClassIdInfo* lKeyB = pKeyB.GetClassIdInfo();
+		return lKeyA < lKeyB ? -1 : (lKeyA > lKeyB ? 1 : 0);
+	}
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_CLASSID_H_ */

+ 312 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxconnectionpoint.h

@@ -0,0 +1,312 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxconnectionpoint.h
+#ifndef _FBXSDK_CORE_CONNECTION_POINT_H_
+#define _FBXSDK_CORE_CONNECTION_POINT_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxarray.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FBXSDK_DLL FbxConnection
+{
+public:
+	enum EType
+	{ 
+		eNone = 0,
+		// System or user
+		eSystem = 1 << 0,
+		eUser = 1 << 1,
+		eSystemOrUser = eUser | eSystem,
+		// Type of Link
+		eReference = 1 << 2,
+		eContains = 1 << 3,
+		eData = 1 << 4,
+		eLinkType = eReference | eContains | eData,
+		eDefault = eUser | eReference,
+		eUnidirectional = 1 << 7
+	};
+};
+
+class FbxConnectionPointFilter;
+
+class FBXSDK_DLL FbxConnectionPoint
+{
+public:
+	enum EDirection
+	{ 
+		eDirSrc = 1 << 0,	// Contains sources
+		eDirDst = 1 << 1,	// Contains destinations
+		eDirUni = 1 << 2,	// Connection is not 2 ways
+		eDirBoth = eDirSrc | eDirDst,
+		eDirMask = eDirSrc | eDirDst | eDirUni
+	};
+
+	enum EType
+	{
+		eStandard = 0,
+		eSubConnection = 1 << 3,		// Connect is a sub Connect of another
+		eTypeMask = eSubConnection
+	}; 
+
+	enum EAttribute
+	{
+		eDefault = 0,
+		eCache = 1 << 4,			
+		eAttributeMask = eCache
+	}; 
+
+	enum EAllocFlag
+	{
+		eNotAllocated = 0,
+		eAllocated = 1 << 5,
+		eAllocFlagMask = eAllocated
+	};
+
+	enum ECleanedFlag
+	{
+		eNotCleaned = 0,
+		eCleaned = 1 << 6,
+		eCleanedFlagMask = eCleaned
+	};
+
+	enum EEvent
+	{
+		eSrcConnectRequest,
+		eDstConnectRequest,
+		eSrcConnect,
+		eDstConnect,
+		eSrcConnected,
+		eDstConnected,
+		eSrcDisconnect,
+		eDstDisconnect,
+		eSrcDisconnected,
+		eDstDisconnected,
+		eSrcReplaceBegin,
+		eSrcReplaceEnd,
+		eDstReplaceBegin,
+		eDstReplaceEnd,
+		eSrcReorder,
+		eSrcReordered
+	};
+
+	// Constructor/Destructor	
+	FbxConnectionPoint(void* pData=0);
+	virtual ~FbxConnectionPoint();
+
+	void SetFilter(FbxConnectionPointFilter* pConnectFilter, EType pType=eStandard);
+	void InternalClear();
+
+	//! Clear the ConnectList without any regards to what is connected
+	void WipeConnectionList();
+	void Destroy();
+	void SubConnectRemoveAll();
+
+	inline FbxConnectionPoint*			GetSubOwnerConnect(){ return GetConnectType() == eSubConnection ? mOwner : NULL; }
+	inline FbxConnectionPointFilter*	GetFilter(){ return mFilter; }
+
+	virtual bool		IsInReplace(FbxConnectionPoint* p1, FbxConnectionPoint* p2);
+
+	inline void			SetConnectType(EType pType){ mFlags = (mFlags & ~eTypeMask) | pType; }
+	inline EType		GetConnectType(){ return EType(mFlags & eTypeMask); }
+	inline void			SetDirection(int pDirections){ mFlags = (mFlags & ~eDirMask) | pDirections; }
+	inline EDirection	GetDirection(){ return EDirection(mFlags & eDirMask); }
+	inline void			SetAttribute(int pAttributes){ mFlags = (mFlags & ~eAttributeMask) | pAttributes; }
+	inline EAttribute	GetAttribute(){ return EAttribute(mFlags & eAttributeMask); }
+	inline void			SetAllocatedFlag(bool pBool){ mFlags = ( pBool ) ? mFlags | eAllocated : mFlags & ~eAllocFlagMask; }
+	inline bool			GetAllocatedFlag(){ return ( mFlags & eAllocFlagMask ) ? true : false; }
+	inline void			SetCleanedFlag(bool pBool){ mFlags = ( pBool ) ? mFlags | eCleaned : mFlags & ~eCleanedFlagMask; }
+	inline bool			GetCleanedFlag(){ return ( mFlags & eCleanedFlagMask ) ? true : false; }		
+
+	bool				IsValidSrc(FbxConnectionPoint* pConnect);
+	bool				IsValidDst(FbxConnectionPoint* pConnect);
+	bool				IsValidSrcConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType);
+	bool				IsValidDstConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType);
+	bool				RequestValidSrcConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType );
+	bool				RequestValidDstConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType );
+
+	bool				ConnectSrc(FbxConnectionPoint* pSrc,FbxConnection::EType pConnectionType=FbxConnection::eNone);
+	bool				ConnectDst(FbxConnectionPoint* pDst,FbxConnection::EType pConnectionType=FbxConnection::eNone);
+	bool				ConnectSrcAt(int pDst_SrcIndex, FbxConnectionPoint* pSrc, FbxConnection::EType pConnectionType=FbxConnection::eNone);
+	bool				ConnectDstAt(int pSrc_DstIndex, FbxConnectionPoint* pDst, FbxConnection::EType pConnectionType=FbxConnection::eNone);
+	static bool			ConnectConnect(FbxConnectionPoint* pSrc,FbxConnectionPoint* pDst,FbxConnection::EType pConnectionType);
+	static bool			ConnectAt(FbxConnectionPoint* pSrc, int pSrc_DstIndex, FbxConnectionPoint* pDst, int pDst_SrcIndex, FbxConnection::EType pConnectionType);
+
+	bool				DisconnectDst(FbxConnectionPoint* pSrc);
+	bool				DisconnectSrc(FbxConnectionPoint* pSrc);
+	void				DisconnectAllSrc();
+	void				DisconnectAllDst();
+	static bool			DisconnectConnect(FbxConnectionPoint* pSrc,FbxConnectionPoint* pDst);
+	bool				DisconnectDstAt(int pIndex);
+	bool				DisconnectSrcAt(int pIndex);
+
+	bool				ReplaceInDst(FbxConnectionPoint* pDstOld, FbxConnectionPoint* pDstNew, int pIndexInNew);
+	bool				ReplaceInSrc(FbxConnectionPoint* pSrcOld, FbxConnectionPoint* pSrcNew, int pIndexInNew);
+	bool				ReplaceDstAt(int pIndex, FbxConnectionPoint* pDst);
+	bool				ReplaceSrcAt(int pIndex, FbxConnectionPoint* pSrc);
+	bool				SwapSrc(int pIndexA, int pIndexB);
+
+	/** Change the position of a source Connect.
+	* \param pIndex	Position of the Connect to move.
+	* \param pAtIndex	Position where to move the Connect.
+	* \return			\c True if the Connect was moved.
+	* \remarks After the move, the Connect will be precisely at position pAtIndex.
+	*/
+	bool MoveSrcAt(int pIndex, int pAtIndex);
+
+	/** Change the position of a source Connect.
+	* \param pSrc		Connect to move.
+	* \param pAtSrc	Connect at which position to move.
+	* \return			\c True if the Connect was moved.
+	* \remarks After the move, the Connect will be precisely at the position where pAtSrc was before the move.
+	*/
+	bool MoveSrcAt(FbxConnectionPoint* pSrc, FbxConnectionPoint* pAtSrc);
+
+	// Access services
+	bool IsConnectedSrc(FbxConnectionPoint*);
+	bool IsConnectedDst(FbxConnectionPoint*);
+	inline bool IsConnected(FbxConnectionPoint* pConnect) { return IsConnectedSrc(pConnect) || IsConnectedDst(pConnect); }
+
+	inline int					GetSrcCount() const { return mConnectionList.GetSrcCount(); }
+	inline FbxConnectionPoint*	GetSrc(int pIndex) const { return mConnectionList.GetSrc(pIndex);}
+	inline FbxConnection::EType	GetSrcType(int pIndex) const { return mConnectionList.GetSrcType(pIndex);}
+	inline int					GetDstCount() const { return mConnectionList.GetDstCount(); }
+	inline FbxConnectionPoint*	GetDst(int pIndex) const { return mConnectionList.GetDst(pIndex);}
+	inline FbxConnection::EType	GetDstType(int pIndex) const { return mConnectionList.GetDstType(pIndex);}
+
+	inline int					FindSrc(FbxConnectionPoint* pConnect){ return mConnectionList.FindSrc(pConnect); }
+	inline int					FindDst(FbxConnectionPoint* pConnect){ return mConnectionList.FindDst(pConnect); }
+
+	// Filtered versions	
+	inline int					GetSrcCount(FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrcCount() : GetSrcCount(); }
+	inline FbxConnectionPoint*	GetSrc(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrc(pIndex) : GetSrc(pIndex); }
+	inline FbxConnection::EType	GetSrcType(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetSrcType(pIndex) : GetSrcType(pIndex); }
+	inline int					GetDstCount(FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDstCount() : GetDstCount(); }
+	inline FbxConnectionPoint*	GetDst(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDst(pIndex): GetDst(pIndex); }
+	inline FbxConnection::EType	GetDstType(int pIndex,FbxConnectionPointFilter* pFilter){ return (pFilter) ? SubConnectGetOrCreate(pFilter)->GetDstType(pIndex) : GetDstType(pIndex); }
+
+	void* GetData(){ return mData; }
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+protected:
+	class ConnectionList
+	{
+	public:
+		ConnectionList();
+		~ConnectionList();
+
+		void					Clear();
+
+		void					InsertSrcAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pType);
+		void					AddSrc(FbxConnectionPoint* pConnect, FbxConnection::EType pType);
+		void					RemoveSrcAt(int pIndex);
+		int						FindSrc(FbxConnectionPoint* pConnect) const;
+		int						GetSrcCount() const; 
+		FbxConnectionPoint*		GetSrc(int pIndex) const;
+		FbxConnection::EType	GetSrcType(int pIndex) const;
+
+		void					InsertDstAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pType);
+		void					AddDst(FbxConnectionPoint* pConnect, FbxConnection::EType pType);
+		void					RemoveDstAt(int pIndex);
+		int						FindDst(FbxConnectionPoint* pConnect) const;
+		int						GetDstCount() const;
+		FbxConnectionPoint*		GetDst(int pIndex) const;
+		FbxConnection::EType	GetDstType(int pIndex) const;
+
+	protected:
+		struct Connection {
+			Connection(FbxConnectionPoint* pPoint, FbxConnection::EType pType) : mPoint(pPoint), mType(pType){}
+			FbxConnectionPoint* mPoint; FbxConnection::EType mType;
+		};
+		FbxArray<Connection>	mSrcList;
+		FbxArray<Connection>	mDstList;
+	};
+
+	void				SubConnectAdd(FbxConnectionPoint* pConnect);
+	void				SubConnectRemove(FbxConnectionPoint* pConnect);
+	FbxConnectionPoint* SubConnectFind(FbxConnectionPointFilter* pFilter);
+	FbxConnectionPoint* SubConnectGetOrCreate(FbxConnectionPointFilter* pFilter);
+	void				SubConnectFill(FbxConnectionPoint*	pConnect);
+
+	virtual	bool		ConnectNotify(EEvent pAction, FbxConnectionPoint* pThis, int pIndex, FbxConnectionPoint* pConnect=NULL, FbxConnection::EType pConnectionType=FbxConnection::eNone, FbxConnectionPoint* pNewConnect=NULL);
+	virtual void		ConnectCleanUp(FbxConnectionPoint* pThis);
+
+	int					FindSrcIndexFromOwnerConnectIndex(FbxConnectionPoint* pOwner, int pOwnerIndex);
+	int					FindDstIndexFromOwnerConnectIndex(FbxConnectionPoint* pOwner, int pOwnerIndex);
+
+	bool				InternalMoveSrcBefore(int pIndex, int pBeforeIndex);
+
+private:
+	inline void			InsertSrcAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType){ mConnectionList.InsertSrcAt(pIndex, pConnect, pConnectionType); }
+	inline void			InsertDstAt(int pIndex, FbxConnectionPoint* pConnect, FbxConnection::EType pConnectionType){ mConnectionList.InsertDstAt(pIndex, pConnect, pConnectionType); }
+	inline void			RemoveSrcAt(int pIndex){ mConnectionList.RemoveSrcAt(pIndex); }
+	inline void			RemoveDstAt(int pIndex){ mConnectionList.RemoveDstAt(pIndex); }    	
+
+	static bool			InternalConnectBefore(FbxConnectionPoint* pSrc, FbxConnectionPoint* pSrc_BeforeDst, FbxConnectionPoint* pDst, FbxConnectionPoint* pDst_BeforeSrc, FbxConnection::EType pConnectionType);
+	static bool			UserConnectBefore(FbxConnectionPoint* pSrc, FbxConnectionPoint* pSrc_BeforeDst, FbxConnectionPoint* pDst, FbxConnectionPoint* pDst_BeforeSrc, FbxConnection::EType pConnectionType);
+	static bool			EmitReplaceNotify(FbxConnectionPoint* pDstOwner, FbxConnectionPoint* pSrcOwner, FbxConnectionPoint* pDst, FbxConnectionPoint* pSrc, EEvent pConnectAction, FbxConnectionPoint* pNew);
+
+	virtual bool				SetOwnerConnect(FbxConnectionPoint* pConnect);
+	inline FbxConnectionPoint*	GetOwnerConnect(){ return mOwner;  }
+	bool						ConnectOwnedConnect(FbxConnectionPoint* pConnect);
+	bool						DisconnectOwnedConnect(FbxConnectionPoint* pConnect);
+
+	void*							mData;
+	int								mFlags;
+	FbxConnectionPoint*				mOwner;
+	ConnectionList					mConnectionList;
+	FbxArray<FbxConnectionPoint*>	mSubConnectList;
+	FbxArray<FbxConnectionPoint*>	mSubConnectCreatedList;		
+	FbxConnectionPointFilter*		mFilter;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/** Class to manage Connect Filter */
+class FBXSDK_DLL FbxConnectionPointFilter
+{
+public: 
+    virtual ~FbxConnectionPointFilter() {};
+    
+	//! Return reference ConnectionPoint filter.
+	virtual FbxConnectionPointFilter* Ref();
+
+	//! Cancel reference
+	virtual void Unref();
+
+	//! Get unique filter ID
+	virtual FbxInt GetUniqueId() const { return 0; }
+
+	/** Judge if the given Connection Point is valid
+	* \param pConnect The given Connection Point.
+	* \return \c True if valid, \c false if not valid. */
+	virtual bool IsValid(FbxConnectionPoint* pConnect) const;
+
+	/** Judge if the given Connection Point is a valid connection
+	* \param pConnect The given Connection Point.
+	* \param pType Connection type.
+	* \return \c True if valid, \c false if not valid. */
+	virtual bool IsValidConnection(FbxConnectionPoint* pConnect, FbxConnection::EType pType) const;
+
+	/** Judge if it is equal with the given  ConnectionPoint filter.
+	* \param pConnectFilter The given  ConnectionPoint filter.
+	* \return \c True if equal, \c false if unequal. */
+	virtual bool IsEqual(FbxConnectionPointFilter* pConnectFilter) const;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_CONNECTION_POINT_H_ */

+ 267 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxdatatypes.h

@@ -0,0 +1,267 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxdatatypes.h
+#ifndef _FBXSDK_CORE_DATA_TYPES_H_
+#define _FBXSDK_CORE_DATA_TYPES_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxpropertytypes.h>
+#include <fbxsdk/core/fbxpropertyhandle.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** FBX SDK data type class
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxDataType
+{
+public:
+	static FbxDataType Create(const char* pName, const EFbxType pType);
+	static FbxDataType Create(const char* pName, const FbxDataType& pDataType);
+
+	/**
+	  *\name Constructor and Destructor.
+	  */
+	//@{
+		//! Constructor.
+		FbxDataType();
+
+		/** Copy constructor.
+		  * \param pDataType Another FbxDataType object copied to this one.
+		  */
+		FbxDataType(const FbxDataType& pDataType);
+
+		//! Destroy this datatype.
+		void Destroy();
+
+		/** Constructor.
+		  * \param pTypeInfoHandle Type information handle
+		  */
+		FbxDataType(const FbxPropertyHandle& pTypeInfoHandle);
+
+		//! Destructor.
+		~FbxDataType();
+	//@}
+
+	/** Assignment operator
+	  * \param pDataType Datatype whose value is assigned to this datatype.
+	  * \return This datatype
+	  */
+    inline FbxDataType& operator=(const FbxDataType& pDataType){ mTypeInfoHandle=pDataType.mTypeInfoHandle; return *this; }
+
+	/**
+	  * \name boolean operation
+	  */
+	//@{
+		/** Equality operator
+		  * \param pDataType Datatype to compare to.
+		  * \return \c true if equal,\c false otherwise.
+		  */
+		inline bool operator==(const FbxDataType& pDataType) const { return mTypeInfoHandle==pDataType.mTypeInfoHandle; }
+
+		/** Non-equality operator
+		  * \param pDataType Datatype to compare to.
+		  * \return \c true if unequal,\c false otherwise.
+		  */
+		inline bool operator!=(const FbxDataType& pDataType) const { return mTypeInfoHandle!=pDataType.mTypeInfoHandle; }
+	//@}
+
+	/** Test whether this datatype is a valid datatype.
+	  * \return \c true if valid, \c false otherwise.
+	  */
+	inline bool Valid() const { return mTypeInfoHandle.Valid(); }
+
+	/** Test if this datatype is the specified datatype. 
+	  * \param pDataType Datatype to compare to.
+	  * \return \c true if this datatype is the specified datatype, \c false otherwise. 
+	  */
+	inline bool Is(const FbxDataType& pDataType) const { return mTypeInfoHandle.Is(pDataType.mTypeInfoHandle); }
+
+	/** Retrieve this data type.
+	  * \return This data type.
+	  */
+	EFbxType GetType() const;
+
+	/** Retrieve data type name.
+	  * \return Data type name.
+	  */
+	const char* GetName() const;
+
+	/** Retrieve the information handle of this data type.
+	  * \return Information handle of this data type.
+	  */
+	inline const FbxPropertyHandle& GetTypeInfoHandle() const { return mTypeInfoHandle; }
+
+private:
+	FbxPropertyHandle mTypeInfoHandle;
+    friend class FbxManager;
+};
+
+/** Retrieve data type from type enumeration index
+  * \param pType The type enumeration index
+  * \return The corresponding data type
+  */
+FBXSDK_DLL const FbxDataType& FbxGetDataTypeFromEnum(const EFbxType pType);
+
+/** Retrieve data type name string used by I/O operations
+  * \param pDataType The data type instance to retrieve its I/O name string
+  * \return The data type name string
+  * \remark This function is only used during I/O operations. It is not equal
+  *         to the actual data type name.
+  */
+FBXSDK_DLL const char* FbxGetDataTypeNameForIO(const FbxDataType& pDataType);
+
+//! \name Basic Data Types
+//@{
+	extern FBXSDK_DLL FbxDataType FbxUndefinedDT;
+	extern FBXSDK_DLL FbxDataType FbxBoolDT;
+	extern FBXSDK_DLL FbxDataType FbxCharDT;
+	extern FBXSDK_DLL FbxDataType FbxUCharDT;
+	extern FBXSDK_DLL FbxDataType FbxShortDT;
+	extern FBXSDK_DLL FbxDataType FbxUShortDT;
+	extern FBXSDK_DLL FbxDataType FbxIntDT;
+	extern FBXSDK_DLL FbxDataType FbxUIntDT;
+	extern FBXSDK_DLL FbxDataType FbxLongLongDT;
+	extern FBXSDK_DLL FbxDataType FbxULongLongDT;
+	extern FBXSDK_DLL FbxDataType FbxFloatDT;
+	extern FBXSDK_DLL FbxDataType FbxHalfFloatDT;
+	extern FBXSDK_DLL FbxDataType FbxDoubleDT;
+	extern FBXSDK_DLL FbxDataType FbxDouble2DT;
+	extern FBXSDK_DLL FbxDataType FbxDouble3DT;
+	extern FBXSDK_DLL FbxDataType FbxDouble4DT;
+	extern FBXSDK_DLL FbxDataType FbxDouble4x4DT;
+	extern FBXSDK_DLL FbxDataType FbxEnumDT;
+	extern FBXSDK_DLL FbxDataType FbxStringDT;
+	extern FBXSDK_DLL FbxDataType FbxTimeDT;
+	extern FBXSDK_DLL FbxDataType FbxReferenceDT;
+	extern FBXSDK_DLL FbxDataType FbxBlobDT;
+	extern FBXSDK_DLL FbxDataType FbxDistanceDT;
+	extern FBXSDK_DLL FbxDataType FbxDateTimeDT;
+//@}
+
+//! \name Extended Data Types
+//@{
+	extern FBXSDK_DLL FbxDataType FbxColor3DT;
+	extern FBXSDK_DLL FbxDataType FbxColor4DT;
+	extern FBXSDK_DLL FbxDataType FbxCompoundDT;
+	extern FBXSDK_DLL FbxDataType FbxReferenceObjectDT;
+	extern FBXSDK_DLL FbxDataType FbxReferencePropertyDT;
+	extern FBXSDK_DLL FbxDataType FbxVisibilityDT;
+	extern FBXSDK_DLL FbxDataType FbxVisibilityInheritanceDT;
+	extern FBXSDK_DLL FbxDataType FbxUrlDT;
+	extern FBXSDK_DLL FbxDataType FbxXRefUrlDT;
+//@}
+
+//! \name Transform Data Types
+//@{
+	extern FBXSDK_DLL FbxDataType FbxTranslationDT;
+	extern FBXSDK_DLL FbxDataType FbxRotationDT;
+	extern FBXSDK_DLL FbxDataType FbxScalingDT;
+	extern FBXSDK_DLL FbxDataType FbxQuaternionDT;
+	extern FBXSDK_DLL FbxDataType FbxLocalTranslationDT;
+	extern FBXSDK_DLL FbxDataType FbxLocalRotationDT;
+	extern FBXSDK_DLL FbxDataType FbxLocalScalingDT;
+	extern FBXSDK_DLL FbxDataType FbxLocalQuaternionDT;
+	extern FBXSDK_DLL FbxDataType FbxTransformMatrixDT;
+	extern FBXSDK_DLL FbxDataType FbxTranslationMatrixDT;
+	extern FBXSDK_DLL FbxDataType FbxRotationMatrixDT;
+	extern FBXSDK_DLL FbxDataType FbxScalingMatrixDT;
+//@}
+
+//! \name Material Data Types
+//@{
+	extern FBXSDK_DLL FbxDataType FbxMaterialEmissiveDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialEmissiveFactorDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialAmbientDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialAmbientFactorDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialDiffuseDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialDiffuseFactorDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialBumpDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialNormalMapDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialTransparentColorDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialTransparencyFactorDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialSpecularDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialSpecularFactorDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialShininessDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialReflectionDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialReflectionFactorDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialDisplacementDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialVectorDisplacementDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialCommonFactorDT;
+	extern FBXSDK_DLL FbxDataType FbxMaterialCommonTextureDT;
+//@}
+
+//! \name Layer Element Data Types
+//@{
+	extern FBXSDK_DLL FbxDataType FbxLayerElementUndefinedDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementNormalDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementBinormalDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementTangentDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementMaterialDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementTextureDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementPolygonGroupDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementUVDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementVertexColorDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementSmoothingDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementCreaseDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementHoleDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementUserDataDT;
+	extern FBXSDK_DLL FbxDataType FbxLayerElementVisibilityDT;
+//@}
+
+//! \name I/O Specialized Data Types
+//@{
+	extern FBXSDK_DLL FbxDataType FbxAliasDT;
+	extern FBXSDK_DLL FbxDataType FbxPresetsDT;
+	extern FBXSDK_DLL FbxDataType FbxStatisticsDT;
+	extern FBXSDK_DLL FbxDataType FbxTextLineDT;
+	extern FBXSDK_DLL FbxDataType FbxUnitsDT;
+	extern FBXSDK_DLL FbxDataType FbxWarningDT;
+	extern FBXSDK_DLL FbxDataType FbxWebDT;
+//@}
+
+//! \name External Support Data Types
+//@{
+	extern FBXSDK_DLL FbxDataType FbxActionDT;
+	extern FBXSDK_DLL FbxDataType FbxCameraIndexDT;
+	extern FBXSDK_DLL FbxDataType FbxCharPtrDT;
+	extern FBXSDK_DLL FbxDataType FbxConeAngleDT;
+	extern FBXSDK_DLL FbxDataType FbxEventDT;
+	extern FBXSDK_DLL FbxDataType FbxFieldOfViewDT;
+	extern FBXSDK_DLL FbxDataType FbxFieldOfViewXDT;
+	extern FBXSDK_DLL FbxDataType FbxFieldOfViewYDT;
+	extern FBXSDK_DLL FbxDataType FbxFogDT;
+	extern FBXSDK_DLL FbxDataType FbxHSBDT;
+	extern FBXSDK_DLL FbxDataType FbxIKReachTranslationDT;
+	extern FBXSDK_DLL FbxDataType FbxIKReachRotationDT;
+	extern FBXSDK_DLL FbxDataType FbxIntensityDT;
+	extern FBXSDK_DLL FbxDataType FbxLookAtDT;
+	extern FBXSDK_DLL FbxDataType FbxOcclusionDT;
+	extern FBXSDK_DLL FbxDataType FbxOpticalCenterXDT;
+	extern FBXSDK_DLL FbxDataType FbxOpticalCenterYDT;
+	extern FBXSDK_DLL FbxDataType FbxOrientationDT;
+	extern FBXSDK_DLL FbxDataType FbxRealDT;
+	extern FBXSDK_DLL FbxDataType FbxRollDT;
+	extern FBXSDK_DLL FbxDataType FbxScalingUVDT;
+	extern FBXSDK_DLL FbxDataType FbxShapeDT;
+	extern FBXSDK_DLL FbxDataType FbxStringListDT;
+	extern FBXSDK_DLL FbxDataType FbxTextureRotationDT;
+	extern FBXSDK_DLL FbxDataType FbxTimeCodeDT;
+	extern FBXSDK_DLL FbxDataType FbxTimeWarpDT;
+	extern FBXSDK_DLL FbxDataType FbxTranslationUVDT;
+	extern FBXSDK_DLL FbxDataType FbxWeightDT;
+//@}
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_DATA_TYPES_H_ */

+ 94 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxemitter.h

@@ -0,0 +1,94 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxemitter.h
+#ifndef _FBXSDK_CORE_EMITTER_H_
+#define _FBXSDK_CORE_EMITTER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxintrusivelist.h>
+#include <fbxsdk/core/fbxeventhandler.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxListener;
+
+/** Base class to emit event with the specified event type.
+* The event type could be a specific class which derived from FbxEvent. Please read FbxEmitter::Emit() for more details. 
+* Event emitter contains a list of event handlers.
+* FBX object could be used as emitter, since FbxObject is derived from FbxEmitter.
+* Before using emitter to emit an event, one or more event handlers must be added to the handlers list of current emitter.
+* In other words, it's "bind event handlers to emitter".
+* There are two ways to bind event handlers to emitter.
+* \li 1. If you already got an event handler and would like to bind it to current emitter, please call FbxEmitter::AddListener().
+* \li 2. Or you can create an event listener first and then call FbxListener::Bind().
+* It will create an event handler automatically and bind the handler to the specified emitter.
+* It's similar to unbind or remove an even handler. For more details, 
+* \see FbxEmitter::RemoveListener()
+* \see FbxListener::Unbind()
+* \remarks An object(emitter) can emit a certain type of event, the plug-in(listener) who are listening to that type of event, 
+* will receive a signal and take action to process the event data. 
+* \par The whole process of event is:
+* \li 1. Create an emitter and a listener, then bind them together via the same event handler.
+* \li 2. Emitter can emit an event at certain conditions. The event could be handled by event handler.
+* \li 3. Once an event is emitted, the listener to this event will receive a signal. 
+* \li 4. And then the listener could process the event data according to the types of event, by calling event handler.
+* \note The event data is process by the callback function of event handler.
+* \nosubgrouping
+* \see FbxListener FbxEventHandler FbxEvent FbxEventBase
+*/
+class FBXSDK_DLL FbxEmitter
+{
+public:
+	/** Add the specified event handler to current emitter list.
+	* \param pHandler The event handler will be added to the handlers list of current emitter. */
+	void AddListener(FbxEventHandler& pHandler);
+
+	/** Remove the specified event handler from current emitter list.
+	* \param pHandler The event handler will be removed from the handlers list of current emitter. */
+	void RemoveListener(FbxEventHandler& pHandler);
+
+	/** Emit an event with the specified the event type. One the event is emitted, the listener to this event will receive a signal.
+	* \param pEvent Specify the event type to emit. Could be a specific class which derived from FbxEvent, such as FbxObjectPropertyChanged.
+	* \see FbxEventBase FbxObjectPropertyChanged FbxEventReferencedDocument FbxEventPostExport
+	* \see FbxEventPostImport FbxEventPreExport FbxEventPreImport FbxEventPopulateSystemLibrary */
+	template <typename EventType> void Emit(const EventType& pEvent) const
+	{
+		if( !mData ) return;
+		EventHandlerList::iterator itBegin = mData->mEventHandlerList.Begin();
+		EventHandlerList::iterator itEnd = mData->mEventHandlerList.End();
+		for( EventHandlerList::iterator it = itBegin; it != itEnd; ++it )
+		{
+			if ((*it).GetHandlerEventType() == pEvent.GetTypeId())
+			{
+				(*it).FunctionCall(pEvent);
+			}
+		}
+	}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxEmitter();
+	~FbxEmitter();
+
+protected:
+    typedef FbxIntrusiveList<FbxEventHandler, FbxEventHandler::eEmitter> EventHandlerList;
+    struct EventData { EventHandlerList mEventHandlerList; };
+    EventData* mData;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_EMITTER_H_ */

+ 188 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxevent.h

@@ -0,0 +1,188 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxevent.h
+#ifndef _FBXSDK_CORE_EVENT_H_
+#define _FBXSDK_CORE_EVENT_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxpropertytypes.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** FBX SDK event base class. 
+  * An event is something that is emitted by an emitter, with the goal of being filled by the listener that listen to it. 
+  * You can see that like a form that you send to some people. If those people know how to fill the form, they fill it and return
+  * it to you with the right information in it. FBX object could be used as emitter, since FbxObject is derived from FbxEmitter.
+  * Meanwhile, plug-in could be used as listener, since FbxPlugin is derived from FbxListener.
+  * The derived class of FbxEventBase contains a type ID to distinguish different types of events.
+  * FBX object can emit different types of FBX events at different conditions. 
+  * \par The whole process of event is:
+  * \li 1. Create an emitter and a listener, then bind them together via the same event handler.
+  * \li 2. Emitter can emit an event at certain conditions. The event could be handled by event handler.
+  * \li 3. Once an event is emitted, the listener to this event will receive a signal. 
+  * \li 4. And then the listener could process the event data according to the types of event, by calling event handler.
+  * \note The event data is process by the callback function of event handler.
+  * For example, if a certain property of a FBX object is changed, the FBX object(emitter) can emit an event which type is FbxObjectPropertyChanged.
+  * The plug-in(listener) who are listening to FbxObjectPropertyChanged, will receive a signal and take action to process the event data. 
+  * \nosubgrouping
+  * \see FbxEvent FbxEventHandler FbxListener FbxEmitter
+  */
+class FBXSDK_DLL FbxEventBase
+{
+  public:
+	 /**
+	   * \name Constructor and Destructor
+	   */
+     //@{
+	 //!Destructor
+     virtual ~FbxEventBase();
+	 //@}
+
+	 /** Retrieve the event type ID
+	   * \return            type id
+	   */
+     virtual int GetTypeId() const = 0;
+
+	 /** Force events to give us a name
+	   * \return            event name 
+	   */
+     virtual const char* GetEventName() const = 0;   
+
+	protected:
+     static int GetStaticTypeId(const char*);
+};
+
+// Force events to declare a name by using an abstract method, and force them to use 
+// the proper name by making the call from FbxEvent<> go through the private static
+// method.
+#define FBXSDK_EVENT_DECLARE(Class)												\
+	public: virtual const char* GetEventName() const { return FbxEventName(); }	\
+	private: static const char* FbxEventName() { return #Class; }				\
+	friend class FbxEvent<Class>;												\
+
+//
+// Similar to above, but to be used when you've got an event template, and the
+// type is something know to FBX
+//
+#define FBXSDK_EVENT_TYPE_DECLARE(Class, FBXType)                                  \
+  public: virtual const char* GetEventName() const { return FbxEventName(); }      \
+  private:                                                                         \
+     static const char* FbxEventName() {                                           \
+         static FbxString lEventName = FbxString(#Class) + FbxString("<") +        \
+         FbxGetDataTypeFromEnum(FbxTypeOf(FBXType())).GetName() + ">";             \
+                                                                                   \
+         return lEventName.Buffer();                                               \
+      }                                                                            \
+  friend class FbxEvent< Class<FBXType> >;
+
+
+
+//This is for templates classes that will uses non fbxtypes in their templates
+//We force the the creation of an UNIQUE string for each types so that we can
+//retrieve the event within multiple DLLs
+
+//to be able to use this, the char EventName[] = "uniqueEventName"; must be declared
+//globally.
+
+#define FBXSDK_EVENT_TEMPLATE_HEADER(ClassName, TemplateName)\
+template < class TemplateName, const char* T > \
+class ClassName: public  FbxEvent< ClassName <TemplateName,T> >\
+{\
+    public: virtual const char* GetEventName() const {return FbxEventName();}\
+    private: static const char* FbxEventName() {\
+    static FbxString lEventName = (FbxString(#ClassName) +"<"+ FbxString(T) +">");\
+    return lEventName.Buffer();\
+    }\
+    friend class FbxEvent< ClassName<TemplateName, T> >;
+
+
+//This is the footer macro, to put at the end to close the template class
+//created by FBXSDK_EVENT_TEMPLATE_HEADER
+#define FBXSDK_EVENT_TEMPLATE_FOOTER()\
+};
+
+/** FBX event class, derived from FbxEventBase, and it contains a type ID for event. 
+* It's a template class. You can derive your own types of even. Such as:
+* \code class FbxEventCustom : public FbxEvent<FbxEventCustom> \endcode
+* \see FbxObjectPropertyChanged FbxEventReferencedDocument FbxEventPostExport
+* \see FbxEventPostImport FbxEventPreExport FbxEventPreImport FbxEventPopulateSystemLibrary
+* \nosubgrouping
+* \remarks A FBX event is something that is emitted by an emitter, with the goal of being filled by the listener that listen to it. 
+* An object(emitter) can emit a certain type of event, the plug-in(listener) who are listening to that type of event, 
+* will receive a signal and take action to process the event data. 
+* \par The whole process of event is:
+* \li 1. Create an emitter and a listener, then bind them together via the same event handler.
+* \li 2. Emitter can emit an event at certain conditions. The event could be handled by event handler.
+* \li 3. Once an event is emitted, the listener to this event will receive a signal. 
+* \li 4. And then the listener could process the event data according to the types of event, by calling event handler.
+* \note The event data is process by the callback function of event handler.
+* \see FbxEventBase FbxEventHandler FbxListener FbxEmitter
+*/
+//---------------------------------------------------
+// T : We use the curiously recurring template pattern
+//          to initialize the typeId of each event type
+template<typename T> class FbxEvent : public FbxEventBase
+{
+public:
+    //!Destructor
+    virtual ~FbxEvent(){}
+
+    /** Update the type ID of current event with the given type ID.
+    * \param pTypeId     the new type ID.
+    */
+    static void ForceTypeId(int pTypeId)
+    {
+        // This is to handle specific cases where the type ID must be hard coded
+        // It is useful for shared event across DLL. We can then guarantee that
+        // The ID of a certain type will always have the same ID
+        smTypeId = pTypeId;
+    }
+
+    /** Retrieve the event type ID
+    * \note This may be called from multiple threads.
+    * \return            type id
+    */
+    virtual int GetTypeId() const 
+    {
+		return GetStaticTypeId();
+    }
+
+    /** Retrieve the event type ID
+    * \return            type id
+    */
+    static int GetStaticTypeId() 
+    {
+        if( !smTypeId )
+        {
+            if( !smTypeId )
+            {
+                // If this does not compile, you need to add 
+                // FBXSDK_EVENT_DECLARE(YourEventClassName) to your class declaration
+                smTypeId  = FbxEventBase::GetStaticTypeId(T::FbxEventName());
+            }
+        }
+
+       return smTypeId;
+    }
+
+private:
+    //! The type ID of event
+    static int smTypeId;
+};
+
+// Static members implementation
+template<typename T> int FbxEvent<T>::smTypeId = 0;
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_EVENT_H_ */

+ 129 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxeventhandler.h

@@ -0,0 +1,129 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxeventhandler.h
+#ifndef _FBXSDK_CORE_EVENT_HANDLER_H_
+#define _FBXSDK_CORE_EVENT_HANDLER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxevent.h>
+#include <fbxsdk/core/base/fbxintrusivelist.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxListener;
+
+/** Event handler class contains a listener and a callback function.
+* Event handler is used to bind emitter and listener together. Its callback function can process event data.
+* To generate a valid event handler, you can create an event emitter and event listener first and then call FbxListener::Bind().
+* It will create an event handler automatically and bind the handler to the listener and the created emitter. 
+* After that, the emitter and listener are bound together via event handler.
+* \remarks An object(emitter) can emit a certain type of event, the object(listener) who are listening to that type of event, 
+* will receive a signal and take action to process the event data. 
+* \par The whole process of event is:
+* \li 1. Create an emitter and a listener, then bind them together via the same event handler.
+* \li 2. Emitter can emit an event at certain conditions. The event could be handled by event handler.
+* \li 3. Once an event is emitted, the listener to this event will receive a signal. 
+* \li 4. And then the listener could process the event data according to the types of event, by calling event handler.
+* \note The event data is process by the callback function of event handler.
+* \nosubgrouping
+* \see FbxListener FbxEventBase FbxEvent FbxEmitter
+*/
+class FbxEventHandler
+{
+public:
+	//! Event handler base type.
+	enum EType
+	{
+		eListener,	//!< Listener event handler type.
+		eEmitter,	//!< Emitter event handler type.
+		eCount		//!< Count of different event handler types.
+	};
+
+	/** Get event type of current handler.
+	* \return The type ID of event. */
+	virtual int GetHandlerEventType()=0;
+
+	/** Call function that process event data.
+	* \param pEvent specify the event type. pEvent could be a specific class which derived from FbxEventBase.
+	* \see FbxEventBase */
+	virtual void FunctionCall(const FbxEventBase& pEvent)=0;
+
+	/** Get listener of current handler.
+	* \return A pointer to the listener object. */
+	virtual FbxListener* GetListener()=0;
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    FbxEventHandler(){}
+    virtual ~FbxEventHandler(){}
+
+	FBXSDK_INTRUSIVE_LIST_NODE(FbxEventHandler, eCount);
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
+template <typename EventType, typename ListenerType> class FbxMemberFuncEventHandler : public FbxEventHandler
+{
+	typedef void (ListenerType::*CallbackFnc)(const EventType*);
+
+public:
+    FbxMemberFuncEventHandler(ListenerType* pListenerInstance, CallbackFnc pFunction) : mListener(pListenerInstance), mFunction(pFunction){}
+	virtual int GetHandlerEventType(){ return EventType::GetStaticTypeId(); }  
+	virtual void FunctionCall(const FbxEventBase& pEvent){ (*mListener.*mFunction)(reinterpret_cast<const EventType*>(&pEvent)); } 
+	virtual FbxListener* GetListener(){ return mListener; }
+
+private:
+	ListenerType*	mListener;
+	CallbackFnc		mFunction;
+};
+
+template <typename EventType, typename ListenerType> class FbxConstMemberFuncEventHandler : public FbxEventHandler
+{
+	typedef void (ListenerType::*CallbackFnc)(const EventType*) const;
+
+public:
+	FbxConstMemberFuncEventHandler(ListenerType* pListenerInstance, CallbackFnc pFunction) : mListener(pListenerInstance), mFunction(pFunction){}
+	virtual int GetHandlerEventType(){ return EventType::GetStaticTypeId(); }    
+	virtual void FunctionCall(const FbxEventBase& pEvent){ (*mListener.*mFunction)(reinterpret_cast<const EventType*>(&pEvent)); }
+	virtual FbxListener* GetListener(){ return mListener; }
+
+private:
+	ListenerType*	mListener;
+	CallbackFnc		mFunction;
+};
+
+template <typename EventType> class FbxFuncEventHandler : public FbxEventHandler
+{
+	typedef void (*CallbackFnc)(const EventType*, FbxListener*);
+
+public:
+	FbxFuncEventHandler(FbxListener* pListener, CallbackFnc pFunction) : mListener(pListener), mFunction(pFunction){}
+	virtual int GetHandlerEventType(){ return EventType::GetStaticTypeId(); }   
+	virtual void FunctionCall(const FbxEventBase& pEvent){ (*mFunction)(reinterpret_cast<const EventType*>(&pEvent), mListener); }
+	virtual FbxListener* GetListener(){ return mListener; }
+
+private:
+	FbxListener*	mListener;
+	CallbackFnc		mFunction;
+};
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_EVENT_HANDLER_H_ */

+ 121 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxlistener.h

@@ -0,0 +1,121 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxlistener.h
+#ifndef _FBXSDK_CORE_LISTENER_H_
+#define _FBXSDK_CORE_LISTENER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxemitter.h>
+#include <fbxsdk/core/fbxeventhandler.h>
+#include <fbxsdk/core/base/fbxintrusivelist.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/**FBX SDK listener class. Once an event is emitted by an emitter, a listener should be created to listen to the event. 
+  * The listener could receive a signal and take action to process the event data. 
+  * \note The data will be process by the callback function of FbxListener::Bind().
+  * Plug-in could be used as listener, since FbxPlugin is derived from FbxListener.
+  * To emit event, you could create an emitter and a listener, and then bind them together via event handler.
+  * To listen to an event which is emitted by an emitter, you should bind current listener to the emitter by calling FbxListener::Bind(). 
+  * Event listener contains a list of event handlers.
+  * \remarks An object(emitter) can emit a certain type of event, the plug-in(listener) who are listening to that type of event, 
+  * will receive a signal and take action to process the event data. 
+  * \par The whole process of event is:
+  * \li 1. Create an emitter and a listener, then bind them together via the same event handler.
+  * \li 2. Emitter can emit an event at certain conditions. The event could be handled by event handler.
+  * \li 3. Once an event is emitted, the listener to this event will receive a signal. 
+  * \li 4. And then the listener could process the event data according to the types of event, by calling event handler.
+  * \note The event data is process by the callback function of event handler.
+  * \see FbxEmitter FbxEventHandler FbxEvent FbxEventBase
+  */
+class FBXSDK_DLL FbxListener
+{
+public:
+	/**
+	  * \name Constructor and Destructor
+	  */
+	//@{
+	//!Destructor.
+    ~FbxListener();
+	//!Constructor.
+    FbxListener(){}
+	//@}
+   
+	////////////////////////////////////////////////////////////////////////////////////////
+    /**
+    * \name Bind and unbind methods
+    */
+    //@{
+
+    /**Bind current listener and the specified emitter together via an automatically created event handler. 
+     * An event handler will be created automatically and added to the handlers list of current listener and the specified emitter.
+     * After that, the listener can listen to the event which is emitted by the specified emitter.
+	 * \param pEmitter          Event emitter to bind. Current listener can listen to the event which is emitted by pEmitter.
+	 * \param pFunc             The callback function to process event date.
+	 * \return                  The automatically created event handler.
+	 */
+    template <typename EventType,typename ListenerType> FbxEventHandler* Bind(FbxEmitter& pEmitter, void (ListenerType::*pFunc)(const EventType*))
+    {
+        FbxMemberFuncEventHandler<EventType,ListenerType>* eventHandler = 
+            FbxNew< FbxMemberFuncEventHandler<EventType,ListenerType> >(static_cast<ListenerType*>(this),pFunc);
+        pEmitter.AddListener(*eventHandler);
+        mEventHandler.PushBack(*eventHandler);
+        return eventHandler;
+    }
+
+    /**Bind current listener and the specified emitter together via an automatically created event handler. 
+    * An event handler will be created automatically and added to the handlers list of current listener and the specified emitter.
+    * After that, the listener can listen to the event which is emitted by the specified emitter.
+    * \param pEmitter          Event emitter to bind. Current listener can listen to the event which is emitted by pEmitter.
+    * \param pFunc             The callback function to process event date.
+    * \return                  The automatically created event handler.
+    */
+    template <typename EventType,typename ListenerType> FbxEventHandler* Bind(FbxEmitter& pEmitter, void (ListenerType::*pFunc)(const EventType*)const)
+    {
+        FbxConstMemberFuncEventHandler<EventType,ListenerType>* eventHandler = 
+                    FbxNew< FbxConstMemberFuncEventHandler<EventType,ListenerType> >(static_cast<ListenerType*>(this),pFunc);
+        pEmitter.AddListener(*eventHandler);
+        mEventHandler.PushBack(*eventHandler);
+        return eventHandler;
+    }
+
+    /**Bind current listener and the specified emitter together via an automatically created event handler. 
+    * An event handler will be created automatically and added to the handlers list of current listener and the specified emitter.
+    * After that, the listener can listen to the event which is emitted by the specified emitter.
+    * \param pEmitter          Event emitter to bind. Current listener can listen to the event which is emitted by pEmitter.
+    * \param pFunc             The callback function to process event date.
+    * \return                  The automatically created event handler.
+    */
+    template <typename EventType> FbxEventHandler* Bind(FbxEmitter& pEmitter, void (*pFunc)(const EventType*,FbxListener*))
+    {
+        FbxFuncEventHandler<EventType>* eventHandler = 
+                        FbxNew< FbxFuncEventHandler<EventType> >(this, pFunc);
+        pEmitter.AddListener(*eventHandler);
+        mEventHandler.PushBack(*eventHandler);
+        return eventHandler;
+    }
+    
+	/**Unbind an event handler. The specified event handler will be removed from the handlers list of current listener. 
+	  * \param aBindId       The event handler to unbind.
+	  */
+    void Unbind(const FbxEventHandler* aBindId);
+	//@}
+
+private:
+    typedef FbxIntrusiveList<FbxEventHandler, FbxEventHandler::eListener> EventHandlerList;
+    EventHandlerList mEventHandler;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_LISTENER_H_ */

+ 86 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxloadingstrategy.h

@@ -0,0 +1,86 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2016 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxloadingstrategy.h
+#ifndef _FBXSDK_CORE_LOADING_STRATEGY_H_
+#define _FBXSDK_CORE_LOADING_STRATEGY_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#ifndef FBXSDK_ENV_WINSTORE
+
+#include <fbxsdk/core/fbxplugin.h>
+#include <fbxsdk/core/fbxplugincontainer.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** 
+ * Abstract class used to implemented some plug-in loading strategy.
+ * A loading strategy dictate how some plug-ins will be loaded for instance.
+ * We could have a simple strategy that loads only a single dll on PC. 
+ * We could also implement a strategy that load multiple dlls from a directory.
+ */
+class FBXSDK_DLL FbxLoadingStrategy : public FbxPluginContainer
+{
+public:
+    /** Result state of loading plug-in.
+     */
+    enum EState
+	{
+        eAllLoaded,     //!< Plug-ins are loaded.
+        eNoneLoaded,    //!< No plug-ins are loaded. 
+        eAllFailed,     //!< Plug-ins failed to load.
+        eSomeFailed     //!< Not all found plug-ins are loaded.
+    };
+
+    /**
+    *\name Public interface
+    */
+    //@{
+		/** Execute the operation of loading the plug-in(s). The way it is executed is determined by the specific implementations.
+		* \param pData  Plug in data that can be access inside the plug-ins.
+		* \return The state of the loading action.
+		*/
+		EState Load(FbxPluginData& pData);
+
+		/** Execute the operation of unloading the plug-in(s). The way it is executed is determined by the specific implementations.
+		*/
+		void Unload();
+    //@}
+
+protected:
+    /**
+    *\name User implementation
+    */
+    //@{
+		/** Called by the Load method, it contains the specific user implementation strategy to load the desired plug-in(s).
+		* \param pData  Plug in data that can be access inside the plug-ins.
+		* \return If the plugin loading is successful return \c true, otherwise return \c false
+		*/
+		virtual bool SpecificLoad(FbxPluginData& pData) = 0;
+
+		/** Called by the Unload method, it contains the specific user implementation strategy to unload the desired plug-in(s).
+		*/
+		virtual void SpecificUnload(FbxPluginData& pData) = 0;
+    //@}
+
+    //! Whether the plugin is loaded or not.
+    EState mPluginsLoadedState;
+
+private:
+    FbxPluginData mData;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE */
+
+#endif /* _FBXSDK_CORE_LOADING_STRATEGY_H_ */

+ 555 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxmanager.h

@@ -0,0 +1,555 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxmanager.h
+#ifndef _FBXSDK_CORE_MANAGER_H_
+#define _FBXSDK_CORE_MANAGER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxobject.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxIOSettings;
+class FbxIOPluginRegistry;
+class FbxAnimEvaluator;
+class FbxSceneReference;
+class FbxUserNotification;
+class FbxMessageEmitter;
+class FbxLocalizationManager;
+class FbxXRefManager;
+class FbxManager_internal;
+
+#ifndef FBXSDK_ENV_WINSTORE
+	class FbxPlugin;
+#endif
+
+/** SDK object manager.
+  *   The SDK manager is in charge of:
+  *     \li scene element allocation, for example, FbxScene::Create(pSdkManager, "").
+  *     \li scene element deallocation, call FbxManager::Destroy() to deallocates all object created by the SDK manager.
+  *     \li scene element search and access, please see \ref GlobalObjectManagement section.
+  *
+  * It is possible to override memory allocation functions throughout the FBX SDK by
+  * providing system memory allocation functions using the handler set functions below.
+  * It must be done before the first FbxManager creation.
+  *
+  *	FbxSetMallocHandler();
+  * FbxSetCallocHandler();
+  * FbxSetReallocHandler();
+  * FbxSetFreeHandler();
+  *
+  * Upon destruction, all objects allocated by the SDK manager and not explicitly destroyed are destroyed as well. 
+  * A derived class can be defined to allocate and deallocate specialized scene elements.
+  * \remarks You could create more than one SDK manager. However, it's better to NOT share the same object among different managers.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxManager
+{
+public:
+	/**
+	  * \name FBX SDK Manager Creation/Destruction
+	  */
+	//@{
+		/** SDK manager allocation method.
+		  * \return A pointer to the SDK manager or \c NULL if this is an
+		  * evaluation copy of the FBX SDK and it is expired.
+		  */
+		static FbxManager* Create();
+
+		/** Destructor.
+		  * Deallocates all object previously created by the SDK manager.
+		  */
+		virtual void Destroy();
+	//@}
+
+	/**
+	  * \name Versions Queries
+	  */
+	//@{
+		/** Get FBX SDK version string.
+		  * \param pFull	If true, the complete version string including revision number and release date will be returned,
+		  *					otherwise only the version numbering is returned.
+		  */
+		static const char* GetVersion(bool pFull=true);
+
+		/** Get the current default FBX file format version number for this version of the FBX SDK.
+		  * \param pMajor        Version major number.
+		  * \param pMinor        Version minor number.
+		  * \param pRevision     Version revision number.
+		  */
+		static void GetFileFormatVersion(int& pMajor, int& pMinor, int& pRevision);
+	//@}
+
+
+	/**
+	  * \name Object Registration, Definition and Management
+	  */
+	//@{
+		/** Class registration.
+		  * \param pName				The class name. For example, "FbxMesh" for FbxMesh class.
+		  * \param T1					FBX type of the specified class.
+		  * \param T2					FBX type of parent class.
+		  * \param pFbxFileTypeName     The type name of the class in FBX file.
+		  * \param pFbxFileSubTypeName  The sub type name of the class in FBX file.
+		  * \return The class Id of the newly register class.
+		  * Such as:
+		  * \code RegisterFbxClass("FbxCamera", FBX_TYPE(FbxCamera), FBX_TYPE(FbxNodeAttribute)); \endcode
+		  */
+		template <typename T1, typename T2> inline FbxClassId RegisterFbxClass(const char* pName, const T1* /*T1*/, const T2* /*T2*/, const char* pFbxFileTypeName=0, const char* pFbxFileSubTypeName=0)
+		{
+			T1::ClassId = Internal_RegisterFbxClass(pName, T2::ClassId, (FbxObjectCreateProc)T1::Allocate, pFbxFileTypeName, pFbxFileSubTypeName);
+			return T1::ClassId;
+		}
+	 
+		/** Runtime class registration.
+		  * \param pName                    The class name. For example, "FbxUIWidgetBoolean".
+		  * \param T						FBX type of parent class.
+		  * \param pFbxFileTypeName         The type name of the class in FBX file.
+		  * \param pFbxFileSubTypeName      The sub type name of the class in FBX file.
+		  * \return The class Id of the newly register class.
+		  * Such as:
+		  * \code RegisterRuntimeFbxClass( "FbxUIWidgetBoolean", FBX_TYPE(FbxUIWidgetDefinition), NULL, "FbxUIWidgetBoolean"); \endcode
+		  */
+		template <typename T> inline FbxClassId RegisterRuntimeFbxClass(const char* pName, const T* /*T*/, const char* pFbxFileTypeName=0,const char* pFbxFileSubTypeName=0)
+		{
+			return Internal_RegisterFbxClass(pName, T::ClassId, (FbxObjectCreateProc)T::Allocate, pFbxFileTypeName, pFbxFileSubTypeName);
+		}
+	    
+		/** Runtime class unregistration.
+		  * \param pName The class name.
+		  */
+		inline void UnregisterRuntimeFbxClass(const char* pName)
+		{
+			FbxClassId lClassId = FindClass(pName);
+			if( !(lClassId == FbxClassId()) )
+			{
+				Internal_UnregisterFbxClass(lClassId);
+			}
+		}
+	    
+		/** Override class.
+		  * \param pFBX_TYPE_Class      FBX type of class.
+		  * \param pFBX_TYPE_OverridenClass FBX type of overridden class.
+		  * \return The class Id
+		  */
+		template <typename T1,typename T2> inline FbxClassId OverrideFbxClass(const T1* pFBX_TYPE_Class, const T2* pFBX_TYPE_OverridenClass)
+		{
+			T1::ClassId  = Internal_OverrideFbxClass(T2::ClassId,(FbxObjectCreateProc)T1::Allocate );
+			return T1::ClassId;
+		}
+
+		/** Create a new object of the specified ClassId.
+		  * \param pClassId		The ClassId of the object to be created.
+		  * \param pName		The name given to the newly created object.
+		  * \param pContainer	An optional parameter to specify which object will "contain" the new object. By contain, we mean
+		  *						the new object will become a source to the container, connection-wise.
+		  * \param pCloneFrom	A valid object pointer to use as the reference for cloning the object upon construction.
+		  * \return				If not null, a new instance of the specified class.
+		  * \remark				This function will return NULL if the ClassId used is invalid. New ClassId can be registered using
+		  *						the function RegisterFbxClass().
+		  */
+		FbxObject* CreateNewObjectFromClassId(FbxClassId pClassId, const char* pName, FbxObject* pContainer=NULL, const FbxObject* pCloneFrom=NULL);
+
+		/** Find class by the specified name.
+		  * \param pClassName Class Name to find.
+		  */
+		FbxClassId FindClass(const char* pClassName) const;
+
+		/** Find file class.
+		  * \param pFbxFileTypeName     Specify the type name in FBX file to find.
+		  * \param pFbxFileSubTypeName  Specify by The sub type name in FBX file to find.
+		  */
+		FbxClassId FindFbxFileClass(const char* pFbxFileTypeName, const char* pFbxFileSubTypeName) const;
+
+		/** Class unregistration.
+		  * \param pFBX_TYPE_Class  FBX type of unregistered class.
+		  */
+		template <typename T> inline void UnregisterFbxClass(const T*)
+		{
+			Internal_UnregisterFbxClass(T::ClassId);
+			T::ClassId = FbxClassId();
+		}
+	//@}
+
+	/**
+	  * \name Data Type Management
+	  */
+	//@{
+		/** Register a new data type to the manager
+		 *  \param pName The type name.
+		 *  \param pType The data type.
+		 *  \return The newly created FbxDataType
+		 */
+		FbxDataType CreateDataType(const char* pName, const EFbxType pType);
+
+		/** List the data types
+		 *  \return the number of registered datatypes
+		 */
+		int GetDataTypeCount() const;
+
+		/** Find a data types at pIndex.
+		 *  \param pIndex The data type index.
+		 *  \return the found datatype. return null if not found
+		 */
+		FbxDataType& GetDataType(const int pIndex) const;
+
+		/** Find a data type from the type name.
+		 *  \param pDataType The type name.
+		 *  \return the found datatype. return null if not found
+		 */
+		FbxDataType& GetDataTypeFromName(const char* pDataType) const;
+	//@}
+
+	/**
+	  * \name User Notification Object
+	  */
+	//@{
+		/** Access to the unique UserNotification object.
+		  * \return The pointer to the user notification or \c NULL \c if the object
+		  * has not been allocated.
+		*/
+		FbxUserNotification* GetUserNotification() const;
+
+		/** Set the user notification
+		  * \param pUN  
+		  */
+		void SetUserNotification(FbxUserNotification* pUN);
+	//@}
+
+	/**
+	  * \name IOSettings Object
+	  */
+	//@{
+		/** Access to a IOSettings object.
+		  * \return The pointer to IOSettings or \c NULL \c if the object
+		  * has not been allocated.
+		*/
+		virtual FbxIOSettings* GetIOSettings() const;
+
+		/** Set the IOSettings pointer
+		  * \param pIOSettings  
+		  */
+		virtual void SetIOSettings(FbxIOSettings* pIOSettings);
+	//@}
+
+
+	/**
+	  * \name Message Emitter (for Message Logging)
+	  */
+	//@{
+		/** Access to the unique FbxMessageEmitter object.
+		  * \return The pointer to the message emitter.
+		*/
+		FbxMessageEmitter& GetMessageEmitter();
+		/** Sets to the unique FbxMessageEmitter object.
+		  * \param pMessageEmitter the emitter to use, passing NULL will reset to the default emitter.
+		  * The object will be deleted when the SDK manager is destroyed, thus ownership is transfered.
+		*/
+		bool SetMessageEmitter(FbxMessageEmitter* pMessageEmitter);
+	//@}
+
+        
+	/**
+	  * \name Localization Hierarchy
+	  */
+	//@{
+		/** Add a localization object to the known localization providers.
+		  * \param pLocManager the localization object to register.
+		*/
+		void AddLocalization(FbxLocalizationManager* pLocManager);
+
+		/** Remove a localization object from the known localization providers.
+		  * \param pLocManager the localization object to remove.
+		*/
+		void RemoveLocalization(FbxLocalizationManager* pLocManager);
+
+		/** Select the current locale for localization.
+		  * \param pLocale the locale name, for example "fr" or "en-US".
+		*/
+		bool SetLocale(const char* pLocale);
+
+		/** Localization helper function. Calls each registered localization manager
+		  * until one can localizes the text.
+		  * \param pID the identifier for the text to localize.
+		  * \param pDefault the default text. Uses pID if NULL.
+		  * \return the potentially localized text. May return the parameter passed in.
+		*/
+		const char* Localize(const char* pID, const char* pDefault=NULL) const;
+	//@}
+
+	/**
+	  * \name XRef Manager
+	  */
+	//@{
+		/** Retrieve the manager responsible for managing object XRef resolution.
+		  * \return The XRef manager for this SDK manager.
+		  */
+		FbxXRefManager& GetXRefManager();
+	//@}
+
+	/**
+	  * \name Library Management
+	  */
+	//@{
+		/** Retrieve the main object Libraries
+		  * \return The Root library
+		  */
+		FbxLibrary* GetRootLibrary() const;
+		FbxLibrary* GetSystemLibraries() const;
+		FbxLibrary* GetUserLibraries() const;
+	//@}
+
+	/**
+	  * \name Plug-in Registry Object
+	  */
+	//@{
+		/** Access to the unique FbxIOPluginRegistry object.
+		  * \return The pointer to the user FbxIOPluginRegistry
+		*/
+		FbxIOPluginRegistry* GetIOPluginRegistry() const;
+	//@}
+
+	/**
+	  * \name Fbx Generic Plugins Management
+	  */
+	//@{
+	#ifndef FBXSDK_ENV_WINSTORE
+		/** Load plug-ins directory
+		  * \param pFilename The directory path.
+		  * \param pExtensions The plug in extension.
+		  * \return \c True
+		  */
+		bool LoadPluginsDirectory(const char* pFilename, const char* pExtensions=NULL);
+
+		/** Load plug-in
+		  * \param pFilename The file name
+		  * \return \c True
+		  */
+		bool LoadPlugin(const char* pFilename);
+
+		/** Unload all plug-ins
+		*/
+		bool UnloadPlugins();
+
+		/** Emit plugins event.
+		  * \param pEvent The event to be emitted.
+		  */
+		bool EmitPluginsEvent(const FbxEventBase& pEvent);
+	   
+		//!Get plugins.
+		FbxArray<const FbxPlugin*> GetPlugins() const;
+
+		/** get plugins count
+		  * \return The number of plugins.
+		  */
+		int GetPluginCount() const;
+
+		/** Find plug in.
+		  * \param pName The plug in name.
+		  * \param pVersion The plug in version.
+		  * \return The plugin, \c null if not found.
+		  */
+		FbxPlugin* FindPlugin(const char* pName, const char* pVersion) const;
+	#endif /* !FBXSDK_ENV_WINSTORE */
+	//@}
+
+
+	/**
+	  * \name IO Settings
+	  */
+	//@{
+	// Add IOSettings in hierarchy from different modules
+
+		/** Fill IO Settings for registered readers. 
+		  * \param pIOS The properties hierarchies to fill.
+		  */
+		void FillIOSettingsForReadersRegistered(FbxIOSettings& pIOS);
+
+		/** Fill IO Settings for registered writers. 
+		  * \param pIOS The properties hierarchies to fill.
+		  */
+		void FillIOSettingsForWritersRegistered(FbxIOSettings& pIOS);
+
+		/** Fill common IO Settings 
+		  * \param pIOS The properties hierarchies to fill.
+		  * \param pImport If \c true, import properties are set, otherwise export properties are set.
+		  */
+		void FillCommonIOSettings(FbxIOSettings& pIOS, bool pImport);
+	//@}
+
+	/**
+	  * \name Global Object Management 
+	  */
+	//@{
+		/** Register object with the manager.
+		  * \internal
+		  * \param pObject The object to be registered.
+		  * \anchor GlobalObjectManagement
+		  */
+		void RegisterObject(FbxObject* pObject);
+
+		/** Unregister object with the manager.
+		  * \internal
+		  * \param pObject The object to be unregistered.
+		  */
+		void UnregisterObject(FbxObject* pObject);
+
+		/** Register a list of objects with the manager.
+		  * \internal
+		  * \param pArray The list of object to be registered.
+		  */
+		void RegisterObjects(const FbxArray<FbxObject*>& pArray);
+
+		/** Unregister a list of objects with the manager.
+		  * \internal
+		  * \param pArray The list of object to be unregistered.
+		  */
+		void UnregisterObjects(const FbxArray<FbxObject*>& pArray);
+
+		/** Increment the scene destroying counter. 
+		  * \remarks Call this function before the destroying list is changed.
+		 */
+		void IncreaseDestroyingSceneFlag();
+		/** Shrink the object list and decrements the scene destroying counter.
+		  * \remarks Call this function after the destroying is changed.
+		  * Use IncreasDestroyingSceneFlag() and DecreaseDestroyingSceneFlag() in pairs.
+		 */
+		void DecreaseDestroyingSceneFlag();
+	/**
+	* \name Reference Management
+	*/
+	//@{
+		/** Get number of references.
+		* \return Number of references.
+		*/
+		int GetReferenceCount() const;
+
+		/** Get reference at given index.
+		* \param pIndex Position in the list of references.
+		* \return Pointer to the reference or \c NULL if index is out of bounds.
+		*/
+		FbxSceneReference* GetReference(int pIndex) const;
+
+		/** Add a reference.
+		* \param pReference The reference to be added.
+		* \return If the reference is correctly added to the scene, return \c true otherwise, if the reference is
+		*  already there, returns \c false.
+		*/
+		int AddReference(FbxSceneReference* pReference);
+
+		/** Remove the specified reference from reference list.
+		* \param pReference The reference to be removed.
+		* \return If the reference was successfully removed, return \c true otherwise, if the
+		*  reference could not be found returns \c false.
+		*/
+		bool RemoveReference(FbxSceneReference* pReference);
+
+		/** Clear the specified reference from the SDK manager.
+		* \param pReference The reference to be removed.
+		* \return If the reference was successfully cleared from the SDK manager, return \c true otherwise, if the
+		*  reference could not be found returns \c false.
+		*/
+		bool ClearReference(FbxSceneReference* pReference);
+	//@}
+
+    /** Add a prefix to a name.
+      * \param pPrefix The prefix to be added to the \c pName. This
+      * string must contain the "::" characters in order to be considered
+      * as a prefix.
+      * \param pName The name to be prefix.
+      * \return The prefixed string
+      * \remarks If a prefix already exists, it is removed before
+      * adding \c pPrefix.
+      */
+    static FbxString PrefixName(const char* pPrefix, const char* pName);
+
+	/** Get the count of document available in this manager
+	  * \return The count of document owned by this manager.
+	  */
+	int GetDocumentCount();
+
+	/** Get the document at pIndex in the manager's list.
+	  * \param pIndex The index of the document to retrieve.
+	  * \return The document at the specified index. Will return NULL if index is invalid.
+	  */
+	FbxDocument* GetDocument(int pIndex);
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	static FbxManager*	GetDefaultManager();
+	void				CreateMissingBindPoses(FbxScene* pScene);
+	int					GetBindPoseCount(FbxScene *pScene) const;
+	int					GetFbxClassCount() const;
+	FbxClassId			GetNextFbxClass(FbxClassId pClassId /* invalid id: first one */) const;
+
+protected:
+	FbxManager();
+	virtual ~FbxManager();
+
+	void Clear();
+	void ClassInit();
+	void ClassRelease();
+	void DataTypeInit();
+	void DataTypeRelease();
+
+private:
+	bool		CanAutoDestroySrcObject(FbxObject* pObject, FbxObject* pSrcObject, bool pRecursive) const;
+
+	void		Create_Common_Import_IOSettings_Groups(FbxIOSettings& pIOS);
+	void		Create_Common_Export_IOSettings_Groups(FbxIOSettings& pIOS);
+	void		Add_Common_Import_IOSettings(FbxIOSettings& pIOS);
+	void		Add_Common_Export_IOSettings(FbxIOSettings& pIOS);
+	void		Add_Common_RW_Import_IOSettings(FbxIOSettings& pIOS);
+	void		Add_Common_RW_Export_IOSettings(FbxIOSettings& pIOS);
+
+	FbxClassId	Internal_RegisterFbxClass(const char* pClassName, FbxClassId pParentClassId, FbxObjectCreateProc=0, const char* pFbxFileTypeName=0, const char* pFbxFileSubTypeName=0);
+	bool		Internal_RegisterFbxClass(FbxClassId pClassId);
+	FbxClassId	Internal_OverrideFbxClass(FbxClassId pClassId, FbxObjectCreateProc=0);
+	void		Internal_UnregisterFbxClass(FbxClassId pClassId);
+
+	void		RemoveObjectsOfType(const FbxClassId& pClassId);
+
+	FbxAnimEvaluator* GetDefaultAnimationEvaluator();
+
+    FbxArray<FbxObject*>				mObjects;
+	FbxArray<FbxDocument*>				mDocuments;
+
+	FbxIOSettings*						mIOSettings;
+	FbxIOPluginRegistry*				mRegistry;
+	FbxUserNotification*				mUserNotification;
+	FbxMessageEmitter*					mMessageEmitter;
+	FbxArray<FbxLocalizationManager*>	mLocalizationManagerArray;
+	FbxArray<FbxSceneReference*>		mSceneReferenceArray;
+	FbxAnimEvaluator*					mDefaultAnimationEvaluator;
+
+	FbxArray<FbxObject*>				mDestroyingObjects;
+	FbxArray<FbxDocument*>				mDestroyingDocuments;
+    int									mIsDestroyingScene;
+
+	FbxManager_internal*				mInternal;
+	static FbxManager*					smDefaultManager;
+
+	FBXSDK_FRIEND_NEW();
+	friend class FbxObject;
+	friend class FbxProperty;		//For GetDefaultAnimationEvaluator()
+	friend class FbxNode;			//For GetDefaultAnimationEvaluator()
+	friend class FbxScene;			//For GetDefaultAnimationEvaluator()
+	friend class FbxAnimEvaluator;	//For GetDefaultAnimationEvaluator()
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_MANAGER_H_ */

+ 49 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxmodule.h

@@ -0,0 +1,49 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxmodule.h
+#ifndef _FBXSDK_CORE_MODULE_H_
+#define _FBXSDK_CORE_MODULE_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#ifndef FBXSDK_ENV_WINSTORE
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+typedef void* FbxModule;
+
+/** Loads the specified module into the address space of the calling process.
+  * \param pFilePath The full file path name of the module to load.
+  * \return The module handle if it successfully loaded, otherwise NULL.
+  * \remark The specified module may cause other modules to be loaded.
+  */
+FBXSDK_DLL FbxModule FbxModuleLoad(const char* pFilePath);
+
+/** Retrieves the address of an exported function or variable from the specified module.
+  * \param pModuleHandle A valid module handle.
+  * \param pProcName The procedure name to search.
+  * \return The procedure handle if valid, otherwise NULL.
+  */
+FBXSDK_DLL void* FbxModuleGetProc(FbxModule pModuleHandle, const char* pProcName);
+
+/** Frees the loaded module and, if necessary, decrements its reference count.
+  * \param pModuleHandle A valid module handle.
+  * \return \c true on success, \c false otherwise.
+  * \remark When the reference count reaches zero, the module is unloaded from the address space of the calling process and the handle is no longer valid.
+  */
+FBXSDK_DLL bool FbxModuleFree(FbxModule pModuleHandle);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE */
+
+#endif /* _FBXSDK_CORE_MODULE_H_ */

+ 1557 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxobject.h

@@ -0,0 +1,1557 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxobject.h
+#ifndef _FBXSDK_CORE_OBJECT_H_
+#define _FBXSDK_CORE_OBJECT_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxclassid.h>
+#include <fbxsdk/core/fbxquery.h>
+#include <fbxsdk/core/fbxemitter.h>
+#include <fbxsdk/core/fbxproperty.h>
+#include <fbxsdk/core/fbxstream.h>
+#include <fbxsdk/core/base/fbxstringlist.h>
+#include <fbxsdk/utils/fbxnamehandler.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxManager;
+class FbxDocument;
+class FbxImplementation;
+class FbxImplementationFilter;
+class FbxLibrary;
+class FbxMessage;
+class FbxPeripheral;
+class FbxUserDataRecord;
+class FbxConnectEvent;
+
+//! \internal Macro used to declare ClassId mechanics.
+#define FBXSDK_CLASS_DECLARE(Class, Parent, Const_Override)\
+private:\
+	Class(const Class&);\
+	Class& operator=(const Class&);\
+protected:\
+	virtual ~Class(){};\
+public:\
+	static FbxClassId ClassId;\
+	virtual FbxClassId GetClassId() Const_Override { return ClassId; }\
+	friend class FBXSDK_NAMESPACE::FbxManager;\
+    typedef Parent ParentClass;\
+	static Class* Create(FbxManager* pManager, const char* pName);\
+
+//! \internal Macro used to declare the FbxObject class.
+#define FBXSDK_FBXOBJECT_DECLARE(Class, Parent, Const_Override)\
+	FBXSDK_CLASS_DECLARE(Class, Parent, Const_Override)\
+    FBXSDK_FRIEND_NEW()\
+    static Class* Create(FbxObject* pContainer, const char* pName);\
+protected:\
+	static Class* Allocate(FbxManager* pManager, const char* pName, const Class* pFrom);\
+
+//! Macro used to declare a new class derived from FbxObject.
+#define FBXSDK_OBJECT_DECLARE(Class, Parent)\
+	FBXSDK_FBXOBJECT_DECLARE(Class, Parent, const override)\
+protected:\
+	Class(FbxManager& pManager, const char* pName) : Parent(pManager, pName){};\
+private: /* end of object declaration, put back private */\
+
+//! Macro used to declare a new abstract class derived from FbxObject.
+#define FBXSDK_ABSTRACT_OBJECT_DECLARE(Class, Parent)\
+	FBXSDK_CLASS_DECLARE(Class, Parent, const override)\
+protected:\
+	static FbxObjectCreateProc Allocate;\
+	Class(FbxManager& pManager, const char* pName) : Parent(pManager, pName){};\
+private: /* end of object declaration, put back private */\
+
+//! Macro used to implement a new class derived from FbxObject.
+#define FBXSDK_OBJECT_IMPLEMENT(Class)\
+	FbxClassId Class::ClassId;\
+	Class* Class::Create(FbxManager* pManager, const char* pName)\
+	{\
+		return (Class*)pManager->CreateNewObjectFromClassId(Class::ClassId, pName);\
+	}\
+	Class* Class::Create(FbxObject* pContainer, const char* pName)\
+	{\
+		FBX_ASSERT_RETURN_VALUE(pContainer && pContainer->GetFbxManager(), NULL);\
+		return (Class*)pContainer->GetFbxManager()->CreateNewObjectFromClassId(Class::ClassId, pName, pContainer);\
+	}\
+	Class* Class::Allocate(FbxManager* pManager, const char* pName, const Class* pFrom)\
+	{\
+		Class* lNewObject = FbxNew<Class>(*pManager, pName);\
+		lNewObject->Construct(pFrom);\
+		lNewObject->SetObjectFlags(FbxObject::eInitialized, true);\
+		return lNewObject;\
+	}\
+
+//! Macro used to implement a new abstract class derived from FbxObject.
+#define FBXSDK_ABSTRACT_OBJECT_IMPLEMENT(Class)\
+	FbxClassId Class::ClassId;\
+	FbxObjectCreateProc Class::Allocate = 0;\
+	Class* Class::Create(FbxManager* pManager, const char* pName)\
+	{\
+		return (Class*)pManager->CreateNewObjectFromClassId(Class::ClassId, pName);\
+	}\
+
+/** The base class of most FBX objects. Provides the benefits of connectivity, identity, run-time typing,
+  * properties, naming, copying, cloning, selection, and automated file IO. Most of
+  * the FBX SDK API deals with FbxObject pointers when it comes to manipulate objects in its simplest form.
+  *
+  * The ClassID mechanism replaces the dynamic_cast mechanism for efficient run-time type information.
+  *
+  * The FbxObject provides methods for managing the connections between objects.  
+  * Using connections, objects can be related to each other to form hierarchies or structures. All of
+  * the FBX scene's object relations are expressed as connections between objects. Those connections can
+  * be altered as needed to reflect most kind of setups encountered in this world. For example,
+  * connections can be used to express parenting between transform nodes. Connections are not strict in
+  * the sense that we allow any type of objects to connect to any other type of objects. The meaning of
+  * the connection is purely semantic. As of yet, we do not provide the functionality to validate if
+  * the connections made by the users are allowed or not.
+  *
+  * FbxObject provide a property (FbxProperty) mechanism to describe characteristics of 
+  * objects in a scene. Properties may be either static or dynamic. Static properties are defined in the class direction 
+  * and can be accessed directly by their name on the object exposing them without
+  * the need for a search in the property list of the object. Dynamic properties can be added during run-time,
+  * while the program is running. Objects can have an unlimited amount of properties. 
+  * Properties can be listed at run-time, allowing for a flexible support of custom data
+  * on objects, since they might be considered by the FBX file readers/writers depending on the flags set.
+  *
+  * Here is an example of a new empty minimal class template for FBX objects:
+  * \code
+  * //Declaration
+  * class MyClass : public FbxObject
+  * {
+  *     FBXSDK_OBJECT_DECLARE(MyClass, FbxObject);	//Be careful! The second parameter to this macro must be the parent class name!
+  *
+  * public:
+  *     //Declare methods and properties here...
+  * };
+  * \endcode
+  * \code
+  * //Implementation
+  * FBXSDK_OBJECT_IMPLEMENT(MyClass);
+  * \endcode
+  * Before the new class can be used, it needs to be registered to the manager with the following method:
+  * \code
+  * MyFbxManager->RegisterFbxClass("MyClassName", FBX_TYPE(MyClass), FBX_TYPE(FbxObject));	//Be careful! The 3rd parameter must be the parent class! If the parent class change, it must be updated here too!
+  * \endcode
+  * Then to create or delete instances of your new class, the following methods must be used:
+  * \code
+  * //Creating a new instance
+  * MyClass* MyObject = MyClass::Create(MyFbxManager, "Object Name");
+  *
+  * //Deleting this instance
+  * MyObject->Destroy();
+  * MyObject = NULL;
+  * \endcode
+  * \see FbxProperty
+  */
+class FBXSDK_DLL FbxObject : public FbxEmitter
+{
+	FBXSDK_FBXOBJECT_DECLARE(FbxObject, FbxEmitter, const);
+
+public:
+	//! \name General Object Management
+	//@{
+		/** Templated test if this class is a hierarchical children of the specified class type.
+		* \return \c true if the object is a hierarchical children of the type specified.
+		* \remark This function will perform a complete search until it reaches the top level class, but it will stop as soon as one ClassId matches the test. */
+		template <class T> inline bool Is() const { return GetClassId().Is(T::ClassId); }
+
+		/** Retrieve the FbxManager this object belongs to.
+		* \return A pointer to the manager that this object belongs to. */
+		FbxManager* GetFbxManager() const;
+
+		/** Returns a const pointer to the document that contains this object.
+		* \return A const pointer to the document that contains this object or \c NULL if the object does not belong to any document. */
+		FbxDocument* GetDocument() const;
+
+		/** Returns a const pointer to the root document that contains this object.
+		* \return A const pointer to the root document that contains this object or \c NULL if the object does not belong to any document.
+		* \remarks It returns this pointer if this object is a document object and does not belong to any document. That means this object is the root document. */
+		FbxDocument* GetRootDocument() const;
+
+		/** Returns a const pointer to the scene that contains this object.
+		* \return A pointer to the scene that contains this object or \c NULL if the object does not belong to any scene. */
+		FbxScene* GetScene() const;
+
+		/** Unregister and delete this object from memory. This will also breaks all connections as well as removing all the instance of all the properties of this object with the object's class.
+		* \param pRecursive If true, all children (source) objects will also be unregistered and deleted. */
+		void Destroy(bool pRecursive=false);
+
+		/** Reset all the properties of this object to their default values. */
+		void ResetProperties();
+	//@}
+
+	//! \name Object Flags Management
+	//@{
+		//! Flags available to control objects.
+		enum EObjectFlag
+		{
+			eNone = 0,					 //!< No flags.
+			eInitialized = 1 << 0,		 //!< Automatically set when FbxObject::Construct() is completed.
+			eSystem = 1 << 1,			 //!< When set, object is deleted upon FbxManager destroy only. Use carefully!
+			eSavable = 1 << 2,			 //!< If set, object is stored in FBX file upon export. All objects are savable by default.
+			eSelected = 1 << 3,			 //!< Used by the selection mechanic to specify a selected object.
+			eHidden = 1 << 4,			 //!< Used for interface representation; if set, the object should not be visible.
+			eContentLoaded = 1 << 5,	 //!< Used by load-on-demand mechanic to specify if an object has its content loaded.
+			eDontLocalize = 1 << 6,		 //!< Used by asset builder; Do not localize this object
+            eCopyCalledByClone = 1 << 16 //!< Used internally. If set, modify the Copy behavior of the object
+		};
+
+		/** Set the state of object flags.
+		* \param pFlags Bit flags which value is going to be changed.
+		* \param pValue If \c true, bit flags will be set, otherwise bits will be un-set. */
+		void SetObjectFlags(EObjectFlag pFlags, bool pValue);
+
+		/** Get the state of object flags.
+		* \param pFlags Bit flags to query.
+		* \return \c true if the specified bit flags are all set. */
+		bool GetObjectFlags(EObjectFlag pFlags) const;
+
+		/** Override all object flags at once.
+		* \param pFlags The bit flags to set all the object flags to.
+		* \remark This function will override all flags; unspecified bit flags will be un-set. */
+		void SetAllObjectFlags(FbxUInt pFlags);
+
+		/** Get all object flags at once.
+		* \return All bit flags at once. */
+		FbxUInt	GetAllObjectFlags() const;
+	//@}
+
+	//! \name Copying, Cloning and Referencing
+	//@{
+		/** Copy an object content into this object.
+		* \param pObject	The source object to copy data from.
+		* \return			Returns the destination object being modified by the source.
+		* \remark			This function replace the assignment operator (operator=). It will copy all property values and the name. Connections are NOT copied. */
+        virtual FbxObject& Copy(const FbxObject& pObject);
+
+		//! Types of clones that can be created for FbxObject.
+		enum ECloneType
+		{
+			eDeepClone,		//!< A deep copy of the object. Changes to either the original or clone properties do not propagate to each other.
+			eReferenceClone	//!< Changes to original object properties propagate to clone. Changes to clone properties do not propagate to original.
+		};
+
+		/** Creates a clone of this object.
+        * By default, the connections are NOT cloned. If the desired effect is to clone the connections as well, you must clone using the FbxCloneManager 
+        * (refer to this class documentation for further details).
+        *
+		* \param pCloneType	    The type of clone to be created. By default, the clone type is eDeepClone.
+		* \param pContainer	    An optional parameter to specify which object will "contain" the new object. By contain, we mean the new object
+		*					    will become a source to the container, connection-wise.
+        * \param pSet           See remark section.
+		* \return			    The new clone, or NULL (if the specified clone type is not supported).
+		* \remark			    When doing either a "deep" or "reference" clone type, the clone will always get its properties values set from
+		*					    the source object properties values. 
+        * \remark               Since this is a virtual function, some classes might do additional tasks.
+        * \remark               The \e pSet argument is not used in the default implementation of this method. Specialized implementations should
+        *                       cast this pointer to FbxCloneManager::CloneSet to have access to the cloned objects so far. Typically, this
+        *                       pointer is set by the clone manager.
+        */
+		virtual FbxObject* Clone(FbxObject::ECloneType pCloneType=eDeepClone, FbxObject* pContainer=NULL, void* pSet = NULL) const;
+
+		/** Checks if this object is a reference clone of another object.
+		* \return \c True if this object is a clone of another object, \c false otherwise */
+		bool IsAReferenceTo() const;
+
+		/** If this object is a reference clone, returns the original object (from which the clone originates).
+		* \return The original object, or NULL (if this object is not a reference clone). */
+		FbxObject* GetReferenceTo() const;
+
+		/** Checks if any objects are reference cloned from this object.
+		* \return \c True if there are objects reference cloned from this object, \c false otherwise. */
+		bool IsReferencedBy() const;
+
+		/** Returns the number of objects that are reference clones of this object.
+		* \return The number of objects that are reference clones of this object. */
+		int GetReferencedByCount() const;
+
+		/** Returns a reference clone of this object at the specified index.
+		* \param pIndex	The specified index, valid values are [0, GetReferencedByCount())
+		* \return		The reference clone, or NULL (if pIndex is out of range). */
+		FbxObject* GetReferencedBy(int pIndex) const;
+	//@}
+
+	/**
+	  * \name Object Name Management
+	  */
+	//@{
+		/** Sets the name of this object.
+		  * \param pName The object name as a \c NULL terminated string.
+		  */
+		void SetName(const char* pName);
+
+		/** Returns the full name of this object.
+		  * \return The full name as a \c NULL terminated string.
+		  */
+		const char* GetName() const;
+
+		/** Returns the name of the object without the namespace qualifier.
+		  * \return The object name without the namespace qualifier.
+		  */
+		FbxString GetNameWithoutNameSpacePrefix() const;
+
+		/** Returns the name of the object with the namespace qualifier.
+		  * \return The object name with the namespace qualifier.
+		  */
+		FbxString GetNameWithNameSpacePrefix() const;
+
+		/** Sets the initial name of the object.
+		  * \param pName The object's initial name as a \c NULL terminated string.
+		  */
+		void SetInitialName(const char* pName);
+
+		/** Returns the initial name of the object.
+		  * \return The object's initial name as a \c NULL terminated string.
+		  */
+		const char* GetInitialName() const;
+
+		/** Returns the namespace of the object.
+		  * \return The object's namespace as a \c NULL terminated string.
+		  */
+		FbxString GetNameSpaceOnly();
+
+		/** Sets the namespace of the object.
+		  * \param pNameSpace The object's namespace as a \c NULL terminated string.
+		  */
+		void SetNameSpace(FbxString pNameSpace);
+
+		/** Returns an array of all the namespaces for this object
+		  * \param identifier The identifier of the namespaces.
+		  * \return The array of all namespaces.
+		  */
+		FbxArray<FbxString*> GetNameSpaceArray(char identifier);
+
+		/** Returns only the name (no namespace or prefix) of the object.
+		  * \return The name only as a \c NULL terminated string.
+		  */
+		FbxString GetNameOnly() const;
+
+		/** Returns the namespace qualifier.
+		  * \return The namespace qualifier.
+		  */
+		FbxString GetNameSpacePrefix() const;
+
+		/** Removes the prefix of pName
+		  * \param pName Whose prefix is removed.
+		  * \return A temporary string without prefix.
+		  */
+		static FbxString RemovePrefix(const char* pName);
+
+		/** Strips the prefix of pName
+		  * \param lName Whose prefix is stripped.
+		  * \return lName stripped of its prefix.
+		  */
+		static FbxString StripPrefix(FbxString& lName);
+
+		/** Strips the prefix of pName
+		  * \param pName Whose prefix is stripped.
+		  * \return A temporary string stripped of its prefix.
+		  */
+		static FbxString StripPrefix(const char* pName);
+
+		//!Returns the unique ID of this object.
+		const FbxUInt64& GetUniqueID() const;
+	//@}
+
+	/**
+	  * \name Selection management
+	  */
+	//@{
+		/** Returns if this object is currently in a selected state.
+		  * \return \c True if this object is selected, \c false otherwise.
+		  */
+		virtual bool GetSelected();
+
+		/** Sets whether this object is currently selected.
+		  * \param pSelected The selection flag.
+		  */
+		virtual void SetSelected(bool pSelected);
+	//@}
+
+	/**
+	  * \name User data
+	  */
+	//@{
+		/** Sets the data pointer for an user data record whose ID is pUserID.
+		  * \param pUserID The ID of the user data record. 
+		  * \param pUserData The data pointer of the user data record. 
+		  * \remarks An user data record is composed of an ID and a data pointer.
+		  * If the user data record identified by pUserID does not exist, a new user data record is created and its data pointer is set as pUserData. 
+		  */
+		void SetUserDataPtr(const FbxUInt64& pUserID, void* pUserData);
+
+		/** Returns the data pointer of an user data record whose ID is pUserID.
+		  * \param pUserID The ID of the user data record.
+		  * \return The data pointer of the user data record, \c NULL if the user data record is not found. 
+		  */
+		void* GetUserDataPtr(const FbxUInt64& pUserID) const;
+
+		/** Sets the data pointer for the user data record whose ID is the object ID.
+		  * \param pUserData The data pointer of the user data record. 
+		  * \remarks An user data record is composed of an ID and a data pointer.
+		  * If the user data record identified by pUserID does not exist, a new user data record is created and its data pointer is set as pUserData.
+		  */
+		inline void SetUserDataPtr(void* pUserData){ SetUserDataPtr(GetUniqueID(), pUserData); }
+
+		/** Returns the data pointer of the user data record whose ID is the object ID.
+		  * \return The data pointer of the user data record, \c NULL if the user data record is not found. 
+		  */
+		inline void* GetUserDataPtr() const { return GetUserDataPtr(GetUniqueID()); }
+	//@}
+
+	/**
+	  * \name General Object Connection and Relationship Management
+	  */
+	//@{
+		/** Connects this object to a source object.
+		  * \param pObject The source object to which this object connects.
+		  * \param pType The connection type between this object and the source object.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		inline bool ConnectSrcObject(FbxObject* pObject, FbxConnection::EType pType=FbxConnection::eNone) { return RootProperty.ConnectSrcObject(pObject,pType); }
+
+		/** Judges whether this object connects with the source object.
+		  * \param pObject The source object.
+		  * \return \c True if this object connects with the source object, \c false otherwise.
+		  */
+		inline bool IsConnectedSrcObject(const FbxObject* pObject) const { return RootProperty.IsConnectedSrcObject(pObject); }
+
+		/** Disconnects this object from a source object.
+		  * \param pObject The source object from which this object will be disconnected.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		inline bool DisconnectSrcObject(FbxObject* pObject){ return RootProperty.DisconnectSrcObject(pObject); }
+
+		/** Disconnects this object from all source objects.
+		  * \return \c True if it disconnects all source objects successfully, \c false otherwise.
+		  */
+		inline bool DisconnectAllSrcObject() { return RootProperty.DisconnectAllSrcObject(); }
+
+		/** Disconnects this object from all source objects that satisfy a given criteria. 
+		  * \param pCriteria The given criteria.
+		  * \return \c True if it disconnects all the source objects successfully, \c false otherwise.
+		  */
+		inline bool DisconnectAllSrcObject(const FbxCriteria& pCriteria) { return RootProperty.DisconnectAllSrcObject(pCriteria); }
+
+		/** Returns the number of source objects with which this object connects.
+		  * \return The number of source objects with which this object connects. 
+		  */
+		inline int GetSrcObjectCount() const { return RootProperty.GetSrcObjectCount(); }
+
+		/** Returns the number of source objects that satisfy the given criteria with which this object connects.
+		  * \param pCriteria The given criteria.
+		  * \return The number of source objects that satisfy the given criteria with which this object connects.
+		  */
+		inline int GetSrcObjectCount(const FbxCriteria& pCriteria) const { return RootProperty.GetSrcObjectCount(pCriteria); }
+
+		/** Returns the source object with which this object connects at the specified index.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The source object at the specified index, NULL if not found.
+		  */
+		inline FbxObject* GetSrcObject(int pIndex=0) const { return RootProperty.GetSrcObject(pIndex); }
+
+		/** Returns the source object that satisfies the criteria at the specified index with which this object connects.
+		  * \param pCriteria The given criteria.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The source object that satisfies the given criteria at the specified index, NULL if not found.
+		  */
+		inline FbxObject* GetSrcObject(const FbxCriteria& pCriteria, int pIndex=0) const { return RootProperty.GetSrcObject(pCriteria,pIndex); }
+
+		/** Searches the source object with the specified name, starting at the specified index.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The source object with the name, NULL if not found.
+		  */
+		inline FbxObject* FindSrcObject(const char* pName, int pStartIndex=0) const { return RootProperty.FindSrcObject(pName,pStartIndex); }
+
+		/** Searches the source object with the specified name which satisfies the given criteria, starting at the specified index.
+		  * \param pCriteria The given criteria.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The source object with the name, NULL if not found.
+		  */
+		inline FbxObject* FindSrcObject(const FbxCriteria& pCriteria, const char* pName, int pStartIndex=0) const { return RootProperty.FindSrcObject(pCriteria,pName,pStartIndex); }
+
+		/** Disconnects this object from all source objects of the specified class type.
+		* \return \c true if it disconnects all source objects successfully, \c false otherwise. */
+		template <class T> inline bool DisconnectAllSrcObject() { return RootProperty.DisconnectAllSrcObject(FbxCriteria::ObjectType(T::ClassId)); }
+
+		/** Disconnects this object from all source objects that are of the specified class type and that satisfy the given criteria.
+		* \param pCriteria The given criteria.
+		* \return \c true if it disconnects all source objects successfully, \c false otherwise. */
+		template <class T> inline bool DisconnectAllSrcObject(const FbxCriteria& pCriteria) { return RootProperty.DisconnectAllSrcObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria); }
+
+		/** Returns the number of source objects of a specific class type with which this object connects.
+		* \return The number of source objects of the specified class type with which this object connects. */
+		template <class T> inline int GetSrcObjectCount() const { return RootProperty.GetSrcObjectCount(FbxCriteria::ObjectType(T::ClassId)); }
+
+		/** Returns the number of source objects with which this object connects that are the specified class type and that satisfy the given criteria.
+		* \param pCriteria The given criteria.
+		* \return The number of source objects that are the specified class type and that satisfy the given criteria. */
+		template <class T> inline int GetSrcObjectCount(const FbxCriteria& pCriteria) const { return RootProperty.GetSrcObjectCount(FbxCriteria::ObjectType(T::ClassId) && pCriteria); }
+
+		/** Returns the source object of the specified class type at the specified index.
+		* \param pIndex The specified index whose default value is 0.
+		* \return The source object of a specified class type at the specified index, NULL if not found. */
+		template <class T> inline T* GetSrcObject(int pIndex=0) const { return (T*)RootProperty.GetSrcObject(FbxCriteria::ObjectType(T::ClassId), pIndex); }
+
+		/** Returns the source object that is the specified class type and that satisfies the given criteria at the specified index.
+		* \param pCriteria The given criteria.
+		* \param pIndex The specified index whose default value is 0.
+		* \return The source object that is of the specified class type and that satisfies the given criteria at the specified index, NULL if not found. */
+		template <class T> inline T* GetSrcObject(const FbxCriteria& pCriteria, int pIndex=0) const { return (T*)RootProperty.GetSrcObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria, pIndex); }
+
+		/** Searches the source object with the specified name that is the specified class type, starting at the specified index.
+		* \param pName The object name.
+		* \param pStartIndex The start index.
+		* \return The source object with the name, NULL if not found. */
+		template <class T> inline T* FindSrcObject(const char* pName, int pStartIndex=0) const { return (T*)RootProperty.FindSrcObject(FbxCriteria::ObjectType(T::ClassId), pName, pStartIndex); }
+
+		/** Searches the source object with the specified name that is the specified class type and that satisfies the given criteria, starting at the specified index.
+		* \param pCriteria The given criteria.
+		* \param pName The object name.
+		* \param pStartIndex The start index.
+		* \return The source object with the name, NULL if not found. */
+		template <class T> inline T* FindSrcObject(const FbxCriteria& pCriteria, const char* pName, int pStartIndex=0) const { return (T*)RootProperty.FindSrcObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria, pName, pStartIndex); }
+
+		/** Connects this object to one destination object.
+		  * \param pObject The destination object with which this object connects.
+		  * \param pType The connection type between this object and the destination object.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		inline bool ConnectDstObject(FbxObject* pObject, FbxConnection::EType pType=FbxConnection::eNone) { return RootProperty.ConnectDstObject(pObject,pType); }
+
+		/** Judges whether this object connects with the destination object.
+		  * \param pObject The destination object.
+		  * \return \c True if this object connects with the destination object, \c false otherwise.
+		  */
+		inline bool IsConnectedDstObject(const FbxObject* pObject) const { return RootProperty.IsConnectedDstObject(pObject); }
+
+		/** Disconnects this object from the destination object.
+		  * \param pObject The destination object from which this object disconnects.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		inline bool DisconnectDstObject(FbxObject* pObject) { return RootProperty.DisconnectDstObject(pObject); }
+
+		/** Disconnects this object from all destination objects.
+		  * \return \c True if it disconnects all destination objects successfully, \c false otherwise.
+		  */
+		inline bool DisconnectAllDstObject() { return RootProperty.DisconnectAllDstObject(); }
+
+		/** Disconnects this object from all destination objects that satisfy given criteria.
+		  * \param pCriteria The given criteria.
+		  * \return \c True if it disconnects all destination objects successfully, \c false otherwise.
+		  */
+		inline bool DisconnectAllDstObject(const FbxCriteria& pCriteria) { return RootProperty.DisconnectAllDstObject(pCriteria); }
+
+		/** Returns the number of destination objects with which this object connects. 
+		  * \return The number of destination objects with which this object connects. 
+		  */
+		inline int GetDstObjectCount() const { return RootProperty.GetDstObjectCount(); }
+
+		/** Returns the number of destination objects with which this object connects that satisfy the given criteria. 
+		  * \param pCriteria The given criteria.
+		  * \return The number of destination objects with which this object connects that satisfy the given criteria.
+		  */
+		inline int GetDstObjectCount(const FbxCriteria& pCriteria) const { return RootProperty.GetDstObjectCount(pCriteria); }
+
+		/** Returns the destination object at the specified index with which this object connects.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The destination object at the specified index, NULL if not found.
+		  */
+		inline FbxObject* GetDstObject(int pIndex=0) const { return RootProperty.GetDstObject(pIndex); }
+
+		/** Returns the destination object with which this object connects that satisfies the given criteria at the specified index.
+		  * \param pCriteria The given criteria.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The destination object that satisfies the given criteria at the specified index, NULL if not found.
+		  */
+		inline FbxObject* GetDstObject(const FbxCriteria& pCriteria, int pIndex=0) const { return RootProperty.GetDstObject(pCriteria,pIndex); }
+
+		/** Searches the destination object with the specified name, starting at the specified index.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The destination object with the name, NULL if not found.
+		  */
+		inline FbxObject* FindDstObject(const char* pName, int pStartIndex=0) const { return RootProperty.FindDstObject(pName,pStartIndex); }
+
+		/** Searches the destination object with the specified name which satisfies the given criteria, starting at the specified index.
+		  * \param pCriteria The given criteria.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The destination object with the name, NULL if not found.
+		  */
+		inline FbxObject* FindDstObject(const FbxCriteria& pCriteria, const char* pName, int pStartIndex=0) const { return RootProperty.FindDstObject(pCriteria,pName,pStartIndex); }
+
+		/** Disconnects this object from all destination objects of the specified class type.
+		* \return \c true if it disconnects all destination objects of the specified class type successfully, \c false otherwise. */
+		template <class T> inline bool DisconnectAllDstObject() { return RootProperty.DisconnectAllDstObject(FbxCriteria::ObjectType(T::ClassId)); }
+
+		/** Disconnects this object from all destination objects that are the specified class type and that satisfy the given criteria.
+		* \param pCriteria The given criteria.
+		* \return \c true if it disconnects all destination objects successfully, \c false otherwise. */
+		template <class T> inline bool DisconnectAllDstObject(const FbxCriteria& pCriteria) { return RootProperty.DisconnectAllDstObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria); }
+
+		/** Returns the number of destination objects of the specified class type with which this object connects.
+		* \return The number of destination objects of the specified class type with which this object connects. */
+		template <class T> inline int GetDstObjectCount() const { return RootProperty.GetDstObjectCount(FbxCriteria::ObjectType(T::ClassId)); }
+
+		/** Returns the number of destination objects with which this object connects that are the specified class type and that satisfy the given criteria.
+		* \param pCriteria The given criteria.
+		* \return The number of destination objects that are the specified class type and that satisfy the given criteria. */
+		template <class T> inline int GetDstObjectCount(const FbxCriteria& pCriteria) const { return RootProperty.GetDstObjectCount(FbxCriteria::ObjectType(T::ClassId) && pCriteria); }
+
+		/** Returns the destination object with which this object connects that is the specified class type at the specified index.
+		* \param pIndex The specified index whose default value is 0.
+		* \return The destination object of the specified class type at the specified index, NULL if not found. */
+		template <class T> inline T* GetDstObject(int pIndex=0) const { return (T*)RootProperty.GetDstObject(FbxCriteria::ObjectType(T::ClassId), pIndex); }
+
+		/** Returns the destination object with which this object connects that is the specified class type and that satisfies the given criteria at the specified index.
+		* \param pCriteria The given criteria.
+		* \param pIndex The specified index whose default value is 0.
+		* \return The destination object that is the specified class type and that satisfies the given criteria at the specified index, NULL if not found. */
+		template <class T> inline T* GetDstObject(const FbxCriteria& pCriteria, int pIndex=0) const { return (T*)RootProperty.GetDstObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria, pIndex); }
+
+		/** Searches the destination object with the specified name which is of the specified class type, starting at the specified index.
+		* \param pName The object name.
+		* \param pStartIndex The start index.
+		* \return The source object with the name, NULL if not found. */
+		template <class T> inline T* FindDstObject(const char* pName, int pStartIndex=0) const { return (T*)RootProperty.FindDstObject(FbxCriteria::ObjectType(T::ClassId), pName, pStartIndex); }
+
+		/** Searches the destination object with the specified name that is the specified class type and that satisfies the given criteria, starting at the specified index.
+		* \param pCriteria The given criteria.
+		* \param pName The object name.
+		* \param pStartIndex The start index.
+		* \return The source object with the name, NULL if not found. */
+		template <class T> inline T* FindDstObject(const FbxCriteria& pCriteria, const char* pName, int pStartIndex=0) const { return (T*)RootProperty.FindDstObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria, pName, pStartIndex); }
+	//@}
+
+	/**
+	  * \name Property Management
+	  */
+	//@{
+		/** Returns the first property of this object.
+		  * \return The first property of this object.
+		  */
+		inline FbxProperty GetFirstProperty() const
+		{
+			return RootProperty.GetFirstDescendent();
+		}
+
+		/** Returns the next property of this object that follows the specified property.
+		  * \param pProperty The specified property.
+		  * \return The next property of this object that follows pProperty.
+		  */
+		inline FbxProperty GetNextProperty(const FbxProperty& pProperty) const
+		{
+			return RootProperty.GetNextDescendent(pProperty);
+		}
+
+		/** Searches a property by name.
+		  * \param pName The property name.
+		  * \param pCaseSensitive Whether the name is case-sensitive.
+		  * \return A valid FbxProperty if found, else an invalid FbxProperty. See FbxProperty::IsValid()
+		  */
+		inline FbxProperty FindProperty(const char* pName, bool pCaseSensitive = true) const
+		{
+			return RootProperty.Find(pName, pCaseSensitive );
+		}
+
+		/** Searches a property by name and data type.
+		  * \param pName The property name.
+		  * \param pDataType The data type of the property.
+		  * \param pCaseSensitive Whether the name is case-sensitive.
+		  * \return A valid FbxProperty if the property is found, else an invalid FbxProperty. See FbxProperty::IsValid()
+		  */
+		inline FbxProperty FindProperty(const char* pName, const FbxDataType& pDataType, bool pCaseSensitive = true) const
+		{
+			return RootProperty.Find(pName, pDataType, pCaseSensitive );
+		}
+
+		/** Searches a property by full name.
+		  * \param pName The full name of the property as a \c NULL terminated string.
+		  * \param pCaseSensitive whether or not the name is case-sensitive.
+		  * \return A valid FbxProperty if the property is found, else
+		  *         an invalid FbxProperty. See FbxProperty::IsValid()
+		  */
+		inline FbxProperty FindPropertyHierarchical(const char* pName, bool pCaseSensitive = true) const
+		{
+			return RootProperty.FindHierarchical(pName, pCaseSensitive );
+		}
+
+		/** Searches a property by full name and data type.
+		  * \param pName The full name of the property as a \c NULL terminated string.
+		  * \param pDataType The data type of the property.
+		  * \param pCaseSensitive whether or not the name is case-sensitive.
+		  * \return A valid FbxProperty if the property is found, else
+		  *         an invalid FbxProperty. See FbxProperty::IsValid()
+		  */
+		inline FbxProperty FindPropertyHierarchical(const char* pName, const FbxDataType& pDataType, bool pCaseSensitive = true) const
+		{
+			return RootProperty.FindHierarchical(pName, pDataType, pCaseSensitive );
+		}
+
+		/** Returns the class root property.
+		  * \return The class root property if it exists, else an invalid FbxProperty. See FbxProperty::IsValid().
+		  * \remarks Class FbxObject and its sub-classes all have a class root property. This class root property contains basic information about the class type, such as the class name.  
+		  */
+		FbxProperty GetClassRootProperty();
+
+		/** Connects this object to a source property.
+		  * \param pProperty The source property with which this object connects.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		inline bool ConnectSrcProperty(const FbxProperty& pProperty) { return RootProperty.ConnectSrcProperty(pProperty); }
+
+		/** Determines whether this object connects with the specified source property.
+		  * \param pProperty The specified source property.
+		  * \return \c True if this object connects with the specified source property, \c false otherwise.
+		  */
+		inline bool IsConnectedSrcProperty(const FbxProperty& pProperty) { return RootProperty.IsConnectedSrcProperty(pProperty); }
+
+		/** Disconnects this object from the specified source property.
+		  * \param pProperty The specified source property.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		inline bool DisconnectSrcProperty(const FbxProperty& pProperty) { return RootProperty.DisconnectSrcProperty(pProperty); }
+
+		/** Returns the number of source properties with which this object connects. 
+		  * \return The number of source properties with which this object connects. 
+		  */
+		inline int GetSrcPropertyCount() const { return RootProperty.GetSrcPropertyCount(); }
+
+		/** Returns the source property at the specified index with which this object connects. 
+		  * \param pIndex The specified index.
+		  * \return The source property at the specified index. 
+		  */
+		inline FbxProperty GetSrcProperty(int pIndex=0) const { return RootProperty.GetSrcProperty(pIndex); }
+
+		/** Searches a source property with which this object connects that has a specific name, starting at the specified index. 
+		  * \param pName The specified property name.
+		  * \param pStartIndex The start index.
+		  * \return The source property with the specified name. 
+		  */
+		inline FbxProperty FindSrcProperty(const char* pName,int pStartIndex=0) const { return RootProperty.FindSrcProperty(pName,pStartIndex); }
+
+		/** Connects this object to a destination property.
+		  * \param pProperty The destination property with which this object connects.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		inline bool ConnectDstProperty(const FbxProperty& pProperty) { return RootProperty.ConnectDstProperty(pProperty); }
+
+		/** Determines if this object connects with the specified destination property.
+		  * \param pProperty The specified destination property.
+		  * \return \c True if this object connects with the specified destination property, \c false otherwise.
+		  */
+		inline bool IsConnectedDstProperty(const FbxProperty& pProperty) { return RootProperty.IsConnectedDstProperty(pProperty); }
+
+		/** Disconnects this object from the specified destination property.
+		  * \param pProperty The specified destination property.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		inline bool DisconnectDstProperty(const FbxProperty& pProperty) { return RootProperty.DisconnectDstProperty(pProperty); }
+
+		/** Returns the number of destination properties with which this object connects. 
+		  * \return The number of destination properties with which this object connects. 
+		  */
+		inline int GetDstPropertyCount() const { return RootProperty.GetDstPropertyCount(); }
+
+		/** Returns the destination property at the specified index with which this object connects. 
+		  * \param pIndex The specified index.
+		  * \return The destination property at the specified index. 
+		  */
+		inline FbxProperty GetDstProperty(int pIndex=0) const { return RootProperty.GetDstProperty(pIndex); }
+
+		/** Searches a destination property with which this object connects that has a specific name, starting at the specified index. 
+		  * \param pName The specified property name.
+		  * \param pStartIndex The start index.
+		  * \return The destination property with the specified name. 
+		  */
+		inline FbxProperty FindDstProperty(const char* pName, int pStartIndex=0) const { return RootProperty.FindDstProperty(pName,pStartIndex); }
+	//@}
+
+	/**
+	  * \name Off-Loading Management
+	  * \remarks You can modify the unloaded state flag using the SetObjectFlags()
+	  *         method. The ContentIsUnloaded() method below (implemented in this class)
+	  *         is simply a synonym of GetObjectFlags(eCONTENT_UNLOADED_FLAG)
+	  */
+	//@{
+		/** Unloads this object's content using the offload peripheral that is currently set in the document
+		  * then flushes it from memory.
+		  * \return 2 if the object's content is already unloaded or 1 if
+		  *         this object's content has been successfully unloaded to the current
+		  *         peripheral.
+		  *
+		  * \remarks If the content is locked more than once, or the peripheral cannot handle
+		  *         this object's unloading, or if an error occurs, this method returns 0 and does not flush the content.         
+		  */
+		int ContentUnload();
+
+		/** Loads this object's content using the offload peripheral that is currently set in the document.
+		  * \return 1 if this object's content has been successfully loaded from the current
+		  *         peripheral, 2 if the content is already loaded, and 0 if an error occurs or
+		  *         the object's content is locked.
+		  * \remarks On a successful Load attempt, the object content is locked.
+		  */
+		int ContentLoad();
+
+		/** Judges if this object's content is loaded.
+		  * \return \c True if this object's content is loaded, \c false otherwise.
+		  * \remarks An object that has not been filled yet must be considered
+		  * unloaded.
+		  */
+		bool ContentIsLoaded() const;
+
+		/** Decreases the content lock count of an object. If the content lock count of an object
+		  * is greater than 0, the content of the object is considered locked.
+		  */
+		void ContentDecrementLockCount();
+
+		/** Increases the content lock count of an object. If the content lock count of an object
+		  * is greater than 0, the content of the object is considered locked.
+		  */
+		void ContentIncrementLockCount();
+
+		/** Judges if this object's content is locked. The content is considered locked if the content lock count
+		  * is greater than 0
+		  * \return \c True if this object's content is locked, \c false otherwise.
+		  * \remarks A locked state prevents the object content from being unloaded from memory but
+		  * does not block the loading.
+		  */
+		bool ContentIsLocked() const;
+
+		/** Writes the content of the object to the given stream.
+		  * \param pStream The destination stream.
+		  * \return \c True if the content is successfully processed
+		  * by the receiving stream, \c false otherwise.
+		  */
+		virtual bool ContentWriteTo(FbxStream& pStream) const;
+
+		/** Reads the content of the object from the given stream.
+		  * \param pStream The source stream.
+		  * \return \c True if the object fills itself with the received data
+		  * from the stream successfully, \c false otherwise.
+		  */
+		virtual bool ContentReadFrom(const FbxStream& pStream);
+	//@}
+
+	/**
+	  * \name Logging.
+	  */
+	//@{
+		/** Emits a message in all available message emitters in the document or SDK manager.
+		  * \param pMessage The message to emit. 
+		  * \remarks The ownership of the message is transferred, don't delete it.
+		  */
+		void EmitMessage(FbxMessage* pMessage) const;
+	//@}
+
+	/**
+	  * \name Localization helper.
+	  */
+	//@{
+		/** Localization helper function, it calls the implementation of FBX SDK manager.
+		  * Sub-classes that manage their own localization could over-ride this function.
+		  * \param pID The identifier of the text to be localized.
+		  * \param pDefault The default text. Uses pID as the default text if pDefault is NULL.
+		  * \return The localized text or the default text if the text can't be localized, .
+		  */
+		virtual const char* Localize(const char* pID, const char* pDefault=NULL) const;
+	//@}
+
+	/**
+	  * \name Application Implementation Management
+	  */
+	//@{
+		/** Returns a handle on the parent library of this object.
+		  * \return The parent library of this object, or \c NULL if the parent library doesn't exist.
+		  */
+		FbxLibrary* GetParentLibrary() const;
+
+		/** Adds an implementation.
+		  * \param pImplementation The implementation to be added.
+		  * \return \c True on success, \c false otherwise.
+		  * \remarks To succeed this function must be called with an implementation that has not already been added to this node.
+		  */
+		bool AddImplementation(FbxImplementation* pImplementation);
+
+		/** Removes an implementation.
+		  * \param pImplementation The implementation to be removed.
+		  * \return \c True on success, \c false otherwise.
+		  * \remarks To succeed this function must be called with an implementation that has already been added to this node.
+		  */
+		bool RemoveImplementation(FbxImplementation* pImplementation);
+
+		/** Determines if this shading node has a default implementation.
+		  * \return \c True if this shading node has a default implementation, \c false otherwise.
+		  */
+		bool HasDefaultImplementation(void) const;
+
+		/** Returns the default implementation of this shading node.
+		  * \return The default implementation of this shading node.
+		  */
+		FbxImplementation* GetDefaultImplementation(void) const;
+
+		/** Sets the default implementation of this shading node.
+		  * \param pImplementation The implementation to be set.
+		  * \return \c True on success, \c false otherwise.
+		  * \remarks To succeed this function must be called with an implementation that has already been added to this node.
+		  *	Only the implementation which has already been added can be set as the default implementation.
+		  */
+		bool SetDefaultImplementation(FbxImplementation* pImplementation);
+
+		/** Returns the number of implementations that satisfy a given criteria.
+		  * \param pCriteria The given criteria.
+		  * \returns The number of implementations.
+		  */
+		int GetImplementationCount(const FbxImplementationFilter* pCriteria=NULL) const;
+
+		/** Returns the implementation at the specified index that satisfies the given criteria.
+		  * \param pIndex The specified index.
+		  * \param pCriteria The given criteria.
+		  * \return The implementation at the specified index, NULL if not found.
+		  */
+		FbxImplementation* GetImplementation(int pIndex, const FbxImplementationFilter* pCriteria=NULL) const;
+	//@}
+
+	/**
+	  * \name Object Storage && Retrieval
+	  */
+	//@{
+		/** Returns the URL of this object.
+		  * \return The URL of this object.
+		  * \remarks The URL indicates where the object is stored.
+		  */
+		virtual FbxString GetUrl() const;
+
+		/** Sets the URL of this object.
+		  * \param pUrl The URL to be set.
+		  * \return \c True on success, \c false otherwise.
+		  * \remarks The URL indicates where the object is stored.
+		  */
+		virtual bool SetUrl(const char* pUrl);
+	//@}
+
+	/** \name Run-time ClassId Management */
+	//@{
+		/** Set the run-time ClassId for this class. In most contexts, users do not have to change the run-time ClassId, they are automatically generated when registered a new class during run-time.
+		* \param pClassId	The ClassId to set as the run-time ClassId for this object. */
+		void SetRuntimeClassId(const FbxClassId& pClassId);
+
+		/** Retrieve the run-time ClassId for this object.
+		* \return The run-time ClassId for this object. */
+		FbxClassId GetRuntimeClassId() const;
+
+		/** Test if this class is a hierarchical children of the specified class type. This test will be performed on the run-time class registered with the FBX SDK Manager rather than the static ClassId generated at compile time.
+		* \param pClassId	The class type to test against self.
+		* \return			True if the object is a hierarchical children of the type specified.
+		* \remarks			This function will perform a complete search until it reaches the top level class, but it will stop as soon as one ClassId matches the test. */
+		bool IsRuntime(const FbxClassId& pClassId) const;
+
+		/** Find out if the ClassId was registered during run-time rather than at compile time.
+		* \return True if the run-time ClassId is inequal to the ClassId. */
+		bool IsRuntimePlug() const;
+	//@}
+
+	/** Compact the memory used by this object.
+	* \remark Note that this function might not result in saved memory because it depends if the sub-class implements it, or if any memory can actually be saved. */
+	virtual void Compact();
+
+	//! The root property that holds all children property for this object
+	FbxProperty RootProperty;
+
+protected:
+	/** Optional constructor override, automatically called by default constructor.
+	* \param pFrom	If not null, the function must take it into account like a copy constructor.
+	* \remark		In case it is decided to override this function, do not forget to call ParentClass::Construct(pFrom) at the beginning. */
+	virtual void Construct(const FbxObject* pFrom);
+
+	/** Optional property constructor override, automatically called by default constructor.
+	* \param pForceSet	If the property value must be set regardless of default value.
+	* \remark			If your object have properties, they must be initialized in this function. */
+    virtual void ConstructProperties(bool pForceSet);
+
+	/** Optional destructor override, automatically called by default destructor.
+	* \param pRecursive	If true, children objects should be destroyed as well.
+	* \remark			In case it is decided to override this function, do not forget to call ParentClass::Destruct(pResursive) at the end. */
+	virtual void Destruct(bool pRecursive);
+
+	/** Clears this object's content from memory. This method must be overridden in the derived classes.
+	* \remark This method is called by ContentUnload() if the object content's unloading is successful. */
+	virtual void ContentClear();
+
+	/** Retrieves the peripheral of that object.
+	* \return	The current peripheral for that object
+	* \remark	A peripheral manipulates the content of an object. For instance, a peripheral can load the connections of an object on demand. */
+	virtual FbxPeripheral* GetPeripheral();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+public:
+    virtual bool Compare(FbxObject* pOtherObject);
+
+	//Basic comparison operator implementation. It simply compare property values between source and target.
+	//NOTE: If a property cannot be found on one of the object, the comparison fails (return false).
+	//Different classid will fail comparison as well as different property count. Reference properties are not compared.
+	bool operator==(const FbxObject& pObject);
+	bool operator!=(const FbxObject& pObject);
+
+    virtual void				SetDocument(FbxDocument* pDocument);
+
+	inline FbxPropertyHandle&	GetPropertyHandle() { return RootProperty.mPropertyHandle; }
+
+	//Important note: If this function is not implemented, the pFileSubTypeName string used when registering your
+	//class via FbxManager::RegisterFbxClass will be used instead. This makes it useless to re-implement this
+	//function if you do not intend to return a different string for the same class.
+    virtual const char*			GetTypeName() const;
+    virtual FbxStringList		GetTypeFlags() const;
+
+	// This function will go as deep as possible to clear the Connection list without sending 
+	// notifications to the connections to give them the chance to Disconnect themselves. 
+	// This is a bypass of the intended workflow and should be used with care.
+	void WipeAllConnections();
+
+    //Used as global flag to modify the behavior of FbxObject::Destruct() during a ForceKill() on the scene. This is for internal use.
+	static void SetWipeMode(bool pState);
+	static bool GetWipeMode();
+
+protected:
+	FbxObject(FbxManager& pManager, const char* pName);
+
+	enum EPropertyNotifyType
+	{
+		ePropertySetRequest,
+		ePropertySet,
+		ePropertyGet
+	};
+
+	virtual bool		ConnectNotify(const FbxConnectEvent& pEvent);
+	virtual bool		PropertyNotify(EPropertyNotifyType pType, FbxProperty& pProperty);
+	bool				Copyable(const FbxObject& pObject);
+
+private:
+    void				CopyPropertiesFrom(const FbxObject& pFrom);
+	void				SetClassRootProperty(FbxProperty& lProperty);
+	int					GetFlatPropertyCount() const;
+
+    FbxNameHandler		mName;
+    FbxClassId			mRuntimeClassId;
+    FbxUserDataRecord*	mUserData;
+    FbxManager*			mManager;
+    FbxImplementation*	mDefaultImplementation;
+    FbxUInt64			mUniqueID;
+    FbxInt32			mObjectFlags;
+    FbxInt32			mContentLockCount;
+    FbxInt32			mUserDataCount;
+	static bool			mWipeMode;
+
+	friend class FbxProperty;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/** A utility class for iterating over the properties (FbxProperty) of any FbxObject.
+* \nosubgrouping
+*/
+template<typename FbxProperty> class FbxIterator
+{
+public:
+	/** Constructor.
+	*\param pObject  The object whose properties are going to be iterated.
+	*/
+	FbxIterator(const FbxObject* pObject) : mObject(pObject) {}
+
+	/**  Get the first property of the object. 
+	*    \return The first property of the object.
+	*/
+	inline const FbxProperty& GetFirst() { mProperty = mObject->GetFirstProperty(); return mProperty; }
+
+	/**  Get next property of the object. 
+	*    \return The next property of the object.
+	*/
+	inline const FbxProperty& GetNext() { mProperty = mObject->GetNextProperty(mProperty); return mProperty; }
+
+private:
+	FbxProperty        mProperty;
+	const FbxObject*   mObject;
+};
+
+/** A utility class for iterating over source objects that connect to property (FbxProperty) or object (FbxObject).
+* \nosubgrouping
+*/
+class FbxIteratorSrcBase
+{
+public:
+	/**
+	 * Constructor.
+	 * \param pProperty Property object. The iterator will iterate source objects that connect to it.
+	 * \param pClassId	The class ID specifies the type of the source objects.
+	 */
+	inline FbxIteratorSrcBase(FbxProperty& pProperty,FbxClassId pClassId) :
+		mProperty(pProperty),
+		mClassId(pClassId),
+		mSize(0),
+		mIndex(-1)
+	{
+		ResetToBegin();
+	}
+
+	/**
+	 * Constructor.
+	 * \param pObject	FBX object. The iterator will iterate source objects that connect to it. 	
+	 * \param pClassId	The class ID specifies the type of the source objects.
+	 */
+	inline FbxIteratorSrcBase(FbxObject* pObject,FbxClassId pClassId) :
+		mProperty(pObject->RootProperty),
+		mClassId(pClassId),
+		mSize(0),
+		mIndex(-1)
+	{
+		ResetToBegin();
+	}
+
+	/**
+	 * Get the first source object that connects to the property or object.
+	 * \return The first source object.
+	 */
+	inline FbxObject* GetFirst()
+	{
+		ResetToBegin();
+		return GetNext();
+	}
+
+	/**
+	 * Get next source object that connects to the property or object.
+	 * \return The next source object. If there are no more objects, return NULL.
+	 */
+	inline FbxObject* GetNext()
+	{
+		mIndex++;
+		return ((mIndex>=0) && (mIndex<mSize)) ? mProperty.GetSrcObject(FbxCriteria::ObjectType(mClassId), mIndex) : NULL;
+	}
+
+	/**
+	 * Get next source object that connects to the property or object.
+	 * \return The next source object. If there are no more objects, return NULL.
+	 * \remark This method makes sure the iterate index is not out of bounds.
+	 */
+	inline FbxObject* GetSafeNext()
+	{
+		mSize = mProperty.GetSrcObjectCount(FbxCriteria::ObjectType(mClassId));
+		return GetNext();
+	}
+
+	/**
+	 * Get the last source object that connects to the property or object.
+	 * \return The last source object.
+	 */
+	inline FbxObject* GetLast()
+	{
+		ResetToEnd();
+		return GetPrevious();
+	}
+
+	/**
+	 * Get previous source object that connects to the property or object.
+	 * \return The previous source object. If there are no more objects, return NULL.
+	 */
+	inline FbxObject* GetPrevious()
+	{
+		mIndex--;
+		return ((mIndex>=0) && (mIndex<mSize)) ? mProperty.GetSrcObject(FbxCriteria::ObjectType(mClassId), mIndex) : NULL;
+	}
+
+	/**
+	 * Get previous source object that connects to the property or object.
+	 * \return The previous source object. If there are no more objects, return NULL.
+	 * \remark This method makes sure the iterate index is not out of bounds.
+	 *		   If the iterate index is out of bounds, the last source object is returned.
+	 */
+	inline FbxObject* GetSafePrevious()
+	{
+		mSize = mProperty.GetSrcObjectCount(FbxCriteria::ObjectType(mClassId));
+		while (mIndex>mSize) mIndex--;
+		return GetPrevious();
+	}
+
+protected:
+	/**
+	 * Reset the iterate index to the beginning.
+	 */
+	inline void ResetToBegin()
+	{
+		mSize = mProperty.GetSrcObjectCount(FbxCriteria::ObjectType(mClassId));
+		mIndex = -1;
+	}
+
+	/**
+	 * Reset the iterate index to the end.
+	 */
+	inline void ResetToEnd()
+	{
+		mSize = mProperty.GetSrcObjectCount(FbxCriteria::ObjectType(mClassId));
+		mIndex = mSize;
+	}
+
+	FbxProperty	mProperty;	//! The property to iterate. If iterate an object, this is the root property of the object.
+	FbxClassId	mClassId;	//! The class ID specifies the type of the source objects to be retrieved.
+	int			mSize;		//! The number of source objects whose type is specified by mClassId.
+	int			mIndex;		//! Iterate index.
+};
+
+/**
+ * A utility class for iterating over source objects that connect to property (FbxProperty) or object (FbxObject).
+ * The class is a wrapper of FbxIteratorSrcBase with template.
+ * \nosubgrouping
+ */
+template<class Type> class FbxIteratorSrc : protected FbxIteratorSrcBase
+{
+public:
+	/**
+	 * Constructor.
+	 * \param pObject	FBX object. The iterator will iterate source objects that connect to it.
+	 */
+    inline FbxIteratorSrc(FbxObject* pObject) : FbxIteratorSrcBase(pObject,Type::ClassId) {}
+    
+	/**
+	 * Constructor.
+	 * \param pProperty Property object. The iterator will iterate source objects that connect to it.
+	 */
+	inline FbxIteratorSrc(FbxProperty& pProperty) : FbxIteratorSrcBase(pProperty,Type::ClassId) {}
+
+	/**
+	 * Get the first source object that connects to the property or object.
+	 * \return The first source object.
+	 */
+    inline Type* GetFirst()         { return (Type*)FbxIteratorSrcBase::GetFirst(); }
+    
+	/**
+	 * Get next source object that connects to the property or object.
+	 * \return The next source object. If there are no more objects, return NULL.
+	 */
+	inline Type* GetNext()          { return (Type*)FbxIteratorSrcBase::GetNext(); }
+    
+	/**
+	 * Get next source object that connects to the property or object.
+	 * \return The next source object. If there are no more objects, return NULL.
+	 * \remark This method makes sure the iterate index is not out of bounds.
+	 */
+	inline Type* GetSafeNext()      { return (Type*)FbxIteratorSrcBase::GetSafeNext(); }
+    
+	/**
+	 * Get the last source object that connects to the property or object.
+	 * \return The last source object.
+	 */
+	inline Type* GetLast()          { return (Type*)FbxIteratorSrcBase::GetLast(); }
+    
+	
+	/**
+	 * Get previous source object that connects to the property or object.
+	 * \return The previous source object. If there are no more objects, return NULL.
+	 */
+	inline Type* GetPrevious()      { return (Type*)FbxIteratorSrcBase::GetPrevious(); }
+    
+	/**
+	 * Get previous source object that connects to the property or object.
+	 * \return The previous source object. If there are no more objects, return NULL.
+	 * \remark This method makes sure the iterate index is not out of bounds.
+	 *		   If the iterate index is out of bounds, the last source object is returned.
+	 */
+	inline Type* GetSafePrevious()  { return (Type*)FbxIteratorSrcBase::GetSafePrevious(); }
+};
+
+/** A utility class for iterating over destination objects that connect to property (FbxProperty) or object (FbxObject).
+* \nosubgrouping
+*/
+class FbxIteratorDstBase
+{
+protected:
+	/** The property to iterate. If iterate an object, this is the root property of the object. */
+	FbxProperty    mProperty;
+	/** The class ID specifies the type of the destination objects to be retrieved. */
+	FbxClassId     mClassId;
+	/** The number of destination objects whose type is specified by mClassId. */
+	int             mSize;
+	/** Iterate index. */
+	int             mIndex;
+
+public:
+	/**
+	 * Constructor.
+	 * \param pProperty Property object. The iterator will iterate destination objects that connect to it.
+	 * \param pClassId	The class ID specifies the type of the destination objects.
+	 */
+    inline FbxIteratorDstBase(FbxProperty& pProperty,FbxClassId pClassId) :
+        mProperty(pProperty),
+        mClassId(pClassId),
+        mSize(0),
+        mIndex(-1)
+    {
+        ResetToBegin();
+    }
+    
+	/**
+	 * Constructor.
+	 * \param pObject	FBX object. The iterator will iterate source objects that connect to it. 	
+	 * \param pClassId	The class ID specifies the type of the source objects.
+	 */	
+	inline FbxIteratorDstBase(FbxObject* pObject,FbxClassId pClassId) :
+        mProperty(pObject->RootProperty),
+        mClassId(pClassId),
+        mSize(0),
+        mIndex(-1)
+    {
+        ResetToBegin();
+    }
+
+	/**
+	 * Get the first destination object that connects to the property or object.
+	 * \return The first destination object.
+	 */
+    inline FbxObject* GetFirst()
+    {
+        ResetToBegin();
+        return GetNext();
+    }
+
+	/**
+	 * Get next destination object that connects to the property or object.
+	 * \return The next destination object. If there are no more objects, return NULL.
+	 */
+    inline FbxObject* GetNext()
+    {
+        mIndex++;
+        return ((mIndex>=0) && (mIndex<mSize)) ? mProperty.GetDstObject(FbxCriteria::ObjectType(mClassId), mIndex) : NULL;
+    }
+    
+	/**
+	 * Get next destination object that connects to the property or object.
+	 * \return The next destination object. If there are no more objects, return NULL.
+	 * \remark This method makes sure the iterate index is not out of bounds.
+	 */
+	inline FbxObject* GetSafeNext()
+    {
+        mSize = mProperty.GetDstObjectCount(FbxCriteria::ObjectType(mClassId));
+        return GetNext();
+    }
+    
+	/**
+	 * Get the last destination object that connects to the property or object.
+	 * \return The last destination object.
+	 */
+	inline FbxObject* GetLast()
+    {
+        ResetToEnd();
+        return GetPrevious();
+    }
+    
+	/**
+	 * Get previous destination object that connects to the property or object.
+	 * \return The previous destination object. If there are no more objects, return NULL.
+	 */
+	inline FbxObject* GetPrevious()
+    {
+        mIndex--;
+        return ((mIndex>=0) && (mIndex<mSize)) ? mProperty.GetDstObject(FbxCriteria::ObjectType(mClassId), mIndex) : NULL;
+    }
+    
+	/**
+	 * Get previous destination object that connects to the property or object.
+	 * \return The previous destination object. If there are no more objects, return NULL.
+	 * \remark This method makes sure the iterate index is not out of bounds.
+	 *		   If the iterate index is out of bounds, the last destination object is returned.
+	 */
+	inline FbxObject* GetSafePrevious()
+    {
+        mSize = mProperty.GetDstObjectCount(FbxCriteria::ObjectType(mClassId));
+        while (mIndex>mSize) mIndex--;
+        return GetPrevious();
+    }
+
+protected:
+    /**
+	 * Reset the iterate index to the beginning.
+	 */
+	inline void ResetToBegin()
+    {
+        mSize = mProperty.GetDstObjectCount(FbxCriteria::ObjectType(mClassId));
+        mIndex = -1;
+    }
+    
+	/**
+	 * Reset the iterate index to the end.
+	 */
+	inline void ResetToEnd()
+    {
+        mSize = mProperty.GetDstObjectCount(FbxCriteria::ObjectType(mClassId));
+        mIndex = mSize;
+    }
+};
+
+/**
+ * A utility class for iterating over destination objects that connect to property (FbxProperty) or object (FbxObject).
+ * The class is a wrapper of FbxIteratorDstBase with template.
+ * \nosubgrouping
+ */
+template<class Type> class FbxIteratorDst : protected FbxIteratorDstBase
+{
+public:
+	/**
+	 * Constructor.
+	 * \param pObject	FBX object. The iterator will iterate destination objects that connect to it.
+	 */
+    inline FbxIteratorDst(FbxObject* pObject) : FbxIteratorDstBase(pObject,Type::ClassId) {}
+    
+	/**
+	 * Constructor.
+	 * \param pProperty Property object. The iterator will iterate destination objects that connect to it.
+	 */
+	inline FbxIteratorDst(FbxProperty& pProperty) : FbxIteratorDstBase(pProperty,Type::ClassId) {}
+    
+	/**
+	 * Get the first destination object that connects to the property or object.
+	 * \return The first destination object.
+	 */
+	inline Type* GetFirst()         { return (Type*)FbxIteratorDstBase::GetFirst(); }
+    
+	/**
+	 * Get next destination object that connects to the property or object.
+	 * \return The next destination object. If there are no more objects, return NULL.
+	 */
+	inline Type* GetNext()          { return (Type*)FbxIteratorDstBase::GetNext(); }
+    
+	/**
+	 * Get next destination object that connects to the property or object.
+	 * \return The next destination object. If there are no more objects, return NULL.
+	 * \remark This method makes sure the iterate index is not out of bounds.
+	 */
+	inline Type* GetSafeNext()      { return (Type*)FbxIteratorDstBase::GetSafeNext(); }
+    
+	/**
+	 * Get the last destination object that connects to the property or object.
+	 * \return The last destination object.
+	 */
+	inline Type* GetLast()          { return (Type*)FbxIteratorDstBase::GetLast(); }
+    
+	/**
+	 * Get previous destination object that connects to the property or object.
+	 * \return The previous destination object. If there are no more objects, return NULL.
+	 */
+	inline Type* GetPrevious()      { return (Type*)FbxIteratorDstBase::GetPrevious(); }
+    
+	/**
+	 * Get previous destination object that connects to the property or object.
+	 * \return The previous destination object. If there are no more objects, return NULL.
+	 * \remark This method makes sure the iterate index is not out of bounds.
+	 *		   If the iterate index is out of bounds, the last destination object is returned.
+	 */
+	inline Type* GetSafePrevious()  { return (Type*)FbxIteratorDstBase::GetSafePrevious(); }
+};
+
+/** Convert the class type parameter into a C class parameter for other function inputs.
+  * Usage example:
+  * \code
+  * //Assuming MyCamera is a valid FbxCamera object
+  * bool AreCamerasObject = MyCamera->Is<FbxObject>(); //Should return true :)
+  * \endcode
+  */
+#define FBX_TYPE(class) ((const class*)0)
+
+/** Safe casting of FBX SDK objects into other FBX SDK class types. This cast will perform
+  * the complete test to make sure the object inherits from the requested class type. This is
+  * the equivalent of a dynamic_cast but much faster.
+  * \param pObject	The object to try to cast into T type.
+  * \return			A non-null pointer if the cast was successful.
+  */
+template <class T> inline T* FbxCast(FbxObject* pObject)
+{
+	return pObject && pObject->Is<T>() ? (T*)pObject : 0;
+}
+
+/** Safe const casting of FBX SDK objects into other FBX SDK class types. This cast will perform
+  * the complete test to make sure the object inherits from the requested class type. This is
+  * the equivalent of a dynamic_cast but much faster.
+  * \param pObject	The object to try to cast into T type.
+  * \return			A non-null pointer if the cast was successful.
+  */
+template <class T> inline const T* FbxCast(const FbxObject* pObject)
+{
+	return pObject && pObject->Is<T>() ? (const T*)pObject : 0;
+}
+
+//! Macro used to iterate over source or destination objects that connect to property (FbxProperty) or object (FbxObject).
+#define FbxForEach(Iterator, Object) for((Object)=(Iterator).GetFirst();(Object)!=0;(Object)=(Iterator).GetNext())
+
+//! Macro used to reversely iterate over source or destination objects that connect to property (FbxProperty) or object (FbxObject)
+#define FbxForEachReverse(Iterator, Object) for(Object=(Iterator).GetLast();(Object)!=0;Object=(Iterator).GetPrevious())
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+class FBXSDK_DLL FbxConnectEvent
+{
+public:
+	enum EType
+	{
+		eConnectRequest,
+		eConnect,
+		eConnected,
+		eDisconnectRequest,
+		eDisconnect,
+		eDisconnected
+	};
+
+	enum EDirection
+	{
+		eSource,
+		eDestination
+	};
+
+    inline FbxConnectEvent(EType pType,EDirection pDir,FbxProperty *pSrc,FbxProperty *pDst) :
+		mType(pType),
+		mDirection(pDir),
+		mSrc(pSrc),
+		mDst(pDst)
+    {
+    }
+    inline EType GetType() const { return mType; }
+    inline EDirection GetDirection() const { return mDirection; }
+    inline FbxProperty& GetSrc() const { return *mSrc;  }
+    inline FbxProperty& GetDst() const { return *mDst;  }
+    template <class T> inline T* GetSrcIfObject() const { return mSrc->IsRoot() ? FbxCast<T>(mSrc->GetFbxObject()) : (T*)0; }
+    template <class T> inline T* GetDstIfObject() const { return mDst->IsRoot() ? FbxCast<T>(mDst->GetFbxObject()) : (T*)0; }
+
+private:
+    EType			mType;
+    EDirection		mDirection;
+    FbxProperty*	mSrc;
+    FbxProperty*	mDst;
+};
+
+class FbxObjectPropertyChanged : public FbxEvent<FbxObjectPropertyChanged>
+{
+	FBXSDK_EVENT_DECLARE(FbxObjectPropertyChanged);
+
+public:
+	FbxObjectPropertyChanged(FbxProperty pProp) : mProp(pProp) {}
+	FbxProperty mProp;
+};
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_OBJECT_H_ */

+ 96 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxperipheral.h

@@ -0,0 +1,96 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxperipheral.h
+#ifndef _FBXSDK_CORE_PERIPHERAL_H_
+#define _FBXSDK_CORE_PERIPHERAL_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxObject;
+
+/** FbxPeripheral is an interface to load/unload content of FbxObject from memory to
+somewhere you defined, for example, to a temporary file on disk .
+* \nosubgrouping
+* You need to inherited your own peripheral class from this class and overload
+* the functions to control what information of a FbxObject you want to load/unload,
+* and where you are going to load/unload these information to.
+* For example, you can ask an object to dump itself on disk to free some memory and vice-versa 
+* when you want to load/unload this object from your scene flexibly.
+*/
+class FBXSDK_DLL FbxPeripheral 
+{
+public:
+	/**
+	  * \name Constructor and Destructor
+	  */
+	//@{
+
+	//!Constructor.
+	FbxPeripheral();
+
+    //!Destructor.
+	virtual ~FbxPeripheral();
+	//@}
+
+	/** Reset the peripheral to its initial state.
+	  */
+	virtual void Reset() = 0;
+
+	/** Unload the content of pObject.
+	  * \param pObject                 Object whose content is to be offloaded into 
+	  * the peripheral storage area.
+	  * \return                        \c true if the object content has been successfully transferred.
+	  * \c false otherwise.
+	  */
+	virtual bool UnloadContentOf(FbxObject* pObject) = 0;
+
+	/** Load the content of pObject.
+	  * \param pObject                 Object whose content is to be loaded from
+	  * the peripheral storage area.
+	  * \return                        \c true if the object content has been successfully transferred.
+	  * \c false otherwise.
+	  */
+	virtual bool LoadContentOf(FbxObject* pObject) = 0;
+
+	/** Check if this peripheral can unload the given object content.
+	  * \param pObject                 Object whose content has to be transferred.
+	  * \return                        \c true if the peripheral can handle this object content and
+	  * has enough space in its storage area.\c false otherwise.
+	  */
+	virtual bool CanUnloadContentOf(FbxObject* pObject) = 0;
+
+    /** Check if this peripheral can load the given object content.
+    * \param pObject                  Object whose content has to be transferred.
+    * \return                         \c true if the peripheral can handle this object content.
+	* \c false otherwise.
+    */
+    virtual bool CanLoadContentOf(FbxObject* pObject) = 0;
+
+    /** Initialize the connections of an object
+    * \param pObject                  Object on which the request for connection is done.
+    */
+    virtual void InitializeConnectionsOf(FbxObject* pObject) = 0;
+
+    /** Uninitialize the connections of an object
+    * \param pObject                 Object on which the request for disconnection is done.
+    */
+    virtual void UninitializeConnectionsOf(FbxObject* pObject) = 0;
+};
+
+// predefined offload peripherals
+extern FBXSDK_DLL FbxPeripheral* NULL_PERIPHERAL;
+extern FBXSDK_DLL FbxPeripheral* TMPFILE_PERIPHERAL;
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_PERIPHERAL_H_ */

+ 264 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxplugin.h

@@ -0,0 +1,264 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxplugin.h
+#ifndef _FBXSDK_CORE_PLUGIN_H_
+#define _FBXSDK_CORE_PLUGIN_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#ifndef FBXSDK_ENV_WINSTORE
+
+#include <fbxsdk/core/fbxobject.h>
+#include <fbxsdk/core/fbxmodule.h>
+#include <fbxsdk/core/fbxlistener.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxManager;
+class FbxPluginContainer;
+
+//! Plug-in declaration macro that must to be used when defining new FbxPlugin objects.
+#define FBXSDK_PLUGIN_DECLARE(Plugin)\
+	FBXSDK_FRIEND_NEW();\
+public:\
+	static Plugin * Create(const FbxPluginDef& pDefinition, FbxModule pModuleHandle);\
+	void Destroy();
+
+//! Plug-in implementation macro that must be used when implementing new FbxPlugin objects.
+#define FBXSDK_PLUGIN_IMPLEMENT(Plugin)\
+	Plugin* Plugin::Create(const FbxPluginDef& pDefinition, FbxModule pModuleHandle){ return FbxNew<Plugin>(pDefinition, pModuleHandle); }\
+	void Plugin::Destroy(){ FbxDelete(this); }
+
+/** Structure used by plug-ins for identification purposes.
+  * \note To avoid confusions in the system, it is recommended to choose an appropriate unique identifier string name when
+  * defining your plug-in, as well as incrementing the version string to a correct value whenever something changes in the
+  * implementation of the plug-in. Both of these string are used when comparing plug-ins for searches, as well as
+  * identification in FBX files.
+  */
+struct FBXSDK_DLL FbxPluginDef
+{
+	//! Constructor
+	FbxPluginDef() :
+		mName("Unknown Name"),
+		mVersion("Unknown Version")
+	{
+	}
+
+	FbxString mName;		//!< The identifier name string of the plug-in. If the name is already used by another plug-in, the plug-in will still register.
+	FbxString mVersion;	//!< The version string of the plug-in.
+};
+
+/** Data used to communicate information between an application and the plug-in.
+  */
+struct FBXSDK_DLL FbxPluginData
+{
+	//! Constructor
+	FbxPluginData() :
+		mQueryEmitter(NULL),
+		mSDKManager(NULL),
+		mPluginContainer(NULL)
+	{
+	}
+
+	//! Copy Constructor
+	explicit FbxPluginData(const FbxPluginData& pOther) :
+		mQueryEmitter(pOther.mQueryEmitter),
+		mSDKManager(pOther.mSDKManager),
+		mPluginContainer(pOther.mPluginContainer)
+	{
+	}
+
+	FbxEmitter*			mQueryEmitter;		//!< The emitter on which the plug-in can listen to receive events.
+	FbxManager*			mSDKManager;		//!< The FBX SDK Manager on which the plug-in was instanced.
+	FbxPluginContainer*	mPluginContainer;   //!< The container which will have the ownership of the plug-in.
+};
+
+/** The base class to inherit from when creating new plug-ins for the FBX SDK. Plug-ins for the FBX SDK are extremely flexible
+  * allowing a wide-range of possibilities. For example, one can write his own plug-in to add new readers/writers to the current list
+  * of supported I/O formats, or add new dynamic classes to instantiate custom objects that can later be stored in FBX files. We also use the same
+  * interface for plug-ins written using the FBX Extension SDK, which allow additional callbacks for other various Autodesk products
+  * enabling greater interoperability with multiple various SDKs.
+  *
+  * Here is typical implementation of an FBX SDK plug-in that doesn't do anything else than just registering itself:
+  * \code
+  * class MyPlugin : public FbxPlugin
+  * {
+  *     FBXSDK_PLUGIN_DECLARE(MyPlugin); //This macro is mandatory for any plug-in definition
+  *
+  * protected:
+  *     explicit MyPlugin(const FbxPluginDef& pDefinition, FbxModule pModuleHandle) : FbxPlugin(pDefinition, pModuleHandle)
+  *     {
+  *     }
+  *
+  *     //Abstract functions that *must* be implemented
+  *     virtual bool SpecificInitialize()
+  *     {
+  *         //For example, here we could register as many new I/O readers/writers as we would like, or classes, etc.
+  *         return true;
+  *     }
+  *
+  *     virtual bool SpecificTerminate()
+  *     {
+  *         //Here we would have to unregister whatever we registered to the FBX SDK
+  *         return true;
+  *     }
+  * };
+  *
+  * FBXSDK_PLUGIN_IMPLEMENT(MyPlugin); //This macro is mandatory for any plug-in implementation
+  *
+  * //Standard C export needed for any new FBX SDK plug-in
+  * extern "C"
+  * {
+  *     static MyPlugin* sMyPluginInstance = NULL; //The module is owner of the plug-in
+  *
+  *     //This function will be called when an application will request the plug-in
+  * #ifdef FBXSDK_ENV_WIN
+  *     __declspec(dllexport) void FBXPluginRegistration(FbxPluginContainer& pContainer, FbxModule pModuleHandle)
+  * #else
+  *     void FBXPluginRegistration(FbxPluginContainer& pContainer, FbxModule pModuleHandle)
+  * #endif
+  *     {
+  *         if( sPlugin == NULL )
+  *         {
+  *             //Create the plug-in definition which contains the information about the plug-in
+  *             FbxPluginDef sPluginDef;
+  *             sPluginDef.mName = "My Plugin";
+  *             sPluginDef.mVersion = "1.0";
+  *
+  *             //Create an instance of the plug-in
+  *             sMyPluginInstance = MyPlugin::Create(sPluginDef, pLibHandle);
+  *
+  *             //Register the plug-in with the FBX SDK
+  *             pContainer.Register(*sPlugin);
+  *         }
+  *     }
+  * }
+  * \endcode
+  * \see FbxPluginDef, FbxPluginData
+  */
+class FBXSDK_DLL FbxPlugin : public FbxListener
+{
+	FBXSDK_INTRUSIVE_LIST_NODE(FbxPlugin, 1);
+
+public:
+	/** Abstract function called once at the end of the plug-in construction. At that moment, plug-in data have been properly initialized.
+	  * This function must be implemented by anyone who writes a new plug-in for the FBX SDK.
+	  */
+	virtual bool SpecificInitialize()=0;
+
+	/** Abstract function called once at the beginning of the plug-in destruction. At that moment, plug-in data is fully available.
+	  * This function must be implemented by anyone who writes a new plug-in for the FBX SDK.
+	  */
+	virtual bool SpecificTerminate()=0;
+
+	/** Virtual function called once when the FBX SDK is about to write an FBX file. Users can re-implement it in their plug-in if they need
+	  * to perform tasks at that moment. The scene provided in parameter can be altered. If not re-implemented, this function does nothing.
+	  * \param pScene The scene that is about to be written in the FBX file.
+	  */
+	virtual void WriteBegin(FbxScene& pScene);
+
+	/** Virtual function called once when the FBX SDK is about to write plug-in's parameters. Users can re-implement it in their plug-in if they need
+	  * to store properties in the FBX file for their own usage. The object in parameter is used to store those properties.
+	  * If not re-implemented, this function does nothing.
+	  * \param pParams An abstract object that can be used as a property container, to allow the plug-in to store properties about the plug-in.
+	  */
+	virtual void WriteParameters(FbxObject& pParams);
+
+	/** Virtual function called once after the FBX SDK wrote an FBX file. Users can re-implement it in their plug-in if they need
+	  * to perform tasks at that moment. The scene provided in parameter can be altered, but the changes will not appear in the FBX file.
+	  * If not re-implemented, this function does nothing.
+	  * \param pScene The scene that was written in the FBX file.
+	  */
+	virtual void WriteEnd(FbxScene& pScene);
+
+	/** Virtual function called once when the FBX SDK is about to read an FBX file. Users can re-implement it in their plug-in if they need
+	  * to perform tasks at that moment. The scene provided in parameter can be altered. If not re-implemented, this function does nothing.
+	  * \param pScene The scene that is about to be read in the FBX file.
+	  */
+	virtual void ReadBegin(FbxScene& pScene);
+
+	/** Virtual function called once after the FBX SDK reads the plug-in's parameters. Users can re-implement it in their plug-in if they need
+	  * to retrieve properties for their own usage. The object in parameter is used to retrieve those properties.
+	  * If not re-implemented, this function does nothing.
+	  * \param pParams An abstract object that can be used as a property container, to allow the plug-in to read properties about the plug-in.
+	  */
+	virtual void ReadParameters(FbxObject& pParams);
+
+	/** Virtual function called once after the FBX SDK read an FBX file. Users can re-implement it in their plug-in if they need
+	  * to perform tasks at that moment. The scene provided in parameter can be altered. If not re-implemented, this function does nothing.
+	  * \param pScene The scene that was read in the FBX file.
+	  */
+	virtual void ReadEnd(FbxScene& pScene);
+
+	/** Accessor to the plug-in definition structure that contains basic information on the plug-in like its name or version. This is
+	  * the only method available to differentiate plug-ins.
+	  * \return The definition structure for this plug-in.
+	  */
+	const FbxPluginDef& GetDefinition() const;
+
+	/** Retrieve the module address pointer for this plug-in. With this module instance handle, for example someone can query procedures addresses,
+	  * allowing more complex interactions, as well as other operating system module specific functions.
+	  */
+	FbxModule GetModuleHdl();
+
+protected:
+	/** Use the Create() and Destroy() methods declared and implemented in the FBXSDK_PLUGIN_DECLARE and FBXSDK_PLUGIN_IMPLEMENT macros to construct and destroy FbxPlugin objects.
+	  * \param pDefinition The definition associated with this plug-in. Each plug-in must have its own definition to differentiate it with other plug-ins.
+	  * \param pModuleHandle A pointer to the plug-in module address.
+	  */
+	explicit FbxPlugin(const FbxPluginDef& pDefinition, FbxModule pModuleHandle);
+
+	/** Accessor to the plug-in private data.
+	  * \return The data for the current plug-in.
+	  */
+	FbxPluginData& GetData();
+
+	/** Const accessor to the plug-in private data.
+	  * \return The const data for the current plug-in.
+	  */
+	const FbxPluginData& GetData() const;
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+public:
+	inline FbxObject& GetPluginSettings() { return *mPluginSettings; }
+	inline const FbxObject& GetPluginSettings() const { return *mPluginSettings; }
+	template <typename EventType, typename ListernerType> inline FbxEventHandler* Bind(void (ListernerType::*pFunc)(const EventType*))
+	{
+		return FbxListener::Bind<EventType,ListernerType>(*(GetData().mQueryEmitter), pFunc );
+	}
+	virtual void Destroy() = 0;
+
+protected:
+	virtual ~FbxPlugin();
+
+private:
+	bool							Initialize(const FbxPluginData& pData);
+	bool							Terminate();
+
+	bool							mInitialized;
+	FbxPluginData					mData;
+	FbxPluginDef					mDefinition;
+	FbxModule						mModuleHandle;
+	FbxObject*						mPluginSettings;
+
+	friend class FbxLoadingStrategy;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE */
+
+#endif /* _FBXSDK_CORE_PLUGIN_H_ */

+ 74 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxplugincontainer.h

@@ -0,0 +1,74 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxplugincontainer.h
+#ifndef _FBXSDK_CORE_PLUGIN_CONTAINER_H_
+#define _FBXSDK_CORE_PLUGIN_CONTAINER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#ifndef FBXSDK_ENV_WINSTORE
+
+#include <fbxsdk/core/fbxplugin.h>
+#include <fbxsdk/core/fbxemitter.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Manages registration and ownership of FBX SDK plug-ins (FbxPlugin). 
+  * The FBX SDK will provide a pointer to FbxPluginContainer as an argument
+  * to the FBXPluginRegistration() function exported from a plug-in's DLL.
+  * A plug-in must register itself explicitly with the FbxPluginContainer
+  * by calling FbxPluginContainer::Register() after it is constructed. 
+  * For an example of this process see the code example in the FbxPlugin 
+  * class documentation.
+  * \see FbxPlugin
+  */
+class FBXSDK_DLL FbxPluginContainer : public FbxEmitter
+{
+public:
+	//! Definition of a plug-in list.
+	typedef FbxIntrusiveList<FbxPlugin> PluginList;
+
+	/** The registration function that must be called when the module containing the plug-in is loaded.
+	  * \param pPlugin The plug-in to register.
+	  */
+	void Register(FbxPlugin& pPlugin);
+
+	/** The unregistration function that must be called when the module containing the plug-in is unloaded.
+	  * \param pPlugin The plug-in to unregister.
+	  */
+	void Unregister(FbxPlugin& pPlugin);
+
+	/** Const accessor to the list of plug-ins owned by the container.
+	  * \return A list of plug-in registered to this container.
+	  */
+	const PluginList& GetPlugins() const;
+
+	/** Accessor to the list of plug-ins owned by the container.
+	  * \return A list of plug-in registered to this container.
+	  */
+	PluginList& GetPlugins();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+protected:
+	virtual ~FbxPluginContainer();
+	PluginList mPlugins;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE */
+
+#endif /* _FBXSDK_CORE_PLUGIN_CONTAINER_H_ */

+ 1240 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxproperty.h

@@ -0,0 +1,1240 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxproperty.h
+#ifndef _FBXSDK_CORE_PROPERTY_H_
+#define _FBXSDK_CORE_PROPERTY_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxquery.h>
+#include <fbxsdk/core/fbxpropertydef.h>
+#include <fbxsdk/core/fbxpropertytypes.h>
+#include <fbxsdk/core/fbxdatatypes.h>
+#include <fbxsdk/core/base/fbxmap.h>
+#include <fbxsdk/core/base/fbxset.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxObject;
+class FbxAnimStack;
+class FbxAnimLayer;
+class FbxAnimCurveNode;
+class FbxAnimCurve;
+class FbxAnimEvaluator;
+
+template <class T> inline T EvaluatePropertyValue(FbxProperty& pProperty, const FbxTime& pTime, bool pForceEval = false);
+
+/** \brief Class to hold user properties.
+* \nosubgrouping
+*/
+class FBXSDK_DLL FbxProperty
+{
+public:
+	/**
+	  * \name Constructor and Destructor.
+	  */
+	//@{
+		/** Creates a runtime property on the specified property.
+		  * \param pCompoundProperty	The parent property of this property.
+		  * \param pDataType			The data type of this property.
+		  * \param pName				The property name. 
+		  * \param pLabel				The label of this property.
+		  * \param pCheckForDup			If \c true, parent property checks if it has a child property already with pName, if \c false, the new property is created. 
+		  * \param pWasFound			If pCheckForDup is \c true, this flag is set to indicate whether the pCompoundProperty already has a child property with pName.  
+		  */
+		static FbxProperty Create(const FbxProperty& pCompoundProperty, const FbxDataType& pDataType, const char* pName, const char* pLabel="", bool pCheckForDup=true, bool* pWasFound=NULL);
+
+		/** Creates a runtime property on the specified object.
+		  * \param pObject		The object on which the property will be created.
+		  * \param pDataType	The data type of this property.
+		  * \param pName		The property name.
+		  * \param pLabel		The label of this property.
+		  * \param pCheckForDup	If \c true, pObject checks whether it already has a property with pName, if \c false, a new property is created.
+		  * \param pWasFound	If pCheckForDup is \c true, this flag is set to indicate whether the pObject already has a child property with pName.
+		  */
+		static FbxProperty Create(FbxObject* pObject, const FbxDataType& pDataType, const char* pName, const char* pLabel="", bool pCheckForDup=true, bool* pWasFound=NULL);
+
+		/** Creates a dynamic property from another property on the specified property.
+		  * \param pCompoundProperty	The parent property of this property.
+		  * \param pFromProperty		The property copied by this property. 
+		  * \param pCheckForDup			If \c true, parent property checks if it already has a child property that has the name of pFromProperty, if \c false, a new property is created. 
+		  * \remark						Only the property name, label, min/max, enums and flags are copied.
+		  */
+		static FbxProperty CreateFrom(const FbxProperty& pCompoundProperty, FbxProperty& pFromProperty, bool pCheckForDup=true);
+
+		/** Creates a dynamic property from another property on the specified object.
+		  * \param pObject			The object that contains this property.
+		  * \param pFromProperty	The property copied by this property. 
+		  * \param pCheckForDup		If \c true, pObject checks if it already has a property that has the name of pFromProperty, if \c false, a new property is created. 
+		  * \remark					Only the property name, label, min/max, enums and flags are copied.
+		  */
+		static FbxProperty CreateFrom(FbxObject* pObject, FbxProperty& pFromProperty, bool pCheckForDup=true);
+
+		/** Destroys a dynamic property.
+		  */
+		void Destroy();
+
+		/** Destroys a dynamic property and its children
+		* \remarks Destroy all children of current property, and current property will also be destroyed.
+		*/
+		void DestroyRecursively();
+
+		/** Destroys children of a dynamic property.
+		* \remarks Destroy all children of current property, and current property will not be destroyed.
+		*/
+		void DestroyChildren();
+
+		/** Static property constructor.
+		  */
+		FbxProperty();
+
+		/** Copy constructor for properties.
+		  * \param pProperty The property copied to this one.
+		  */
+		FbxProperty(const FbxProperty& pProperty);
+
+		/** Copy constructor for properties.
+		  * \param pPropertyHandle The property handle copied to this property handle. 
+		  */
+		FbxProperty(const FbxPropertyHandle& pPropertyHandle);
+
+		/** Static property destructor.
+		  */
+		~FbxProperty();
+	//@}
+
+	/**
+	  * \name Property Identification.
+	  */
+	//@{
+		/** Returns the property data type. 
+		  * \return The property data type.
+		  */
+		FbxDataType GetPropertyDataType() const;
+
+		/** Returns the internal name of the property. 
+		  * \return Property internal name string.
+		  */
+		FbxString GetName() const;
+
+		/** Returns the internal name of the property. 
+		  * \return Property internal name string.
+		  */
+		const char* GetNameAsCStr() const;
+
+		/** Returns the hierarchical name of the property.
+		  * \return Property hierarchical name string.
+		  */
+		FbxString GetHierarchicalName() const;
+
+		/** Returns the property label.
+		  * \param pReturnNameIfEmpty If \c true, lets this method return the internal name if the label is empty. 
+		  * \return The property label if set, or the property internal name if the pReturnNameIfEmpty
+		  *         flag is set to \c true and the label has not been defined.
+		  * \remarks Some applications may ignore the label field and work uniquely with the
+		  *          internal name. Therefore, it should not be taken for granted that a label exists. Also, remember
+		  *          that the label does not get saved in the FBX file. It only exists while the property object is
+		  *          in memory.
+		  */
+		FbxString GetLabel(bool pReturnNameIfEmpty=true) const;
+
+
+		/** Sets a label for the property.
+		  * \param pLabel Label string.
+		  */
+		void SetLabel(const FbxString& pLabel);
+
+		/** Returns the object that contains the property.
+		  * \return The property object owner (or null if the property is an orphan).
+		  */
+		FbxObject* GetFbxObject() const;
+	//@}
+
+	/**
+	  * \name User data
+	  */
+	//@{
+		/** Sets the user tag.
+		  * \param pTag The user tag to be set.
+		  */
+		void SetUserTag(int pTag);
+		    
+		//! Gets the user tag.
+		int GetUserTag();
+
+		/** Sets the user data pointer.
+		  * \param pUserData The user data pointer.
+		  */            
+		void SetUserDataPtr(void* pUserData);
+
+		/** Gets the user data pointer.
+		  * \return The user data pointer.
+		  */
+		void* GetUserDataPtr();
+	//@}
+
+	/**
+	  * \name Property Flags.
+	  */
+	//@{
+		/** Changes the property attribute.
+		  * \param pFlag Property attribute identifier.
+		  * \param pValue New state of pFlag.
+		  */
+		void ModifyFlag(FbxPropertyFlags::EFlags pFlag, bool pValue);
+
+		/** Returns the state of the property attribute. 
+		  * \param pFlag Property attribute identifier.
+		  * \return The state of the property attribute(pFlag).
+		  */
+		bool GetFlag(FbxPropertyFlags::EFlags pFlag) const;
+
+		/** Returns the state of all of the property attributes.
+		  * \return The state of the property attributes(pFlags).
+		  */
+		FbxPropertyFlags::EFlags GetFlags() const;
+
+		/** Returns the inheritance type of the given flag, similar to GetValueInheritType().
+		  * \param pFlag The flag to be queried.
+		  * \return The inheritance type of the specific flag.
+		  */
+		FbxPropertyFlags::EInheritType GetFlagInheritType( FbxPropertyFlags::EFlags pFlag ) const;
+
+		/** Sets the inheritance type for the specific flag, similar to SetValueInheritType().
+		  * \param pFlag The flag to be set.
+		  * \param pType The inheritance type to be set.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool SetFlagInheritType( FbxPropertyFlags::EFlags pFlag, FbxPropertyFlags::EInheritType pType );
+
+		/** Checks if the property flag has been modified from its default value.
+		  * \param pFlag The flag to be queried.
+		  * \return \c True if the value of this property has changed, \c false otherwise
+		  */
+		bool ModifiedFlag( FbxPropertyFlags::EFlags pFlag ) const;
+	//@}
+
+	/**
+	  * \name Assignment and comparison operators
+	  */
+	//@{
+		/** Assignment operator.
+		  * \param pProperty The property assigned to this property.
+		  * \return This property.
+		  */
+		FbxProperty& operator= (const FbxProperty& pProperty);
+
+		/** Equivalence operator.
+		  * \param pProperty The property compared to this property.
+		  * \return \c True if equal, \c false otherwise.
+		  */            
+		bool operator== (const FbxProperty& pProperty) const;
+
+		/** Non-equivalence operator.
+		  * \param pProperty The property compared to this property.
+		  * \return \c True if unequal, \c false otherwise.
+		  */    
+		bool operator!= (const FbxProperty& pProperty) const;
+
+		/** Lesser operator, used to sort property in map.
+		* \param pProperty The property compared to this property.
+		* \return \c true if less, \c false otherwise. */
+		bool operator< (const FbxProperty& pProperty) const;
+
+		/** Greater operator, used to sort property in map.
+		* \param pProperty The property compared to this property.
+		* \return \c true if greater, \c false otherwise. */
+		bool operator> (const FbxProperty& pProperty) const;
+
+		/** Equivalence operator.
+		  * \param pValue The value compared to this property.
+		  * \return \c True if this property is valid and pValue doesn't equal zero, or this property is invalid and pValue equals zero, \c false otherwise.
+		  */    
+		inline bool operator== (int pValue) const { return (pValue == 0) ? !IsValid() : IsValid(); }
+
+		/** Non-equivalence operator.
+		  * \param pValue The value compared to this property.
+		  * \return \c True if this property is valid and pValue equals zero, or this property is invalid and pValue doesn't equal zero, \c false otherwise.
+		  */    
+		inline bool operator!= (int pValue) const { return (pValue != 0) ? !IsValid() : IsValid(); }
+
+		/** Compares this property's value to another property's value.
+		  * \param pProperty The property whose value is compared with this property's value.
+		  * \return \c True if equal, \c false otherwise.
+		  */
+		bool CompareValue(const FbxProperty& pProperty) const;
+	//@}
+
+	/** Copies the value of a property.
+	  * \param pProperty The property from which to derive the value.
+	  * \return \c True if value has been copied successfully, \c false otherwise.
+	  */
+	bool CopyValue(const FbxProperty& pProperty);
+
+	/**
+	  * \name Value management.
+	  */
+	//@{
+		/** Gets the value of the property.
+		  * \tparam T The data type of the value.
+		  * \return The property value.
+		  */
+		template <class T> inline T Get() const { T lValue; Get(&lValue, FbxTypeOf(lValue)); return lValue; }
+
+		/** Sets the value of the property.
+		  * \param pValue The new value
+		  * \return \c True if type is compatible and the value is set successfully, \c false otherwise.
+		  */
+		template <class T> inline bool Set(const T& pValue){ return Set(&pValue, FbxTypeOf(pValue)); }
+
+		/** Judges the property's validity.
+		  * \return \c True if this property is valid, \c false otherwise. 
+		  */
+		bool IsValid() const;
+
+		/** Checks if the specified property's value has changed from its default value.
+		  * \param pProperty Property that is tested.
+		  * \return \c True if the property value is still the default, \c false otherwise.
+		  * \remarks If the inheritance type of pProperty's value is eOverride, pProperty's value should
+		  *          have been modified, so pProperty doesn't have the default value.
+		  *          If the inheritance type of pProperty's value is eInherit, that means pProperty's value inherits
+		  *          the referenced object's property value, so pProperty has the default value. 
+		  */
+		static bool HasDefaultValue(FbxProperty& pProperty);
+
+		/** Queries the inheritance type of the property.
+		  * Use this method to determine if this property's value is overridden from the default
+		  * value, or from the referenced object, if this object is a clone.
+		  * \return The inheritance type of the property.
+		  */
+		FbxPropertyFlags::EInheritType GetValueInheritType() const;
+
+		/** Sets the inheritance type of the property.
+		  * Use the method to explicitly override the default value of the property,
+		  * or the referenced object's property value, if this object is a clone.
+		  *
+		  * You can also use this to explicitly inherit the default value of the property,
+		  * or the referenced object's property value, if this object is a clone.
+		  *
+		  * \param pType The new inheritance type.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool SetValueInheritType( FbxPropertyFlags::EInheritType pType );
+
+		/** Checks if the property's value has been modified from its default value.
+		  * \return \c True if the value of the property has changed, \c false otherwise.
+		  * \remarks If the inheritance type of the property's value is eOverride, the property's value should
+		  *          have been modified, it returns \c true.
+		  *          If the inheritance type of the property's value is eInherit, that means the property's value inherits
+		  *          the referenced object's property value, so the property's value is not modified and it returns \c false. 
+		  */
+		bool Modified() const;
+	//@}
+
+	/**
+	  * \name Property Limits.
+	  * Property limits are provided for convenience if some applications desire to
+	  * bound the range of possible values for a given type property. FBX will never 
+	  * apply these limits internally, however it will store and retrieve the limits values
+	  * from files, and will assure that they are persistent in memory 
+	  * while the property exists.
+	  *
+	  * Notes: 
+	  * - The limit value is truncated to the property data type.
+	  *
+	  * - These limits are meaningless for the boolean type. It is the responsibility of the
+	  *   calling application to implement the necessary instructions to limit the property of boolean type.
+	  *
+	  * - The SetMinLimit/SetMaxLimit methods will do nothing if SupportSetLimitsAsDoube() returns false.
+	  */
+	//@{
+		/** Returns whether setting limits as a double number on this property type is allowed. 
+		   * \return \c True if allowed, \c false otherwise.
+		   */
+		bool SupportSetLimitAsDouble() const;
+
+		/** Sets a minimum property value limit.
+		  * \param pMin Minimum value allowed.
+		  * \return \c True if the limit has been set, \c false otherwise.
+		  */
+		bool SetMinLimit(double pMin);
+
+		/** Returns whether a minimum limit exists, if it returns false, 
+		   * calling GetMinLimit() produces undefined behavior.
+		   * \return \c True when a minimum limit exists, \c false otherwise.
+		   */
+		bool HasMinLimit() const;
+
+		/** Returns the minimum property value limit.
+		  * \return The minimum value limit.
+		  */
+		double GetMinLimit() const;
+
+		/** Returns whether a maximum limit exists, if it returns false, 
+		   * calling GetMaxLimit() produces undefined behavior.
+		   * \return \c True when a maximum limit exists, \c false otherwise.
+		   */
+		bool HasMaxLimit() const;
+
+		/** Sets a maximum property value limit.
+		  * \param pMax Maximum value allowed.
+		  * \return \c True if the limit has been set, \c false otherwise.
+		  */
+		bool SetMaxLimit(double pMax);
+
+		/** Returns the maximum property value.
+		  * \return The maximum value limit.
+		  */
+		double GetMaxLimit() const;
+
+		/** Sets the minimum and maximum value limit of the property. 
+		  * \param pMin Minimum value allowed.
+		  * \param pMax Maximum value allowed.
+		  \return \c True if both the min and max limit have been set, \c false otherwise.
+		  */
+		bool SetLimits(double pMin, double pMax);
+	//@}
+
+	/**
+	  * \name Enum and property list
+	  */
+	//@{
+		/** Adds a string value at the end of the enumeration list.
+		  * \param pStringValue The string value to be added.
+		  * \return The index in the list where the string is added or -1 if the action failed.
+		  * \remarks This function is only valid if the property type is eFbxEnum or eFbxEnumM.
+		  * \remarks If the property is of type eFbxEnum, trying to add a value that is already
+          * in the enumeration list will fail. 
+		  * Empty strings are not allowed.
+		  */
+		int AddEnumValue(const char* pStringValue);
+
+		/** Inserts a string value at the specific index.
+		  * \param pIndex Zero bound index.
+		  * \param pStringValue The string value to be inserted.
+		  * \remarks This function is only valid if the property type is eFbxEnum or eFbxEnumM.
+		  * \remarks If the property is of type eFbxEnum, trying to insert a value that is already
+          * in the enumeration list will fail. 
+		  * pIndex must be in the range [0, ListValueGetCount()].
+		  * Empty strings are not allowed.
+		  */
+		void InsertEnumValue(int pIndex, const char* pStringValue);
+
+		/** Returns the number of elements in the enumeration list.
+		  * \return The number of elements in the enumeration list.
+		  * \remarks This function returns 0 if the property type is not eFbxEnum or eFbxEnumM.
+		  */
+		int GetEnumCount() const;
+
+		/** Sets a string value at the specific index.
+		  * \param pIndex Zero bound index.
+		  * \param pStringValue The string value at the specific index.
+		  * \remarks This function is only valid if the property type is eFbxEnum or eFbxEnumM.
+		  * \remarks If the property is of type eFbxEnum, trying to set a value that is already
+          * in the enumeration list will fail. 
+		  * The function assigns the string value to the specific index.
+		  * A string value must exist at the specific index in order to be changed.
+		  * Empty strings are not allowed.
+		  */
+		void SetEnumValue(int pIndex, const char* pStringValue);
+
+		/** Removes the string value at the specified index.
+		  * \param pIndex Index of the string value to be removed.
+		  * \remarks This function is only valid if the property type is eFbxEnum or eFbxEnuM.
+		  */
+		void RemoveEnumValue(int pIndex);
+
+		/** Returns a string value at the specified index
+		  * \param pIndex Zero bound index.
+		  * \remarks This function is only valid if the property type is eFbxEnum or eFbxEnumM.
+		  */
+		const char* GetEnumValue(int pIndex) const;
+	//@}
+
+	/**
+	  * \name Hierarchical properties
+	  */
+	//@{
+		/** Judges if this property is the root property. 
+		  * \return \c True when this property is a root property, \c false otherwise.
+		  */
+		inline bool IsRoot() const { return mPropertyHandle.IsRoot(); }
+
+		/** Judges whether this property is a child of the specified property.
+		  * \param pParent The specified property.
+		  * \return \c True when this property is a child of the specified property, \c false otherwise.
+		  */
+		inline bool IsChildOf(const FbxProperty& pParent) const { return mPropertyHandle.IsChildOf(pParent.mPropertyHandle); }
+
+		/** Judges whether this property is a descendant of the specified property.
+		  * \param pAncestor The specified property.
+		  * \return \c True when this property is a descendant of the specified property, \c false otherwise.
+		  */
+		inline bool IsDescendentOf(const FbxProperty& pAncestor) const { return mPropertyHandle.IsDescendentOf(pAncestor.mPropertyHandle); }
+
+		/** Returns the parent property of this property.
+		  * \return The parent of this property.
+		  */
+		inline FbxProperty GetParent() const { return FbxProperty(mPropertyHandle.GetParent());  }
+
+		/** Returns the first child of this property.
+		  * \return The first child of this property, if there is none, an invalid property is returned.
+		  */
+		inline FbxProperty GetChild() const { return FbxProperty(mPropertyHandle.GetChild());   }
+
+		/** Returns the sibling of this property.
+		  * \return The sibling of this property, if there is none, an invalid property is returned.
+		  */
+		inline FbxProperty GetSibling() const { return FbxProperty(mPropertyHandle.GetSibling()); }
+
+		/** Returns the first property that is a descendant of this property. 
+		  * \return The first descendant of this property, if there is none, an invalid property is returned.
+		  */
+		inline FbxProperty GetFirstDescendent() const { return FbxProperty(mPropertyHandle.GetFirstDescendent());   }
+
+		/** Returns the property that follows pProperty that is a descendant of this property. 
+		  * \param pProperty The last found descendant.
+		  * \return The property that follows pProperty, if there is none, an invalid property is returned.
+		  */
+		inline FbxProperty GetNextDescendent(const FbxProperty& pProperty) const { return FbxProperty(mPropertyHandle.GetNextDescendent(pProperty.mPropertyHandle)); }
+
+		/** Searches a property using its name.
+		  * \param pName The name of the property as a \c NULL terminated string.
+		  * \param pCaseSensitive Whether the name is case-sensitive.
+		  * \return A valid FbxProperty if the property is found, else
+		  *         an invalid FbxProperty. See FbxProperty::IsValid()
+		  */
+		inline FbxProperty Find (const char* pName, bool pCaseSensitive = true) const { return FbxProperty(mPropertyHandle.Find(pName,pCaseSensitive));  }
+
+		/** Searches a property using its name and data type.
+		  * \param pName The name of the property as a \c NULL terminated string.
+		  * \param pDataType The data type of the property.
+		  * \param pCaseSensitive Whether the name is case-sensitive.
+		  * \return A valid FbxProperty if the property is found, else
+		  *         an invalid FbxProperty. See FbxProperty::IsValid()
+		  */
+		inline FbxProperty Find (const char* pName, const FbxDataType& pDataType, bool pCaseSensitive = true) const { return FbxProperty(mPropertyHandle.Find(pName,pDataType.GetTypeInfoHandle(),pCaseSensitive));  }
+
+		/** Searches a property using its full name.
+		  * \param pName The full name of the property as a \c NULL terminated string.
+		  * \param pCaseSensitive whether the name is case-sensitive.
+		  * \return A valid FbxProperty if the property is found, else
+		  *         an invalid FbxProperty. See FbxProperty::IsValid()
+		  */
+		inline FbxProperty FindHierarchical (const char* pName, bool pCaseSensitive = true) const { return FbxProperty(mPropertyHandle.Find(pName,sHierarchicalSeparator,pCaseSensitive));  }
+
+		/** Searches a property using its full name and data type.
+		  * \param pName The full name of the property as a \c NULL terminated string.
+		  * \param pDataType The data type of the property.
+		  * \param pCaseSensitive whether the name is case-sensitive.
+		  * \return A valid FbxProperty if the property is found, else
+		  *         an invalid FbxProperty. See FbxProperty::IsValid()
+		  */
+		inline FbxProperty FindHierarchical (const char* pName, const FbxDataType& pDataType, bool pCaseSensitive = true) const { return FbxProperty(mPropertyHandle.Find(pName,sHierarchicalSeparator,pDataType.GetTypeInfoHandle(),pCaseSensitive));  }
+	//@}
+
+	/**
+	  * \name Optimizations
+	  */
+	//@{
+		//! Internal function for building a property name map.
+		inline void BeginCreateOrFindProperty(){ mPropertyHandle.BeginCreateOrFindProperty(); }
+
+		//! Internal function for clearing the property name map. 
+		inline void EndCreateOrFindProperty(){ mPropertyHandle.EndCreateOrFindProperty(); }
+
+		//!This is an internal class that you can use to build and clear the name map of properties. You can use the name map to speed up searching for property names.
+		class FbxPropertyNameCache
+		{
+		public:
+			/** Constructor, the name map is created in the constructor.
+			  * \param prop Property for building and clearing the name map.
+			  */
+			FbxPropertyNameCache(const FbxProperty& prop) : mProp(const_cast<FbxProperty&>(prop)){ mProp.BeginCreateOrFindProperty(); }
+
+			//! Destructor, the name map is destroyed in destructor.
+			~FbxPropertyNameCache(){ mProp.EndCreateOrFindProperty(); }
+
+		private:
+			FbxProperty& mProp;
+			FbxPropertyNameCache& operator=(const FbxPropertyNameCache& pOther){ mProp = pOther.mProp; mProp.BeginCreateOrFindProperty(); return *this; }
+		};
+	//@}
+
+	/**
+	  * \name Animation Curve Management
+	  */
+	//@{
+		/** Retrieve the proper animation evaluator to use for this property.
+		* \return If the object has no scene, returns the default evaluator, otherwise the object's scene evaluator. */
+		FbxAnimEvaluator* GetAnimationEvaluator() const;
+
+		/** Find out if the property is animated: has a curve node with curves.
+		* \param pAnimLayer The animation layer to test for curve presence. Set to NULL if you want to use the default animation layer of the default animation stack.
+		* \return \c true if the property is animated. */
+		bool IsAnimated(FbxAnimLayer* pAnimLayer=NULL) const;
+
+		/** Evaluate the value of a property if it has animation and return the result as the template type.
+		* \param pTime The time used for evaluate. If FBXSDK_TIME_INFINITE is used, this returns the default value, without animation curves evaluation.
+		* \param pForceEval Force the evaluator to refresh the evaluation state cache even if its already up-to-date.
+		* \return The property value at the specified time converted to the template type provided, if possible.
+		* \remark If the property type versus the template cannot be converted, the result is unknown. */
+		template <class T> T EvaluateValue(const FbxTime& pTime=FBXSDK_TIME_INFINITE, bool pForceEval=false);
+
+		/** Evaluate the value of a property if it has animation and return the result.
+		* \param pTime The time used for evaluate. If FBXSDK_TIME_INFINITE is used, this returns the default value, without animation curves evaluation.
+		* \param pForceEval Force the evaluator to refresh the evaluation state cache even if its already up-to-date.
+		* \return The property value at the specified time. */
+		FbxPropertyValue& EvaluateValue(const FbxTime& pTime=FBXSDK_TIME_INFINITE, bool pForceEval=false);
+
+		/** Creates a FbxAnimCurveNode on the specified layer.
+		* \param pAnimLayer The animation layer the FbxAnimCurveNode object is attached to.
+		* \return Pointer to the created FbxAnimCurveNode.
+		* \remarks This function check the property FbxPropertyFlags::eAnimatable flag and fails to execute if it is not set.
+		* \remarks If created, the FbxAnimCurveNode is automatically connected to the property and the animation layer.
+		* \remarks The created FbxAnimCurveNode does not automatically allocate anim curves.
+		* \remarks On the successful execution of this function, the property eAnimated flag is set to \c true. */
+		FbxAnimCurveNode* CreateCurveNode(FbxAnimLayer* pAnimLayer);
+
+		/** Get the property's animation curve node on the default animation stack and base layer.
+		* \param pCreate If \c true, create the animation curve node and return it if none were found.
+		* \return The animation curve node of this property, if found or created, otherwise NULL.
+		* \remark If the property flag FbxPropertyFlags::eAnimatable is not set, creating the curve node will fail. */
+		FbxAnimCurveNode* GetCurveNode(bool pCreate=false);
+
+		/** Get the property's animation curve node on the specified animation stack, using its base layer.
+		* \param pAnimStack The animation stack to use to get or create the property's animation curve node.
+		*                   \c NULL can be passed to automatically specify the default animation stack.
+		* \param pCreate If \c true, create the animation curve node and return it if none were found.
+		* \return The animation curve node of this property, if found or created, otherwise NULL.
+		* \remark If the property flag FbxPropertyFlags::eAnimatable is not set, creating the curve node will fail. */
+		FbxAnimCurveNode* GetCurveNode(FbxAnimStack* pAnimStack, bool pCreate=false);
+
+		/** Get the property's animation curve node on the specified animation layer.
+		* \param pAnimLayer The animation layer to use to get or create the property's animation curve node. Cannot be NULL.
+		* \param pCreate If \c true, create the animation curve node and return it if none were found.
+		* \return The animation curve node of this property, if found or created, otherwise NULL.
+		* \remark If the property flag FbxPropertyFlags::eAnimatable is not set, creating the curve node will fail. */
+		FbxAnimCurveNode* GetCurveNode(FbxAnimLayer* pAnimLayer, bool pCreate=false);
+
+		/** Get the FbxAnimCurve from the specified animation layer.
+		* This function expects to find a FbxAnimCurveNode object with the same name as the property and it
+		* attempts to retrieve the FbxAnimCurve from it.
+		* \param pAnimLayer The searched animation layer.
+		* \param pCreate Create a FbxAnimCurve if not found.
+		* \return Pointer to the FbxAnimCurve. Returns NULL in case of errors or pCreate is \c false and the curve is not found.
+		* \remark If the FbxAnimCurveNode does not exists but the property has the FbxPropertyFlags::eAnimatable flag set and
+		*         pCreate is true, then this function will first create the FbxAnimCurveNode object and then the FbxAnimCurve.
+		* \remark If more than one FbxAnimCurveNode matching the name criteria are connected, the first one is returned. */
+		inline FbxAnimCurve* GetCurve(FbxAnimLayer* pAnimLayer, bool pCreate=false)
+		{
+			return GetCurve(pAnimLayer, GetName(), NULL, pCreate);
+		}
+
+		/** Get the FbxAnimCurve from the specified animation layer.
+		* This function expects to find a FbxAnimCurveNode object with the same name as the property and it
+		* attempts to retrieve the FbxAnimCurve from it.
+		* \param pAnimLayer The searched animation layer.
+		* \param pChannel Name of the channel we are looking for the animation curve. If NULL use the first defined channel.
+		* \param pCreate Create a FbxAnimCurve if not found.
+		* \return Pointer to the FbxAnimCurve. Returns NULL in case of errors or pCreate is \c false and the curve is not found.
+		* \remark If the FbxAnimCurveNode does not exists but the property has the FbxPropertyFlags::eAnimatable flag set and
+		*         pCreate is true, then this function will first create the FbxAnimCurveNode object and then the FbxAnimCurve.
+		* \remark If more than one FbxAnimCurveNode matching the name criteria are connected, the first one is returned. */
+		inline FbxAnimCurve* GetCurve(FbxAnimLayer* pAnimLayer, const char* pChannel, bool pCreate=false)
+		{
+			return GetCurve(pAnimLayer, GetName(), pChannel, pCreate);
+		}
+
+		/** Get the FbxAnimCurve of the specified channel from the specified animation layer.
+		* This function looks for the FbxAnimCurveNode named pName and the channel pChannel. It
+		* will retrieves the FbxAnimCurve from it.
+		* \param pAnimLayer The searched animation layer.
+		* \param pName Name of the curve node. It is an error to leave this field empty.
+		* \param pChannel Name of the channel we are looking for the animation curve. If NULL
+		*         use the first defined channel.
+		* \param pCreate Create a FbxAnimCurve if not found.
+		* \return Pointer to the FbxAnimCurve. Returns NULL in case of errors or pCreate is \c false and the curve is not found.
+		* \remark If the FbxAnimCurveNode does not exists but the property has the FbxPropertyFlags::eAnimatable flag set and
+		*         pCreate is true, then this function will first create the FbxAnimCurveNode object and then the FbxAnimCurve.
+		* \remark If more than one FbxAnimCurveNode matching the name criteria are connected, the first one is returned.
+		* \remark If pChannel is NULL, this function is the equivalent of GetCurve(FbxAnimLayer*, bool). */
+		FbxAnimCurve* GetCurve(FbxAnimLayer* pAnimLayer, const char* pName, const char* pChannel, bool pCreate);
+	//@}
+
+	/**
+	  * \name General Object Connection and Relationship Management
+	  */
+	//@{
+		/** Connects this property to one source object.
+		  * \param pObject The source object to which this property connects.
+		  * \param pType The connection type between the property and the object.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool ConnectSrcObject(FbxObject* pObject, FbxConnection::EType pType=FbxConnection::eNone);
+
+		/** Judges whether this property connects with the source object.
+		  * \param pObject The source object.
+		  * \return \c True if this property connects with the source object, \c false otherwise.
+		  */
+		bool IsConnectedSrcObject(const FbxObject* pObject) const;
+
+		/** Disconnects this property from one source object.
+		  * \param pObject The source object from which this property will be disconnected.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool DisconnectSrcObject(FbxObject* pObject);
+
+		/** Disconnects this property from all the source objects.
+		  * \return \c True if it disconnects all the source objects successfully, \c false otherwise.
+		  */
+		bool DisconnectAllSrcObject();
+
+		/** Disconnects this property from all source objects that satisfy a given criteria. 
+		  * \param pCriteria The given criteria.
+		  * \return \c True if it disconnects all the source objects successfully, \c false otherwise.
+		  */
+		bool DisconnectAllSrcObject(const FbxCriteria& pCriteria);
+
+		/** Returns the number of source objects with which this property connects.
+		  * \return The number of source objects with which this property connects. 
+		  */
+		int	 GetSrcObjectCount() const;
+
+		/** Returns the number of source objects that satisfy the given criteria with which this property connects.
+		  * \param pCriteria The given criteria.
+		  * \return The number of source objects that satisfy the given criteria with which this property connects.
+		  */
+		int GetSrcObjectCount(const FbxCriteria& pCriteria) const;
+
+		/** Returns the source object at the specified index with which this property connects.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The source object at the specified index, NULL if not found.
+		  */
+		FbxObject* GetSrcObject(const int pIndex=0) const;
+
+		/** Returns the source object that satisfies the criteria at the specified index with which this property connects.
+		  * \param pCriteria The given criteria.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The source object that satisfies the given criteria at the specified index, NULL if not found.
+		  */
+		FbxObject* GetSrcObject(const FbxCriteria& pCriteria, const int pIndex=0) const;
+
+		/** Searches the source object with the specified name, starting with the specified index.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The source object with the name, NULL if not found.
+		  */
+		FbxObject* FindSrcObject(const char* pName, const int pStartIndex=0) const;
+
+		/** Searches the source object with the specified name which satisfies the given criteria, starting with the specified index.
+		  * \param pCriteria The given criteria.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The source object with the name, NULL if not found.
+		  */
+		FbxObject* FindSrcObject(const FbxCriteria& pCriteria, const char* pName, const int pStartIndex=0) const;
+
+		/** Disconnects this property from all source objects of the specified class type.
+		  * \tparam T The specified class type.
+		  * \return \c True if it disconnects all source objects successfully, \c false otherwise.
+		  */
+		template <class T> inline bool DisconnectAllSrcObject(){ return DisconnectAllSrcObject(FbxCriteria::ObjectType(T::ClassId)); }
+
+		/** Disconnects this property from all source objects which are of the specified class type and satisfy the given criteria.
+		  * \tparam T The specified class type.
+		  * \param pCriteria The given criteria.
+		  * \return \c True if it disconnects all source objects successfully, \c false otherwise.
+		  */
+		template <class T> inline bool DisconnectAllSrcObject(const FbxCriteria& pCriteria){ return DisconnectAllSrcObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria); }
+
+		/** Returns the number of source objects of a specific class type with which this property connects.
+		  * \tparam T The specified class type.
+		  * \return The number of source objects of the specified class type with which this property connects.
+		  */
+		template <class T> inline int GetSrcObjectCount() const { return GetSrcObjectCount(FbxCriteria::ObjectType(T::ClassId)); }
+
+		/** Returns the number of source objects which are of the specified class type and satisfy the given criteria with which this property connects.
+		  * \tparam T The specified class type.
+		  * \param pCriteria The given criteria.
+		  * \return The number of source objects which are of the specified class type and satisfy the given criteria.
+		  */
+		template <class T> inline int GetSrcObjectCount(const FbxCriteria& pCriteria) const { return GetSrcObjectCount(FbxCriteria::ObjectType(T::ClassId) && pCriteria); }
+
+		/** Returns the source object of the specified class type at the specified index.
+		  * \tparam T The specified class type.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The source object of a specified class type at the specified index, NULL if not found.
+		  */
+		template <class T> inline T* GetSrcObject(const int pIndex=0) const { return (T*)GetSrcObject(FbxCriteria::ObjectType(T::ClassId), pIndex); }
+
+		/** Returns the source object which is of the specified class type and satisfies the given criteria at the specified index.
+		  * \tparam T The specified class type.
+		  * \param pCriteria The given criteria.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The source object which is of the specified class type and satisfies the given criteria at the specified index, NULL if not found.
+		  */
+		template <class T> inline T* GetSrcObject(const FbxCriteria& pCriteria, const int pIndex=0) const { return (T*)GetSrcObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria, pIndex); }
+
+		/** Searches the source object with the specified name which is of the specified class type, starting with the specified index.
+		  * \tparam T The specified class type.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The source object with the name, NULL if not found.
+		  */
+		template <class T> inline T* FindSrcObject(const char* pName, const int pStartIndex=0) const { return (T*)FindSrcObject(FbxCriteria::ObjectType(T::ClassId), pName, pStartIndex); }
+
+		/** Searches the source object with the specified name which is of the specified class type and satisfies the given criteria, starting with the specified index.
+		  * \tparam T The specified class type.
+		  * \param pCriteria The given criteria.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The source object with the name, NULL if not found.
+		  */
+		template <class T> inline T* FindSrcObject(const FbxCriteria& pCriteria, const char* pName, const int pStartIndex=0) const { return (T*)FindSrcObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria, pName, pStartIndex); }
+
+		/** Connects this property to one destination object.
+		  * \param pObject The destination object with which this property connects.
+		  * \param pType The connection type between this property and the object.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool ConnectDstObject(FbxObject* pObject, FbxConnection::EType pType=FbxConnection::eNone);
+
+		/** Judges whether this property connects with the destination object.
+		  * \param pObject The destination object.
+		  * \return \c True if this property connects with the destination object, \c false otherwise.
+		  */
+		bool IsConnectedDstObject(const FbxObject* pObject) const;
+
+		/** Disconnects this property from the destination object.
+		  * \param pObject The destination object from which this property disconnects from.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool DisconnectDstObject(FbxObject* pObject);
+
+		/** Disconnects this property from all the destination objects.
+		  * \return \c True if it disconnects all the destination objects successfully, \c false otherwise.
+		  */
+		bool DisconnectAllDstObject();
+
+		/** Disconnects this property from all the destination objects that satisfy given criteria.
+		  * \param pCriteria The given criteria.
+		  * \return \c True if it disconnects all the destination objects successfully, \c false otherwise.
+		  */
+		bool DisconnectAllDstObject(const FbxCriteria& pCriteria);
+
+		/** Returns the number of destination objects with which this property connects. 
+		  * \return The number of destination objects with which this property connects. 
+		  */
+		int GetDstObjectCount() const;
+
+		/** Returns the number of destination objects that satisfy the given criteria with which this property connects. 
+		  * \param pCriteria The given criteria.
+		  * \return The number of destination objects that satisfy given criteria with which this property connects. 
+		  */
+		int GetDstObjectCount(const FbxCriteria& pCriteria) const;
+
+		/** Returns the destination object at the specified index with which this property connects.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The destination object at the specified index, NULL if not found.
+		  */
+		FbxObject* GetDstObject(const int pIndex=0) const;
+
+		/** Returns the destination object that satisfies given criteria at the specified index with which this property connects.
+		  * \param pCriteria The given criteria.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The destination object that satisfies given criteria at the specified index, NULL if not found.
+		  */
+		FbxObject* GetDstObject(const FbxCriteria& pCriteria, const int pIndex=0) const;
+
+		/** Searches the destination object with the specified name, starting with the specified index.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The destination object with the name, NULL if not found.
+		  */
+		FbxObject* FindDstObject(const char* pName, const int pStartIndex=0) const;
+
+		/** Searches the destination object with the specified name which satisfies the given criteria, starting with the specified index.
+		  * \param pCriteria The given criteria.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The destination object with the name, NULL if not found.
+		  */
+		FbxObject* FindDstObject(const FbxCriteria& pCriteria, const char* pName, const int pStartIndex=0) const;
+
+		/** Disconnects this property from all the destination objects of the specified class type.
+		  * \tparam T The specified class type.
+		  * \return \c True if it disconnects all the destination objects successfully, \c false otherwise.
+		  */
+		template <class T> inline bool DisconnectAllDstObject(){ return DisconnectAllDstObject(FbxCriteria::ObjectType(T::ClassId)); }
+
+		/** Disconnects this property from all the destination objects which are of the specified class type and satisfy the given criteria.
+		  * \tparam T The specified class type.
+		  * \param pCriteria The given criteria.
+		  * \return \c True if it disconnects all the destination objects successfully, \c false otherwise.
+		  */
+		template <class T> inline bool DisconnectAllDstObject(const FbxCriteria& pCriteria){ return DisconnectAllDstObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria); }
+
+		/** Returns the number of destination objects of the specified class type with which this property connects.
+		  * \tparam T The specified class type.
+		  * \return The number of destination objects of the specified class type with which this property connects.
+		  */
+		template <class T> inline int GetDstObjectCount() const { return GetDstObjectCount(FbxCriteria::ObjectType(T::ClassId)); }
+
+		/** Returns the number of destination objects which are of the specified class type and satisfy the given criteria with which this property connects.
+		  * \tparam T The specified class type.
+		  * \param pCriteria The given criteria.
+		  * \return The number of destination objects which are of the specified class type and satisfy the given criteria with which this property connects.
+		  */
+		template <class T> inline int GetDstObjectCount(const FbxCriteria& pCriteria) const { return GetDstObjectCount(FbxCriteria::ObjectType(T::ClassId) && pCriteria); }
+
+		/** Returns the destination object of the specified class type at the specified index with which this property connects.
+		  * \tparam T The specified class type.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The destination object of the specified class type at the specified index, NULL if not found.
+		  */
+		template <class T> inline T* GetDstObject(const int pIndex=0) const { return (T*)GetDstObject(FbxCriteria::ObjectType(T::ClassId), pIndex); }
+
+		/** Returns the destination object which is of the specified class type and satisfies the given criteria at the specified index with which this property connects.
+		  * \tparam T The specified class type.
+		  * \param pCriteria The given criteria.
+		  * \param pIndex The specified index whose default value is 0.
+		  * \return The destination object which is of the specified class type and satisfies the given criteria at the specified index, NULL if not found.
+		  */
+		template <class T> inline T* GetDstObject(const FbxCriteria& pCriteria, const int pIndex=0) const { return (T*)GetDstObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria, pIndex); }
+
+		/** Searches the destination object with the specified name which is of the specified class type, starting with the specified index.
+		  * \tparam T The specified class type.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The source object with the name, NULL if not found.
+		  */
+		template <class T> inline T* FindDstObject(const char* pName, const int pStartIndex=0) const { return (T*)FindDstObject(FbxCriteria::ObjectType(T::ClassId), pName, pStartIndex); }
+
+		/** Searches the destination object with the specified name which is of the specified class type and satisfies the given criteria, starting with the specified index.
+		  * \tparam T The specified class type.
+		  * \param pCriteria The given criteria.
+		  * \param pName The object name.
+		  * \param pStartIndex The start index.
+		  * \return The source object with the name, NULL if not found.
+		  */
+		template <class T> inline T* FindDstObject(const FbxCriteria& pCriteria, const char* pName, const int pStartIndex=0) const { return (T*)FindDstObject(FbxCriteria::ObjectType(T::ClassId) && pCriteria, pName, pStartIndex); }
+	//@}
+
+	/**
+	  * \name General Property Connection and Relationship Management
+	  */
+	//@{
+		// Properties
+		/** Connects this property to a source property.
+		  * \param pProperty The source property with which this property connects.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool ConnectSrcProperty(const FbxProperty& pProperty);
+
+		/** Judges whether this property connects with the specified source property.
+		  * \param pProperty The specified source property.
+		  * \return \c True if this property connects with the specified source property, \c false otherwise.
+		  */
+		bool IsConnectedSrcProperty(const FbxProperty& pProperty);
+
+		/** Disconnects this property from the specified source property.
+		  * \param pProperty The specified source property.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool DisconnectSrcProperty(const FbxProperty& pProperty);
+
+		/** Returns the number of source properties with which this property connects. 
+		  * \return The number of source properties with which this property connects. 
+		  */
+		int GetSrcPropertyCount() const;            
+
+		/** Connects this property to a destination property.
+		  * \param pProperty The destination property with which this property connects.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool ConnectDstProperty(const FbxProperty&  pProperty);
+
+		/** Judges if this property connects with the specified destination property.
+		  * \param pProperty The specified destination property.
+		  * \return \c True if this property connects with the specified destination property, \c false otherwise.
+		  */
+		bool IsConnectedDstProperty(const FbxProperty& pProperty);
+
+		/** Disconnects this property from the specified destination property.
+		  * \param pProperty The specified destination property.
+		  * \return \c True on success, \c false otherwise.
+		  */
+		bool DisconnectDstProperty(const FbxProperty& pProperty);
+
+		/** Returns the number of destination properties with which this property connects. 
+		  * \return The number of destination properties with which this property connects. 
+		  */
+		int GetDstPropertyCount() const;
+
+		//!Clears the connection cache of this property, this cache is used to store the connections that satisfy the given criteria. 
+		void ClearConnectCache();
+
+		/** Returns the source property at the specified index with which this property connects. 
+		  * \param pIndex The specified index.
+		  * \return The source property at the specified index. 
+		  */
+		FbxProperty	GetSrcProperty(const int pIndex=0) const;
+
+		/** Searches the source property with the specified name, starting with the specified index with which this property connects. 
+		  * \param pName The specified property name.
+		  * \param pStartIndex The start index.
+		  * \return The source property with the specified name. 
+		  */
+		FbxProperty FindSrcProperty(const char* pName, const int pStartIndex=0) const;
+
+		/** Returns the destination property at the specified index with which this property connects. 
+		  * \param pIndex The specified index.
+		  * \return The destination property at the specified index. 
+		  */
+		FbxProperty GetDstProperty(const int pIndex=0) const;
+
+		/** Searches the destination property with the specified name, starting with the specified index with which this property connects. 
+		  * \param pName The specified property name.
+		  * \param pStartIndex The start index.
+		  * \return The destination property with the specified name. 
+		  */
+		FbxProperty FindDstProperty(const char* pName, const int pStartIndex=0) const;
+	//@}
+
+    //! Hierarchical separator of properties.
+	static const char* sHierarchicalSeparator;
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+protected:
+    FbxProperty(FbxObject* pObject, const char* pName, const FbxDataType& pDataType=FbxDataType(), const char* pLabel="");
+    FbxProperty(const FbxProperty& pParent, const char* pName, const FbxDataType& pDataType, const char* pLabel);
+
+	bool Set(const void* pValue, const EFbxType& pValueType, bool pCheckForValueEquality=true);
+	bool Get(void* pValue, const EFbxType& pValueType) const;
+
+	bool NotifySetRequest();
+	bool NotifySet();
+	bool NotifyGet() const;
+
+private:
+	inline void*	Get() const { FBX_ASSERT_NOW("Cannot get property value as void!"); return NULL; }
+	inline bool		Set(const void* &){ FBX_ASSERT_NOW("Cannot set property value as void!"); return false; }
+
+    bool			ConnectSrc(const FbxProperty& pProperty, FbxConnection::EType pType=FbxConnection::eNone);
+    bool			DisconnectSrc(const FbxProperty& pProperty);
+    bool			DisconnectAllSrc();
+    bool			DisconnectAllSrc(const FbxCriteria& pCriteria);
+    bool			IsConnectedSrc(const FbxProperty& pProperty) const;
+    int				GetSrcCount() const;
+    int				GetSrcCount(const FbxCriteria& pCriteria) const;
+    FbxProperty		GetSrc(int pIndex=0) const;
+    FbxProperty		GetSrc(const FbxCriteria& pCriteria, int pIndex=0) const;
+    FbxProperty		FindSrc(const FbxCriteria& pCriteria, const char* pName, int pStartIndex=0) const;
+
+    bool			ConnectDst(const FbxProperty& pProperty, FbxConnection::EType pType=FbxConnection::eNone);
+    bool			DisconnectDst(const FbxProperty& pProperty);
+    bool			DisconnectAllDst();
+    bool			DisconnectAllDst(const FbxCriteria& pCriteria);
+    bool			IsConnectedDst(const FbxProperty& pProperty) const;
+    int				GetDstCount() const;
+    int				GetDstCount(const FbxCriteria& pCriteria) const;
+    FbxProperty		GetDst(int pIndex=0) const;
+    FbxProperty		GetDst(const FbxCriteria& pCriteria, int pIndex=0) const;
+    FbxProperty		FindDst(const FbxCriteria& pCriteria, const char* pName, int pStartIndex=0) const;
+
+    mutable FbxPropertyHandle mPropertyHandle;
+
+    friend class FbxObject;
+	friend class FbxIOSettings;
+	friend class FbxBindingOperator;
+	friend class FbxAnimEvalClassic;
+    friend void FbxMarkObject(FbxObject* pObject, FbxMap<FbxObject*, int>& pObjectDstDisconnectCount, FbxSet<FbxObject*>& pObjectsToDeleted, FbxArray<FbxObject*>& pObjectToDeletedInSequence);
+    friend void FbxCleanUpConnectionsAtDestructionBoundary(FbxScene* pObject, FbxArray<FbxObject*>& pObjectToDeletedInSequence);
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/** \brief This template class is used to contain user properties of specific data types.
+* \nosubgrouping
+*/
+template <class T> class FbxPropertyT : public FbxProperty
+{
+public:
+	/**
+	  * \name Static initialization.
+	  */
+	//@{
+		/** Creates a property and initializes it using a specific value and flag.
+		  * \param pObject The object that contains this property.
+		  * \param pName   The name of the property.
+		  * \param pValue  The value of the property.
+		  * \param pForceSet If \c true, the value is forcibly set, if \c false the value is not set when it equals the default value. 
+		  * \param pFlags  The property flag.
+		  */
+		FbxProperty& StaticInit(FbxObject* pObject, const char* pName, const T& pValue, bool pForceSet, FbxPropertyFlags::EFlags pFlags=FbxPropertyFlags::eNone)
+		{
+			return StaticInit(pObject, pName, FbxGetDataTypeFromEnum(FbxTypeOf(pValue)), pValue, pForceSet, pFlags);
+		}
+
+		/** Creates a property and initializes it using a specific value and flag.
+		  * \param pObject The object that contains this property.
+		  * \param pName   The name of the property.
+		  * \param pDataType  The property data type.
+		  * \param pValue  The property value.
+		  * \param pForceSet If \c true, the value is forcibly set, if \c false the value is not set when it equals the default value. 
+		  * \param pFlags  The property flag.
+		  */
+		FbxProperty& StaticInit(FbxObject* pObject, const char* pName, const FbxDataType& pDataType, const T& pValue, bool pForceSet, FbxPropertyFlags::EFlags pFlags=FbxPropertyFlags::eNone)
+		{
+			bool lWasFound = false;
+			*this = Create(pObject, pDataType, pName, "", true, &lWasFound);
+			if( pForceSet || !lWasFound )
+			{
+				ModifyFlag(pFlags, true);	// modify the flags before we set the value
+				FbxProperty::Set(&pValue, FbxTypeOf(pValue), false);
+			}
+			ModifyFlag(FbxPropertyFlags::eStatic, true);
+			return *this;
+		}
+
+		/** Creates a property and initializes it using a specific value and flag.
+		  * \param pCompound The parent property of this property.
+		  * \param pName   The name of the property.
+		  * \param pDataType  The property data type.
+		  * \param pValue  The property value.
+		  * \param pForceSet If \c true, the value is forcibly set, if \c false the value is not set when it equals to the default value. 
+		  * \param pFlags  The property flag.
+		  */
+		FbxProperty& StaticInit(FbxProperty pCompound, const char* pName, const FbxDataType& pDataType, const T& pValue, bool pForceSet=true, FbxPropertyFlags::EFlags pFlags=FbxPropertyFlags::eNone)
+		{
+			bool lWasFound = false;
+			*this = Create(pCompound, pDataType, pName, "", true, &lWasFound);
+			if( pForceSet || !lWasFound )
+			{
+				ModifyFlag(pFlags, true);	// modify the flags before we set the value
+				FbxProperty::Set(&pValue, FbxTypeOf(pValue), false);
+			}
+			ModifyFlag(FbxPropertyFlags::eStatic, true);
+			return *this;
+		}
+	//@}
+
+	/** \name Value Management */
+	//@{
+		/** Assignment function
+		* \param pValue The value assigned to this property.
+		* \return This property. */
+		FbxPropertyT& Set(const T& pValue){ FbxProperty::Set(&pValue, FbxTypeOf(pValue)); return *this; }
+
+		/** Retrieve function
+		* \return The value of the property. */
+		T Get() const { T lValue; FbxProperty::Get(&lValue, FbxTypeOf(lValue)); return lValue; }
+
+		/** Assignment operator
+		* \param pValue The value of type T assigned to this property.
+		* \return This property. */
+		FbxPropertyT& operator=(const T& pValue){ return Set(pValue); }
+
+		/** Type cast operator
+		* \return The value of the property of type T. */
+		operator T() const { return Get(); }
+	//@}
+
+	/** \name Animation Evaluation */
+	//@{
+		/** Evaluate the value of a property if it has animation and return the result.
+		* \param pTime The time used for evaluate.
+		* \param pForceEval Force the evaluator to refresh the evaluation state cache even if its already up-to-date.
+		* \return The property value at the specified time. */
+		T EvaluateValue(const FbxTime& pTime=FBXSDK_TIME_INFINITE, bool pForceEval=false)
+		{
+			return EvaluatePropertyValue<T>(*this, pTime, pForceEval);
+		}
+	//@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxPropertyT() : FbxProperty(){}
+	FbxPropertyT(const FbxProperty& pProperty) : FbxProperty(pProperty){}
+	~FbxPropertyT(){}
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+template <> class FbxPropertyT<FbxReference> : public FbxProperty
+{
+public:
+	FbxPropertyT() : FbxProperty(){}
+	FbxPropertyT(const FbxProperty& pProperty) : FbxProperty(pProperty){}
+	~FbxPropertyT(){}
+
+	const FbxProperty& StaticInit(FbxObject* pObject, const char* pName, const FbxReference& pValue, bool pForceSet, FbxPropertyFlags::EFlags pFlags=FbxPropertyFlags::eNone)
+	{
+		return StaticInit(pObject, pName, FbxGetDataTypeFromEnum(eFbxReference), pValue, pForceSet, pFlags);
+	}
+
+	const FbxProperty& StaticInit(FbxObject* pObject, const char* pName, const FbxDataType& pDataType, const FbxReference& pValue, bool pForceSet, FbxPropertyFlags::EFlags pFlags=FbxPropertyFlags::eNone)
+	{
+		bool lWasFound = false;
+		*this = Create(pObject, pDataType, pName, "", true, &lWasFound);
+		if( pForceSet || !lWasFound )
+		{
+			ModifyFlag(pFlags, true);	// modify the flags before we set the value
+			Set(pValue);			// since we will trigger callbacks in there!
+		}
+		ModifyFlag(FbxPropertyFlags::eStatic, true);
+		return *this;
+	}
+
+	FbxReference Get() const
+	{
+		FbxProperty::NotifyGet();
+		return GetSrcObject();
+	}
+
+	FbxPropertyT& Set(const FbxReference& pValue)
+	{
+		if( FbxProperty::NotifySetRequest() )
+		{
+			DisconnectAllSrcObject();
+			if( ConnectSrcObject(pValue) ) 
+			{
+				FbxProperty::SetValueInheritType(FbxPropertyFlags::eOverride);
+				FbxProperty::NotifySet();
+			}
+		}
+		return *this;
+	}
+
+	operator FbxReference() const
+	{
+		return Get();
+	}
+
+	FbxPropertyT& operator=(const FbxReference& pValue)
+	{
+		return Set(pValue);
+	}
+};
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_PROPERTY_H_ */

+ 146 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxpropertydef.h

@@ -0,0 +1,146 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxpropertydef.h
+#ifndef _FBXSDK_CORE_PROPERTY_DEFINITION_H_
+#define _FBXSDK_CORE_PROPERTY_DEFINITION_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxpropertytypes.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+#define FBXSDK_PROPERTY_ID_NULL	-1
+#define FBXSDK_PROPERTY_ID_ROOT 0
+
+class FbxPropertyPage;
+
+class FBXSDK_DLL FbxPropertyFlags
+{
+public:
+	//! Property inherit types
+	enum EInheritType
+	{
+		eOverride,	//!< Property override this flag from its reference property.
+		eInherit,	//!< Property inherit this flag from its reference property.
+		eDeleted	//!< Property has been deleted, so inheritance is invalid.
+	};
+
+	//! Property flags that affect their behaviors
+	enum EFlags
+	{
+		eNone = 0,					//!< No flag.
+		eStatic = 1 << 0,			//!< Property is defined in the class declaration, so it wasn't created dynamically.
+		eAnimatable = 1 << 1,		//!< Property can be animated, thus is can have am animation curve node connected.
+		eAnimated = 1 << 2,			//!< Property is animated, so it also has an animation curve node connected.
+		eImported = 1 << 3,			//!< Property has been created during import process when reading FBX file.
+		eUserDefined = 1 << 4,		//!< Property has been defined by user, not by the FBX SDK.
+		eHidden = 1 << 5,			//!< Property should not be displayed on user interface.
+		eNotSavable = 1 << 6,		//!< Property value must not be exported when writing FBX files.
+
+        eLockedMember0 = 1 << 7,	//!< This property has its member #0 locked.
+        eLockedMember1 = 1 << 8,	//!< This property has its member #1 locked.
+        eLockedMember2 = 1 << 9,	//!< This property has its member #2 locked.
+        eLockedMember3 = 1 << 10,	//!< This property has its member #3 locked.
+        eLockedAll = eLockedMember0 | eLockedMember1 | eLockedMember2 | eLockedMember3,
+        eMutedMember0 = 1 << 11,	//!< This property has its member #0 muted.
+        eMutedMember1 = 1 << 12,	//!< This property has its member #1 muted.
+        eMutedMember2 = 1 << 13,	//!< This property has its member #2 muted.
+        eMutedMember3 = 1 << 14,	//!< This property has its member #3 muted.
+        eMutedAll = eMutedMember0 | eMutedMember1 | eMutedMember2 | eMutedMember3,
+
+		//Private flags
+		eUIDisabled = 1 << 15,		//!< Private flag for dynamic UI in FBX plug-ins.
+		eUIGroup = 1 << 16,			//!< Private flag for dynamic UI in FBX plug-ins.
+		eUIBoolGroup = 1 << 17,		//!< Private flag for dynamic UI in FBX plug-ins.
+		eUIExpanded = 1 << 18,		//!< Private flag for dynamic UI in FBX plug-ins.
+		eUINoCaption = 1 << 19,		//!< Private flag for dynamic UI in FBX plug-ins.
+		eUIPanel = 1 << 20,			//!< Private flag for dynamic UI in FBX plug-ins.
+		eUILeftLabel = 1 << 21,		//!< Private flag for dynamic UI in FBX plug-ins.
+		eUIHidden = 1 << 22,		//!< Private flag for dynamic UI in FBX plug-ins.
+
+		eCtrlFlags = eStatic | eAnimatable | eAnimated | eImported | eUserDefined | eHidden | eNotSavable | eLockedAll | eMutedAll,
+		eUIFlags = eUIDisabled | eUIGroup | eUIBoolGroup | eUIExpanded | eUINoCaption | eUIPanel | eUILeftLabel | eUIHidden,
+		eAllFlags = eCtrlFlags | eUIFlags,
+
+		eFlagCount = 23,
+	};
+
+	bool SetFlags(FbxPropertyFlags::EFlags pMask, FbxPropertyFlags::EFlags pFlags);
+	FbxPropertyFlags::EFlags GetFlags() const;
+	FbxPropertyFlags::EFlags GetMergedFlags(FbxPropertyFlags::EFlags pFlags) const;
+	bool ModifyFlags(FbxPropertyFlags::EFlags pFlags, bool pValue);
+	FbxPropertyFlags::EInheritType GetFlagsInheritType(FbxPropertyFlags::EFlags pFlags) const;
+
+	bool SetMask(FbxPropertyFlags::EFlags pFlags);
+	bool UnsetMask(FbxPropertyFlags::EFlags pFlags);
+	FbxPropertyFlags::EFlags GetMask() const;
+
+	bool Equal(const FbxPropertyFlags& pOther, FbxPropertyFlags::EFlags pFlags) const;
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxPropertyFlags();
+	explicit FbxPropertyFlags(FbxPropertyFlags::EFlags pFlags);
+	FbxPropertyFlags Clone(FbxPropertyPage* pPage);
+
+    static const int sLockedMembersMax = 4;			//Maximum number of property sub-member that can be locked.
+    static const int sLockedMembersBitOffset = 7;	//Number of bits to shift to get to the first locked member flag.
+    static const int sMutedMembersMax = 4;			//Maximum number of property sub-member that can be muted.
+    static const int sMutedMembersBitOffset = 11;	//Number of bits to shift to get to the first muted member flag.
+
+private:
+    FbxUInt32 mFlagData, mMaskData;
+
+	FBX_ASSERT_STATIC(sizeof(FbxUInt32) * 8 >= FbxPropertyFlags::eFlagCount);
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+class FBXSDK_DLL FbxPropertyValue
+{
+public:
+	static FbxPropertyValue* Create(void* pData, EFbxType pType);
+	void Destroy();
+	FbxPropertyValue* Clone(FbxPropertyPage*);
+
+	bool Get(void* pValue, EFbxType pValueType);
+	bool Set(const void* pValue, EFbxType pValueType);
+	size_t GetSizeOf() const;
+	size_t GetComponentCount() const;
+
+	void IncRef();
+	void DecRef();
+	int GetRef();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxPropertyValue();
+
+private:
+	FbxPropertyValue(void* pValue, EFbxType pType);
+	~FbxPropertyValue();
+
+	int			mRef;
+	EFbxType	mType;
+	void*		mValue;
+
+	FBXSDK_FRIEND_NEW();
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_PROPERTY_DEFINITION_H_ */

+ 576 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxpropertyhandle.h

@@ -0,0 +1,576 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxpropertyhandle.h
+#ifndef _FBXSDK_CORE_PROPERTY_HANDLE_H_
+#define _FBXSDK_CORE_PROPERTY_HANDLE_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxconnectionpoint.h>
+#include <fbxsdk/core/fbxpropertytypes.h>
+#include <fbxsdk/core/fbxpropertydef.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxPropertyPage;
+class FbxPropertyHandle;
+class FbxConnectionPointFilter;
+
+//!	\brief Class to manage property handle.
+class FBXSDK_DLL FbxPropertyHandle
+{
+public:
+	/**
+	* \name Constructor and Destructor
+	*/
+	//@{
+		//! Create an instance
+		static FbxPropertyHandle Create();
+
+		/** Create an instance with given instance.
+		* \param pInstanceOf The given instance. */
+		static FbxPropertyHandle Create(const FbxPropertyHandle& pInstanceOf);
+
+		/** Create an instance with given name and type.
+		* \param pName Property name.
+		* \param pType Property type. */
+		static FbxPropertyHandle Create(const char* pName, EFbxType pType=eFbxUndefined);
+
+		/** Create an instance with given name and type info.
+		* \param pName
+		* \param pTypeInfo */
+		static FbxPropertyHandle Create(const char* pName, FbxPropertyHandle pTypeInfo);
+
+		/** If this property is root property, delete the property page, otherwise delete the property.
+		* \return  If succeed, return true. */
+		bool Destroy();
+
+		//! Default constructor. 
+		FbxPropertyHandle();
+
+		/** Copy constructor.
+		* \param pAddress FbxPropertyHandle copied to this one. */
+		FbxPropertyHandle(const FbxPropertyHandle& pAddress);
+
+		//! Destructor
+		~FbxPropertyHandle();
+
+		/**  Character constructor.
+		* \param pPage
+		* \param pId */
+		FbxPropertyHandle(FbxPropertyPage* pPage, FbxInt pId=FBXSDK_PROPERTY_ID_ROOT);
+	//@}
+
+	/**
+	* \name Assignment and basic info
+	*/
+	//@{
+		/** FbxPropertyHandle assignment operator.
+		* \param pHandle FbxPropertyHandle assigned to this one. */
+		FbxPropertyHandle& operator=(const FbxPropertyHandle& pHandle);
+
+		/** Equality operator.
+		* \param pHandle FbxPropertyHandle compared with this one.
+		* \return \c True if equal, \c false otherwise. */
+		bool operator==(const FbxPropertyHandle& pHandle) const;
+
+		/** Inequality operator.
+		* \param pHandle FbxPropertyHandle compared with this one.
+		* \return \c True if unequal, \c false otherwise. */
+		bool operator!=(const FbxPropertyHandle& pHandle) const;
+
+		/** Lesser operator, used to sort property handle in map.
+		* \param pHandle The property handle compared to this property handle.
+		* \return \c true if less, \c false otherwise. */
+		bool operator< (const FbxPropertyHandle& pHandle) const;
+
+		/** Greater operator, used to sort property handle in map.
+		* \param pProperty The property handle compared to this property handle.
+		* \return \c true if greater, \c false otherwise. */
+		bool operator> (const FbxPropertyHandle& pHandle) const;
+
+		/** Compare type info together
+		* \param pHandle FbxPropertyHandle compared with this one.   
+		* \return \c True if equal, \c false otherwise. */
+		bool Is(const FbxPropertyHandle& pHandle) const;
+
+		//! Judge validity
+		bool Valid() const;
+
+		//! Get the property name
+		const char*	GetName() const;
+
+		//! Get the property label
+		const char*	GetLabel() const;
+
+		/** Set a label to the property
+		* \param pLabel The given label string
+		* \return \c true if successful. */
+		bool SetLabel(const char* pLabel);
+
+		//! Get the property type
+		EFbxType GetType() const;
+
+		//! Get the property type info
+		FbxPropertyHandle GetTypeInfo() const;
+
+		//! Get the property attribute state
+		FbxPropertyFlags::EFlags	GetFlags() const;
+	
+		/**	Gets the inheritance type for the given flag. 
+		* \param pFlags The flag to query
+		* \param pCheckReferences Decide whether check instance. If it is true, check instance.
+		* \return The inheritance type */
+		FbxPropertyFlags::EInheritType GetFlagsInheritType(FbxPropertyFlags::EFlags pFlags, bool pCheckReferences) const;
+
+		/**	According the given parameter Change the attributes of the property.
+		* \param pFlags The given flags used as mask.
+		* \param pValue If pValue is true, set mask with given flags, otherwise unset mask with given flags.
+		* \return  If succeed, return true. */
+		bool ModifyFlags(FbxPropertyFlags::EFlags pFlags, bool pValue);
+
+		/**Sets the inheritance type for the given flag
+		* \param pFlags The flag to set 
+		* \param pType The inheritance type to set 
+		* \return  If succeed, return true. */
+		bool SetFlagsInheritType(FbxPropertyFlags::EFlags pFlags, FbxPropertyFlags::EInheritType pType);
+
+		//! Get the property user data.
+		void* GetUserData() const;
+
+		/** Set user data to the property
+		* \param pUserData The given user data
+		* \return  If succeed, return true. */
+		bool SetUserData(const void* pUserData);
+
+		//! Get the property user tag
+		int GetUserTag() const;
+
+		/** Set user tag to the property
+		* \param pUserData The given user tag
+		* \return  If succeed, return true. */
+		bool SetUserTag(int pUserData);
+	//@}
+
+	/**
+	* \name Enum management
+	*/
+	//@{
+		/** Add new value at the end of the enum list in the property.
+		* \param pStringValue The given new value
+		* \return  The index of the value. */
+		int AddEnumValue(const char* pStringValue);
+
+		/** Insert new value at the given index of the enum list in property.
+		* \param pIndex The given index
+		* \param pStringValue The given new value */
+		void InsertEnumValue(int pIndex, const char* pStringValue);
+
+		/** Get the enum count of enum list in property
+		* \return The enum count of enum list in property */
+		int GetEnumCount();
+
+		/** Set value at the given index of the enum list in the property.
+		* \param pIndex  The given index
+		* \param pStringValue The given new value used to instead the old value. */
+		void SetEnumValue(int pIndex, const char* pStringValue);
+
+		/** Remove the value at the index of the enum list in the property.
+		* \param pIndex The given index */
+		void RemoveEnumValue(int pIndex);
+
+		/** Get the value at the index of enum list in the property.
+		* \param pIndex    The given index
+		* \return The value at the given index */
+		char* GetEnumValue(int pIndex);
+	//@}
+
+	/**
+	* \name Child and Struct management
+	*/
+	//@{
+		//! Create the map for find property in the property page
+		void BeginCreateOrFindProperty();
+
+		//! Clear the map which created for find property.
+		void EndCreateOrFindProperty();
+
+		/** Judge if the property is the root property.
+		* \return Return true if this property is root property. */
+		inline bool	IsRoot() const { return ( mPage && mId == 0 ) ? true : false; }
+
+		/** Judge if the property is the child property of the given parent property.
+		* \param pParent The given parent property handle
+		* \return Return true if this property is child of given property. */
+		bool IsChildOf(const FbxPropertyHandle& pParent) const;
+
+		/** Judge if the property is descendent property of the given property.
+		* \param pParent The given parent property handle
+		* \return Return true if this property is descendant of given property. */
+		bool IsDescendentOf(const FbxPropertyHandle& pParent) const;
+
+		/** Set parent property handle.No matter what enters,the result is always false.
+		* \param pOther
+		* \return False */
+		bool SetParent(const FbxPropertyHandle& pOther );
+
+		/** Add a property to the property page.
+		* \param pName The name of property.
+		* \param pTypeInfo The added property's type info.
+		* \return The handle of the new added property */
+		FbxPropertyHandle Add(const char* pName, const FbxPropertyHandle& pTypeInfo);
+
+		/** Get parent property
+		* \return If the parent property exists, return the property handle,otherwise return -1. */
+		FbxPropertyHandle GetParent() const;
+
+		/**  Get child property 
+		* \return  If the child property is exist, return the property handle,otherwise return -1. */
+		FbxPropertyHandle GetChild() const;
+
+		/**  Get sibling property  
+		* \return If the sibling property is exist, return the property handle,otherwise return -1. */
+		FbxPropertyHandle GetSibling() const;
+
+		/**  Get first descendent property 
+		* \return If the descendent property is exist, return the first descendent property handle,otherwise return -1. */
+		FbxPropertyHandle GetFirstDescendent() const;
+
+		/**  Get first descendent property which after the given property 
+		* \param pHandle The given property handle
+		* \return If the descendent property can be found after the given property, 
+		* return the first found property handle,otherwise return -1. */
+		FbxPropertyHandle GetNextDescendent(const FbxPropertyHandle& pHandle) const;
+
+		/** Find the property with given name 
+		* \param pName The given property name
+		* \param pCaseSensitive Decide if the given property name is case sensitive
+		* \return  Return a property handle which be created with the found property. */
+		FbxPropertyHandle Find(const char* pName, bool pCaseSensitive) const;
+
+		/** Find the property with given name and type info.
+		* \param pName The given property name
+		* \param pTypeInfo The given property type info
+		* \param pCaseSensitive Decide if the given property name is case sensitive
+		* \return  Return a property handle which be created with the found property. */
+		FbxPropertyHandle Find(const char* pName, const FbxPropertyHandle& pTypeInfo, bool pCaseSensitive) const;
+
+		/** Separate the given name by  children separator string and then find the property.The step is  
+		*  strip the first part of the name and search, if the property can be found, strip the second part  
+		*  of the name and continue search, until no property be found,then return the last found property.
+		* \param pName The given property name
+		* \param pChildrenSeparator The given children separator string 
+		* \param pCaseSensitive Decide if the given property name is case sensitive
+		* \return  Return a property handle which be created with the found property. */
+		FbxPropertyHandle Find(const char* pName, const char* pChildrenSeparator, bool pCaseSensitive) const;
+
+		/** Separate the given name by  children separator string and then find the property.The step is  
+		*  strip the first part of the name and search, if the property can be found, strip the second part  
+		*  of the name and continue search, until no property be found,then return the last found property.
+		* \param pName The given property name
+		* \param pChildrenSeparator The given children separator string 
+		* \param pTypeInfo The given property type info
+		* \param pCaseSensitive Decide if the given property name is case sensitive
+		* \return  Return a property handle which be created with the found property. */
+		FbxPropertyHandle Find(const char* pName, const char* pChildrenSeparator, const FbxPropertyHandle& pTypeInfo, bool pCaseSensitive) const;
+	//@}
+
+	/**
+	* \name Connection management
+	*/
+	//@{
+		/** Connect source property.
+		* \param pSrc    The given source property
+		* \param pType    The given property type
+		* \return If connect successfully, return true,otherwise, return false. */
+		bool ConnectSrc(const FbxPropertyHandle& pSrc, const FbxConnection::EType pType=FbxConnection::eDefault); 
+
+		/** Get source properties' count.
+		* \param pFilter    The filter used to get sub connection point. If it is not zero, return the source count of the sub connection point.
+		* Otherwise, return the src count of this property.
+		* \return The count of source properties */
+		int GetSrcCount(FbxConnectionPointFilter* pFilter=0) const; 
+
+		/** Get source property with the given index.
+		* \param pFilter    The filter used to get sub connection point. If it is not zero, return the source property of the sub connection point.
+		* Otherwise, return the source property of this property.
+		* \param pIndex    The given index
+		* \return The source property handle. */
+		FbxPropertyHandle GetSrc(FbxConnectionPointFilter* pFilter=0, int pIndex=0) const; 
+
+		/** Disconnect source property.
+		* \param pSrc    The given source property
+		* \return If disconnect successfully, return true, otherwise return false. */
+		bool DisconnectSrc(const FbxPropertyHandle& pSrc);
+
+		/** Judge if it is connected with the given source property.
+		* \param pSrc    The given source property
+		* \return If it is connected, return true, otherwise return false. */
+		bool IsConnectedSrc(const FbxPropertyHandle& pSrc);
+
+		/** Connect destination property.
+		* \param pDst    The given destination property
+		* \param pType    The given property type
+		* \return If connect successfully, return true,otherwise, return false. */
+		bool ConnectDst(const FbxPropertyHandle& pDst, const FbxConnection::EType pType=FbxConnection::eDefault); 
+
+		/** Get destination properties' count.
+		* \param pFilter    The filter used to get sub connection point.If it is not zero,return the destination count of the sub connection point.
+		* Otherwise, return the destination count of this property.
+		* \return The count of destination properties */
+		int GetDstCount(FbxConnectionPointFilter* pFilter=0) const; 
+
+		/** Get destination property with the given index.
+		* \param pFilter    The filter used to get sub connection point.If it is not zero,return the destination property of the sub connection point.
+		* Otherwise, return the destination property of this property.
+		* \param pIndex    The given index
+		* \return The destination property handle. */
+		FbxPropertyHandle GetDst(FbxConnectionPointFilter* pFilter=0, int pIndex=0) const; 
+
+		/** Disconnect destination property.
+		* \param pDst    The given destination property
+		* \return If disconnect successfully, return true,otherwise, return false. */
+		bool DisconnectDst(const FbxPropertyHandle& pDst);
+
+		/** Judge if it is connected with the given destination property.
+		* \param pDst    The given destination property
+		* \return If it is connected, return true,otherwise, return false. */
+		bool IsConnectedDst(const FbxPropertyHandle& pDst);
+
+		//! Clear connect cache
+		void ClearConnectCache();
+
+		//! Clear all connect without sending any notification (Internal use ONLY)
+		void WipeAllConnections();
+	//@}
+
+	/** \name Limits Functions
+	* Minimum and maximum value limits can be associated with properties, but FBX 
+	* will not verify that these limits are respected. FBX however will store and 
+	* retrieve limits from files, and will assure that they are persistent in memory 
+	* while the property handle object exists. 
+	*
+	* Soft minimums and maximums values are specifying a second set of limits that can be 
+	* used for UI objects such as sliders. FBX will handle them the same way it does
+	* with the normal limits. */
+	//@{
+		/** Judge if this property has a minimum value.
+		* \return If the minimum value exist, return true,otherwise, return false. */
+		bool HasMin() const;
+
+		/** Get the minimum value and value type of this property.
+		* \param pValue    The minimum value of this property.
+		* \param pValueType The value type of this property.
+		* \return If the minimum value exist, return true,otherwise, return false. */
+		bool GetMin(void* pValue, EFbxType pValueType) const;
+
+		/** Set the minimum value and value type for this property.
+		* \param pValue    The given minimum value .
+		* \param pValueType The given value type .
+		* \return If it be set successfully, return true,otherwise, return false. */
+		bool SetMin(const void* pValue, EFbxType pValueType);
+
+		/** According the given value and its value type, set the minimum value and value type for this property.
+		* \param pValue    The given value .
+		* \return If it be set successfully, return true,otherwise, return false.
+		*/
+		template <class T> inline bool SetMin(const T& pValue){ return SetMin(&pValue, FbxTypeOf(pValue)); }
+
+		/** Get the minimum value of this property.
+		* \param pFBX_TYPE    Not used in this function. This is a dummy argument for 
+		*                     the correct instantiation of the templated function.
+		* \return The minimum value of this property */
+		template <class T> inline T GetMin(const T* pFBX_TYPE) const { T lValue; GetMin(&lValue, FbxTypeOf(lValue)); return lValue; }
+
+		/** Judge if this property has soft minimum value.
+		* \return If the soft minimum value exist, return true,otherwise, return false. */
+		bool HasSoftMin() const;
+
+		/** Get the soft minimum value and value type of this property.
+		* \param pValue    The soft minimum value of this property.
+		* \param pValueType The value type of this property.
+		* \return If the soft minimum value exist, return true,otherwise, return false. */
+		bool GetSoftMin(void* pValue, EFbxType pValueType) const;
+
+		/** Set the soft minimum value and value type for this property.
+		* \param pValue    The given soft minimum value .
+		* \param pValueType The given value type .
+		* \return If it be set successfully, return true,otherwise, return false. */
+		bool SetSoftMin(const void* pValue, EFbxType pValueType);
+
+		/** According the given value and its value type, set the soft minimum value and value type for this property.
+		* \param pValue    The given value .
+		* \return If it be set successfully, return true,otherwise, return false. */
+		template <class T> inline bool SetSoftMin(const T& pValue){ return SetSoftMin(&pValue, FbxTypeOf(pValue)); }
+
+		/** Get the soft minimum value of this property.
+		* \param pFBX_TYPE    Not used in this function. This is a dummy argument for 
+		*                     the correct instantiation of the templated function.
+		* \return The soft minimum value of this property */
+		template <class T> inline T GetSoftMin(const T* pFBX_TYPE) const { T lValue; GetSoftMin(&lValue, FbxTypeOf(lValue)); return lValue; }
+
+		/** Judge if this property has maximum value.
+		* \return If the maximum value exist, return true,otherwise, return false. */
+		bool HasMax() const;
+
+		/** Get the maximum value and value type of this property.
+		* \param pValue    The maximum value of this property.
+		* \param pValueType The value type of this property.
+		* \return If the maximum value exist, return true,otherwise, return false. */
+		bool GetMax(void* pValue, EFbxType pValueType) const;
+
+		/** Set the maximum value and value type for this property.
+		* \param pValue    The given maximum value .
+		* \param pValueType The given value type .
+		* \return If it be set successfully, return true,otherwise, return false. */
+		bool SetMax(const void* pValue, EFbxType pValueType);
+
+		/** According the given value and its value type, set the maximum value and value type for this property.
+		* \param pValue    The given value .
+		* \return If it be set successfully, return true,otherwise, return false. */
+		template <class T> inline bool SetMax(const T& pValue){ return SetMax(&pValue, FbxTypeOf(pValue)); }
+
+		/** Get the maximum value of this property.
+		* \param pFBX_TYPE    Not used in this function. This is a dummy argument for 
+		*                     the correct instantiation of the templated function.
+		* \return The maximum value of this property */
+		template <class T> inline T GetMax(const T* pFBX_TYPE) const { T lValue; GetMax(&lValue, FbxTypeOf(lValue)); return lValue; }
+
+		/** Judge if this property has soft maximum value.
+		* \return If the soft maximum value exist, return true,otherwise, return false. */
+		bool HasSoftMax() const;
+
+		/** Get the soft maximum value and value type of this property.
+		* \param pValue    The soft maximum value of this property.
+		* \param pValueType The value type of this property.
+		* \return If the soft maximum value exist, return true,otherwise, return false. */
+		bool GetSoftMax(void* pValue, EFbxType pValueType) const;
+
+		/** Set the soft maximum value and value type for this property.
+		* \param pValue    The given soft maximum value .
+		* \param pValueType The given value type .
+		* \return If it be set successfully, return true,otherwise, return false. */
+		bool SetSoftMax(const void* pValue, EFbxType pValueType);
+
+		/** According the given value and its value type, set the soft maximum value and value type for this property.
+		* \param pValue    The given value .
+		* \return If it be set successfully, return true,otherwise, return false. */
+		template <class T> inline bool SetSoftMax(const T& pValue){ return SetSoftMax(&pValue, FbxTypeOf(pValue)); }
+
+		/** Get the soft maximum value of this property.
+		* \param pFBX_TYPE    Not used in this function. This is a dummy argument for 
+		*                     the correct instantiation of the templated function.
+		* \return The soft maximum value of this property */
+		template <class T> inline T GetSoftMax(const T* pFBX_TYPE) const { T lValue; GetSoftMax(&lValue, FbxTypeOf(lValue)); return lValue; }
+	//@}
+
+	/**
+	* \name Value 
+	*/
+	//@{
+		/** Get value inherit type of this property.
+		* \param pCheckReferences   If it is true,check instance of this property page,otherwise,only check this page.
+		* \return The value inherit type of this property */
+		FbxPropertyFlags::EInheritType GetValueInheritType(bool pCheckReferences) const;
+
+		/** Set value inherit type for this property .
+		* \param pType  The given value inherit type.
+		* \return If set successfully, return true,otherwise, return false. */
+		bool SetValueInheritType(FbxPropertyFlags::EInheritType pType);
+
+		/** Get default value and value type of this property .
+		* \param pValue  The gotten default value of this property.
+		* \param pValueType The gotten default value type of this property.
+		* \return If default value be gotten successfully, return true,otherwise, return false. */
+		bool GetDefaultValue(void* pValue, EFbxType pValueType) const;
+
+		/** Get value and value type of this property .
+		* \param pValue  The gotten value of this property.
+		* \param pValueType The gotten value type of this property.
+		* \return If value be gotten successfully, return true,otherwise, return false. */
+		bool Get(void* pValue, EFbxType pValueType) const;
+
+		/** Set property value and value type for this property.
+		* \param pValue    The given property value .
+		* \param pValueType The given property value type 
+		* \param pCheckValueEquality If it is true, when the given value is equal with
+		* the property value, the property value will not be set.
+		* \return If the property value be set successfully, return true,otherwise, return false. */
+		bool Set(const void* pValue, EFbxType pValueType, bool pCheckValueEquality);
+
+		/** Set property value with the given value .
+		* \param pValue  The given value .
+		* \return If set successfully, return true,otherwise, return false. */
+		template <class T> inline bool Set(const T& pValue){ return Set(&pValue, FbxTypeOf(pValue)); }
+
+		/** get property value.
+		* \param pFBX_TYPE  Not be used.
+		* \return The gotten property value. */
+		template <class T> inline T Get(const T* pFBX_TYPE) const { T lValue; Get(&lValue, FbxTypeOf(lValue)); return lValue; }
+	//@}
+
+	/**
+	* \name Page settings
+	*/
+	//@{
+		/** Set the property page data pointer.
+		* \param pData  The given page data pointer. */
+		void SetPageDataPtr(void* pData);
+
+		/** Get property page data pointer.
+		* \return The gotten property page data pointer. */
+		void* GetPageDataPtr() const;
+	//@}
+
+	/**
+	* \name Page Internal Entry Management
+	*/
+	//@{
+		/** Push properties to parent instance.
+		* \return If push successful return true,otherwise,return false. */
+		bool PushPropertiesToParentInstance();
+	//@}
+
+	/**
+	* \name Reference Management
+	*/
+	//@{
+		/** Judge if this property page is a instance of other page.
+		* \return If this property page is a instance of other page, return true,otherwise,return false. */
+		bool IsAReferenceTo(void) const;
+
+		/** Get the property page which this property page make reference to
+		* \return The property page which this property page make reference to */
+		void* GetReferenceTo(void) const;
+
+		/** Judge if this property page is referenced by other pages.
+		* \return If this property page is referenced by other pages, return true,otherwise,return false. */
+		bool IsReferencedBy(void) const;
+
+		/** Get the count of property pages which make reference to this property page.
+		* \return The count of property pages which make reference to this property page. */
+		int GetReferencedByCount(void) const;
+
+		/** According the given index,get the property page which make reference to this property page.
+		* \param pIndex The given index
+		* \return The pointer to the property page which reference to this property page and be found by index. */
+		void* GetReferencedBy(int pIndex) const; 
+	//@}
+
+private:
+	FbxPropertyPage*	mPage;
+	FbxInt				mId;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_PROPERTY_HANDLE_H_ */

+ 1747 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxpropertypage.h

@@ -0,0 +1,1747 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxpropertypage.h
+#ifndef _FBXSDK_CORE_PROPERTY_PAGE_H_
+#define _FBXSDK_CORE_PROPERTY_PAGE_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstringlist.h>
+#include <fbxsdk/core/fbxobject.h>
+#include <fbxsdk/core/fbxsymbol.h>
+#include <fbxsdk/core/fbxpropertydef.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+typedef FbxPair<FbxInt, const char*> FbxNameMapKey;
+
+struct FbxNameMapCompare
+{
+	inline int operator()(const FbxNameMapKey& pKeyA, const FbxNameMapKey& pKeyB) const
+	{
+		if( pKeyA.mFirst < pKeyB.mFirst ) return -1;
+		else if( pKeyA.mFirst > pKeyB.mFirst ) return 1;
+		return strcmp(pKeyA.mSecond, pKeyB.mSecond);
+	}
+};
+
+class FBXSDK_DLL FbxPropertyInfo
+{
+public:
+    FBXSDK_FRIEND_NEW();
+    static FbxPropertyInfo* Create(const char* pName, FbxPropertyPage* pTypeInfo)         { return FbxNew< FbxPropertyInfo >(pName,pTypeInfo); }
+    static FbxPropertyInfo* Create(const char* pName, EFbxType   pType=eFbxUndefined)  { return FbxNew< FbxPropertyInfo >(pName,pType); }
+    void                     Destroy()  { FbxDelete(this); }
+    FbxPropertyInfo*        Clone(FbxPropertyPage* /*pPage*/)
+    {
+        // @@@@@ Filter is missing
+        // @@@@@ Clone is incomplete
+        if (mTypeInfo) 
+		{
+            return FbxNew< FbxPropertyInfo >(mName,mTypeInfo);
+        } 
+		else 
+		{
+            return FbxNew< FbxPropertyInfo >(mName,mType);
+        }
+    }
+
+    inline void IncRef() { mRef++; }
+    inline void DecRef() { mRef--; if (mRef==0) FbxDelete(this); }
+    inline int  GetRef() { return mRef; }
+
+	// Labels and Types
+
+    inline FbxStringSymbol GetName() const             { return mName; }
+    EFbxType            GetType() const;
+    FbxPropertyPage*       GetTypeInfo() const             { return mTypeInfo; }
+
+    inline void         SetLabel(const char* pLabel)    { mLabel=pLabel;          }
+    inline const char*  GetLabel() const                { return mLabel.IsEmpty() ? "" : ((const char*)mLabel); }
+
+    inline void     SetUserTag(int pUserTag)            { mUserTag=pUserTag;      }
+    inline int      GetUserTag() const                  { return mUserTag;        }
+
+    inline void     SetUserData(const void* pUserData)  { mUserData=(void*)pUserData;    }
+    inline void*   GetUserData() const                 { return mUserData;       }
+
+	// Enum list       
+    int AddEnumValue(const char* pStringValue)
+    {
+		EFbxType lType = GetType();
+        if (lType == eFbxEnum || lType == eFbxEnumM)
+        {
+            if (!mEnumList)
+                mEnumList.Reset(FbxNew< FbxStringList >());
+
+			bool lCanAdd = (lType == eFbxEnumM || mEnumList->FindIndex( pStringValue ) == -1);
+            if( lCanAdd )
+                return mEnumList->Add((char*)pStringValue);
+        }
+        return -1;
+    }
+
+    void InsertEnumValue(int pIndex, const char* pStringValue)
+    {
+        EFbxType lType = GetType();
+        if (lType == eFbxEnum || lType == eFbxEnumM)
+        {
+            if (!mEnumList)
+                mEnumList.Reset(FbxNew< FbxStringList >());
+
+			bool lCanAdd = (lType == eFbxEnumM || mEnumList->FindIndex( pStringValue ) == -1);
+            if( lCanAdd )
+				mEnumList->InsertAt(pIndex,(char*)pStringValue);
+        }
+    }
+
+    int GetEnumCount()
+    {
+        return mEnumList ? mEnumList->GetCount() : 0;
+    }
+
+    void SetEnumValue(int pIndex, const char* pStringValue)
+    {
+        EFbxType lType = GetType();
+        if (lType == eFbxEnum || lType == eFbxEnumM)
+        {
+            if (!mEnumList)
+                mEnumList.Reset(FbxNew< FbxStringList >());
+
+			bool lCanAdd = (lType == eFbxEnumM || mEnumList->FindIndex( pStringValue ) == -1);
+			if (lCanAdd)
+				mEnumList->SetStringAt(pIndex,(char*)pStringValue);
+        }
+    }
+
+    void RemoveEnumValue(int pIndex)
+    {
+        EFbxType lType = GetType();
+        if (lType == eFbxEnum || lType == eFbxEnumM)
+        {
+            if (!mEnumList)
+                mEnumList.Reset(FbxNew< FbxStringList >());
+
+            mEnumList->RemoveAt(pIndex);
+        }
+    }
+
+    char* GetEnumValue(int pIndex)
+    {
+		char* lValue = NULL;
+        EFbxType lType = GetType();
+        if (lType == eFbxEnum || lType == eFbxEnumM)
+		{
+            lValue = mEnumList ? mEnumList->GetStringAt(pIndex) : 0;
+        }
+        return lValue;
+    }
+
+
+	// Min and Max values       
+    enum EValueIndex {eValueMin, eValueSoftMin, eValueMax, eValueSoftMax, eValueCount};
+
+	bool HasMinMax(EValueIndex pId) const
+	{
+		return mMinMaxValue[pId] != NULL;
+	}
+
+	bool GetMinMax(EValueIndex pId, void* pValue, EFbxType pValueType) const
+	{
+		if (mMinMaxValue[pId]) {
+			return FbxTypeCopy(pValue, pValueType, mMinMaxValue[pId], GetType());
+		}
+		return false;
+	}
+
+	bool SetMinMax(EValueIndex pId, const void* pValue, EFbxType pValueType)
+	{
+		if (!mMinMaxValue[pId]) {
+		  size_t lSize = FbxTypeSizeOf(GetType());
+			if (lSize) {
+				mMinMaxValue[pId] = FbxMalloc(lSize);
+			}
+		}
+		if (mMinMaxValue[pId]) {
+			return FbxTypeCopy(mMinMaxValue[pId], GetType(), pValue, pValueType);
+		}
+		return false;
+	}
+
+private:
+	 FbxPropertyInfo(const char* pName, FbxPropertyPage* pTypeInfo)
+        : mRef(0)
+        , mName(pName)
+        , mType(eFbxUndefined)
+        , mTypeInfo(pTypeInfo)
+        , mUserTag(0)
+        , mUserData(0)
+        , mFilter(0)
+    {
+        for (int i=0; i<eValueCount; i++) {
+            mMinMaxValue[i] = 0;
+        }
+    }
+
+    FbxPropertyInfo(FbxStringSymbol pName,FbxPropertyPage *pTypeInfo)
+        : mRef(0)
+        , mName(pName)
+        , mType(eFbxUndefined)
+        , mTypeInfo(pTypeInfo)
+        , mUserTag(0)
+        , mUserData(0)
+        , mFilter(0)
+    {
+        for (int i=0; i<eValueCount; i++) {
+            mMinMaxValue[i] = 0;
+        }
+    }
+
+    FbxPropertyInfo(const char* pName, EFbxType pType)
+        : mRef(0)
+        , mName(pName)
+        , mType(pType)
+        , mTypeInfo(0)
+        , mUserTag(0)
+        , mUserData(0)
+        , mFilter(0)
+    {
+        for (int i=0; i<eValueCount; i++) {
+            mMinMaxValue[i] = 0;
+        }
+    }
+    ~FbxPropertyInfo()
+    {
+        for (int i=eValueMin; i<eValueCount; i++) {
+            FbxFree(mMinMaxValue[i]);
+        }
+    }
+
+    int								mRef;
+    FbxStringSymbol					mName;
+    FbxStringSymbol					mLabel;
+    EFbxType						mType;
+    FbxPropertyPage*				mTypeInfo;
+    int								mUserTag;
+    void*							mMinMaxValue[eValueCount];  
+    void*							mUserData;
+    FbxConnectionPointFilter*		mFilter;
+    FbxAutoDeletePtr<FbxStringList>	mEnumList;
+};
+
+#if defined(FBXSDK_COMPILER_MSC)
+	#pragma warning (push)
+	#pragma warning (disable: 4355)
+#endif
+
+class FBXSDK_DLL FbxPropertyConnect
+{
+public:
+    FBXSDK_FRIEND_NEW();
+    static FbxPropertyConnect* Create(FbxPropertyPage* pPage,FbxInt pId)  { return FbxNew< FbxPropertyConnect >(pPage,pId); }
+    void                        Destroy() { FbxDelete(this); }
+    FbxPropertyConnect*        Clone(FbxPropertyPage* pPage)
+    {
+        return FbxNew< FbxPropertyConnect >(pPage,mId);
+    }
+       
+    inline void IncRef() { mRef++; }
+    inline void DecRef() { mRef--; if (mRef==0) FbxDelete(this); }
+    inline int  GetRef() { return mRef; }
+
+// Properties       
+    FbxPropertyPage*   GetPage()       { return mPage; }
+    FbxInt      GetPropertyId() { return mId; }
+
+// ClearConnectCache()
+// ------------------------------------------------------
+    inline void ClearConnectCache()
+    {
+        mConnectionPoint.SubConnectRemoveAll();
+    }
+
+	//! Clear all connect without sending any notification (Internal use ONLY)
+	inline void WipeAllConnections()
+	{
+		mConnectionPoint.WipeConnectionList();
+	}
+
+// Properties        
+    inline bool ConnectSrc(FbxPropertyConnect* pSrc, FbxConnection::EType pType)
+    {
+        return mConnectionPoint.ConnectSrc(&pSrc->mConnectionPoint,pType);
+    }
+    inline bool DisconnectSrc(FbxPropertyConnect* pSrc)
+    {
+        return mConnectionPoint.DisconnectSrc(&pSrc->mConnectionPoint);
+    }
+    inline bool IsConnectedSrc(FbxPropertyConnect* pSrc)
+    {
+        return mConnectionPoint.IsConnectedSrc(&pSrc->mConnectionPoint);
+    }
+    inline int GetSrcCount(FbxConnectionPointFilter* pFilter)
+    {
+        return mConnectionPoint.GetSrcCount(pFilter);
+    }
+    inline FbxPropertyConnect* GetSrc(FbxConnectionPointFilter* pFilter, int pIndex)
+    {
+		FbxConnectionPoint *lCP = mConnectionPoint.GetSrc(pIndex,pFilter);
+        return lCP ? (FbxPropertyConnect * )lCP->GetData() : 0;
+    }
+    inline bool ConnectDst(FbxPropertyConnect* pDst, FbxConnection::EType pType)
+    {
+        return mConnectionPoint.ConnectDst(&pDst->mConnectionPoint,pType);
+    }
+    inline bool IsConnectedDst(FbxPropertyConnect* pSrc)
+    {
+        return mConnectionPoint.IsConnectedSrc(&pSrc->mConnectionPoint);
+    }
+    inline bool DisconnectDst(FbxPropertyConnect* pDst)
+    {
+        return mConnectionPoint.DisconnectDst(&pDst->mConnectionPoint);
+    }
+    inline int GetDstCount(FbxConnectionPointFilter* pFilter)
+    {
+        return mConnectionPoint.GetDstCount(pFilter);
+    }
+    inline FbxPropertyConnect* GetDst(FbxConnectionPointFilter* pFilter, int pIndex)
+    {
+		FbxConnectionPoint *lCP = mConnectionPoint.GetDst(pIndex,pFilter);
+        return lCP ? (FbxPropertyConnect * )lCP->GetData() : 0;
+    }
+
+    int					mRef;
+    FbxConnectionPoint	mConnectionPoint;
+    FbxPropertyPage*	mPage;
+    FbxInt				mId;
+
+private:
+	FbxPropertyConnect(FbxPropertyPage* pPage,FbxInt pId) :
+		mRef(0),
+		mConnectionPoint(this),
+		mPage(pPage),
+		mId(pId)
+	{
+	}
+
+	~FbxPropertyConnect(){ if( FbxObject::GetWipeMode() ) mConnectionPoint.WipeConnectionList(); }
+};
+
+#if defined(FBXSDK_COMPILER_MSC)
+	#pragma warning (pop)
+#endif
+
+class FBXSDK_DLL FbxPropertyEntry
+{
+public:
+	static FbxPropertyEntry* Create(FbxInt pParentId, FbxPropertyInfo* pInfo, FbxPropertyValue* pValue, FbxPropertyConnect* pConnect){ return FbxNew<FbxPropertyEntry>(pParentId, pInfo, pValue, pConnect); }
+
+	void Destroy() { FbxDelete(this); }
+        
+	inline FbxInt GetParentId(){ return mParentId; }
+	inline bool IsEmpty(){ return (mInfo || mValue || mConnect || mFlags.GetMask() != 0) ? false : true; }
+
+	inline FbxPropertyInfo* Get(const FbxPropertyInfo* /*pType*/){ return mInfo; }
+
+	void Set(FbxPropertyInfo* pInfo)
+	{
+		FbxPropertyInfo* lInfo = mInfo;
+		if( pInfo ) pInfo->IncRef();
+		mInfo = pInfo;
+		if( lInfo ) lInfo->DecRef();
+	}
+
+	inline FbxPropertyValue* Get(const FbxPropertyValue* /*pType*/){ return mValue; }
+
+	void Set(FbxPropertyValue* pValue)
+	{
+		FbxPropertyValue* lValue = mValue;
+		if( pValue ) pValue->IncRef();
+		mValue = pValue;
+		if( lValue ) lValue->DecRef();
+	}
+
+	inline FbxPropertyConnect* Get(const FbxPropertyConnect* /*pType*/){ return mConnect; }
+
+	void Set(FbxPropertyConnect* pConnect)
+	{
+		FbxPropertyConnect* lConnect = mConnect;
+		if( pConnect ) pConnect->IncRef();
+		mConnect = pConnect;
+		if( lConnect ) lConnect->DecRef();
+	}
+
+	inline FbxPropertyFlags* Get(const FbxPropertyFlags* /*pType*/){ return &mFlags; }
+	inline void Set(FbxPropertyFlags pType){ mFlags = pType; }
+	inline void Set(FbxPropertyFlags* pType){ mFlags = pType ? *pType : FbxPropertyFlags(FbxPropertyFlags::eNone); }
+
+private:
+	FbxPropertyEntry(FbxInt pParentId,FbxPropertyInfo *pInfo,FbxPropertyValue *pValue,FbxPropertyConnect *pConnect) :
+		mInfo(pInfo),
+		mValue(pValue),
+		mConnect(pConnect),
+		mParentId(pParentId),
+		mFlags(FbxPropertyFlags::eNone)
+	{
+		if( mInfo ) mInfo->IncRef();
+		if( mValue ) mValue->IncRef();
+		if( mConnect ) mConnect->IncRef();
+	}
+
+	~FbxPropertyEntry()
+	{
+		if( mInfo ) mInfo->DecRef();
+		if( mValue ) mValue->DecRef();
+		if( mConnect ) mConnect->DecRef();
+	}
+
+	FbxPropertyInfo*	mInfo;
+	FbxPropertyValue*	mValue;
+	FbxPropertyConnect*	mConnect;
+	FbxInt				mParentId;
+	FbxPropertyFlags	mFlags;
+
+	FBXSDK_FRIEND_NEW();
+	friend class FbxPropertyPage;
+};
+
+class FBXSDK_DLL FbxPropertyIdGenerator
+{
+public:
+	FbxPropertyIdGenerator() : mRef(0), mNextId(0) {}
+
+	inline FbxInt GetNextId() const { return mNextId; }
+	inline FbxInt GetNextIdAndInc() { return mNextId++; }
+
+	inline void IncRef() { mRef++; }
+	inline void DecRef() { mRef--; if( mRef == 0 ) FbxDelete(this); }
+
+private:
+	FbxInt mRef, mNextId;
+};
+
+class FBXSDK_DLL FbxPropertyPage
+{
+
+public:
+    FBXSDK_FRIEND_NEW();
+    static FbxPropertyPage* Create (FbxPropertyPage* pInstanceOf=0)       { return FbxNew< FbxPropertyPage >(pInstanceOf);     }
+    static FbxPropertyPage*     Create (const char* pName, FbxPropertyPage* pTypeInfo)    { return FbxNew< FbxPropertyPage >(pName,pTypeInfo); }
+    static FbxPropertyPage*     Create (const char* pName, EFbxType    pType=eFbxUndefined)     { return FbxNew< FbxPropertyPage >(pName,pType);     }
+    void                     Destroy() { FbxDelete(this); }
+
+	template<class T> inline T* GetPropertyItem(const T* pItemType,FbxInt pIndex,FbxPropertyPage **pFoundIn=0) const
+    {
+      FbxPropertyPage*     lReferencePage = 0;
+      FbxPropertyEntry*    lReferenceEntry = GetPropertyEntry(pIndex,&lReferencePage);
+        if (pFoundIn) *pFoundIn = 0;
+        if (lReferenceEntry) {
+          T* lItem = lReferenceEntry->Get( FBX_TYPE(T) );
+            if (lItem) {
+                if (pFoundIn) *pFoundIn = lReferencePage;
+                return lItem;
+            } else {
+                return lReferencePage->mInstanceOf ? lReferencePage->mInstanceOf->GetPropertyItem(pItemType,pIndex,pFoundIn) : 0 ;
+            }
+        }
+        return 0;
+    }
+
+	template<class T> inline T* ChangePropertyItemState(const T* pItemType, FbxInt pIndex, FbxPropertyFlags::EInheritType pInheritType)
+	{
+		FbxPropertyPage*	lReferencePage = NULL;
+		T*					lItem = GetPropertyItem(pItemType, pIndex, &lReferencePage);
+		if( pInheritType == FbxPropertyFlags::eOverride )
+		{
+			if( lReferencePage == this )
+			{
+				return lItem;
+			}
+			else if( lItem )
+			{
+				FbxPropertyEntry* lEntry = ChangePropertyEntryState(pIndex, FbxPropertyFlags::eOverride);
+				lEntry->Set(lItem->Clone(this));
+				return lEntry->Get(FBX_TYPE(T));
+			}
+		}
+		else
+		{
+			// can't inherit entries that were created on our page.
+			bool lOwnEntry = !mInstanceOf || (mInstanceOf->GetPropertyItem(pItemType, pIndex) == NULL);
+			if( lOwnEntry && FbxPropertyFlags::eInherit == pInheritType) return 0;
+
+			if( lItem && (lReferencePage == this) )
+			{
+				FbxPropertyEntry* lEntry = GetPropertyEntry(pIndex);
+				lEntry->Set((T*)0);
+				if( lEntry->IsEmpty() )
+				{
+					ChangePropertyEntryState(pIndex, FbxPropertyFlags::eInherit);
+				}
+			}
+			return 0;
+		}
+		return 0;
+	}
+
+	template<class T> FbxPropertyPage* GetFirstPropertyItem(FbxInt pId, const T* pItem) const
+	{
+		FbxPropertyPage* lReferencePage = NULL;
+		GetPropertyItem(FBX_TYPE(T), pId, &lReferencePage);
+		if( lReferencePage && lReferencePage->mInstanceOf )
+		{
+			FbxPropertyPage* lReferencePage2 = lReferencePage->mInstanceOf->GetFirstPropertyItem(pId, pItem);
+			return lReferencePage2 ? lReferencePage2 : lReferencePage;
+		}
+		return lReferencePage;
+	}
+
+    const char* GetName(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        return lPropertyInfo ? ((const char*)lPropertyInfo->GetName()) : "";
+    }
+
+    const char* GetLabel(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        return lPropertyInfo ? ((const char*)lPropertyInfo->GetLabel()) : "";
+    }
+
+    bool SetLabel(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT, const char* pLabel="")
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        // Don't make it writeable (Keep it shared)
+		if (lPropertyInfo) {
+			lPropertyInfo->SetLabel(pLabel);
+			return true;
+		} else {
+			return false;
+        }
+    }
+
+    void* GetUserData(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        return lPropertyInfo ? lPropertyInfo->GetUserData() : 0;
+    }
+
+    bool SetUserData(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT, const void* pUserData=0)
+    {
+      FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+          // Don't make it writeable (Keep it shared)
+          if (lPropertyInfo) {
+              lPropertyInfo->SetUserData(pUserData);
+              return true;
+          } else {
+              return false;
+          }
+    }
+
+    int GetUserTag(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT)
+    {
+      FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        return lPropertyInfo ? lPropertyInfo->GetUserTag() : 0;
+    }
+
+    bool SetUserTag(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT,int pUserTag=0)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+          // Don't make it writeable (Keep it shared)
+		if (lPropertyInfo) {
+			lPropertyInfo->SetUserTag(pUserTag);
+			return true;
+		} else {
+			return false;
+		}
+    }
+
+    EFbxType GetType(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT) const
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        return lPropertyInfo ? lPropertyInfo->GetType() : eFbxUndefined;
+    }
+
+    FbxInt GetParent(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT) const
+    {
+		FbxPropertyEntry* lPropertyEntry = GetPropertyEntry( pId );
+        return lPropertyEntry ? lPropertyEntry->GetParentId() : FBXSDK_PROPERTY_ID_NULL;
+    }
+
+    FbxPropertyPage* GetTypeInfo(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        return lPropertyInfo ? lPropertyInfo->GetTypeInfo() : 0;
+    }
+    FbxInt Add(FbxInt pParentId, const char* pName, EFbxType pType)
+    {
+        return Add(pParentId,FbxPropertyInfo::Create(pName,pType),FbxPropertyValue::Create(0,pType),0);
+    }
+    FbxInt Add(FbxInt pParentId, const char* pName, FbxPropertyPage* pTypeInfo)
+    {
+        return Add(pParentId,FbxPropertyInfo::Create(pName,pTypeInfo),FbxPropertyValue::Create(0,pTypeInfo->GetType()),0);
+    }
+
+    inline bool Reparent( FbxInt /*pChildId*/, FbxInt /*pNewParentId*/ )
+    {
+        // Not implemented.
+        /*
+        if( GetParent(pChildId) != pNewParentId  && pChildId < mEntries.GetCount() )
+        {
+            FbxPropertyEntry* lChildEntry = mEntries[pChildId];
+            lChildEntry->mParentId = pNewParentId;
+
+            //@@@@@ TODO: propagate to instances
+
+            return true;
+        }
+        */
+        return false;
+    }
+
+    inline bool IsChildOf(FbxInt pId,FbxInt pParentId) const
+    {
+        return GetParent(pId)==pParentId;
+
+    }
+
+    inline bool IsDescendentOf(FbxInt pId,FbxInt pAncestorId) const
+    {
+		if (pAncestorId>0) {
+            FbxInt lParentId = GetParent(pId);
+            while (lParentId != FBXSDK_PROPERTY_ID_NULL ) {
+                if (lParentId==pAncestorId) {
+                    return true;
+                }
+                lParentId = GetParent(lParentId);
+            }
+            return false;
+        } else {
+            return true;
+        }
+
+    }
+
+    //#define PROPERTY_PAGE_SANITY_CHECK  // Debug purpose only. Never enable it in a production release.
+
+    /** Retrieves the first child property id of a specified property id.
+    * \param pParentId The specified property id
+    * \return the first child property id
+    */
+    FbxInt GetChild(FbxInt pParentId=FBXSDK_PROPERTY_ID_ROOT) const
+    {
+    #ifdef PROPERTY_PAGE_SANITY_CHECK
+        FbxInt ret0 = FBXSDK_PROPERTY_ID_NULL;
+            if (pParentId!=FBXSDK_PROPERTY_ID_NULL) {
+            FbxInt       lId        = GetMinimumPropertyId(pParentId);
+            FbxInt       lParentId  = GetParent(lId);
+            const FbxInt lLastId    = GetPropertyEntryCount();
+
+            while (lId<lLastId && lParentId!=pParentId) lParentId=GetParent(++lId);
+            ret0 = lId<lLastId ? lId : FBXSDK_PROPERTY_ID_NULL;
+        } else {
+            ret0 = FBXSDK_PROPERTY_ID_NULL;
+        }
+    #endif
+        FbxInt ret1 = FBXSDK_PROPERTY_ID_NULL;
+        if (pParentId != FBXSDK_PROPERTY_ID_NULL)
+        {
+            FbxPropertyEntry* lEntry;
+            FbxInt lId = pParentId;
+            do 
+            {
+                lId = GetMinimumPropertyIdAndEntry(lId, &lEntry);
+            } while (lId != FBXSDK_PROPERTY_ID_NULL && lEntry->GetParentId() != pParentId);
+            ret1 = lId;
+        }
+    #ifdef PROPERTY_PAGE_SANITY_CHECK
+        FBX_ASSERT(ret0==ret1);
+    #endif
+        return ret1;
+    }
+
+    /** Retrieves the next sibling property id of a specified property id.
+    * \param pId The specified property id
+    * \return the next sibling property id
+    */
+    FbxInt GetSibling(FbxInt pId) const
+    {
+    #ifdef PROPERTY_PAGE_SANITY_CHECK
+        FbxInt pIdBackup = pId;
+        FbxInt ret0 = FBXSDK_PROPERTY_ID_NULL;
+        if (pId!=FBXSDK_PROPERTY_ID_NULL) {
+            FbxInt       lReferenceParentId = GetParent(pId);
+            FbxInt       lParentId          = GetParent(++pId);
+            const FbxInt lLastId            = GetPropertyEntryCount();
+
+            while (pId<lLastId && lReferenceParentId!=FBXSDK_PROPERTY_ID_NULL && lParentId!=lReferenceParentId)
+                lParentId=GetParent(++pId);
+            ret0 = pId<lLastId ? pId : FBXSDK_PROPERTY_ID_NULL;
+        } else {
+            ret0 = FBXSDK_PROPERTY_ID_NULL;
+        }
+        pId = pIdBackup;
+    #endif
+        FbxInt ret1 = FBXSDK_PROPERTY_ID_NULL;
+        if (pId != FBXSDK_PROPERTY_ID_NULL)
+        {
+            FbxInt lReferenceParentId = GetParent(pId);
+
+            if (lReferenceParentId != FBXSDK_PROPERTY_ID_NULL)
+            {
+                FbxPropertyEntry *lEntry;
+                do 
+                {
+                    pId = GetMinimumPropertyIdAndEntry(pId, &lEntry);
+                } while (pId != FBXSDK_PROPERTY_ID_NULL && lEntry->GetParentId() != lReferenceParentId);
+
+                ret1 = pId;
+            }
+        }
+
+    #ifdef PROPERTY_PAGE_SANITY_CHECK
+        FBX_ASSERT(ret0==ret1);
+    #endif
+        return ret1;
+    }
+
+    /** Retrieves the first descendent property id of a specified property id.
+    * \param pAnscestorId The specified property id
+    * \return the first descendent property id
+    */
+    FbxInt GetFirstDescendent(FbxInt pAnscestorId=FBXSDK_PROPERTY_ID_ROOT) const
+    {
+    #ifdef PROPERTY_PAGE_SANITY_CHECK
+        FbxInt ret0 = FBXSDK_PROPERTY_ID_NULL;
+        if (pAnscestorId!=FBXSDK_PROPERTY_ID_NULL) {
+            FbxInt       lId        = GetMinimumPropertyId(pAnscestorId);
+            FbxInt       lParentId  = GetParent(lId);
+            const FbxInt lLastId    = GetPropertyEntryCount();
+
+            while (lId<lLastId) {
+                if( lParentId!=FBXSDK_PROPERTY_ID_NULL && IsDescendentOf(lId,pAnscestorId) )
+                {
+                    ret0 = lId;
+                    break;
+                }
+                lParentId = GetParent(++lId);
+            }
+        }
+    #endif
+        FbxInt ret1 = FBXSDK_PROPERTY_ID_NULL;
+        FbxInt lId = pAnscestorId;
+        FbxPropertyEntry* lEntry;
+        if (pAnscestorId != FBXSDK_PROPERTY_ID_NULL)
+        {
+            for(;;)
+            {
+                lId  = GetMinimumPropertyIdAndEntry(lId, &lEntry);
+                if (lId == FBXSDK_PROPERTY_ID_NULL)
+                    break;
+                if(lEntry->GetParentId() != FBXSDK_PROPERTY_ID_NULL && IsDescendentOf(lId, pAnscestorId))
+                {
+                    ret1 = lId;
+                    break;
+                }
+            }
+        }
+
+    #ifdef PROPERTY_PAGE_SANITY_CHECK
+        FBX_ASSERT(ret0==ret1);
+    #endif
+        return ret1;
+    }
+
+    /** Retrieves the next descendent property id of a specified property id, with given a descendent property id.
+    * \param pAnscestorId The specified property id
+    * \param pId The descendent property id
+    * \return the next descendent property id
+    */
+    FbxInt GetNextDescendent(FbxInt pAnscestorId, FbxInt pId) const
+    {
+    #ifdef PROPERTY_PAGE_SANITY_CHECK
+        FbxInt pIdBackup = pId;
+        FbxInt ret0 = FBXSDK_PROPERTY_ID_NULL;
+        if (pId!=FBXSDK_PROPERTY_ID_NULL) {
+            FbxInt       lParentId  = GetParent(++pId);
+            const FbxInt lLastId    = GetPropertyEntryCount();
+
+            while (pId<lLastId) {
+                // GetParent returns null when the given id isn't in our page,
+                // or our ancestor's page.
+                if( lParentId != FBXSDK_PROPERTY_ID_NULL && IsDescendentOf(pId, pAnscestorId) )
+                {
+                    ret0 = pId;
+                    break;
+                }
+
+                lParentId = GetParent(++pId);
+            }
+        }
+        
+        pId = pIdBackup;
+    #endif
+        FbxInt ret1 = FBXSDK_PROPERTY_ID_NULL;
+        if (pId != FBXSDK_PROPERTY_ID_NULL)
+        {
+            FbxPropertyEntry* lEntry;
+            for(;;)
+            {
+                pId = GetMinimumPropertyIdAndEntry(pId, &lEntry);
+                if (pId == FBXSDK_PROPERTY_ID_NULL)
+                    break;
+                if(lEntry->GetParentId() != FBXSDK_PROPERTY_ID_NULL && IsDescendentOf(pId, pAnscestorId) )
+                {
+                    ret1 = pId;
+                    break;
+                }
+            }
+
+        }
+    #ifdef PROPERTY_PAGE_SANITY_CHECK
+        FBX_ASSERT(ret0==ret1);
+    #endif
+        return ret1;
+
+    }
+
+    FbxInt FastFind (FbxInt pId, const char* pName, FbxPropertyPage* pTypeInfo, bool pCaseSensitive)
+    {
+        FbxInt lId = FBXSDK_PROPERTY_ID_NULL;
+
+        bool lSlowQuery = true;
+        if( mNameMap.mSecond.GetSize() > 0 )
+        {
+            lSlowQuery = false;
+            // try to use the map if we've got it
+            NameMap::RecordType* lIterator = mNameMap.mSecond.Find( FbxNameMapKey( pId, pName ) );
+            if( !lIterator )
+            {
+                lId = FBXSDK_PROPERTY_ID_NULL;
+            }
+            else
+            {
+                lId = lIterator->GetValue();
+                if (lId != FBXSDK_PROPERTY_ID_NULL && pTypeInfo)
+                {
+                    lSlowQuery = true;
+
+                    // Try to match types.
+                    // If they are mismatched, fall back to the slow query,
+                    // since we might have multiple property with the same name but different types
+                    FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo), lId );
+                    if (lPropertyInfo)
+                    {
+                        FbxPropertyPage* lTypeInfo2 = lPropertyInfo->GetTypeInfo();
+                        if ( lTypeInfo2 && lTypeInfo2->Is(pTypeInfo) )
+                        {
+                            lSlowQuery = false;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (!lSlowQuery)
+            return lId;
+
+        // fall back if there's no map or we got one with a different type
+
+        lId = GetChild(pId);
+        FbxStringSymbol lSearchSymbol( pName );
+        while( lId != FBXSDK_PROPERTY_ID_NULL ) {
+			FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo), lId );
+            if  ( (!pTypeInfo || lPropertyInfo->GetTypeInfo()->Is(pTypeInfo)) &&
+                ((!pCaseSensitive && FBXSDK_stricmp(lPropertyInfo->GetName(),pName)==0) ||
+                (pCaseSensitive && lPropertyInfo->GetName() == lSearchSymbol)) ) {
+                return lId;
+            }
+            lId = GetSibling(lId);
+        }
+
+        return FBXSDK_PROPERTY_ID_NULL;
+    }
+
+    FbxInt Find (FbxInt pId, const char* pName, FbxPropertyPage* pTypeInfo, bool pCaseSensitive, const char* pChildrenSeparators )
+    {
+		if (pChildrenSeparators) 
+		{
+			FbxInt	lId;
+			size_t	lFoundIndex = strcspn(pName,pChildrenSeparators);
+
+            // Strip the first part of the name and search
+            if (lFoundIndex<strlen(pName)) 
+			{
+				FbxString	pRootName;
+                pRootName.Append(pName,lFoundIndex);
+                lId = FastFind(pId,pRootName.Buffer(),NULL,pCaseSensitive);
+                return lId != FBXSDK_PROPERTY_ID_NULL ? Find(lId,pName+lFoundIndex+1,pTypeInfo,pCaseSensitive,pChildrenSeparators) : lId;
+            } else {
+                return FastFind(pId,pName,pTypeInfo,pCaseSensitive);
+            }
+        } else {
+            return FastFind(pId,pName,pTypeInfo,pCaseSensitive);
+        }
+    }
+
+// Enum list        
+    int AddEnumValue(FbxInt pId, const char* pStringValue)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        // Don't make it writeable (Keep it shared)
+        return lPropertyInfo ? lPropertyInfo->AddEnumValue(pStringValue) : - 1;
+    }
+
+    void InsertEnumValue(FbxInt pId, int pIndex, const char* pStringValue)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        // Don't make it writeable (Keep it shared)
+        if (lPropertyInfo) lPropertyInfo->InsertEnumValue(pIndex,pStringValue);
+    }
+
+    int GetEnumCount(FbxInt pId)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        // Don't make it writeable (Keep it shared)
+        return lPropertyInfo ? lPropertyInfo->GetEnumCount() : 0;
+    }
+
+    void SetEnumValue(FbxInt pId, int pIndex, const char* pStringValue)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        // Don't make it writeable (Keep it shared)
+        if (lPropertyInfo) lPropertyInfo->SetEnumValue(pIndex,pStringValue);
+    }
+
+    void RemoveEnumValue(FbxInt pId, int pIndex)
+    {
+		 FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        // Don't make it writeable (Keep it shared)
+        if (lPropertyInfo) lPropertyInfo->RemoveEnumValue(pIndex);
+    }
+
+    char* GetEnumValue(FbxInt pId,int pIndex)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        return lPropertyInfo ? lPropertyInfo->GetEnumValue(pIndex) : (char*)"";
+    }
+
+    // Connection
+    // ---------------------------------
+    void ClearConnectCache(FbxInt pId)
+    {
+		FbxPropertyPage*     lReferencePage = 0;
+		FbxPropertyConnect*	lPropertyConnect = GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pId,&lReferencePage );
+
+        // Connections are not considered propagated so
+        // make sure that we own the FbxPropertyConnect objects
+        if (lPropertyConnect) {
+            lPropertyConnect->ClearConnectCache();
+        }
+    }
+
+	void WipeAllConnections(FbxInt pId)
+	{
+        FbxPropertyPage*		lReferencePage = 0;
+        FbxPropertyConnect*	lPropertyConnect = GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pId,&lReferencePage );
+
+        if (lPropertyConnect) {
+            lPropertyConnect->WipeAllConnections();
+        }
+	}
+
+    bool ConnectSrc(FbxInt pDstId, FbxPropertyPage* pSrcPage, FbxInt pSrcId, FbxConnection::EType pType)
+    {
+		FbxPropertyEntry*    lDstEntry = ChangePropertyEntryState(pDstId,FbxPropertyFlags::eOverride);
+		FbxPropertyEntry*    lSrcEntry = pSrcPage->ChangePropertyEntryState(pSrcId,FbxPropertyFlags::eOverride);
+		FbxPropertyConnect*  lDstConnect= lDstEntry->Get( FBX_TYPE(FbxPropertyConnect) );
+		FbxPropertyConnect*  lSrcConnect= lSrcEntry->Get( FBX_TYPE(FbxPropertyConnect) );
+
+        // Make sure we have a connection point on both sides of the connection
+        if (!lDstConnect) {
+            lDstConnect = FbxPropertyConnect::Create( this,pDstId );
+            lDstEntry->Set( lDstConnect );
+        }
+        if (!lSrcConnect) {
+            lSrcConnect = FbxPropertyConnect::Create( pSrcPage,pSrcId );
+            lSrcEntry->Set( lSrcConnect );
+        }
+
+        // Must @@@@@@@ Propagate to inherited children
+        return lDstConnect->ConnectSrc(lSrcConnect,pType);
+
+    }
+
+    bool DisconnectSrc(FbxInt pDstId,FbxPropertyPage* pSrcPage,FbxInt pSrcId)
+    {
+		FbxPropertyPage*		lDstReferencePage	= 0;
+		FbxPropertyConnect*	lDstConnect			= GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pDstId,&lDstReferencePage );
+		FbxPropertyPage*		lSrcReferencePage	= 0;
+		FbxPropertyConnect*	lSrcConnect			= pSrcPage->GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pSrcId,&lSrcReferencePage );
+
+        // Make sure we have a connection point on both sides of the connection
+        if (lDstConnect && lSrcConnect && lDstReferencePage==this && lSrcReferencePage==pSrcPage) {
+            // Must @@@@@@@ Remove unused connections
+            return lDstConnect->DisconnectSrc(lSrcConnect);
+        }
+        return false;
+    }
+
+    bool IsConnectedSrc(FbxInt pDstId, FbxPropertyPage* pSrcPage, FbxInt pSrcId)
+    {
+		FbxPropertyPage*		lDstReferencePage	= 0;
+		FbxPropertyConnect*	lDstConnect			= GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pDstId,&lDstReferencePage );
+		FbxPropertyPage*		lSrcReferencePage	= 0;
+		FbxPropertyConnect*	lSrcConnect			= pSrcPage->GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pSrcId,&lSrcReferencePage );
+
+        // Make sure we have a connection point on both sides of the connection
+        if (lDstConnect && lSrcConnect && lDstReferencePage==this && lSrcReferencePage==pSrcPage) {
+            // Must @@@@@@@ Remove unused connections
+            return lDstConnect->IsConnectedSrc(lSrcConnect);
+        }
+        return false;
+    }
+
+    int GetSrcCount(FbxInt pId, FbxConnectionPointFilter* pFilter)
+    {
+		FbxPropertyPage*		lReferencePage		= 0;
+		FbxPropertyConnect*	lPropertyConnect	= GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pId,&lReferencePage );
+
+        // Connections are not considered propagated so
+        // make sure that we own the FbxPropertyConnect objects
+        return (lPropertyConnect && lReferencePage==this) ? lPropertyConnect->GetSrcCount(pFilter) : 0;
+    }
+
+    bool GetSrc(FbxInt pId, int pIndex, FbxConnectionPointFilter* pFilter, FbxPropertyPage** pSrcPage, FbxInt* pSrcId)
+    {
+		FbxPropertyPage*		lReferencePage		= 0;
+		FbxPropertyConnect*	lPropertyConnect	= GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pId,&lReferencePage );
+
+        // Connections are always overridden
+        // make sure that we own the FbxPropertyConnect Item
+        if (lPropertyConnect && lReferencePage==this) 
+		{
+			FbxPropertyConnect* lSrc = lPropertyConnect->GetSrc(pFilter,pIndex);
+            if (lSrc) 
+			{
+                if (pSrcPage)   *pSrcPage = lSrc->GetPage();
+                if (pSrcId)     *pSrcId   = lSrc->GetPropertyId();
+                return true;
+            }
+        }
+        return false;
+    }
+
+    bool ConnectDst(FbxInt pSrcId, FbxPropertyPage* pDstPage, FbxInt pDstId, FbxConnection::EType pType)
+    {
+        return pDstPage->ConnectSrc(pDstId,this,pSrcId,pType);
+    }
+
+    bool DisconnectDst(FbxInt pSrcId, FbxPropertyPage* pDstPage, FbxInt pDstId)
+    {
+        return pDstPage->DisconnectSrc(pDstId,this,pSrcId);
+    }
+
+    bool IsConnectedDst(FbxInt pSrcId, FbxPropertyPage* pDstPage, FbxInt pDstId)
+    {
+        return pDstPage->IsConnectedSrc(pDstId,this,pSrcId);
+    }
+
+    int GetDstCount(FbxInt pId, FbxConnectionPointFilter* pFilter)
+    {
+		FbxPropertyPage*		lReferencePage	 = 0;
+		FbxPropertyConnect*	lPropertyConnect = GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pId,&lReferencePage );
+
+        // Connections are not considered propagated so
+        // make sure that we own the FbxPropertyConnect objects
+        return (lPropertyConnect && lReferencePage==this) ? lPropertyConnect->GetDstCount(pFilter) : 0;
+    }
+
+    bool GetDst(FbxInt pId, int pIndex, FbxConnectionPointFilter* pFilter, FbxPropertyPage** pDstPage, FbxInt* pDstId)
+    {
+		FbxPropertyPage*		lReferencePage	 = 0;
+		FbxPropertyConnect*	lPropertyConnect = GetPropertyItem( FBX_TYPE(FbxPropertyConnect),pId,&lReferencePage );
+
+        // Connections are always overridden
+        // make sure that we own the FbxPropertyConnect Item
+        if (lPropertyConnect && lReferencePage==this)
+		{
+			FbxPropertyConnect* lDst = lPropertyConnect->GetDst(pFilter,pIndex);
+            if (lDst) 
+			{
+                if (pDstPage)   *pDstPage = lDst->GetPage();
+                if (pDstId)     *pDstId   = lDst->GetPropertyId();
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // Min and Max
+    // ---------------------------------
+    enum EValueIndex { eValueMin,eValueSoftMin,eValueMax,eValueSoftMax,eValueCount };
+
+	bool HasMinMax(FbxInt pId, FbxPropertyInfo::EValueIndex pValueId) const
+	{
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+	
+		return lPropertyInfo ? lPropertyInfo->HasMinMax(pValueId) : false;
+	}
+
+    bool GetMinMax(FbxInt pId, FbxPropertyInfo::EValueIndex pValueId, void* pValue, EFbxType pValueType)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        // Don't make it writeable (Keep it shared)
+        return lPropertyInfo ? lPropertyInfo->GetMinMax(pValueId,pValue,pValueType) : false;
+    }
+
+    bool SetMinMax(FbxInt pId, FbxPropertyInfo::EValueIndex pValueId, const void* pValue, EFbxType pValueType)
+    {
+		FbxPropertyInfo* lPropertyInfo = GetPropertyItem( FBX_TYPE(FbxPropertyInfo),pId );
+        // Don't make it writeable (Keep it shared)
+        return lPropertyInfo ? lPropertyInfo->SetMinMax(pValueId,pValue,pValueType) : false;
+    }
+
+    // Value
+    // ---------------------------------
+    bool Get(FbxInt pId, void* pValue, EFbxType pValueType)
+    {
+		FbxPropertyValue* lPropertyValue = GetPropertyItem( FBX_TYPE(FbxPropertyValue),pId );
+        return lPropertyValue ? lPropertyValue->Get(pValue,pValueType) : 0;
+    }
+
+    bool Set(FbxInt pId, const void* pValue, EFbxType pValueType, bool pCheckValueEquality)
+    {
+        if( pCheckValueEquality )
+        {
+            FbxPropertyPage*   lReferencePage  = NULL;
+            FbxPropertyValue*  lPropertyValue  = GetPropertyItem( FBX_TYPE(FbxPropertyValue),pId,&lReferencePage );
+            void* lCurrentValue = FbxTypeAllocate( pValueType );
+            bool lValuesEqual = false;
+            bool lValueChanged = false;
+            if( lReferencePage && lReferencePage != this )
+            {
+                // this page inherits, so check if we have to override the value.
+                if( lPropertyValue )
+                {
+                    lPropertyValue->Get( lCurrentValue, pValueType );
+                    lValuesEqual = FbxTypeCompare( pValue, lCurrentValue, pValueType );
+                }
+            }
+            else
+            {
+                FbxPropertyPage* lReferencePage2 = NULL;
+                FbxPropertyValue*  lPropertyValue2 = mInstanceOf ? mInstanceOf->GetPropertyItem( FBX_TYPE(FbxPropertyValue),pId,&lReferencePage2 ) : NULL;
+                if( lReferencePage2 && lPropertyValue2 )
+                {
+                    // this page is an override, but there is another page before us that overrides the value
+                    lPropertyValue2->Get( lCurrentValue, pValueType );
+                    lValuesEqual = FbxTypeCompare( pValue, lCurrentValue, pValueType );
+
+                    if( lValuesEqual )
+                    {
+                        ChangePropertyItemState( FBX_TYPE(FbxPropertyValue), pId, FbxPropertyFlags::eInherit );
+                        lValueChanged = true;
+                    }
+
+                }
+                // else this page is the originator of the property, so no need to check,
+            }
+
+            FbxTypeDeallocate(pValueType, lCurrentValue);
+            lCurrentValue = NULL;
+
+            if( lValuesEqual )
+                return lValueChanged;
+        }
+
+        FbxPropertyValue* lPropertyValue = ChangePropertyItemState( FBX_TYPE(FbxPropertyValue),pId,FbxPropertyFlags::eOverride );
+        return lPropertyValue ? lPropertyValue->Set(pValue,pValueType) : false;
+    }
+
+	inline FbxPropertyFlags::EInheritType GetValueInherit(FbxInt pId, bool pCheckInstanceOf) const
+	{
+		FbxPropertyPage* lReferencePage = NULL;
+		GetPropertyItem(FBX_TYPE(FbxPropertyValue), pId, &lReferencePage);
+
+		// check one level
+		if( !pCheckInstanceOf )
+		{
+			return lReferencePage == this ? FbxPropertyFlags::eOverride : FbxPropertyFlags::eInherit;
+		}
+		else
+		{
+			if( lReferencePage == this ) return FbxPropertyFlags::eOverride;			// this page is either an override, or the originator
+			else if( !lReferencePage->mInstanceOf ) return FbxPropertyFlags::eInherit;	// the reference is the class root, so we must be inheriting
+
+			// The reference page is not the class root, might be another override, or the originator.
+			FbxPropertyValue* lPropertyValue = lReferencePage->mInstanceOf->GetPropertyItem( FBX_TYPE(FbxPropertyValue), pId );
+
+			// if lReferencePage->mInstanceOf has the property value,
+			//      lReferencePage is an override
+			//  else
+			//      its the originator, so this page inherits from it.
+			return lPropertyValue ? FbxPropertyFlags::eOverride : FbxPropertyFlags::eInherit;
+		}
+	}
+
+    inline bool SetValueInherit(FbxInt pId, FbxPropertyFlags::EInheritType pType)
+    {
+        // no support for this mode yet
+        if( FbxPropertyFlags::eDeleted == pType )
+            return false;
+
+        ChangePropertyItemState( FBX_TYPE(FbxPropertyValue), pId, pType );
+
+        // Above call doesn't return error codes, so just check that we match types.
+        return GetValueInherit(pId, false) == pType;
+    }
+
+    inline bool GetDefaultValue(FbxInt pId, void* pValue, EFbxType pValueType) const
+    {
+        FbxPropertyPage*	lReferencePage = GetFirstPropertyItem( pId, FBX_TYPE(FbxPropertyValue) );
+        FbxPropertyValue*	lPropertyValue = lReferencePage ? lReferencePage->GetPropertyItem( FBX_TYPE(FbxPropertyValue), pId ) : NULL;
+
+        return lPropertyValue ? lPropertyValue->Get( pValue, pValueType ) : false;
+    }
+
+
+    // useful set and get functions
+    template <class T> inline bool  Set( FbxInt pId, const T& pValue )    { return Set( pId,&pValue,FbxTypeOf(pValue),true ); }
+    template <class T> inline T     Get( FbxInt pId, const T* pFBX_TYPE)  { T lValue; Get( pId,&lValue,FbxTypeOf(lValue) ); return lValue; }
+
+
+	void    SetDataPtr(void* pDataPtr)  { mDataPtr = pDataPtr; }
+	void*   GetDataPtr() const          { return mDataPtr; }
+
+	// Instance and override management
+	// ------------------------------------------
+	void    PushPropertiesToParentInstance()
+	{
+		if (mInstanceOf) {
+			const int lCount = GetPropertyEntryCount();
+			// push the existing properties into the parent
+			// ----------------------------------------------
+			for( int i = 0; i < lCount; ++i )
+			{
+			  FbxPropertyEntry* lParentEntry = mInstanceOf->ChangePropertyEntryState( (FbxInt)i,FbxPropertyFlags::eOverride );
+			  FbxPropertyEntry* lEntry       = GetPropertyEntry( (FbxInt)i );
+
+				if( !lParentEntry )
+				{
+					lParentEntry = FbxPropertyEntry::Create( lEntry->GetParentId(), 0, 0, 0 );
+					mInstanceOf->mEntryMap.Insert( i, lParentEntry );
+
+					//mInstanceOf->AddChild(i);
+
+				}
+
+				FBX_ASSERT( lParentEntry );
+
+				// Add it to the parent
+				// Don't touch the connections
+				// -----------------------------------------
+				if (lParentEntry) {
+					lParentEntry->Set( lEntry->Get(FBX_TYPE(FbxPropertyInfo))  );
+					lParentEntry->Set( lEntry->Get(FBX_TYPE(FbxPropertyValue)) );
+					lParentEntry->Set( lEntry->Get(FBX_TYPE(FbxPropertyFlags)) );
+				}
+
+				/*
+				else {
+					mInstanceOf->Add(
+						lEntry->GetParentId(),
+						lEntry->Get(FBX_TYPE(FbxPropertyInfo)),        // The info
+						lEntry->Get(FBX_TYPE(FbxPropertyValue)),       // The Value
+						0,                                              // The connections
+						false,
+						false
+					);
+				}
+				*/
+
+				// Empty the current entry
+				// Don't touch the connections
+				// -----------------------------------------
+				ChangePropertyItemState(FBX_TYPE(FbxPropertyInfo),  i,FbxPropertyFlags::eInherit);
+				ChangePropertyItemState(FBX_TYPE(FbxPropertyValue), i,FbxPropertyFlags::eInherit);
+				ChangePropertyItemState(FBX_TYPE(FbxPropertyFlags), i,FbxPropertyFlags::eInherit);
+			}
+		}
+	}
+
+	inline const FbxPropertyPage*  GetInstanceOf() const   { return mInstanceOf; }
+	inline FbxPropertyPage*        GetInstanceOf()         { return mInstanceOf; }
+
+	inline const FbxArray<FbxPropertyPage*>&     GetInstances() const    { return mInstances; }
+	inline FbxArray<FbxPropertyPage*>&           GetInstances()          { return mInstances; }
+
+
+	// Flags
+	// ------------------------------------------
+	FbxPropertyFlags::EFlags GetFlags(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT) const
+	{
+		FbxPropertyPage* lFoundIn = NULL;
+		FbxPropertyFlags*  lPropertyFlags = GetPropertyItem( FBX_TYPE(FbxPropertyFlags), pId, &lFoundIn );
+		FbxPropertyFlags::EFlags lFlags = FbxPropertyFlags::eNone;
+
+		if( lPropertyFlags )
+		{
+			if( !mInstanceOf ) // no inheritance.
+				lFlags = lPropertyFlags->GetFlags();
+			else
+			{
+				lFlags = mInstanceOf->GetFlags(pId);
+				lFlags = lPropertyFlags->GetMergedFlags(lFlags);
+			}
+		}
+		return lFlags;
+	}
+
+	bool ModifyFlags(FbxInt pId=FBXSDK_PROPERTY_ID_ROOT,FbxPropertyFlags::EFlags pFlags=FbxPropertyFlags::eNone,bool pValue=true,bool pCheckFlagEquality=true)
+	{
+		if( pCheckFlagEquality )
+		{
+			FbxPropertyPage* lFoundIn = NULL;
+			FbxPropertyFlags* lFlag = GetPropertyItem( FBX_TYPE(FbxPropertyFlags), pId, &lFoundIn );
+
+			if( lFlag )
+			{
+				if( lFoundIn == this )
+				{
+					// set them in us.
+					lFlag->ModifyFlags( pFlags, pValue );
+
+					 // we override this entry, check if we need to revert
+					FbxPropertyFlags* lInheritedFlags = mInstanceOf ? mInstanceOf->GetPropertyItem( FBX_TYPE(FbxPropertyFlags), pId ) : NULL;
+					if( lInheritedFlags && lInheritedFlags->Equal( *lFlag, pFlags ) )
+					{
+						lFlag->UnsetMask( pFlags );
+
+						if( lFlag->GetMask() == 0 )
+							ChangePropertyItemState( FBX_TYPE(FbxPropertyFlags), pId, FbxPropertyFlags::eInherit );
+
+						return true;
+					}
+				}
+				else
+				{
+					// its not us. Just check if we need to set.
+					FbxPropertyFlags lNewValues( pFlags );
+					if( lFlag->Equal( lNewValues, pFlags ) )
+						return true;
+				}
+			}
+		}
+
+		FbxPropertyFlags* lPropertyFlags = ChangePropertyItemState(FBX_TYPE(FbxPropertyFlags), pId, FbxPropertyFlags::eOverride);
+		return lPropertyFlags ? lPropertyFlags->ModifyFlags( pFlags, pValue ) : false;
+	}
+
+	FbxPropertyFlags::EInheritType GetFlagsInheritType(FbxPropertyFlags::EFlags pFlags, bool pCheckInstanceOf, FbxInt pId=FBXSDK_PROPERTY_ID_ROOT) const
+	{
+		FbxPropertyPage* lFoundIn = NULL;
+		FbxPropertyFlags*  lPropertyFlags = GetPropertyItem( FBX_TYPE(FbxPropertyFlags), pId, &lFoundIn );
+
+		if( !pCheckInstanceOf )
+			return lFoundIn != this ? FbxPropertyFlags::eInherit : ( lPropertyFlags ? lPropertyFlags->GetFlagsInheritType(pFlags) : FbxPropertyFlags::eInherit );
+		else
+		{
+			// This code basically counts the number of overrides for the
+			// given flags. The original entry is always considered an override.
+			// so if we see more than one, something overrode the original.
+			// and thus we are an override.
+			FbxPropertyPage* lRefPage = lFoundIn;
+			bool lFoundOverride = false;
+			while( lRefPage )
+			{
+				lPropertyFlags = lRefPage->GetPropertyItem( FBX_TYPE(FbxPropertyFlags), pId );
+
+				if( !lPropertyFlags )
+					break;  // gone too far, break.
+
+				if( lPropertyFlags->GetFlagsInheritType( pFlags ) == FbxPropertyFlags::eOverride )
+				{
+					if( this == lRefPage || lFoundOverride )
+						return FbxPropertyFlags::eOverride;    // found two overrides or this page is the override.
+					else
+						lFoundOverride = true;  // signal that we found the first override.
+				}
+				lRefPage = lRefPage->mInstanceOf;
+			}
+
+			return FbxPropertyFlags::eInherit;
+		}
+	}
+
+	bool SetFlagsInheritType(FbxPropertyFlags::EInheritType pInheritType, FbxPropertyFlags::EFlags pFlags, FbxInt pId=FBXSDK_PROPERTY_ID_ROOT)
+	{
+		FbxPropertyPage* lFoundIn = NULL;
+		FbxPropertyFlags* lPropertyFlags = NULL;
+
+		if( FbxPropertyFlags::eOverride == pInheritType )
+		{
+			lPropertyFlags = ChangePropertyItemState( FBX_TYPE(FbxPropertyFlags), pId, FbxPropertyFlags::eOverride );
+
+			// we should initialize our flag to the inherited value, if any.
+			FbxPropertyFlags* lParentFlags = mInstanceOf ? mInstanceOf->GetPropertyItem( FBX_TYPE(FbxPropertyFlags), pId ) : NULL;
+			if( lParentFlags && lPropertyFlags )
+			{
+				FbxPropertyFlags::EFlags lParentValues = lParentFlags->GetFlags();
+				lPropertyFlags->SetFlags( pFlags, lParentValues );
+				return lPropertyFlags->SetMask( pFlags );
+			}
+
+			return false;
+		}
+		else if( FbxPropertyFlags::eInherit == pInheritType )
+		{
+			lPropertyFlags = GetPropertyItem(FBX_TYPE(FbxPropertyFlags), pId, &lFoundIn);
+			if( !lPropertyFlags ) return false;
+			if( lFoundIn != this ) return true; // not us
+			lPropertyFlags->UnsetMask( pFlags );
+			if( lPropertyFlags->GetMask() == 0 )    // revert
+				ChangePropertyItemState( FBX_TYPE(FbxPropertyFlags), pId, FbxPropertyFlags::eInherit );
+
+			return true;
+		}
+		return false;
+	}
+
+	inline void BeginCreateOrFindProperty()
+	{
+		if( 0 == mNameMap.mFirst )
+		{
+			mNameMap.mSecond.Reserve(20);
+
+			// push the existing properties into the map. Note: this includes the root property!
+			FbxInt lFoundId = FBXSDK_PROPERTY_ID_ROOT;
+			FbxPropertyEntry* lEntry = GetPropertyEntry(lFoundId);
+			while(lFoundId != FBXSDK_PROPERTY_ID_NULL)
+			{
+				FbxPropertyInfo* lInfo = lEntry->Get(FBX_TYPE(FbxPropertyInfo));
+				//FBX_ASSERT( lInfo );
+				if (lInfo)
+				{
+					mNameMap.mSecond.Insert(FbxNameMapKey(lEntry->GetParentId(), lInfo->GetName()), lFoundId);
+				}
+				lFoundId = GetMinimumPropertyIdAndEntry(lFoundId, &lEntry);
+			}
+			mNameMap.mFirst++;
+		}
+	}
+
+	inline void EndCreateOrFindProperty()
+	{
+		if( mNameMap.mFirst > 0 )
+		{
+			if( --(mNameMap.mFirst) == 0 )
+				mNameMap.mSecond.Clear();
+		}
+	}
+
+protected:
+    FbxPropertyPage(FbxPropertyPage* pInstanceOf=0)
+        : mInstanceOf(0)
+        , mDataPtr(0)
+        , mPropNextId(0)
+    {
+        mEntryMap.Reserve(32);
+        mNameMap.mFirst = 0;
+
+        // instances don't need to create a root property
+        if( !pInstanceOf )
+        {
+            mPropNextId = FbxNew< FbxPropertyIdGenerator >();
+            mPropNextId->IncRef();
+
+            // First item is the root information
+            Add(FBXSDK_PROPERTY_ID_NULL,"",eFbxUndefined);
+        }
+
+        // Hook the instances
+        // ------------------------
+        mInstanceOf = pInstanceOf;
+        if (mInstanceOf) {
+            mInstanceOf->mInstances.Add(this);
+
+            mPropNextId = mInstanceOf->mPropNextId;
+            mPropNextId->IncRef();
+        }
+    }
+    FbxPropertyPage(const char* pName, EFbxType pType)
+        : mInstanceOf(0)
+        , mDataPtr(0)
+        , mPropNextId(0)
+    {
+        mEntryMap.Reserve(32);
+        mNameMap.mFirst = 0;
+
+        mPropNextId = FbxNew< FbxPropertyIdGenerator >();
+        mPropNextId->IncRef();
+
+        // First item is the root information
+        Add(FBXSDK_PROPERTY_ID_NULL,pName,pType);
+    }
+    FbxPropertyPage(const char* pName, FbxPropertyPage* pTypeInfo)
+        : mInstanceOf(0)
+        , mDataPtr(0)
+        , mPropNextId(0)
+    {
+        mEntryMap.Reserve(32);
+        mNameMap.mFirst = 0;
+
+        mPropNextId = FbxNew< FbxPropertyIdGenerator >();
+        mPropNextId->IncRef();
+
+        // First item is the root information
+        Add(FBXSDK_PROPERTY_ID_NULL,pName,pTypeInfo);
+    }
+    ~FbxPropertyPage()
+    {
+        // Propagate our property entries.
+        int i = 0, j = 0;
+        for( i = 0; i < mInstances.GetCount(); ++i )
+        {
+            for( j = 0; j < GetPropertyEntryCount(); ++j )
+            {
+                if( mInstances[i]->ChangePropertyEntryState((FbxInt)j, FbxPropertyFlags::eOverride) )
+                {
+                    // Clone the info and values. Don't clone the connections,
+                    // since they aren't propagated.
+                    mInstances[i]->ChangePropertyItemState( FBX_TYPE(FbxPropertyInfo), (FbxInt)j, FbxPropertyFlags::eOverride );
+                    mInstances[i]->ChangePropertyItemState( FBX_TYPE(FbxPropertyValue), (FbxInt)j, FbxPropertyFlags::eOverride );
+
+                    // Since all entries have their own flags, just override the ones in the instance.
+                    mInstances[i]->SetFlagsInheritType(FbxPropertyFlags::eOverride, FbxPropertyFlags::eAllFlags, (FbxInt)j );
+                }
+            }
+
+            // Instances become their own copies.
+            mInstances[i]->mInstanceOf = NULL;
+        }
+
+		FbxMapDestroy(mEntryMap);
+
+        if (mInstanceOf) {
+            int lIndex = mInstanceOf->mInstances.Find(this);
+            mInstanceOf->mInstances.SetAt(lIndex, mInstanceOf->mInstances[mInstanceOf->mInstances.GetCount()-1]);
+            mInstanceOf->mInstances.RemoveAt(mInstanceOf->mInstances.GetCount()-1);
+
+            //mInstanceOf->mInstances.RemoveIt(this);
+        }
+
+        mPropNextId->DecRef();
+        mPropNextId = NULL;
+
+        mInstanceOf = NULL;
+        mInstances.Clear();
+    }
+
+    inline bool Is(FbxPropertyPage* pPage)
+    {
+        // @@@@@@@@@@@@@@@ Must complete for sub types
+        return this==pPage;
+    }
+
+// Internal entry management
+private:
+
+    /** Retrieves the smallest property id of which are larger than a specified one.
+    * \param pId The specified property id
+    * \param pIncrementIfNone Whether it returns FBXSDK_PROPERTY_ID_NULL or pId+1, if not found.
+    * \return The property id described above.
+    */
+    FbxInt GetMinimumPropertyId(FbxInt pId, bool pIncrementIfNone = true) const
+    {
+        if( pId == FBXSDK_PROPERTY_ID_NULL )
+            pId = FBXSDK_PROPERTY_ID_ROOT;
+       
+        FbxInt lMin = FBXSDK_PROPERTY_ID_NULL;
+        const EntryMap::RecordType* lElement = mEntryMap.UpperBound(pId);
+        if (NULL != lElement)
+        {
+            lMin = lElement->GetKey();
+        }
+
+        FbxInt lParentMin = mInstanceOf ? mInstanceOf->GetMinimumPropertyId(pId,false) : FBXSDK_PROPERTY_ID_NULL;
+
+        bool lParentNull = lParentMin == FBXSDK_PROPERTY_ID_NULL;
+        bool lMinNull = lMin == FBXSDK_PROPERTY_ID_NULL;
+
+        if( lParentNull && lMinNull )   return pIncrementIfNone ? pId+1 : FBXSDK_PROPERTY_ID_NULL;
+        else if( lMinNull )             lMin = lParentMin;
+        else if( !lParentNull )         lMin = lMin < lParentMin ? lMin : lParentMin;
+
+        return lMin;
+    }
+
+    /** Retrieves the smallest property id of which are larger than a specified one, and retrieve its entry.
+    * \param pId The specified property id
+    * \param pEntry The returned property entry
+    * \return The property id described above.
+    */
+    FbxInt GetMinimumPropertyIdAndEntry(FbxInt pId, FbxPropertyEntry** pEntry) const
+    {
+        FbxInt lFoundId = FBXSDK_PROPERTY_ID_NULL;
+        FbxPropertyEntry* lFoundEntry = NULL;
+        if( pId == FBXSDK_PROPERTY_ID_NULL )
+            pId = FBXSDK_PROPERTY_ID_ROOT;
+
+        const EntryMap::RecordType* lElement = mEntryMap.UpperBound(pId);
+        if (NULL != lElement)
+        {
+            lFoundId = lElement->GetKey();
+            lFoundEntry = lElement->GetValue();
+        }
+
+        FbxPropertyEntry* lParentEntry = NULL;
+        FbxInt lParentMin = mInstanceOf ? mInstanceOf->GetMinimumPropertyIdAndEntry(pId, &lParentEntry) : FBXSDK_PROPERTY_ID_NULL;
+
+        bool lParentNull = lParentMin == FBXSDK_PROPERTY_ID_NULL;
+        bool lMinNull = lFoundId == FBXSDK_PROPERTY_ID_NULL;
+
+        if( lMinNull && !lParentNull )
+        {
+            lFoundId = lParentMin;
+            lFoundEntry = lParentEntry;
+        }
+        else if( !lMinNull && !lParentNull )
+        {
+            lFoundId = lFoundId < lParentMin ? lFoundId : lParentMin;
+            lFoundEntry = lFoundId < lParentMin ? lFoundEntry : lParentEntry;
+        }
+
+        if (pEntry)
+            *pEntry = lFoundEntry;
+        return lFoundId;
+    }
+
+    int GetPropertyEntryCount() const
+    {
+        int lCount = 0;
+        const EntryMap::RecordType* lElement = mEntryMap.Maximum();
+
+        if (NULL != lElement)
+        {
+            lCount = lElement->GetKey() + 1;
+        }
+
+        int lParentCount = mInstanceOf ? mInstanceOf->GetPropertyEntryCount() : 0;
+        return lParentCount > lCount ? lParentCount : lCount;
+    }
+
+    FbxPropertyEntry* GetPropertyEntry(FbxInt pIndex,FbxPropertyPage **pFoundIn=0) const
+    {
+        const EntryMap::RecordType* lElement = mEntryMap.Find(pIndex);
+        if (NULL != lElement)
+        {
+            if( pFoundIn )
+            {
+                *pFoundIn = const_cast<FbxPropertyPage*>(this);
+            }
+            return lElement->GetValue();
+        }
+        
+        if( pFoundIn )
+        {
+            *pFoundIn = 0;
+        }
+
+        return mInstanceOf ? mInstanceOf->GetPropertyEntry(pIndex,pFoundIn) : 0;
+    }
+
+    FbxPropertyEntry* ChangePropertyEntryState(FbxInt pIndex,FbxPropertyFlags::EInheritType pInheritType)
+    {
+		FbxPropertyPage*     lReferencePage      = 0;
+		FbxPropertyEntry*    lReferenceEntry     = GetPropertyEntry(pIndex,&lReferencePage);
+
+        if (pInheritType==FbxPropertyFlags::eOverride) {
+            if (lReferencePage==this) {
+                return lReferenceEntry;
+            } else if (lReferenceEntry) {
+                // must create an entry
+                FbxPropertyEntry* lEntry = FbxPropertyEntry::Create(lReferenceEntry->GetParentId(),0,0,0);
+                mEntryMap.Insert( pIndex, lEntry );
+
+                return lEntry;
+            }
+        } else {
+            if (lReferenceEntry && (lReferencePage==this)) {
+                mEntryMap.Remove(pIndex);
+                lReferenceEntry->Destroy();
+            }
+        }
+        return 0;
+    }
+
+    FbxInt Add(FbxInt pParentId,FbxPropertyInfo* pInfo,FbxPropertyValue* pValue,FbxPropertyConnect* pConnect,bool pRecursive=true)
+    {
+        FbxInt lId = mPropNextId->GetNextIdAndInc();
+        FbxPropertyEntry* lEntry = FbxPropertyEntry::Create(pParentId,pInfo,pValue,pConnect);
+        
+        // entries created through Add() are not overrides of another entry.
+        // Thus, set all of their flags by default.
+        FbxPropertyFlags* lFlags = lEntry->Get( FBX_TYPE(FbxPropertyFlags) );
+        if( lFlags ) lFlags->ModifyFlags( FbxPropertyFlags::eAllFlags, false );
+
+        mEntryMap.Insert( lId, lEntry );
+
+        // We only add to the map if this Add is called after BeginCreateOrFindProperty()
+        // in which case the size is always > 0 because it includes the root property
+        if( mNameMap.mSecond.GetSize() > 0 )
+            mNameMap.mSecond.Insert( FbxNameMapKey( pParentId, pInfo->GetName()), lId );
+
+        // If the entry has multiple children(Struct Datatype)
+        // Recurse for the entries and create an entry in this structure
+        if (pRecursive) {
+            FbxPropertyPage* lTypeInfo = pInfo->GetTypeInfo();
+            if (lTypeInfo) {
+				FbxInt lChildId;
+                lChildId = lTypeInfo->GetChild();
+                while (lChildId!=FBXSDK_PROPERTY_ID_NULL) {
+					FbxPropertyInfo*		lPropertyInfo    = lTypeInfo->GetPropertyItem( FBX_TYPE(FbxPropertyInfo),lChildId );
+					FbxPropertyValue*	lPropertyValue   = lTypeInfo->GetPropertyItem( FBX_TYPE(FbxPropertyValue),lChildId );
+					FbxPropertyConnect*	lPropertyConnect = lTypeInfo->GetPropertyItem( FBX_TYPE(FbxPropertyConnect),lChildId );
+
+                    Add ( lId, lPropertyInfo ? lPropertyInfo->Clone(this) : 0 , lPropertyValue ? lPropertyValue->Clone(this) : 0,
+							   lPropertyConnect ? lPropertyConnect->Clone(this) : 0 );
+                    lChildId = lTypeInfo->GetSibling(lChildId );
+                }
+            }
+        }
+        return lId;
+    }       
+
+    // Property management
+    typedef FbxMap<FbxInt, FbxPropertyEntry*, FbxLessCompare<FbxInt>, FbxHungryAllocator> EntryMap;
+    EntryMap mEntryMap;
+
+    // instance management
+    FbxPropertyPage*				mInstanceOf;
+    FbxArray<FbxPropertyPage*>		mInstances;
+
+    void*							mDataPtr;
+
+    // speed up structure
+    typedef FbxMap<FbxNameMapKey, FbxInt, FbxNameMapCompare > NameMap;
+    typedef FbxPair<unsigned int, NameMap > NameLookupPair;
+    NameLookupPair     mNameMap;
+
+    FbxPropertyIdGenerator* mPropNextId;
+
+    friend class FbxPropertyHandle;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_PROPERTY_PAGE_H_ */

+ 1178 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxpropertytypes.h

@@ -0,0 +1,1178 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxpropertytypes.h
+#ifndef _FBXSDK_CORE_PROPERTY_TYPES_H_
+#define _FBXSDK_CORE_PROPERTY_TYPES_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+#include <fbxsdk/core/base/fbxtime.h>
+#include <fbxsdk/core/math/fbxvector2.h>
+#include <fbxsdk/core/math/fbxvector4.h>
+#include <fbxsdk/core/math/fbxmatrix.h>
+#include <fbxsdk/core/fbxsystemunit.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+//! Type identifier constants
+enum EFbxType
+{
+	eFbxUndefined,			//!< Unidentified.
+	eFbxChar,				//!< 8 bit signed integer.
+	eFbxUChar,				//!< 8 bit unsigned integer.
+	eFbxShort,				//!< 16 bit signed integer.
+	eFbxUShort,				//!< 16 bit unsigned integer.
+	eFbxUInt,				//!< 32 bit unsigned integer.
+	eFbxLongLong,			//!< 64 bit signed integer.
+	eFbxULongLong,			//!< 64 bit unsigned integer.
+	eFbxHalfFloat,			//!< 16 bit floating point.
+	eFbxBool,				//!< Boolean.
+	eFbxInt,				//!< 32 bit signed integer.
+	eFbxFloat,				//!< Floating point value.
+	eFbxDouble,				//!< Double width floating point value.
+	eFbxDouble2,			//!< Vector of two double values.
+	eFbxDouble3,			//!< Vector of three double values.
+	eFbxDouble4,			//!< Vector of four double values.
+	eFbxDouble4x4,			//!< Four vectors of four double values.
+	eFbxEnum		= 17,	//!< Enumeration.
+	eFbxEnumM		=-17,	//!< Enumeration allowing duplicated items.
+	eFbxString		= 18,	//!< String.
+	eFbxTime,				//!< Time value.
+	eFbxReference,			//!< Reference to object or property.
+	eFbxBlob,				//!< Binary data block type.
+	eFbxDistance,			//!< Distance.
+	eFbxDateTime,			//!< Date and time.
+	eFbxTypeCount	= 24	//!< Indicates the number of type identifiers constants.
+};
+
+/** Class to represent colors in RGBA format using doubles.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxColor
+{
+public:
+    //! Constructor.
+    FbxColor();
+
+	/** Constructor.
+	  * \param pRed       The Red component value.
+	  * \param pGreen     The Green component value.
+	  * \param pBlue      The Blue component value.
+	  * \param pAlpha     The alpha value of the color.
+	  */
+	FbxColor(const double pRed, const double pGreen, const double pBlue, const double pAlpha=1.0);
+	FbxColor(const FbxDouble3& pRGB, const double pAlpha=1.0);
+	FbxColor(const FbxDouble4& pRGBA);
+
+    //! Destructor.
+    ~FbxColor();
+
+	/** Re-initialize the color object with their new values.
+	  * \param pRed       The Red component value.
+	  * \param pGreen     The Green component value.
+	  * \param pBlue      The Blue component value.
+	  * \param pAlpha     The alpha value of the color.
+	  */
+	void Set(const double pRed, const double pGreen, const double pBlue, const double pAlpha=1.0);
+
+	/** Indicate if all the members in the color objects are within their valid range.
+	  * \return     \c true if all the members are within their valid range.
+	  */
+	bool IsValid() const;
+
+    /** Accessors.
+      * \param pIndex The index of the component to access.
+      * \return The reference to the indexed component.
+      * \remarks The pIndex parameter is not checked for values out of bounds.
+      */
+    double& operator[](int pIndex);
+
+    /** Accessors.
+      * \param pIndex The index of the component to access.
+      * \return The reference to the indexed component.
+      * \remarks The pIndex parameter is not checked for values out of bounds.
+      */
+    const double& operator[](int pIndex) const;
+
+	/**
+	  * \name Operators
+	  */
+	//@{
+		/** Assignment operator.
+		  * \param pColor FbxColor to be copied.
+		  */
+		FbxColor& operator=(const FbxColor& pColor);
+		FbxColor& operator=(const FbxDouble3& pColor);
+		FbxColor& operator=(const FbxDouble4& pColor);
+
+		/** Equality operator.
+		  * \param pColor FbxColor compared with this one.
+		  * \return \c true if equal, \c false if unequal.
+		  */
+		bool operator==(const FbxColor& pColor) const;
+
+		/** Inequality operator.
+		  * \param pColor FbxColor compared with this one.
+		  * \return \c true if unequal, \c false if equal.
+		  */
+		bool operator!=(const FbxColor& pColor) const;
+	//@}
+
+	/**
+	  * name Public Members
+	  */
+	//@{
+		//! Valid range is from 0.0 to 1.0.
+		double mRed;
+
+		//! Valid range is from 0.0 to 1.0.
+		double mGreen;
+
+		//! Valid range is from 0.0 to 1.0.
+		double mBlue;
+
+		//! Valid range is from 0.0 to 1.0.
+		double mAlpha;
+	//@}
+};
+
+/**	FBX SDK half-float class.
+  * Property used to store half-float (16 bit float) number.
+  * This class only holds the value in 2 byte buffer (unsigned short). There is
+  * no direct math manipulation of this type except for the conversion to/from
+  * float. On disk, this type is also saved as an unsigned short.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxHalfFloat
+{
+public:
+	/**
+	  *\name Constructors
+	  */
+	//@{
+		FbxHalfFloat();
+		FbxHalfFloat(float pVal);
+		FbxHalfFloat(const FbxHalfFloat& pVal);
+	//@}
+
+	/** Assign operator
+	  * \param pValue       The half-float to be assigned to this instance.
+	  * \return             This half-float.
+	  */
+    FbxHalfFloat& operator=(const FbxHalfFloat& pValue);
+    
+	/**
+	  * \name boolean operation
+	  */
+	//@{
+		/** Equivalence operator.
+		  * \param pRHS          The half-float to be compared with this one.
+		  * \return              \c True, if the two values are equal, \c false otherwise.
+		  */
+		bool operator==(const FbxHalfFloat& pRHS) const;
+
+		/** Non-equivalence operator.
+		  * \param pRHS          The half-float to be compared with this one
+		  * \return              \c True, if the two values are unequal, \c false otherwise.
+		  */
+		bool operator!=(const FbxHalfFloat& pRHS) const;
+	//@}
+
+	/**
+	  * \name Access
+	  */
+	//@{
+		/** Retrieve the value as a float.
+		  */
+		float value() const;
+
+		/** Retrieve the value as it is stored.
+		  */
+		unsigned short internal_value() const;
+	//@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+	typedef unsigned short half;
+	half mValue;
+
+	// we want to extract the mantissa, exponent and sign from the float number.
+	// by the IEEE 754 binary standard, the float number is divided as: 
+	//        sign          : 1 bit
+	//        mantissa      : 23 bits
+	//        exponent      : 8 bits
+	//        exponent bias : 127
+	// and the half-float is:
+	//        sing          : 1 bit
+	//        mantissa      : 10 bits
+	//        exponent      : 5 bits
+	//        exponent bias :
+
+	half FtoHF(float *f);
+	float HFtoF(half h) const;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/** FBX SDK blob class. 
+  * Uninitialized data of a specified size, to be filled by the user.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxBlob
+{
+public:
+	/**
+	  * \name Constructors and Destructor
+	  */
+	//@{
+		//! Constructor.  Set attributes to 0.
+		FbxBlob();
+
+		/** Constructor.  Construct a buffer with uninitialized data of a specified size, to be filled by the user.
+		  * \param pSize                Buffer size.
+		  */
+		FbxBlob(int pSize);
+
+		/** Copy constructor.
+		  * \param pRHS                 The blob to be copied to this blob.
+		  */
+		FbxBlob(const FbxBlob& pRHS);
+
+		/** Constructor.
+		  * \param pData                The data to be filled in the buffer.
+		  * \param pSize                Buffer size.
+		  */
+		FbxBlob(const void* pData, int pSize);
+
+		//! Destructor
+		~FbxBlob();
+	//@}
+
+	/**
+	  * \name Assignment.
+	  */
+	//@{
+		/** Share the buffer of the specified blob with this blob. 
+		  * \param pValue               The blob whose buffer is shared with this blob.
+		  * \return                     This blob.
+		  */
+		FbxBlob& operator=(const FbxBlob& pValue);
+
+		/** Copy the data in the buffer.
+		 * \param pData                 The buffer to be copied data from.
+		 * \param pSize                 Buffer size.
+		 */
+		void Assign(const void* pData, int pSize);  // Always makes a copy.
+	//@}
+
+    /**
+	  * \name Boolean operation
+	  */
+    //@{
+		/** Equality operator.
+		 * \param pRHS                  The blob to be compared with this blob.
+		 * \return                      \c True, if the two blobs are equal, \c false otherwise.
+		 */
+		 bool operator==(const FbxBlob& pRHS) const; // Compare the contents.
+
+		/** Inequality operator.
+		  * \param pRHS                  The blob to be compared with this blob.
+		  * \return                      \c True, if the two blobs are unequal, otherwise false.
+		  */
+		bool operator!=(const FbxBlob& pRHS) const;
+	//@}
+
+	//!Make a copy if the reference count > 1 (i.e. if the buffer is shared).
+	void* Modify(); 
+
+	/**
+	  * \name Access
+	  */
+	//@{
+    
+		/** Retrieve the buffer pointer.
+		  * \return                      The buffer pointer.
+		  */
+		const void * Access() const;
+
+		/** Retrieve the buffer size
+		  * \return                       The buffer size.
+		  */
+		int Size() const;
+	//@}
+
+    //! Free the memory if this blob is the last one to hold it.
+	void Clear(); 
+
+protected:
+    int*	mRefCount;
+    void*	mData;
+    int     mSize;
+};
+
+/**	FBX SDK date&time class.
+  * Property used to store date and time information; not related to a FbxTime, which is
+  * used for film-related operations.
+  * The date and time property does not make any provisions for UTC, GMT or local
+  * zones; this is entirely up to client code to know what they are dealing with.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxDateTime
+{
+public:
+	/**
+	  *\name Constructors
+	  */
+	//@{
+		//! Default constructor. Set attributes to 0.   
+		FbxDateTime();
+
+		/** Constructor.
+		  * \param pDay           Day
+		  * \param pMonth         Month
+		  * \param pYear          Year
+		  * \param pHour          Hour
+		  * \param pMin           Minute
+		  * \param pSec           Second
+		  * \param pMillisecond   Millisecond
+		  * \remark If one or more argument is invalid, the object is reset to 0.
+		  */
+		FbxDateTime(int pDay, int pMonth, int pYear, int pHour, int pMin, int pSec, int pMillisecond=0);
+	//@}
+
+	/**
+	  * \name Boolean operation
+	  */
+	//@{
+		/** Equivalence operator.
+		  *\param pRHS              The date&time to be compared with this date&time.
+		  *\return              \c True, if the two date&time are equal, \c false otherwise.
+		  */
+		bool operator==(const FbxDateTime& pRHS) const;
+
+		/** Non-equivalence operator
+		  *\param pRHS         The date&time to be compared with this date&time.
+		  *\return             \c True, if the two date&time are not equal, \c false otherwise.
+		  */
+		bool operator!=(const FbxDateTime& pRHS) const;
+	//@}
+
+	//! Set the attributes to 0.
+	void Clear();
+	
+	/** Validates each field is within a normal range (month is 1-12, etc).
+	  * \return               \c True, if each field is within a normal range, \c false otherwise.
+	  */
+	bool isValid() const;
+   
+	/**
+	  * \name Access
+	  */
+    //@{
+		/** Set the date.
+		  * \param pDay          Day to be set.
+		  * \param pMonth        Month to be set.
+		  * \param pYear         Year to be set.
+		  * \remark If one or more argument is invalid, the object is reset to 0.
+		  */
+		void setDate(int pDay, int pMonth, int pYear);
+
+		/** Set the time. 
+		  * \param pHour         Hour to be set.
+		  * \param pMin          Minute to be set.
+		  * \param pSec          Second to be set.
+		  * \param pMillisecond  Millisecond to be set.
+		  * \remark If one or more argument is invalid, the object is reset to 0.
+		  */
+		void setTime(int pHour, int pMin, int pSec, int pMillisecond = 0);
+	//@}
+
+	/**
+	  * \name  Operation with string
+	  */
+	//@{
+		/** Get the string format from this date&time.
+		  * \return              The string format got from this date&time.
+		  */
+		FbxString toString() const;
+
+		/** Get date&time from the string format.
+		  * \return             \c True, if get date&time from the string format successfully, \c false otherwise.
+		  * \remarks            ! This will only work with the format returned by toString(); if the format
+		  *                     is not the same will return 'false' and the content of this object will
+		  *                     remain unchanged.
+		  */
+		bool fromString(const char*);
+	//@}
+   
+	/** Get date&time from current date&time of GMT.
+	  * \return             The date&time equal to current date&time of GMT.         
+	  */
+    static FbxDateTime currentDateTimeGMT();
+
+private:
+	FbxShort mMillisecond;            // 0-999
+    FbxShort mYear;                   // No check
+
+    FbxChar  mMonth;                  // 1-12
+    FbxChar  mDay;                    // 1-31; no check with regards to the month
+    FbxChar  mHour;                   // 0-23
+    FbxChar  mMinute;                 // 0-59
+    FbxChar  mSecond;                 // 0-59
+};
+
+/** FBX SDK distance class.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxDistance
+{
+public:
+	/**
+	  * \name Constructors and Destructor
+	  */
+	//@{
+		//! Default constructor.
+		FbxDistance();
+
+		/** Constructor with default values.
+		  * \param pValue      Value of distance using the measurement unit.
+		  * \param pUnit       Unit of measurement.
+		  */
+		FbxDistance(float pValue, FbxSystemUnit pUnit);
+
+		/** Constructor.    
+		  * \param pValue      Value of distance using the measurement unit.
+		  * \param pUnit       Unit of measurement.
+		  * \remarks           This constructor will convert string to FbxSystemUnit.
+		  */
+		FbxDistance(float pValue, const char* pUnit);
+
+		//! Destructor.
+		~FbxDistance();
+	//@}
+
+	/** Assign operator
+	  * \param pValue       The distance to be assigned to this distance.
+	  * \return             This distance.
+	  */
+    FbxDistance& operator=(const FbxDistance& pValue);
+    
+	/**
+	  * \name boolean operation
+	  */
+	//@{
+		/** Equivalence operator.
+		  * \param pRHS          The distance to be compared with this distance.
+		  * \return              \c True, if the two distances are equal, \c false otherwise.
+		  */
+		bool operator==(const FbxDistance& pRHS) const;
+
+		/** Non-equivalence operator.
+		  * \param pRHS          The distance to be compared with this distance.
+		  * \return              \c True, if the two distances are unequal, \c false otherwise.
+		  */
+		bool operator!=(const FbxDistance& pRHS) const;
+	//@}
+	
+    const FbxString unitName() const;
+
+	/**
+	  * \name Access
+	  */
+	//@{
+		/** Retrieve the measurement unit
+		  * \return             The measure unit of the distance.
+		  */
+		const FbxSystemUnit unit() const;
+
+		/** Retrieve the distance value 
+		  * \return             The value of the distance in the defined measurement unit.   
+		  */
+		float value() const;
+	//@}
+
+    /** Get the value of distance when converting this measurement unit to inch.
+	  * \return             The value of distance when converting this measurement unit to inch.
+	  */
+    float internalValue() const;
+
+	/** Get the value of distance when converting this measurement unit to the specified measurement unit.
+	  * \param pUnit       The measurement unit to be converted to.
+	  * \return            The value of distance when using the specified measurement unit.
+	  */
+    float valueAs(const FbxSystemUnit& pUnit) const;
+
+private:
+    float               mValue;
+    FbxSystemUnit      mUnit;
+};
+
+/** Retrieve a type enumeration memory footprint size
+* \param pType The type enumeration
+* \return The size of this type in memory */
+FBXSDK_DLL size_t FbxTypeSizeOf(const EFbxType pType);
+
+/** Retrieve a type enumeration component count
+* \param pType The type enumeration
+* \return The number of component used by this type */
+FBXSDK_DLL size_t FbxTypeComponentCount(const EFbxType pType);
+
+// Type management for properties
+inline EFbxType FbxTypeOf(const FbxChar&){ return eFbxChar; }
+inline EFbxType FbxTypeOf(const FbxUChar&){ return eFbxUChar; }
+inline EFbxType FbxTypeOf(const FbxShort&){ return eFbxShort; }
+inline EFbxType FbxTypeOf(const FbxUShort&){ return eFbxUShort; }
+inline EFbxType FbxTypeOf(const FbxUInt&){ return eFbxUInt; }
+inline EFbxType FbxTypeOf(const FbxLongLong&){ return eFbxLongLong; }
+inline EFbxType FbxTypeOf(const FbxULongLong&){ return eFbxULongLong; }
+inline EFbxType FbxTypeOf(const FbxHalfFloat&){ return eFbxHalfFloat; }
+inline EFbxType FbxTypeOf(const FbxBool&){ return eFbxBool; }
+inline EFbxType FbxTypeOf(const FbxInt&){ return eFbxInt; }
+inline EFbxType FbxTypeOf(const FbxFloat&){ return eFbxFloat; }
+inline EFbxType FbxTypeOf(const FbxDouble&){ return eFbxDouble; }
+inline EFbxType FbxTypeOf(const FbxDouble2&){ return eFbxDouble2; }
+inline EFbxType FbxTypeOf(const FbxDouble3&){ return eFbxDouble3; }
+inline EFbxType FbxTypeOf(const FbxDouble4&){ return eFbxDouble4; }
+inline EFbxType FbxTypeOf(const FbxDouble4x4&){ return eFbxDouble4x4; }
+inline EFbxType FbxTypeOf(const FbxVector2&){ return eFbxDouble2; }
+inline EFbxType FbxTypeOf(const FbxVector4&){ return eFbxDouble4; }
+inline EFbxType FbxTypeOf(const FbxQuaternion&){ return eFbxDouble4; }
+inline EFbxType FbxTypeOf(const FbxMatrix&){ return eFbxDouble4x4; }
+inline EFbxType FbxTypeOf(const FbxAMatrix&){ return eFbxDouble4x4; }
+inline EFbxType FbxTypeOf(const FbxString&){ return eFbxString; }
+inline EFbxType FbxTypeOf(const FbxTime&){ return eFbxTime; }
+inline EFbxType FbxTypeOf(const FbxReference&){ return eFbxReference; }
+inline EFbxType FbxTypeOf(const FbxBlob&){ return eFbxBlob; }
+inline EFbxType FbxTypeOf(const FbxColor&){ return eFbxDouble4; }
+inline EFbxType FbxTypeOf(const FbxDistance&){ return eFbxDistance; }
+inline EFbxType FbxTypeOf(const FbxDateTime&){ return eFbxDateTime; }
+
+template <class T> inline EFbxType FbxTypeOf(const T&){ FBX_ASSERT_NOW("Unknown type!"); return eFbxUndefined; }
+
+bool FBXSDK_DLL FbxTypeCopyStr(FbxDouble& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxBool& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxInt& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxChar& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxUChar& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxShort& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxUShort& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxUInt& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxLongLong& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxULongLong& pDst, const FbxString& pSrc);
+bool FBXSDK_DLL FbxTypeCopyStr(FbxHalfFloat& pDst, const FbxString& pSrc);
+
+// Copy types and conversions
+template<class T1, class T2> inline bool FbxTypeCopy(T1&, const T2&){ FBX_ASSERT_NOW("Incompatible type assignment!" ); return false; }
+
+//! Same type conversion
+inline bool FbxTypeCopy(FbxChar& pDst, const FbxChar& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxUChar& pDst, const FbxUChar& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxShort& pDst, const FbxShort& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxUShort& pDst, const FbxUShort& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxUInt& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxLongLong& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxULongLong& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxHalfFloat& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxBool& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxInt& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxFloat& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxDouble& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxDouble2& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxDouble3& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble4& pDst, const FbxDouble4& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble4x4& pDst, const FbxDouble4x4& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxString& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxTime& pDst, const FbxTime& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxReference& pDst, const FbxReference& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxBlob& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxDistance& pDst, const FbxDistance& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxDateTime& pDst, const FbxDateTime& pSrc){ pDst = pSrc; return true; }
+
+//To FbxBool
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxChar& pSrc){ pDst = pSrc == 0 ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxUChar& pSrc){ pDst = pSrc == 0 ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxShort& pSrc){ pDst = pSrc == 0 ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxUShort& pSrc){ pDst = pSrc == 0 ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxUInt& pSrc){ pDst = pSrc == 0 ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxLongLong& pSrc){ pDst = pSrc == 0 ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxULongLong& pSrc){ pDst = pSrc == 0 ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxHalfFloat& /*pSrc */){ return false; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxInt& pSrc){ pDst = pSrc == 0 ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxFloat& pSrc){ pDst = pSrc == 0.f ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxDouble& pSrc){ pDst = pSrc == 0. ? false : true; return true; }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBool& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBool& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxChar
+inline bool FbxTypeCopy(FbxChar& pDst, const FbxUChar& pSrc){ pDst = (FbxChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxUShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxUInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxLongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxULongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& pDst, const FbxBool& pSrc){ pDst = (FbxChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxChar& pDst, const FbxInt& pSrc){ pDst = (FbxChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxChar& pDst, const FbxFloat& pSrc){ pDst = (FbxChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxChar& pDst, const FbxDouble& pSrc){ pDst = (FbxChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxChar& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxUChar
+inline bool FbxTypeCopy(FbxUChar& pDst, const FbxChar& pSrc){ pDst = (FbxUChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxUShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxUInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxLongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxULongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& pDst, const FbxBool& pSrc){ pDst = (FbxUChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUChar& pDst, const FbxInt& pSrc){ pDst = (FbxUChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUChar& pDst, const FbxFloat& pSrc){ pDst = (FbxUChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUChar& pDst, const FbxDouble& pSrc){ pDst = (FbxUChar)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUChar& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxShort
+inline bool FbxTypeCopy(FbxShort& pDst, const FbxChar& pSrc){ pDst = (FbxShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxShort& pDst, const FbxUChar& pSrc){ pDst = (FbxShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxUShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxUInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxLongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxULongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& pDst, const FbxBool& pSrc){ pDst = (FbxShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxShort& pDst, const FbxInt& pSrc){ pDst = (FbxShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxShort& pDst, const FbxFloat& pSrc){ pDst = (FbxShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxShort& pDst, const FbxDouble& pSrc){ pDst = (FbxShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxShort& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxUShort
+inline bool FbxTypeCopy(FbxUShort& pDst, const FbxChar& pSrc){ pDst = (FbxUShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUShort& pDst, const FbxUChar& pSrc){ pDst = (FbxUShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUShort& pDst, const FbxShort& pSrc){ pDst = (FbxUShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxUInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxLongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxULongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& pDst, const FbxBool& pSrc){ pDst = (FbxUShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUShort& pDst, const FbxInt& pSrc){ pDst = (FbxUShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUShort& pDst, const FbxFloat& pSrc){ pDst = (FbxUShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUShort& pDst, const FbxDouble& pSrc){ pDst = (FbxUShort)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUShort& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxInt
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxChar& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxUChar& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxShort& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxUShort& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxUInt& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxLongLong& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxULongLong& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxBool& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxFloat& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxDouble& pSrc){ pDst = (FbxInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxInt& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxInt& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxUInt
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxChar& pSrc){ pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxUChar& pSrc){ pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxShort& pSrc){ pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxUShort& pSrc){ pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxLongLong& pSrc){ pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxULongLong& pSrc)  { pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxBool& pSrc){ pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxInt& pSrc){ pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxFloat& pSrc){ pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxDouble& pSrc){ pDst = (FbxUInt)pSrc; return true; }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUInt& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxUInt& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxLongLong
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxChar& pSrc){ pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxUChar& pSrc){ pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxShort& pSrc){ pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxUShort& pSrc){ pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxUInt& pSrc){ pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxULongLong& pSrc)  { pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxBool& pSrc){ pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxInt& pSrc){ pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxFloat& pSrc){ pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxDouble& pSrc){ pDst = (FbxLongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxLongLong& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxLongLong& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxULongLong
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxChar& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxUChar& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxShort& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxUShort& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxUInt& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxLongLong& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxBool& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxInt& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxFloat& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxDouble& pSrc){ pDst = (FbxULongLong)pSrc; return true; }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxULongLong& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxULongLong& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxHalfFloat
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxChar& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxUChar& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxShort& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxUShort& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxUInt& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxLongLong& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxULongLong& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxBool& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxInt& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxFloat& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxDouble& pSrc){ FbxHalfFloat hf((float)pSrc); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxHalfFloat& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxHalfFloat& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxHalfFloat& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxHalfFloat& /*pDst*/, const FbxString& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxHalfFloat& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxHalfFloat& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxHalfFloat& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxHalfFloat& pDst, const FbxDistance& pSrc){ FbxHalfFloat hf(pSrc.internalValue()); pDst = hf; return true; }
+inline bool FbxTypeCopy(FbxHalfFloat& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxFloat
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxChar& pSrc){ pDst = (FbxFloat)pSrc; return true; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxUChar& pSrc){ pDst = (FbxFloat)pSrc; return true; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxShort& pSrc){ pDst = (FbxFloat)pSrc; return true; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxUShort& pSrc){ pDst = (FbxFloat)pSrc; return true; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxUInt& pSrc){ pDst = (FbxFloat)pSrc; return true; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxLongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxULongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxHalfFloat& pSrc){ pDst = pSrc.value()   ; return true; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxBool& pSrc){ pDst = (FbxFloat)pSrc; return true; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxInt& pSrc){ pDst = (FbxFloat)pSrc; return true; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxDouble& pSrc){ pDst = (FbxFloat)pSrc; return true; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxString& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxFloat& pDst, const FbxDistance& pSrc){ pDst = pSrc.internalValue(); return true; }
+inline bool FbxTypeCopy(FbxFloat& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxDouble
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxChar& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxUChar& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxShort& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxUShort& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxUInt& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxLongLong& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxULongLong& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxHalfFloat& pSrc){ pDst = (FbxDouble)pSrc.value(); return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxBool& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxInt& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxFloat& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxDouble2& pSrc){ pDst = (FbxDouble)pSrc[0];     return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxDouble3& pSrc){ pDst = (FbxDouble)pSrc[0];     return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxDouble4& pSrc){ pDst = (FbxDouble)pSrc[0];     return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxDouble4x4& pSrc){ pDst = (FbxDouble)pSrc[0][0];  return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxString& pSrc){ return FbxTypeCopyStr(pDst, pSrc); }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxTime& pSrc){ pDst = (FbxDouble)pSrc.GetSecondDouble();  return true; }
+inline bool FbxTypeCopy(FbxDouble& pDst, const FbxDistance& pSrc){ pDst = pSrc.internalValue(); return true; }
+
+//To FbxDouble2
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxChar& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxUChar& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxShort& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxUShort& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxUInt& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxLongLong& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxULongLong& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxHalfFloat& pSrc){ pDst = (FbxDouble)pSrc.value(); return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxBool& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxInt& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxFloat& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble2& pDst, const FbxDouble& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+
+//To FbxDouble3
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxChar& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxUChar& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxShort& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxUShort& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxUInt& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxLongLong& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxULongLong& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxHalfFloat& pSrc){ pDst = (FbxDouble)pSrc.value(); return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxBool& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxInt& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxFloat& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxDouble& pSrc){ pDst = (FbxDouble)pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false;  }
+inline bool FbxTypeCopy(FbxDouble3& pDst, const FbxDouble4& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble3& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble3& /*pDst*/, const FbxString& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble3& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble3& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble3& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble3& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble3& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxDouble4
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxChar& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxUChar& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxUShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxUInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxLongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxULongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxBool& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxDouble& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& pDst, const FbxDouble3& pSrc){ pDst = pSrc; return true; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxString& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDouble4& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxString
+inline bool FbxTypeCopy(FbxString& pDst, const FbxChar& pSrc){ pDst=FbxString((int)pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxUChar& pSrc){ pDst=FbxString((int)pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxShort& pSrc){ pDst=FbxString((int)pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxUShort& pSrc){ pDst=FbxString((int)pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxUInt& pSrc){ pDst=FbxString((int)pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxLongLong& pSrc){ pDst=FbxString((int)pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxULongLong& pSrc){ pDst=FbxString((int)pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxHalfFloat& pSrc){ pDst=FbxString((float)pSrc.value()); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxBool& pSrc){ pDst=pSrc ? "true" : "false"; return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxInt& pSrc){ pDst=FbxString((int)pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxFloat& pSrc){ pDst=FbxString(pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxDouble& pSrc){ pDst=FbxString(pSrc); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxDouble2& pSrc){ pDst=FbxString(pSrc[0])+","+FbxString(pSrc[1]); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxDouble3& pSrc){ pDst=FbxString(pSrc[0])+","+FbxString(pSrc[1])+","+FbxString(pSrc[2]); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxDouble4& pSrc){ pDst=FbxString(pSrc[0])+","+FbxString(pSrc[1])+","+FbxString(pSrc[2])+","+FbxString(pSrc[3]); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxDouble4x4& pSrc){ pDst=FbxString(pSrc[0][0])+","+FbxString(pSrc[0][1])+","+FbxString(pSrc[0][2])+","+FbxString(pSrc[0][3]); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxTime& pSrc){ char lTimeStr[128]; pSrc.GetTimeString(lTimeStr, FbxUShort(128)); pDst=lTimeStr; return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxReference& /*pSrc*/){ pDst="<reference>"; return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxBlob& /*pSrc*/){ pDst="<blob>"; return true; } // Or convert to ASCII-85?
+inline bool FbxTypeCopy(FbxString& pDst, const FbxDistance& pSrc){ pDst= FbxString(pSrc.value()) + " " +pSrc.unitName(); return true; }
+inline bool FbxTypeCopy(FbxString& pDst, const FbxDateTime& pSrc){ pDst= pSrc.toString(); return true; }
+
+//To FbxBlob
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxChar& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxUChar& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxShort& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxUShort& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxUInt& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxLongLong& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxULongLong& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxHalfFloat& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxBool& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxInt& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxFloat& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxDouble& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxDouble2& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxDouble3& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxDouble4& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxDouble4x4& pSrc){ pDst.Assign(&pSrc, sizeof(pSrc)); return true; }
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxString& pSrc)
+{
+    bool lCastable = pSrc.GetLen() == pSrc.GetLen();
+    FBX_ASSERT( lCastable );
+    if( lCastable )
+        pDst.Assign(pSrc.Buffer(), (int)pSrc.GetLen());
+    return lCastable;
+}
+inline bool FbxTypeCopy(FbxBlob& pDst, const FbxTime& pSrc){ FbxLongLong t = pSrc.Get(); pDst.Assign( &t, sizeof(t)); return true; }
+inline bool FbxTypeCopy(FbxBlob& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBlob& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxBlob& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxDistance
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxChar& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxUChar& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxUShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxUInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxLongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxULongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxBool& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxDouble& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const  FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxString& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDistance& /*pDst*/, const FbxDateTime& /*pSrc*/){ return false; }
+
+//To FbxDateTime
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxChar& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxUChar& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxShort& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxUShort& /*pSrc*/){ return false; } 
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxUInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxLongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxULongLong& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxHalfFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxBool& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxInt& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxFloat& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxDouble& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxDouble2& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxDouble3& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxDouble4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxDouble4x4& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& pDst, const FbxString& pSrc){ return pDst.fromString(pSrc); }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxTime& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxReference& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxBlob& /*pSrc*/){ return false; }
+inline bool FbxTypeCopy(FbxDateTime& /*pDst*/, const FbxDistance& /*pSrc*/){ return false; }
+
+template<class T> inline bool FbxTypeCopy(T& pDst, const void* pSrc, EFbxType pSrcType)
+{	
+	switch( pSrcType )
+	{
+		case eFbxChar:		return FbxTypeCopy(pDst, *(FbxChar*)pSrc);
+		case eFbxUChar:		return FbxTypeCopy(pDst, *(FbxUChar*)pSrc);
+		case eFbxShort:		return FbxTypeCopy(pDst, *(FbxShort*)pSrc);
+		case eFbxUShort:	return FbxTypeCopy(pDst, *(FbxUShort*)pSrc);
+		case eFbxUInt:		return FbxTypeCopy(pDst, *(FbxUInt*)pSrc);
+		case eFbxLongLong:	return FbxTypeCopy(pDst, *(FbxLongLong*)pSrc);
+		case eFbxULongLong:	return FbxTypeCopy(pDst, *(FbxULongLong*)pSrc);
+		case eFbxHalfFloat:	return FbxTypeCopy(pDst, *(FbxHalfFloat*)pSrc);
+		case eFbxBool:		return FbxTypeCopy(pDst, *(FbxBool*)pSrc);
+		case eFbxInt:		return FbxTypeCopy(pDst, *(FbxInt*)pSrc);
+		case eFbxFloat:		return FbxTypeCopy(pDst, *(FbxFloat*)pSrc);
+		case eFbxDouble:	return FbxTypeCopy(pDst, *(FbxDouble*)pSrc);
+		case eFbxDouble2:	return FbxTypeCopy(pDst, *(FbxDouble2*)pSrc);
+		case eFbxDouble3:	return FbxTypeCopy(pDst, *(FbxDouble3*)pSrc);
+		case eFbxDouble4:	return FbxTypeCopy(pDst, *(FbxDouble4*)pSrc);
+		case eFbxDouble4x4:	return FbxTypeCopy(pDst, *(FbxDouble4x4*)pSrc);
+		case eFbxEnumM:
+		case eFbxEnum:		return FbxTypeCopy(pDst, *(FbxEnum*)pSrc);
+		case eFbxString:	return FbxTypeCopy(pDst, *(FbxString*)pSrc);
+		case eFbxTime:		return FbxTypeCopy(pDst, *(FbxTime*)pSrc);
+		case eFbxBlob:		return FbxTypeCopy(pDst, *(FbxBlob*)pSrc);
+		case eFbxDistance:	return FbxTypeCopy(pDst, *(FbxDistance*)pSrc);
+		case eFbxDateTime:	return FbxTypeCopy(pDst, *(FbxDateTime*)pSrc);
+
+		case eFbxReference:
+			FBX_ASSERT_NOW("Trying to set value on a void Reference type" );
+			break;
+
+		default:
+			FBX_ASSERT_NOW("Trying to assign an unknown type" );
+			break;
+	}
+	return false;
+}
+
+template<class T> inline bool FbxTypeCopy(void* pDst, EFbxType pDstType, const T& pSrc)
+{
+	switch( pDstType )
+	{
+		case eFbxChar:		return FbxTypeCopy(*(FbxChar*)pDst, pSrc);
+		case eFbxUChar:		return FbxTypeCopy(*(FbxUChar*)pDst, pSrc);
+		case eFbxShort:		return FbxTypeCopy(*(FbxShort*)pDst, pSrc);
+		case eFbxUShort:	return FbxTypeCopy(*(FbxUShort*)pDst, pSrc);
+		case eFbxUInt:		return FbxTypeCopy(*(FbxUInt*)pDst, pSrc);
+		case eFbxLongLong:	return FbxTypeCopy(*(FbxLongLong*)pDst, pSrc);
+		case eFbxULongLong:	return FbxTypeCopy(*(FbxULongLong*)pDst, pSrc);
+		case eFbxHalfFloat:	return FbxTypeCopy(*(FbxHalfFloat*)pDst, pSrc);
+		case eFbxBool:		return FbxTypeCopy(*(FbxBool*)pDst, pSrc);
+		case eFbxInt:		return FbxTypeCopy(*(FbxInt*)pDst, pSrc);
+		case eFbxFloat:		return FbxTypeCopy(*(FbxFloat*)pDst, pSrc);
+		case eFbxDouble:	return FbxTypeCopy(*(FbxDouble*)pDst, pSrc);
+		case eFbxDouble2:	return FbxTypeCopy(*(FbxDouble2*)pDst, pSrc);
+		case eFbxDouble3:	return FbxTypeCopy(*(FbxDouble3*)pDst, pSrc);
+		case eFbxDouble4:	return FbxTypeCopy(*(FbxDouble4*)pDst, pSrc);
+		case eFbxDouble4x4:	return FbxTypeCopy(*(FbxDouble4x4*)pDst, pSrc);
+		case eFbxEnumM:
+		case eFbxEnum:		return FbxTypeCopy(*(FbxEnum*)pDst, pSrc);
+		case eFbxString:	return FbxTypeCopy(*(FbxString*)pDst, pSrc);
+		case eFbxTime:		return FbxTypeCopy(*(FbxTime*)pDst, pSrc);
+		case eFbxBlob:		return FbxTypeCopy(*(FbxBlob*)pDst, pSrc);
+		case eFbxDistance:	return FbxTypeCopy(*(FbxDistance*)pDst, pSrc);
+		case eFbxDateTime:	return FbxTypeCopy(*(FbxDateTime*)pDst, pSrc);
+
+		case eFbxReference:
+			FBX_ASSERT_NOW("Trying to set value on a void Reference type" );
+			break;
+
+		default:
+			FBX_ASSERT_NOW("Trying to assign an unknown type" );
+			break;
+	}
+	return false;
+}
+
+inline bool FbxTypeCopy(void* pDst, EFbxType pDstType, const void* pSrc, EFbxType pSrcType)
+{
+	switch( pSrcType )
+	{
+		case eFbxChar:		return FbxTypeCopy(pDst, pDstType, *(FbxChar*)pSrc);
+		case eFbxUChar:		return FbxTypeCopy(pDst, pDstType, *(FbxUChar*)pSrc);
+		case eFbxShort:		return FbxTypeCopy(pDst, pDstType, *(FbxShort*)pSrc);
+		case eFbxUShort:	return FbxTypeCopy(pDst, pDstType, *(FbxUShort*)pSrc);
+		case eFbxUInt:		return FbxTypeCopy(pDst, pDstType, *(FbxUInt*)pSrc);
+		case eFbxLongLong:	return FbxTypeCopy(pDst, pDstType, *(FbxLongLong*)pSrc);
+		case eFbxULongLong:	return FbxTypeCopy(pDst, pDstType, *(FbxULongLong*)pSrc);
+		case eFbxHalfFloat:	return FbxTypeCopy(pDst, pDstType, *(FbxHalfFloat*)pSrc);
+		case eFbxBool:		return FbxTypeCopy(pDst, pDstType, *(FbxBool*)pSrc);
+		case eFbxInt:		return FbxTypeCopy(pDst, pDstType, *(FbxInt*)pSrc);
+		case eFbxFloat:		return FbxTypeCopy(pDst, pDstType, *(FbxFloat*)pSrc);
+		case eFbxDouble:	return FbxTypeCopy(pDst, pDstType, *(FbxDouble*)pSrc);
+		case eFbxDouble2:	return FbxTypeCopy(pDst, pDstType, *(FbxDouble2*)pSrc);
+		case eFbxDouble3:	return FbxTypeCopy(pDst, pDstType, *(FbxDouble3*)pSrc);
+		case eFbxDouble4:	return FbxTypeCopy(pDst, pDstType, *(FbxDouble4*)pSrc);
+		case eFbxDouble4x4:	return FbxTypeCopy(pDst, pDstType, *(FbxDouble4x4*)pSrc);
+		case eFbxEnumM:
+		case eFbxEnum:		return FbxTypeCopy(pDst, pDstType, *(FbxEnum*)pSrc);
+		case eFbxString:	return FbxTypeCopy(pDst, pDstType, *(FbxString*)pSrc);
+		case eFbxTime:		return FbxTypeCopy(pDst, pDstType, *(FbxTime*)pSrc);
+		case eFbxBlob:		return FbxTypeCopy(pDst, pDstType, *(FbxBlob*)pSrc);
+		case eFbxDistance:	return FbxTypeCopy(pDst, pDstType, *(FbxDistance*)pSrc);
+		case eFbxDateTime:	return FbxTypeCopy(pDst, pDstType, *(FbxDateTime*)pSrc);
+
+		case eFbxReference:
+			FBX_ASSERT_NOW("Trying to set value on a void Reference type" );
+			break;
+
+		default:
+			FBX_ASSERT_NOW("Trying to assign an unknown type" );
+			break;
+	}
+	return false;
+}
+
+/** Creates a fbx primitive type and initializes its memory.
+  * \param pType The type of object to create.
+  * \return A pointer to the new primitive object. Note that the caller owns the returned object.
+  *         The pointer returned is NULL if pType is eFbxUndefined or an unknown type.
+  */
+FBXSDK_DLL void* FbxTypeAllocate(const EFbxType pType);
+
+/** Destroys an fbx primitive type. If the return value is true
+  * the memory pointed to by pData has been deleted and should
+  * no longer be accessed.
+  * \param pType The type of object being deleted
+  * \param pData Pointer to the object being deleted.
+  * \return true if the object was destroyed, false otherwise.
+  */
+FBXSDK_DLL bool FbxTypeDeallocate(const EFbxType pType, void* pData);
+
+/** Compare two values of the same type
+  * \param pA first value
+  * \param pB second value
+  * \param pType The data type of both values
+  * \return \c true if equal, \c false otherwise
+  */
+FBXSDK_DLL bool FbxTypeCompare(const void* pA, const void* pB, const EFbxType pType);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_PROPERTY_TYPES_H_ */

+ 260 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxquery.h

@@ -0,0 +1,260 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxquery.h
+#ifndef _FBXSDK_CORE_QUERY_H_
+#define _FBXSDK_CORE_QUERY_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxclassid.h>
+#include <fbxsdk/core/fbxconnectionpoint.h>
+#include <fbxsdk/core/base/fbxmap.h>
+#include <fbxsdk/core/base/fbxmemorypool.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+#define FBXSDK_QUERY_UNIQUE_ID 0x14000000
+
+class FbxProperty;
+
+/** Base class to manage query. A query contains a filter and reference ID, which will be used to search and retrieve objects. 
+* The derived query classes are used to create FbxCriteria.
+* \nosubgrouping */
+class FBXSDK_DLL FbxQuery
+{
+public:
+	//! Get unique filter Id
+	virtual FbxInt GetUniqueId() const { return FBXSDK_QUERY_UNIQUE_ID; }
+
+	/** Judge if the given property is valid.
+	* \param pProperty The given property.
+	* \return \c true always, not implemented. */
+	virtual bool IsValid(const FbxProperty& pProperty) const;
+
+	/** This compares whether two FbxQuery are the same, NOT whether the query matches or not. It's strictly the equivalent of an operator==, but virtual.
+	* \param pOtherQuery The given FbxQuery */
+	virtual bool IsEqual(FbxQuery* pOtherQuery) const;
+
+	//! Add one to ref count.
+	void Ref();
+
+	//! Minus one to ref count, if ref count is zero, delete this query object.
+	void Unref();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+protected:
+    FbxQuery();
+    virtual ~FbxQuery();
+
+private:
+    class InternalFilter : public FbxConnectionPointFilter
+	{
+	public:
+		InternalFilter(FbxQuery* pQuery);
+		~InternalFilter();
+
+	public:
+		FbxConnectionPointFilter*	Ref();
+		void						Unref();
+		FbxInt						GetUniqueId() const { return mQuery->GetUniqueId(); }
+		bool						IsValid(FbxConnectionPoint* pConnect) const;
+		bool						IsEqual(FbxConnectionPointFilter* pConnectFilter) const;
+
+		FbxQuery*					mQuery;
+    };
+
+    InternalFilter	mFilter;
+    int				mRefCount;
+
+    FBXSDK_FRIEND_NEW();
+    friend class FbxProperty;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+/** Defines a filtering criteria for a query of objects, connections and properties, so that only those satisfying the criteria are
+* affected by the query. Some examples of kinds of criteria are object type, connection type, or property. Criteria can be combined
+* using logical operators such as "and" and "or".
+* \note 
+* Objects are basic elements in FBX. Each of them has a hierarchy type and some properties. Objects and properties can be connected
+* through a connection to represent a relationship between them. (e.g. child-parent, container membership, reference, etc.,). In a
+* query, you could select object or properties based on these criteria.
+* Here are some examples:
+* \code
+* FbxObject* lObject = FbxObject::Create(lManager, "Object");
+* int lSrcLightCount = lObject->RootProperty.GetSrcObjectCount(FbxCriteria::ObjectType(FbxLight::ClassId));
+* int lSrcDeformerCount = lObject->RootProperty.GetSrcObjectCount(FbxCriteria::ObjectTypeStrict(FbxDeformer::ClassId));
+* int lSrcPropertyCount = lObject->RootProperty.GetSrcCount(FbxCriteria::IsProperty());
+* \endcode
+* \see FbxQuery
+* \see FbxProperty::GetSrcObjectCount(const FbxCriteria&) const
+* \see FbxCollection::GetMemberCount(const FbxCriteria&) const
+* \nosubgrouping */
+class FBXSDK_DLL FbxCriteria
+{
+public:
+	/** Creates a new query criteria that only selects objects which have a specific
+	* class ID or derive from a class with a specific class ID.
+	* \param pClassId The base type class ID */
+	static FbxCriteria ObjectType(const FbxClassId& pClassId);
+
+	/** Creates a new query criteria that only selects objects which have a specific class ID.
+	* \param pClassId The type class ID */
+	static FbxCriteria ObjectTypeStrict(const FbxClassId& pClassId);
+
+	//! Creates a new query criteria that only selects properties.
+	static FbxCriteria IsProperty();
+
+	/** Gets a logical conjunction (and) criteria from this and the specified criteria.
+	* \param pCriteria The specified criteria */
+	FbxCriteria operator&&(const FbxCriteria& pCriteria) const;
+
+	/** Gets a logical disjunction (or) criteria from this and the specified criteria.
+	* \param pCriteria The specified criteria */
+	FbxCriteria operator||(const FbxCriteria& pCriteria) const;
+
+	//! Returns a negated version of the criteria.
+	FbxCriteria operator!() const;
+
+	/** Retrieves the query.
+	* \return The query of this criteria */
+	FbxQuery* GetQuery() const;
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxCriteria();
+	FbxCriteria(const FbxCriteria& pCriteria);
+	FbxCriteria(FbxQuery* pQuery);
+	~FbxCriteria();
+
+	FbxCriteria& operator=(const FbxCriteria& pCriteria);
+
+private:
+    FbxQuery* mQuery;
+
+	static void FreeGlobalCache();
+
+    FBXSDK_FRIEND_NEW();
+	friend class FbxManager;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+//! Functor to compare FbxCriteria
+struct FbxCriteriaCompare
+{
+	inline int operator()(const FbxCriteria& pKeyA, const FbxCriteria& pKeyB) const
+	{
+		const FbxQuery* lKeyA = pKeyA.GetQuery();
+		const FbxQuery* lKeyB = pKeyB.GetQuery();
+		return lKeyA < lKeyB ? -1 : (lKeyA > lKeyB ? 1 : 0);
+	}
+};
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+class FBXSDK_DLL FbxQueryOperator : public FbxQuery
+{
+public:
+    FBXSDK_FRIEND_NEW();
+
+	enum EType {eAND, eOR};
+
+    static FbxQueryOperator* Create(FbxQuery* pA, EType pOperator, FbxQuery* pB);
+    virtual FbxInt GetUniqueId() const { return FBXSDK_QUERY_UNIQUE_ID+1; }
+    virtual bool IsValid(const FbxProperty& pProperty) const;
+    virtual bool IsEqual(FbxQuery* pOtherQuery) const;
+
+protected:
+    FbxQueryOperator(FbxQuery* pA, EType pOperator, FbxQuery* pB);
+    virtual ~FbxQueryOperator();
+
+private:
+    FbxQuery	*mA, *mB;
+    EType		mOperator;
+};
+
+class FBXSDK_DLL FbxQueryOperatorUnary : public FbxQuery
+{
+public:
+    FBXSDK_FRIEND_NEW();
+
+    static FbxQueryOperatorUnary* Create(FbxQuery* pA);
+    virtual FbxInt GetUniqueId() const{ return FBXSDK_QUERY_UNIQUE_ID+2; }
+    virtual bool IsValid(const FbxProperty& pProperty) const;
+    virtual bool IsEqual(FbxQuery* pOtherQuery) const;
+
+protected:
+    FbxQueryOperatorUnary(FbxQuery* pA);
+    virtual ~FbxQueryOperatorUnary();
+
+private:
+    FbxQuery* mA;
+};
+
+class FBXSDK_DLL FbxQueryClassId : public FbxQuery
+{
+public:
+    FBXSDK_FRIEND_NEW();
+
+    static FbxQueryClassId* Create(const FbxClassId& pClassId);
+    virtual FbxInt GetUniqueId() const{ return FBXSDK_QUERY_UNIQUE_ID+3; }
+    virtual bool IsValid(const FbxProperty& pProperty) const;
+    virtual bool IsEqual(FbxQuery* pOtherQuery) const;
+
+protected:
+    FbxQueryClassId(const FbxClassId& pClassId);
+
+private:
+    FbxClassId	mClassId;
+};
+
+class FBXSDK_DLL FbxQueryIsA : public FbxQuery
+{
+public:
+    FBXSDK_FRIEND_NEW();
+
+    static FbxQueryIsA* Create(const FbxClassId& pClassId);       
+    virtual FbxInt GetUniqueId() const{ return FBXSDK_QUERY_UNIQUE_ID+4; }
+    virtual bool IsValid(const FbxProperty& pProperty) const;
+    virtual bool IsEqual(FbxQuery* pOtherQuery) const;
+
+protected:
+    FbxQueryIsA(const FbxClassId& pClassId);
+
+private:
+    FbxClassId mClassId;
+};
+
+class FBXSDK_DLL FbxQueryIsProperty : public FbxQuery
+{
+public:
+    FBXSDK_FRIEND_NEW();
+
+    static FbxQueryIsProperty* Create();
+    virtual FbxInt GetUniqueId() const{ return FBXSDK_QUERY_UNIQUE_ID+5; }
+    virtual bool IsValid(const FbxProperty& pProperty) const;
+    virtual bool IsEqual(FbxQuery* pOtherQuery) const;
+
+protected:
+    FbxQueryIsProperty();
+};
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_QUERY_H_ */

+ 57 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxqueryevent.h

@@ -0,0 +1,57 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxqueryevent.h
+#ifndef _FBXSDK_CORE_QUERY_EVENT_H_
+#define _FBXSDK_CORE_QUERY_EVENT_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxevent.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** A query event is something that is emitted by an entity, with the goal of being filled by someone that listen to it. 
+*  You can see that like a form that you send to some people. If those people know how to fill the form, they fill it and return
+*  it to you with the right information in it.  A query event is emitted, and plug-in who are listening to that type of query, 
+*  fill the data that can be accessed by the query emitter.
+*/
+template <typename QueryT> class FbxQueryEvent : public FbxEvent<FbxQueryEvent<QueryT> >
+{
+public:
+    /**
+    *\name Public interface
+    */
+    //@{
+    /** Constructor.
+	  * \param pData The requested data.  
+      */
+    explicit FbxQueryEvent(QueryT* pData):mData(pData){}
+
+    /** Accessor to a mutable reference to the data. Event are usually const and can't be modified by listener. 
+     * This special type of event can have is content modified via this accessor.
+     * \return A mutable reference the requested data.
+    */
+    QueryT& GetData()const { return *mData; }
+    //@}
+
+private:
+    mutable QueryT* mData;
+
+private:
+    virtual const char* GetEventName() const { FBX_ASSERT(false); return ""; }
+    static const char* FbxEventName() { FBX_ASSERT(false); return ""; }
+    friend class FbxEvent< FbxQueryEvent<QueryT> >;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_QUERY_EVENT_H_ */

+ 58 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxscopedloadingdirectory.h

@@ -0,0 +1,58 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxscopedloadingdirectory.h
+#ifndef _FBXSDK_CORE_SCOPED_LOADING_DIRECTORY_H_
+#define _FBXSDK_CORE_SCOPED_LOADING_DIRECTORY_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#ifndef FBXSDK_ENV_WINSTORE
+
+#include <fbxsdk/core/fbxloadingstrategy.h>
+#include <fbxsdk/core/fbxmodule.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxPluginHandle;
+
+//! A plug-in loading strategy that loads all DLLs with a specific extension from a specific directory. When this class is destroyed all of the plug-ins are unloaded.
+class FBXSDK_DLL FbxScopedLoadingDirectory : public FbxLoadingStrategy
+{
+public:
+	/** Constructor, which also load plug-ins in the folder specified.
+	* \param pDirectoryPath The directory path.
+	* \param pPluginExtension The plug-in extension. */
+	FbxScopedLoadingDirectory(const char* pDirectoryPath, const char* pPluginExtension);
+
+	/** Destructor. Unload plug-ins. */
+	virtual ~FbxScopedLoadingDirectory();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+	virtual bool SpecificLoad(FbxPluginData& pData);
+	virtual void SpecificUnload(FbxPluginData& pData);
+
+	FbxString mDirectoryPath;
+	FbxString mExtension;
+
+	FbxArray<FbxModule> mPluginHandles;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE */
+
+#endif /* _FBXSDK_CORE_SCOPED_LOADING_DIRECTORY_H_ */

+ 64 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxscopedloadingfilename.h

@@ -0,0 +1,64 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxscopedloadingfilename.h
+#ifndef _FBXSDK_CORE_SCOPED_LOADING_FILENAME_H_
+#define _FBXSDK_CORE_SCOPED_LOADING_FILENAME_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#ifndef FBXSDK_ENV_WINSTORE
+
+#include <fbxsdk/core/fbxloadingstrategy.h>
+#include <fbxsdk/core/fbxmodule.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** 
+ * A plug-in loading strategy that loads a single DLL by specifying the file name in the constructor, and unloads the DLL in its destructor.
+ */
+class FBXSDK_DLL FbxScopedLoadingFileName : public FbxLoadingStrategy
+{
+public:
+    /**
+     *\name Public interface
+     */
+    //@{
+		/** Constructor.
+		  * Load plug-in.
+		  * \param pPath The file path.
+		  */
+		explicit FbxScopedLoadingFileName(const char* pPath);
+
+		/** Destructor.
+		 * Unload plug-in.
+		 */
+		virtual ~FbxScopedLoadingFileName();
+    //@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+    virtual bool SpecificLoad(FbxPluginData& pData);
+    virtual void SpecificUnload(FbxPluginData& pData);
+
+    FbxModule mInstance;
+    FbxString mPath;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE */
+
+#endif /* _FBXSDK_CORE_SCOPED_LOADING_FILENAME_H_ */

+ 126 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxstream.h

@@ -0,0 +1,126 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxstream.h
+#ifndef _FBXSDK_CORE_STREAM_H_
+#define _FBXSDK_CORE_STREAM_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxfile.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Abstract class for implementing I/O operations through a stream of data.
+* For instance, it can be used to read data from a memory source, thus making it possible to import files from memory. However, 
+* for the time being, the FbxStream class is only supported with FBX files. 
+*/
+class FBXSDK_DLL FbxStream
+{
+public:
+	/** Current stream state. */
+	enum EState
+	{
+		eClosed,	//!< The stream is closed.
+		eOpen,		//!< The stream is open.
+		eEmpty		//!< The stream is empty.
+	};
+
+	/** Query the current state of the stream. */
+	virtual EState GetState() = 0;
+
+	/** Open the stream.
+	* \return True if successful.
+	* \remark Each time the stream is open or closed, the stream position must be reset to zero. */
+	virtual bool Open(void* pStreamData) = 0;
+
+	/** Close the stream.
+	* \return True if successful.
+	* \remark Each time the stream is open or closed, the stream position must be reset to zero. */
+	virtual bool Close() = 0;
+
+	/** Empties the internal data of the stream.
+	* \return True if successful. */
+	virtual bool Flush() = 0;
+
+	/** Writes a memory block.
+	* \param pData Pointer to the memory block to write.
+	* \param pSize Size (in bytes) of the memory block to write.
+	* \return The number of bytes written in the stream. */
+	virtual int Write(const void* /*pData*/, int /*pSize*/) = 0;
+
+	/** Read bytes from the stream and store them in the memory block.
+	* \param pData Pointer to the memory block where the read bytes are stored.
+	* \param pSize Number of bytes read from the stream.
+	* \return The actual number of bytes successfully read from the stream. */
+	virtual int Read(void* /*pData*/, int /*pSize*/) const = 0;
+
+	/** Read a string from the stream.
+	* The default implementation is written in terms of Read() but does not cope with DOS line endings.
+	* Subclasses may need to override this if DOS line endings are to be supported.
+	* \param pBuffer Pointer to the memory block where the read bytes are stored.
+	* \param pMaxSize Maximum number of bytes to be read from the stream.
+	* \param pStopAtFirstWhiteSpace Stop reading when any whitespace is encountered. Otherwise read to end of line (like fgets()).
+	* \return pBuffer, if successful, else NULL.
+	* \remark The default implementation terminates the \e pBuffer with a null character and assumes there is enough room for it.
+	* For example, a call with \e pMaxSize = 1 will fill \e pBuffer with the null character only. */
+	virtual char* ReadString(char* pBuffer, int pMaxSize, bool pStopAtFirstWhiteSpace=false);
+
+	/** If not specified by KFbxImporter::Initialize(), the importer will ask
+	* the stream to select an appropriate reader ID to associate with the stream.
+	* FbxIOPluginRegistry can be used to locate id by extension or description.
+	* Return -1 to allow FBX to select an appropriate default. */
+	virtual int GetReaderID() const = 0;
+
+	/** If not specified by KFbxExporter::Initialize(), the exporter will ask
+	* the stream to select an appropriate writer ID to associate with the stream.
+	* KFbxIOPluginRegistry can be used to locate id by extension or description.
+	* Return -1 to allow FBX to select an appropriate default. */
+	virtual int GetWriterID() const = 0;
+
+	/** Adjust the current stream position.
+	* \param pSeekPos Pre-defined position where offset is added (FbxFile::eBegin, FbxFile::eCurrent:, FbxFile::eEnd)
+	* \param pOffset Number of bytes to offset from pSeekPos. */
+	virtual void Seek(const FbxInt64& pOffset, const FbxFile::ESeekPos& pSeekPos)=0;
+
+	/** Get the current stream position.
+	* \return Current number of bytes from the beginning of the stream. */
+	virtual long GetPosition() const = 0;
+
+	/** Set the current stream position.
+	* \param pPosition Number of bytes from the beginning of the stream to seek to. */
+	virtual void SetPosition(long pPosition)=0;
+
+	/** Return 0 if no errors occurred. Otherwise, return 1 to indicate
+	* an error. This method will be invoked whenever FBX needs to verify
+	* that the last operation succeeded. */
+	virtual int GetError() const = 0;
+
+	/** Clear current error condition by setting the current error value to 0. */
+	virtual void ClearError() = 0;
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxStream(){};
+	virtual ~FbxStream(){};
+
+	int Write(const char* pData, int pSize){ return Write((void*)pData, pSize); }
+	int Write(const int* pData, int pSize){ return Write((void*)pData, pSize); }
+	int Read(char* pData, int pSize) const { return Read((void*)pData, pSize); }
+	int Read(int* pData, int pSize) const { return Read((void*)pData, pSize); }
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_STREAM_H_ */

+ 135 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxsymbol.h

@@ -0,0 +1,135 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxsymbol.h
+#ifndef _FBXSDK_CORE_SYMBOL_H_
+#define _FBXSDK_CORE_SYMBOL_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+#include <fbxsdk/core/base/fbxmap.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Defines a symbol string. A symbol string is a string that is unique and stored in a global symbol table.
+* \nosubgrouping */
+class FBXSDK_DLL FbxSymbol
+{
+public:
+    /**
+    * \name Constructors and Destructor
+    */
+    //@{
+
+    /** Constructor.
+    * Construct a symbol and add it to global symbol table.
+    * \param pName Symbol name.
+    * \param pRealm The real value for this symbol. 
+    */
+    FbxSymbol(const char* pName, const char* pRealm);
+
+    //! Destructor.
+    ~FbxSymbol();
+    //@}
+
+    /**
+    * \name Access function.
+    */
+    //@{
+    /**
+    * Get ID in global symbol table.
+    * \return Symbol ID in global symbol table.
+    */
+    unsigned int GetID() const;
+    //@}
+
+    /**
+    * \name Symbol comparison
+    */
+    //@{
+    /** Equality operator.
+    * \param pSymbol The symbol to be compared. 
+    */
+    bool operator==(FbxSymbol const& pSymbol) const;
+
+    /** Inequality operator.
+    * \param pSymbol The symbol to be compared. 
+    */
+    bool operator!=(FbxSymbol const& pSymbol) const;
+    //@}
+
+private:
+    unsigned int mID;
+};
+
+typedef FbxMap< FbxString, int, FbxStringCompare > FbxStringSymbolMap;
+
+
+/** This class is to mark a string as symbol.
+  * String Symbol only has its name.
+  * /remarks Each symbol is unique. That means there are no symbols which have the same name.
+* \nosubgrouping */
+class FBXSDK_DLL FbxStringSymbol
+{
+public:
+    /**
+    * \name Constructors and Destructor
+    */
+    //@{
+
+    //! Default constructor.
+    FbxStringSymbol();
+
+    /** Constructor.
+    * Construct a symbol and add it to global symbol table.
+    * \param pName Symbol name.
+    */
+    FbxStringSymbol(const char* pName);
+
+    //! Copy constructor.
+    FbxStringSymbol(const FbxStringSymbol& pOther);
+
+    //! Destructor.
+    ~FbxStringSymbol();
+    //@}
+
+    //! Cast operator to const char* type.
+    inline operator const char*() const { return mItem ? ((const char*) mItem->GetKey()) : NULL; }
+
+
+    /** Determine the symbol empty or not.
+    * \return \c true if empty. \c false otherwise.
+    */    
+    inline bool IsEmpty() const
+    {
+        return !mItem || mItem->GetKey().IsEmpty();
+    }
+
+    //! Static function to allocate global string symbol map.
+    static void AllocateGlobalStringSymbolMap();
+
+    //! Static function to deallocate global string symbol map.
+    static void FreeGlobalStringSymbolMap();
+
+    /** Assignment operator.
+    * \param pName  The symbol value. 
+    * \return       The self after assignment.
+    */
+    FbxStringSymbol& operator=(const char* pName);
+
+private:
+    FbxStringSymbolMap::RecordType* mItem;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_SYMBOL_H_ */

+ 219 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxsystemunit.h

@@ -0,0 +1,219 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxsystemunit.h
+#ifndef _FBXSDK_CORE_SYSTEM_UNIT_H_
+#define _FBXSDK_CORE_SYSTEM_UNIT_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+#include <fbxsdk/core/base/fbxarray.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxAMatrix;
+class FbxScene;
+class FbxNode;
+class FbxAnimCurveNode;
+
+/** \brief This class describes the units of measurement used within a particular scene.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxSystemUnit 
+{
+public:
+
+    /** Struct to define various options that you can use to convert the system unit of a scene.
+      * The default values are:
+      *         mConvertRrsNodes = true
+      *         mConvertLimits = true
+      *         mConvertClusters = true
+      *         mConvertLightIntensity = true
+      *         mConvertPhotometricLProperties = true
+      *         mConvertCameraClipPlanes = true
+      *
+      * The default configuration have been tested to give the best conversion results in the majority of the case. 
+      * \remark Changing any of these values will have a direct impact on the whole scene behavior. 
+      */
+    struct ConversionOptions
+    {
+        //! This flag indicates whether or not to convert the nodes that do not inherit their parent's scale.
+        bool mConvertRrsNodes;  
+
+        //! This flag indicates whether or not to convert limits.
+        bool mConvertLimits;
+
+        //! This flag indicates whether or not to convert clusters.
+        bool mConvertClusters;
+
+        //! This flag indicates whether or not to convert the light intensity property.
+        bool mConvertLightIntensity;	
+
+        //! This flag indicates whether or not to convert photometric lights properties.
+        bool mConvertPhotometricLProperties;
+
+        //! This flag indicates whether or not to convert the cameras clip planes.
+        bool mConvertCameraClipPlanes;
+    };
+
+	FbxSystemUnit();
+
+    /** Constructor.
+      * \param pScaleFactor The equivalent number of centimeters in the new system unit. 
+      *                     For example, an inch unit uses a scale factor of 2.54.
+      * \param pMultiplier  A multiplier factor of pScaleFactor.
+      */
+    FbxSystemUnit(double pScaleFactor, double pMultiplier = 1.0);
+
+    /** Destructor.
+      */
+    ~FbxSystemUnit();
+
+    //! Predefined system unit for millimeters.
+    static const FbxSystemUnit mm;
+
+    //! Predefined system unit for decimeters.
+    static const FbxSystemUnit dm;
+
+    //! Predefined system unit for centimeters.
+    static const FbxSystemUnit cm;
+
+    //! Predefined system unit for meters.
+    static const FbxSystemUnit m;
+
+    //! Predefined system unit for kilometers.
+    static const FbxSystemUnit km;
+
+    //! Predefined system unit for inches.
+    static const FbxSystemUnit Inch;
+
+    //! Predefined system unit for feet.
+    static const FbxSystemUnit Foot;
+    
+    //! Predefined system unit for miles.
+    static const FbxSystemUnit Mile;
+
+    //! Predefined system unit for yards.
+    static const FbxSystemUnit Yard;
+
+    #define FBXSDK_SYSTEM_UNIT_PREDEF_COUNT 9
+
+    //! Points to a FbxSystemUnit array to store the predefined system units. The array size is FBXSDK_SYSTEM_UNIT_PREDEF_COUNT.
+    static const FbxSystemUnit *sPredefinedUnits;
+
+    //! Stores the default conversion options.
+    static const ConversionOptions DefaultConversionOptions;
+
+    /** Converts a scene from its system units to this system unit.
+      * \param pScene The scene to convert.
+      * \param pOptions Conversion options, see:FbxSystemUnit::ConversionOptions.
+      */
+    void ConvertScene( FbxScene* pScene, const ConversionOptions& pOptions = DefaultConversionOptions ) const;
+
+    /** Converts the child (or children) of the given node from the system unit to this system unit.
+      * Unlike the ConvertScene() method, this method does not set the axis system 
+      * of the scene to which the pRoot node belongs. It also does not adjust FbxPose
+      * as they are not stored under the scene, and not under a particular node.
+      * \param pRoot The given node.
+      * \param pSrcUnit The source system unit.
+      * \param pOptions Conversion options, see:FbxSystemUnit::ConversionOptions.
+      */
+    void ConvertChildren( FbxNode* pRoot, const FbxSystemUnit& pSrcUnit, const ConversionOptions& pOptions = DefaultConversionOptions ) const;
+
+    /** Converts a scene from its system unit to this system unit, using the specified 
+      * Fbx_Root node. This method is provided for backwards compatibility only
+      * and instead you should use ConvertScene( FbxScene* , const ConversionOptions&  ) whenever possible.
+      * \param pScene The scene to convert.
+      * \param pFbxRoot The Fbx_Root node to use for conversion.
+      * \param pOptions Conversion options, see:FbxSystemUnit::ConversionOptions
+      */
+    void ConvertScene( FbxScene* pScene, FbxNode* pFbxRoot, const ConversionOptions& pOptions = DefaultConversionOptions ) const;
+
+    /** Returns the system unit's scale factor, relative to centimeters.
+      * This factor scales system unit values to centimeters. If you want to scale values to centimeters, use this value.
+      * Ignore the "multiplier" (returned by GetMultiplier()) value. 
+      * \return The the system unit's scale factor, relative to centimeters.
+      */
+    double GetScaleFactor() const;
+
+    /** Returns a unit label for the current scale factor.
+      * \param pAbbreviated If \c true, returns abbreviated string. 
+      * \return The unit label for the current scale factor.
+      */
+    FbxString GetScaleFactorAsString(bool pAbbreviated = true) const;
+
+    /** Returns a unit label for the current scale factor. 
+      * The first letter of the label is in upper case and the label should be pluralized. 
+      * \return The unit label for the current scale factor.
+      */
+    FbxString GetScaleFactorAsString_Plurial() const;
+
+    /** Returns the multiplier factor of the system unit.
+      */
+    double GetMultiplier() const;
+
+    /** Equivalence operator.
+      * \param pOther Another system unit compared with this system unit.
+      * \return \c True if equal, \c false otherwise.
+      */   
+    bool operator==(const FbxSystemUnit& pOther) const;
+
+    /** Non-equivalence operator.
+      * \param pOther Another system unit compared with this system unit.
+      * \return \c True if unequal, \c false otherwise.
+      */  
+    bool operator!=(const FbxSystemUnit& pOther) const;
+
+    /** Assignment operation.
+      * \param pSystemUnit Unit system assigned to this one.
+      */
+	FbxSystemUnit& operator=(const FbxSystemUnit& pSystemUnit);
+
+    /** Returns the conversion factor from this system unit to the target system unit, excluding the multiplier factor.
+      * \param pTarget The target system unit.
+      */
+    double GetConversionFactorTo( const FbxSystemUnit& pTarget ) const;
+
+    /** Returns the conversion factor from the source system unit to this system unit, excluding the multiplier factor.
+      * \param pSource The source system unit.
+      */
+    double GetConversionFactorFrom( const FbxSystemUnit& pSource ) const;
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+    void ApplyMultiplier(FbxNode* pRoot, bool pSubChildrenOnly) const;
+    void ConvertSTProperties(FbxArray<FbxNode*>& pNodes, double pConversionFactor) const;
+    void ConvertSProperty(FbxArray<FbxNode*>& pNodes, double pConversionFactor) const;
+    void ConvertAnimCurveNode(FbxArray<FbxAnimCurveNode*>& pFCurves, double pConversionFactor) const;
+    double GetConversionFactor(double pTargetScaleFactor, double pSourceScaleFactor) const;
+    void AdjustPivots(FbxNode* pNode, double pConversionFactor, FbxAMatrix& pOriginalGlobalM ) const;
+    void AdjustLimits(FbxNode* pNode, double pConversionFactor) const;
+    void AdjustPoses(FbxScene* pScene, double pConversionFactor) const;
+    void AdjustCluster(FbxNode* pNode, double pConversionFactor) const;
+    void AdjustLightIntensity(FbxNode* pNode, const double pConversionFactor) const;
+    void AdjustPhotometricLightProperties(FbxNode* pNode, const double pConversionFactor) const;
+    void AdjustCameraClipPlanes(FbxNode* pNode, const double pConversionFactor) const;
+    void ConvertChildren(FbxNode* pRoot, const FbxSystemUnit& pSrcUnit, bool pSubChildrenOnly, const ConversionOptions& pOptions) const;
+
+    double mScaleFactor;
+    double mMultiplier;
+
+    friend class FbxGlobalSettings;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_SYSTEM_UNIT_H_ */

+ 227 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/fbxxref.h

@@ -0,0 +1,227 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxxref.h
+#ifndef _FBXSDK_CORE_XREF_H_
+#define _FBXSDK_CORE_XREF_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxarray.h>
+#include <fbxsdk/core/base/fbxstring.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxProperty;
+class FbxDocument;
+class FbxXRefManagerProject;
+
+/** This class manages external references to files.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxXRefManager
+{
+public:
+    //! Default constructor.
+    FbxXRefManager();
+
+    //! Destructor.
+    virtual ~FbxXRefManager();
+
+    /**
+      * \name Predefined Project Types
+      */
+    //@{
+
+        //! This project represents an URL for storing temporary files.
+        static const char* sTemporaryFileProject;
+
+        //! This project represents an URL for configuration files.
+        static const char* sConfigurationProject;
+
+        //! This project represents an URL for storing localization files (that is not part of the asset library).
+        static const char* sLocalizationProject;
+
+        /** This project is used for creating the ".fbm" folders that are used for
+          * storing embedded resources in FBX files.
+          *  
+          * When not set, or if the folder is not writable, the ".fbm"
+          * folder is created alongside the FBX file.
+          *  
+          * If we cannot write in that folder, we look at the sTemporaryFileProject location.
+          * If no folder is set in the sTemporaryFileProject location, or it is not
+          * writable, the operating system's Temp folder becomes the location.
+          */
+        static const char* sEmbeddedFileProject;
+    //@}
+
+    /**
+      * \name XRef URL properties
+      */
+    //@{
+        /** Returns the number of URLs that are stored in a property.
+		  * \param pProperty                The property. 
+          * \return                         The URL count.
+          */
+        static int     GetUrlCount(FbxProperty const &pProperty);
+
+        /** Returns the number of URLs that are stored in a string.
+		  * \param pUrl                     The string.
+		  * \return                         The URL count.
+		  */
+		 
+        static int     GetUrlCount(FbxString const& pUrl);
+
+        /** Checks whether the URL at the given index stored in the property is relative or not.
+		  * \param pProperty                The property.
+		  * \param pIndex                   The URL index.
+          * \return                         \c True if the URL is relative, \c false if the URL is not relative.
+          */
+        static bool IsRelativeUrl  (FbxProperty const &pProperty,int pIndex);
+
+        /** Returns the URL stored in the property at the given index.
+		  * \param pProperty                The property.
+		  * \param pIndex                   The URL index.
+          * \return The URL
+          */
+        static FbxString GetUrl(FbxProperty const &pProperty,int pIndex);
+
+        /** Tries to resolve the URL stored in the property at the given index.
+		  * \param pProperty                The property.
+		  * \param pIndex                   The URL index.
+		  * \param pResolvedPath            Filled with the resolved path.
+          * \return                         \c True if the URL is resolved, return \c false if the URL is not resolved.
+          */
+        bool GetResolvedUrl (FbxProperty const &pProperty,int pIndex,FbxString & pResolvedPath) const;
+    
+        /** Tries to resolve the specified URL.
+		  * \param pUrl                     The specified URL.
+		  * \param pDoc                     The document whose ".fbm" folder is used to resolve the URL.
+		  * \param pResolvedPath            Filled with the resolved path.
+          * \return                         \c True if the URL is resolved, return \c false if the URL is not resolved.
+          */
+        bool GetResolvedUrl (const char* pUrl, FbxDocument* pDoc, FbxString& pResolvedPath) const;
+    //@}
+
+        /** Looks for the first file that matches a specified "pattern",
+          * which is built as:
+          *
+          * if pOptExt is given:         prefix*.ext
+          * If pOptExt is NULL:          prefix*
+          * if pOptExt is "" or ".":     prefix*.
+          *
+          * Returns the URL of the first matching files. This function cannot be
+          * used to resolve folders, only files.
+          *
+          * If a document is given, we start by looking at the document's ".fbm" folder.
+	      * \param pPrefix                  The prefix of the pattern.
+	      * \param pOptExt                  The extension of the pattern.
+	      * \param pDoc                     The given document.
+	      * \param pResolvedPath            Filled with the first matching URL.
+	      * \return                         \c True if one matching file is found, returns \c false if no matching file is found.
+          */
+        bool GetFirstMatchingUrl(const char* pPrefix, const char* pOptExt, const FbxDocument* pDoc, FbxString& pResolvedPath) const;
+
+    /**
+      * \name XRef Resolve URL and Projects
+      */
+    //@{
+
+        /** Adds an XRef Project.
+          * Note:Only one URL is associated with a project. Calling 
+          * this on an existing project replaces the project's existing URL.
+          * \param pName                    The name of the project
+          * \param pUrl                     The URL to be associated with the project.
+          * \return                         \c True if the project is added successfully, \c false if no project is added.
+         */
+        bool        AddXRefProject   (const char *pName,const char *pUrl);
+
+        /** Adds an XRef Project.
+          * Note:Only one URL is associated with a project. Calling 
+          * this on an existing project replaces the project's existing URL.
+          * \param pName                    The name of the project
+		  * \param pExtension               The extension of the project.
+          * \param pUrl                     The URL to be associated with the project.
+          * \return                         \c True if the project is added successfully, returns \c false if no project is added.
+         */
+        bool        AddXRefProject   (const char *pName,const char *pExtension,const char *pUrl);
+
+        /** Adds an XRef project based on the document's EmbeddedUrl 
+          * property if set, if EmbeddedUrl is not set, based on its current URL property. 
+          * \param pDoc                     The document used to name the project and to specify the URL.
+          * \return                         \c True if the project is added successfully, returns \c false if no project is added.
+          * \remarks                        The project name is set as the document name and the URL is set as EmbeddedUrl or URL of the document.
+          */
+        bool        AddXRefProject   (FbxDocument* pDoc);
+
+		/** Removes an XRef Projects.
+		  * \param pName                    The name of the project to be removed.
+		  * \return                         \c True if the project is removed successfully, returns \c false if the project with the name does not exist.
+		  */
+        bool        RemoveXRefProject(const char *pName);
+
+		/** Removes all XRef Projects. 
+          * \return                         \c True always.
+          */
+        bool        RemoveAllXRefProjects();
+
+        /** Returns the number of XRef Projects.
+		  * \return                         The number of XRef Projects.
+		  */
+        int         GetXRefProjectCount() const;
+
+		/** Returns the name of the XRef project at the specified index.
+		  * \param pIndex                   The XRef project index.
+		  * \return                         The XRef project name.
+		  */
+        const char *GetXRefProjectName(int pIndex) const;
+
+        /** Returns the base URL for the given project.
+          * \param pName                    The name of the given project
+          * \return                         The base URL of the project or returns NULL if the project with the name is not found.
+          */
+        const char* GetXRefProjectUrl(const char* pName);   // FIXME: Should be const, will break AV.
+
+        /** Returns the base URL for the given project.
+          * \param pName                    The name of the given project
+          * \return                         The base URL of the project or returns NULL if the project with the name is not found.
+          */
+        const char* GetXRefProjectUrl(const char* pName) const;
+
+        /** Returns the base URL for the given project.
+          * \param pIndex                   The index of the project.
+          * \return                         The base URL of the project or NULL if the index is out of bounds.
+          */
+        const char* GetXRefProjectUrl(int pIndex) const;
+
+        /** Checks if a project with the given name is defined in this manager.
+		  * \param pName                    The name of the project.
+		  * \return                         \c True if the project is defined in this manager, returns \c false if it isn't defined in this manager.
+		  */
+        inline bool HasXRefProject( const char* pName ) { return GetXRefProjectUrl(pName) != NULL; }
+
+        /** Tries to resolve an relative URL
+		  * \param pUrl                     The relative URL to be resolved.
+		  * \param pResolvePath             Filled with the resolved path.
+          * \return                         \c True if the URL is resolved, returns \c false if the URL is not resolved.
+          */
+        bool GetResolvedUrl (const char* pUrl,FbxString & pResolvePath) const;
+
+    //@}
+private:
+    FbxArray<FbxXRefManagerProject*>    mProjects;
+
+    static bool UrlExist(const char* pUrl);
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_XREF_H_ */

+ 340 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxaffinematrix.h

@@ -0,0 +1,340 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxaffinematrix.h
+#ifndef _FBXSDK_CORE_MATH_AFFINE_MATRIX_H_
+#define _FBXSDK_CORE_MATH_AFFINE_MATRIX_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/math/fbxvector4.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/**	FBX SDK affine matrix class.
+  * \nosubgrouping
+  * Matrices are defined using the Column Major scheme. When a FbxAMatrix represents a transformation (translation, rotation and scale), 
+  * the last row of the matrix represents the translation part of the transformation.
+  *
+  * \remarks It is important to realize that an affine matrix must respect a certain structure.  To be sure the structure is respected,
+  * use SetT, SetR, SetS, SetQ, SetTRS or SetTQS.  If by mistake bad data is entered in this affine matrix, some functions such as 
+  * Inverse() will yield wrong results.  If a matrix is needed to hold values that aren't associate with an affine matrix, please use FbxMatrix instead.
+  */
+class FBXSDK_DLL FbxAMatrix : public FbxDouble4x4
+{
+public:
+	/**
+	  * \name Constructors and Destructor
+	  */
+	//@{
+		//! Constructor.
+		FbxAMatrix();
+
+		/** Copy constructor.
+		  * \param pOther FbxAMatrix copied to this one.
+		  */
+		FbxAMatrix(const FbxAMatrix& pOther);
+
+		/** Constructor.
+		  *	\param pT     Translation vector.
+		  *	\param pR     Euler rotation vector.
+		  *	\param pS     Scale vector.
+		  */
+		FbxAMatrix(const FbxVector4& pT, const FbxVector4& pR, const FbxVector4& pS);
+
+		//! Destructor.
+		~FbxAMatrix();
+	//@}
+
+	/**
+	  * \name Access
+	  */
+	//@{
+		/** Retrieve matrix element.
+		  *	\param pY     Row index.
+		  *	\param pX     Column index.
+		  * \return       Cell [ pX, pY ] value.
+		  */
+		double Get(int pY, int pX) const;
+
+		/** Extract translation vector.
+		  * \return     Translation vector.
+		  */
+		FbxVector4 GetT() const;
+
+		/** Extract rotation vector.
+		  * \return     Rotation vector.
+		  * \remarks    The returned rotation vector is in Euler angle and the rotation order is XYZ.
+		  */
+		FbxVector4 GetR() const;
+
+		/** Extract quaternion vector.
+		  * \return     Quaternion vector.
+		  */
+		FbxQuaternion GetQ() const;
+
+		/** Extract scale vector.
+		  * \return     Scale vector.
+		  */
+		FbxVector4 GetS() const;
+
+		/** Extract a row vector.
+		  *	\param pY     Row index.
+		  * \return       The row vector.
+		  */
+		FbxVector4 GetRow(int pY) const;
+
+		/** Extract a column vector.
+		  *	\param pX     Column index.
+		  * \return       The column vector.
+		  */
+		FbxVector4 GetColumn(int pX) const;
+
+		//! Set matrix to identity.
+		void SetIdentity();
+
+		/** Set matrix's translation.
+		  * \param pT     Translation vector.
+		  */
+		void SetT(const FbxVector4& pT);
+
+		/** Set matrix's Euler rotation.
+		  * \param pR     X, Y and Z rotation values expressed as a vector.
+		  * \remarks      The rotation transform is constructed in rotation order XYZ.
+		  */
+		void SetR(const FbxVector4& pR);
+
+		/** Set matrix's quaternion.
+		  * \param pQ     The new quaternion.
+		  */
+		void SetQ(const FbxQuaternion& pQ);
+
+		/** Set matrix's scale.
+		  * \param pS     X, Y and Z scaling factors expressed as a vector.
+		  */
+		void SetS(const FbxVector4& pS);
+
+		/** Set matrix.
+		  *	\param pT     Translation vector.
+		  *	\param pR     Rotation vector.
+		  *	\param pS     Scale vector.
+		  */
+		void SetTRS(const FbxVector4& pT, const FbxVector4& pR, const FbxVector4& pS);
+
+		/** Set matrix.
+		  *	\param pT     Translation vector.
+		  *	\param pQ     Quaternion vector.
+		  *	\param pS     Scale vector.
+		  */
+		void SetTQS(const FbxVector4& pT, const FbxQuaternion& pQ, const FbxVector4& pS);
+
+		/** Assignment operator.
+		  * \param pM FbxAMatrix assigned to this one.
+		  */
+		FbxAMatrix& operator=(const FbxAMatrix& pM);
+	//@}
+
+	/**
+	  * \name Scalar Operations
+	  */
+	//@{
+		/** Multiply matrix by a scalar value.
+		  * \param pValue     Scalar value.
+		  * \return           The scaled matrix.
+		  * \remarks          The passed value is not checked. 
+		  *                   This operator operates on the first three rows and columns of the matrix. 
+		  *                   So only the rotation and scaling are scaled, not the translation part.
+		  *                   After operation, the translation vector will be set as (0,0,0,1);
+		  */
+		FbxAMatrix operator*(double pValue) const;
+
+		/** Divide matrix by a scalar value.
+		  * \param pValue     Scalar value.
+		  * \return           The divided matrix.
+		  * \remarks          The passed value is not checked.
+		  *                   This operator operates on the first three rows and columns of the matrix. 
+		  *                   So only the rotation and scaling are scaled, not the translation part. 
+		  *                   After operation, the translation vector will be set as (0,0,0,1);
+		  */
+		FbxAMatrix operator/(double pValue) const;
+
+		/** Multiply matrix by a scalar value.
+		  * \param pValue     Scalar value.
+		  * \return           \e this updated with the result of the multiplication.
+		  * \remarks          The passed value is not checked.
+		  *                   This operator operates on the first three rows and columns of the matrix. 
+		  *                   So only the rotation and scaling are scaled, not the translation part. 
+		  *                   After operation, the translation vector will keep original value.
+		  */
+		FbxAMatrix& operator*=(double pValue);
+
+		/** Divide matrix by a scalar value.
+		  * \param pValue     Scalar value.
+		  * \return           \e this updated with the result of the division.
+		  * \remarks          The passed value is not checked.
+		  *                   This operator operates on the first three rows and columns of the matrix. 
+		  *                   So only the rotation and scaling are scaled, not the translation part. 
+		  *                   After operation, the translation vector will keep original value.
+		  */
+		FbxAMatrix& operator/=(double pValue);
+	//@}
+
+	/**
+	  * \name Vector Operations
+	  */
+	//@{
+		/** Multiply matrix by a translation vector.
+		  * \param pVector4     Translation vector.
+		  * \return             t' = M * t
+		  */
+		FbxVector4 MultT(const FbxVector4& pVector4) const;
+
+		/** Multiply matrix by an Euler rotation vector.
+		  * \param pVector4     Euler Rotation vector.
+		  * \return             r' = M * r
+		  */
+		FbxVector4 MultR(const FbxVector4& pVector4) const;
+		
+		/** Multiply matrix by a quaternion.
+		  * \param pQuaternion     Rotation value.
+		  * \return                q' = M * q
+		  */
+		FbxQuaternion MultQ(const FbxQuaternion& pQuaternion) const;
+
+		/** Multiply matrix by a scale vector.
+		  * \param pVector4     Scaling vector.
+		  * \return             s' = M * s
+		  */
+		FbxVector4 MultS(const FbxVector4& pVector4) const;
+	//@}
+
+	/**
+	  * \name Matrix Operations
+	  */
+	//@{	
+		/**	Unary minus operator.
+		  * \return     A matrix where each element is multiplied by -1.
+		  */
+		FbxAMatrix operator-() const;
+		
+		/** Multiply two matrices together.
+		  * \param pOther     A Matrix.
+		  * \return             this * pMatrix.
+		  * \remarks            Transformations are pre-multiplied.
+		  *  That means to scale, then rotate, and then translate a vector V, the transform should be T * R * S * V. \n
+		  *  Below is an example of code that shows how to construct rotation transform in XYZ rotation order.
+		  *  \code
+		  *  FbxAMatrix lRotateXM, lRotateYM, lRotateZM, lRotateXYZM, lRotateM;
+		  *  // Construct rotation matrix around X, Y and Z axises separately and then combine them.
+		  *  FbxVector4 lRotateX(10, 0, 0);
+		  *  FbxVector4 lRotateY(0, 10, 0);
+		  *  FbxVector4 lRotateZ(0, 0, 10);
+		  *  lRotateXM.SetR(lRotateX);
+		  *  lRotateYM.SetR(lRotateY);
+		  *  lRotateZM.SetR(lRotateZ);
+		  *  lRotateXYZM = lRotateZM * lRotateYM * lRotateXM;
+		  *
+		  *  // Alternatively, we can use SetR() directly.
+		  *  // lRotateXYZM and lRotateM will be the same.
+		  *  FbxVector4 lRotateXYZ (10, 10, 10);
+		  *  lRotateM.SetR(lRotateXYZ);
+		  *  \endcode
+		  * \note                Please refer to the FBX SDK programmers guide for more details.
+		  */
+		FbxAMatrix operator*(const FbxAMatrix& pOther) const;
+
+		/** Multiply two matrices together.
+		  * \param pOther     A Matrix.
+		  * \return             \e this updated with the result of the multiplication.
+		  */
+		FbxAMatrix& operator*=(const FbxAMatrix& pOther);
+
+		/** Calculate the matrix inverse.
+		  * \return     The inverse matrix of \e this.
+		  */
+		FbxAMatrix Inverse() const;
+
+		/** Calculate the matrix transpose.
+		  * \return     The transposed matrix of \e this.
+		  */
+		FbxAMatrix Transpose() const;
+
+		/** Calculate a spherical linear interpolation matrix.
+		* \param pOther The other rotation matrix to interpolate with.
+		* \param pWeight A value between 0.0 and 1.0 to specify the interpolation amount.
+		* \remark This matrix and other matrix should contain only rotations, otherwise result may be undefined. */
+		FbxAMatrix Slerp(const FbxAMatrix& pOther, double pWeight) const;
+	//@}
+
+	/**
+	  * \name Boolean Operations
+	  */
+	//@{
+		/**	Equivalence operator.
+		  * \param pOther     The matrix to be compared to \e this.
+		  * \return             \c true if the two matrices are equal (each element is within a FBXSDK_TOLERANCE tolerance) and \c false otherwise.
+		  */
+		bool operator==(const FbxAMatrix& pOther) const;
+
+		/**	Non-equivalence operator.
+		  * \param pOther     The matrix to be compared to \e this.
+		  * \return            \c false if the two matrices are equal (each element is within a FBXSDK_TOLERANCE tolerance) and \c true otherwise.
+		  */
+		bool operator!=(const FbxAMatrix& pOther) const;
+	//@}
+
+	/**
+	  * \name Casting
+	  */
+	//@{
+		//! Cast the matrix in a double pointer.
+		operator double* ();
+		//! Cast the matrix in a const double pointer.
+		operator const double* () const;
+		//! Define 4*4 array as a new type 
+		typedef const double(kDouble44)[4][4] ;
+		//! Cast the matrix in a reference to a 4*4 array.
+		inline kDouble44 & Double44() const { return *((kDouble44 *)&mData[0][0]); }
+	//@}
+
+	/** Find out if the matrix is equal to identity matrix.
+	* \return \c true if the matrix is equal to identity matrix, \c false otherwise. */
+	bool IsIdentity(const double pThreshold=FBXSDK_TOLERANCE);
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxAMatrix(const FbxVector4& pT, const FbxQuaternion& pQ, const FbxVector4& pS);
+
+	void SetTRS(const FbxVector4& pT, const FbxAMatrix& pRM, const FbxVector4& pS);
+    void SetRow(int pY, const FbxVector4& pRow);
+    void SetTOnly(const FbxVector4& pT);
+    void SetROnly(const FbxVector4& pR);
+    void SetQOnly(const FbxQuaternion& pQ);
+	FbxVector4 GetROnly() const;
+    FbxQuaternion GetUnnormalizedQ() const;
+
+	// pOrd is assumed to be an FbxEuler::EOrder (or its synonym EFbxRotationOrder)
+    void SetR(const FbxVector4& pV, const int pOrd); 
+	FbxVector4 GetR(const int pOrd) const;
+
+    void MultRM(const FbxVector4& pR);
+    void MultSM(const FbxVector4& pS);
+    bool IsRightHand() const;
+    double Determinant() const;
+	int Compare(const FbxAMatrix pM, const double pThreshold=FBXSDK_TOLERANCE) const;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_MATH_AFFINE_MATRIX_H_ */

+ 325 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxdualquaternion.h

@@ -0,0 +1,325 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxdualquaternion.h
+#ifndef _FBXSDK_CORE_MATH_DUAL_QUATERNION_H_
+#define _FBXSDK_CORE_MATH_DUAL_QUATERNION_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/math/fbxquaternion.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/**	FBX SDK dual quaternion class to represent rigid transformation, which is combined by two quaternions.
+  * A transformation is said to be rigid if it preserves relative distances and angles.
+  * That means rotation and translation.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxDualQuaternion
+{
+public:
+	/**
+	  * \name Constructors and Destructor
+	  */
+	//@{
+		//! Constructor.
+		FbxDualQuaternion();
+
+		/** Constructor.
+		* \param pV1 FbxQuaternion object.
+		* \param pV2 FbxQuaternion object.
+		*/
+		FbxDualQuaternion(const FbxQuaternion& pV1, const FbxQuaternion& pV2);
+
+		/** Copy constructor.
+		  * \param pV FbxQuaternion object copied to this one.
+		  */
+		FbxDualQuaternion(const FbxDualQuaternion& pV);
+
+		/** Constructor.
+		* \param pRotation     The rotation the dual quaternion is going to represent.
+		* \param pTranslation  The translation the dual quaternion is going to represent.
+		*/
+		FbxDualQuaternion(const FbxQuaternion& pRotation, const FbxVector4& pTranslation);
+
+		/** Constructor.
+		  * \param pX1     The X component of the first quaternion.
+		  * \param pY1     The Y component of the first quaternion.
+		  * \param pZ1     The Z component of the first quaternion.
+		  * \param pW1     The W component of the first quaternion.
+		  * \param pX2     The X component of the second quaternion.
+		  * \param pY2     The Y component of the second quaternion.
+		  * \param pZ2     The Z component of the second quaternion.
+		  * \param pW2     The W component of the second quaternion.
+		  */
+		FbxDualQuaternion(double pX1, double pY1, double pZ1, double pW1, double pX2, double pY2, double pZ2, double pW2);
+
+		//! Destructor.
+		~FbxDualQuaternion();
+	//@}
+
+	/**
+	* \name Access
+	*/
+	//@{
+		/** Assignment operation.
+		* \param pDualQuaternion FbxDualQuaternion object assigned to this one.
+		*/
+		FbxDualQuaternion& operator=(const FbxDualQuaternion& pDualQuaternion);
+
+		/** Set vector.
+		* \param pX1     The X component of the first quaternion.
+		* \param pY1     The Y component of the first quaternion.
+		* \param pZ1     The Z component of the first quaternion.
+		* \param pW1     The W component of the first quaternion.
+		* \param pX2     The X component of the second quaternion.
+		* \param pY2     The Y component of the second quaternion.
+		* \param pZ2     The Z component of the second quaternion.
+		* \param pW2     The W component of the second quaternion.
+		*/
+		void Set(double pX1, double pY1, double pZ1, double pW1, double pX2, double pY2, double pZ2, double pW2);
+
+		/** Get the first quaternion of the dual quaternion.
+		* \return The first quaternion of the dual quaternion.
+		*/
+		FbxQuaternion& GetFirstQuaternion();
+
+		/** Get the second quaternion of the dual quaternion.
+		* \return The second quaternion of the dual quaternion.
+		*/
+		FbxQuaternion& GetSecondQuaternion();
+
+		/** Get the first quaternion of the dual quaternion.
+		* \return The first quaternion of the dual quaternion.
+		*/
+		const FbxQuaternion& GetFirstQuaternion() const;
+
+		/** Get the second quaternion of the dual quaternion.
+		* \return The second quaternion of the dual quaternion.
+		*/
+		const FbxQuaternion& GetSecondQuaternion() const;
+
+		/** Get the rotation part from the dual quaternion.
+		* \return FbxQuaternion object to represent rotation.
+		*/
+		FbxQuaternion GetRotation() const;
+
+		/** Get the translation part from the dual quaternion.
+		* \return FbxVector4 object to represent translation.
+		* \remarks A dual quaternion can represent rotation followed by translation, or translation followed by rotation.
+		* This method assumes that the rotation is expressed first, followed by translation, as is done by most DCC tools.
+		*/
+		FbxVector4 GetTranslation() const;
+	//@}
+
+	/**
+	  * \name Scalar Operations
+	  */
+	//@{
+		/** Add a value to all vector components.
+		  * \param pValue     The value to add to each component of the vector.
+		  * \return           New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxDualQuaternion operator+(double pValue) const;
+
+		/** Subtract a value from all vector components.
+		  * \param pValue     The value to subtract from each component of the vector.
+		  * \return           New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxDualQuaternion operator-(double pValue) const;
+
+		/** Multiply all vector components by a value.
+		  * \param pValue     The value multiplying each component of the vector.
+		  * \return           New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxDualQuaternion operator*(double pValue) const;
+
+		/**	Divide all vector components by a value.
+		  * \param pValue     The value dividing each component of the vector.
+		  * \return           New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxDualQuaternion operator/(double pValue) const;
+
+		/** Add a value to all vector components.
+		  * \param pValue     The value to add to each component of the vector.
+		  * \return           The result of adding pValue to each component of the vector, replacing this dual quaternion.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxDualQuaternion& operator+=(double pValue);
+
+		/** Subtract a value from all vector components.
+		  * \param pValue     The value to subtract from each component of the vector.
+		  * \return           The result of subtracting pValue from each component of the vector, replacing this dual quaternion.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxDualQuaternion& operator-=(double pValue);
+
+		/** Multiply a value to all vector elements.
+		  * \param pValue     The value multiplying each component of the vector.
+		  * \return           The result of multiplying each component of the vector by pValue, replacing this dual quaternion.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxDualQuaternion& operator*=(double pValue);
+
+		/**	Divide all vector elements by a value.
+		  * \param pValue     The value dividing each component of the vector.
+		  * \return           The result of dividing each component of the vector by pValue, replacing this dual quaternion.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxDualQuaternion& operator/=(double pValue);
+	//@}
+
+	/**
+	  * \name Vector Operations
+	  */
+	//@{
+		/**	Unary minus operator.
+		  * \return      A dual quaternion where each component is multiplied by -1.
+		  */
+		FbxDualQuaternion operator-() const;
+
+		/** Add two vectors together.
+		  * \param pDualQuaternion     Dual quaternion to add.
+		  * \return                The dual quaternion v' = this + pDualQuaternion.
+		  * \remarks               The values in pDualQuaternion are not checked.
+		  */
+		FbxDualQuaternion operator+(const FbxDualQuaternion& pDualQuaternion) const;
+
+		/** Subtract a quaternion from another quaternion.
+		  * \param pDualQuaternion     Dual quaternion to subtract.
+		  * \return                The dual quaternion v' = this - pDualQuaternion.
+		  * \remarks               The values in pDualQuaternion are not checked.
+		  */
+		FbxDualQuaternion operator-(const FbxDualQuaternion& pDualQuaternion) const;
+
+		/** Memberwise multiplication of two vectors.
+		  * \param pDualQuaternion     Multiplying dual quaternion.
+		  * \return                The dual quaternion v' = this * pQuaternion.
+		  * \remarks               The values in pDualQuaternion are not checked.
+		  */
+		FbxDualQuaternion operator*(const FbxDualQuaternion& pDualQuaternion) const;
+
+		/** Memberwise division of a dual quaternion with another dual quaternion.
+		  * \param pDualQuaternion     Dividing dual quaternion.
+		  * \return                The dual quaternion v' = this / pQuaternion.
+		  * \remarks               The values in pDualQuaternion are not checked.
+		  */
+		FbxDualQuaternion operator/(const FbxDualQuaternion& pDualQuaternion) const;
+
+		/** Add two quaternions together.
+		  * \param pDualQuaternion     Dual quaternion to add.
+		  * \return                The dual quaternion v' = this + pQuaternion, replacing this dual quaternion.
+		  * \remarks               The values in pDualQuaternion are not checked.
+		  */
+		FbxDualQuaternion& operator+=(const FbxDualQuaternion& pDualQuaternion);
+
+		/** Subtract a dual quaternion from another vector.
+		  * \param pDualQuaternion     Dual quaternion to subtract.
+		  * \return                The dual quaternion v' = this - pQuaternion, replacing this dual quaternion.
+		  * \remarks               The values in pDualQuaternion are not checked.
+		  */
+		FbxDualQuaternion& operator-=(const FbxDualQuaternion& pDualQuaternion);
+
+		/** Memberwise multiplication of two quaternions.
+		  * \param pDualQuaternion     Multiplying dual quaternion.
+		  * \return                The dual quaternion v' = this * pQuaternion, replacing this dual quaternion.
+		  * \remarks               The values in pDualQuaternion are not checked.
+		  */
+		FbxDualQuaternion& operator*=(const FbxDualQuaternion& pDualQuaternion);
+
+		/** Memberwise division of a dual quaternion by another dual quaternion.
+		  * \param pDualQuaternion     Dividing dual quaternion.
+		  * \return                The dual quaternion v' = this / pQuaternion, replacing this dual quaternion.
+		  * \remarks               The values in pDualQuaternion are not checked.
+		  */
+		FbxDualQuaternion& operator/=(const FbxDualQuaternion& pDualQuaternion);
+
+		/** Multiplication of a dual quaternion by a FbxVector4.
+		* \param pVector     The FbxVector4 to multiply with.
+		* \return            The dual quaternion v' = FbxDualQuaternion(mQ1, (mQ1 * pVector) + mQ2).
+		* \remarks           The values in pDualQuaternion are not checked.
+		*/
+		FbxDualQuaternion operator*(const FbxVector4 pVector) const;
+
+		/** Return dual quaternion product.
+		* \param pDualQuaternion	Product dual quaternion.
+		* \return					The dual quaternion that is the product of this and pDualQuaternion.
+		*/
+		FbxDualQuaternion Product(const FbxDualQuaternion& pDualQuaternion) const;
+
+		/** Normalize the dual quaternion, length set to 1.
+		*/
+		void Normalize();
+
+		/** Calculate the dual quaternion's inverse.
+		* \return      The inverse of this dual quaternion. 
+		*/
+		void Inverse();
+
+		/** Deform a point by this dual quaternion.
+		* \return      The inverse of this quaternion. 
+		*/
+		FbxVector4 Deform(FbxVector4& pPoint);
+	//@}
+
+	/**
+	* \name Conjugate Operations
+	* \brief Dual quaternion has three types of conjugate.
+	*/
+	//@{
+		/** Conjugate both quaternions of this dual quaternion.
+		*/
+		void Conjugate();
+
+		/** Conjugate in dual space.
+		*/
+		void Dual();
+
+		/** Conjugate both quaternions of this dual quaternion in dual space.
+		*/
+		void DualConjugate();
+	//@}
+
+	/**
+	  * \name Boolean Operations
+	  */
+	//@{
+		/**	Equivalence operator.
+		  * \param pV     The quaternion to be compared to this quaternion.
+		  * \return       \c true  if the two quaternions are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c false  otherwise.
+		  */
+		bool operator==(const FbxDualQuaternion & pV) const;
+
+		/**	Non equivalence operator.
+		  * \param pV     The quaternion to be compared to \e this.
+		  * \return       \c  false if the two quaternions are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c true  otherwise.
+		  */
+		bool operator!=(const FbxDualQuaternion & pV) const;
+	//@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+	FbxQuaternion mQ1;
+	FbxQuaternion mQ2;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_MATH_DUAL_QUATERNION_H_ */

+ 512 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxmath.h

@@ -0,0 +1,512 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxmath.h
+#ifndef _FBXSDK_CORE_MATH_H_
+#define _FBXSDK_CORE_MATH_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/math/fbxvector2.h>
+#include <fbxsdk/core/math/fbxvector4.h>
+#include <fbxsdk/core/math/fbxmatrix.h>
+#include <fbxsdk/core/math/fbxaffinematrix.h>
+
+//On Mac OS, cmath will include math.h and undef "isnan"
+#if defined(FBXSDK_ENV_MAC)
+	#include <cmath>
+	extern "C" int isnan (double);
+#endif
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+#if defined(FBXSDK_ENV_WIN)
+	#ifndef isnan
+		#define isnan	_isnan
+	#endif
+	#ifndef finite
+		#define finite	_finite
+	#endif
+#endif
+
+//---------------------------------------------------------------------------------------
+//Common Constants
+#define FBXSDK_PI				3.1415926535897932384626433832795028841971693993751		//!< PI mathematic constant
+#define FBXSDK_PI_DIV_2			1.5707963267948966192313216916397514420985846996875		//!< PI divided by 2
+#define FBXSDK_PI_DIV_180		0.017453292519943295769236907684886127134428718885417	//!< PI divived by 180
+#define FBXSDK_180_DIV_PI		57.295779513082320876798154814105170332405472466565		//!< 180 divided by PI
+#define FBXSDK_1_DIV_LN2		1.4426950408889634073599246810018921374266459541530		//!< 1 divided by LogN2
+
+//---------------------------------------------------------------------------------------
+//Unit Convertion Ratio
+#define FBXSDK_DEG_TO_RAD		FBXSDK_PI_DIV_180	//!< Degree to Radian
+#define FBXSDK_RAD_TO_DEG		FBXSDK_180_DIV_PI	//!< Radian to Degree
+#define FBXSDK_IN_TO_CM			2.54				//!< Inch to Centimeter
+#define FBXSDK_MM_TO_CM			0.1					//!< Millimeter to Centimeter
+#define FBXSDK_CM_TO_IN			0.393700787			//!< Centimeter to Inch
+#define	FBXSDK_IN_TO_MM			25.4				//!< Inch to Millimeter
+#define FBXSDK_MM_TO_IN			0.0393700787		//!< Millimeter to Inch
+#define FBXSDK_FT_TO_M			0.3048				//!< Feet to Meter
+#define FBXSDK_M_TO_FT			3.2808399			//!< Meter to Feet
+#define FBXSDK_YD_TO_FT			3					//!< Yard to Feet
+#define FBXSDK_FT_TO_YD			0.333333333			//!< Feet to Yard
+#define FBXSDK_KM_TO_MILE		0.621371192			//!< Kilometer to Mile
+#define FBXSDK_MILE_TO_KM		1.609344			//!< Mile to Kilometer
+#define FBXSDK_YD_TO_M			0.9144				//!< Yard to Meter
+#define FBXSDK_M_TO_YD			1.0936133			//!< Meter to Yard
+
+//---------------------------------------------------------------------------------------
+//Euler Definition
+#define FBXSDK_EULER_DEGENERATE  FbxEuler::DegenerateThreshold() //!< Euler degenerate threshold can be changed with a call to FbxEuler::SetDegenerateThreshold.
+
+class FBXSDK_DLL FbxEuler
+{
+public:
+	enum EAxis {eAxisX=0, eAxisY=1, eAxisZ=2};
+
+	enum EOrder
+	{
+		eOrderXYZ,
+		eOrderXZY,
+		eOrderYZX,
+		eOrderYXZ,
+		eOrderZXY,
+		eOrderZYX,
+		eOrderSphericXYZ
+	};
+
+	static bool IsParityOdd(EOrder pOrder);
+	static bool IsRepeat(EOrder pOrder);
+
+	static const int AxisTableSize;
+	static const int AxisTable[][3];
+
+	// Used to detect Euler gimbal locks when extracting the rotation vector from 
+    // the FbxAMatrix. This value should only be changed when the user system stores
+    // single floating point values into the FbxAMatrix with a very low precision.
+    // In this case, the default threshold value would be too small for a proper detection
+    // and the extracted values can quickly become off target by a huge amount.
+	static void SetDegenerateThreshold(double pThreshold=16.0*FBXSDK_FLOAT_EPSILON);
+    static inline double DegenerateThreshold() { return FbxEuler::mDegenerateThreshold; }
+
+private:
+	static double mDegenerateThreshold;
+};
+
+/** Rotation order flags.
+  * Each rotate order produces a different end orientation. For example, if the rotation order for an object is set to XYZ,
+  * the object first rotates about its X-axis, then its Y-axis, and finally its Z-axis.
+  */
+
+#define EFbxRotationOrder	FbxEuler::EOrder
+#define eEulerXYZ			FbxEuler::eOrderXYZ
+#define eEulerXZY			FbxEuler::eOrderXZY
+#define eEulerYZX			FbxEuler::eOrderYZX
+#define eEulerYXZ			FbxEuler::eOrderYXZ
+#define eEulerZXY			FbxEuler::eOrderZXY
+#define eEulerZYX			FbxEuler::eOrderZYX
+#define eSphericXYZ			FbxEuler::eOrderSphericXYZ
+
+
+
+/** Quaternion interpolation modes.  */
+enum EFbxQuatInterpMode
+{
+    eQuatInterpOff,					//!< Do not evaluate using quaternion interpolation.
+    eQuatInterpClassic,				//!< Legacy quaternion interpolation mode.
+    eQuatInterpSlerp,				//!< Spherical linear interpolation.
+    eQuatInterpCubic,				//!< Cubic interpolation.
+    eQuatInterpTangentDependent,	//!< Mix between Slerp and cubic interpolation, depending on the specified tangents for each key.
+    eQuatInterpCount				//!< Number of quaternion interpolation modes. Mark the end of this enum.
+};
+
+extern FBXSDK_DLL const FbxDouble FbxIdentityMatrix[4][4];
+extern FBXSDK_DLL const FbxVector4 FbxZeroVector4;
+
+inline float FbxFloor(const float x)
+{
+	return float(floor(x));
+}
+
+inline double FbxFloor(const double x)
+{
+	return floor(x);
+}
+
+inline float FbxCeil(const float x)
+{
+	return float(ceil(x));
+}
+
+inline double FbxCeil(const double x)
+{
+	return ceil(x);
+}
+
+template<class T> inline T FbxSign(const T x)
+{
+	return (x < 0) ? T(-1) : T(1);
+}
+
+template<class T> inline T FbxRound(const T x)
+{
+	T y = FbxFloor(x);
+	return (x - y < T(0.5)) ? y : y + T(1);
+}
+
+inline FbxUChar FbxAbs(const FbxUChar x)
+{
+	return x;
+}
+
+inline FbxUShort FbxAbs(const FbxUShort x)
+{
+	return x;
+}
+
+inline FbxUInt FbxAbs(const FbxUInt x)
+{
+	return x;
+}
+
+#ifndef FBXSDK_SYSTEM_IS_LP64
+	inline FbxULong FbxAbs(const FbxULong x)
+	{
+		return x;
+	}
+#endif
+
+inline FbxULongLong FbxAbs(const FbxULongLong x)
+{
+	return x;
+}
+
+inline FbxFloat FbxAbs(const FbxFloat x)
+{
+	return (FbxFloat)fabs(x);
+}
+
+inline FbxDouble FbxAbs(const FbxDouble x)
+{
+	return fabs(x);
+}
+
+template<class T> inline T FbxAbs(const T x)
+{
+	return (x >= 0) ? x : ((x > FbxMin(x)) ? -x : FbxMax(x));
+}
+
+template<class T> inline T FbxClamp(const T value, const T min, const T max)
+{
+	return (value < min) ? min : ((value > max) ? max : value);
+}
+
+template<class T> inline bool FbxEqual(const T x, const T y, const T e=(T)FBXSDK_TOLERANCE)
+{
+	return FbxAbs(x - y) <= e;
+}
+
+inline bool FbxEqual(const FbxDouble2& x, const FbxDouble2& y, const double e=FBXSDK_TOLERANCE)
+{
+	return ( FbxEqual(x.mData[0], y.mData[0], e) && FbxEqual(x.mData[1], y.mData[1], e) );
+}
+
+inline bool FbxEqual(const FbxDouble3& x, const FbxDouble3& y, const double e=FBXSDK_TOLERANCE)
+{
+	return ( FbxEqual(x.mData[0], y.mData[0], e) && FbxEqual(x.mData[1], y.mData[1], e) && FbxEqual(x.mData[2], y.mData[2], e) );
+}
+
+inline bool FbxEqual(const FbxDouble4& x, const FbxDouble4& y, const double e=FBXSDK_TOLERANCE)
+{
+	return ( FbxEqual(x.mData[0], y.mData[0], e) && FbxEqual(x.mData[1], y.mData[1], e) && FbxEqual(x.mData[2], y.mData[2], e) && FbxEqual(x.mData[3], y.mData[3], e) );
+}
+
+inline bool FbxEqual(const FbxDouble4x4& x, const FbxDouble4x4& y, const double e=FBXSDK_TOLERANCE)
+{
+	return ( FbxEqual(x[0], y[0], e) && FbxEqual(x[1], y[1], e) && FbxEqual(x[2], y[2], e) && FbxEqual(x[3], y[3], e) );
+}
+
+inline bool FbxEqual(const FbxVector2& x, const FbxVector2& y, const double e=FBXSDK_TOLERANCE)
+{
+	return ( FbxEqual(x.mData[0], y.mData[0], e) && FbxEqual(x.mData[1], y.mData[1], e) );
+}
+
+inline bool FbxEqual(const FbxVector4& x, const FbxVector4& y, const double e=FBXSDK_TOLERANCE)
+{
+	return ( FbxEqual(x.mData[0], y.mData[0], e) && FbxEqual(x.mData[1], y.mData[1], e) && FbxEqual(x.mData[2], y.mData[2], e) && FbxEqual(x.mData[3], y.mData[3], e) );
+}
+
+inline bool FbxEqual(const FbxMatrix& x, const FbxMatrix& y, const double e=FBXSDK_TOLERANCE)
+{
+	return ( FbxEqual(x[0], y[0], e) && FbxEqual(x[1], y[1], e) && FbxEqual(x[2], y[2], e) && FbxEqual(x[3], y[3], e) );
+}
+
+inline bool FbxEqual(const FbxAMatrix& x, const FbxAMatrix& y, const double e=FBXSDK_TOLERANCE)
+{
+	return ( FbxEqual(x[0], y[0], e) && FbxEqual(x[1], y[1], e) && FbxEqual(x[2], y[2], e) && FbxEqual(x[3], y[3], e) );
+}
+
+inline FbxDouble FbxMod(const FbxFloat x, FbxFloat& i)
+{
+	return modff(x, &i);
+}
+
+inline FbxDouble FbxMod(const FbxDouble x, FbxDouble& i)
+{
+	return modf(x, &i);
+}
+
+inline FbxDouble FbxMod(const FbxFloat x)
+{
+	FbxFloat i;
+	return modff(x, &i);
+}
+
+inline FbxDouble FbxMod(const FbxDouble x)
+{
+	FbxDouble i;
+	return modf(x, &i);
+}
+
+template<class T> inline T FbxReciprocal(const T x)
+{
+	return T(1) / x;
+}
+
+inline double FbxSqrt(const double x)
+{
+	return sqrt(x);
+}
+
+inline float FbxSqrt(const float x)
+{
+	return sqrtf(x);
+}
+
+template<class T> inline T FbxSqrt(const T x)
+{
+	if( x > 1 )
+	{
+		T z, y = x >> 1; 
+		do 
+		{ 
+			z = y; 
+			y = (y + (x / y)) >> 1; 
+		}
+		while(y < z); 
+
+		return z;
+	}
+	else
+	{
+		return x;
+	}
+}
+
+inline float FbxExp(const float x)
+{
+	return expf(x);
+}
+
+inline double FbxExp(const double x)
+{
+	return exp(x);
+}
+
+inline float FbxLog(const float x)
+{
+	return float(log(x));
+}
+
+inline double FbxLog(const double x)
+{
+	return log(x);
+}
+
+template<class T> inline T FbxPow(const T x, const T y)
+{
+	return (T)FbxExp(y * FbxLog((double)x));
+}
+
+template<class T> inline T FbxLog2(const T x)
+{
+	return (T)(FbxLog(x) * FBXSDK_1_DIV_LN2);
+}
+
+inline float FbxSin(const float x)
+{
+	return sinf(x);
+}
+
+inline double FbxSin(const double x)
+{
+	return sin(x);
+}
+
+inline float FbxCos(const float x)
+{
+	return cosf(x);
+}
+
+inline double FbxCos(const double x)
+{
+	return cos(x);
+}
+
+inline float FbxTan(const float x)
+{
+	return tanf(x);
+}
+
+inline double FbxTan(const double x)
+{
+	return tan(x);
+}
+
+// *y = cos(x), sin(x)
+template<class T> inline T FbxSinCos(const T x, T* y)
+{
+	return *y = FbxCos(x), FbxSin(x);
+}
+
+// *y = cos(x * pi/180), sin(x * pi/180)
+template<class T> inline T FbxSinCosd(const T x, T* y)
+{
+	return FbxSinCos(T(x * FBXSDK_PI_DIV_180), y);
+}
+
+inline float FbxASin(const float x)
+{
+	return asinf(x);
+}
+
+inline double FbxASin(const double x)
+{
+	return asin(x);
+}
+
+template<class T> inline T FbxASind(const T x)
+{
+	return (T)(FbxASin((double)x) * FBXSDK_180_DIV_PI);
+}
+
+inline float FbxACos(const float x)
+{
+	return acosf(x);
+}
+
+inline double FbxACos(const double x)
+{
+	return acos(x);
+}
+
+template<class T> inline T FbxACosd(const T x)
+{
+	return (T)(FbxACos(x) * FBXSDK_180_DIV_PI);
+}
+
+inline float FbxATan(const float x)
+{
+	return atanf(x);
+}
+
+inline double FbxATan(const double x)
+{
+	return atan(x);
+}
+
+template<class T> inline T FbxATand(const T x)
+{
+	return (T)(FbxATan(x) * FBXSDK_180_DIV_PI);
+}
+
+inline float FbxATan(const float y, const float x)
+{
+	return atan2f(y, x);
+}
+
+inline double FbxATan(const double y, const double x)
+{
+	return atan2(y, x);
+}
+
+template<class T> inline T FbxATand(const T y, const T x)
+{
+	return (T)(FbxATan(y, x) * FBXSDK_180_DIV_PI);
+}
+
+template<class T> inline T FbxNorm(const T x, const T y)
+{
+	return FbxSqrt(x * x + y * y);
+}
+
+template<class T> inline T FbxNorm(const T x, const T y, const T z)
+{
+	return FbxSqrt(x * x + y * y + z * z);
+}
+
+template<class T> inline T FbxNorm(const T w, const T x, const T y, const T z)
+{
+	return FbxSqrt(w * w + x * x + y * y + z * z);
+}
+
+template<class T> inline T FbxHypot(const T x, const T y)
+{
+	return FbxSqrt(x * x + y * y);
+}
+
+template<class T> inline T FbxHypot(const T x, const T y, const T z)
+{
+	return FbxSqrt(x * x + y * y + z * z);
+}
+
+template<class T> inline T FbxHypot(const T w, const T x, const T y, const T z)
+{
+	return FbxSqrt(w * w + x * x + y * y + z * z);
+}
+
+inline FbxVector4 FbxRejection(const FbxVector4& a, const FbxVector4& b)
+{
+    return a - b * (a.DotProduct(b) / b.DotProduct(b));
+}
+
+template<class T> inline int FbxBitCount(const T x)
+{
+	int n = 0;
+	T c = x;
+	while( c )
+	{
+		n += int(c & 1);
+		c = (c >> 1);
+	}
+	return n;
+}
+
+template<class T> inline void FbxFixInfinite(T& x)
+{
+	if( x != x || x > FbxMax(x) || x < -FbxMax(x) )
+	{
+		x = T(0);
+	}
+}
+
+template<class T> inline T FbxExp(const T x);
+template<class T> inline T FbxLog(const T x);
+template<class T> inline T FbxSin(const T x);
+template<class T> inline T FbxCos(const T x);
+template<class T> inline T FbxASin(const T x);
+template<class T> inline T FbxACos(const T x);
+template<class T> inline T FbxATan(const T x);
+template<class T> inline T FbxATan(const T y, const T x);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_MATH_H_ */

+ 281 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxmatrix.h

@@ -0,0 +1,281 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxmatrix.h
+#ifndef _FBXSDK_CORE_MATH_MATRIX_H_
+#define _FBXSDK_CORE_MATH_MATRIX_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/math/fbxvector4.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxAMatrix;
+
+/**	FBX SDK basic 4x4 double matrix class.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxMatrix : public FbxDouble4x4
+{
+public:
+	//! \name Constructors and Destructor
+	//@{
+		//! Constructor (initialize to an identity matrix)
+		FbxMatrix();
+
+		/** Copy constructor.
+		* \param pM Another FbxMatrix object copied to this one. */
+		FbxMatrix(const FbxMatrix& pM);
+
+		/** Copy constructor for affine matrix.
+		* \param pM Affine matrix */
+		FbxMatrix(const FbxAMatrix& pM);
+
+		/** TRS Constructor.
+		* \param pT Translation vector.
+		* \param pR Euler rotation vector.
+		* \param pS Scale vector. */
+		FbxMatrix(const FbxVector4& pT, const FbxVector4& pR, const FbxVector4& pS);
+
+		/** TQS Constructor.
+		* \param pT Translation vector.
+		* \param pQ Quaternion.
+		* \param pS Scale vector. */
+		FbxMatrix(const FbxVector4& pT, const FbxQuaternion& pQ, const FbxVector4& pS);
+
+		/** 16 double constructor.
+		* \param p00 Value at column 0 row 0.
+		* \param p10 Value at column 1 row 0.
+		* \param p20 Value at column 2 row 0.
+		* \param p30 Value at column 3 row 0.
+		* \param p01 Value at column 0 row 1.
+		* \param p11 Value at column 1 row 1.
+		* \param p21 Value at column 2 row 1.
+		* \param p31 Value at column 3 row 1.
+		* \param p02 Value at column 0 row 2.
+		* \param p12 Value at column 1 row 2.
+		* \param p22 Value at column 2 row 2.
+		* \param p32 Value at column 3 row 2.
+		* \param p03 Value at column 0 row 3.
+		* \param p13 Value at column 1 row 3.
+		* \param p23 Value at column 2 row 3.
+		* \param p33 Value at column 3 row 3. */
+		FbxMatrix(	const double p00, const double p10, const double p20, const double p30,
+					const double p01, const double p11, const double p21, const double p31,
+					const double p02, const double p12, const double p22, const double p32,
+					const double p03, const double p13, const double p23, const double p33);
+			
+		//! Destructor.
+		~FbxMatrix();
+	//@}
+
+	//! \name Access
+	//@{
+		/** Retrieve matrix element.
+		* \param pY Row index.
+		* \param pX Column index.
+		* \return Value at element [ pX, pY ] of the matrix. */
+		double Get(int pY, int pX) const;
+
+		/** Extract a row vector.
+		* \param pY Row index.
+		* \return The row vector. */
+		FbxVector4 GetRow(int pY) const;
+
+		/** Extract a column vector.
+		* \param pX Column index.
+		* \return The column vector. */
+		FbxVector4 GetColumn(int pX) const;
+
+		/** Set matrix element.
+		* \param pY Row index.
+		* \param pX Column index.
+		* \param pValue New component value. */
+		void Set(int pY, int pX, double pValue);
+
+		/** Set matrix.
+		* \param pT Translation vector.
+		* \param pR Euler rotation vector.
+		* \param pS Scale vector. */
+		void SetTRS(const FbxVector4& pT, const FbxVector4& pR, const FbxVector4& pS);
+
+		/** Set matrix.
+		* \param pT Translation vector.
+		* \param pQ Quaternion.
+		* \param pS Scale vector. */
+		void SetTQS(const FbxVector4& pT, const FbxQuaternion& pQ, const FbxVector4& pS);
+
+		/** Set a matrix row.
+		* \param pY Row index.
+		* \param pRow Row vector. */
+		void SetRow(int pY, const FbxVector4& pRow);
+
+		/** Set a matrix column.
+		* \param pX Column index.
+		* \param pColumn Column vector. */
+		void SetColumn(int pX, const FbxVector4& pColumn);
+
+		/** Decompose the affine matrix into elements of translation, rotation, shearing, scaling and sign of determinant.
+		* \param pTranslation Translation element.
+		* \param pRotation Rotation element.
+		* \param pShearing Shearing element.
+		* \param pScaling Scaling element.
+		* \param pSign Sign of determinant. */
+		void GetElements(FbxVector4& pTranslation, FbxQuaternion& pRotation, FbxVector4& pShearing, FbxVector4& pScaling, double& pSign) const;
+		
+		/** Decompose the affine matrix into elements of translation, rotation, shearing, scaling and sign of determinant.
+		* \param pTranslation Translation element.
+		* \param pRotation Rotation element.
+		* \param pShearing Shearing element.
+		* \param pScaling Scaling element.
+		* \param pSign Sign of determinant. */
+		void GetElements(FbxVector4& pTranslation, FbxVector4& pRotation, FbxVector4& pShearing, FbxVector4& pScaling, double& pSign) const;
+	//@}
+
+	//! \name Operators
+	//@{
+		/** Assignment operator.
+		* \param pMatrix Source matrix. */
+		FbxMatrix& operator=(const FbxMatrix& pMatrix);
+
+		/**	Unary minus operator.
+		* \return A matrix where each element is multiplied by -1. */
+		FbxMatrix operator-() const;
+
+		/** Add two matrices together.
+		* \param pMatrix A matrix.
+		* \return The result of this matrix + pMatrix. */
+		FbxMatrix operator+(const FbxMatrix& pMatrix) const;
+
+		/** Subtract a matrix from another matrix.
+		* \param pMatrix A matrix.
+		* \return The result of this matrix - pMatrix. */
+		FbxMatrix operator-(const FbxMatrix& pMatrix) const;
+
+		/** Multiply two matrices.
+		* \param pMatrix A matrix.
+		* \return The result of this matrix * pMatrix. */
+		FbxMatrix operator*(const FbxMatrix& pMatrix) const;
+
+		/** Add two matrices together.
+		* \param pMatrix A matrix.
+		* \return The result of this matrix + pMatrix, replacing this matrix. */
+		FbxMatrix& operator+=(const FbxMatrix& pMatrix);
+
+		/** Subtract a matrix from another matrix.
+		* \param pMatrix A matrix.
+		* \return The result of this matrix - pMatrix, replacing this matrix. */
+		FbxMatrix& operator-=(const FbxMatrix& pMatrix);
+
+		/** Multiply two matrices.
+		* \param pMatrix A matrix.
+		* \return The result of this matrix * pMatrix, replacing this matrix. */
+		FbxMatrix& operator*=(const FbxMatrix& pMatrix);
+
+		/**	Equivalence operator.
+		* \param pM The matrix to be compared against this matrix.
+		* \return \c true if the two matrices are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c false otherwise. */
+		bool operator==(const FbxMatrix& pM) const;
+
+		/**	Equivalence operator.
+		* \param pM The affine matrix to be compared against this matrix.
+		* \return \c true if the two matrices are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c false otherwise. */
+		bool operator==(const FbxAMatrix& pM) const;
+
+		/**	Non-equivalence operator.
+		* \param pM The matrix to be compared against this matrix.
+		* \return \c false if the two matrices are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c true otherwise. */
+		bool operator!=(const FbxMatrix& pM) const;
+
+		/**	Non-equivalence operator.
+		* \param pM The affine matrix to be compared against this matrix.
+		* \return \c false if the two matrices are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c true otherwise. */
+		bool operator!=(const FbxAMatrix& pM) const;
+	//@}
+
+	//! \name Casting
+	//@{
+		//! Cast the vector in a double pointer.
+		operator double* ();
+
+		//! Cast the vector in a const double pointer.
+		operator const double* () const;
+
+		//! Define 4*4 array as a new type.
+		typedef const double(kDouble44)[4][4] ;
+
+		//! Cast the matrix in a reference to a 4*4 array.
+		inline kDouble44 & Double44() const { return *((kDouble44 *)&mData[0][0]); }
+	//@}
+
+	//! \name Math Operations
+	//@{
+		/** Calculate the matrix inverse.
+		* \return The inverse matrix. */
+		FbxMatrix Inverse() const;
+
+		/** Calculate the matrix transpose.
+		* \return This matrix transposed. */
+		FbxMatrix Transpose() const;
+
+		//! Set matrix to identity.
+		void SetIdentity();
+
+		/** Set the matrix to a "Look To" left handed.
+		* \param pEyePosition The position of the eye.
+		* \param pEyeDirection The direction of the eye.
+		* \param pUpDirection The up direction of the eye. */
+		void SetLookToLH(const FbxVector4& pEyePosition, const FbxVector4& pEyeDirection, const FbxVector4& pUpDirection);
+
+		/** Set the matrix to a "Look To" right handed.
+		* \param pEyePosition The position of the eye.
+		* \param pEyeDirection The direction of the eye.
+		* \param pUpDirection The up direction of the eye. */
+		void SetLookToRH(const FbxVector4& pEyePosition, const FbxVector4& pEyeDirection, const FbxVector4& pUpDirection);
+
+		/** Set the matrix to a "Look At" left handed.
+		* \param pEyePosition The position of the eye.
+		* \param pLookAt The look at position of the eye focus.
+		* \param pUpDirection The up direction of the eye. */
+		void SetLookAtLH(const FbxVector4& pEyePosition, const FbxVector4& pLookAt, const FbxVector4& pUpDirection);
+
+		/** Set the matrix values as a "Look At" right handed.
+		* \param pEyePosition The position of the eye.
+		* \param pLookAt The look at position of the eye focus.
+		* \param pUpDirection The up direction of the eye. */
+		void SetLookAtRH(const FbxVector4& pEyePosition, const FbxVector4& pLookAt, const FbxVector4& pUpDirection);
+
+		/** Multiply this matrix by pVector, the w component is normalized to 1.
+		* \param pVector A vector.
+		* \return The result of this matrix * pVector. */
+		FbxVector4 MultNormalize(const FbxVector4& pVector) const;
+	//@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	int Compare(const FbxMatrix pM, const double pThreshold = FBXSDK_TOLERANCE) const;
+	int Compare(const FbxAMatrix pM, const double pThreshold = FBXSDK_TOLERANCE) const;
+
+	FbxMatrix operator*(double pValue) const;
+	FbxMatrix& operator*=(double pValue);
+
+    double LUDecomposition(FbxVector4& pVector);
+    FbxMatrix LUMult(FbxMatrix pM, const FbxVector4& pVector) const;
+    double Determinant() const;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_MATH_MATRIX_H_ */

+ 333 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxquaternion.h

@@ -0,0 +1,333 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxquaternion.h
+#ifndef _FBXSDK_CORE_MATH_QUATERNION_H_
+#define _FBXSDK_CORE_MATH_QUATERNION_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/math/fbxvector4.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** FBX SDK quaternion class.
+ * \nosubgrouping
+ * Quaternions form a four-dimensional normed division algebra over the real numbers. 
+ * It is for calculations involving three-dimensional rotations. 
+ */
+class FBXSDK_DLL FbxQuaternion : public FbxDouble4
+{
+public:
+    /**
+      * \name Constructors and Destructor
+      */
+    //@{
+		/** Constructor.
+		  * Initialize to the multiplicative identity.
+		  */
+		FbxQuaternion();
+
+		/** Copy constructor.
+		  * \param pV FbxQuaternion object copied to this one.
+		  */
+		FbxQuaternion(const FbxQuaternion& pV);
+
+		/** Constructor.
+			* \param pX     The X component.
+			* \param pY     The Y component.
+			* \param pZ     The Z component.
+			* \param pW     The W component.
+			*/
+		FbxQuaternion(double pX, double pY, double pZ, double pW = 1.0);
+
+		/** From axis degree constructor
+		* \param pAxis The axis to rotate around.
+		* \param pDegree The amount of degree to rotate around the axis. */
+		FbxQuaternion(const FbxVector4& pAxis, double pDegree);
+		    
+		//! Destructor.
+		~FbxQuaternion();
+    //@}
+
+    /**
+      * \name Access
+      */
+    //@{
+		/** Assignment operation.
+		  * \param pQuaternion FbxQuaternion object assigned to this one.
+		  */
+		FbxQuaternion& operator=(const FbxQuaternion& pQuaternion);
+		    
+		/** Accessor.
+		  * \param pIndex     The index of the component to access.
+		  * \return           The reference to the indexed component.
+		  * \remarks          The index parameter is not checked for values out of bounds. The valid range is [0,3].
+		  */
+		double& operator[](int pIndex);
+
+		/** Accessor.
+		  * \param pIndex     The index of the component to access.
+		  * \return           The const reference to the indexed component.
+		  * \remarks          The index parameter is not checked for values out of bounds. The valid range is [0,3].
+		  */
+		const double& operator[](int pIndex) const;
+
+		/** Get a vector element.
+		  * \param pIndex     The index of the component to access.
+		  * \return           The value of the indexed component.
+		  * \remarks          The index parameter is not checked for values out of bounds. The valid range is [0,3].
+		  */
+		double GetAt(int pIndex) const;
+
+		/** Set a vector element.
+		  * \param pIndex     The index of the component to set.
+		  * \param pValue     The new value to set the component.
+		  * \remarks          The index parameter is not checked for values out of bounds. The valid range is [0,3].
+		  */
+		void SetAt(int pIndex, double pValue);
+
+		/** Set vector.
+		  * \param pX     The X component value.
+		  * \param pY     The Y component value.
+		  * \param pZ     The Z component value.
+		  * \param pW     The W component value.
+		  */
+		void Set(double pX, double pY, double pZ, double pW = 1.0);
+    //@}
+
+    /**
+      * \name Scalar Operations
+      */
+    //@{
+		/** The addition operator between the scalar part of this quaternion and a scalar value, no influence on the vector part of the quaternion.
+		  * \param pValue     The scalar value to be added.
+		  * \return           The sum of addition.
+		  */
+		FbxQuaternion operator+(double pValue) const;
+
+		/** The subtraction operator between the scalar part of this quaternion and a scalar value, no influence on the vector part of the quaternion.
+		  * \param pValue     The scalar subtrahend.
+		  * \return           The difference of subtraction.
+		  */
+		FbxQuaternion operator-(double pValue) const;
+
+		/** Multiply all vector components by a value.
+		  * \param pValue     The value multiplying each component of the vector.
+		  * \return           New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxQuaternion operator*(double pValue) const;
+
+		/**    Divide all vector components by a value.
+		  * \param pValue     The value dividing each component of the vector.
+		  * \return           New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxQuaternion operator/(double pValue) const;
+
+		/** The in place addition operator between the real part of this quaternion and a scalar value.
+		  * \param pValue     The value to be added.
+		  * \return           The sum of addition.
+		  */
+		FbxQuaternion& operator+=(double pValue);
+
+		/** The subtraction operator between the real part of this quaternion and a scalar value.
+		  * \param pValue     The scalar subtrahend.
+		  * \return           The difference of subtraction.
+		  */
+		FbxQuaternion& operator-=(double pValue);
+
+		/** Multiply a value to all vector elements.
+		  * \param pValue     The value multiplying each component of the vector.
+		  * \return           The result of multiplying each component of the vector by pValue, replacing this quaternion.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxQuaternion& operator*=(double pValue);
+
+		/**    Divide all vector elements by a value.
+		  * \param pValue     The value dividing each component of the vector.
+		  * \return           The result of dividing each component of the vector by pValue, replacing this quaternion.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxQuaternion& operator/=(double pValue);
+    //@}
+
+    /**
+      * \name Vector Operations
+      */
+    //@{
+		/**    Unary minus operator.
+		  * \return      A quaternion where each component is multiplied by -1.
+		  */
+		FbxQuaternion operator-() const;
+		    
+		/** Add two vectors together.
+		  * \param pQuaternion     Quaternion to add.
+		  * \return                The quaternion v' = this + pQuaternion.
+		  * \remarks               The values in pQuaternion are not checked.
+		  */
+		FbxQuaternion operator+(const FbxQuaternion& pQuaternion) const;
+
+		/** Subtract a quaternion from another quaternion.
+		  * \param pQuaternion     Quaternion to subtract.
+		  * \return                The quaternion v' = this - pQuaternion.
+		  * \remarks               The values in pQuaternion are not checked.
+		  */
+		FbxQuaternion operator-(const FbxQuaternion& pQuaternion) const;
+
+		/** The quaternion multiplication operator.
+		  * \param pOther          The quaternion to be multiplied with this quaternion.
+		  * \return                The product of two quaternions.
+		  * \remarks               In general, quaternion multiplication does not commute.
+		  */
+		FbxQuaternion operator*(const FbxQuaternion& pOther) const;
+
+		/** The quaternion division operator.
+		  * \param pOther          The divisor quaternion.
+		  * \return                The quotient quaternion.
+		  * \remarks               If the divisor has a zero length, return zero quaternion.
+			  */
+		FbxQuaternion operator/(const FbxQuaternion& pOther) const;
+
+		/** Add two quaternions together.
+		  * \param pQuaternion     Quaternion to add.
+		  * \return                The quaternion v' = this + pQuaternion, replacing this quaternion.
+		  * \remarks               The values in pQuaternion are not checked.
+		  */
+		FbxQuaternion& operator+=(const FbxQuaternion& pQuaternion);
+
+		/** Subtract a quaternion from another vector.
+		  * \param pQuaternion     Quaternion to subtract.
+		  * \return                The quaternion v' = this - pQuaternion, replacing this quaternion.
+		  * \remarks               The values in pQuaternion are not checked.
+		  */
+		FbxQuaternion& operator-=(const FbxQuaternion& pQuaternion);
+
+		/** The in place quaternion multiplication operator.
+		  * \param pOther          The quaternion to be multiplied with this quaternion.
+		  * \return                The product of two quaternions.
+		  * \remarks               In general, quaternion multiplication does not commute.
+		  */
+		FbxQuaternion& operator*=(const FbxQuaternion& pOther);
+			
+		/** The in place quaternion division operator.
+		  * \param pOther          The divisor quaternion.
+		  * \return                The quotient quaternion.
+		  * \remarks               If the divisor has a zero length, return zero quaternion.
+		  */
+		FbxQuaternion& operator/=(const FbxQuaternion& pOther);
+
+		/** Return quaternion product.
+		  * \param pOther          The quaternion to be multiplied with this quaternion.
+		  * \return                The product of two quaternions.
+		  */
+		FbxQuaternion Product(const FbxQuaternion& pOther) const;
+
+		/** Return quaternion dot product.
+		  * \param pQuaternion     Dot product quaternion.
+		  * \return                The dot product of this quaternion and pQuaternion.
+		  */
+		double DotProduct(const FbxQuaternion& pQuaternion) const;
+
+		/** Normalize the quaternion, length set to 1.
+		  */
+		void Normalize();
+
+		/** Calculate the quaternion conjugate.
+		  * \return      The conjugate of this quaternion.
+		  */
+		void Conjugate();
+
+		/** Calculate the length (norm) of the quaternion.
+		  * \return The length of the quaternion.
+		  */
+		double Length();
+
+		/** Calculate the inverse of the quaternion.
+		  * \return      The inverse of this quaternion. 
+		  * \remarks     If this quaternion has a zero length, retain the original value.
+		  * \remarks     If the quaternion is normalized, then its inverse is equal to its conjugate.
+		  */
+		void Inverse();
+
+		/** Set the quaternion rotation from an axis degree angle.
+		* \param pAxis The axis to rotate around.
+		* \param pDegree The amount of degree to rotate around the axis. */
+		void SetAxisAngle(const FbxVector4& pAxis, double pDegree);
+
+		/** Calculate a spherical linear interpolation quaternion.
+		* \param pOther The other quaternion to interpolate with.
+		* \param pWeight A value between 0.0 and 1.0 to specify the interpolation amount. */
+		FbxQuaternion Slerp(const FbxQuaternion& pOther, double pWeight) const;
+
+		/** Create a Quaternion equivalent to the supplied Euler XYZ in spherical coordinate.
+		  * \param pEuler   The Euler XYZ angle (in degrees).
+		  */
+		void ComposeSphericalXYZ(const FbxVector4 pEuler);
+
+		/** Create an Euler XYZ equivalent to the current quaternion.
+		  * \return     The Euler XYZ angle (in degrees) equivalent to the current quaternion in spherical coordinate.
+		  */
+		FbxVector4 DecomposeSphericalXYZ() const;
+    //@}
+
+    /**
+      * \name Boolean Operations
+      */
+    //@{
+		/**    Equivalence operator.
+		  * \param pV     The quaternion to be compared to this quaternion.
+		  * \return       \c true  if the two quaternions are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c false  otherwise.
+		  */
+		bool operator==(const FbxQuaternion & pV) const;
+		    
+		/**    Non equivalence operator.
+		  * \param pV     The quaternion to be compared to \e this.
+		  * \return       \c  false if the two quaternions are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c true  otherwise.
+		  */
+		bool operator!=(const FbxQuaternion & pV) const;
+    //@}
+
+    /**
+      * \name Casting
+      */
+    //@{
+		//! Cast the vector in a double pointer.
+		operator double* ();
+
+		//! Cast the vector in a const double pointer.
+		operator const double* () const;
+    //@}
+
+	/**
+	  * \name Comparison methods
+	  */
+	//@{
+		/** Comparison method.
+		  * \param pQ2 Quaternion to compare with this
+		  * \param pThreshold Epsilon for small number comparison
+		  * \return 0 if quaternions are equal, non-zero value otherwise.
+		  */
+		int Compare(const FbxQuaternion &pQ2, const double pThreshold = FBXSDK_TOLERANCE) const;
+	//@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    void GetQuaternionFromPositionToPosition(const FbxVector4 &pP0, const FbxVector4 &pP1);
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_MATH_QUATERNION_H_ */

+ 282 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxtransforms.h

@@ -0,0 +1,282 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxtransforms.h
+#ifndef _FBXSDK_CORE_MATH_TRANSFORMS_H_
+#define _FBXSDK_CORE_MATH_TRANSFORMS_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/math/fbxmath.h>
+#include <fbxsdk/core/math/fbxquaternion.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** FbxLimits defines a limit range for one transform component, either translation, rotation or scaling.
+  * One transform component limit contains two part: a min value and a max value limit, which means
+  * that each value of the corresponding transform component cannot go beyond the range set by the
+  * min and max values. Although the members are identified as X, Y and Z (the W component is ignored)
+  * at this level, they are unitless values and will only have meaning within the context they are queried.
+  *
+  * For each limit, there is one flag to indicate if the limit is active or not. Before accessing the 
+  * limit info, the caller need to query the flag first to make sure that the retrieved values will be
+  * meaningful.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxLimits
+{
+public:
+	//! Constructor
+	FbxLimits();
+
+	//! Assignment Operator
+	FbxLimits& operator=(const FbxLimits& pLimits);
+
+	/** Retrieve the active state of this limit.
+	  * \return True if the limit is active.
+	  */
+	bool GetActive() const;
+
+	/** Set the active state of this limit.
+	  * \param pActive If true, this limit will become globally active.
+	  */
+	void SetActive(const bool pActive);
+
+	/** Get the active state of the minimum X component.
+	  * \return True if the X component minimum limit is active.
+	  */
+	bool GetMinXActive() const;
+
+	/** Get the active state of the minimum Y component.
+	  * \return True if the Y component minimum limit is active.
+	  */
+	bool GetMinYActive() const;
+
+	/** Get the active state of the minimum Z component.
+	  * \return True if the Z component minimum limit is active.
+	  */
+	bool GetMinZActive() const;
+
+	/** Get the active states of the three components of the minimum limit.
+	  * \param pXActive \c True if the X component minimum limit is active.
+	  * \param pYActive \c True if the Y component minimum limit is active.
+	  * \param pZActive \c True if the Z component minimum limit is active.
+	  */
+	void GetMinActive(bool& pXActive, bool& pYActive, bool& pZActive) const;
+
+	/** Get the minimum limits.
+	  * \return The current X, Y and Z values for the minimum limits.
+	  */
+	FbxDouble3 GetMin() const;
+
+	/** Set the active state of the minimum X component.
+	  * \param pActive If true, the X component minimum limit will be active.
+	  */
+	void SetMinXActive(bool pActive);
+
+	/** Set the active state of the minimum Y component.
+	  * \param pActive If true, the Y component minimum limit will be active.
+	  */
+	void SetMinYActive(bool pActive);
+
+	/** Set the active state of the minimum Z component.
+	  * \param pActive If true, the Z component minimum limit will be active.
+	  */
+	void SetMinZActive(bool pActive);
+
+	/** Set the active states of the three components of the minimum limits.
+	  * \param pXActive If true, the X component minimum limit will be active.
+	  * \param pYActive If true, the Y component minimum limit will be active.
+	  * \param pZActive If true, the Z component minimum limit will be active.
+	  */
+	void SetMinActive(bool pXActive, bool pYActive, bool pZActive);
+
+	/** Set the minimum limits.
+	  * \param pMin The X, Y and Z values for the minimum limits.
+	  */
+	void SetMin(const FbxDouble3& pMin);
+
+	/** Get the active state of the maximum X component.
+	  * \return True if the X component maximum limit is active.
+	  */
+	bool GetMaxXActive() const;
+
+	/** Get the active state of the maximum Y component.
+	  * \return True if the Y component maximum limit is active.
+	  */
+	bool GetMaxYActive() const;
+
+	/** Get the active state of the maximum Z component.
+	  * \return True if the Z component maximum limit is active.
+	  */
+	bool GetMaxZActive() const;
+
+	/** Get the active states of the three components of the maximum limit.
+	  * \param pXActive \c True if the X component maximum limit is active.
+	  * \param pYActive \c True if the Y component maximum limit is active.
+	  * \param pZActive \c True if the Z component maximum limit is active.
+	  */
+	void GetMaxActive(bool& pXActive, bool& pYActive, bool& pZActive) const;
+
+	/** Get the maximum limits.
+	  * \return The current X, Y and Z values for the maximum limits.
+	  */
+	FbxDouble3 GetMax() const;
+
+	/** Set the active state of the maximum X component.
+	  * \param pActive If true, the X component maximum limit will be active.
+	  */
+	void SetMaxXActive(bool pActive);
+
+	/** Set the active state of the maximum Y component.
+	  * \param pActive If true, the Y component maximum limit will be active.
+	  */
+	void SetMaxYActive(bool pActive);
+
+	/** Set the active state of the maximum Z component.
+	  * \param pActive If true, the Z component maximum limit will be active.
+	  */
+	void SetMaxZActive(bool pActive);
+
+	/** Set the active states of the three components of the maximum limits.
+	  * \param pXActive If true, the X component maximum limit will be active.
+	  * \param pYActive If true, the Y component maximum limit will be active.
+	  * \param pZActive If true, the Z component maximum limit will be active.
+	  */
+	void SetMaxActive(bool pXActive, bool pYActive, bool pZActive);
+
+	/** Set the maximum limits.
+	  * \param pMax The X, Y and Z values for the maximum limits.
+	  */
+	void SetMax(const FbxDouble3& pMax);
+
+	/** Find if any of the minimum or maximum active state are set.
+	  * \return If any component of the minimum or maximum active state are set, true is returned.
+	  * \remarks The global active state will not count when resolving this.
+	  */
+	bool GetAnyMinMaxActive() const;
+	
+	/** Apply the active limits to the components of the vector provided.
+	  * \return The new vector clamped by active limits.
+	  */
+	FbxDouble3 Apply(const FbxDouble3& pVector);
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+	enum EMask {eActive=1<<0, eMinX=1<<1, eMinY=1<<2, eMinZ=1<<3, eMaxX=1<<4, eMaxY=1<<5, eMaxZ=1<<6, eAll=eMinX|eMinY|eMinZ|eMaxX|eMaxY|eMaxZ};
+
+	FbxUInt8	mMask;
+	FbxDouble3	mMin;
+	FbxDouble3	mMax;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+class FBXSDK_DLL FbxRotationOrder
+{
+public:	
+	FbxRotationOrder(FbxEuler::EOrder pOrder=FbxEuler::eOrderXYZ);
+
+	FbxEuler::EOrder	GetOrder() const;
+	void				SetOrder(FbxEuler::EOrder pOrder);
+	void				V2M(FbxAMatrix& pRM, const FbxVector4& pV);
+	void				M2V(FbxVector4& pV, const FbxAMatrix& pRM);
+	bool				V2VRef(FbxVector4& pVOut, const FbxVector4& pVIn, const FbxVector4& pVRef);
+
+private:
+    FbxEuler::EOrder mOrder;
+};
+
+/** Handle transform behaviors such as pivots, limits and offets, etc.
+  */
+class FBXSDK_DLL FbxTransform
+{
+public:
+	enum EInheritType {eInheritRrSs, eInheritRSrs, eInheritRrs};
+
+	FbxTransform();
+
+	EInheritType		GetInheritType() const;
+	void				SetInheritType(EInheritType pType);
+	FbxLimits&			GetTranslationLimits();
+	FbxLimits&			GetRotationLimits();
+	FbxLimits&			GetScalingLimits();
+	FbxRotationOrder&	GetRotationOrder();
+	bool				HasROffset() const;
+	bool				HasRPivot() const;
+	bool				HasSOffset() const;
+	bool				HasSPivot() const;
+	bool				HasPreRM() const;
+	bool				HasPostRM() const;
+	void				SetROffset(const FbxVector4& pROffset);
+	void				SetRPivot(const FbxVector4& pRPivot);
+	void				SetSOffset(const FbxVector4& pSOffset);
+	void				SetSPivot(const FbxVector4& pSPivot);
+	void				SetPreRM(const FbxVector4& pPreR);
+	void				SetPostRM(const FbxVector4& pPostR);
+	bool				GetRotationSpaceForLimitOnly() const;
+	void				SetRotationSpaceForLimitOnly(bool pRotationSpaceForLimitOnly);
+
+	void				DoF2LT(FbxVector4& pLT, const FbxVector4& pDoF, const FbxAMatrix& pLRM, const FbxAMatrix& pLSM);
+	void				LT2DoF(FbxVector4& pDoF, const FbxVector4& pLT, const FbxAMatrix& pLRM, const FbxAMatrix& pLSM);
+	void				DoF2LRM(FbxAMatrix& pLRM, const FbxVector4& pRDoF, bool pForLimit=false);
+	void				LRM2DoF(FbxVector4& pRDoF, const FbxAMatrix& pLRM, bool pForLimit=false);
+	void				LSM2GSM(FbxAMatrix& pGSM, const FbxAMatrix& pPGSM, const FbxAMatrix& pLSM, const FbxAMatrix& pLRM, const FbxVector4& pPLS);
+	void				GTRSM2GX(FbxAMatrix& pGX, const FbxVector4& pGT, const FbxAMatrix& pGRM, const FbxAMatrix& pGSM);
+
+private:
+	void				SumPivots(FbxVector4& pSum, const FbxAMatrix& pLRM, const FbxAMatrix& pLSM);
+
+	class RotationSpace
+	{
+	public:
+		enum EMask {eHasNothing=0, eHasPreRotM=1<<0, eHasPostRotM=1<<1};
+
+		RotationSpace();
+
+		bool				HasPreRM() const;
+		bool				HasPostRM() const;
+		void				GetPreRM(FbxAMatrix& pPreRM) const;
+		void				GetPostRM(FbxAMatrix& pPostRM) const;
+		void				SetPreRM(const FbxVector4& pPreR);
+		void				SetPostRM(const FbxVector4& pPostR);
+		void				DoF2LRM(FbxAMatrix& pLRM, const FbxVector4& pRDoF);
+		void				LRM2DoF(FbxVector4& pRDoF, const FbxAMatrix& pLRM);
+
+		FbxUInt8			mMask;
+		FbxAMatrix			mPreRM;
+		FbxAMatrix			mPostRM;
+		FbxRotationOrder	mRotationOrder;
+	};
+
+    enum EMask {eHasNothing=0, eHasRotOffset=1<<0, eHasRotPivot=1<<1, eHasScaleOffset=1<<2, eHasScalePivot=1<<3};
+
+	FbxUInt8		mMask;
+	EInheritType	mInheritType;	
+	FbxVector4		mROffset;
+	FbxVector4		mRPivot;
+	FbxVector4		mSOffset;
+	FbxVector4		mSPivot;
+	FbxLimits		mTranslationLimits;
+	FbxLimits		mRotationLimits;
+	FbxLimits		mScalingLimits;
+	bool			mRotationSpaceForLimitOnly;
+	RotationSpace	mRotationSpace;
+};
+
+FBXSDK_DLL bool FbxGetContinuousRotation(FbxVector4& pRes, const FbxVector4& pRot, const FbxVector4& pRef, const int* pOrder);
+FBXSDK_DLL void FbxGetContinuousRotation(FbxVector4& pRes, const FbxVector4& pRot, const FbxVector4& pRef);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_MATH_TRANSFORMS_H_ */

+ 259 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxvector2.h

@@ -0,0 +1,259 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxvector2.h
+#ifndef _FBXSDK_CORE_MATH_VECTOR_2_H_
+#define _FBXSDK_CORE_MATH_VECTOR_2_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/**	A two double mathematic vector class.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxVector2 : public FbxDouble2
+{
+public:
+	/**
+	  * \name Constructors and Destructor
+	  */
+	//@{
+		//! Constructor.
+		FbxVector2();
+
+		/** Copy constructor.
+		  * \param pVector2 The vector copied to this one.
+		  */
+		FbxVector2(const FbxVector2& pVector2);
+
+		/** Constructor.
+		  *	\param pX X component.
+		  *	\param pY Y component.
+		  */
+		FbxVector2(double pX, double pY);
+	//@}
+
+	/**
+	  * \name Access
+	  */
+	//@{
+		/** Assignment operation.
+		  * \param pVector2   The vector assigned to this one.
+		  * \return           This vector after assignment. 
+		  */
+		FbxVector2& operator=(const FbxVector2& pVector2);
+
+		/** Set vector.
+	  * \param pX The X component value.
+	  * \param pY The Y component value.
+	  */
+		void Set(double pX, double pY);
+	//@}
+
+	/**
+	  * \name Scalar Operations
+	  */
+	//@{
+		/** Add a value to all vector components.
+		  * \param pValue The value to add to each component of the vector.
+		  * \return           A new vector with the result of adding pValue to each component of this vector.
+		  * \remarks          The pValue parameter is not checked.
+		  */
+		FbxVector2 operator+(double pValue) const;
+
+		/** Subtract a value from all vector components.
+		  * \param pValue The value to subtract from each component of the vector.
+		  * \return           A new vector with the result of subtracting pValue from each component of this vector.
+		  * \remarks          The pValue parameter is not checked.
+		  */
+		FbxVector2 operator-(double pValue) const;
+
+		/** Multiply a value to all vector components.
+		  * \param pValue The value multiplying each component of the vector.
+		  * \return           A new vector with the result of multiplying each component of this vector by pValue.
+		  * \remarks          The pValue parameter is not checked.
+		  */
+		FbxVector2 operator*(double pValue) const;
+
+		/**	Divide all vector components by a value.
+		  * \param pValue The value dividing each component of the vector.
+		  * \return           A new vector with the result of dividing each component of this vector by pValue.
+		  * \remarks          The pValue parameter is not checked.
+		  */
+		FbxVector2 operator/(double pValue) const;
+
+		/** Add a value to all vector components.
+		  * \param pValue The value to add to each component of the vector.
+		  * \return           The result of adding pValue to each component of this vector, replacing this vector.
+		  * \remarks          The pValue parameter is not checked.
+		  */
+		FbxVector2& operator+=(double pValue);
+
+		/** Subtract a value from all vector components.
+		  * \param pValue The value to subtract from each component of the vector.
+		  * \return           The result of subtracting pValue from each component of this vector, replacing this vector.
+		  * \remarks          The pValue parameter is not checked.
+		  */
+		FbxVector2& operator-=(double pValue);
+
+		/** Multiply a value to all vector elements.
+		  * \param pValue The value multiplying each component of the vector.
+		  * \return           The result of multiplying each component of this vector by pValue, replacing this vector.
+		  * \remarks          The pValue parameter is not checked.
+		  */
+		FbxVector2& operator*=(double pValue);
+
+		/**	Divide all vector elements by a value.
+		  * \param pValue The value dividing each component of the vector.
+		  * \return           The result of multiplying each component of this vector by pValue, replacing this vector.
+		  * \remarks          The pValue parameter is not checked.
+		  */
+		FbxVector2& operator/=(double pValue);
+	//@}
+
+	/**
+	  * \name Vector Operations
+	  */
+	//@{
+		/**	Unary minus operator.
+		  * \return The vector that is the negation of \c this.
+		  */
+		FbxVector2 operator-() const;
+
+		/** Add two vectors together.
+		  * \param pVector Vector to add.
+		  * \return            The result of this vector + pVector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector2 operator+(const FbxVector2& pVector) const;
+
+		/** Subtract a vector from another vector.
+		  * \param pVector Vector to subtract.
+		  * \return            The result of this vector - pVector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector2 operator-(const FbxVector2& pVector) const;
+
+		/** Memberwise multiplication of two vectors.
+		  * \param pVector      Multiplying vector.
+		  * \return             The result of this vector * pVector.
+		  * \remarks            The values in pVector are not checked.
+		  */
+		FbxVector2 operator*(const FbxVector2& pVector) const;
+
+		/** Memberwise division of a vector with another vector.
+		  * \param pVector     Dividing vector.
+		  * \return            The result of this vector / pVector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector2 operator/(const FbxVector2& pVector) const;
+
+		/** Add two vectors together.
+		  * \param pVector Vector to add.
+		  * \return            The result of this vector + pVector, replacing this vector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector2& operator+=(const FbxVector2& pVector);
+
+		/** Subtract a vector from another vector.
+		  * \param pVector Vector to subtract.
+		  * \return            The result of this vector - pVector, replacing this vector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector2& operator-=(const FbxVector2& pVector);
+
+		/** Memberwise multiplication of two vectors.
+		  * \param pVector Multiplying vector.
+		  * \return            The result of this vector * pVector, replacing this vector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector2& operator*=(const FbxVector2& pVector);
+
+		/** Memberwise division of a vector with another vector.
+		  * \param pVector Dividing vector.
+		  * \remarks           The values in pVector are not checked.
+		  * \return            The result of this vector / pVector, replacing this vector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector2& operator/=(const FbxVector2& pVector);
+
+		/** Calculate the dot product of two vectors.
+		  * \param pVector The second vector.
+		  * \return The dot product value.
+		  */
+		double DotProduct(const FbxVector2& pVector) const;
+	//@}
+
+	/**
+	  * \name Boolean Operations
+	  */
+	//@{
+		/**	Equivalence operator.
+		  * \param pVector The vector to be compared to \e this.
+		  * \return            \c true if the two vectors are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c false otherwise.
+		  */
+		bool operator==(const FbxVector2 & pVector) const;
+
+		/**	Non-equivalence operator.
+		  * \param pVector The vector to be compared to \e this.
+		  * \return            \c false if the two vectors are equal (each element is within a FBXSDK_TOLERANCE tolerance), \c true otherwise.
+		  */
+		bool operator!=(const FbxVector2 & pVector) const;
+	//@}
+
+	/**
+	  * \name Length
+	  */
+	//@{
+		/** Get the vector's length.
+		  * \return The mathematical length of the vector.
+		  */
+		double Length() const;
+
+		/** Get the vector's length squared.
+		  * \return The mathematical square length of the vector.
+		  */
+		double SquareLength() const;
+
+		/** Find the distance between 2 vectors.
+		  * \param pVector The second vector.
+		  * \return The mathematical distance between the two vectors.
+		  */
+		double Distance(const FbxVector2& pVector) const;
+
+		//! Normalize the vector, length set to 1.
+		void Normalize();
+	//@}
+
+	/**
+	  * \name Casting
+	  */
+	//@{
+		//! Cast the vector in a double pointer.
+		operator double* ();
+
+		//! Cast the vector in a const double pointer.
+		operator const double* () const;
+	//@}
+
+	/** Find out if the vector is equal to zero.
+	* \param pSize The number of element to test, starting at beginning. Value must range between [1, 2].
+	* \return \c true if all elements of the vector are zero, \c false otherwise. */
+	bool IsZero(int pSize=2) const;
+
+	// Fix value like 1.#IND, 1.#INF, nan, and inf
+	void FixIncorrectValue();
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_MATH_VECTOR_2_H_ */

+ 324 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/math/fbxvector4.h

@@ -0,0 +1,324 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxvector4.h
+#ifndef _FBXSDK_CORE_MATH_VECTOR_4_H_
+#define _FBXSDK_CORE_MATH_VECTOR_4_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxQuaternion;
+
+/**	A four double mathematic vector class.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxVector4 : public FbxDouble4
+{
+public:
+	/**
+	  * \name Constructors and Destructor
+	  */
+	//@{
+		//! Constructor.
+		FbxVector4();
+
+		/** Copy constructor.
+		  * \param pVector4   The vector copied to this one.
+		  */
+		FbxVector4(const FbxVector4& pVector4);
+
+		/** Constructor.
+		  *	\param pX X component.
+		  *	\param pY Y component.
+		  *	\param pZ Z component.
+		  *	\param pW W component.
+		  */
+		FbxVector4(double pX, double pY, double pZ, double pW=1.0);
+
+		/** Constructor.
+		  *	\param pValue X,Y,Z,W components.
+		  */
+		FbxVector4(const double pValue[4]);
+
+		/** Constructor.
+		  * \param pValue X,Y,Z components.
+		  * \remarks The fourth component of this object is assigned 1.
+		  */
+		FbxVector4(const FbxDouble3& pValue);
+	//@}
+
+	/**
+	  * \name Access
+	  */
+	//@{
+		/** Assignment operation.
+		  * \param pVector4  The vector assigned to this one.
+		  * \return          This vector after assignment.
+		  */
+		FbxVector4& operator=(const FbxVector4& pVector4);
+
+		/** Assignment operation.
+		  * \param pValue    The pointer to an array whose elements are assigned to this vector.
+		  * \return          This vector after assignment.
+		  */
+		FbxVector4& operator=(const double* pValue);
+
+		/** Assignment operation.
+		  * \param pValue    The vector with 3 elements assigned to this vector.
+		  * \return          This vector after assignment.
+		  * \remarks         The first three elements are assigned with pValue. The fourth element is set as 1.0 
+		  */
+		FbxVector4& operator=(const FbxDouble3& pValue);
+
+		/** Set vector.
+		  * \param pX The X component value.
+		  * \param pY The Y component value.
+		  * \param pZ The Z component value.
+		  * \param pW The W component value.
+		  */
+		void Set(double pX, double pY, double pZ, double pW=1.0);
+	//@}
+
+	/**
+	  * \name Scalar Operations
+	  */
+	//@{
+		/** Add a value to all vector components.
+		  * \param pValue The value to add to each component of the vector.
+		  * \return New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxVector4 operator+(double pValue) const;
+
+		/** Subtract a value from all vector components.
+		  * \param pValue The value to subtract from each component of the vector.
+		  * \return New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxVector4 operator-(double pValue) const;
+
+		/** Multiply a value to all vector components.
+		  * \param pValue The value multiplying each component of the vector.
+		  * \return New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxVector4 operator*(double pValue) const;
+
+		/**	Divide all vector components by a value.
+		  * \param pValue The value dividing each component of the vector.
+		  * \return New vector.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxVector4 operator/(double pValue) const;
+
+		/** Add a value to all vector components.
+		  * \param pValue The value to add to each component of the vector.
+		  * \return \e this updated with the operation result.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxVector4& operator+=(double pValue);
+
+		/** Subtract a value from all vector components.
+		  * \param pValue The value to subtract from each component of the vector.
+		  * \return \e this updated with the operation result.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxVector4& operator-=(double pValue);
+
+		/** Multiply a value to all vector elements.
+		  * \param pValue The value multiplying each component of the vector.
+		  * \return \e this updated with the operation result.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxVector4& operator*=(double pValue);
+
+		/**	Divide all vector elements by a value.
+		  * \param pValue The value dividing each component of the vector.
+		  * \return \e this updated with the operation result.
+		  * \remarks          The passed value is not checked.
+		  */
+		FbxVector4& operator/=(double pValue);
+	//@}
+
+	/**
+	  * \name Vector Operations
+	  */
+	//@{
+		/**	Unary minus operator.
+		  * \return The vector that is the negation of \c this.
+		  */
+		FbxVector4 operator-() const;
+
+		/** Add two vectors together.
+		  * \param pVector Vector to add.
+		  * \return The vector v' = this + pVector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector4 operator+(const FbxVector4& pVector) const;
+
+		/** Subtract a vector from another vector.
+		  * \param pVector Vector to subtract.
+		  * \return The vector v' = this - pVector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector4 operator-(const FbxVector4& pVector) const;
+
+		/** Memberwise multiplication of two vectors.
+		  * \param pVector Multiplying vector.
+		  * \return The vector v' = this * pVector.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector4 operator*(const FbxVector4& pVector) const;
+
+		/** Memberwise division of a vector with another vector.
+		  * \param pVector Dividing vector.
+		  * \return The vector v[i]' = this[i] / pVector[i].
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector4 operator/(const FbxVector4& pVector) const;
+
+		/** Add two vectors together.
+		  * \param pVector Vector to add.
+		  * \return \e this updated with the operation result.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector4& operator+=(const FbxVector4& pVector);
+
+		/** Subtract a vector from another vector.
+		  * \param pVector Vector to subtract.
+		  * \return \e this updated with the operation result.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector4& operator-=(const FbxVector4& pVector);
+
+		/** Memberwise multiplication of two vectors.
+		  * \param pVector Multiplying vector.
+		  * \return \e this updated with the operation result.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector4& operator*=(const FbxVector4& pVector);
+
+		/** Memberwise division of a vector with another vector.
+		  * \param pVector Dividing vector.
+		  * \return \e this updated with the operation result.
+		  * \remarks           The values in pVector are not checked.
+		  */
+		FbxVector4& operator/=(const FbxVector4& pVector);
+
+		/** Calculate the dot product of two vectors.
+		  * \param pVector The second vector.
+		  * \return The dot product value.
+		  * \remarks           Being considered as a XYZ vector with a weight, only the 3 first elements are considered in this operation.
+		  */
+		double DotProduct(const FbxVector4& pVector) const;
+
+		/** Calculate the cross product of two vectors.
+		  * \param pVector The second vector.
+		  * \return The cross product vector.
+		  * \remarks           Being considered as a XYZ vector with a weight, only the first 3 elements are considered in this operation.
+		  */
+		FbxVector4 CrossProduct(const FbxVector4& pVector) const;
+
+		/** Calculate the Euler rotation required to align axis pAB-pA on pAB-pB.
+		  *	\param pAB The intersection of the 2 axis.
+		  *	\param pA A point on axis to be aligned.
+		  *	\param pB A point on reference axis.
+		  *	\param pAngles Resulting euler angles.
+		  *	\return \c true on success.
+		  * \remarks           Being considered as a XYZ vector with a weight, only the first 3 elements are considered in this operation.
+		  */
+		static bool AxisAlignmentInEulerAngle(const FbxVector4& pAB, const FbxVector4& pA, const FbxVector4& pB, FbxVector4& pAngles);
+	//@}
+
+	/**
+	  * \name Boolean Operations
+	  */
+	//@{
+		/**	Equivalence operator.
+		  * \param pVector The vector to be compared to \e this.
+		  * \return            \c true if the two vectors are equal (each element is within a FBXSDK_TOLERANCE tolerance) and \c false otherwise.
+		  */
+		bool operator==(const FbxVector4 & pVector) const;
+
+		/**	Non equivalence operator.
+		  * \param pVector The vector to be compared to \e this.
+		  * \return            \c false if the two vectors are equal (each element is within a FBXSDK_TOLERANCE tolerance) and \c true otherwise.
+		  */
+		bool operator!=(const FbxVector4 & pVector) const;
+	//@}
+
+	/**
+	  * \name Length
+	  */
+	//@{
+		/** Get the vector's length.
+		  * \return The mathematical length of the vector.
+		  * \remarks     Being considered as a XYZ vector with a weight, only the first 3 elements are considered in this operation.
+		  */
+		double Length() const;
+
+		/** Get the vector's length squared.
+		  * \return The mathematical square length of the vector.
+		  * \remarks     Being considered as a XYZ vector with a weight, only the first 3 elements are considered in this operation.
+		  */
+		double SquareLength() const;
+
+		/** Find the distance between 2 vectors.
+		  * \param pVector The second vector.
+		  * \return The mathematical distance between the two vectors.
+		  * \remarks           Being considered as a XYZ vector with a weight, only the 3 first elements are considered in this operation.
+		  */
+		double Distance(const FbxVector4& pVector) const;
+
+		/** Normalize the vector, length set to 1.
+		  * \remarks     Being considered as a XYZ vector with a weight, only the first 3 elements are considered in this operation.
+		  */
+		void Normalize();
+
+
+		/** Set the Euler XYZ from a Quaternion.
+		  *\param pQuat    Quaternion from which Euler XYZ information is got.
+		  */
+		void SetXYZ(const FbxQuaternion pQuat);
+	//@}
+
+	/**
+	  * \name Casting
+	  */
+	//@{
+		//! Cast the vector in a double pointer.
+		operator double* ();
+
+		//! Cast the vector in a const double pointer.
+		operator const double* () const;
+	//@}
+
+	/** Find out if the vector is equal to zero.
+	* \param pSize The number of element to test, starting at beginning. Value must range between [1, 4].
+	* \return \c true if all elements of the vector are zero, \c false otherwise. */
+	bool IsZero(int pSize=4) const;
+
+	// Fix value like 1.#IND, 1.#INF, nan, and inf
+	void FixIncorrectValue();
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	int Compare(const FbxVector4& pV, const double pThreshold=FBXSDK_TOLERANCE) const;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_CORE_MATH_VECTOR_4_H_ */

+ 58 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/sync/fbxatomic.h

@@ -0,0 +1,58 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxatomic.h
+#ifndef _FBXSDK_CORE_SYNC_ATOMIC_H_
+#define _FBXSDK_CORE_SYNC_ATOMIC_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#if !defined(FBXSDK_ENV_WINSTORE) && !defined(FBXSDK_ENV_EMSCRIPTEN)
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FBXSDK_DLL FbxAtomOp
+{
+public:
+	static void			Inc(volatile FbxAtomic* pPtr);
+	static void			Dec(volatile FbxAtomic* pPtr);
+	static bool			Add(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static bool			Sub(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static bool			And(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static bool			Or(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static bool			Nand(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static bool			Xor(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static bool			CompareAndSwap(volatile FbxAtomic* pPtr, FbxAtomic pOld, FbxAtomic pSwap);
+	static FbxAtomic	TestAndSet(volatile FbxAtomic* pPtr);
+	static FbxAtomic	FetchAndSwap(volatile FbxAtomic* pPtr, FbxAtomic pSwap);
+	static FbxAtomic	FetchAndInc(volatile FbxAtomic* pPtr);
+	static FbxAtomic	FetchAndDec(volatile FbxAtomic* pPtr);
+	static FbxAtomic	FetchAndAdd(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	FetchAndSub(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	FetchAndOr(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	FetchAndAnd(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	FetchAndXor(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	FetchAndNand(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	IncAndFetch(volatile FbxAtomic* pPtr);
+	static FbxAtomic	DecAndFetch(volatile FbxAtomic* pPtr);
+	static FbxAtomic	AddAndFetch(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	SubAndFetch(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	OrAndFetch(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	AndAndFetch(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	XorAndFetch(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+	static FbxAtomic	NandAndFetch(volatile FbxAtomic* pPtr, FbxAtomic pVal);
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE && !FBXSDK_ENV_EMSCRIPTEN */
+
+#endif /* _FBXSDK_CORE_SYNC_ATOMIC_H_ */

+ 44 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/sync/fbxclock.h

@@ -0,0 +1,44 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxclock.h
+#ifndef _FBXSDK_CORE_SYNC_CLOCK_H_
+#define _FBXSDK_CORE_SYNC_CLOCK_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#ifndef FBXSDK_ENV_WINSTORE
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Put the current thread to sleep.
+  * \param pMilliseconds The duration of the sleep in milli-seconds.
+  */
+FBXSDK_DLL void FbxSleep(int pMilliseconds);
+
+/** Retrieves the current value of the high-resolution performance counter.
+  * \return The current value of the high-resolution performance counter, in "counts".
+  * \remarks To convert "counts" into time, divide it by the frequency available from FbxGetHighResFrequency().
+  */
+FBXSDK_DLL FbxLongLong FbxGetHighResCounter();
+
+/** Retrieves the frequency of the high-resolution performance counter.
+  * \return The frequency of the high-resolution performance counter value, in "counts" per second.
+  * \remarks The first time this function is called, the frequency is queried from the system and then cached
+  * so that further requests are fast. This means it is guaranteed to not change during run-time.
+  */
+FBXSDK_DLL FbxLongLong FbxGetHighResFrequency();
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE */
+
+#endif /* _FBXSDK_CORE_SYNC_CLOCK_H_ */

+ 188 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/sync/fbxsync.h

@@ -0,0 +1,188 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxsync.h
+#ifndef _FBXSDK_CORE_SYNC_H_
+#define _FBXSDK_CORE_SYNC_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#if !defined(FBXSDK_ENV_WINSTORE) && !defined(FBXSDK_ENV_EMSCRIPTEN)
+
+#include <fbxsdk/core/sync/fbxclock.h>
+#include <fbxsdk/core/sync/fbxthread.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxMutexImpl;
+class FbxSemaphoreImpl;
+class FbxGateImpl;
+
+/** A spinlock is the fastest and most simple thread lock mechanism available.
+  * It is very efficient since it does not use any operating system calls; it is only a test and set on an atomic variable,
+  * thus it is the fastest thread lock available. Spinlocks are efficient if threads are only likely to be blocked for a
+  * short period of time, as they avoid overhead from operating system process re-scheduling or context switching. However,
+  * spinlocks become wasteful if held for longer durations, both preventing other threads from running and requiring
+  * re-scheduling.
+  * \note Spinlocks does not support recursive locking. A thread attempting to lock the same spinlock twice will wait
+  * indefinitely.
+  */
+class FBXSDK_DLL FbxSpinLock
+{
+public:
+    FbxSpinLock();
+
+	/** Acquire the lock; thread will wait indefinitely until it is available. */
+    void Acquire();
+
+	/** Release the lock; this will allow other threads to acquire the lock if they are waiting. */
+    void Release();
+
+private:
+    FbxAtomic mSpinLock;
+};
+
+/** Mutually excluding thread lock mechanism.
+  *	While the mutex is a much heavier implementation than a spinlock, it supports recursive locking; the same thread
+  * can safely lock the same mutex more than once without blocking. But it will have to be released as many times as
+  * it as been acquired before other threads can acquire the context. It is sometimes referred as a critical section.
+  * This is the heaviest thread lock implementation, but also the most secure.
+  */
+class FBXSDK_DLL FbxMutex
+{
+public:
+	/** Constructor
+	  * \param pInitialOwnership If pInitialOwnership is true, the lock will be initialized as being locked by the
+	  * current thread.
+	  */
+	FbxMutex(bool pInitialOwnership=false);
+	virtual ~FbxMutex(); //!< Destructor
+
+	/** Acquire the lock; thread will wait indefinitely until it is available.
+	  * \remarks The same thread can acquire the lock multiple times without blocking.
+	  */
+	void Acquire();
+
+	/** Try acquiring the lock; thread will not wait if it is not available.
+	  * \param pRetryCount The number of retries in case the lock is not available.
+	  * \return True if the lock is acquired, false otherwise.
+	  * \remarks The same thread can acquire the lock multiple times without blocking.
+	  */
+	bool TryAcquire(unsigned int pRetryCount);
+
+	/** Release the lock; this will allow other threads to acquire the lock if they are waiting.
+	  * \remarks Only the owner thread should call Release(), and it needs to be released as many times as it was
+	  * acquired.
+	  */
+	void Release();
+
+private:
+	FbxMutexImpl* mImpl;
+};
+
+/** Mutually excluding thread waiting mechanism with a counter.
+  * Semaphore are generally used in situations when the current thread needs to wait for other threads before
+  * proceeding to the next step. In other words, that thread waits a number of signals from other threads. This
+  * is the best mechanism to use to synchronize threads since it doesn't require an heavy critical section.
+  */
+class FBXSDK_DLL FbxSemaphore
+{
+public:
+	FbxSemaphore(); //!< Constructor
+	virtual ~FbxSemaphore(); //!< Destructor
+
+	/** Wait indefinitely until the semaphore as been signaled as many times as specified.
+	  * \param pCount Number of signal to wait before this function returns.
+	  * \return True if the wait exit without errors.
+	  * \remarks If pCount is set to zero, this function returns immediately without waiting.
+	  */
+	bool Wait(unsigned int pCount=1);
+
+	/** Signal the semaphore as many times as specified.
+	  * \param pCount The number of signal to send to the semaphore.
+	  * \return True if the semaphore was signaled without errors.
+	  */
+	bool Signal(unsigned int pCount=1);
+
+private:
+	FbxSemaphoreImpl* mImpl;
+};
+
+/** A gate thread locking mechanism is very similar to a semaphore, except that when it is opened, any
+  * further call to wait will not wait until it is closed. It is generally used to block multiple threads
+  * until one of them open the gate to release them all.
+  */
+class FBXSDK_DLL FbxGate
+{
+public:
+    FbxGate(); //!< Constructor
+    virtual ~FbxGate(); //!< Destructor
+
+	/** Open the gate to release all threads waiting.
+	  * \remarks All waiting threads will unblock until the gate is closed.
+	  */
+    void Open();
+
+	/** Close the gate so that the next time a thread call Wait() it will be blocked. */
+    void Close();
+
+	/** Check if the gate is open.
+	  * \return True if the gate is open, otherwise false.
+	  */
+    bool IsOpen();
+
+	/** Wait indefinitely until the gate open.
+	  * \return True if the wait completed without errors.
+	  * \remarks If the gate is already open, this function returns immediately.
+	  */
+    bool Wait();
+
+private:
+	FbxGateImpl* mImpl;
+};
+
+/** A simple stack of linked items that is multi-thread safe, protected by a spinlock.
+  */
+class FBXSDK_DLL FbxSyncStack
+{
+public:
+	//! A single link item to be used to construct the stack
+	struct Item
+	{
+		Item* mNext;
+		inline Item(){ mNext = NULL; }
+		inline Item* Set(Item* pNext){ return mNext = pNext; }
+		inline Item* Next(){ return mNext; }
+	};
+
+	//! Constructor
+	FbxSyncStack();
+
+	/** Add an item on the top of the stack.
+	  * \param pItem The item to add on top of the stack.
+	  */
+	void Push(Item* pItem);
+
+	/** Remove the item on the top of the stack.
+	  * \return Returns the item on top of the stack, otherwise NULL if stack empty.
+	  */
+	Item* Pop();
+
+private:
+	FbxSpinLock	mLock;
+	Item*		mTop;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE && !FBXSDK_ENV_EMSCRIPTEN */
+
+#endif /* _FBXSDK_CORE_SYNC_H_ */

+ 99 - 0
sdk/Darwin/2019.2/include/fbxsdk/core/sync/fbxthread.h

@@ -0,0 +1,99 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxthread.h
+#ifndef _FBXSDK_CORE_SYNC_THREAD_H_
+#define _FBXSDK_CORE_SYNC_THREAD_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#if !defined(FBXSDK_ENV_WINSTORE) && !defined(FBXSDK_ENV_EMSCRIPTEN)
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxThreadImpl;
+
+//! Definition of a thread procedure function signature.
+typedef void (*FbxThreadProc)(void*);
+
+/** This class implement a standard way to use threads across platforms.
+  */
+class FBXSDK_DLL FbxThread
+{
+public:
+	enum EState {eUnknown, eRunning, eDead};
+	enum EPriority {eNone, eIdle, eLowest, eLow, eNormal, eHigh, eHighest, eRealTime};
+
+	/** Constructor
+	  * \param pProc The procedure called upon thread startup.
+	  * \param pArg The arguments passed to the procedure.
+	  * \param pSuspend Start the thread suspended.
+	  */
+	FbxThread(FbxThreadProc pProc, void* pArg, bool pSuspend=false);
+
+	/** Constructor
+	  * \param pProc The procedure called upon thread startup.
+	  * \param pArg The arguments passed to the procedure.
+	  * \param pPriority The thread priority to set upon creation.
+	  * \param pSuspend Start the thread suspended.
+	  */
+	FbxThread(FbxThreadProc pProc, void* pArg, EPriority pPriority, bool pSuspend=false);
+
+	//! Destructor
+	virtual ~FbxThread();
+
+	/** Suspend the execution of the thread.
+	  * \return Return true if the thread was successfully suspended, otherwise false.
+	  * \remarks It should be used only if you can control where the thread will be suspended in its procedure,
+	  * otherwise the state of the thread and its memory is unknown, since the code will stop anywhere.
+	  */
+	bool Suspend();
+
+	/** Resume the execution of the thread.
+	  * \return Return true if the thread was successfully resumed, otherwise false.
+	  */
+	bool Resume();
+
+	/** Wait for the thread completion.
+	  * \return True if the thread successfully returned from its procedure.
+	  */
+	bool Join();
+
+	/** Do not wait for the thread completion and terminate it.
+	  * \return True if the thread successfully died.
+	  */
+	bool Kill();
+
+	/** Retrieve the priority of the thread.
+	  * \return The thread's priority.
+	  */
+	EPriority GetPriority();
+
+	/** Set the thread priority.
+	  * \param pPriority The priority to set to this thread.
+	  * \return True if the thread priority was successfully changed.
+	  */
+	bool SetPriority(EPriority pPriority);
+
+	/** Retrieve the thread current state.
+	  * \return The state of the thread.
+	  */
+	EState GetState();
+
+private:
+	FbxThreadImpl* mImpl;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* !FBXSDK_ENV_WINSTORE && !FBXSDK_ENV_EMSCRIPTEN */
+
+#endif /* _FBXSDK_CORE_SYNC_THREAD_H_ */

+ 55 - 0
sdk/Darwin/2019.2/include/fbxsdk/fbxsdk_def.h

@@ -0,0 +1,55 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+/** \file fbxsdk_def.h
+  * FBX SDK environment definition.
+  *
+  * This file is the principal FBX SDK environment definition. It is used at the top of
+  * every header and source file so that every unit is using the same definitions.
+  */
+#ifndef _FBXSDK_DEFINITION_H_
+#define _FBXSDK_DEFINITION_H_
+
+//---------------------------------------------------------------------------------------
+//System Includes
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <wchar.h>
+#include <locale.h>
+#include <float.h>
+#include <math.h>
+#include <time.h>
+
+//---------------------------------------------------------------------------------------
+//Define Version and Namespace
+#include <fbxsdk/fbxsdk_version.h>
+
+//---------------------------------------------------------------------------------------
+//Define Architecture
+#include <fbxsdk/core/arch/fbxarch.h>
+#include <fbxsdk/core/arch/fbxtypes.h>
+#include <fbxsdk/core/arch/fbxdebug.h>
+#include <fbxsdk/core/arch/fbxalloc.h>
+#include <fbxsdk/core/arch/fbxnew.h>
+#include <fbxsdk/core/arch/fbxstdcompliant.h>
+
+//---------------------------------------------------------------------------------------
+//Useful Macros
+#define FBX_SAFE_DELETE(p)			{FbxDelete(p);(p)=NULL;}
+#define FBX_SAFE_DELETE_ARRAY(a)	{FbxDeleteArray(a);(a)=NULL;}
+#define FBX_SAFE_DESTROY(p)			if(p){(p)->Destroy();(p)=NULL;}
+#define FBX_SAFE_FREE(p)			if(p){FbxFree(p);(p)=NULL;}
+
+#endif /* _FBXSDK_DEFINITION_H_ */

+ 17 - 0
sdk/Darwin/2019.2/include/fbxsdk/fbxsdk_nsbegin.h

@@ -0,0 +1,17 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxsdk_nsbegin.h
+#include <fbxsdk/fbxsdk_version.h>
+
+#if FBXSDK_DEFINE_NAMESPACE == 1
+	namespace FBXSDK_NAMESPACE {
+#endif

+ 16 - 0
sdk/Darwin/2019.2/include/fbxsdk/fbxsdk_nsend.h

@@ -0,0 +1,16 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxsdk_nsend.h
+
+#if FBXSDK_DEFINE_NAMESPACE == 1
+	}
+#endif

+ 57 - 0
sdk/Darwin/2019.2/include/fbxsdk/fbxsdk_version.h

@@ -0,0 +1,57 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2018 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+/** \file fbxsdk_version.h
+  * FBX SDK version definition.
+  *
+  * This file defines the version string and numbers for this release of the FBX SDK.
+  * \note This file should never be included directly, please include fbxsdk_def.h
+  * instead.
+  */
+#ifndef _FBXSDK_VERSION_H_
+#define _FBXSDK_VERSION_H_
+
+//FBX SDK version defines
+#define FBXSDK_VERSION_MAJOR    2019        //<! Integer, version major number
+#define FBXSDK_VERSION_MINOR    2           //<! Integer, version minor number
+#define FBXSDK_VERSION_POINT    0           //<! Integer, version point number
+#define FBXSDK_VERSION_NAME     "Release"   //<! String, version name, example: Alpha, Beta, RC, Release
+
+#ifndef FBXSDK_VERSION_REVISION
+	#define FBXSDK_VERSION_REVISION 0       //<! Integer, version revision number, set by build environment. Do not edit here!
+#endif
+
+//FBX SDK version string macros
+#define FBX_STRING(x)       #x
+#define FBX_STRINGIFY(x)    FBX_STRING(x)
+
+#if FBXSDK_VERSION_POINT == 0
+    #define FBXSDK_VER_TO_STR(a, b, c)  FBX_STRING(a.b)
+#else
+    #define FBXSDK_VER_TO_STR(a, b, c)  FBX_STRING(a.b.c)
+#endif
+
+//FBX SDK version strings
+#define FBXSDK_VERSION_STRING       FBXSDK_VER_TO_STR(FBXSDK_VERSION_MAJOR, FBXSDK_VERSION_MINOR, FBXSDK_VERSION_POINT)
+#define FBXSDK_VERSION_STRING_FULL  FBXSDK_VERSION_STRING " " FBXSDK_VERSION_NAME " (" FBX_STRINGIFY(FBXSDK_VERSION_REVISION) ")"
+
+//FBX SDK namespace definition
+#ifndef FBXSDK_DEFINE_NAMESPACE
+    #define FBXSDK_DEFINE_NAMESPACE 1
+#endif
+
+#if FBXSDK_DEFINE_NAMESPACE == 1
+    #define FBXSDK_NAMESPACE fbxsdk
+#else
+    #define FBXSDK_NAMESPACE
+#endif
+
+#endif /* _FBXSDK_VERSION_H_ */

+ 90 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladaanimationelement.h

@@ -0,0 +1,90 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2016 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxcolladaanimationelement.h
+#ifndef _FBXSDK_FILEIO_COLLADA_ANIMATION_ELEMENT_H_
+#define _FBXSDK_FILEIO_COLLADA_ANIMATION_ELEMENT_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fileio/collada/fbxcolladaelement.h>
+
+#include <map>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Representing a COLLADA animation element.
+  */
+class AnimationElement : public ElementBase
+{
+public:
+    typedef ElementBase base_type;
+
+    AnimationElement();
+    virtual ~AnimationElement();
+
+    /** Get the count of animation channels in the element.
+      * \return Return the channel count.
+      */
+    int GetChannelCount() const;
+
+    /** Initialize with the content of a COLLADA element.
+      * This method should be called before ToFBX.
+      */
+    bool FromCOLLADA(xmlNode * pElement, const SourceElementMapType & pSourceElements);
+
+    /** Initialize with an animation curve.
+      * This method should be called before ToCOLLADA.
+      * \param pCurve The specific animation curve.
+      * \param pUnitConversion The unit conversion for key value.
+      */
+    bool FromFBX(const FbxAnimCurve * pCurve, double pUnitConversion = 1.0);
+
+    /** Copy the channel with specific index to the FBX animation curve.
+      * \param pFBXCurve The destination FBX animation curve.
+      * \param pChannelIndex The index of the source channel.
+      * \param pUnitConversion The unit conversion from local element to global.
+      */
+    bool ToFBX(FbxAnimCurve * pFBXCurve, int pChannelIndex,
+        double pUnitConversion = 1.0) const;
+
+    /** Copy the matrix animation to the FBX node TRS properties.
+      * \param pFBXNode The destination FBX node.
+      * \param pAnimLayer The animation layer whose X, Y and Z curves will be set up.
+      * \param pUnitConversion The unit conversion from local element to global.
+      */
+    bool ToFBX(FbxNode * pFBXNode, FbxAnimLayer * pAnimLayer,
+        double pUnitConversion = 1.0) const;
+
+    /** Add the content to COLLADA animation library.
+      * \param pAnimationLibrary The COLLADA animation library element.
+      * \param pNodeID The ID of the element to who this curve is belong.
+      * \param pAttributeSID The ID the attribute to who this curve is belong.
+      */
+    bool ToCOLLADA(xmlNode * pAnimationLibrary, const char * pNodeID,
+        const char * pAttributeSID);
+
+private:
+    int mKeyCount;
+    double * mInputArray;
+    double * mOutputArray;
+    int mOutputStride;
+    FbxString * mInterpolationArray;
+    int mInterpolationStride;
+    double * mInTangentArray;
+    int mInTangentStride;
+    double * mOutTangentArray;
+    int mOutTangentStride;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_COLLADA_ANIMATION_ELEMENT_H_ */

+ 275 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladaelement.h

@@ -0,0 +1,275 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2016 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxcolladaelement.h
+#ifndef _FBXSDK_FILEIO_COLLADA_ELEMENT_H_
+#define _FBXSDK_FILEIO_COLLADA_ELEMENT_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+// Utility functions to convert type to array tag used in COLLADA source element
+template <typename T>
+inline const FbxString TypeToArrayTag()
+{
+    return COLLADA_FLOAT_ARRAY_STRUCTURE;
+}
+
+template <>
+inline const FbxString TypeToArrayTag<bool>()
+{
+    return COLLADA_BOOL_ARRAY_STRUCTURE;
+}
+
+template <>
+inline const FbxString TypeToArrayTag<int>()
+{
+    return COLLADA_INT_ARRAY_STRUCTURE;
+}
+
+template <>
+inline const FbxString TypeToArrayTag<FbxString>()
+{
+    return COLLADA_NAME_ARRAY_STRUCTURE;
+}
+
+// Utility functions to convert type to parameter tag used in COLLADA source element
+template <typename T>
+inline const FbxString TypeToParameterTag()
+{
+    return COLLADA_FLOAT_TYPE;
+}
+
+template <>
+inline const FbxString TypeToParameterTag<bool>()
+{
+    return COLLADA_BOOL_TYPE;
+}
+
+template <>
+inline const FbxString TypeToParameterTag<int>()
+{
+    return COLLADA_INT_TYPE;
+}
+
+template <>
+inline const FbxString TypeToParameterTag<FbxString>()
+{
+    return COLLADA_NAME_TYPE;
+}
+
+//----------------------------------------------------------------------------//
+
+/** A struct for convenient access to the content of common COLLADA element.
+  */
+struct ElementContentAccessor
+{
+    ElementContentAccessor();
+    ElementContentAccessor(xmlNode * pElement);
+    virtual ~ElementContentAccessor();
+
+    template <typename TYPE>
+    bool GetNext(TYPE * pData)
+    {
+        return FromString(pData, mPointer, &mPointer);
+    }
+
+    template <typename TYPE>
+    int GetArray(TYPE * pArray, int pArraySize,
+        int pSourceUnitOffset = 0, int pSourceUnitValidCount = 1, int pSourceUnitSize = 1,
+        int pDestUnitOffset = 0, int pDestUnitValidCount = 1, int pDestUnitSize = 1,
+        TYPE pDefaultValue = TYPE())
+    {
+        if (pArray)
+        {
+            return FromStringToArray(mPointer, pArray, pArraySize,
+                pSourceUnitOffset, pSourceUnitValidCount, pSourceUnitSize,
+                pDestUnitOffset, pDestUnitValidCount, pDestUnitSize, pDefaultValue);
+        }
+        return 0;
+    }
+
+    xmlChar * mContent;
+    const char * mPointer;
+};
+
+//----------------------------------------------------------------------------//
+
+/** A struct for convenient access to the content of COLLADA source element.
+  */
+template <typename TYPE>
+struct SourceElementContentAccessor : public ElementContentAccessor
+{
+    SourceElementContentAccessor(xmlNode * pSourceElement)
+        : mCount(0), mStride(1), mOffset(0)
+    {
+        bool lReadCount = true;
+        xmlNode* lTechniqueElement = DAE_FindChildElementByTag(pSourceElement, COLLADA_TECHNIQUE_COMMON_ELEMENT);
+        if (lTechniqueElement)
+        {
+            xmlNode* lAccessorElement = DAE_FindChildElementByTag(lTechniqueElement, COLLADA_ACCESSOR_STRUCTURE);
+            if (lAccessorElement)
+			{
+				DAE_GetElementAttributeValue(lAccessorElement, COLLADA_COUNT_PROPERTY, mCount);
+				DAE_GetElementAttributeValue(lAccessorElement, COLLADA_STRIDE_PROPERTY, mStride);
+				DAE_GetElementAttributeValue(lAccessorElement, COLLADA_OFFSET_PROPERTY, mOffset);
+			}
+            lReadCount = false;
+        }
+
+        xmlNode * lDataArrayElement = DAE_FindChildElementByTag(pSourceElement, TypeToArrayTag<TYPE>());
+        // Some COLLADA exporters use IDREF_array instead of Name_array
+        if (!lDataArrayElement && TypeToArrayTag<TYPE>() == COLLADA_NAME_ARRAY_STRUCTURE)
+            lDataArrayElement = DAE_FindChildElementByTag(pSourceElement, COLLADA_IDREF_ARRAY_STRUCTURE);
+        FBX_ASSERT(lDataArrayElement);
+
+        if (lDataArrayElement && lReadCount)
+            DAE_GetElementAttributeValue(lDataArrayElement, COLLADA_COUNT_PROPERTY, mCount);
+
+        mContent = xmlNodeGetContent(lDataArrayElement);
+        mPointer = (const char *)mContent;
+    }
+
+    int mCount;
+    int mStride;
+    int mOffset;
+};
+
+//----------------------------------------------------------------------------//
+
+/** Representing a common COLLADA element.
+  */
+class ElementBase
+{
+public:
+    enum
+    {
+        MATRIX_STRIDE = 16,
+    };
+
+    // The name of user property in FBX which is used to preserve the ID of COLLADA element
+    static const char* smID_PROPERTY_NAME;    
+
+    /** Constructor & Destructor.
+      */
+    ElementBase();
+    virtual ~ElementBase();
+
+    /** Access for XML element.
+      */
+    void SetXMLElement(xmlNode * pElement) { mXMLElement = pElement; }
+    xmlNode * GetXMLElement() const { return mXMLElement; }
+
+    /** Get the ID of the element.
+      * \return Return the ID string.
+      */
+    const FbxString & GetID() const;
+
+    /** Get the unit of the element,
+      * which takes effect in this element and its children elements.
+      * \return Return the unit.
+      */
+    const FbxSystemUnit * GetUnit() const;
+
+private:
+    xmlNode * mXMLElement;
+    mutable FbxString * mID;
+    mutable FbxSystemUnit * mUnit;
+};
+
+/** Convert from ID to URL, just add a prefix "#".
+  * \param pID The ID string.
+  * \return Return the URL string.
+  */
+inline const FbxString URL(const FbxString & pID)
+{
+    return FbxString("#") + pID;
+}
+
+/** Convert the array data to a source element under specific parent element.
+  * \param pParentElement The parent element.
+  * \param pID The ID of the new source element.
+  * \param pData The array data.
+  * \param pCount The length of the array.
+  * \param pStride The stride of each unit in the array. For example, when you
+  * export an array of FbxDouble3 of size 10, you convert it to a double array
+  * of size 30 with a stride 3 and call this method.
+  * \return The new source element.
+  */
+template <typename T>
+xmlNode * AddSourceElement(xmlNode * pParentElement, const char * pID,
+                           const T * pData, int pCount, int pStride = 1)
+{
+    FBX_ASSERT(pParentElement && pData);
+    if (!pParentElement || !pData)
+        return NULL;
+
+    xmlNode * lSourceElement = DAE_AddChildElement(pParentElement, COLLADA_SOURCE_STRUCTURE);
+    DAE_AddAttribute(lSourceElement, COLLADA_ID_PROPERTY, pID);
+
+    FbxString lContent;
+    const int lDataCount = pCount * pStride;
+    for (int lIndex = 0; lIndex < lDataCount; ++lIndex)
+    {
+        lContent += ToString(pData[lIndex]);
+        if (lIndex != lDataCount - 1)
+            lContent += " ";
+    }
+    const FbxString lArrayID = FbxString(pID) + "-array";
+    xmlNode * lArrayElement = DAE_AddChildElement(lSourceElement, TypeToArrayTag<T>(), lContent);
+    DAE_AddAttribute(lArrayElement, COLLADA_ID_PROPERTY, lArrayID);
+    DAE_AddAttribute(lArrayElement, COLLADA_COUNT_PROPERTY, lDataCount);
+
+    xmlNode * lTechniqueCommonElement = DAE_AddChildElement(lSourceElement,
+        COLLADA_TECHNIQUE_COMMON_ELEMENT);
+    xmlNode * lAccessElement = DAE_AddChildElement(lTechniqueCommonElement, 
+        COLLADA_ACCESSOR_STRUCTURE);
+    DAE_AddAttribute(lAccessElement, COLLADA_SOURCE_PROPERTY, URL(lArrayID));
+    DAE_AddAttribute(lAccessElement, COLLADA_COUNT_PROPERTY, pCount);
+    DAE_AddAttribute(lAccessElement, COLLADA_STRIDE_PROPERTY, pStride);
+
+    for (int lStrideIndex = 0; lStrideIndex < pStride; ++lStrideIndex)
+    {
+        xmlNode * lParamElement = DAE_AddChildElement(lAccessElement, COLLADA_PARAMETER_STRUCTURE);
+        DAE_AddAttribute(lParamElement, COLLADA_TYPE_PROPERTY, TypeToParameterTag<T>());
+    }
+
+    return lSourceElement;
+}
+
+/** Populate the layer element with direct array and return index array for later use.
+  * \param pLayerElement The layer element to be populated.
+  * \param pSourceElement The source element containing the direct array data.
+  * \param pSize The count of double data of direct array element.
+  * \return Return the index array of the layer element.
+  */
+template <typename TYPE> FbxLayerElementArray * PopulateLayerElementDirectArray(FbxLayerElement * pLayerElement, xmlNode * pSourceElement, int pSize)
+{
+    SourceElementContentAccessor<TYPE> lSourceElementAccessor(pSourceElement);
+
+    FbxLayerElementTemplate<TYPE> * lLayerElement = (FbxLayerElementTemplate<TYPE> *)pLayerElement;
+    lLayerElement->SetMappingMode(FbxLayerElement::eByPolygonVertex);
+    lLayerElement->SetReferenceMode(FbxLayerElement::eIndexToDirect);
+    lLayerElement->GetDirectArray().SetCount(lSourceElementAccessor.mCount);
+
+    TYPE * lArray = NULL;
+    lArray = lLayerElement->GetDirectArray().GetLocked(lArray);
+    lSourceElementAccessor.GetArray((double *)lArray, lSourceElementAccessor.mCount*pSize, 0, pSize,
+        lSourceElementAccessor.mStride, 0, pSize, sizeof(TYPE)/sizeof(double), 1.0);
+    lLayerElement->GetDirectArray().Release(&lArray, lArray);
+
+    return &(lLayerElement->GetIndexArray());
+}
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_COLLADA_ELEMENT_H_ */

+ 133 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladaiostream.h

@@ -0,0 +1,133 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2017 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxcolladaiostream.h
+#ifndef _FBXSDK_FILEIO_COLLADA_IO_STREAM_H_
+#define _FBXSDK_FILEIO_COLLADA_IO_STREAM_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+//----------------------------------------------------------------------------//
+
+/** Convert part of the source string into destination type.
+  * \param pDest The destination with a specific type.
+  * \param pSourceBegin The begin of the source string.
+  * \param pSourceEnd Return the end of the part of the source string.
+  * \return Return \c true on success and \c false if else.
+  */
+template <typename T> bool FromString(T * pDest, const char * pSourceBegin, const char ** pSourceEnd = NULL);
+template <> bool FromString(int * pDest, const char * pSourceBegin, const char ** pSourceEnd);
+template <> bool FromString(double * pDest, const char * pSourceBegin, const char ** pSourceEnd);
+template <> bool FromString(FbxString * pDest, const char * pSourceBegin, const char ** pSourceEnd);
+template <> bool FromString(FbxDouble2 * pDest, const char * pSourceBegin, const char ** pSourceEnd);
+template <> bool FromString(FbxDouble3 * pDest, const char * pSourceBegin, const char ** pSourceEnd);
+template <> bool FromString(FbxDouble4 * pDest, const char * pSourceBegin, const char ** pSourceEnd);
+template <> bool FromString(FbxVector4 * pDest, const char * pSourceBegin, const char ** pSourceEnd);
+template <> bool FromString(FbxAMatrix * pDest, const char * pSourceBegin, const char ** pSourceEnd);
+template <> bool FromString(FbxAMatrix * pDest, const char * pSourceBegin, const char ** pSourceEnd);
+
+
+
+/** Parse the string into an array.
+  * The source string is made up with many groups and each group contains pSourceGroupSize units separated by spaces;
+  * The destination array is also made up with many groups and each unit contains pDestGroupSize units.
+  * The valid unit range in each source group is [pSourceUnitOffset, pSourceUnitOffset + pSourceValidUnitCount).
+  * The valid unit range in each destination unit is [pDestUnitOffset, pDestUnitOffset + pDestValidUnitCount).
+  * The units in invalid range of destination is set to a default value.
+  */
+template <typename TYPE> int FromStringToArray(const char * pString, TYPE * pArray, int pArraySize, int pSourceUnitOffset, int pSourceValidUnitCount, int pSourceGroupSize, int pDestUnitOffset, int pDestValidUnitCount, int pDestGroupSize, TYPE pDefaultValue = TYPE())
+{
+    if (pString == 0 || pArray == 0)
+        return 0;
+
+    FBX_ASSERT(pSourceUnitOffset >= 0 && pSourceUnitOffset < pSourceGroupSize);
+    FBX_ASSERT(pSourceValidUnitCount >= 0 && pSourceUnitOffset + pSourceValidUnitCount <= pSourceGroupSize);
+    FBX_ASSERT(pDestUnitOffset >= 0 && pDestUnitOffset < pDestGroupSize);
+    FBX_ASSERT(pDestValidUnitCount >= 0 && pDestUnitOffset + pDestValidUnitCount <= pDestGroupSize);
+    const char * lSource = pString;
+    TYPE * lDest = pArray;
+
+    int lReadCount = 0;
+    int lSourceCounter = 0;
+    int lDestCounter = 0;
+    const int lSourceUnitValidEnd = pSourceUnitOffset + pSourceValidUnitCount;
+    const int lDestUnitGap = pDestGroupSize - pDestValidUnitCount - pDestUnitOffset;
+    while (lSource && *lSource)
+    {
+        TYPE lData;
+        const char * lSourceStart = lSource;
+        if (FromString(&lData, lSource, &lSource) && lSourceCounter >= pSourceUnitOffset && lSourceCounter < lSourceUnitValidEnd)
+        {
+			if (lReadCount >= pArraySize)
+			{
+				// we are trying to write past the allocated buffer
+				return 0;
+			}
+
+            if (lDestCounter == 0)
+            {
+                for (int lIndex = 0; lIndex < pDestUnitOffset; ++lIndex)
+                    *(lDest++) = pDefaultValue;
+            }
+
+            *lDest++ = lData;
+            ++lReadCount;
+            ++lDestCounter;
+            if (lDestCounter == pDestValidUnitCount)
+            {
+                lDestCounter = 0;
+                for (int lIndex = 0; lIndex < lDestUnitGap; ++lIndex)
+                    *lDest++ = pDefaultValue;
+            }
+        }
+        else
+        {
+            // we met a stop condition of FromString. In the normal case, lSource should now be "" or ' '. If not,
+            // the converted string is corrupted and we have to break the loop. We can detect this by checking
+            // if lSource pointer has moved.
+            if (lSource == lSourceStart)
+            {
+                break;
+            }
+        }
+        ++lSourceCounter;
+        if (lSourceCounter == pSourceGroupSize)
+            lSourceCounter = 0;
+    }
+    return lReadCount;
+}
+
+//----------------------------------------------------------------------------//
+
+template <typename T>
+const FbxString ToString(const T & pValue)
+{
+    return FbxString(pValue);
+}
+template <>
+const FbxString ToString(const FbxVector4 & pValue);
+template <>
+const FbxString ToString(const FbxAMatrix & pValue);
+
+//----------------------------------------------------------------------------//
+
+/** Decode percent encoded characters, returns an empty string if there's an error.
+  * For example, a string like "abc%20abc" is converted into "abc abc".
+  * \param pEncodedString The percent encoded string.
+  * \return The decoded string.
+  */
+const FbxString DecodePercentEncoding(const FbxString & pEncodedString);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_COLLADA_IO_STREAM_H_ */

+ 71 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladanamespace.h

@@ -0,0 +1,71 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxcolladanamespace.h
+#ifndef _FBXSDK_FILEIO_COLLADA_NAMESPACE_H_
+#define _FBXSDK_FILEIO_COLLADA_NAMESPACE_H_
+
+#include <fbxsdk.h>
+
+#include <libxml/globals.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Containing the valid parameter definition and modification in local scope.
+  */
+struct FbxColladaNamespace
+{
+public:
+    /** Push the newparam and setparam elements found in this element.
+      * Call this method at the beginning of importing an element.
+      * \param pElement The specific element.
+      */
+    void Push(xmlNode * pElement);
+
+    /** Pop the newparam and setparam elements found in this element.
+      * Call this method at the end of importing an element.
+      */
+    void Pop();
+
+    /** Find the specific newparam element with given SID.
+      * \param pSID The given SID.
+      * \return Return the found element or NULL if fail.
+      */
+    xmlNode * FindParamDefinition(const char * pSID) const;
+
+    /** Find the specific setparam element with given SID.
+      * \param pSID The given SID.
+      * \return Return the found element or NULL if fail.
+      */
+    xmlNode * FindParamModification(const char * pSID) const;
+
+    /** Get the count of all the setparam elements in local scope.
+      * \return The count.
+      */
+    int GetParamModificationCount() const;
+
+    /** Get the setparam element with given index.
+      * \param pIndex The given index.
+      * \return The element.
+      */
+    xmlNode * GetParamModification(int pIndex) const;
+
+private:
+    FbxArray<xmlNode*> mParamDefinition;
+    FbxArray<int> mParamDefinitionCount;
+
+    FbxArray<xmlNode*> mParamModification;
+    FbxArray<int> mParamModificationCount;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_COLLADA_NAMESPACE_H_ */

+ 472 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladatokens.h

@@ -0,0 +1,472 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxcolladatokens.h
+#ifndef _FBXSDK_FILEIO_COLLADA_TOKENS_H_
+#define _FBXSDK_FILEIO_COLLADA_TOKENS_H_
+
+#define XML_STR (const xmlChar*) 
+
+// In COLLADA, 1 means total control, while 100 means total control in FBX.
+const int COLLADA_MORPH_WEIGHT_TO_FBX_RATIO = 100;
+
+#define COLLADA_VERSION_PROPERTY			"version"
+#define COLLADA_VERSION						"1.4.1"
+#define COLLADA_SCHEMA						"http://www.collada.org/2005/11/COLLADASchema"
+
+// COLLADA 1.4 elements
+#define COLLADA_LIBRARY_ANIMATION_ELEMENT			"library_animations"
+#define COLLADA_LIBRARY_ANIMATION_CLIP_ELEMENT		"library_animation_clips"
+#define COLLADA_LIBRARY_CAMERA_ELEMENT				"library_cameras"
+#define COLLADA_LIBRARY_CONTROLLER_ELEMENT			"library_controllers"
+#define COLLADA_LIBRARY_EFFECT_ELEMENT				"library_effects"
+#define COLLADA_LIBRARY_FFIELDS_ELEMENT				"library_force_fields"
+#define COLLADA_LIBRARY_GEOMETRY_ELEMENT			"library_geometries"
+#define COLLADA_LIBRARY_IMAGE_ELEMENT				"library_images"
+#define COLLADA_LIBRARY_LIGHT_ELEMENT				"library_lights"
+#define COLLADA_LIBRARY_MATERIAL_ELEMENT			"library_materials"
+#define COLLADA_LIBRARY_NODE_ELEMENT				"library_nodes"
+#define COLLADA_LIBRARY_PMATERIAL_ELEMENT			"library_physics_materials"
+#define COLLADA_LIBRARY_PMODEL_ELEMENT				"library_physics_models"
+#define COLLADA_LIBRARY_PSCENE_ELEMENT				"library_physics_scenes"
+#define COLLADA_LIBRARY_VSCENE_ELEMENT				"library_visual_scenes"
+
+#define COLLADA_INSTANCE_ANIMATION_ELEMENT				"instance_animation"
+#define COLLADA_INSTANCE_CAMERA_ELEMENT					"instance_camera"
+#define COLLADA_INSTANCE_CONTROLLER_ELEMENT				"instance_controller"
+#define COLLADA_INSTANCE_EFFECT_ELEMENT					"instance_effect"
+#define COLLADA_INSTANCE_GEOMETRY_ELEMENT				"instance_geometry"
+#define COLLADA_INSTANCE_LIGHT_ELEMENT					"instance_light"
+#define COLLADA_INSTANCE_NODE_ELEMENT					"instance_node"
+#define COLLADA_INSTANCE_VSCENE_ELEMENT					"instance_visual_scene"
+#define COLLADA_INSTANCE_PSCENE_ELEMENT					"instance_physics_scene"
+#define COLLADA_INSTANCE_MATERIAL_ELEMENT				"instance_material"
+
+#define COLLADA_ANIMCLIP_ELEMENT						"animation_clip"
+#define COLLADA_BINDMATERIAL_ELEMENT					"bind_material"
+#define COLLADA_EFFECT_ELEMENT							"effect"
+#define COLLADA_INITFROM_ELEMENT						"init_from"
+#define COLLADA_SAMPLER_ELEMENT							"sampler"
+#define COLLADA_SKELETON_ELEMENT						"skeleton"
+#define COLLADA_TARGETS_ELEMENT							"targets"
+#define COLLADA_TECHNIQUE_COMMON_ELEMENT				"technique_common"
+#define COLLADA_VSCENE_ELEMENT							"visual_scene"
+#define COLLADA_WEIGHTS_ELEMENT							"vertex_weights"
+#define COLLADA_VERTEXCOUNT_ELEMENT						"vcount"
+
+#define COLLADA_FX_PROFILE_COMMON_ELEMENT				"profile_COMMON"
+#define COLLADA_FX_PROFILE_CG_ELEMENT					"profile_CG"
+#define COLLADA_FX_PROFILE_HLSL_ELEMENT					"profile_HLSL"
+#define COLLADA_FX_PROFILE_GLSL_ELEMENT					"profile_GLSL"
+#define COLLADA_FX_PROFILE_GLES_ELEMENT					"profile_GLES"
+
+#define COLLADA_FXCMN_FLOAT_ELEMENT						"float"
+#define COLLADA_FXCMN_FLOAT4_ELEMENT					"float4"
+#define COLLADA_FXCMN_FLOAT4X4_ELEMENT					"float4x4"
+#define COLLADA_FXCMN_INCLUDE_ELEMENT					"include"
+#define COLLADA_FXCMN_SURFACE_ELEMENT					"surface"
+#define COLLADA_FXCMN_SAMPLER1D_ELEMENT					"sampler1D"
+#define COLLADA_FXCMN_SAMPLER2D_ELEMENT					"sampler2D"
+#define COLLADA_FXCMN_SAMPLER3D_ELEMENT					"sampler3D"
+#define COLLADA_FXCMN_SAMPLERCUBE_ELEMENT				"samplerCUBE"
+#define COLLADA_FXCMN_NEWPARAM_ELEMENT					"newparam"
+#define COLLADA_FXCMN_SETPARAM_ELEMENT					"setparam"
+#define COLLADA_FXCMN_STRING_ELEMENT					"string"
+
+#define COLLADA_TECHNIQUE_STANDARD_PARAMETER			"standard"
+
+#define COLLADA_FXSTD_CONSTANT_ELEMENT					"constant"
+#define COLLADA_FXSTD_LAMBERT_ELEMENT					"lambert"
+#define COLLADA_FXSTD_PHONG_ELEMENT						"phong"
+#define COLLADA_FXSTD_BLINN_ELEMENT						"blinn"
+#define COLLADA_FXSTD_COLOR_ELEMENT						"color"
+#define COLLADA_FXSTD_FLOAT_ELEMENT						"float"
+#define COLLADA_FXSTD_SAMPLER_ELEMENT					"texture"
+#define COLLADA_FXSTD_TEXTURE_ATTRIBUTE					"texture"
+#define COLLADA_FXSTD_TEXTURESET_ATTRIBUTE				"texcoord"
+
+#define COLLADA_CONTROLLER_SKIN_ELEMENT					"skin"
+#define COLLADA_CONTROLLER_MORPH_ELEMENT				"morph"
+
+#define COLLADA_CAMERA_PERSP_ELEMENT					"perspective"
+#define COLLADA_CAMERA_ORTHO_ELEMENT					"orthographic"
+
+#define COLLADA_ASPECT_CAMERA_PARAMETER					"aspect_ratio"
+#define COLLADA_XFOV_CAMERA_PARAMETER					"xfov"	
+#define COLLADA_YFOV_CAMERA_PARAMETER					"yfov"	
+#define COLLADA_ZNEAR_CAMERA_PARAMETER					"znear"	
+#define COLLADA_ZFAR_CAMERA_PARAMETER					"zfar"	
+#define COLLADA_XMAG_CAMERA_PARAMETER					"xmag"	
+#define COLLADA_YMAG_CAMERA_PARAMETER					"ymag"
+#define COLLADA_CAMERA_VERTICAL_APERTURE_PARAMETER      "vertical_aperture"
+#define COLLADA_CAMERA_HORIZONTAL_APERTURE_PARAMETER    "horizontal_aperture"
+#define COLLADA_CAMERA_LENS_SQUEEZE_PARAMETER           "lens_squeeze"
+
+#define COLLADA_AMBIENT_MATERIAL_PARAMETER				"ambient"
+#define COLLADA_BUMP_MATERIAL_PARAMETER					"bump"
+#define COLLADA_DIFFUSE_MATERIAL_PARAMETER				"diffuse"
+#define COLLADA_EMISSION_MATERIAL_PARAMETER				"emission"
+#define COLLADA_TRANSPARENCY_MATERIAL_PARAMETER			"transparency"
+#define COLLADA_TRANSPARENT_MATERIAL_PARAMETER			"transparent"
+#define COLLADA_REFLECTIVE_MATERIAL_PARAMETER			"reflective"
+#define COLLADA_REFLECTIVITY_MATERIAL_PARAMETER			"reflectivity"
+#define COLLADA_SHININESS_MATERIAL_PARAMETER			"shininess"
+#define COLLADA_SPECULAR_MATERIAL_PARAMETER				"specular"
+#define COLLADA_INDEXOFREFRACTION_MATERIAL_PARAMETER	"index_of_refraction"
+#define COLLADA_OPAQUE_MODE_ATTRIBUTE                   "opaque"
+#define COLLADA_OPAQUE_MODE_A_ONE                       "A_ONE"
+#define COLLADA_OPAQUE_MODE_RGB_ONE                     "RGB_ONE"
+#define COLLADA_OPAQUE_MODE_A_ZERO                      "A_ZERO"
+#define COLLADA_OPAQUE_MODE_RGB_ZERO                    "RGB_ZERO"
+
+#define COLLADA_LIGHT_AMBIENT_ELEMENT					"ambient"		
+#define COLLADA_LIGHT_POINT_ELEMENT						"point"
+#define COLLADA_LIGHT_DIRECTIONAL_ELEMENT				"directional"
+#define COLLADA_LIGHT_SPOT_ELEMENT						"spot"
+
+#define COLLADA_COLOR_LIGHT_PARAMETER					"color"
+#define COLLADA_CONST_ATTENUATION_LIGHT_PARAMETER		"constant_attenuation"
+#define COLLADA_LIN_ATTENUATION_LIGHT_PARAMETER			"linear_attenuation"
+#define COLLADA_QUAD_ATTENUATION_LIGHT_PARAMETER		"quadratic_attenuation"
+#define COLLADA_FALLOFFEXPONENT_LIGHT_PARAMETER			"falloff_exponent"
+#define COLLADA_FALLOFFANGLE_LIGHT_PARAMETER			"falloff_angle"
+
+#define COLLADA_BINDSHAPEMX_SKIN_PARAMETER				"bind_shape_matrix"
+
+#define COLLADA_CONTRIBUTOR_ASSET_ELEMENT				"contributor"
+#define COLLADA_AUTHOR_ASSET_PARAMETER					"author"
+#define COLLADA_AUTHORINGTOOL_ASSET_PARAMETER			"authoring_tool"
+#define COLLADA_CREATED_ASSET_PARAMETER					"created"
+#define COLLADA_MODIFIED_ASSET_PARAMETER				"modified"
+#define COLLADA_REVISION_ASSET_PARAMETER				"revision"
+#define COLLADA_SOURCEDATA_ASSET_PARAMETER				"source_data"
+#define COLLADA_UNITS_ASSET_PARAMETER					"unit"
+#define COLLADA_UPAXIS_ASSET_PARAMETER					"up_axis"
+
+#define COLLADA_SYMBOL_PROPERTY				"symbol"
+
+// From Collada 1.3
+#define COLLADA_DOCUMENT_STRUCTURE			"COLLADA"
+#define COLLADA_ASSET_STRUCTURE				"asset"
+#define COLLADA_REVISION_STRUCTURE			"revision"
+#define COLLADA_AUTHORING_TOOL_STRUCTURE	"authoring_tool"
+#define COLLADA_CREATED_STRUCTURE			"created"
+#define COLLADA_MODIFIED_STRUCTURE			"modified"
+#define COLLADA_AUTHOR_STRUCTURE			"author"
+#define COLLADA_TITLE_STRUCTURE				"title"
+#define COLLADA_SUBJECT_STRUCTURE			"subject"
+#define COLLADA_KEYWORDS_STRUCTURE			"keywords"
+#define COLLADA_COMMENTS_STRUCTURE			"comments"
+#define COLLADA_UNIT_STRUCTURE				"unit"
+#define COLLADA_SOURCE_DATA_STRUCTURE		"source_data"
+#define COLLADA_UP_AXIS_STRUCTURE			"up_axis"
+#define COLLADA_LIBRARY_STRUCTURE			"library"		// Deprecated 1.4
+#define COLLADA_SCENE_STRUCTURE				"scene"
+#define COLLADA_NODE_STRUCTURE				"node"
+#define COLLADA_MATRIX_STRUCTURE			"matrix"
+#define COLLADA_TRANSFORM_STRUCTURE         "transform"
+#define COLLADA_TRANSLATE_STRUCTURE			"translate"
+#define COLLADA_TRANSLATION_STRUCTURE       "translation"   // For ColladaMax
+#define COLLADA_TRANSLATE_ORIGIN			"origin"        //A fix for Poser(Bug 309548). Handle translate origin info exported from Poser.
+#define COLLADA_TRANSLATE_LOCATION			"location"      //A fix for ? (Bug BARB-154). "location" is synonyn of "translate" ?
+#define COLLADA_ROTATE_STRUCTURE			"rotate"
+#define COLLADA_SCALE_STRUCTURE				"scale"
+#define COLLADA_SKEW_STRUCTURE				"skew"
+#define COLLADA_ROTATE_X					"rotateX"
+#define COLLADA_ROTATE_Y					"rotateY"
+#define COLLADA_ROTATE_Z					"rotateZ"
+#define COLLADA_ROT_X                       "RotX"          // For ColladaMax
+#define COLLADA_ROT_Y                       "RotY"
+#define COLLADA_ROT_Z                       "RotZ"
+#define COLLADA_ROTATION_X                  "rotation_x"    // For XSI
+#define COLLADA_ROTATION_Y                  "rotation_y"
+#define COLLADA_ROTATION_Z                  "rotation_z"
+#define COLLADA_ROTATIONX                   "rotationX"     // BARB-154
+#define COLLADA_ROTATIONY                   "rotationY"
+#define COLLADA_ROTATIONZ                   "rotationZ"
+
+#define COLLADA_ROTATE_PIVOT				"rotatePivot"	// the next 6 subids are recognized by ColladaMaya
+#define COLLADA_SCALE_PIVOT					"scalePivot"
+#define COLLADA_ROTATE_PIVOT_INVERSE		"rotatePivotInverse"
+#define COLLADA_SCALE_PIVOT_INVERSE			"scalePivotInverse"
+#define COLLADA_ROTATE_PIVOT_OFFSET			"rotatePivotTranslation"
+#define COLLADA_SCALE_PIVOT_OFFSET			"scalePivotTranslation"
+#define COLLADA_PRE_ROTATION_X				"jointOrientX"	// these 3 subids recognized by ColladaMaya
+#define COLLADA_PRE_ROTATION_Y				"jointOrientY"
+#define COLLADA_PRE_ROTATION_Z				"jointOrientZ"
+#define COLLADA_POST_ROTATION_X				"post-rotationX"	// these 3 subids NOT recognized by ColladaMaya
+#define COLLADA_POST_ROTATION_Y				"post-rotationY"
+#define COLLADA_POST_ROTATION_Z				"post-rotationZ"
+#define COLLADA_ROTATE_AXIS_X               "rotateAxisX"       // these 3 subids recognized by ColladaMaya
+#define COLLADA_ROTATE_AXIS_Y               "rotateAxisY"
+#define COLLADA_ROTATE_AXIS_Z               "rotateAxisZ"
+#define COLLADA_LOOKAT_STRUCTURE			"lookat"
+#define COLLADA_PERSPECTIVE_STRUCTURE		"perspective"
+#define COLLADA_GEOMETRY_STRUCTURE			"geometry"
+#define COLLADA_MESH_STRUCTURE				"mesh"
+#define COLLADA_VERTICES_STRUCTURE			"vertices"
+#define COLLADA_POLYGONS_STRUCTURE			"polygons"
+#define COLLADA_POLYLIST_STRUCTURE			"polylist" 
+#define COLLADA_TRIANGLES_STRUCTURE			"triangles"
+#define COLLADA_P_STRUCTURE                 "p"
+#define COLLADA_ANIMATION_STRUCTURE			"animation"
+#define COLLADA_CONTROLLER_STRUCTURE		"controller"
+#define COLLADA_SKIN_STRUCTURE				"skin"
+#define COLLADA_COMBINER_STRUCTURE			"combiner"
+#define COLLADA_JOINTS_STRUCTURE			"joints"
+#define COLLADA_VALUE_STRUCTURE				"v"
+#define COLLADA_MATERIAL_STRUCTURE			"material"
+#define COLLADA_SHADER_STRUCTURE			"shader"
+#define COLLADA_PASS_STRUCTURE				"pass"
+#define COLLADA_PROGRAM_STRUCTURE			"program"
+#define COLLADA_TEXTURE_STRUCTURE			"texture"
+#define COLLADA_IMAGE_STRUCTURE				"image"
+#define COLLADA_INPUT_STRUCTURE				"input"
+#define COLLADA_TECHNIQUE_STRUCTURE			"technique"
+#define COLLADA_SOURCE_STRUCTURE			"source"
+#define COLLADA_ACCESSOR_STRUCTURE			"accessor"
+#define COLLADA_EXTRA_STRUCTURE				"extra"
+#define COLLADA_BOUNDINGBOX_STRUCTURE		"boundingbox"
+#define COLLADA_MIN_STRUCTURE				"min"
+#define COLLADA_MAX_STRUCTURE				"max"
+
+#define COLLADA_ARRAY_STRUCTURE				"array"
+#define COLLADA_FLOAT_ARRAY_STRUCTURE		"float_array"
+#define COLLADA_INT_ARRAY_STRUCTURE			"int_array"
+#define COLLADA_NAME_ARRAY_STRUCTURE		"Name_array"
+#define COLLADA_IDREF_ARRAY_STRUCTURE		"IDREF_array"
+#define COLLADA_BOOL_ARRAY_STRUCTURE		"bool_array"
+
+#define COLLADA_SAMPLER_STRUCTURE			"sampler"
+#define COLLADA_CHANNEL_STRUCTURE			"channel"
+#define COLLADA_CAMERA_STRUCTURE			"camera"
+#define COLLADA_LIGHT_STRUCTURE				"light"
+#define COLLADA_OPTICS_STRUCTURE			"optics"
+#define COLLADA_PROGRAM_STRUCTURE			"program"
+#define COLLADA_PARAMETER_STRUCTURE			"param"
+
+#define COLLADA_TYPE_PROPERTY				"type"
+#define COLLADA_ID_PROPERTY					"id"
+#define COLLADA_SUBID_PROPERTY				"sid"
+#define COLLADA_NAME_PROPERTY				"name"
+#define COLLADA_LAYER_PROPERTY              "layer"
+#define COLLADA_COUNT_PROPERTY				"count"
+#define COLLADA_STRIDE_PROPERTY				"stride"
+#define COLLADA_URL_PROPERTY				"url"
+#define COLLADA_SEMANTIC_PROPERTY			"semantic"
+#define COLLADA_SOURCE_PROPERTY				"source"
+#define COLLADA_TARGET_PROPERTY				"target"
+#define COLLADA_PROFILE_PROPERTY			"profile"
+#define COLLADA_MATERIAL_PROPERTY			"material"
+#define COLLADA_METER_PROPERTY				"meter"
+#define COLLADA_IDX_PROPERTY				"idx"
+#define COLLADA_SET_PROPERTY				"set"
+#define COLLADA_OFFSET_PROPERTY				"offset"
+#define COLLADA_FLOW_PROPERTY				"flow"
+#define COLLADA_FORMAT_PROPERTY				"format"
+#define COLLADA_HEIGHT_PROPERTY				"height"
+#define COLLADA_WIDTH_PROPERTY				"width"
+#define COLLADA_DEPTH_PROPERTY				"depth"
+#define COLLADA_REF_PROPERTY                "ref"
+
+#define COLLADA_GEOMETRY_LIBRARY_TYPE		"GEOMETRY"
+#define COLLADA_CONTROLLER_LIBRARY_TYPE		"CONTROLLER"
+#define COLLADA_ANIMATION_LIBRARY_TYPE		"ANIMATION"
+#define COLLADA_MATERIAL_LIBRARY_TYPE		"MATERIAL"
+#define COLLADA_TEXTURE_LIBRARY_TYPE		"TEXTURE"
+#define COLLADA_IMAGE_LIBRARY_TYPE			"IMAGE"
+#define COLLADA_LIGHT_LIBRARY_TYPE			"LIGHT"
+#define COLLADA_CAMERA_LIBRARY_TYPE			"CAMERA"
+
+#define COLLADA_LAMBERT_SHADER_TYPE			"LAMBERT"
+#define COLLADA_PHONG_SHADER_TYPE			"PHONG"
+#define COLLADA_CONSTANT_SHADER_TYPE		"CONSTANT"
+
+#define COLLADA_NAME_TYPE					"name"
+#define COLLADA_IDREF_TYPE					"IDREF"
+#define COLLADA_FLOAT_TYPE					"float"
+#define COLLADA_BOOL_TYPE					"bool"
+#define COLLADA_INT_TYPE					"int"
+#define COLLADA_FLOAT3_TYPE					"float3"
+#define COLLADA_FLOAT4_TYPE					"float4"
+#define COLLADA_FUNCTION_TYPE				"function"
+#define COLLADA_MATRIX_TYPE					"float4x4"
+#define COLLADA_STRING_TYPE                 "string"
+
+#define COLLADA_JOINT_NODE_TYPE				"JOINT"
+#define COLLADA_NODE_NODE_TYPE				"NODE"
+
+#define COLLADA_TEXTURE_SEMANTIC			"TEXTURE"
+#define COLLADA_IMAGE_SEMANTIC				"IMAGE"
+#define COLLADA_INPUT_SEMANTIC				"INPUT"
+#define COLLADA_OUTPUT_SEMANTIC				"OUTPUT"
+#define COLLADA_IN_TANGENT_SEMANTIC			"IN_TANGENT"
+#define COLLADA_OUT_TANGENT_SEMANTIC		"OUT_TANGENT"
+#define COLLADA_INTERPOLATION_SEMANTIC		"INTERPOLATION"
+#define COLLADA_JOINT_SEMANTIC				"JOINT"
+#define COLLADA_BIND_POSITION_SEMANTIC		"BIND_SHAPE_POSITION"
+#define COLLADA_BIND_NORMAL_SEMANTIC		"BIND_SHAPE_NORMAL"
+#define COLLADA_JOINT_AND_WEIGHT_SEMANTIC	"JOINTS_AND_WEIGHTS"
+#define COLLADA_BIND_MATRIX_SEMANTIC		"INV_BIND_MATRIX"
+#define COLLADA_JOINT_PARAMETER				"JOINT"
+#define COLLADA_WEIGHT_PARAMETER			"WEIGHT"
+#define COLLADA_MORPH_TARGET_SEMANTIC		"MORPH_TARGET"
+#define COLLADA_MORPH_WEIGHT_SEMANTIC		"MORPH_WEIGHT"
+
+#define COLLADA_GENERIC_TECHNIQUE			"COMMON"
+
+#define COLLADA_TIME_TARGET					"TIME"
+
+#define COLLADA_VERTEX_INPUT				"VERTEX"
+#define COLLADA_POSITION_INPUT				"POSITION"
+#define COLLADA_NORMAL_INPUT				"NORMAL"
+#define COLLADA_COLOR_INPUT					"COLOR"
+#define COLLADA_MAPPING_INPUT				"UV"
+#define COLLADA_TEXCOORD_INPUT				"TEXCOORD"
+#define COLLADA_TEXTANGENT_INPUT            "TEXTANGENT"
+#define COLLADA_TEXBINORMAL_INPUT           "TEXBINORMAL"
+
+#define COLLADA_LIGHT_INTENSITY_PARAMETER_14			"intensity"
+#define COLLADA_LIGHT_PENUMBRA_ANGLE_PARAMETER_14		"penumbra_angle"
+#define COLLADA_LIGHT_DROPOFF_PARAMETER					"dropoff"
+
+#define COLLADA_CAMERA_YFOV_PARAMETER			"YFOV"
+#define COLLADA_CAMERA_ZNEAR_PARAMETER			"ZNEAR"
+#define COLLADA_CAMERA_ZFAR_PARAMETER			"ZFAR"
+#define COLLADA_CAMERA_ORTHO_BOTTOM_PARAMETER	"BOTTOM"
+#define COLLADA_CAMERA_ORTHO_TOP_PARAMETER		"TOP"
+#define COLLADA_CAMERA_ORTHO_LEFT_PARAMETER		"LEFT"
+#define COLLADA_CAMERA_ORTHO_RIGHT_PARAMETER	"RIGHT"
+
+#define COLLADA_TEXTURE_WRAPU_PARAMETER					"wrapU"
+#define COLLADA_TEXTURE_WRAPV_PARAMETER					"wrapV"
+#define COLLADA_TEXTURE_MIRRORU_PARAMETER				"mirrorU"
+#define COLLADA_TEXTURE_MIRRORV_PARAMETER				"mirrorV"
+#define COLLADA_TEXTURE_BLEND_MODE_PARAMETER			"BLEND_MODE"
+#define COLLADA_TEXTURE_BLEND_MODE_PARAMETER_14			"blend_mode"
+#define COLLADA_TEXTURE_REPEATU_PARAMETER				"repeatU"
+#define COLLADA_TEXTURE_REPEATV_PARAMETER				"repeatV"
+
+#define COLLADA_CONSTANT_FUNCTION			"CONSTANT"
+#define COLLADA_LINEAR_FUNCTION				"LINEAR"
+#define COLLADA_QUADRATIC_FUNCTION			"QUADRATIC"
+
+#define COLLADA_INTERPOLATION_TYPE_LINEAR	"LINEAR"
+#define COLLADA_INTERPOLATION_TYPE_BEZIER	"BEZIER"
+#define COLLADA_INTERPOLATION_TYPE_CARDINAL	"CARDINAL"
+#define COLLADA_INTERPOLATION_TYPE_HERMITE	"HERMITE"
+#define COLLADA_INTERPOLATION_TYPE_BSPLINE	"BSPLINE"
+#define COLLADA_INTERPOLATION_TYPE_STEP		"STEP"
+
+#define COLLADA_X_UP						"X_UP"
+#define COLLADA_Y_UP						"Y_UP"
+#define COLLADA_Z_UP						"Z_UP"
+
+#define COLLADA_IN_FLOW						"IN"
+#define COLLADA_OUT_FLOW					"OUT"
+#define COLLADA_INOUT_FLOW					"INOUT"
+
+// Obsolete, but kept here for backward compatibility.
+#define COLLADA_RGB_TYPE					"ColorRGB"  // use float3 instead
+#define COLLADA_RGBA_TYPE					"ColorRGBA" // use float4 instead
+#define COLLADA_RGB_INPUT					"COLORRGB"	// beta MAX exporter has been known to generate them
+#define COLLADA_RGBA_INPUT					"COLORRGBA"	// beta MAX exporter has been known to generate them
+
+// Physics extension. Currently in prototype phase.
+#define COLLADA_PHYSICS_LIBRARY_TYPE		"PHYSICS"
+#define COLLADA_SHAPE_STRUCTURE				"shape"
+#define	COLLADA_RIGID_BODY_STRUCTURE		"rigidbody"
+#define COLLADA_DYNAMIC_STRUCTURE			"dynamic"
+#define COLLADA_MASS_STRUCTURE				"mass"
+#define COLLADA_PHYSICS_MATERIAL_STRUCTURE	"physics_material"
+#define COLLADA_STATIC_FRICTION_ATTRIBUTE	"STATIC_FRICTION"
+#define COLLADA_DYNAMIC_FRICTION_ATTRIBUTE	"DYNAMIC_FRICTION"
+#define COLLADA_ELASTICITY_ATTRIBUTE		"ELASTICITY"
+#define COLLADA_BOX_STRUCTURE				"box"
+#define COLLADA_SPHERE_STRUCTURE			"sphere"
+#define COLLADA_CAPSULE_STRUCTURE			"capsule"
+#define COLLADA_CYLINDER_STRUCTURE			"cylinder"
+#define COLLADA_ELLIPSOID_STRUCTURE			"ellipsoid"
+#define COLLADA_SIZE_STRUCTURE				"size"
+#define COLLADA_RADIUS_STRUCTURE			"radius"
+#define COLLADA_PHYSICS_ENVIRONMENT_STRUCTURE	"physics_environment"
+#define COLLADA_ENVIRONMENT_ID				"Environment"
+#define COLLADA_TIMESTEP_ATTRIBUTE			"TIMESTEP"
+#define COLLADA_GRAVITY_ATTRIBUTE			"gravity"
+#define COLLADA_INITIAL_VELOCITY_STRUCTURE	"initial_velocity"
+#define COLLADA_INITIAL_ANGULAR_VELOCITY_STRUCTURE	"initial_angular_velocity"
+#define COLLADA_CONVEX_MESH_STRUCTURE		"convex_mesh"
+#define COLLADA_INERTIA_STRUCTURE			"inertia"
+#define COLLADA_DENSITY_STRUCTURE			"density"
+#define COLLADA_CENTER_OF_MASS_STRUCTURE	"center_of_mass"
+#define COLLADA_DYNAMICS_STRUCTURE			"dynamics"
+#define COLLADA_RIGID_CONSTRAINT_STRUCTURE	"rigid_constraint"
+#define COLLADA_BODY_PROPERTY				"body"
+#define COLLADA_ATTACHMENT_STRUCTURE		"attachment"
+#define COLLADA_ROT_LIMIT_MIN_STRUCTURE		"rot_limit_min"
+#define COLLADA_ROT_LIMIT_MAX_STRUCTURE		"rot_limit_max"
+#define COLLADA_TRANS_LIMIT_MIN_STRUCTURE	"trans_limit_min"
+#define COLLADA_TRANS_LIMIT_MAX_STRUCTURE	"trans_limit_max"
+#define COLLADA_ENABLED_STRUCTURE			"enabled"
+#define COLLADA_INTERPENETRATE_STRUCTURE	"interpenetrate"
+#define COLLADA_SPRING_STRUCTURE			"spring"
+#define COLLADA_STIFFNESS_STRUCTURE			"stiffness"
+#define COLLADA_DAMPING_STRUCTURE			"damping"
+#define COLLADA_REST_LENGTH_STRUCTURE		"rest_length"
+#define COLLADA_P0_STRUCTURE				"p0"
+#define COLLADA_P1_STRUCTURE				"p1"
+#define COLLADA_TRUE_KEYWORD				"TRUE"
+#define COLLADA_FALSE_KEYWORD				"FALSE"
+
+#define COLLADA_LINES_STRUCTURE				"lines"
+#define COLLADA_LINESTRIP_STRUCTURE			"linestrips"
+#define COLLADA_TRIFANS_STRUCTURE			"trifans"
+#define COLLADA_TRISTRIPS_STRUCTURE			"tristrips"
+
+// Extensions
+
+// Feeling Software ColladaMaya extensions
+#define COLLADA_MAYA_PROFILE                "MAYA"
+
+#define COLLADA_MAYA_LAYER_ELEMENT          "layer"
+
+// Feeling Software ColladaMax extensions
+#define COLLADA_MAX3D_PROFILE               "MAX3D"
+
+#define COLLADA_MAX3D_FRAMERATE_ELEMENT     "frame_rate"
+
+// Feeling Software FCollada extensions
+#define COLLADA_FCOLLADA_PROFILE            "FCOLLADA"
+
+#define COLLADA_FCOLLADA_STARTTIME_ELEMENT  "start_time"
+#define COLLADA_FCOLLADA_ENDTIME_ELEMENT    "end_time"
+#define COLLADA_FCOLLADA_VISIBILITY_ELEMENT "visibility"
+
+// XSI COLLADA extensions
+#define COLLADA_XSI_PROFILE                 "XSI"
+
+#define COLLADA_XSI_VISIBILITY_ELEMENT      "SI_Visibility"
+
+// FBX COLLADA extensions
+#define COLLADA_FBX_PROFILE                 "FBX"
+
+#define COLLADA_FBX_TARGET_ELEMENT          "target"
+
+// NVidia FXComposer extension -----------------------------------------------//
+
+#define COLLADA_NVIDIA_FXCOMPOSER_PROFILE           "NVIDIA_FXCOMPOSER"
+
+#define COLLADA_NVIDIA_FXCOMPOSER_IMPORT_ELEMENT    "import"
+#define COLLADA_NVIDIA_FXCOMPOSER_URL_ATTRIBUTE     "url"
+#define COLLADA_NVIDIA_FXCOMPOSER_COMPILER_OPTIONS_ATTRIBUTE  "compiler_options"
+#define COLLADA_NVIDIA_FXCOMPOSER_PROFILE_ATTRIBUTE "profile"
+
+#endif /* _FBXSDK_FILEIO_COLLADA_TOKENS_H_ */

+ 394 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxcolladautils.h

@@ -0,0 +1,394 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2017 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxcolladautils.h
+#ifndef _FBXSDK_FILEIO_COLLADA_UTILS_H_
+#define _FBXSDK_FILEIO_COLLADA_UTILS_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fileio/collada/fbxcolladatokens.h>
+#include <fbxsdk/fileio/collada/fbxcolladaiostream.h>
+#include <fbxsdk/scene/fbxscene.h>
+#include <fbxsdk/utils/fbxrenamingstrategybase.h>
+#include <fbxsdk/utils/fbxnamehandler.h>
+
+#include <libxml/globals.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FBXSDK_DLL FbxRenamingStrategyCollada : public FbxRenamingStrategyBase
+{
+public:
+	FbxRenamingStrategyCollada();
+	virtual ~FbxRenamingStrategyCollada();
+
+	virtual void CleanUp();
+	virtual bool DecodeScene(FbxScene* pScene);
+	virtual bool EncodeScene(FbxScene* pScene);
+	virtual bool DecodeString(FbxNameHandler& pName);
+	virtual bool EncodeString(FbxNameHandler& pName, bool pIsPropertyName = false);
+};
+
+
+#ifndef INT_MAX
+	#define INT_MAX 0x7FFFFFFF
+#endif
+
+#ifndef CENTIMETERS_TO_INCHES
+	#define CENTIMETERS_TO_INCHES 2.54f
+#endif
+
+#ifndef RADIANS_TO_DEGREES
+	#define RADIANS_TO_DEGREES 57.295799f
+#endif
+
+enum DAE_Flow { kCOLLADAFlowIn, kCOLLADAFlowOut, kCOLLADAFlowInOut };
+
+const int MATRIX_STRIDE = 16;
+const int VECTOR_STRIDE = 3;
+
+#define COLLADA_ID_PROPERTY_NAME "COLLADA_ID"
+
+class XmlNodeDeletionPolicy
+{
+public:
+    static inline void DeleteIt(xmlNode ** ptr)
+    {
+        if (*ptr != NULL)
+        {
+            xmlFreeNode(*ptr);
+            *ptr = NULL;
+        }
+    }
+};
+
+typedef FbxAutoPtr<xmlNode, XmlNodeDeletionPolicy> XmlNodePtr;
+typedef FbxMap< FbxString, xmlNode* > SourceElementMapType;
+typedef FbxMap< FbxString, xmlNode* > SkinMapType;
+
+// Some information connecting COLLADA layer string, such as "NORMAL" or "UV", to FBX layer element type.
+struct ColladaLayerTraits
+{
+    ColladaLayerTraits() 
+		: mLayerType(FbxLayerElement::eUnknown), mLayerElementLength(0) {}
+		
+    ColladaLayerTraits(FbxLayerElement::EType pType, int pLength)
+        : mLayerType(pType), mLayerElementLength(pLength) {}
+
+    // Type of FBX element layer
+    FbxLayerElement::EType mLayerType;
+    // Count of double of each element in FBX element layer
+    int mLayerElementLength;
+
+    /** Construct traits according to COLLADA layer string.
+      * \param pLabel COLLADA layer string.
+      * \return Return created traits.
+      */
+    static const ColladaLayerTraits GetLayerTraits(const FbxString & pLabel);
+};
+
+/** Emit error message.
+  * \param pSdkManger The SDK manager used to access user notification object.
+  * \param pErrorMessage The message to be presented.
+  */
+void DAE_AddNotificationError(const FbxManager * pSdkManger, const FbxString & pErrorMessage);
+
+/** Emit warning message.
+  * \param pSdkManger The SDK manager used to access user notification object.
+  * \param pWarningMessage The message to be presented.
+  */
+void DAE_AddNotificationWarning(const FbxManager * pSdkManger, const FbxString & pWarningMessage);
+
+void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxArray<FbxVector4>& arr);
+void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxArray<FbxVector2>& arr);
+void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxArray<FbxColor>& arr);
+void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxArray<double>& arr);
+void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxStringList& arr);
+
+// Syntax modification - for COLLADA 1.4
+xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxStringList& accessorParams, FbxArray<double>& arr, bool isCommonProfile=true); 
+xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxVector4>& arr);
+xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxVector2>& arr);
+xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxColor>& arr);
+xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxAMatrix>& arr); 
+xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxMatrix>& arr);
+xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxStringList& arr, const char* type, bool isCommonProfile=true);
+
+
+void DAE_ExportSourceArray(xmlNode* sourceNode, const char* id, FbxArray<FbxColor>& arr);
+void DAE_ExportSourceArray14(xmlNode* sourceNode, const char* id, FbxArray<FbxColor>& arr);
+
+xmlNode* DAE_ExportAccessor(xmlNode* parentXmlNode, const char* id, const char* arrayRef, int count, int stride, const char* name, const char* type);
+xmlNode* DAE_ExportAccessor14(xmlNode* parentXmlNode, const char* id, const char* arrayRef, int count, int stride, const char* name, const char* type);
+
+void DAE_AddXYZAccessor(xmlNode* parentXmlNode, const char* profile, const char* arrayName, const char* arrayRef, int count);
+void DAE_AddSTAccessor(xmlNode* parentXmlNode, const char* profile, const char* arrayName, const char* arrayRef, int count);
+void DAE_AddFlow(xmlNode* node, DAE_Flow flow);
+void DAE_AddXYZAccessor14(xmlNode* parentXmlNode, const char* profile, const char* arrayName, const char* arrayRef, int count);
+void DAE_AddSTAccessor14(xmlNode* parentXmlNode, const char* profile, const char* arrayName, const char* arrayRef, int count);
+
+// AddParameter functions for COLLADA 1.3.
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxColor& color, DAE_Flow flow);
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxVector4& vector, DAE_Flow flow);
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, double value, DAE_Flow flow);
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, bool value, DAE_Flow flow);
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const char* type, const char* value, DAE_Flow flow);
+
+// Overload functions without DAE_Flow, for COLLADA 1.4.
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxDouble3& color);
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxColor& color);
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxVector4& vector);
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, double value);
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, bool value);
+xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const char* type, const char* value);
+xmlNode* DAE_AddTechnique(xmlNode* parentXmlNode, const char* technique);
+void DAE_AddInput(xmlNode* parentXmlNode, const char* semantic, const char* source, int idx = -1);
+void DAE_AddInput14(xmlNode* parentXmlNode, const char* semantic, const char* source, int offset = -1, int set=-1);
+
+FbxString matrixToString(const FbxAMatrix& mx);
+
+typedef FbxArray<xmlNode*> CNodeList;
+
+/** Find children elements whose type is included in a list of type.
+  * \param pParentElement The parent element.
+  * \param pTypes The list of types.
+  * \param pChildrenElements The found children elements.
+  */
+void findChildrenByType(xmlNode* pParentElement, const FbxSet<FbxString>& pTypes, CNodeList& pChildrenElements);
+
+/** Find children elements of a specific type.
+  * \param pParentElement The parent element.
+  * \param pType The type.
+  * \param pChildrenElements The found children elements.
+  */
+void findChildrenByType(xmlNode* pParentElement, const char * pType, CNodeList& pChildrenElements);
+
+xmlNode* getSourceAccessor(xmlNode* sourceNode);
+xmlNode* getTechniqueNode(xmlNode* parent, const char * profile);
+
+// Conversions
+inline double inchesToCentimeters(double val) { return FbxFloor(val / CENTIMETERS_TO_INCHES * 100000) / 100000; }
+inline double centimetersToInches(double val) { return FbxFloor(val * CENTIMETERS_TO_INCHES * 100000) / 100000; }
+
+inline double degreesToRadians(double val) { return FbxFloor(val / RADIANS_TO_DEGREES * 100000) / 100000; }
+inline double radiansToDegrees(double val) { return FbxFloor(val * RADIANS_TO_DEGREES * 100000) / 100000; }
+
+/** Find a child element with a given attribute value.
+  * \param pParentElement The parent element.
+  * \param pAttributeName The name of the attribute.
+  * \param pAttributeValue The value of the attribute.
+  * \param pDefaultAttributeValue The default value of the attribute used when the attribute is not found explicitly.
+  * \return Return NULL if no child element has the given attribute value.
+  */
+xmlNode* DAE_FindChildElementByAttribute(xmlNode* pParentElement, const char * pAttributeName,
+                                        const char * pAttributeValue, const char * pDefaultAttributeValue = "");
+
+/** Find a child element with a given tag.
+  * \param pParentElement The parent element.
+  * \param pTag The value of the tag.
+  * \param pFindFrom Find from the next child after pFindFrom if pFindFrom is not NULL.
+  * \return Return NULL if no child element has the given tag.
+  */
+xmlNode* DAE_FindChildElementByTag(xmlNode* pParentElement, const char * pTag, xmlNode* pFindFrom = NULL);
+
+/** Get the content of a XML element.
+  * \param pElement The element whose content is returned.
+  * \param pData The returned data.
+  */
+template <typename TYPE>
+void DAE_GetElementContent(xmlNode * pElement, TYPE & pData)
+{
+    if (pElement != NULL)
+    {
+        xmlChar* lContent = xmlNodeGetContent(pElement);
+		if (lContent)
+		{
+			FromString(&pData, (const char *)lContent);
+			xmlFree(lContent);
+		}
+    }
+}
+
+/** Check whether this node is compatible to FBX transform structure.
+  * \param pNodeElement The specific node element.
+  * \return Return true if it is compatible.
+  */
+bool DAE_CheckCompatibility(xmlNode * pNodeElement);
+
+/** Get the tag of the specific element.
+  * \param pElement The specific element.
+  * \param pTag Return the tag of the element.
+  */
+void DAE_GetElementTag(xmlNode * pElement, FbxString & pTag);
+
+/** Get the value of an attribute of an element.
+  * \param pElement The specific XML element.
+  * \param pAttributeName The name of the specific attribute.
+  * \return The value of the attribute in the form of a string. If the attribute is not available, an empty string is returned.
+  */
+const FbxString DAE_GetElementAttributeValue(xmlNode * pElement, const char * pAttributeName);
+
+/** Get the value of an attribute of an element.
+  * \param pElement The specific XML element.
+  * \param pAttributeName The name of the specific attribute.
+  * \param pData The returned data.
+  * \return Return \c true on success and \c false if no attribute has the given name.
+  */
+template <typename TYPE>
+bool DAE_GetElementAttributeValue(xmlNode * pElement, const char * pAttributeName, TYPE & pData)
+{
+    if (!pElement || !pAttributeName)
+        return false;
+
+    xmlChar* lPropertyValue = xmlGetProp(pElement, (const xmlChar *)pAttributeName);
+    if (lPropertyValue)
+    {
+        FromString(&pData, (const char *)lPropertyValue);
+		xmlFree(lPropertyValue);
+        return true;
+    }
+    return false;
+}
+
+// Special instantiation for string;
+// Omit the whitespaces, just return the whole string
+template <>
+inline bool DAE_GetElementAttributeValue(xmlNode * pElement,
+                                         const char * pAttributeName,
+                                         FbxString & pData)
+{
+    if (!pElement || !pAttributeName)
+        return false;
+
+    xmlChar* lPropertyValue =xmlGetProp(pElement, (const xmlChar *)pAttributeName);
+    if (lPropertyValue)
+    {
+        pData = (const char *)lPropertyValue;
+		xmlFree(lPropertyValue);
+        return true;
+    }
+    return false;
+}
+
+/** Compare the value of specific attribute of specific element with given value.
+  * \param pElement The specific element.
+  * \param pAttributeName The name of the specific attribute.
+  * \param pValue The value to compare with.
+  * \return Return true if values equal.
+  */
+bool DAE_CompareAttributeValue(xmlNode * pElement,
+                                      const char * pAttributeName,
+                                      const char * pValue);
+
+/** Get the ID of another element from the url attribute of the given element.
+  * \param pElement The specific XML element in which the ID is looked for.
+  * \param pExternalRef The external reference part of the url (before the #)
+  * \return The ID of another element if success, or an empty string if no url attributes are found.
+  */
+const FbxString DAE_GetIDFromUrlAttribute(xmlNode * pElement, FbxString& pExternalRef);
+
+/** Get the ID of another element from the source attribute of the given element.
+  * \param pElement The specific XML element in which the ID is looked for.
+  * \return The ID of another element if success, or an empty string if no source attributes are found.
+  */
+const FbxString DAE_GetIDFromSourceAttribute(xmlNode * pElement);
+
+/** Get the ID of another element from the target attribute of the given element.
+  * Note that in target attribute, the URI identifier may or may not preceded with the pound sign.
+  * \param pElement The specific XML element in which the ID is looked for.
+  * \return The ID of another element if success, or an empty string if no target attributes are found.
+  */
+const FbxString DAE_GetIDFromTargetAttribute(xmlNode * pElement);
+
+/** Set the name of the object with a given name. If the name is empty, use the ID.
+  * \param pObject The object whose name is to be set.
+  * \param pName The name string.
+  * \param pID The ID string.
+  */
+void DAE_SetName(FbxObject * pObject, const FbxString & pName, const FbxString & pID);
+
+/** Get the COLLADA source element with a semantic meaning and a consumer element;
+  * The COLLADA input element declares the input connections to a data source that a consumer requires.
+  * A data source is a container of raw data that lacks semantic meaning so that the data can be reused within the
+  * document. To use the data, a consumer declares a connection to it with the desired semantic information.
+  * \param pConsumerElement A consumer element, like sampler element in animation system or joints element in controller system.
+  * \param pSemantic A semantic meaning, like "INPUT", "OUTPUT" or "INTERPOLATION" in animation system.
+  * \param pSourceElements The container of raw data.
+  * \return Return \c NULL is failed.
+  */
+xmlNode * DAE_GetSourceWithSemantic(xmlNode * pConsumerElement, const char * pSemantic,
+                                    const SourceElementMapType & pSourceElements);
+
+/** Add a child element with specific content.
+  * \param pParentElement The parent element.
+  * \param pTag The tag string of the new child element.
+  * \param pContent The content of the child element.
+  * \return The created child element.
+  */
+template <typename T>
+xmlNode * DAE_AddChildElement(xmlNode * pParentElement, const char * pTag,
+                              const T & pContent)
+{
+    const FbxString lRepr = ToString(pContent);
+    return xmlNewChild(pParentElement, NULL, (xmlChar *)pTag,
+        (xmlChar *)lRepr.Buffer());
+}
+
+// Create a child element with empty content.
+inline xmlNode * DAE_AddChildElement(xmlNode * pParentElement, const char * pTag)
+{
+    return DAE_AddChildElement(pParentElement, pTag, FbxString());
+}
+
+// Create a new element with empty content.
+inline xmlNode * DAE_NewElement(const char * pTag)
+{
+    return xmlNewNode(NULL, reinterpret_cast<xmlChar*>(const_cast<char *>(pTag)));
+}
+
+/** Add an attribute for a element.
+  * \param pElement The element where the attribute is added.
+  * \param pAttributeName The name of the attribute.
+  * \param pAttributeValue The value of the attribute.
+  * \return The created attribute.
+  */
+template <typename T>
+xmlAttr * DAE_AddAttribute(xmlNode * pElement, const FbxString & pAttributeName,
+                           const T & pAttributeValue)
+{
+    const FbxString lRepr = ToString(pAttributeValue);
+    return xmlNewProp(pElement, (xmlChar *)pAttributeName.Buffer(),
+        (xmlChar *)lRepr.Buffer());
+}
+
+/** Import a COLLADA unit element into a FBX system unit.
+  * \param pUnitElement The COLLADA unit element.
+  * \return The created FBX system unit.
+  */
+const FbxSystemUnit DAE_ImportUnit(xmlNode * pUnitElement);
+
+/** If the specific node has animation on its local translation, increase every key by the offset.
+  * \param pNode The specific node.
+  * \param pOffset The specific offset value.
+  */
+void IncreaseLclTranslationAnimation(FbxNode * pNode, FbxDouble3 & pOffset);
+
+/** Search the elements with given tag, push the found results to the end of the given array.
+  * \param pBaseElement Search from this element.
+  * \param pTag The given tag.
+  * \param pResult The array to return the found results.
+  */
+void RecursiveSearchElement(xmlNode * pBaseElement, const char * pTag, FbxArray<xmlNode*> & pResult);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_COLLADA_UTILS_H_ */

+ 557 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxreadercollada14.h

@@ -0,0 +1,557 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxreadercollada14.h
+#ifndef _FBXSDK_FILEIO_COLLADA_READER_H_
+#define _FBXSDK_FILEIO_COLLADA_READER_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fileio/collada/fbxcolladautils.h>
+#include <fbxsdk/fileio/collada/fbxcolladanamespace.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+
+/** Class to read a Collada file and import it to a FBX scene.
+  *
+  * Some terms about COLLADA (from the spec of the COLLADA).
+  * 
+  * Element: An XML document consists primarily of elements. An element is a block of information that is
+  * bounded by tags at the beginning and end of the block. Elements can be nested, producing a hierarchical
+  * data set.
+  * 
+  * Tag: Each XML element begins with a start tag and ends with an end tag.
+  * 
+  * Attribute: An XML element can have zero or more attributes. Attributes are given within the start tag and 
+  * follow the tag name. Each attribute is a name-value pair. The value portion of an attribute is always 
+  * surrounded by quotation marks (" "). Attributes provide semantic information about the element on which 
+  * they are bound.
+  * For example:
+  * \code
+  * <tagName attribute="value">
+  * \endcode
+  * 
+  * URI Addressing: Refers to the id attribute of an element. Used in url, source or target attributes.
+  * In a url, source or target attribute, the URI fragment identifier is preceded with the pound sign ("#").
+  * 
+  * Markup and Content: The characters which make up an XML document are divided into markup and content.
+  * Markup and content may be distinguished by the application of simple syntactic rules.
+  * All strings which constitute markup either begin with the character "<" and end with a ">",
+  * or begin with the character "&" and end with a ";".
+  * Strings of characters which are not markup are content.
+  * \nosubgrouping
+  */
+class FbxReaderCollada : public FbxReader 
+{
+public:
+    /**
+    * \name Constructors and Destructor
+    */
+    //@{
+
+    /** Constructor.
+    * \param pManager FBX SDK object Manager.
+    * \param pID      Internal ID.
+    * \param pStatus  The FbxStatus object to hold error codes.
+    */
+    FbxReaderCollada(FbxManager& pManager, int pID, FbxStatus& pStatus); 
+	
+    //! Destructor.
+    virtual ~FbxReaderCollada();
+    
+    //@}
+
+    /**
+    * \name File Management
+    */
+    //@{
+    
+    /** Open file with the given name.
+    * \param pFileName the name of file.
+    * \return Return true if the specified file is opened.
+    */
+    virtual bool FileOpen(char* pFileName);
+    
+    /** Close file.
+    * \return Return true if file is closed successfully, false otherwise.
+    */
+	virtual bool FileClose();
+
+    /** Check if current file is open.
+    * \return Return true if file is open, false otherwise.
+    */
+	virtual bool IsFileOpen();
+    
+    //@}
+
+    /**
+    * \name Read Functions
+    */
+    //@{
+
+    /** Get Collada import options settings.
+    * \param pParseFileAsNeeded whether parse file as needed, the default value is true.
+    * \return true
+    */
+	virtual bool GetReadOptions(bool pParseFileAsNeeded = true){ return true; }
+
+    /** Get axis system information from file
+      * \param pAxisSystem      axis system in file
+      * \param pSystemUnits     system unit in file
+      * \return if either pAxisSystem or pSystemUnits is \c NULL return \c false, otherwise return \c true.
+      */
+    virtual bool GetAxisInfo(FbxAxisSystem* pAxisSystem, FbxSystemUnit* pSystemUnits);
+
+    /** Returns the list of take infos from the file.
+      * \return NULL
+      */
+    virtual FbxArray<FbxTakeInfo*>* GetTakeInfo();
+
+    /** Read from Collada file and import it to the FBX document, according to the given options settings.
+    * \param pDocument FBX Document to import.
+    * \return true on success, false otherwise.
+    */
+	virtual bool Read(FbxDocument* pDocument);
+
+    //@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+    /**
+    * \name Import Functions
+    */
+    //@{
+
+    /** Import Collada XML nodes tree to FBX scene.
+    * \param pScene The FBX scene object.
+    * \param pXmlNode The XML Node to import, it should be the root of Collada nodes tree.
+    * \return true on success, false otherwise.
+    */
+	bool ReadCollada(FbxScene &pScene, xmlNode* pXmlNode);
+
+    /** Import a Collada visual_scene element to the given FBX scene.
+      * \param pXmlNode The COLLADA visual_scene element.
+      * \param pScene The FBX scene to contain the imported data.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportVisualScene(xmlNode* pXmlNode, FbxScene * pScene);
+
+    /** Import a Collada visual_scene MAX3D extension to the given FBX scene.
+      * \param pXmlNode The COLLADA technique element with profile MAX3D.
+      * \param pScene The FBX scene to contain the imported data.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportVisualSceneMax3DExtension(xmlNode * pTechniqueElement, FbxScene * pScene);
+
+    /** Import a Collada visual_scene FCOLLADA extension to the given FBX scene.
+      * \param pXmlNode The COLLADA technique element with profile FCOLLADA.
+      * \param pScene The FBX scene to contain the imported data.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportVisualSceneFCOLLADAExtension(xmlNode * pTechniqueElement, FbxScene * pScene);
+
+    /** Import a Collada visual_scene MAYA extension to the given FBX scene.
+      * \param pXmlNode The COLLADA technique element with profile MAYA.
+      * \param pScene The FBX scene to contain the imported data.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportVisualSceneMayaExtension(xmlNode * pTechniqueElement, FbxScene * pScene);
+
+    /** Import Collada asset element.
+    * \param pXmlNode The XML Node, asset is read from pXmlNode and its children.
+    * \param pGlobalSettings The FBX global settings.
+    * \param pSceneInfo The FBX scene information object.
+    * \return Return true if asset is imported successfully.
+    * \remarks Imported asset has following contents:
+    * Axis System, system Unit, author, comments, title, subject, keywords, revision, etc.
+    */
+    bool ImportAsset(xmlNode* pXmlNode, FbxGlobalSettings & pGlobalSettings, FbxDocumentInfo &pSceneInfo);
+
+    /** Import a COLLADA node element.
+      * If the COLLADA node element contains only one node attribute (node attribute means instance_geometry,
+      * instance_camera, instance_light and instance_controller), node attribute will be attached directly under the node;
+      * If not, one child node will be created for each node attribute except the first one.
+      * \param pXmlNode The COLLADA node element.
+      * \return The created node and return \c NULL if failed.
+      */
+    FbxNode * ImportNode(xmlNode* pXmlNode);
+
+    /** Import a COLLADA node FCOLLADA extension to the given FBX node.
+      * \param pXmlNode The COLLADA technique element with profile FCOLLADA.
+      * \param pNode The FBX node to contain the imported data.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportNodeFCOLLADAExtension(xmlNode* pTechniqueElement, FbxNode * pNode);
+
+    /** Import a COLLADA node XSI extension to the given FBX node.
+      * \param pXmlNode The COLLADA technique element with profile XSI.
+      * \param pNode The FBX node to contain the imported data.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportNodeXSIExtension(xmlNode* pTechniqueElement, FbxNode * pNode);
+
+    /** Import a COLLADA node FBX extension to the given FBX node.
+      * \param pXmlNode The COLLADA technique element with profile FBX.
+      * \param pNode The FBX node to contain the imported data.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportNodeFBXExtension(xmlNode* pTechniqueElement, FbxNode * pNode);
+
+    /** Import a COLLADA geometry element.
+      * \param pGeometryID The COLLADA geometry ID.
+      * \param pMaterialSequence A ordered sequence of material symbols connecting to the geometry.
+      * \return The created geometry object and return \c NULL if failed.
+      * \remarks Except mesh, other types of geometry are not supported now.
+      */
+    FbxGeometry * ImportGeometry(const FbxString & pGeometryID, const FbxDynamicArray<FbxString> & pMaterialSequence);
+
+    /** Import a COLLADA skin element.
+      * \param pSkinElement The COLLADA skin element.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportSkin(xmlNode* pSkinElement);
+
+    /** Import a COLLADA morph element or morphs recursively.
+      * \param pXmlNode The COLLADA morph element.
+      * \param pMaterialSequence A ordered sequence of material symbols connecting to the target geometry.
+      * \return Return the pointer to the target geometry.
+      */
+    FbxGeometry * ImportMorph(xmlNode * pMorphElement, const FbxDynamicArray<FbxString> & pMaterialSequence);
+
+    /** Import a COLLADA controller element.
+      * \param pXmlNode The COLLADA controller ID.
+      * \param pMaterialSequence A ordered sequence of material symbols connecting to the target geometry.
+      * \return Return the pointer to the target geometry.
+      */
+    FbxGeometry * ImportController(const FbxString & pControllerID, const FbxDynamicArray<FbxString> & pMaterialSequence);
+
+    /** Import a COLLADA camera element.
+      * \param pXmlNode The COLLADA camera element.
+      * \return The created camera object and return \c NULL if failed.
+      * \remarks Camera parameters will also be imported, such as FOV, aspect ratio, etc.
+      */
+    FbxCamera * ImportCamera(xmlNode* pXmlNode);
+
+    /** Import a COLLADA light element.
+      * \param pXmlNode The COLLADA light element.
+      * \return The created light object and return \c NULL if failed.
+      * Following types of light are supported now: ambient light, directional light, point light, and spot light.
+      */
+    FbxLight * ImportLight(xmlNode* pXmlNode);
+
+    /** Import a COLLADA material element.
+      * \param pXmlNode The COLLADA material element.
+      * \return The created material object and return \c NULL if failed.
+      */
+    FbxSurfaceMaterial * ImportMaterial(xmlNode* pXmlNode);
+
+    /** Import a COLLADA effect element.
+      * \param pEffectElement The COLLADA effect element.
+      * \return The created material object and return \c NULL if failed.
+      */
+    FbxSurfaceMaterial * ImportEffect(xmlNode* pEffectElement);
+
+    /** Import a COLLADA effect NVIDIA_FXCOMPOSER extension.
+      * \param pXmlNode The COLLADA technique element with profile
+      * NVIDIA_FXCOMPOSER.
+      * \return The created material object and return \c NULL if failed.
+      */
+    FbxSurfaceMaterial * ImportEffectNVidiaExtension(xmlNode * pEffectElement);
+
+    /** Import a COLLADA texture element.
+      * \param pXmlNode The COLLADA texture element.
+      * \return The created texture object and return \c NULL if failed.
+      * \remarks Following types of texture are supported now: ambient, diffuse, emission, reflective, specular, transparent.
+      */
+    FbxFileTexture * ImportTexture(xmlNode* pXmlNode);
+
+    /** Import a COLLADA image element.
+      * \param pXmlNode The COLLADA image element.
+      * \return The created texture object and return \c NULL if failed.
+      */
+    FbxFileTexture * ImportImage(xmlNode* pXmlNode);
+
+    /** Import a COLLADA mesh element.
+      * If this mesh element contains polygons, polygon list or triangles elements, a FBX mesh will be created.
+      * If it contains lines or line strips elements, a FBX line will be created.
+      * \param pXmlNode The COLLADA mesh element.
+      * \param pMaterialSequence A ordered sequence of material symbols connecting to the geometry.
+	  * \param pObjects List of all the created objects. If this mesh contains lines or line strips as well as
+	  *                 the polymesh, the array will be filled with: [mesh, line, line strip]
+      * \return The created geometry object and return \c NULL if failed.
+      */
+    FbxGeometry * ImportMesh(xmlNode* pXmlNode, const FbxDynamicArray<FbxString> & pMaterialSequence, FbxArray<FbxObject*>& pObjects);
+
+    /** Import a COLLADA vertices element.
+      * \param pVerticesElement The COLLADA vertices element.
+      * \param pGeometry The FBX geometry object to store the vertices.
+      * \return true on success, false otherwise.
+      * \remarks Besides vertex, the vertex colors and normals are also imported.
+      */
+    bool ImportVertices(xmlNode* pVerticesElement, FbxGeometry * pGeometry);
+
+    /** Import polygons of Collada mesh node to FBX mesh node.
+    * \param pXmlNode Pointer to XML mesh Node.
+    * \param pMesh The FBX mesh object.
+    * \param pMaterialSequence A ordered sequence of material symbols connecting to the mesh.
+    * \return true on success, false otherwise.
+    * \remarks Vertex colors, normals, UVs, textures and materials which related to polygons, are also imported.
+    */
+	bool ImportPolygons(xmlNode* pXmlNode, FbxMesh& pMesh, const FbxDynamicArray<FbxString> & pMaterialSequence);
+
+    /** Import the transformation of Collada node to FBX node.
+    * \param pXmlNode Pointer to XML Node.
+    * \param pNode The FBX node.
+    * \return true on success, false otherwise.
+    * \remarks Transformation will cover matrix, translation, rotation, scale, skew, perspective, etc.
+    */
+	bool ImportTransforms(xmlNode* pXmlNode, FbxNode* pNode);
+
+    /** Import a COLLADA rotation element.
+      * \param pXmlNode The COLLADA rotation element.
+      * \param pRotationVector Vector4 value to return the rotation vector.
+      * \return Return the rotation axis index.
+      */
+    int ImportRotationElement(xmlNode* pXmlNode, FbxVector4& pRotationVector);
+
+    /** Extrapolate rotation order by the given int list.
+      * \param pNode The node whose rotation order is updated.
+      * \param pRotationOrder The int list representing the rotation order.
+      */
+    void SetRotationOrder(FbxNode * pNode, const FbxArray<int> & pRotationOrder);
+
+     /** Import Collada look at node, and computed camera position, interest, up vector, etc.
+    * \param pXmlNode Pointer to XML look at Node.
+    * \param lCameraPosition Vector4 value to return camera position.
+    * \param lInterestPosition Vector4 value to return camera interest position.
+    * \param lUpVector Vector4 value to return camera up vector.
+    * \param lCameraTransformMatrix XMatrix value to return camera transform matrix.
+    * \return true on success, false otherwise.
+    * \remarks Computed camera parameters are saved in lCameraPosition, lInterestPosition, lUpVector, lCameraTransformMatrix.
+    */
+    bool ImportLookAt(xmlNode* pXmlNode, FbxVector4& lCameraPosition, 
+										 FbxVector4& lInterestPosition, FbxVector4& lUpVector,
+										 FbxAMatrix& lCameraTransformMatrix);
+
+    //@}
+
+
+    /**
+    * \name Miscellaneous Functions
+    */
+    //@{
+    
+    /** Return false if we do not want to import a node with the given ID.
+    * \param lId The node ID.
+    * \return true for importable, false for in-importable.
+    * \remarks Do not import camera nodes with IDs (perspective, top, bottom,
+    * left, right, side, front or back), since they are global cameras already created in FBX.
+    */
+	bool IsNodeExportable(FbxString lId);
+    
+    /** Check if the Collada version is 1.4.*.
+      * \param pVersionString The string representing the COLLADA version, like "1.4.1".
+      * \return \c true if the Collada version is 1.4.* or \c false otherwise.
+      */
+    bool CheckColladaVersion(const FbxString & pVersionString);
+
+    //@}
+
+
+    /**
+    * \name Error Management
+    */
+    //@{
+
+    /** Add notification error info to notify users.
+      * \param pError String of error info.
+      */
+	void AddNotificationError( FbxString pError );
+
+    /** Add notification warning info to notify users.
+      * \param pWarning String of warning info.
+      */
+	void AddNotificationWarning( FbxString pWarning );
+    //@}
+
+    /** Import the whole scene from the root element of a COLLADA file.
+      * This is the main entry of COLLADA reader.
+      * \param pColladaNode The root element.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportScene(xmlNode * pColladaNode);
+
+    /** Preprocess the COLLADA scene.
+      * \param pColladaElement The root element of COLLADA scene.
+      */
+    void Preprocess(xmlNode * pColladaElement);
+
+    /** Build up the cache map from COLLADA element id to their data, which contain COLLADA elements and FBX objects.
+      */
+    void BuildUpLibraryMap();
+
+    /** Recursively build up the cache map from COLLADA element id to their data, which contain COLLADA elements and FBX objects.
+      * /param pElement The parent element which may contain target elements.
+      * /param pElementTag The tag of target elements.
+      */
+    void BuildUpLibraryMap(xmlNode * pElement, const FbxString & pElementTag);
+
+    /** Retrieve the material map from the bind_material element under an instance_geometry or instance_controller.
+      * And connected the created materials to the node.
+      * \param pNode The node to which the materials connect.
+      * \param pElement The COLLADA instance_goemetry or instance_controller element.
+      * \param pMaterialSequence The ordered material symbols which is used to create geometries.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ConnectMaterialsToNode(FbxNode * pNode, xmlNode * pElement, FbxDynamicArray<FbxString> & pMaterialSequence);
+
+    /** Import COLLADA transparent and transparency attributes in a COLLADA effect element.
+      * \param pElement A COLLADA Lambert, Phong, constant or Blinn element.
+      * \param pSurfaceMaterial A FBX surface material.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportTransparent(xmlNode * pElement, FbxSurfaceLambert * pSurfaceMaterial);
+
+    // Some traits with a typed element.
+    struct LibraryTypeTraits
+    {
+        FbxString library_tag;
+        FbxString element_tag;
+    };
+
+    /** Get a typed element from the library element with a given ID.
+      * \param pTypeTraits The traits of type.
+      * \param pID The ID of the element.
+      * \return The FBX object.
+      */
+    FbxObject * GetLibrary(const LibraryTypeTraits & pTypeTraits, const FbxString & pID);
+    FbxObject * GetLibrary(const LibraryTypeTraits & pTypeTraits, xmlNode * pElement);
+
+    /** Import the transform animation of a given node.
+      * \param pNode The node whose transform to be animated.
+      * \pAnimationChannelID The ID of animation element.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportMatrixAnimation(FbxNode * pNode, const FbxString & pAnimationChannelID);
+
+    /** Import the animation of a given attribute.
+      * \param pProperty The property to be animated.
+      * \param pAnimationChannelID The ID of animation element.
+      * \param pChannelName The channel name if the property has multiple channels.
+      * \return Return \c true on success and \c false otherwise.
+      */
+    bool ImportPropertyAnimation(FbxProperty & pProperty, const FbxString & pAnimationChannelID, const char * pChannelName = NULL);
+
+    /** Get the animation layer to which the specific animation curve belongs.
+      * \param pAnimationID The ID of the animation curve.
+      * \return The animation layer.
+      */
+    FbxAnimLayer * GetAnimLayer(const FbxString & pAnimationID);
+
+    /** Import local unit conversion.
+      * \param pElement The specific element.
+      * \return Return the local unit conversion.
+      */
+    double GetLocalUnitConversion(xmlNode * pElement);
+
+    /** Set the value of the property.
+      * \param pPropertyElement The corresponding element.
+      * \param pProperty The specific property.
+      */
+    void SetProperty(xmlNode* pPropertyElement, FbxProperty & pProperty);
+
+    /** Create a property with given name and set the value.
+      * \param pObject The object as the parent of the property.
+      * \param pPropertyName The name of the property.
+      * \param pPropertyValueElement The element containing the value.
+      */
+    void ImportPropertyValue(FbxObject * pObject, const char * pPropertyName,
+                             xmlNode * pPropertyValueElement);
+
+    FbxFile*		mFileObject;
+    FbxString		mFileName;
+
+    // XML lib stuff
+    xmlDocPtr		mXmlDoc;
+
+    FbxAnimLayer*	mAnimLayer;
+    FbxScene*		mScene;
+
+    // Save the global settings and document info in pre-reading
+    FbxGlobalSettings * mGlobalSettings;
+    FbxDocumentInfo * mDocumentInfo;
+    FbxArray<FbxTakeInfo*> mTakeInfo;
+
+    xmlNode * mColladaElement;
+
+    struct ColladaElementData
+    {
+        explicit ColladaElementData(xmlNode * pElement = NULL)
+            : mColladaElement(pElement), mFBXObject(NULL) {}
+        xmlNode * mColladaElement;
+        FbxObject * mFBXObject;
+		FbxArray<FbxObject*> mFBXObjects;
+    };
+	typedef FbxMap<FbxString, ColladaElementData> ColladaElementMapType;
+    ColladaElementMapType mColladaElements;
+
+    LibraryTypeTraits mEffectTypeTraits;
+    LibraryTypeTraits mMaterialTypeTraits;
+    LibraryTypeTraits mImageTypeTraits;
+    LibraryTypeTraits mGeometryTypeTraits;
+    LibraryTypeTraits mControllerTypeTraits;
+    LibraryTypeTraits mLightTypeTraits;
+    LibraryTypeTraits mCameraTypeTraits;
+    LibraryTypeTraits mNodeTypeTraits;
+    LibraryTypeTraits mAnimationTypeTraits;
+
+	typedef FbxMap<FbxString, FbxArray<xmlNode*> > AnimationMapType;
+    AnimationMapType mAnimationElements;
+
+    SourceElementMapType mSourceElements;
+
+	struct AnimationClipData
+	{
+		AnimationClipData(const FbxString & pID) : mID(pID), mAnimLayer(NULL) {}
+		AnimationClipData(const AnimationClipData& pOther){ *this = pOther; }
+		AnimationClipData& operator=(const AnimationClipData& pOther){ mID = pOther.mID; mAnimationElementIDs = pOther.mAnimationElementIDs; mAnimLayer = pOther.mAnimLayer; return *this; }
+
+		FbxString mID;                                // ID of animation clip
+		FbxSet<FbxString> mAnimationElementIDs;     // IDs of animation belong to this animation clip
+		FbxAnimLayer * mAnimLayer;                 // The corresponding animation layer
+	};
+	FbxDynamicArray<AnimationClipData> mAnimationClipData;
+
+    // Map from skin ID to skin element.
+    SkinMapType mSkinElements;
+
+    // There are two distinct namespaces for node ID & SID mapping.
+    // One with ID and the other with SID.
+    typedef FbxMap<FbxString, FbxNode *> NodeMapType;
+    NodeMapType mIDNamespaceNodes;
+    NodeMapType mSIDNamespaceNodes;
+
+    // Record the nodes which are to connect to its target node.
+    // Save the ID of the target node if a node has its target
+	typedef FbxMap<FbxNode *, FbxString> TargetIDMapType;
+    TargetIDMapType mTargetIDs;
+
+    FbxColladaNamespace mNamespace;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_COLLADA_READER_H_ */

+ 570 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/collada/fbxwritercollada14.h

@@ -0,0 +1,570 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxwritercollada14.h
+#ifndef _FBXSDK_FILEIO_COLLADA_WRITER_H_
+#define _FBXSDK_FILEIO_COLLADA_WRITER_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fileio/collada/fbxcolladautils.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** \brief Class to export FBX scene into a Collada file.
+*   \nosubgrouping
+*/
+class FbxWriterCollada : public FbxWriter 
+{
+public:
+    /**
+    * \name Constructors and Destructor
+    */
+    //@{
+
+    /** Constructor.
+    * \param pManager FBX SDK object Manager.
+    * \param pID      Internal ID.
+    * \param pStatus  The FbxStatus object to hold error codes.
+    */
+    FbxWriterCollada(FbxManager& pManager, int pID, FbxStatus& pStatus);
+
+    //! Destructor.
+    virtual ~FbxWriterCollada();
+
+    //@}
+
+    /**
+    * \name File Management
+    */
+    //@{
+
+    /** Create and open file with the given name.
+    * \param pFileName the name of file.
+    * \return Return true if the specified file is created and opened.
+    */
+    virtual bool FileCreate(char* pFileName);
+
+    /** Close file.
+    * \return Return true if file is closed successfully, false otherwise.
+    */
+    virtual bool FileClose();
+
+    /** Check if current file is open.
+    * \return Return true if file is open, false otherwise.
+    */
+    virtual bool IsFileOpen();
+
+    //@}
+
+    /**
+    * \name Write Functions
+    */
+    //@{
+
+    /** Get Collada export options settings.
+    */
+	virtual void GetWriteOptions(){}
+
+    /** Export the FBX document to Collada file, according to the given options settings.
+    * \param pDocument FBX Document to export.
+    * \return true on success, false otherwise.
+    */
+    virtual bool Write(FbxDocument* pDocument);
+
+    /** Process FBX scene before exporting FBX scene to Collada file.
+    * \param pScene the FBX scene to precess.
+    * \return Return true if the given scene is processed successfully.
+    * \remarks This function is processing name clash, special transformation conversion etc.
+    */
+    virtual bool PreprocessScene(FbxScene &pScene);
+
+    /** Process FBX scene after exporting FBX scene to Collada file.
+    * \param pScene the FBX scene to precess.
+    * \return Return true if the given scene is processed successfully.
+    */
+    virtual bool PostprocessScene(FbxScene &pScene);
+
+    //@}
+
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+    /**
+    * \name Export Functions
+    */
+    //@{    
+
+    /** Export FBX scene info to Collada asset.
+    * \param pXmlNode the XML Node to export asset, asset nodes will be added as children to this XML node.
+    * \param pSceneInfo Pointer to the FBX scene information object.
+    * \return Return pointer to XML asset node.
+    * \remarks Asset here contains user-defined summary data, such as:
+    * contributor, author, authoring tool, created time, Axis System, etc.
+    */
+    xmlNode*	ExportAsset(xmlNode* pXmlNode, FbxDocumentInfo* pSceneInfo);
+
+    /** Export FBX scene.
+      * \param pScene Pointer to the FBX scene object.
+      * \return The pointer to XML scene element.
+      */
+    xmlNode * ExportScene(FbxScene* pScene);
+
+    /** Export Libraries to the Collada document.
+    * \param pXmlNode Pointer to XML Node, it should be the asset node.
+    * \return Return true if all libraries are exported successfully.
+    * \remarks  After the libraries are created, call this function to add libraries to the Collada document.
+    * Libraries are added as the siblings just after the given pXmlNode.
+    */
+    bool		ExportLibraries(xmlNode* pXmlNode);
+
+    /** Export the given FBX node and its hierarchy to Collada XML nodes.
+    * \param pXmlNode Pointer to XML Node, created XML nodes hierarchy will be added as children to this XML node.
+    * \param pNode Pointer to FBX node, it should be one node in FBX nodes tree.
+    * \return Return pointer to XML node.
+    * \remarks The returned XML node is corresponding to the given FBX node,
+    * the returned XML node will be added as child to the given pXmlNode,
+    * this method is called recursively.
+    */
+    xmlNode* ExportNodeRecursive(xmlNode* pXmlNode, const FbxNode* pNode);
+
+    /** Export a Collada visual_scene MAX3D extension for the given FBX scene.
+      * \param pExtraElement The parent COLLADA extra element.
+      * \param pScene The FBX scene to be exported.
+      */
+    void ExportVisualSceneMAX3DExtension(xmlNode * pExtraElement, FbxScene * pScene);
+
+    /** Export a Collada visual_scene FCOLLADA extension for the given FBX scene.
+      * \param pExtraElement The parent COLLADA extra element.
+      * \param pScene The FBX scene to be exported.
+      */
+    void ExportVisualSceneFCOLLADAExtension(xmlNode * pExtraElement, FbxScene * pScene);
+
+    /** Export the given FBX node and its node attributes to Collada XML node.
+    * \param pXmlNode Pointer to XML Node, created XML node will be added as child to this XML node.
+    * \param pNode Pointer to FBX node, it should be one node in FBX nodes tree.
+    * \return Return pointer to the created XML node.
+    * \remarks The returned XML node is corresponding to the given FBX node,
+    * the returned XML node will be added as child to the given pXmlNode.
+    */
+    xmlNode* ExportNode(xmlNode* pXmlNode, const FbxNode* pNode);
+
+    /** Export the given FBX node's default transformation.
+    * \param pXmlNode Pointer to XML Node.
+    * \param pNode Pointer to FBX node.
+    * \return Return true if transformation is exported successfully.
+    * \remarks  FBX node transformation info is exported to properties of pXmlNode and its children,
+    * according to the Collada transformation structures.
+    */
+    bool ExportTransform(xmlNode* pXmlNode, const FbxNode* pNode);
+
+    /** Export FBX node attributes, create different libraries according to different node attribute type.
+    * \param pXmlNode Pointer to XML Node.
+    * \param pNode Pointer to FBX node.
+    * \return Return true if FBX node attributes is exported successfully, false otherwise.
+    * \remarks  According to different FBX node attribute type, different libraries will be created, such as:
+    * light, camera, geometry. See more details in CreateMeshLibrary(FbxNode* pNode), CreateCameraLibrary(FbxNode* pNode), CreateLightLibrary(FbxNode* pNode).
+    */
+    bool ExportNodeAttribute(xmlNode* pXmlNode, const FbxNode* pNode);
+
+    /** Create geometry library for the given FBX node.
+    * \param pNode Pointer to FBX node, its node attribute type should be FbxNodeAttribute::eMesh, or FbxNodeAttribute::eNurbs, or FbxNodeAttribute::ePatch.
+    * \return Return pointer to XML mesh library node.
+    * \remarks The returned XML node will be added to the geometry library,
+    * the geometry library will be added to the Collada document by ExportLibraries(xmlNode* pXmlNode).
+    */
+    xmlNode* CreateMeshLibrary(const FbxNode* pNode);
+
+    /** Create camera library for the given FBX node.
+    * \param pNode Pointer to FBX node, its node attribute type should be FbxNodeAttribute::eCamera.
+    * \return Return pointer to XML camera library node.
+    * \remarks The returned XML node will be added to the camera library,
+    * the camera library will be added to the Collada document by ExportLibraries(xmlNode* pXmlNode).
+    */
+    xmlNode* CreateCameraLibrary(const FbxNode* pNode);
+
+    /** Create light library for the given FBX node.
+    * \param pNode Pointer to FBX node, its node attribute type should be FbxNodeAttribute::eLight.
+    * \return Return pointer to XML light library node.
+    * \remarks The returned XML node will be added to the light library,
+    * the light library will be added to the Collada document by ExportLibraries(xmlNode* pXmlNode).
+    */
+    xmlNode* CreateLightLibrary(const FbxNode* pNode);
+
+    /** Export the given FBX mesh node to Collada XML node.
+    * \param pNode Pointer to FBX node, its node attribute type should be FbxNodeAttribute::eMesh.
+    * \return Return pointer to XML mesh node.
+    * \remarks Vertex, polygons of the mesh will be exported.
+    * Textures, materials, controllers, and shapes which linked to the mesh will also be exported.
+    */
+    xmlNode* ExportMesh(const FbxNode* pNode);
+
+    /** Export the given shape's geometry to Collada XML node.
+    * \param pMeshShape, Pointer to FBX mesh, corresponding to shape.
+    * \param pShapeId, a string to identify shape from internal shape meshes list.
+    * \return Return pointer to XML shape geometry node.
+    * \remarks The geometry of shape will be exported, materials of shape will not be exported.
+    */
+    xmlNode*	ExportShapeGeometry(FbxMesh* pMeshShape, FbxString pShapeId);
+
+    /** Export the given mesh's vertex position to Collada XML node.
+    * \param pXmlNode Pointer to XML Node, created XML node will be added as child to this XML node.
+    * \param pMesh Pointer to FBX mesh object, position info of all the vertices of this mesh will be exported.
+    * \param pMeshName Name of the XML node to export, usually it's the name of FBX mesh node.
+    * \param pInGeometry True if vertices are inside an ordinary geometry, false if vertices are in a binded geometry.
+    * \param pExportControlPoints True if pMesh is an ordinary geometry, false if pMesh is a binded geometry.
+    * \return Return pointer to XML vertex position node, the returned XML node will be added as child to the given pXmlNode.
+    * \remarks In an ordinary geometry, pExportControlPoints should be true, export the position of the control points;
+    * in a binded geometry, pExportControlPoints should be false, export the position of the transformed control points.
+    */
+    //Note why internally set pExportControlPoints to true?
+    xmlNode*	ExportVertexPositions(xmlNode* pXmlNode, FbxMesh* pMesh, FbxString pMeshName, bool pInGeometry, bool pExportControlPoints);
+
+    /** Export all layer elements of the given mesh to Collada XML node.
+    * \param pXmlMesh Pointer to XML Node, created XML layer elements nodes will be added as child to this XML node.
+    * \param pMesh Pointer to FBX mesh object, all layer elements of this mesh node will be exported.
+    * \param pName String which used to construct the names of XML layer elements nodes.
+    * \return Return the modified pXmlMesh.
+    * \remarks Layer elements including Normals, UVs, Vertex Colors are covered,
+    * polygon groups and other undefined layer elements are NOT supported.
+    */
+    xmlNode*	ExportLayerElements(xmlNode* pXmlMesh, FbxMesh* pMesh, FbxString pName);
+
+    /** Export Normals of specified layer of the given mesh to Collada XML node.
+    * \param pXmlNode Pointer to XML Node, created XML Normals node will be added as child to this XML node.
+    * \param pMesh Pointer to FBX mesh object, normals layer element of this mesh node will be exported.
+    * \param pName String which used to construct the names of XML normals nodes.
+    * \param pExt Extension string which used to construct the names of XML normals nodes.
+    * \param pLayerIndex Specify an index of layers to export, normals of other layers will NOT be exported.
+    * \return Return pointer to XML Normals node.
+    * \remarks The returned XML node will be added as child to the given pXmlNode.
+    */
+    xmlNode*	ExportNormals(xmlNode* pXmlNode, FbxMesh* pMesh, FbxString pName, FbxString pExt, int pLayerIndex);
+
+    /** Export UVs of specified layer of the given mesh to Collada XML node.
+    * \param pXmlNode Pointer to XML Node, created XML UVs node will be added as child to this XML node.
+    * \param pMesh Pointer to FBX mesh object, UVs layer element of this mesh node will be exported.
+    * \param pName String which used to construct the names of XML UVs nodes.
+    * \param pLayerIndex Specify an index of layers to export, UVs of other layers will NOT be exported.
+    * \return Return pointer to XML UVs node.
+    * \remarks The returned XML node will be added as child to the given pXmlNode.
+    */
+    xmlNode*	ExportUVs(xmlNode* pXmlNode, FbxMesh* pMesh, FbxString pName, int pLayerIndex);
+
+    /** Export VertexColors of specified layer of the given mesh to Collada XML node.
+    * \param pXmlNode Pointer to XML Node, created XML VertexColors node will be added as child to this XML node.
+    * \param pMesh Pointer to FBX mesh object, VertexColors layer element of this mesh node will be exported.
+    * \param pName String which used to construct the names of XML VertexColors nodes.   
+    * \param pLayerIndex Specify an index of layers to export, VertexColors of other layers will NOT be exported.
+    * \return Return pointer to XML VertexColors node.
+    * \remarks The returned XML node will be added as child to the given pXmlNode.
+    */
+    xmlNode*	ExportVertexColors(xmlNode* pXmlNode, FbxMesh* pMesh, FbxString pName, int pLayerIndex);
+
+    /** Export the given mesh's vertex to Collada XML node.
+    * \param pXmlNode Pointer to XML Node.
+    * \param pMesh Pointer to FBX mesh object.
+    * \param pName Name of the XML node to export, usually it's the name of FBX mesh node.
+    * \return Return pointer to the created XML vertex node.
+    */
+    xmlNode*	ExportVertices(xmlNode* pXmlNode, FbxMesh* pMesh, FbxString pName);
+
+    /** Export the given mesh's polygons to Collada XML node.
+    * \param pMeshElement Pointer to XML Node.
+    * \param pMesh Pointer to FBX mesh object.
+    * \param pMaterialName Specify the name of materials property.
+    * \param pMaterialIndexInNode Specify the material index in the FBXNode (will be ignored if there is only 1 material in the node)
+    * \param pName String which used to construct the names of created XML nodes.
+    * \param pShape true for shape node, false for general node, the default value is false;
+    * don't write out the materials if pShape is true.
+    * \return Return pointer to the created XML Polygons node.
+    */
+    xmlNode* ExportPolygons(xmlNode* pMeshElement, FbxMesh* pMesh, FbxString pMaterialName, int pMaterialIndexInNode, FbxString pName, bool pShape = false);
+
+    /** Export all the materials used by the given mesh.
+    * \param pMesh FBX mesh to export.
+    * \param pNbMat materials count of pMesh.
+    * \return true on success, false otherwise.
+    */
+    bool		ExportMeshMaterials(FbxMesh *pMesh, int pNbMat);
+
+    /** Export the given material to the Material library.
+    * \param pMaterial Specify the surface material to export.
+    * \return Return pointer to the corresponding XML material node.
+    * \remarks If the given material is already in the materials library, return the XML node;
+    * otherwise, create and add XML material node to the Material library.
+    */
+    xmlNode*	ExportMaterial(FbxSurfaceMaterial *pMaterial);
+
+    /** Export the given material to the Effect library.
+    * \param pMaterial Specify the surface material to export.
+    * \param pEffectId Specify the effect ID to export.
+    * \return Return pointer to the corresponding XML effect node.
+    * \remarks Material is an instance of an effect.
+    * If the given material is already in the Effect library, return the XML node;
+    * otherwise, create and add XML effect node to the Effect library.
+    * Collada Effect support: Ambient Color, Diffuse Color, Emissive Color, Specular Color, Shiness, Reflective / Reflectivity,
+    * Opacity / Transparency.
+    */    
+    xmlNode*	ExportEffect(FbxSurfaceMaterial *pMaterial, FbxString pEffectId);
+
+    /** Add the given texture as input to the given XML material node.
+    * \param pXmlMaterial Pointer to XML material node.
+    * \param pTexture FBX texture to export.
+    * \param pImageId A string to identify image from the image library.
+    * \param pLayerIndex Specify an index of layers to export.
+    * \param pLayerElementType Specify the layer element type.
+    * \return true on success, false otherwise.
+    */
+    //Note why return true when failed and popped waring?
+    bool		AddMaterialTextureInput(xmlNode *pXmlMaterial, FbxFileTexture *pTexture, FbxString pImageId, int pLayerIndex, int pLayerElementType);
+
+    /** Export the given texture to Collada XML node.
+    * \param pTexture FBX texture to export.
+    * \param pImageId A string to identify image from the image library.
+    * \param pLayerIndex Specify an index of layers to export.
+    * \return Return pointer to the created XML texture node.
+    */
+    xmlNode*	ExportTexture(FbxFileTexture *pTexture, FbxString pImageId, int pLayerIndex);
+
+    /** Export all the textures used by the given mesh.
+    * \param pMesh FBX mesh to export.
+    * \return true on success, false otherwise.
+    * \remarks The materials will also be Exported if needed.
+    */
+    bool		ExportMeshTextures(FbxMesh *pMesh);
+
+    /** Export the given FBX camera node to Collada XML node.
+    * \param pNode Pointer to FBX node, its node attribute type should be FbxNodeAttribute::eCamera.
+    * \return Return pointer to XML node.
+    * \remarks Camera parameters and properties will be exported.    
+    */
+    xmlNode* ExportCamera(const FbxNode* pNode);
+
+    /** Export the given FBX light node to Collada XML node.
+    * \param pNode Pointer to FBX node, its node attribute type should be FbxNodeAttribute::eLight.
+    * \return Return pointer to XML node.
+    * \remarks Light parameters and properties will be exported.    
+    */
+    xmlNode* ExportLight(const FbxNode* pNode);
+
+    /** Export the global ambient to Collada XML light node.    
+    */
+    void ExportSceneAmbient(xmlNode * pVisualSceneElement);
+
+    /** Export controllers of the given mesh to Collada XML node.
+    * \param pMesh FBX mesh to export, it should be a binded skin.
+    * \return true on success.
+    * \remarks A morph controller will be exported by ExportControllerShape().
+    */
+    bool		ExportController(FbxMesh *pMesh);
+
+    /** Export morph controllers of the given mesh to Collada XML node.
+    * \param pMesh FBX mesh to export, it should has more than one shape.
+    * \return true on success.
+    * \remarks Morph controller is also called shape deformer.
+    */
+    bool		ExportControllerShape(FbxMesh *pMesh);
+
+    /** .
+    * \param .
+    * \param .
+    * \return .
+    * \remarks .
+    */
+    //Note : empty method now
+    xmlNode*	ExportJointWeights(xmlNode* pXmlNode, FbxMesh* pMesh, FbxString pExt);
+
+    /** Update mesh library with the shapes found, and add shapes as nodes in the scene.
+    * \param pXmlNode Pointer to XML Node, created shape node will be added as child to this XML node.
+    * \return true on success, false otherwise.
+    * \remarks This method will create a geometry node in geometry library for every shape as needed,
+    * XML shape nodes will also be created and added to scene.
+    */
+    bool		UpdateMeshLibraryWithShapes(xmlNode* pXmlNode);
+
+    /** Export animations of the given node and its children, if they are animated.
+    * \param pNode FBX node to export, it should be animated.
+    * \return true on success, false otherwise.
+    * \remarks This method is called recursively, the animations of all the children of pXmlNode will also be exported.
+    */
+    bool		ExportAnimation(FbxNode* pNode);
+
+    /** Export all the animation curves of the given node to Collada XML node.
+    * \param pNode FBX node to export, it should be animated.
+    * \param pAnimationNode Pointer to XML Node, created sub-animation nodes will be added as children to this XML node.
+    * \return true on success.
+    */
+    bool		ExportAnimationCurves(FbxNode* pNode, xmlNode* pAnimationNode);
+
+    /** Export the texture into library_images.
+      * \param pTexture The texture whose file name to be exported.
+      * \return Return the ID of the create image element.
+      */
+    const FbxString ExportImage(FbxFileTexture * pTexture);
+
+    /** Export the given animation curve (FCurve) to Collada XML node.
+    * \param pAnimationNode Pointer to XML Node, created sub-animation node will be added as child to this XML node.
+    * \param pCurve Animation Curve to export.
+    * \param pChannelName The name of animation channel.
+    * \param pSubChannelName The name of animation sub-channel.
+    * \param pExportShape Shape animation flag, default value is false; When it's true, Id nomenclature is a bit different.
+    * \param pExportIntensity Intensity flag, default value is false; When it's true, FCurve values are divided by 100.
+    * \param pExportLib Library flag, default value is false; When it's true, Id nomenclature is a bit different.
+    * \return true on success.
+    * \remarks When pExportShape or pExportIntensity is true, FCurve values are divided by 100.
+    */
+    bool		ExportCurve(xmlNode* pAnimationNode, FbxAnimCurve* pCurve,
+        const char* pChannelName, const char* pSubChannelName,
+        bool pExportShape=false, bool pExportIntensity=false, bool pExportLib=false);
+
+    /** Check whether the first three elements of the given vector are both zero.
+    * \param pV the FBX vector4 to check.    
+    * \return Return true if one of the first three elements of pV is not zero, return false if all of the three elements are both zero.
+    * \remarks If the absolute value of element is less than a tolerance, the element will be considered as zero.
+    */
+    bool		NotZero(FbxVector4 pV);
+
+    /** Check whether the first three elements of the given vector are both equal to the given value.
+    * \param pV the FBX vector4 to check.
+    * \param pValue the value to check.
+    * \return Return true if one of the first three elements of pV is NOT equal to pValue, return false if all of the three elements are both equal to pValue.
+    */
+    bool		NotValue(FbxVector4 pV, double pValue);
+
+    /** Check whether the given value is zero.
+    * \param pD the value to check.    
+    * \return Return true if pD is NOT zero, return false if pD is zero.
+    * \remarks If the absolute value of pD is less than a tolerance, pD is considered as zero.
+    */
+    bool		NotZero(double pD);
+
+    /** Check whether the given node's translation is animated.
+    * \param pNode the FBX node to check.
+    * \return Return true if one of Translation X/Y/Z is animated, return false if both of Translation X/Y/Z are not animated.
+    * \remarks If there is no key on one property, this property is not animated.
+    */
+    bool IsTranslationAnimated(const FbxNode *pNode);
+
+    /** Check whether the given node's rotation is animated.
+    * \param pNode the FBX node to check.
+    * \return Return true if one of Rotation X/Y/Z is animated, return false if both of Rotation X/Y/Z are not animated.
+    * \remarks If there is no key on one property, this property is not animated.
+    */
+    bool IsRotationAnimated(const FbxNode *pNode);
+
+    /** Check whether the given node's rotation of specified axis is animated.
+    * \param pNode the FBX node to check.
+    * \param pAxis Specify index of rotation axis, 0 for Rotation X, 1 for Rotation Y, 2 for Rotation Z.
+    * \return Return true if the rotation of specified axis is animated, return false if it is not animated.
+    * \remarks If there is no key on one property, this property is not animated.
+    */
+    bool IsRotationAnimated(const FbxNode *pNode, int pAxis);
+
+    /** Check whether the given node's scale is animated.
+    * \param pNode the FBX node to check.
+    * \return Return true if one of Scale X/Y/Z is animated, return false if both of Scale X/Y/Z are not animated.
+    * \remarks If there is no key on one property, this property is not animated.
+    */
+    bool IsScaleAnimated(const FbxNode *pNode);
+
+    /** Copy mesh parameters from pRefMesh to pNewMesh.
+    * \param lNewMesh New FBX mesh.
+    * \param lRefMesh Referenced FBX mesh.
+    * \remarks Vertices, polygons, layers will be copied.
+    */
+    void		CopyMesh(FbxMesh *lNewMesh, FbxMesh *lRefMesh);
+
+    /** Convert camera focal length animation curve to camera field of view animation curve.
+    * \param pFOVCurve A curve that represents camera field of view.
+    * \param pFLCurve A curve that represents camera focal length animation.
+    * \param pCamera FBX camera to convert.
+    */
+    void		ConvertFocalLengthCurveToFOV(FbxAnimCurve *pFOVCurve, FbxAnimCurve *pFLCurve, FbxCamera *pCamera);
+
+    /** Preprocess the given FBX node and its hierarchy.
+    * \param pNode Pointer to FBX node.
+    * \remarks To correctly export FBX scene to Collada, this method process FBX nodes,
+    * such as set pivot state for every FBX node, do special transformation conversion for FBX lights and cameras.
+    * This method is called recursively. 
+    */
+    void		PreprocessNodeRecursive(FbxNode* pNode);
+
+    /** Export the value of the specific property as a child element of an element.
+      * \param pProperty The property whose value to be exported.
+      * \param pParentElement The parent element of the created element.
+      */
+    void ExportPropertyValue(const FbxProperty & pProperty,
+                             xmlNode * pParentElement);
+
+    //@}
+
+    /**
+    * \name Error Management
+    */
+    //@{
+
+    /** Add notification error info to notify users.
+    * \param pError String of error info.
+    */
+    void AddNotificationError( FbxString pError );
+
+    /** Add notification warning info to notify users.
+    * \param pWarning String of warning info.
+    */
+    void AddNotificationWarning( FbxString pWarning );
+
+    //@}
+
+    FbxFile* mFileObject;
+    FbxString mFileName;
+    bool mStatus;
+
+    // XML lib stuff
+    //
+    xmlDocPtr mXmlDoc;
+
+    // Scene information
+    FbxScene*	mScene;
+
+    // AnimStack/Layer holding the animation
+    FbxAnimStack* mAnimStack;
+    FbxAnimLayer* mAnimLayer;
+
+    // Libraries
+    // NB: CODE and PROGRAM libraries are unused, so they are not created.
+    xmlNode*	mLibraryAnimation;
+    xmlNode*	mLibraryCamera;
+    xmlNode*	mLibraryController;
+    xmlNode*	mLibraryGeometry;
+    xmlNode*	mLibraryImage; 
+    xmlNode*	mLibraryLight;
+    xmlNode*	mLibraryMaterial;
+    xmlNode*	mLibraryEffect;
+    xmlNode*	mLibraryTexture;
+    xmlNode*	mLibraryVisualScene;
+
+    // Shape information
+    FbxStringList	*mShapeMeshesList;
+
+    // export options
+    bool mTriangulate;
+    bool mSingleMatrix;
+    FbxTime mSamplingPeriod;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_COLLADA_WRITER_H_ */

+ 1746 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxio.h

@@ -0,0 +1,1746 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2017 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxio.h
+#ifndef _FBXSDK_FILEIO_FBX_IO_H_
+#define _FBXSDK_FILEIO_FBX_IO_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+#include <fbxsdk/core/base/fbxtime.h>
+#include <fbxsdk/core/base/fbxstatus.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxIO;
+class FbxReader;
+class FbxWriter;
+class FbxFile;
+class FbxStream;
+class FbxXRefManager;
+
+/** 
+    Defines the current FBX file version number in four digits. The first digit is the 
+    major version number a the last three digits are the minor version number (e.g. 7100 = 7.1).
+    The following is the version history of FBX: 
+    
+    \li Version 2000 - New KFCurve and embedded FBX, no FCurve/FCurve node storing.
+    No more .takf file like in earlier version, no history.
+    
+    \li Version 2001 - Version incremented to support FbxTime save in native (integer, not double) 
+    format.
+    
+    \li Version 3000 - FiLMBOX 3.0 version, nothing changed in current class since version 2001.
+    FBX SDK 3.0 and 3.6
+    
+    \li Version 3001 - FiLMBOX 3.0 encrypted version, only a trial. Encrypted files could only 
+    be written in debug versions. Cannot switch to a higher version number now because any
+    file with a version number >= 3001 is read as encrypted.
+    Hence, this value now only gives file type. (3000 or less -> binary, 3001 or more -> encrypted)
+    FiLMBOX 3.2, FiLMBOX 3.5 and "Online" 3.51 have been released with version 3000.
+    
+    \li Version 4000 - MotionBuilder 4.0, new type in KFCurve tangents, supported in FiLMBOX 3.5 
+    but not by earlier versions. Version number is now stored in section footer.
+    Before September 3rd 2002, the version number was always 3000 in main section footer.
+    Now the main section footer has version number 4000. The minimum version number in footer of 
+    an extension section is 4000.
+    
+    \li Version 4001 - ASCII Header is 4.1. MotionBuilder 4.01, to fix FCurveNode problem with 
+    layer types in version 4000 the main section footer has version number 4001.
+    Now the footer for extension sections has version number 4001.
+    
+    \li Version 4050 - ASCII Header is 4.5. MotionBuilder 4.1 or 4.5 before 
+    January 22nd 2003. This is because EvaluationProperties now have color. Now the main section footer 
+    has version number 4050.
+    Now the footer for extension sections has version number 4050.
+
+    \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
+    MotionBuilder 4.03 and 4.1 or 4.5 from January 22nd 2003
+    FBX SDK 3.6.1. New extended header to improve FBX file version management. Now the extended header and 
+    the main section footer have version number 5000. Now the footer for extension sections has version number 5000.
+    
+    \li Version 5800 - This was a temporary version while waiting for version 6000 renders the previous versions 
+    incompatible with MotionBuilder 6.0. For now, however, this format is needed to allow
+    some tools/plugins (For example Maya) to correctly detect that the file has some features that are not
+    completely backward compatible (For example: pivots defined with _pre/_post nodes which require a special
+    processing). By incrementing only the minor version we do not compromise the integrity of the
+    files.
+    
+    \li Version 6000 - Header version is now 6.0.
+    Extended header now contain a creation time stamp
+    that can be retrieve without parsing the main section of the file.
+    A creator tag (string) is now stored in the Extended header. This contain the originator (MB/FBXSDK)
+    of the file and the build number of the originator.
+    First release of the file format using the KProperties to store/retrieve information.
+    
+    \li Version 6100 - Added support for multiple attributes (mainly multiple geometry) at the node level.
+    The pointer to the node attribute have been replaced by a connection between the node and its attribute(s).
+    
+    \li Version 7000 -
+    First version of the 7.0 series; most likely very short-lived, developed for Protein, before ADP.
+    Supports reference cloning, external documents, blobs, unique IDs (per file), property templates.
+    So many changes that it was decided to break from 6.0 to keep Motion Builder intact.
+    
+    \li Version 7099 - Temporary version for FBX 2011 alpha releases.
+    
+    \li Version 7100
+    Official file version for FBX 2011, add support for animation to FBX 7.
+    First version of FBX SDK with FBX 7 files as the default file format.
+
+	\li Version 7200
+	Added support for multiple blend shape deformers and In-Between blend-shapes on each geometry.
+	Moved shape(FbxShape) to its own section other than as a part of geometry section.
+	Add support to store blend shape deformer(FbxBlendShape), blend shape channel(FbxBlendShapeChannel), 
+	Substance(FbxProceduralTexture) and Lines(FbxLine).
+	Add support to store 3 different smooth binding modes of FbxSkin, including classic linear, dual quaternion 
+	and blended mode of previous two modes.
+    Added the CLAMP_PROGRESSIVE tangent mode.
+    The KFCurve::KeyAttrDataFloat data array now stores as integer values (ASCII mode) to to eliminate float to int precision errors.        
+    FbxLayeredTexture now stores alphas for its sub textures.
+	
+	\li Version 7300
+	Changed the way the CharacterPoses are written.
+	Changed light property name HotSpot and ConeAngle to InnerAngle and OuterAngle
+
+ 	\li Version 7400
+	Normals, tangents and binormals save the 4th component into a separate array	
+
+	\li Version 7500
+	Added support for large files (>2GB). NOTE: This breaks forward compatibility (i.e. older products won't be able to open these files!!)
+   
+   */
+
+//File version numbers
+#define FBX_FILE_VERSION_2000		2000	//FBX 2.0
+#define FBX_FILE_VERSION_2001		2001	//FBX 2.01
+#define FBX_FILE_VERSION_3000		3000	//FBX 3.0
+#define FBX_FILE_VERSION_3001		3001	//FBX 3.01
+#define FBX_FILE_VERSION_4000		4000	//FBX 4.0
+#define FBX_FILE_VERSION_4001		4001	//FBX 4.01
+#define FBX_FILE_VERSION_4050		4050	//FBX 4.5
+#define FBX_FILE_VERSION_5000		5000	//FBX 5.0
+#define FBX_FILE_VERSION_5800		5800	//FBX 5.8
+#define FBX_FILE_VERSION_6000		6000	//FBX 6.0
+#define FBX_FILE_VERSION_6100		6100	//FBX 6.1 (guarantee compatibility with Autodesk 2010 products)
+#define FBX_FILE_VERSION_7000		7000	//Compatible with 7.1, and taken as such
+#define FBX_FILE_VERSION_7099		7099	//Compatible with 7.1, and taken as such
+#define FBX_FILE_VERSION_7100		7100	//FBX 7.1 (guarantee compatibility with Autodesk 2011 products)
+#define FBX_FILE_VERSION_7200		7200	//FBX 7.2 (guarantee compatibility with Autodesk 2012 products)
+#define FBX_FILE_VERSION_7300		7300	//FBX 7.3 (guarantee compatibility with Autodesk 2013 products)
+#define FBX_FILE_VERSION_7400		7400	//FBX 7.4 (guarantee compatibility with Autodesk 2014/2015 products)
+#define FBX_FILE_VERSION_7500		7500	//FBX 7.5 (guarantee compatibility with Autodesk 2016 products)
+
+//File version compatibility strings
+#define FBX_53_MB55_COMPATIBLE		"FBX53_MB55"
+#define FBX_60_COMPATIBLE			"FBX60_MB60"
+#define FBX_2005_08_COMPATIBLE		"FBX200508_MB70"
+#define FBX_2006_02_COMPATIBLE		"FBX200602_MB75"
+#define FBX_2006_08_COMPATIBLE		"FBX200608"
+#define FBX_2006_11_COMPATIBLE		"FBX200611"
+#define FBX_2009_00_COMPATIBLE		"FBX200900"
+#define FBX_2009_00_V7_COMPATIBLE	"FBX200900v7"
+#define FBX_2010_00_COMPATIBLE		"FBX201000"
+#define FBX_2011_00_COMPATIBLE		"FBX201100"
+#define FBX_2012_00_COMPATIBLE		"FBX201200"
+#define FBX_2013_00_COMPATIBLE		"FBX201300"
+#define FBX_2014_00_COMPATIBLE		"FBX201400"
+#define FBX_2016_00_COMPATIBLE		"FBX201600"
+#define FBX_2018_00_COMPATIBLE      "FBX201800"
+#define FBX_2019_00_COMPATIBLE      "FBX201900"
+
+//Default file version number used when writing new FBX files
+#define FBX_DEFAULT_FILE_VERSION		FBX_FILE_VERSION_7500
+#define FBX_DEFAULT_FILE_COMPATIBILITY	FBX_2019_00_COMPATIBLE
+
+/** Convert the FBX file version string to an integral number for <= or >= tests purposes.
+  * \param pFileVersion File version string.
+  * Some examples:
+  * \code
+  *     int version;
+  *         version = FileVersionStrToInt(FBX2012_00_COMPATIBLE);    // version = 201200
+  *         version = FileVersionStrToInt(FBX60_COMPATIBLE);         // version = 6000
+  *         version = FileVersionStrToInt("FBX200900");              // version = 200900
+  *         version = FileVersionStrToInt("Toto");                   // version = 0
+  *         version = FileVersionStrToInt("");                       // version = -1
+  * \endcode
+  * \returns the file version number or 0 if an unsupported string value is passed.
+  */
+FBXSDK_DLL int FbxFileVersionStrToInt(const char* pFileVersion);
+
+/** \internal Used internally by readers to evaluate what is the current section */
+enum
+{
+	FBX_NO_SECTION = -1,	//!< indicate not in a valid section
+	FBX_MAIN_SECTION,		//!< indicate currently in the main section
+	FBX_EXTENSION_SECTION_0	//!< indicate currently in the extention section 0
+};
+
+/** Render and resolution information.
+* \nosubgrouping 
+*/
+class FBXSDK_DLL FbxIODefaultRenderResolution
+{
+public:
+    /** If the resolution data is ready. */
+    bool    mIsOK;
+    /** camera name. */
+    FbxString mCameraName;
+    /** resolution mode. ex: "Fixed Resolution","Fixed Ratio","Fixed Width","Fixed Height","Window Size"*/
+	FbxString mResolutionMode;
+    /** resolution width. */
+    double mResolutionW;
+    /** resolution height. */
+    double mResolutionH;
+
+    /**
+    * \name Constructors and Destructor
+    */
+    //@{
+    //! Default constructor.
+    FbxIODefaultRenderResolution();
+    //@}
+
+    /**
+    * \name Member Access
+    */
+    //@{
+    //! Reset values to default.
+    void Reset();
+    //@}
+};
+
+/** FBX header information used at beginning of the FBX file
+* to get or set important values like the file format version number (mFileVersion).
+* The file version number will be used to select a particular Reader or Writer.
+* \nosubgrouping */
+class FBXSDK_DLL FbxIOFileHeaderInfo
+{
+public:
+    /**
+    * \name Constructors and Destructor
+    */
+    //@{
+    //! Default constructor.
+    FbxIOFileHeaderInfo();
+
+    //! Destructor.
+    virtual ~FbxIOFileHeaderInfo();
+    //@}
+
+    /**
+    * \name Public Member
+    */
+    //@{
+
+	//! Reset values to default.
+	virtual void				Reset();
+
+    /** A derived class can override this function to read additional information from the file header.
+    *   \return false in case of failure that should stop loading the file.
+    */
+    virtual bool				ReadExtendedHeaderInformation(FbxIO*);
+    //@}
+
+	//! FbxIODefaultRenderResolution to handle default resolution values
+    FbxIODefaultRenderResolution    mDefaultRenderResolution;
+
+	//!Read only properties (not used for file write)
+	
+	//@{
+	/** File version ex; 5000, 6000, 6100, 7000, 7099, 7100 
+	*   the major part is the first digit, the minor part, 3 other digits
+	*   ex: 7100 means version 7.1
+	*/
+    int                         mFileVersion;
+
+	/** Indicates whether a creation time stamp is preset */
+    bool                        mCreationTimeStampPresent;
+
+	/** Indicates whether the mCreationTimeStamp member variable contains the actual creation time of the file. */
+    FbxLocalTime                  mCreationTimeStamp;
+
+    /** Indicates who is the creator of the file
+	*   Ex: "FBX SDK/FBX Plugins version 2011.2" 
+	*/
+    FbxString                     mCreator;				
+
+	/** Indicates whether the file is created by a genuine Autodesk plug-in or not */
+	bool						mIOPlugin;
+
+	/** The flag indicates that the header was created by a personal learning edition (PLE) of FBX. */
+    bool                        mPLE;
+	//@}
+};
+
+/** FbxIO represents an FBX file. 
+  * It is primarily used by FBX importers (FbxImporter) and exporter (FbxExporter) 
+  * when reading or writing data from or to a disk or memory. 
+  * Most users will not use the FbxIO class directly 
+  * but will use an instance of either FbxImporter or FbxExporter 
+  * to read or write FBX files.
+  *
+  * An FBX file may contain binary data or ASCII data.
+  * A good way to learn the internal structure of a FBX file 
+  * is to open a FBX file saved in ASCII in a text editor.
+  *
+  * Ex: to read a FBX file content using FbxIO class directly
+  * \code
+  * // Create a FbxIO object with FbxIO::Create()
+  * // Open the file with ProjectOpen( ... ) a NULL pointer can be passed for (FbxReader)* param
+  * // ProjectOpen_xxx_Section() to open a particular section
+  * int nbSec = FieldGetCount(); // to get the number of fields of the current section opened
+  *	for(int i=0; i < nbSec; i++) // read all fields
+  *	{
+  *		// check if the field is a block
+  *		if(FieldReadIsBlock()){ } ... Read sub fields recursively ... may contain other blocks and fields
+  *		else
+  *		{
+  *			FieldReadBegin();	// navigate on the field
+  *			char fieldType = FieldReadGetType(); // get the data type
+  *
+  *			// According to the Field data type, call the appropriate read functions
+  *
+  *			     if(fieldType == 'S') FieldReadS(...) to read a string
+  *			else if(fieldType == 'B') FieldReadB(...) to read a bool
+  *			else if(fieldType == 'I') FieldReadI(...) to read a int
+  *		    ... 
+  *			FieldReadEnd(); // navigate to next field
+  *		}
+  *	}
+  *
+  * ProjectCloseSection() // close the section opened
+  * // repeat for another section ...
+  * // finally close the Project
+  * ProjectClose(); // or delete the FbxIO object created.
+  * \endcode
+  */
+class FBXSDK_DLL FbxIO
+{
+public:
+
+    /** \internal Exception-safe way of setting/resetting the xref manager in a FbxIO object.
+	*/
+    struct FbxAutoResetXRefManager
+    {
+        FbxIO*                   mFbx;
+        const FbxXRefManager*  mXRefManager;
+
+		/** Default constructor */
+        FbxAutoResetXRefManager(FbxIO* pFbx, FbxXRefManager& pXRefManager)
+        : mFbx(pFbx)
+        , mXRefManager(NULL)
+        {
+            if( mFbx )
+            {
+                mXRefManager = mFbx->ProjectGetXRefManager();
+                mFbx->ProjectSetXRefManager(&pXRefManager);
+            }
+        }
+
+		/** Destructor */
+        ~FbxAutoResetXRefManager()
+        {
+            if( mFbx )
+            {
+                mFbx->ProjectSetXRefManager(mXRefManager);
+            }
+        }
+    };
+
+	enum BinaryType
+	{
+		BinaryNormal,	//<! Standard FBX file field alignment using 32bit values, used by all file format version 7.4.0 or lower
+		BinaryLarge		//<! New FBX file field alignment using 64bit values, used by all file format version 7.5.0 or higher
+	};
+
+	/** Creation function for this FbxIO class
+      * \param pStatus  The FbxStatus object to hold error codes.
+	  * \return a new FbxIO object pointer
+	  */
+    static FbxIO* Create(BinaryType pBinaryType, FbxStatus& pStatus){ return FbxNew< FbxIO >(pBinaryType, pStatus); }
+
+	/** Default constructor */
+    FbxIO(BinaryType pBinaryType, FbxStatus& pStatus);
+
+	/** Destructor */
+    virtual ~FbxIO();
+
+    /**
+    * \name Project Global
+	* The term "Project" here is an abstract name chosen to represent a group of data
+	* ex: a file, a stream, a memory buffer, etc.
+    */
+    //@{
+
+    /** Open a project already in Memory 
+      * \param pAddress
+      * \param pMaxLength
+      * \param pReader
+      * \param pCheckCRC
+      * \param pOpenMainSection
+      * \param pFileHeaderInfo
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectOpen(void* pAddress, FbxULong pMaxLength, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* pFileHeaderInfo = NULL);
+
+    /** Open a project. 
+      * \param pName
+      * \param pReader
+      * \param pCheckCRC
+      * \param pOpenMainSection
+      * \param pFileHeaderInfo
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectOpen(const char* pName, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* pFileHeaderInfo = NULL);
+
+	/** Open a project. 
+      * \param pStream
+      * \param pStreamData
+      * \param pReader
+      * \param pCheckCRC
+      * \param pOpenMainSection
+      * \param pFileHeaderInfo
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectOpen(FbxStream* pStream, void* pStreamData, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* pFileHeaderInfo = NULL);
+
+    /** Open project file without necessarily an .fbx extension. 
+      * \param pName
+      * \param pReader
+      * \param pCheckCRC
+      * \param pOpenMainSection
+      * \param pFileHeaderInfo
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectOpenDirect(const char* pName, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* pFileHeaderInfo = NULL);
+
+    /** Create a project in Memory 
+      * \param pAddress
+      * \param pSize
+      * \param pWriter
+      * \param pBinary
+      * \param pEncrypted
+      * \param pFileHeaderInfo
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectCreate(void* pAddress, FbxUInt pSize, FbxWriter* pWriter, bool pBinary, bool pEncrypted, FbxIOFileHeaderInfo* pFileHeaderInfo = NULL);
+
+    /** Create a project. 
+      * \param pName
+      * \param pWriter
+      * \param pBinary
+      * \param pEncrypted
+      * \param pFileHeaderInfo
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectCreate(const char* pName, FbxWriter* pWriter, bool pBinary, bool pEncrypted, FbxIOFileHeaderInfo* pFileHeaderInfo = NULL);
+
+    /** Create a project. 
+      * \param pStream
+      * \param pStreamData
+      * \param pWriter
+      * \param pBinary
+      * \param pEncrypted
+      * \param pFileHeaderInfo
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectCreate(FbxStream* pStream, void* pStreamData, FbxWriter* pWriter, bool pBinary, bool pEncrypted, FbxIOFileHeaderInfo* pFileHeaderInfo = NULL);
+
+    /** Create a project without necessary an .fbx extension.
+      * \param pName
+      * \param pWriter
+      * \param pBinary
+      * \param pEncrypted
+      * \param pFileHeaderInfo
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectCreateDirect(const char* pName, FbxWriter* pWriter, bool pBinary, bool pEncrypted, FbxIOFileHeaderInfo* pFileHeaderInfo = NULL);
+
+    /** Create a project, without writing out the header (yet)
+      * \param pName
+      * \param pWriter
+      * \param pVersion
+      * \param pBinary
+      * \param pEncrypted
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectCreateEmpty(const char* pName, FbxWriter* pWriter, int pVersion, bool pBinary, bool pEncrypted);
+
+    /** Create a project, without writing out the header (yet)
+      * \param pStream
+      * \param pStreamData
+      * \param pWriter
+      * \param pVersion
+      * \param pBinary
+      * \param pEncrypted
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectCreateEmpty(FbxStream* pStream, void* pStreamData, FbxWriter* pWriter, int pVersion, bool pBinary, bool pEncrypted);
+
+    /** Write FBX signature at the top of the file, prepare file for writing header information 
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectWrite_BeginFileHeader();
+
+    /** Open up the 'extended header' 
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectWrite_BeginExtendedHeader();
+
+    /** Write the contents of the extended header 
+      * \param pExtendedHeader
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectWrite_WriteExtendedHeader(const FbxIOFileHeaderInfo* pExtendedHeader);
+
+    /** Close the extended header 
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectWrite_EndExtendedHeader();
+
+    /** Close up the header, prepare file for payload write. 
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectWrite_EndFileHeader();
+
+    /** Close the project. 
+      * \param pData
+      * \param pSize
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectClose(void** pData=0, size_t* pSize=0);
+
+    /** Provide the XRef Manager to use to create the .fbm folder. 
+     * \remarks If NULL is used, the old behavior (using the .fbx's folder) is used instead. 
+     */
+    void ProjectSetXRefManager(const FbxXRefManager*);
+
+    /** Get the XRef Manager to use. 
+     * \return NULL if no XRef manager has been set. 
+     */
+    const FbxXRefManager* ProjectGetXRefManager() const;
+
+    /** Select (and create) a folder to store embedded files (the .fbm 
+      *   file folder).  Takes into account the settings from the XRef Manager. 
+      * \param pXRefManager
+      * \param pCreatedFolder
+      * \param pUserDefinedFolder User defined "working folder"
+      * \return \c true on success, \c false otherwise.
+      * \remarks If this already been called successfully, uses the path
+      * previously created.
+      *  
+      * Client application is responsible for cleaning up this folder.
+      *  
+      * This will be automatically called if ProjectSetXRefManager()
+      * has been called before the .fbm folder needs to be created. 
+      */
+    bool ProjectCreateEmbeddedFolder(const FbxXRefManager& pXRefManager, FbxString& pCreatedFolder, const char* pUserDefinedFolder = NULL); 
+
+    /** On store event, use this function to tell if we are embedding. 
+      * \param pValue
+      */
+    void SetEmbedded(bool pValue);
+
+    /** Explicitly set the embedding extraction folder. If this is never called, the FBX SDK will determine the best folder to extract embedded files.
+      * \param pExtractionFolder The file path name where the embedded files should be extracted.
+      */
+    void SetEmbeddingExtractionFolder(const char* pExtractionFolder);
+
+    /** Retrieve the current folder destination where the embedded files will be extracted. This might not be initialized until file I/O is performed.
+      */
+    const char* GetEmbeddingExtractionFolder();
+
+    /** Check if file is embedded or not. 
+      * \return \c true if file is embedded, false otherwise.
+      */
+    bool IsEmbedded() const;
+
+    /** Check if file is binary or ASCII 
+      * \return \c true if file is binary, false otherwise.
+      */
+    bool IsBinary() const;
+
+    /** Return if binary file is encrypted 
+      * \return \c true if file is encrypted, false otherwise.
+      */
+    bool IsEncrypted () const;
+
+    /** Check CRC code. File must be open, binary and encrypted.
+    *   \return \c true if CRC code is valid or file is not open, binary and encrypted.
+    */
+    bool CheckCRC();
+
+    /** Return the file version number 
+      * \return the file version number
+      */
+    FbxUInt32 GetFileVersionNumber() const; 
+
+    /** Set the cache size for accelerated IO 
+    * \param pCacheSize cache size to set (Kilo Byte)
+    */
+    void CacheSize(FbxUInt32 pCacheSize);
+
+    /** Return the current cache size
+      * \return the current cache size
+      */
+    FbxUInt32 CacheSize() const; 
+
+    //@}
+
+    /**
+      * \name FBX 7 Format specific functions.
+
+	   The FBX 7 format can compress internal arrays to make the file smaller.
+       The writer may decide not to compress all arrays, or it may even decide
+       not to compress anyway.  Flags are written in the file to help the FBX7 reader
+       to know if a decompression is required, on a per-array basis.
+	   The following functions address specific topics of the FBX 7 file format.
+      */
+    //@{
+
+    //! \return Current state of the flag.
+    bool Fbx7Support() const;
+
+    /** Set the flag state to tell the parser to handle FBX7 files.
+      * \param pSupport New flag state.
+      */
+    void Fbx7Support(bool pSupport);
+
+    //! \return Current State of the flag.
+    bool CompressArrays() const;
+
+    /** Set the flag state. 
+      * \param pCompress New flag state.
+      */
+    void CompressArrays(bool pCompress);
+
+    //! \return Current compression minimum size.
+    int  CompressMinimumSize() const;
+
+    /** Set the compression minimum size.
+      * \param pSize Threshold at which compression may embark.
+      */
+    void CompressMinimumSize(int pSize);
+
+    //! \return Current compression level.
+    int  CompressLevel() const;
+
+    /** Set the compression level.
+      * \param pLevel Value of the desired compression.
+      * \remarks The allowed range for pLevel is [0-9] where 0 equals no compression and
+      * 9 is as-much-as-we-can.
+      */
+    void CompressLevel(int pLevel);
+    //@}
+
+    /**
+    * \name Project related functions used to navigate on particular
+	*       sections.
+    */
+    //@{
+
+    /** Open the main section of a project. 
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectOpenMainSection();
+
+    /** Get the number of extension sections of a project.
+      * \return the number of extension sections of a project.
+      */
+    int ProjectGetExtensionSectionCount() const;
+
+    /** Open an extension section of a project. 
+      * \param pExtensionSectionIndex
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectOpenExtensionSection(int pExtensionSectionIndex);
+
+    /** Create an extension section in a project, not allowed in ASCII and encrypted modes.
+      * \param pOverwriteLastExtensionSection
+      * \return \c true on success, \c false otherwise.
+      */
+    bool ProjectCreateExtensionSection(bool pOverwriteLastExtensionSection = false);
+
+    /** Close current section. 
+      */
+    void ProjectCloseSection();
+
+    /** Get current section. 
+      * \return the current section.
+      */
+    int ProjectGetCurrentSection() const;
+
+    /** Get current section mode. 
+      * \return the current section mode. 
+      */
+    int ProjectGetCurrentSectionMode() const;
+
+    /** Get current section version. 
+      * \return the current section version. 
+      */
+    int ProjectGetCurrentSectionVersion() const;
+
+    /** Get the version number of a section.
+    * \param pSection
+    * \return the version number of a section.
+    * \remarks For main section it can be either 1000, 2000, 2001, 3000, 3001, 4000, 4001 or 4050.
+    *  For the extension section it can be either 4000, 4001 or 4050.
+    *  Returns 0 if section number does not exist.
+    */
+    int ProjectGetSectionVersion(int pSection) const;
+
+    /** Split a version number into major, minor and revision numbers.
+    * \param pVersion Version number to split.
+    * \param pMajor Integer to receive major version number.
+    * \param pMinor Integer to receive minor version number.
+    * \param pRevision Integer to receive revision version number.
+    */
+    static void ProjectConvertVersionNumber(int pVersion, int& pMajor, int& pMinor, int& pRevision);
+
+    /** Check the password protection flag.
+    * \return \c true if the current section has a password, \c false otherwise.
+    */
+    bool IsPasswordProtected() const;
+
+    /** Set password protection flag to \c false if the argument matches the password stored in the section.
+    * \param pPassword
+    * \return \c true if the argument matches the password stored in the section, \c false otherwise.
+    * \remarks This function only works in read mode.
+    */
+    bool CheckPassword(const char* pPassword);
+
+    /** Encrypt and store password in a section.
+    * \param pPassword
+    * \return \c true on success, \c false otherwise.
+    * \remarks This function only works in write mode and out of any enclosing block.
+    * \remarks This function must not be called more than once per section.
+    */
+    bool WritePassword(const char* pPassword);
+
+    //@}
+
+    /**
+    * \name Directory related functions used to get or set file path information.
+    */
+    //@{
+
+    /** Get project file name. 
+      * \return project file name.
+      */
+    const char* GetFilename() const;
+
+    /** Get project data directory name. 
+      * \param pAutoCreate
+      * \return project data directory name.
+      */
+    FbxString GetDataDirectory(bool pAutoCreate = true);
+
+    /** Get the current embedded folder used by this object.  
+      * \param pCreate  Whether create the media or not if no such folder is found
+      * \param pUserDefinedFolder   User define working folder
+      * \return the current embedded folder used by this object.
+      * \remarks If ProjectCreateEmbeddedFolder has never been called this will
+      *  return an empty string, unless we're explicitly asked to
+      *  create it.
+      */
+    FbxString GetMediaDirectory(bool pCreate = false, const char* pUserDefinedFolder = NULL);
+
+    /** Get the full path of the directory to extract the template file. 
+      * \param pTemplateName
+      * \param pCreate
+      * \return the full path of the directory to extract the template file.
+      */
+    FbxString GetContainerTemplateDirectory(const char* pTemplateName, bool pCreate);
+
+    /** Get the path relative to project directory. 
+      * \param pPath
+      * \return the path relative to project directory.
+      */
+    char* GetRelativePath(const char* pPath);
+
+    /** Get the file path relative to project directory. 
+      * \param pFilePath
+      * \return the file path relative to project directory.
+      */
+    char* GetRelativeFilePath(const char* pFilePath);
+
+    /** Get the full path of path relative to project directory. 
+      * \param pRelativePath
+      * \return the full path of path relative to project directory.
+      */
+    char* GetFullPath(const char* pRelativePath);
+
+    /** Get the full file path of path relative to project directory. 
+      * \param pRelativeFilePath
+      * \return the full file path of path relative to project directory.
+      */
+    char* GetFullFilePath(const char* pRelativeFilePath);
+
+    /** Get the temporary project name. 
+      * \param pName
+      * \return the temporary project name.
+      */
+    char* GetTmpProjectName(const char* pName) const;
+
+    /** Swap from temporary project. 
+      * \param pName
+      * \param pError
+      * \param pErrorSize 
+      * \return \c true on success, \c false otherwise.
+      */
+    bool SwapFromTmpProject(const char* pName, char* pError=NULL, int pErrorSize=0);
+
+    //@}
+
+    /**
+    * \name Read related functions used to get information of a field or a group of fields.
+	*       Can be used to get the field content data or to navigate from field to field.
+    */
+    //@{
+
+    /** Reset the field read position. 
+      */
+    void FieldReadResetPosition();
+
+    /** Get the number of fields. 
+      * \return the number of fields.
+      */
+    int FieldGetCount() const;
+
+    /** Get the name of field indexed pFieldIndex. 
+      * \param pFieldIndex
+      * \return the name of field indexed pFieldIndex.
+      */
+    const char* FieldGetName(int pFieldIndex) const;
+
+    /** Get number of instance field pFieldName has. 
+      * \param pFieldName
+      * \return the number of instance field pFieldName has.
+      */
+    int FieldGetInstanceCount(const char* pFieldName) const;
+
+    /** Start to read field instance referred by field indexed pFieldIndex, instance indexed pInstance. 
+      * \param pFieldIndex
+      * \param pInstance
+      * \return \c true on success, \c false otherwise.
+      */
+    bool FieldReadBegin(int pFieldIndex, int pInstance);
+
+    /** Start to read field pFieldName. 
+      * \param pFieldName
+      * \return \c true on success, \c false otherwise.
+      */
+    bool FieldReadBegin(const char* pFieldName);
+
+    /** Start to read field instance referred field pFieldName, instance indexed pInstance. 
+      * \param pFieldName
+      * \param pInstance
+      * \return \c true on success, \c false otherwise.
+      */
+    bool FieldReadBegin(const char* pFieldName, int pInstance);
+
+    //! Stop to read the current field.
+    void FieldReadEnd();
+
+    //! Return if current field is a block.
+    bool FieldReadIsBlock();
+
+    //! Start to read a field block.
+    bool FieldReadBlockBegin();
+
+    //! Stop to read a field block.
+    void FieldReadBlockEnd();
+
+    //! Return the number of read field.
+    int FieldReadGetCount() const;
+
+    //! Return the number of field remaining to be read.
+    int FieldReadGetRemain() const;
+
+    //! Return current field value type.
+    char FieldReadGetType() const;
+
+    //! Return current field value as a char.
+    char FieldReadCH();
+
+    /** Return field pFieldName's value as a char. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    char FieldReadCH(const char* pFieldName, char pDefault=0);
+
+    //! Return current field value as a char pointer.
+    const char* FieldReadC();
+
+    /** Return field pFieldName's value as a char pointer. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    const char* FieldReadC(const char* pFieldName, const char* pDefault="");
+
+    //! Return current field value as a string (a char pointer).
+    const char* FieldReadS();
+
+    /** Return field pFieldName's value as a char pointer. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    const char* FieldReadS(const char* pFieldName, const char* pDefault="");
+
+    //! Return current field value as an bool.
+    bool FieldReadB();
+
+    /** Return field pFieldName's value as an integer. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    bool FieldReadB(const char* pFieldName, bool pDefault = false);
+
+    //! Return current field value as an integer.
+    int FieldReadI();
+
+    /** Return field pFieldName's value as an integer. 
+      * \param pFieldName
+      * \param pDefault
+      */int FieldReadI(const char* pFieldName, int pDefault=0);
+
+    //! Return current field value as an integer.
+    FbxLongLong FieldReadLL();
+
+    /** Return field pFieldName's value as an integer. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    FbxLongLong FieldReadLL(const char* pFieldName, FbxLongLong pDefault=0);
+
+    //! Return current field value as a float.
+    float FieldReadF();
+
+    /** Return field pFieldName's value as a float. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    float FieldReadF(const char* pFieldName, float pDefault=0);
+
+    //! Return current field value as a double.
+    double FieldReadD();
+
+    /** Return field pFieldName's value as a double. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    double FieldReadD(const char* pFieldName, double pDefault=0);
+
+    /** Return field pFieldName's value as a time value. 
+      * \param pFieldName
+      */
+    FbxTime FieldReadT(const char* pFieldName);
+
+    //! Return field pFieldName's value as a time value.
+    FbxTime FieldReadT();
+
+    /** Return field pFieldName's value as a timespan value. 
+      * \param pFieldName
+      */
+    FbxTimeSpan FieldReadTS(const char* pFieldName);
+
+    //! Return field pFieldName's value as a timespan value.
+    FbxTimeSpan FieldReadTS();
+
+    /** Return current field value as a n floats array. 
+      * \param pValue
+      * \param pn
+      */
+    void FieldReadFn(float* pValue, FbxUInt pn);
+
+    /** Return current field value as a 3 floats array. 
+      * \param pValue
+      */
+    void FieldRead3F(float* pValue);
+
+    /** Return current field value as a 4 floats array. 
+      * \param pValue
+      */
+    void FieldRead4F(float* pValue);
+
+    /** Return field pFieldName's value as n floats array. 
+      * \param pFieldName
+      * \param pValue
+      * \param pDefault
+      * \param pn
+      */
+    void FieldReadFn(const char* pFieldName, float* pValue, const float *pDefault, FbxUInt pn);
+
+    /** Return field pFieldName's value as 4 floats array. 
+      * \param pFieldName
+      * \param pValue
+      * \param pDefault
+      */
+    void FieldRead3F(const char* pFieldName, float* pValue, const float* pDefault=NULL);
+
+    /** Return field pFieldName's value as 3 floats array. 
+      * \param pFieldName
+      * \param pValue
+      * \param pDefault
+      */
+    void FieldRead4F(const char* pFieldName, float* pValue, const float* pDefault=NULL);
+
+    /** Return current field value as a n doubles array. 
+      * \param pValue
+      * \param pn
+      */
+    void FieldReadDn(double* pValue, FbxUInt pn);
+
+    /** Return current field value as a 3 doubles array. 
+      * \param pValue
+      */
+    void FieldRead3D(double* pValue);
+
+    /** Return current field value as a 4 doubles array. 
+      * \param pValue
+      */
+    void FieldRead4D(double* pValue);
+
+    /** Return field pFieldName's value as n doubles array. 
+      * \param pFieldName
+      * \param pValue
+      * \param pDefault
+      * \param pn
+      */
+    void FieldReadDn(const char* pFieldName, double* pValue, const double *pDefault, FbxUInt pn);
+
+    /** Return field pFieldName's value as 4 doubles array. 
+      * \param pFieldName
+      * \param pValue
+      * \param pDefault
+      */
+    void FieldRead3D(const char* pFieldName, double* pValue, const double* pDefault=NULL);
+
+    /** Return field pFieldName's value as 3 doubles array. 
+      * \param pFieldName
+      * \param pValue
+      * \param pDefault
+      */
+    void FieldRead4D(const char* pFieldName, double* pValue, const double* pDefault=NULL);
+
+    /** Return current field value as raw data. 
+      * \param pByteSize
+      */
+    void* FieldReadR(int* pByteSize);
+
+    /** Return field pFieldName's value as raw data. 
+      * \param pFieldName
+      * \param pByteSize
+      */
+    void* FieldReadR(const char* pFieldName,int* pByteSize);
+
+	/**
+	  * \name FBX SDK 2009.3 and later
+	  */
+	//@{
+    //! Return field pFieldName's value as byte.
+    FbxChar FieldReadByte();
+
+    /** Return field pFieldName's value as a byte value. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    FbxChar FieldReadByte(const char* pFieldName, FbxChar pDefault=0);
+
+    //! Return field pFieldName's value as unsigned byte.
+    FbxUChar FieldReadUByte();
+
+    /** Return field pFieldName's value as an unsigned byte value. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    FbxUChar FieldReadUByte(const char* pFieldName, FbxUChar pDefault=0);
+
+    //! Return field pFieldName's value as short.
+    FbxShort FieldReadShort();
+
+    /** Return field pFieldName's value as a short value. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    FbxShort FieldReadShort(const char* pFieldName, FbxShort pDefault=0);
+
+    //! Return field pFieldName's value as unsigned short.
+    FbxUShort FieldReadUShort();
+
+    /** Return field pFieldName's value as an unsigned short value. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    FbxUShort FieldReadUShort(const char* pFieldName, FbxUShort pDefault=0);
+
+	//! Return field pFieldName's value as unsigned integer.
+    unsigned int FieldReadUI();
+	
+    /** Return field pFieldName's value as an unsigned int as a value. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    unsigned int FieldReadUI(const char* pFieldName, unsigned int pDefault=0);
+
+    //! Return field pFieldName's value as 64 bit unsigned integer.
+    FbxULongLong FieldReadULL();
+
+    /** Return field pFieldName's value as an 64 bit unsigned int as a value. 
+      * \param pFieldName
+      * \param pDefault
+      */
+    FbxULongLong FieldReadULL(const char* pFieldName, FbxULongLong pDefault=0);
+
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const FbxChar*		FieldReadArraySBytes( int &pCount );
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const FbxShort*		FieldReadArrayShort	( int &pCount );
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const FbxUShort*		FieldReadArrayUShort( int &pCount );
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const unsigned int*	FieldReadArrayUI	( int &pCount );
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const FbxULongLong*	FieldReadArrayULL	( int &pCount );
+
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const FbxChar*        FieldReadArray(int &pCount, const FbxChar*);
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const FbxShort*		FieldReadArray(int &pCount, const FbxShort*);
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const FbxUShort*		FieldReadArray(int &pCount, const FbxUShort*);
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const unsigned int* FieldReadArray(int &pCount, const unsigned int*);
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+	const FbxULongLong*	FieldReadArray(int &pCount, const FbxULongLong*);
+	//@}
+
+    /** Read field and copy it into a file.
+    * \param pFileName Embedded file full path+name.
+    *\param pRelativeFileName Relative path+name of the embedded file.
+    * \param pEmbeddedMediaDirectory Directory of the embedded media.
+    * \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.
+    * \remarks Only works when file is binary. This function is not related to flag mEmbedded.
+    * \return \c false if operation failed.
+    */
+    virtual bool FieldReadEmbeddedFile (FbxString& pFileName, FbxString& pRelativeFileName, const char* pEmbeddedMediaDirectory = "", bool *pIsFileCreated=NULL);
+
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const double*   FieldReadArrayD( int &pCount );
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const float*    FieldReadArrayF( int &pCount );
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const int*      FieldReadArrayI( int &pCount );
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const FbxLongLong*FieldReadArrayLL(int &pCount );
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const bool*     FieldReadArrayB( int &pCount );
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const FbxUChar*   FieldReadArrayBytes( int &pCount );
+
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const int*    FieldReadArray(int& pCount, const int*);
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const float*  FieldReadArray(int& pCount, const float*);
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const double* FieldReadArray(int& pCount, const double*);
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const FbxLongLong* FieldReadArray(int& pCount, const FbxLongLong*);
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const bool* FieldReadArray(int& pCount, const bool*);
+    /** Read the whole array and return the pointer to it.
+      * \param pCount Nb of items in the array.
+      */
+    const FbxUChar* FieldReadArray(int& pCount, const FbxUChar*);
+
+    //@}
+
+    /**
+    * \name Write related functions used to write information of a field or a group of fields.
+	*       Can be used to write the field content data or to navigate from field to field.
+    */
+    //@{
+
+    /** Start to write a field called pFieldName. 
+      * \param pFieldName
+      */
+    void FieldWriteBegin(const char* pFieldName);
+
+    //! Stop to write the current field.
+    void FieldWriteEnd();
+
+    //! Start to write a field block.
+    void FieldWriteBlockBegin();
+
+    /** Start to write an object reference field. 
+      * \param pObjectType
+      * \param pName
+      * \param pSubType
+      */
+    void FieldWriteObjectBegin(const char* pObjectType, const char* pName, const char* pSubType=NULL);
+
+    //! Stop to write an object reference field.
+    void FieldWriteObjectEnd();
+
+    /** Start to write a field block in file pFileName. 
+      * \param pFileName
+      * \remarks This function is disabled but kept accessible for the FBX SDK.
+      */
+    void FieldWriteBlockBegin(const char* pFileName);
+
+    //! Stop to write a block of field.
+    void FieldWriteBlockEnd ();
+
+    /** Write field value as a char. 
+      * \param pValue
+      */
+    void FieldWriteCH(char pValue);
+
+    /** Write field pFieldName field with a char as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteCH(const char* pFieldName, char pValue);
+
+    /** Write field value as char pointer pValue. 
+      * \param pValue
+      */
+    void FieldWriteC(const char* pValue);
+
+    /** Write field pFieldName with a char pointer as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteC(const char* pFieldName, const char* pValue);
+
+    /** Write field value as FbxString pValue. 
+      * \param pValue
+      */
+    void FieldWriteS(const char* pValue);
+
+    /** Write field value as FbxString pValue. 
+      * \param pValue
+      */
+    void FieldWriteS(const FbxString& pValue);
+
+    /** Write field pFieldName field with a FbxString as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteS(const char* pFieldName, const char* pValue);
+
+    /** Write field pFieldName field with a FbxString as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteS(const char* pFieldName, const FbxString& pValue);
+
+    /** Write field value as bool. 
+      * \param pValue
+      */
+    void FieldWriteB(bool pValue);
+
+    /** Write field pFieldName field with a bool value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteB(const char* pFieldName, bool pValue);
+
+    /** Write field value as integer. 
+      * \param pValue
+      */
+    void FieldWriteI(int pValue);
+
+    /** Write field pFieldName field with an int as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteI(const char* pFieldName, int pValue);
+
+    /** Write field value as 64 bit integer. 
+      * \param pValue
+      */
+    void FieldWriteLL(FbxLongLong pValue);
+
+    /** Write field pFieldName field with an 64 bit int as a value.
+                     * \param pFieldName 
+                     * \param pValue
+                     */
+    void FieldWriteLL(const char* pFieldName, FbxLongLong pValue);
+
+    /** Write field value as float.
+    * \param pValue
+    * \remarks Only compatible with 1) MotionBuilder 4.0 and later 2) FBX SDK 3.6.1 and later.
+    */
+    void FieldWriteF(float pValue);
+
+    /** Write field pFieldName field with a float as a value.
+    * \param pFieldName
+    * \param pValue
+    * \remarks Only compatible with 1) MotionBuilder 4.0 and later 2) FBX SDK 3.6.1 and later.
+    */
+    void FieldWriteF(const char* pFieldName, float pValue);
+
+    /** Write field value as double. 
+      * \param pValue
+      */
+    void FieldWriteD(double  pValue);
+
+    /** Write field pFieldName field with a double as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteD(const char* pFieldName, double pValue);
+
+    /** Write field value as time value. 
+      * \param pTime
+      */
+    void FieldWriteT(FbxTime pTime);
+
+    /** Write field pFieldName field with a time as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteT(const char* pFieldName,FbxTime pValue);
+
+    /** Write field value as timespan value. 
+      * \param pTimeSpan
+      */
+    void FieldWriteTS(FbxTimeSpan pTimeSpan);
+
+    /** Write field pFieldName field with a timespan as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteTS(const char* pFieldName,FbxTimeSpan pValue);
+
+    /** Write field value as an array of n floats (nF vector). 
+      * \param pValue
+      * \param pn
+      */
+    void FieldWriteFn(const float* pValue, FbxUInt pn);
+
+    /** Write field pFieldName field with a array of n floats as a value. 
+      * \param pFieldName
+      * \param pValue
+      * \param pn
+      */
+    void FieldWriteFn(const char* pFieldName, const float* pValue, FbxUInt pn);
+
+    /** Write field value as an array of 3 floats (3F vector). 
+      * \param pValue
+      */
+    void FieldWrite3F(const float* pValue);
+
+    /** Write field pFieldName field with a array of 3 floats as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWrite3F(const char* pFieldName, const float* pValue);
+
+    /** Write field value as an array of 4 floats (4F vector). 
+      * \param pValue
+      */
+    void FieldWrite4F(const float* pValue);
+
+    /** Write field pFieldName field with a array of 4 floats as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWrite4F(const char* pFieldName, const float* pValue);
+
+    /** Write field value as an array of n doubles (nD vector). 
+      * \param pValue
+      * \param pn
+      */
+    void FieldWriteDn(const double* pValue, FbxUInt pn);
+
+    /** Write field pFieldName field with a array of n doubles as a value. 
+      * \param pFieldName
+      * \param pValue
+      * \param pn
+      */
+    void FieldWriteDn(const char* pFieldName, const double* pValue, FbxUInt pn);
+
+    /** Write field value as an array of 3 doubles (3D vector). 
+      * \param pValue
+      */
+    void FieldWrite3D(const double* pValue);
+
+    /** Write field pFieldName field with a array of 3 doubles as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWrite3D(const char* pFieldName, const double* pValue);
+
+    /** Write field value as an array of 4 doubles (4D vector). 
+      * \param pValue
+      */
+    void FieldWrite4D(const double* pValue);
+
+    /** Write field pFieldName field with a array of 4 doubles as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWrite4D(const char* pFieldName, const double* pValue);
+
+    // The maximum number of value entries is, in theory, 2**32.  In practice it should be a lot less than that.
+    // pSize is the number of values to write from each pointer location, and stride is how much we 
+    // advance to get to the next value; if the stride is zero, values are tighly packed together.
+    // So in total we'll write n * pSize items.
+
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+    void FieldWriteArrayD( int n, const double*     pValue, int pSize = 1, int pStride = 0 );
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+    void FieldWriteArrayF( int n, const float*      pValue, int pSize = 1, int pStride = 0 );
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+    void FieldWriteArrayI( int n, const int*        pValue, int pSize = 1, int pStride = 0 );
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+    void FieldWriteArrayLL(int n, const FbxLongLong*  pValue, int pSize = 1, int pStride = 0 );
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+    void FieldWriteArrayB( int n, const bool*       pValue, int pSize = 1, int pStride = 0 );
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+    void FieldWriteArrayBytes( int n, const FbxUChar* pValue, int pSize = 1, int pStride = 0 );
+
+    /** Write field value as a raw data. 
+      * \param pRawData
+      * \param pByteSize
+      */
+    void FieldWriteR(const void* pRawData, int pByteSize);
+
+    /** Write field pFieldName field with raw data as a value. 
+      * \param pFieldName
+      * \param pRawData
+      * \param pByteSize
+      */
+    void FieldWriteR(const char* pFieldName, const void* pRawData, int pByteSize);
+
+	/**
+	  * \name FBX SDK 2009.3 and later
+	  */
+	//@{
+
+    /** Write field value as byte. 
+      * \param pValue
+      */
+    void FieldWriteByte(FbxChar pValue);
+
+    /** Write field pFieldName field with a byte value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteByte(const char* pFieldName, FbxChar pValue);
+
+    /** Write field value as unsigned byte. 
+      * \param pValue
+      */
+    void FieldWriteUByte(FbxUChar pValue);
+
+    /** Write field pFieldName field with an unsigned byte value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteUByte(const char* pFieldName, FbxUChar pValue);
+
+    /** Write field value as short. 
+      * \param pValue
+      */
+    void FieldWriteShort(FbxShort pValue);
+
+    /** Write field pFieldName field with a short value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteShort(const char* pFieldName, FbxShort pValue);
+
+    /** Write field value as unsigned short. 
+      * \param pValue
+      */
+    void FieldWriteUShort(FbxUShort pValue);
+
+    /** Write field pFieldName field with an unsigned short value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteUShort(const char* pFieldName, FbxUShort pValue);
+
+    /** Write field value as an unsigned integer. 
+      * \param pValue
+      */
+    void FieldWriteUI(unsigned int pValue);
+
+    /** Write field pFieldName field with an unsigned int as a value. 
+      * \param pFieldName
+      * \param pValue
+      */
+    void FieldWriteUI(const char* pFieldName, unsigned int pValue);
+
+    /** Write field value as 64 bit unsigned integer. 
+      * \param pValue
+      */
+    void FieldWriteULL(FbxULongLong pValue);
+
+    /** Write field pFieldName field with an 64 bit unsigned int as a value. 
+      * \param pFieldName
+      * \param pValue
+      * \return void
+      */
+    void FieldWriteULL(const char* pFieldName, FbxULongLong pValue);
+
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+	void FieldWriteArraySBytes( int n, const FbxChar* pValue, int pSize = 1, int pStride = 0 );
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+	void FieldWriteArrayShort( int n, const FbxShort* pValue, int pSize = 1, int pStride = 0 );
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+	void FieldWriteArrayUShort( int n, const FbxUShort* pValue, int pSize = 1, int pStride = 0 );
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+    void FieldWriteArrayUI( int n, const unsigned int*        pValue, int pSize = 1, int pStride = 0 );
+    /** Write array to file.
+      * \param n Nb of items in the array.
+      * \param pValue Pointer to the data.
+      * \param pSize Size of each item in the array.
+      * \param pStride Array stride.
+      */
+    void FieldWriteArrayULL(int n, const FbxULongLong*  pValue, int pSize = 1, int pStride = 0 );
+	//@}
+
+    /** ASCII files may limit how big you can write your raw data, forcing you to break it down into chunks. 
+      * \return int
+      */
+    int GetFieldRMaxChunkSize() const;
+
+    /** Write object reference pName in the current field. 
+      * \param pName
+      */
+    void FieldWriteObjectReference(const char* pName);
+
+    /** Write object reference pName in field pFieldName. 
+      * \param pFieldName
+      * \param pName
+      */
+    void FieldWriteObjectReference(const char* pFieldName, const char* pName);
+
+    /** Write field with file content as a value.
+    * \param pFileName
+    * \param pRelativeFileName
+    * \remarks Only works when file is binary. This function is not related to flag mEmbedded.
+    * \return \c false if operation failed.
+    */
+    bool FieldWriteEmbeddedFile (FbxString pFileName, FbxString pRelativeFileName);
+
+    /** Write comments, only effective in ASCII mode. 
+      * \param pFieldName
+      */
+    void WriteComments(const char* pFieldName);
+
+    //@}
+
+#ifdef _DEBUG
+    // Dump function for debugging purpose only
+    void StdoutDump();
+#endif
+
+	/** Get if the embedded file is currently loaded
+	* \return true if loaded, false otherwise
+	* \remarks  An embedded file is a file like a JPEG image used for texture or an AVI file for video.
+	*           When files are embedded, the size of the FBX file can be very large since other files are embedded in it.
+	*           FBX Version 6 and lower cannot embed files when saved in ASCII.
+	*			FBX Version 7 and over can embed files even when saved in ASCII mode.
+	*/
+    bool GetHaveLoadedEmbededFile() const;
+
+	/** Get the maximum byte count written
+	* \param pMemPtr The address of the memory file
+	* \param[out] pSize Stores the maximum byte count written
+	*/
+    void GetMemoryFileInfo(void** pMemPtr, size_t& pSize) const;
+
+	/** Get a internal flag to manage pre FBX version 6 data format
+	*   Used for backwards compatibility
+	*/
+    bool    IsBeforeVersion6() const;
+
+	/** Set a internal flag to manage pre FBX version 6 data format
+	*   Used for backwards compatibility
+	*/
+    void    SetIsBeforeVersion6(bool pIsBeforeVersion6);
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    bool ProjectOpen (FbxFile * pFile, FbxReader* pReader, bool pCheckCRC = false, bool pOpenMainSection = true, FbxIOFileHeaderInfo* pFileHeaderInfo = NULL);
+	FbxStatus& GetStatus() { return mStatus; }
+
+private:
+    // to resolve warning C4512: 'class' : assignment operator could not be generated
+    FbxIO& operator=(const FbxIO& pOther);
+
+    FbxStatus& mStatus;
+
+    struct InternalImpl;
+	struct InternalImpl32;
+	struct InternalImpl64;
+    InternalImpl* mImpl;
+
+    //! Project Global
+
+    void ProjectClear();
+    void ProjectReset();
+
+    bool ProjectReadHeader(bool pCheckASCIIHeader, bool pCheckCRC, bool pOpenMainSection, FbxIOFileHeaderInfo* pFileHeaderInfo);
+    bool ProjectReadExtendedHeader(FbxInt64& pExtendedHeaderEnd, FbxIOFileHeaderInfo* pFileHeaderInfo);
+    bool BinaryReadHeader();
+    bool BinaryReadSectionPosition();
+    bool ASCIIReadHeader();
+    bool ASCIIReadSectionPosition();
+
+    bool ProjectWriteHeader(FbxIOFileHeaderInfo* pFileHeaderInfo);
+    bool ProjectWriteExtendedHeader(FbxIOFileHeaderInfo* pFileHeaderInfo);
+    void BinaryWriteHeader();
+    void ASCIIWriteHeader();
+
+    void ReadEncryptionKey(char* pEncryptionKey);
+    void WriteEncryptionKey(char* pEncryptionKey);
+
+    //! Project Section
+
+    bool ProjectClearSection();
+    bool ProjectOpenSection(int pSection);
+    bool BinaryReadSectionHeader();
+    FbxInt64 BinaryReadSectionFooter(unsigned char* pSourceCheck);
+    bool BinaryReadExtensionCode(FbxInt64 pFollowingSectionStart, FbxInt64& pSectionStart, FbxUInt32& pSectionVersion);
+    void BinaryReadSectionPassword();
+
+    bool ProjectWriteSectionHeader();
+    void BinaryWriteSectionFooter();
+    bool BinaryWriteExtensionCode(FbxInt64 pSectionStart, FbxUInt32 pSectionVersion);
+
+    FbxString GetCreationTime() const;
+    void SetCreationTime(FbxString pCreationTime);
+    void CreateSourceCheck(unsigned char* lSourceCheck);
+    bool TestSourceCheck(unsigned char* pSourceCheck, unsigned char* pSourceCompany);
+    FbxString GetMangledCreationTime();
+    void EncryptSourceCheck(unsigned char* pSourceCheck, unsigned char* pEncryptionData);
+    void DecryptSourceCheck(unsigned char* pSourceCheck, const unsigned char* pEncryptionData);
+
+    void EncryptPasswordV1(FbxString pOriginalPassword, FbxString &pEncryptedPassword);
+    void DecryptPasswordV1(FbxString pEncryptedPassword, FbxString &pDecryptedPassword);
+
+    //! Read
+
+    void CheckValidityOfFieldName(const char* pFieldName);
+    void GetUnusedEmbeddedName(const FbxString& pDirectory, const FbxString& pName, FbxString& pResult, bool pCreateSubdirectory);
+
+    //! Get project media directory name
+    FbxString GetDirectory(bool pAutoCreate, const char* pExtension);
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_FBX_IO_H_ */

+ 256 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxreaderfbx5.h

@@ -0,0 +1,256 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxreaderfbx5.h
+#ifndef _FBXSDK_FILEIO_FBX_READER_FBX5_H_
+#define _FBXSDK_FILEIO_FBX_READER_FBX5_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxAnimLayer;
+class Fbx5ObjectTypeInfo;	
+
+FbxReader* CreateFBXReader(FbxManager& pManager, 
+							FbxImporter& pImporter,
+							int pID,
+                            FbxStatus& pStatus);
+void GetInfoFBXReader(int* pCount, 
+					  const char* * pExtensions, 
+					  const char* * pDescriptions);
+
+class FbxReaderFbx5 : public FbxReader
+{
+public:
+	FbxReaderFbx5(FbxManager& pManager, FbxImporter& pImporter, int pID, FbxStatus& pStatus);
+	virtual ~FbxReaderFbx5();
+
+    virtual bool FileOpen(char* pFileName, bool pIgnoredArg);
+    virtual bool FileOpen(char* pFileName, EFileOpenSpecialFlags pFlags){ return FbxReader::FileOpen(pFileName, pFlags); }
+	virtual bool FileOpen(char* pFileName);
+    virtual bool FileOpen(FbxFile * pFile);
+	virtual bool FileOpen(FbxStream * pStream, void* pStreamData);
+	virtual bool FileClose();
+	virtual bool IsFileOpen();
+
+	virtual void SetEmbeddingExtractionFolder(const char* pExtractFolder);
+
+	typedef enum 
+	{
+		eASCII,
+		eBINARY,
+		eENCRYPTED
+	} EImportMode;
+
+	EImportMode GetImportMode();
+	virtual void GetVersion(int& pMajor, int& pMinor, int& pRevision);
+
+	virtual bool GetReadOptions(bool pParseFileAsNeeded = true);
+	virtual bool Read(FbxDocument* pDocument);
+
+	virtual bool GetReadOptions(FbxIO* pFbx, bool pParseFileAsNeeded = true);
+	virtual bool Read(FbxScene& pScene, FbxIO* pFbx);
+
+    virtual FbxDocumentInfo* GetSceneInfo() { return mSceneInfo; }
+    virtual FbxArray<FbxTakeInfo*>* GetTakeInfo() { return &mTakeInfo; }
+
+	virtual bool SupportsStreams() const { return true; }
+
+private:
+	void ReadOptionsInMainSection();
+	void ReadTakeOptions();
+	bool ReadOptionsInExtensionSection(int& pSectionIndex);
+	void ReadOptionsInGenericSection();
+	bool WriteOptionsInExtensionSection(bool pOverwriteLastExtensionSection=false);
+	bool WriteThumbnail(FbxThumbnail*);
+	FbxDocumentInfo* ReadSceneInfo();
+	FbxDocumentInfo* ReadSceneInfo(FbxString& pType);
+	void WriteSceneInfo(FbxDocumentInfo*);
+	void SetIsBeforeVersion6WithMainSection(bool pOpenMainSection);
+	
+	bool ReadDefinitionSection(FbxScene& pScene, FbxArray<Fbx5ObjectTypeInfo*>& pObjectContent);
+	bool ReadObjectSection(FbxScene& pScene, FbxArray<Fbx5ObjectTypeInfo*>& pObjectContent);
+	bool ReadObject(FbxScene& pScene, FbxString& pObjectType, FbxString& pObjectSubType, FbxString& pObjectName, FbxString& pObjectUniqueId);
+	bool ReadNode();
+	//bool ReadGenericNode(FbxScene& pScene);
+	bool ReadAnimation(FbxScene& pScene);
+	bool ReadTakeAnimation(FbxScene& pScene, FbxTakeInfo* pTakeInfo);
+	FbxThumbnail* ReadThumbnail();
+	bool ReadNodeAnimation(FbxIO& pFileObject, FbxScene& pScene, FbxTakeInfo* pTakeInfo);	
+	bool TimeShiftNodeAnimation(FbxScene& pScene, FbxTakeInfo* pTakeInfo);
+    bool ReadHierarchy(FbxNode& pRootNode);
+	bool ResolveHierarchy(FbxNode& pRootNode);
+	bool ResolveLinks(FbxNode& pRootNode, FbxNode& pCurrentNode);
+	bool ResolveTargets(FbxNode& pRootNode);
+	bool ResolveUpNodes(FbxNode& pRootNode);
+	bool ResolveCameraBackgrounds(FbxScene& pScene);
+	void RemoveDuplicateTextures(FbxScene& pScene);
+	void RemoveDuplicateMaterials(FbxScene& pScene);
+
+	void ReadPose(FbxScene& pScene);
+	bool ReadPose(FbxScene& pScene, FbxPose* pPose, bool pAsBindPose);
+
+	void ReadCameraSwitcher(FbxScene& pScene);
+	void ReorderCameraSwitcherIndices(FbxScene& pScene);
+
+    void ReadGobo(FbxScene& pScene);
+    void ReadGoboSection(FbxScene& pScene);
+	void ReadGobo(FbxGobo& pGobo);
+
+    void ReadCharacter(FbxScene& pScene);
+	void ReadCharacter(FbxCharacter& pCharacter,int& pInputType, int& pInputIndex);
+	void ReadCharacterLinkGroup(FbxCharacter& pCharacter, int pCharacterGroupId);
+	void ReadCharacterLink(FbxCharacter& pCharacter, int pCharacterNodeId);
+	void ReadCharacterLinkRotationSpace(FbxCharacterLink& pCharacterLink);
+	void ReadFilterSet(FbxCharacter& pCharacter);
+	void ReadControlSet(FbxControlSet& pControlSet);
+	void ReadControlSetLinkGroup(FbxControlSet& pControlSet, int pCharacterGroupId);
+	void ReadControlSetLink(FbxControlSet& pControlSet, int pCharacterNodeId);
+	void ReadEffector(FbxControlSet& pControlSet);	
+	void ReadEffectorAux(FbxControlSet& pControlSet);
+
+	int  ReadCharacterPose(FbxScene& pScene);
+	bool ReadCharacterPose(FbxCharacterPose& pCharacterPose);
+
+	void ReadGlobalLightSettings(FbxScene& pScene);
+    void ReadShadowPlane(FbxScene& pScene);
+    void ReadAmbientColor(FbxScene& pScene);
+    void ReadFogOption(FbxScene& pScene);
+
+	void ReadGlobalCameraAndTimeSettings(FbxScene& pScene); // for pre v6 files
+	void ReadGlobalTimeSettings(FbxScene& pScene);
+
+	void ReadGlobalCameraSettings(FbxScene& pScene);
+
+    bool ReadMedia(FbxScene& pScene, const char* pEmbeddedMediaDirectory = "");
+	FbxString ReadMediaClip(const char* pEmbeddedMediaDirectory);
+
+	bool ReadNode                       ( FbxNode& pNode );
+	bool ReadGenericNode                ( FbxGenericNode& pNode );
+	bool ReadNodeChildrenName           ( FbxNode& pNode );
+	bool ReadNodeShading                ( FbxNode& pNode );
+	bool ReadNodeCullingType            ( FbxNode& pNode );
+	bool ReadNodeLimits                 ( FbxNode& pNode );
+	bool ReadNodeTarget                 ( FbxNode& pNode );
+	bool ReadNodeAttribute              ( FbxNode& pNode );
+	bool ReadNodePivots                 ( FbxNode& pNode );
+	bool ReadNodeDefaultAttributes      ( FbxNode& pNode );
+	bool ReadNodeProperties				( FbxNode& pNode );
+	bool ReadGeometry                   ( FbxGeometry& pGeometry );
+	bool ReadGeometryMaterial           ( FbxGeometry& pGeometry );
+	bool ReadGeometryTexture            ( FbxGeometry& pGeometry );
+	bool ReadGeometryLinks              ( FbxGeometry& pGeometry );
+	bool ReadGeometryShapes             ( FbxGeometry& pGeometry );
+	bool ReadGeometryLayer              ( FbxGeometry& pGeometry );
+	bool ReadGeometryTextureLayer       ( FbxGeometry& pGeometry, int pLayerIndex );
+
+	bool ReadNull                       ( FbxNull& pNull );
+
+	bool ReadMarker                     ( FbxMarker& pMarker );
+
+	bool ReadCamera                     ( FbxCamera& pCamera );
+	bool ReadCameraSwitcher             ( FbxCameraSwitcher& pCameraSwitcher );
+
+	bool ReadLight                      ( FbxLight& pLight );
+
+	bool ReadMesh                       ( FbxMesh& pMesh );
+	bool ReadMeshVertices               ( FbxMesh& pMesh );
+	bool ReadMeshNormals                ( FbxMesh& pMesh );
+	bool ReadMeshAssignation            ( FbxMesh& pMesh );
+	bool ReadMeshPolygonIndex           ( FbxMesh& pMesh );
+	bool ReadMeshPolyGroupIndex         ( FbxMesh& pMesh );
+	bool ReadMeshMaterialsID            ( FbxMesh& pMesh );
+	bool ReadMeshTexturesID             ( FbxMesh& pMesh );
+	bool ReadMeshTextureType            ( FbxMesh& pMesh );
+	bool ReadMeshTextureUV              ( FbxMesh& pMesh );
+	bool ReadMeshTextureIndex           ( FbxMesh& pMesh );
+	bool ReadMeshVertexColors           ( FbxMesh& pMesh );
+
+
+	// Layer elements	
+	bool ReadLayerElements				(FbxGeometry& pGeometry);
+	bool ReadLayerElementsMaterial		(FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsMaterial);	
+	bool ReadLayerElementsNormal		(FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsNormal);
+	bool ReadLayerElementsVertexColor	(FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsVertexColor);
+	bool ReadLayerElementsTexture		(FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsTexture);
+	bool ReadLayerElementsUV			(FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsUV);
+	bool ReadLayerElementsPolygonGroup	(FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsPolygonGroup);
+	
+	bool ReadNurb                       ( FbxNurbs& pNurbs );
+
+	bool ReadPatch                      ( FbxPatch& pPatch );
+	int ReadPatchType                  ( FbxPatch& pPatch );
+
+	bool ReadTexture(FbxFileTexture& pTexture);
+	bool ReadSurfaceMaterial(FbxSurfacePhong& pMaterial);
+	bool ReadLink(FbxCluster& pLink);
+	bool ReadSkin(FbxSkin& pSkin);
+	bool ReadCluster(FbxCluster& pCluster);
+	bool ReadShape(FbxShape& pShape, FbxGeometry& pGeometry);
+	bool ReadVideo(FbxVideo& pVideo);
+	bool ReadConstraint(FbxConstraint& pPosition);
+
+	bool ReadUserProperties					(FbxNode& pNode);
+	bool ReadProperties(FbxObject *pObject);
+
+	//
+	// 6.0 Format specific
+	//
+	bool ReadConnectionSection();
+	void ReadPoses(FbxScene& pScene);
+
+	FbxString ConvertCameraName(FbxString pCameraName);
+
+	bool GenerateParametricGeometryLayer(FbxGeometry& pGeometry);
+	void CorrectTextureLayers(FbxMesh& pMesh);
+
+    void TransferAnimation(void* pRootCurveNode, FbxProperty& pRootProperty, bool pValueOnly = false);
+    void ReadAnimation(FbxIO& pFileObject, void* pCurveNode);
+	void ReadAnimation(FbxIO& pFileObject, FbxObject*  pObj);
+    
+    void ReadTimeWarps(FbxIO& pFileObject, FbxMultiMap& pTimeWarpSet);
+	void DestroyTimeWarps(FbxMultiMap& pTimeWarpSet);
+
+	FbxNode* FindNode (char* pName);
+	int FindString(FbxString pString, FbxArray<FbxString*>& pStringArray);
+	FbxString FindFile(FbxString pFullFilePath, FbxString pRelativeFilePath = "");
+
+	bool ReadPassword(FbxString pPassword);
+
+	void ReadSceneGenericPersistenceSection(FbxScene& pScene);	
+
+
+
+
+private:
+    FbxReaderFbx5& operator=(FbxReaderFbx5 const&) { return *this; }
+
+    FbxIO*			mFileObject;	
+	FbxImporter&	mImporter;
+
+	FbxCharPtrSet mNodeArrayName;
+	FbxCharPtrSet mTargetArrayName;
+	FbxCharPtrSet mUpNodeArrayName;
+	FbxCharPtrSet mCameraBackgroundArrayName;
+
+	FbxObjectStringMap		mObjectMap;
+    FbxArray<FbxTakeInfo *> mTakeInfo;
+    FbxDocumentInfo * mSceneInfo;
+    FbxAnimLayer* mAnimLayer;
+
+	// Temporary storage
+	FbxArray<FbxTexture*> mTemporaryTextures;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_FBX_READER_FBX5_H_ */

+ 1102 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxreaderfbx6.h

@@ -0,0 +1,1102 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxreaderfbx6.h
+#ifndef _FBXSDK_FILEIO_FBX_READER_FBX6_H_
+#define _FBXSDK_FILEIO_FBX_READER_FBX6_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxAnimStack;
+class FbxAnimLayer;
+class Fbx6ObjectTypeInfo;
+class Fbx6TypeReadReferences;
+
+
+/**	\brief Helper class to merge Class root property templates.
+  * Add class id and object to the template and search object by
+  * class id.
+  */
+class Fbx6ClassTemplateMap
+{
+public:
+
+    /** Constructor
+      *	
+      */
+    Fbx6ClassTemplateMap();
+
+    /** Destructor
+      *	
+      */
+    ~Fbx6ClassTemplateMap();
+
+    // Fbx6ClassTemplateMap will own this template object.
+
+    /** Add the template object to template map
+      *	\param pId              Class Id
+      * \param pTemplateObject  template object
+      * \return if the object is successfully added return \c true, otherwise return \c false.
+      */
+    bool AddClassId( FbxClassId pId, FbxObject* pTemplateObject );
+
+    /** Merge the properties of FbxObject with the object with the same class id
+      *	\param pObject          The FbxObject to merge
+      * \return if the object is merged return \c true, otherwise return \c false.
+      */
+    bool MergeWithTemplate( FbxObject* pObject ) const;
+
+    /** Delete all FbxObject in template map
+      *	
+      */
+    void Clear();
+
+private:
+    typedef FbxMap< FbxClassId, FbxObject*, FbxClassIdCompare > MapType;
+    MapType mClassMap;
+
+    /** Whether the property is modified
+      *	\param lProp        The property to check
+      * \return If the property has been modified return \c true, otherwise return \c false
+      */
+    bool HasModifiedFlags(FbxProperty lProp) const;
+    inline FbxPropertyFlags::EFlags IndexToFlag( int i ) const { return static_cast<FbxPropertyFlags::EFlags>(1 << i); }
+};
+
+
+
+/**	\brief This class is the FBX v6 reader.
+* The reader provide you the ability to read the global settings, objects and animation information from file.
+*
+*/
+class FbxReaderFbx6 : public FbxReader
+{
+public:
+
+    /** Constructor
+      *	\param pManager        the FbxManager Object
+      * \param pImporter       the FbxImporter to import the SDK objects
+      * \param pID             id for current reader
+      * \param pStatus         the FbxStatus object to hold error codes
+      */
+    FbxReaderFbx6(FbxManager& pManager, FbxImporter& pImporter, int pID, FbxStatus& pStatus);
+
+    /** Destructor
+      *
+      */
+    virtual ~FbxReaderFbx6();
+
+    /** Open file with certain EFileOpenSpecialFlags
+      * \param pFileName     name of the File to open
+      * \param pFlags        the EFileOpenSpecialFlags to open with
+      * \return if the file is open successfully return true, otherwise return false
+      */
+    virtual bool FileOpen(char* pFileName, EFileOpenSpecialFlags pFlags);
+
+    /** Open file with default flag
+      *	\param pFileName     name of the File to open
+      * \return if the file is open successfully return \c true, otherwise return \c false
+      */
+    virtual bool FileOpen(char* pFileName);
+
+    /** Open file with FbxFile handle
+      *	\param pFile        the FbxFile handle
+      * \return if the file is open successfully return \c true, otherwise return \c false
+      */
+    virtual bool FileOpen(FbxFile * pFile);
+
+    /** Open file from stream
+      */
+	virtual bool FileOpen(FbxStream * pStream, void* pStreamData);
+
+    /** Close the file stream
+      * \return if the file is closed successfully return \c true, otherwise return \c false
+      */
+    virtual bool FileClose();
+
+    /** Check whether the file stream is open.
+      *	\return if the file stream is open return \c true, otherwise return \c false.
+      */
+    virtual bool IsFileOpen();
+
+    /** \enum EImportMode File import mode.
+      *
+      */
+    typedef enum
+    {
+        eASCII,     /**< Plain text mode */
+        eBINARY,    /**< Binary mode */
+        eENCRYPTED  /**< Encrypted mode */
+    } EImportMode;
+
+    /** Get current Import mode
+      *	\return return the EImportMode value
+      */
+    EImportMode GetImportMode();
+
+    /** Get file version
+      *	\param pMajor       Major version
+      *	\param pMinor       Minor version
+      *	\param pRevision    Revision version
+      */
+    virtual void GetVersion(int& pMajor, int& pMinor, int& pRevision);
+
+    /** Get axis system information from file
+      *	\param pAxisSystem      axis system in file
+      * \param pSystemUnits     system unit in file
+      * \return if either pAxisSystem or pSystemUnits is \c NULL return \c false, otherwise return \c true.
+      */
+    virtual bool GetAxisInfo(FbxAxisSystem* pAxisSystem, FbxSystemUnit* pSystemUnits);
+
+	/** Get FBX file time mode read from GlobalSettings in FBX 6.n and FBX 7.n
+	  *	\param pTimeMode  ref to a FbxTime::EMode enum
+	  *	\return     \c true on success, \c false otherwise.
+	  *	\remarks    This function must be called after FbxImporter::Initialize().
+	  *             Can be used for statistics (via GlobalSettings) before loading the whole scene from the file.
+	  */
+	virtual bool GetFrameRate(FbxTime::EMode &pTimeMode);	
+
+    /** Get the statistics from file
+      *	\param pStats statistics in file
+      *	\return if fetching statistics is successfully return \c true, otherwise return \c false.
+      */
+    virtual bool GetStatistics(FbxStatistics* pStats);
+
+    /** Get the file stream options
+      *	\param pParseFileAsNeeded       Whether to parse file as read options
+      * \return true on success, otherwise return false.
+      */
+    virtual bool GetReadOptions(bool pParseFileAsNeeded = true);
+
+
+    /** Read file with stream options
+      *	\param pDocument        FbxDocument to store the file data
+      *	\return if fetching statistics is successful return \c true, otherwise return \c false.
+      */
+    virtual bool Read(FbxDocument *pDocument);
+
+    /** Get the file options
+      * \param pFbx                     file object to read options
+      *	\param pParseFileAsNeeded       Whether to parse file as read options
+      * \return true on success, otherwise return false.
+      */
+    virtual bool GetReadOptions(FbxIO* pFbx, bool pParseFileAsNeeded = true);
+
+
+    /** Read file with stream options
+      *	\param pDocument        FbxDocument to store the file data
+      * \param pFbx             file object to read from
+      *	\return if reading the file is successful return \c true, otherwise return \c false.
+      */
+    virtual bool Read(FbxDocument *pDocument, FbxIO* pFbx);
+
+
+    /** Read all the properties and flags
+      *	\param pParams        settings to assign properties and flags
+      */
+	virtual void PluginReadParameters(FbxObject& pParams);
+
+    /** Returns the scene info from the file.
+      * \return The pointer to file scene info defined by this reader.
+      */
+    virtual FbxDocumentInfo*  GetSceneInfo() { return mSceneInfo; }
+
+
+    /** Returns the pointer to the list of TakeInfo from the file.
+      * \return NULL
+      */
+    virtual FbxArray<FbxTakeInfo*>* GetTakeInfo() { return &mTakeInfo; }
+
+    /** Pass a progress handler to the reader
+      * \param pProgress     FbxProgress to store the progress information.
+      */
+    virtual void SetProgressHandler(FbxProgress *pProgress);
+
+	virtual void SetEmbeddingExtractionFolder(const char* pExtractFolder);
+
+	virtual bool SupportsStreams() const { return true; }
+
+private:
+
+    /** Read scene information
+      *	\return A pointer of document info. Return \c NULL if any error exist
+      */
+    FbxDocumentInfo* ReadSceneInfo();
+
+    /** Read scene information by type
+      *	\param pType        the type to read
+      * \return A pointer of document info. Return \c NULL if any error exist
+      */
+    FbxDocumentInfo* ReadSceneInfo(FbxString& pType);
+
+    /** Write scene information
+      *	
+      */
+    void WriteSceneInfo(FbxDocumentInfo*);
+
+    /** Write thumbnail
+      *	
+      */
+    bool WriteThumbnail(FbxThumbnail*);
+
+    /**
+      * \name FBX File sections
+      */
+    //@{
+
+    /** Create generic object and connect with FbxIO document
+      *	\param pDocument      FbxDocument to connect with the generic object 
+      * \param pObjectType    type of generic object 
+      * \param pObjectSubType Subtype of generic object
+      * \param pObjectName    Name of generic object
+      * \param pFlags         Object flag
+      * \return A pointer of the generic object. Return \c NULL if creation fails.
+      */
+    FbxObject* CreateGenericObject(FbxDocument *pDocument, char* pObjectType, char* pObjectSubType, char* pObjectName, FbxObject::EObjectFlag pFlags=FbxObject::eSavable);
+
+    /** Read description section and assign the document name
+      *	\param pDocument        Document to read
+      * \param pDocumentName    Document name to assign
+      *	\return if reading description section is successful return \c true, otherwise return \c false.
+      */
+    bool ReadDescriptionSection(FbxDocument *pDocument, FbxString& pDocumentName);
+
+    /** Read reference section and fill the external references
+      *	\param pDocument        Document to read
+      * \param pDocReferences   External references to fill
+      *	\return if reading reference section is successful return \c true, otherwise return \c false.
+      */
+    bool ReadReferenceSection(FbxDocument *pDocument, Fbx6TypeReadReferences& pDocReferences);
+
+    /** Read definition section and fill object type info array
+      *	\param pDocument        Document to read
+      * \param pObjectContent   Object type info array to fill
+      *	\return if reading definition section is successful return \c true, otherwise return \c false.
+      */
+    bool ReadDefinitionSection(FbxDocument *pDocument, FbxArray<Fbx6ObjectTypeInfo*>& pObjectContent );
+
+    /** Read object section and fill object type info array and external reference
+      *	\param pDocument        Document to read
+      * \param pObjectContent   Object type info array to fill
+      * \param pDocReferences   External references to fill
+      *	\return if reading object section is successful return \c true, otherwise return \c false.
+      */
+    bool ReadObjectSection(FbxDocument *pDocument, FbxArray<Fbx6ObjectTypeInfo*>& pObjectContent, Fbx6TypeReadReferences& pDocReferences );
+
+    /** Read object information from document
+      *	\param pDocument            Document to read
+      * \param pObjectType          Object type to assign
+      * \param pObjectSubType       Object subtype to assign
+      * \param pObjectName          Object Name
+      * \param pObjectUniqueId      Object unique id
+      * \param pReferencedObject    Reference object
+      * \param pDocReferences       External reference
+      *	\return if reading object is successful return \c true, otherwise return \c false.      
+      */
+    bool ReadObject(FbxDocument *pDocument, FbxString& pObjectType, FbxString& pObjectSubType, FbxString& pObjectName, FbxString& pObjectUniqueId, FbxObject* pReferencedObject, Fbx6TypeReadReferences& pDocReferences);
+
+    /** Read the connection section from document
+      *	\param pDocument        Document to read
+      *	\return if reading connection section is successful return \c true, otherwise return \c false.
+      */
+    bool ReadConnectionSection(FbxDocument *pDocument );
+    //@}
+
+    /**
+      * \name Takes and animation
+      */
+    //@{
+    
+    /** Read animation from document
+      *	\param pDocument        Document to read
+      *	\return if reading animation is successful return \c true, otherwise return \c false.
+      */
+    bool ReadDocumentAnimation(FbxDocument *pDocument);
+
+    /** Read object animation from file object
+      *	\param pFileObject      File object handle
+      * \param pNode            Fill this node with animation
+      * \param pAnimStack       Animation stack to read from
+      * \param pExceptionFlag   Exception flag
+      */
+    void ReadObjectAnimation(FbxIO& pFileObject, FbxObject* pNode, FbxAnimStack& pAnimStack, int pExceptionFlag);
+
+    /** Read property animation from file object
+      *	\param pFileObject      File object handle
+      * \param pProp            Fill the property with animation
+      * \param pAnimStack       Animation stack to read from
+      */
+    void ReadPropertyAnimation(FbxIO& pFileObject, FbxProperty* pProp, FbxAnimStack& pAnimStack);
+
+    /** Read take animation from fbx scene
+      *	\param pScene           Scene to read animation
+      * \param pTakeInfo        Take info to read from
+      * \remarks This function will allocate the corresponding FbxAnimStack with the base animation layer.
+      */
+    bool ReadTakeAnimation(FbxScene& pScene, FbxTakeInfo* pTakeInfo);
+
+    /** Read node animation from file
+      * \param pFileObject      File object to read
+      *	\param pScene           Scene to read animation
+      * \param pAnimStack       The animation stack to read from
+      * \param pTakeInfo        Take info to read from
+      */
+    bool ReadNodeAnimation(FbxIO& pFileObject, FbxScene& pScene, FbxAnimStack& pAnimStack, FbxTakeInfo* pTakeInfo);
+
+
+    /** Read layer information from file
+      *	\param pFileObject      File object to read
+      * \param pTakeInfo        Take info to read from
+      */
+    void ReadLayers(FbxIO& pFileObject, FbxTakeInfo* pTakeInfo);
+
+    /** Read time warps from file
+      *	\param pFileObject      File object to read
+      * \param pTimeWarpSet     Time warp set to fill
+	  *	\param pScene           Scene holding the time warp curves.
+      */
+    void ReadTimeWarps(FbxIO& pFileObject, FbxMultiMap& pTimeWarpSet, FbxScene& pScene);
+
+    /** Read thumbnail
+      *	\return A pointer of thumbnail. Return \c NULL if any error exist
+      */
+    FbxThumbnail* ReadThumbnail();
+
+    /** Set time shift for node animation from take information
+      * \param pScene           Scene to read
+      *	\param pAnimStack       The animation stack to modify
+      * \param pTimeOffsetType  A value from the FbxTakeInfo::EImportOffsetType enumeration that indicates the time shift offset type
+      * \param pTimeOffset      The time shift offset
+      * \return if time shifting is successful return \c true, otherwise return \c false.
+      */
+    bool TimeShiftNodeAnimation(FbxScene& pScene, FbxAnimStack& pAnimStack, int pTimeOffsetType, FbxTime pTimeOffset);
+    //@}
+
+    /**
+      * \name Camera switcher
+      */
+    //@{
+
+    /** Read camera switcher from scene
+      *	\param pScene       Scene to read from
+      */
+    void ReadCameraSwitcher(FbxScene& pScene);
+
+    /** Fill camera switcher object with data
+      *	\param pCameraSwitcher    Camera switcher to fill  
+      */
+    bool ReadCameraSwitcher( FbxCameraSwitcher& pCameraSwitcher );
+
+    /** Reorder camera switcher indices in the scene
+      *	\param  pScene          Scene to read from
+      */
+    void ReorderCameraSwitcherIndices(FbxScene& pScene);
+    //@}
+
+    /**
+      * \name Global parameters
+      */
+    //@{
+
+    /** Read global light settings from scene
+      *	\param  pScene          Scene to read from
+      */
+    void ReadGlobalLightSettings(FbxScene& pScene);
+
+    /** Read global time settings from scene
+      *	\param  pScene          Scene to read from
+      */
+    void ReadGlobalTimeSettings(FbxScene& pScene);
+
+    /** Read global camera settings from scene
+      *	\param  pScene          Scene to read from
+      */
+    void ReadGlobalCameraSettings(FbxScene& pScene);
+
+    /** Read shadow plane from scene
+      *	\param  pScene          Scene to read from
+      */
+    void ReadShadowPlane(FbxScene& pScene);
+
+    /** Read ambient color from scene
+      *	\param  pScene          Scene to read from
+      */
+    void ReadAmbientColor(FbxScene& pScene);
+
+    /** Read fog option from scene
+      *	\param  pScene          Scene to read from
+      */
+    void ReadFogOption(FbxScene& pScene);
+    //@}
+
+    /**
+      * \name Character
+      */
+    //@{
+
+    /** Read character information from file
+      *	\param pCharacter       Character object to fill
+      *	\param pInputType       Unused.
+      *	\param pInputIndex      Unused.
+      */
+    void ReadCharacter(FbxCharacter& pCharacter,int& pInputType, int& pInputIndex);
+
+    /** Read character link group information from file by group id
+      *	\param pCharacter           Character object to fill
+      * \param pCharacterGroupId    Group id to read character link
+      */
+    void ReadCharacterLinkGroup(FbxCharacter& pCharacter, int pCharacterGroupId);
+
+    /** Read character link information from file by node id
+      *	\param pCharacter           Character object to fill
+      * \param pCharacterNodeId     Character node id
+      */
+    void ReadCharacterLink(FbxCharacter& pCharacter, int pCharacterNodeId);
+
+    /** Read character link formation in rotation space
+      *	\param pCharacterLink       Character link object to fill
+      */
+    void ReadCharacterLinkRotationSpace(FbxCharacterLink& pCharacterLink);
+
+    /** Read character pose from file
+      *	\param pCharacterPose       Character pose to fill
+      * \return if reading character pose is successful return \c true, otherwise return \c false.
+      */
+    bool ReadCharacterPose(FbxCharacterPose& pCharacterPose); // TBV
+    //@}
+
+    /**
+      * \name Misc
+      */
+    //@{
+		/** Read pose object from scene
+		  *	\param pScene               Scene to read from
+		  * \param pPose                Pose object
+		  * \param pAsBindPose          whether to treat the pose as BindPose
+		  * \return if reading pose is successful return \c true, otherwise return \c false.
+		  */
+		bool ReadPose(FbxScene& pScene, FbxPose* pPose, bool pAsBindPose);
+
+		/** Read media data from document
+		  *	\param pDocument                Document to read from
+		  * \param pEmbeddedMediaDirectory  the directory path storing the embedded media
+		  * \return if reading media is successful return \c true, otherwise return \c false.
+		  */
+		bool ReadMedia(FbxDocument *pDocument, const char* pEmbeddedMediaDirectory = "");
+
+		/** Read global settings from file
+		  *	\param pGlobalSettings          global settings object to fill
+		  * \return if reading global settings is successful return \c true, otherwise return \c false.
+		  */
+		bool ReadGlobalSettings(FbxGlobalSettings& pGlobalSettings);
+    //@}
+
+    /**
+    * \name Objects
+    */
+    //@{
+
+    /** Read node data from file
+      *	\param pNode            Node object to fill data
+      * \param pObjectSubType   Subtype of object
+      * \param pDocReferences   External reference
+      * \return if reading node data is successful return \c true, otherwise return \c false.
+      */
+    bool ReadNode                       ( FbxNode& pNode, FbxString& pObjectSubType, Fbx6TypeReadReferences& pDocReferences );
+
+    /** Read properties and flags for fbx container
+      *	\param pContainer           container to fill data
+      * \return if reading data to container is successful return \c true, otherwise return \c false.
+      */
+	bool ReadContainer					( FbxContainer& pContainer );
+
+    /** Read properties and flags for fbx generic node
+      *	\param pNode                generic node to fill data
+      * \return if reading data to generic node is successful return \c true, otherwise return \c false.
+      */
+    bool ReadGenericNode                ( FbxGenericNode& pNode );
+
+    /** Read shading information of node
+      *	\param pNode                fbx node to fill shading information
+      * \return if reading shading information to node is successful return \c true, otherwise return \c false.
+      */
+    bool ReadNodeShading                ( FbxNode& pNode );
+
+    /** Read back-face culling type for node
+      *	\param pNode                fbx node
+      * \return if reading culling type to node is successful return \c true, otherwise return \c false.
+      */
+    bool ReadNodeCullingType            ( FbxNode& pNode ); // TBV, probablement passe tout en property
+
+    /** Read target transform for node
+      *	\param pNode                fbx node
+      * \return if reading target transform to node is successful return \c true, otherwise return \c false.
+      */
+    bool ReadNodeTarget                 ( FbxNode& pNode );
+
+    /** Read node attribute according to object subtype
+      *	\param pNode                fbx node
+      * \param pObjectSubType       object subtype
+      * \param pCreatedAttribute    set to true if attribute exists
+      * \param pDocReferences       external reference to search
+      * \return if reading node attribute is successful return \c true, otherwise return \c false.
+      */
+    bool ReadNodeAttribute              ( FbxNode& pNode , FbxString& pObjectSubType, bool& pCreatedAttribute, Fbx6TypeReadReferences& pDocReferences);
+
+    /** Read node attribute according to object subtype
+      * \param pObjectSubType       object subtype
+      * \param pObjectName          object name
+      * \param pObjectUniqueId      unique id of object
+      * \param pReferencedObject    pointer of reference object
+      * \return A pointer of node attribute. Return \c NULL if the attribute does not exist
+      */
+    FbxNodeAttribute* ReadNodeAttribute( FbxString& pObjectSubType, FbxString& pObjectName, FbxString& pObjectUniqueId, FbxObject* pReferencedObject);
+
+    /** Read node properties , flags and update the 
+      * node pivot and limits according to properties
+      *	\param pNode                            FBX node
+      * \param pReadNodeAttributeProperties     whether to 
+      * \return if reading node properties is successful return \c true, otherwise return \c false.
+      */
+    bool ReadNodeProperties             ( FbxNode& pNode, bool pReadNodeAttributeProperties );
+
+    /** Read layered texture from file
+      *	\param pTex                             Layered texture to fill
+      * \return if reading layered texture is successful return \c true, otherwise return \c false.
+      */
+    bool ReadLayeredTexture             ( FbxLayeredTexture& pTex );
+
+    /** Read FBX links for geometry
+      * \param pGeometry                        FBX geometry
+      * \return if reading geometry links is successful return \c true, otherwise return \c false.
+      */
+    bool ReadGeometryLinks              ( FbxGeometry& pGeometry );
+
+    /** Read FBX shapes for geometry
+      *	\param pGeometry                        FBX geometry
+      * \return if reading geometry shapes is successful return \c true, otherwise return \c false.
+      */
+    bool ReadGeometryShapes             ( FbxGeometry& pGeometry );
+
+    /** Read the null node from file
+      *	\param pNull                            Null node
+      * \return if reading null node is successful return \c true, otherwise return \c false.      
+      */
+    bool ReadNull                       ( FbxNull& pNull );
+
+    /** Read the marker node from file
+      *	\param pMarker                            Marker node
+      * \return if reading marker node is successful return \c true, otherwise return \c false.      
+      */
+    bool ReadMarker                     ( FbxMarker& pMarker );
+
+    /** Read the camera node from file
+      *	\param pCamera                            Camera node
+      * \return if reading camera node is successful return \c true, otherwise return \c false.      
+      */
+    bool ReadCamera                     ( FbxCamera& pCamera );
+
+    /** Read the stereo camera node from file
+    *	\param pCameraStereo                            Stereo camera node
+    * \return if reading stereo camera node is successful return \c true, otherwise return \c false.      
+    */
+    bool ReadCameraStereo               ( FbxCameraStereo& pCameraStereo );
+
+    /** Read the precomp file from binary file
+    *	\param pCameraStereo                            Stereo camera node
+    * \return if reading precomp file is successful return \c true, otherwise return \c false.      
+    */
+    bool ReadCameraStereoPrecomp        (FbxCameraStereo& pCameraStereo);
+
+    /** Read the light node from file
+      *	\param pLight                            light node
+      * \return if reading light node is successful return \c true, otherwise return \c false.      
+      */
+    bool ReadLight                      ( FbxLight& pLight );
+
+    /** Read the binding table node from file.
+      * Create all the binding table entries and fill with embedded data
+      *	\param pTable                            binding table
+      * \return if reading binding table is successful return \c true, otherwise return \c false.      
+      */
+    bool ReadBindingTable               ( FbxBindingTable& pTable );
+
+    /** Read the binding operator from file
+      *	\param pOperator                         binding operator
+      * \return if reading binding operator is successful return \c true, otherwise return \c false.      
+      */
+    bool ReadBindingOperator            ( FbxBindingOperator& pOperator );
+
+    /** Read vertices, polygon indices, edges, layer elements, geometry links and shapes to mesh object
+      *	\param pMesh                            fbx mesh
+      * \return if reading mesh object is successful return \c true, otherwise return \c false. 
+      */
+    bool ReadMesh                       ( FbxMesh& pMesh );
+
+    /** Read mesh smoothness factor from mesh
+      * \param pMesh                            fbx mesh
+      * \return if reading mesh smoothness is successful return \c true, otherwise return \c false. 
+      */
+    bool ReadMeshSmoothness               ( FbxMesh& pMesh );
+
+    /** Read vertices of mesh object
+      *	\param pMesh                            fbx mesh
+      * \return if reading mesh vertices is successful return \c true, otherwise return \c false. 
+      */
+    bool ReadMeshVertices               ( FbxMesh& pMesh );
+
+    /** Read polygon indices of mesh object
+      *	\param pMesh                            fbx mesh
+      * \return if reading polygon indices is successful return \c true, otherwise return \c false. 
+      */
+    bool ReadMeshPolygonIndex           ( FbxMesh& pMesh );
+
+    /** Read edges of mesh object
+      *	\param pMesh                            fbx mesh
+      * \return if reading mesh edges is successful return \c true, otherwise return \c false. 
+      */
+    bool ReadMeshEdges                  ( FbxMesh& pMesh );
+
+    //** Read FBX subdiv, base mesh, finest mesh, current subdiv level...
+    //*	\param pSubdiv                            fbx subdiv
+    //*	\param pObjectName                        Object Name
+    //*	\param pReferencedObject                  pointer of reference object
+    //* \return if reading subdiv object is successful return \c true, otherwise return \c false. 
+    //*/
+    //bool ReadSubdiv( FbxSubDiv& pSubdiv, FbxString& pObjectName, FbxObject* pReferencedObject);
+
+    /** Read FBX subdiv, base mesh, finest mesh, current subdiv level...
+    *	\param pSubdiv                            fbx subdiv
+    * \return if reading subdiv object is successful return \c true, otherwise return \c false. 
+    */
+    bool ReadSubdiv( FbxSubDiv& pSubdiv);
+
+    /** Read properties and flags for fbx document
+      *	\param pSubDocument                     fbx document
+      * \return if reading document information is successful return \c true, otherwise return \c false.
+      */
+    bool ReadDocument                   ( FbxDocument& pSubDocument );
+
+    /** Read properties and flags for fbx collection
+      *	\param pCollection                      fbx collection
+      * \return if reading fbx collection is successful return \c true, otherwise return \c false.
+      */
+    bool ReadCollection                 ( FbxCollection& pCollection );
+
+    /** Read properties and flags for fbx selection set
+    *	\param pSelectionSet                    fbx selection set
+    * \return if reading fbx selection set is successful return \c true, otherwise return \c false.
+    */
+    bool ReadSelectionSet                ( FbxSelectionSet& pSelectionSet);
+
+    bool ReadSelectionNode             (FbxSelectionNode& pSelectionNode);
+
+    /** Read nurb data including surface types, nurb type, display type, steps, control points and UV.
+      *	\param pNurbs                            Nurb object
+      * \return if reading nurb data is successful return \c true, otherwise return \c false.
+      */
+    bool ReadNurb                       ( FbxNurbs& pNurbs );
+
+    /** Read nurb surface data including surface types, surface type, display type, steps, control points and UV vectors.
+      *	\param pNurbs                            Nurb surface object
+      * \return if reading nurb surface data is successful return \c true, otherwise return \c false.
+      */
+    bool ReadNurbsSurface               ( FbxNurbsSurface& pNurbs );
+
+    /** Read patch data including patch type, dimension, display type, steps, UV cap and control points.
+      *	\param pPatch                           Patch object
+      * \return if reading patch data is successful return \c true, otherwise return \c false.      
+      */
+    bool ReadPatch                      ( FbxPatch& pPatch );
+
+    /** Read patch type in string and return type in enum
+      *	\param pPatch                           Patch object
+      * \return patch type in enum      
+      */
+    int  ReadPatchType                  ( FbxPatch& pPatch );
+
+
+    /** Read nurb curve data including types, dimension, rational-ness, control points and knots.
+      *	\param pNurbsCurve                      Nurb curve
+      * \return if reading nurb curve data is successful return \c true, otherwise return \c false.  
+      */
+    bool ReadNurbsCurve                 ( FbxNurbsCurve& pNurbsCurve );
+
+    /** Read trim Nurb surface objects with properties
+      *	\param pNurbs                            Trim nurb surface                * \return if reading trim nurb surface is successful return \c true, otherwise return \c false.                 
+      */
+    bool ReadTrimNurbsSurface           ( FbxTrimNurbsSurface& pNurbs );
+
+    /** Read properties and flags of fbx boundary
+      *	\param pBoundary                        Fbx boundary object
+      * \return if reading fbx boundary is successful return \c true, otherwise return \c false.   
+      */
+    bool ReadBoundary                   ( FbxBoundary& pBoundary );
+
+    /** Read shape object properties from file
+      *	\param pShape                           Fbx Shape
+      * \param pGeometry                        Geometry contains the shape
+      * \return if reading shape object properties is successful return \c true, otherwise return \c false.   
+      */
+    bool ReadShape                      ( FbxShape& pShape, FbxGeometry& pGeometry);
+
+    /** Read properties and flags of fbx implementation
+      *	\param pImplementation                  Fbx implementation
+      * \return if reading fbx implementation is successful return \c true, otherwise return \c false.  
+      */
+    bool ReadImplementation             ( FbxImplementation& pImplementation );
+
+    /** Read texture object data including name, UV transform, alpha and cropping.
+      *	\param pTexture                         Fbx texture object
+      * \return if reading texture object is successful return \c true, otherwise return \c false.  
+      */
+    bool ReadFileTexture                    (FbxFileTexture& pTexture);
+
+    /** Read surface material from file
+      *	\param pName                Material Name
+      * \param pMaterialType        Material type
+      * \param pReferencedMaterial  Reference material to clone from if it is not \c NULL
+      * \return A pointer of read surface material
+      */
+    FbxSurfaceMaterial* ReadSurfaceMaterial(const char* pName, const char* pMaterialType, FbxSurfaceMaterial* pReferencedMaterial);
+
+    /** Read video object from file
+      *	\param pVideo               Fbx video object
+      * \return if reading video object is successful return \c true, otherwise return \c false.  
+      */
+    bool ReadVideo                      (FbxVideo& pVideo);
+
+    /** Read thumbnail object from file
+      *	\param pThumbnail           Fbx thumbnail
+      * \return if reading thumbnail is successful return \c true, otherwise return \c false.  
+      */
+    bool ReadThumbnail                  (FbxThumbnail& pThumbnail);
+    //@}
+
+
+    /**
+    * \name Layer elements
+    */
+    //@{
+
+    /** Read all layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \return if reading all layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElements              (FbxGeometry& pGeometry);
+
+    /** Read material layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsMaterial        material layer element array
+      * \return if reading material layer elements is successful return \c true, otherwise return \c false.
+      */
+    bool ReadLayerElementsMaterial      (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsMaterial);
+
+    /** Read normal layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsNormal          normal layer element array
+      * \return if reading normal layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsNormal        (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsNormal);
+
+    /** Read Tangent layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsTangent          Tangent layer element array
+      * \return if reading Tangent layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsTangent        (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsTangent); 
+
+    /** Read Binormal layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsBinormal          Binormal layer element array
+      * \return if reading Binormal layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsBinormal        (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsBinormal);
+
+    /** Read vertex color layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsVertexColor     vertex color layer element array
+      * \return if reading vertex color layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsVertexColor   (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsVertexColor);
+
+    /** Read texture layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsTexture         texture layer element array
+      * \param pTextureType             the type of elements to read
+      * \return if reading texture layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsTexture (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsTexture, FbxLayerElement::EType pTextureType);
+
+    /** Read UV layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsUV              UV layer element array
+      * \param pTextureType             the type of elements to read
+      * \return if reading UV layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsChannelUV (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsUV, FbxLayerElement::EType pTextureType);
+
+    /** Read polygon group layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsPolygonGroup    polygon group layer element array
+      * \return if reading polygon group layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsPolygonGroup  (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsPolygonGroup);
+
+    /** Read smoothing layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsSmoothing       Smoothing group layer element array
+      * \return if reading smoothing layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsSmoothing     (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsSmoothing);
+
+    /** Read user data layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsUserData        User data layer element array
+      * \return if reading user data layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsUserData      (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsUserData);
+
+    /** Read visibility layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsVisibility      visibility layer element array
+      * \return if reading visibility layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementsVisibility    (FbxGeometry* pGeometry, FbxArray<FbxLayerElement*>& pElementsVisibility);
+
+    /** Read edge crease layer elements for geometry
+      *	\param pGeometry                geometry to fill
+      * \param pElementsEdgeCrease      edge crease layer element array
+      * \return if reading edge crease layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementEdgeCrease     (FbxGeometry*pGeometry, FbxArray<FbxLayerElement*>& pElementsEdgeCrease);
+
+    /** Read vertex crease layer elements for geometry
+      * \param pGeometry                geometry to fill
+      * \param pElementsVertexCrease    vertex crease layer element array
+      * \return if reading vertex crease layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementVertexCrease   (FbxGeometry*pGeometry, FbxArray<FbxLayerElement*>& pElementsVertexCrease);
+
+    /** Read hole layer elements for geometry
+      * \param pGeometry                geometry to fill
+      * \param pElementsHole            hole layer element array
+      * \return if reading hole layer elements is successful return \c true, otherwise return \c false.        
+      */
+    bool ReadLayerElementHole           (FbxGeometry*pGeometry, FbxArray<FbxLayerElement*>& pElementsHole);
+    //@}
+
+    /**
+    * \name Geometry weighted maps
+    */
+    //@{
+
+    /** Read geometry weight map from file
+      *	\param pGeometryWeightedMap     geometry weighted
+      * \return if reading geometry weight map is successful return \c true, otherwise return \c false.
+      */
+    bool ReadGeometryWeightedMap(FbxGeometryWeightedMap& pGeometryWeightedMap);
+    //@}
+
+    /**
+    * \name Deformers / Constraints
+    */
+    //@{
+
+    /** Read link object from file
+      *	\param pLink            fbx link object
+      * \return if reading link object is successful return \c true, otherwise return \c false.
+      */
+    bool ReadLink(FbxCluster& pLink);
+
+    /** Read SDK skin from file
+      *	\param pSkin            SDK skin object
+      * \return if reading skin object is successful return \c true, otherwise return \c false.
+      */
+    bool ReadSkin(FbxSkin& pSkin);
+
+    /** Read properties and flags for vertex cache deformer from file
+      *	\param pDeformer            fbx vertex cache deformer
+      * \return if reading vertex cache deformer is successful return \c true, otherwise return \c false.
+      */
+    bool ReadVertexCacheDeformer(FbxVertexCacheDeformer& pDeformer);
+
+    /** Read cluster object data from file
+      *	\param pCluster            fbx cluster object
+      * \return if reading cluster object is successful return \c true, otherwise return \c false.
+      */
+    bool ReadCluster(FbxCluster& pCluster);
+
+    /** Read constraint object from file
+      *	\param pPosition            fbx constraint object
+      * \return if reading constraint object is successful return \c true, otherwise return \c false.
+      */
+    bool ReadConstraint(FbxConstraint& pPosition);
+    //@}
+
+    // Cache
+
+    /** Read fbx cache file
+      *	\param pCache       fbx cache
+      * \return if reading cache data is successful return \c true, otherwise return \c false.
+      */
+    bool ReadCache(FbxCache& pCache);
+
+    /**
+    * \name Post-processing / utility functions
+    */
+    //@{
+
+	/** Make sure the Camera's background textures are properly connected
+	  * \param pScene			fbx scene
+	  * \remarks This function only applies when it detects older file versions in 
+	  * which the background texture is connected directly to the object instead of
+	  * the corresponding property.
+	 */
+	bool ResolveCameraBackgrounds(FbxScene& pScene);
+
+    /** Remove duplicate textures in the same scene
+      *	\param pScene           fbx scene
+      */
+    void RemoveDuplicateTextures(FbxScene& pScene);
+
+    /** Replace textures in the geometry
+      *	\param pTextureDuplicate    texture array
+      * \param pTextureReplacement  texture array to replace
+      * \param pGeometry            geometry owns these textures
+      * \param pTextureType         layer element type
+      */
+    void ReplaceTextures(FbxArray<FbxTexture*> const& pTextureDuplicate,
+                         FbxArray<FbxTexture*> const& pTextureReplacement,
+                         FbxGeometry* pGeometry, FbxLayerElement::EType pTextureType);
+
+    /** Remove duplicated materials in the same scene
+      *	\param pScene       FBX scene
+      */    
+    void RemoveDuplicateMaterials(FbxScene& pScene);
+
+    /** convert camera name for naming convention
+      *	\param pCameraName  original camera name
+      * \return new name for the camera
+      */
+    FbxString ConvertCameraName(FbxString pCameraName);
+
+    /** Search string in a string array
+      *	\param pString      the string to search
+      * \param pStringArray string array
+      * \return return the index of the array if the string is found, otherwise return \c -1
+      */
+    int  FindString(FbxString pString, FbxArray<FbxString*>& pStringArray);
+
+    /** Read password from string
+      *	\param pPassword        password in string
+      * \return if the password is valid return \c true, otherwise return \c false
+      */
+    bool ReadPassword(FbxString pPassword);
+
+    /** Publish properties
+      *	\param pObject      fbx object
+      */
+    void PublishProperties(FbxObject& pObject);
+
+    /** Read properties for fbx object from file object
+      *	\param pFbxObject                   fbx object
+      * \param pFbxFileObject               fbx file object
+      * \param pReadNodeAttributeProperties whether to read properties for node attributes
+      */
+    bool ReadProperties(FbxObject *pFbxObject, FbxIO *pFbxFileObject, bool pReadNodeAttributeProperties=true);
+
+
+    /** Read properties and flags for fbx object from file object
+      *	\param pFbxObject                   fbx object
+      * \param pFbxFileObject               fbx file object
+      * \param pReadNodeAttributeProperties whether to read properties for node attributes
+      * \return if reading properties and flags is successful return \c true, otherwise return \c false.
+      */
+    bool ReadPropertiesAndFlags(FbxObject *pFbxObject, FbxIO *pFbxFileObject, bool pReadNodeAttributeProperties=true);
+
+    /** Read flags for fbx object from file object
+      *	\param pFbxObject               object to set flags
+      * \param pFbxFileObject           file to read
+      * \return if reading flags is successful return \c true, otherwise return \c false.  
+      */
+    bool ReadFlags(FbxObject *pFbxObject, FbxIO* pFbxFileObject);
+
+    /** Rebuild trim regions indices from the boundary connections
+      *	\param pScene           Fbx scene
+      */
+    void RebuildTrimRegions(FbxScene& pScene) const;
+
+    /** Rebuild subdivision object from subdiv-mesh connections
+    *	\param pScene           Fbx scene
+    */
+    void SetSubdivision(FbxScene& pScene) const;
+
+	/** Convert shape deform property to DeformPercent property of FbxBlendShapeChannel
+	*	\param pScene           Fbx scene
+	*/
+	void ConvertShapeDeformProperty(FbxScene& pScene) const;
+
+    /** Rebuild layered texture alphas from sub texture connections.
+      *	\param pScene           Fbx scene
+      */
+    void RebuildLayeredTextureAlphas(FbxScene& pScene) const;
+
+    //---------------- in progress -------------------------------
+    void ReadOptionsInMainSection();
+    void ReadTakeOptions();
+    bool ReadOptionsInExtensionSection(int& pSectionIndex);
+    bool WriteOptionsInExtensionSection(bool pOverwriteLastExtensionSection=false); 
+    //--------------- end in progress ----------------------------
+
+    /** Read global settings, axis system, system unit from main section of file
+      *
+      */
+    void ReadGlobalSettingsInMainSection();
+
+    /** Read statistic data from definition section 
+      *	
+      */
+    void ReadDefinitionSectionForStats();
+    //@}
+
+private:
+
+    FbxReaderFbx6& operator=(FbxReaderFbx6 const&) { return *this; }
+
+    FbxIO*                  mFileObject;
+    FbxImporter&            mImporter;
+    FbxCharPtrSet           mNodeArrayName;
+    FbxObjectStringMap      mObjectMap;
+
+    bool					mParseGlobalSettings;
+    FbxAxisSystem			mAxisSystem;
+    FbxSystemUnit			mSystemUnit;
+	FbxTime::EMode			mFrameRate;
+
+    bool					mRetrieveStats;
+    FbxStatistics*	        mDefinitionsStatistics;
+    FbxArray<FbxTakeInfo *> mTakeInfo;
+    FbxDocumentInfo*        mSceneInfo;
+    FbxAnimLayer*           mAnimLayer;
+	FbxMultiMap					mNickToKFCurveNodeTimeWarpsSet;
+	FbxMultiMap*					mNickToAnimCurveTimeWarpsSet;
+
+    Fbx6ClassTemplateMap    mClassTemplateMap;
+    FbxProgress*            mProgress;
+    bool                    mProgressPause;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_FBX_READER_FBX6_H_ */

+ 180 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxreaderfbx7.h

@@ -0,0 +1,180 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxreaderfbx7.h
+#ifndef _FBXSDK_FILEIO_FBX_READER_FBX7_H_
+#define _FBXSDK_FILEIO_FBX_READER_FBX7_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+struct FbxReaderFbx7_Impl;
+
+/**	\brief This class is the FBX v7 reader.
+* The reader provide you the ability to read the global settings, objects and animation information from file.
+*
+*/
+class FbxReaderFbx7 : public FbxReader
+{
+public:
+    /** \enum EImportMode File import mode.
+    *
+    */
+    typedef enum
+    {
+        eASCII,     /**< Plain text mode */
+        eBINARY,    /**< Binary mode */
+        eENCRYPTED  /**< Encrypted mode */
+    } EImportMode;
+
+    /** Constructor
+      *	\param pManager        the FbxManager Object
+      * \param pImporter       the FbxImporter to import the SDK objects
+      * \param pID             id for current reader
+      * \param pStatus         the FbxStatus object to hold error codes
+      */
+    FbxReaderFbx7(FbxManager& pManager, FbxImporter& pImporter, int pID, FbxStatus& pStatus);
+
+    /** Destructor
+      *
+      */
+    virtual ~FbxReaderFbx7();
+
+    /** Open file with certain EFileOpenSpecialFlags
+      * \param pFileName     name of the File to open
+      * \param pFlags        the EFileOpenSpecialFlags to open with
+      * \return if the file is open successfully return true, otherwise return false
+      */
+    virtual bool FileOpen(char* pFileName, EFileOpenSpecialFlags pFlags);
+
+    /** Open file with default flag
+      *	\param pFileName     name of the File to open
+      * \return if the file is open successfully return \c true, otherwise return \c false
+      */
+    virtual bool FileOpen(char* pFileName);
+
+    /** Open file with default flag
+      */
+    virtual bool FileOpen(FbxFile* pFile);
+
+    /** Open file from stream
+      */
+	virtual bool FileOpen(FbxStream * pStream, void* pStreamData);
+
+    /** Close the file stream
+      * \return if the file is closed successfully return \c true, otherwise return \c false
+      */
+    virtual bool FileClose();
+
+    /** Check whether the file stream is open.
+      *	\return if the file stream is open return \c true, otherwise return \c false.
+      */
+    virtual bool IsFileOpen();
+
+    /** Get current Import mode
+      *	
+      */
+    EImportMode GetImportMode();
+
+    /** Get file version
+      *	\param pMajor       Major version
+      *	\param pMinor       Minor version
+      *	\param pRevision    Revision version
+      */
+    virtual void GetVersion(int& pMajor, int& pMinor, int& pRevision);
+
+    /** Get axis system information from file
+      *	\param pAxisSystem      axis system in file
+      * \param pSystemUnits     system unit in file
+      * \return if either pAxisSystem or pSystemUnits is \c NULL return \c false, otherwise return \c true.
+      */
+    virtual bool GetAxisInfo(FbxAxisSystem* pAxisSystem, FbxSystemUnit* pSystemUnits);
+
+	/** Get FBX file time mode read from GlobalSettings in FBX 6.n and FBX 7.n
+	  *	\param pTimeMode  ref to a FbxTime::EMode enum	
+	  *	\return     \c true on success, \c false otherwise.
+	  *	\remarks    This function must be called after FbxImporter::Initialize().
+	  *             Can be used for statistics (via GlobalSettings) before loading the whole scene from the file.
+	  */
+	virtual bool GetFrameRate(FbxTime::EMode &pTimeMode);
+
+    /** Get the statistics from file
+      *	\param pStats statistics in file
+      *	\return if fetching statistics is successfully return \c true, otherwise return \c false.
+      */
+    virtual bool GetStatistics(FbxStatistics* pStats);
+
+     /** Get the file stream options
+      *	\param pParseFileAsNeeded       Whether to parse file as read options
+      * \return true on success, otherwise return false.
+      */
+    virtual bool GetReadOptions(bool pParseFileAsNeeded = true);
+
+    /** Read file with stream options
+      *	\param pDocument        FbxDocument to store the file data
+      *	\return if fetching statistics is successful return \c true, otherwise return \c false.
+      */
+    virtual bool Read(FbxDocument *pDocument);
+
+	/** Reads extension plug-ins name, version and parameters, so that we can remember if a plug-in was used during export.
+	  * This is especially useful for extension plug-ins that modify the scene and also to warn users during import if an
+	  * extension plug-in was used that could be missing.
+      * \param pParams The parameters of the extension plug-in. The properties of the objects are used
+	  * as the parameters of the extension plug-in.
+      */
+	virtual void PluginReadParameters(FbxObject& pParams);
+
+    /** Get the file options
+      * \param pFbx                     file object to read options
+      *	\param pParseFileAsNeeded       Whether to parse file as read options
+      * \return true on success, otherwise return false.
+      */
+    virtual bool GetReadOptions(FbxIO* pFbx, bool pParseFileAsNeeded = true);
+
+    /** Read file with stream options
+      *	\param pDocument        FbxDocument to store the file data
+      * \param pFbx             file object to read from
+      *	\return if reading the file is successful return \c true, otherwise return \c false.
+      */
+    virtual bool Read(FbxDocument *pDocument, FbxIO* pFbx);
+
+    /** Returns the scene info from the file.
+      * \return The pointer to file scene info defined by this reader.
+      */
+    virtual FbxDocumentInfo*  GetSceneInfo();
+
+    /** Returns the pointer to the list of TakeInfo from the file.
+      * \return NULL
+      */
+    virtual FbxArray<FbxTakeInfo*>* GetTakeInfo();
+
+    /** Pass a progress handler to the reader
+      * \param pProgress     FbxProgress to store the progress information.
+      */
+    virtual void SetProgressHandler(FbxProgress *pProgress);
+
+	virtual void SetEmbeddingExtractionFolder(const char* pExtractFolder);
+
+	virtual bool SupportsStreams() const { return true; }
+
+private:
+    // Declared, not defined.
+    FbxReaderFbx7(const FbxReaderFbx7&);
+    FbxReaderFbx7& operator=(FbxReaderFbx7 const&);
+
+private:
+    FbxReaderFbx7_Impl* mImpl;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_FBX_READER_FBX7_H_ */

+ 211 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxwriterfbx5.h

@@ -0,0 +1,211 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxwriterfbx5.h
+#ifndef _FBXSDK_FILEIO_FBX_WRITER_FBX5_H_
+#define _FBXSDK_FILEIO_FBX_WRITER_FBX5_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+//Writable versions for this file type.  
+//Sync the functions PreProcessScene and PostProcessScene with these elements of this list.
+
+class FbxWriterFbx5 : public FbxWriter
+{
+public:
+	FbxWriterFbx5(FbxManager& pManager, FbxExporter& pExporter, int pID, FbxStatus& pStatus);
+	virtual ~FbxWriterFbx5();
+
+	virtual bool FileCreate(char* pFileName);
+    virtual bool FileCreate(FbxStream* pStream, void* pStreamData);
+	virtual bool FileClose();
+	virtual bool IsFileOpen();
+
+	typedef enum 
+	{
+		eASCII,
+		eBINARY,
+		eENCRYPTED
+	} EExportMode;
+
+	void SetExportMode(EExportMode pMode);
+
+	virtual void GetWriteOptions();
+	virtual bool Write(FbxDocument* pDocument);
+
+	virtual bool Write(FbxDocument* pDocument, FbxIO* pFbx);
+	virtual bool PreprocessScene(FbxScene& pScene);
+	virtual bool PostprocessScene(FbxScene& pScene);
+
+	virtual bool SupportsStreams() const		{ return true; }
+
+private:
+	bool WriteAnimation(FbxScene& pScene);
+	bool WriteAnimation(FbxNode& pRootNode, FbxAnimLayer* pAnimLayer);
+	void WriteTakeNode(KFCurveNode* pCurveNode, bool pRescaleShininess); 
+	bool WriteTakeNode(FbxObject& pObj, FbxAnimLayer* pAnimLayer, const char* pBlockName, bool pRescaleShininess = false);
+
+	bool WriteThumbnail(FbxThumbnail* pThumbnail);
+	void WriteSceneInfo(FbxDocumentInfo*);
+
+	bool WriteExtensionSection(FbxScene& pScene, int pMediaCount);
+
+    bool WriteNode(FbxNode* pNode);
+
+	bool WriteCameraSwitcher(FbxScene& pScene);
+
+    void WriteGobo(FbxScene& pScene);
+    void WriteGoboSection(FbxScene& pScene);
+	void WriteGobo(FbxGobo& pGobo);
+
+	void WriteCharacter(FbxScene& pScene);
+	void WriteCharacter(FbxScene& pScene, int pCharacterIndex);
+	void WriteCharacterLinkGroup(FbxCharacter& pCharacter, int pCharacterGroupId, FbxScene& pScene, bool pBackwardCompatible);
+	void WriteCharacterLink(FbxCharacter& pCharacter, int pCharacterNodeId, FbxScene& pScene, bool pBackwardCompatible);
+	void WriteFilterSet(FbxCharacter& pCharacter);
+	void WriteControlSet(FbxControlSet& pControlSet, FbxScene& pScene, bool pBackwardCompatible);	
+	void WriteControlSetLinkGroup(FbxControlSet& pControlSet, int pCharacterGroupId, FbxScene& pScene, bool pBackwardCompatible);
+	void WriteControlSetLink(FbxControlSet& pControlSet, int pCharacterNodeId, FbxScene& pScene);
+	void WriteEffector(FbxControlSet& pControlSet, int pEffectorNodeId, FbxScene& pScene);
+	void WriteEffectorAux(FbxControlSet& pControlSet, int pEffectorNodeId, FbxScene& pScene);
+
+	int  WriteCharacterPose(FbxScene& pScene);
+	void WriteCharacterPose(FbxCharacterPose& pCharacterPose);
+
+	void WritePose(FbxScene& pScene);
+	void WritePose(FbxPose& pPose);
+
+	void WriteConstraint(FbxScene& pScene);
+
+	void WriteGlobalLightSettings(FbxScene& pScene);
+    void WriteShadowPlane(FbxScene& pScene);
+    void WriteShadowPlaneSection(FbxScene& pScene);
+    void WriteAmbientColor(FbxScene& pScene);
+    void WriteFogOption(FbxScene& pScene); 
+
+	void WriteGlobalCameraAndTimeSettings(FbxScene& pScene);
+	
+	bool WriteMedia(FbxScene& pScene, bool pMediaEmbedded, int& pMediaCount);
+	bool WriteMediaClip(FbxString& pFileName, bool pEmbeddedMedia);
+	void WriteDefaultMedia();
+
+	bool WriteNode                  (FbxNode& pNode);
+	bool WriteNodeBegin             (FbxNode& pNode);
+	bool WriteNodeParameters        (FbxNode& pNode);
+	bool WriteNodeVersion           (FbxNode& pNode);
+	bool WriteNodeShading           (FbxNode& pNode);
+	bool WriteNodeAnimationSettings (FbxNode& pNode);
+	bool WriteNodeCullingType       (FbxNode& pNode);
+    bool WriteNodeLimits            (FbxNode& pNode);
+	bool WriteNodeProperties	    (FbxNode& pNode);
+	bool WriteNodeTarget            (FbxNode& pNode);
+	bool WriteNodeAnimatedProperties(FbxNode& pNode);
+	bool WriteNodeAttribute         (FbxNode& pNode);
+	bool WriteNodeDefaultAttributes (FbxNode& pNode);
+	bool WriteNodeChildrenList      (FbxNode& pNode);
+	bool WriteNodeEnd               (FbxNode& pNode);
+
+	bool WriteNull                  ( FbxNull* pNull );
+
+	bool WriteMarker                ( FbxNode& pNode );
+
+	bool WriteCamera                ( FbxCamera& pCamera, bool pIsProducerCamera = false );	
+
+	bool WriteCameraSwitcher        ( FbxCameraSwitcher& pCameraSwitcher );
+
+	bool WriteLight                 ( FbxLight& pLight );
+
+	bool WriteGeometry              ( FbxGeometry& pGeometry );
+	bool WriteGeometryLayer         ( FbxGeometry& pGeometry );
+	bool WriteGeometryTextureLayer  ( FbxGeometry& pGeometry, int pIndex );
+
+	bool WriteMesh                  ( FbxMesh& pMesh );
+	bool WriteMeshVertices          ( FbxMesh& pMesh );
+	bool WriteMeshNormals           ( FbxMesh& pMesh );
+	bool WriteMeshMaterial          ( FbxMesh& pMesh );
+	bool WriteMeshTexture           ( FbxMesh& pMesh );
+	bool WriteMeshGeometryUVInfo    ( FbxMesh& pMesh );
+	bool WriteMeshPolyVertexIndex   ( FbxMesh& pMesh );
+	bool WriteMeshPolyGroupIndex    ( FbxMesh& pMesh );
+	bool WriteMeshVertexColors      ( FbxMesh& pMesh );
+
+	bool WriteNurb                  ( FbxNurbs& pNurbs );
+
+	bool WritePatch                 ( FbxPatch& pPatch );
+    bool WritePatchType             ( FbxPatch& pPatch, int pType );
+
+	bool WriteSkeleton              ( FbxSkeleton& pSkeleton );
+	bool WriteSkeletonRoot          ( FbxSkeleton& pSkeleton );
+	bool WriteSkeletonLimb          ( FbxSkeleton& pSkeleton );
+	bool WriteSkeletonLimbNode      ( FbxSkeleton& pSkeleton );
+	bool WriteSkeletonEffector      ( FbxSkeleton& pSkeleton );
+	
+	bool WriteOpticalReference      ( FbxOpticalReference& pOpticalReference );
+
+	bool WriteTexture(FbxFileTexture& pTexture);
+	bool WriteSurfaceMaterial(FbxSurfaceMaterial& pMaterial);
+	bool WriteLink(FbxCluster& pCluster);
+	bool WriteShape(FbxShape& pShape, FbxString pShapeName, FbxGeometry& pGeometry);
+
+	bool WriteProperties(FbxObject* pObject);
+
+	int FindString(FbxString pString, FbxArray<FbxString*>& pStringArray);
+	void FindShapeValidIndices(FbxArray<FbxVector4>& pGeometryControlPoints, FbxArray<FbxVector4>& pShapeControlPoints, FbxArray<int>& lValidIndices);
+
+	void ConvertShapeNamesToV5Format(FbxNode& pNode);
+	void RevertShapeNamesToV6Format (FbxNode& pNode);
+
+	void WritePassword();
+
+	void FindAnimatedChannels(FbxScene& pScene);
+	void ClearAnimatedChannels();
+
+	void WriteSceneGenericPersistenceSection(FbxScene& pScene);
+
+    void ForceKFCurveNodesOnTRS(FbxNode* pNode);
+    void SetPivotStateRecursive(FbxNode* pNode);
+
+private:
+	FbxWriterFbx5& operator=(const FbxWriterFbx5&) { return *this; }
+
+	FbxIO* mFileObject;	
+	FbxExporter& mExporter;
+
+	EExportMode mExportMode;
+
+	FbxMultiMap mTextureAnimatedChannels;
+	FbxMultiMap mMaterialAnimatedChannels;
+
+	struct TextureAnimatedChannels
+	{
+		bool mTranslation;
+		bool mRotation;
+		bool mScaling;
+		bool mAlpha;
+	};
+
+	struct SurfaceMaterialAnimatedChannels
+	{
+		bool mAmbient;
+		bool mDiffuse;
+		bool mSpecular;
+		bool mEmissive;
+		bool mOpacity;
+		bool mShininess;
+		bool mReflectivity;
+	};
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_FBX_WRITER_FBX5_H_ */

+ 311 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxwriterfbx6.h

@@ -0,0 +1,311 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxwriterfbx6.h
+#ifndef _FBXSDK_FILEIO_FBX_WRITER_FBX6_H_
+#define _FBXSDK_FILEIO_FBX_WRITER_FBX6_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class Fbx6TypeDefinition;
+class Fbx6TypeWriteReferences;
+class Fbx6TypeObjectHierarchy;
+
+typedef FbxArray<FbxTakeInfo*> TakeInfoArray;
+
+class FbxWriterFbx6 : public FbxWriter
+{
+public:
+    FbxWriterFbx6(FbxManager& pManager, FbxExporter& pExporter, int pID, FbxStatus& pStatus);
+    virtual ~FbxWriterFbx6();
+
+    virtual bool    FileCreate(char* pFileName);
+    virtual bool	FileCreate(FbxStream* pStream, void* pStreamData);
+    virtual bool    FileClose();
+    virtual bool    IsFileOpen();
+
+    typedef enum {eASCII, eBINARY, eENCRYPTED} EExportMode;
+
+    void            SetExportMode(EExportMode pMode);
+
+    virtual void    GetWriteOptions();
+    virtual bool    Write(FbxDocument* pDocument);
+    virtual bool    PreprocessScene(FbxScene& pScene);
+    virtual bool    PostprocessScene(FbxScene& pScene);
+    virtual void    PluginWriteParameters(FbxObject& pParams);
+    virtual bool    Write(FbxDocument* pDocument, FbxIO* pFbx);
+    virtual void    SetProgressHandler(FbxProgress *pProgress);
+
+	virtual bool SupportsStreams() const		{ return true; }
+
+private:
+    /*************************** new writer ***************************/
+	void            ConvertShapePropertyToOldStyle(FbxScene& pScene);
+	void            ConvertShapePropertyToNewStyle(FbxScene& pScene);
+    void            BuildObjectDefinition(FbxDocument* pDocument, Fbx6TypeDefinition& pDefinitions);
+    void            SetObjectWriteSupport(const Fbx6TypeDefinition& pDefinitions);
+    bool            WriteDescriptionSection(FbxDocument* pDocument);
+    bool            WriteReferenceSection(FbxDocument* pDocument, Fbx6TypeWriteReferences& pReferences);
+    void            WriteObjectDefinition(FbxDocument* pDocument, Fbx6TypeDefinition& pDefinitions);
+    void            WriteObjectProperties(FbxDocument* pDocument, Fbx6TypeDefinition& pDefinitions);
+
+    void            FlattenDocument(FbxDocument* pDocument, Fbx6TypeObjectHierarchy& pDocHierarchy, bool pFirstCall=true);
+    void            UnFlattenDocument(FbxDocument* pDocument, Fbx6TypeObjectHierarchy& pDocHierarchy);
+    bool            WriteObjectHeaderAndReferenceIfAny(FbxObject& pObj, const char* pObjectType) const;
+
+    FbxObject*     GetObjectIndirection(FbxObject* pObject);
+    void            WriteObjectConnections(FbxDocument* pDocument);
+    void            WriteTakesAndAnimation(FbxDocument* pDocument);
+
+    void            WriteConstraints(FbxScene& pScene);
+    void            WriteConstraint(FbxConstraint& pConstraint, FbxScene& pScene);
+
+    void            WriteGeometryWeightedMap(FbxGeometryWeightedMap& pGeometryWeightedMap);
+    void            WriteNodeAttributes(const FbxDocument& pDocument);
+    void            WriteAllGeometries(FbxScene& pScene);
+
+    void            WriteAllGeometryWeightedMaps(FbxScene& pScene);
+
+    int             WriteCharacterPose(FbxScene& pScene);
+    void            WriteCharacterPose(FbxCharacterPose& pCharacterPose);
+
+    void            WriteCharacterLinkGroup(FbxCharacter& pCharacter, int pCharacterGroupId, FbxScene& pScene);
+    void            WriteCharacterLink(FbxCharacter& pCharacter, int pCharacterNodeId, FbxScene& pScene);
+    void            WriteCharacterLinkRotationSpace(FbxCharacterLink& pCharacterLink);
+
+    void            WriteControlSetPlug(FbxScene& pScene);
+
+    /*************************** new writer ***************************/
+    bool            WriteNodes(FbxScene& pScene, bool pIncludeRoot);
+    bool            WriteNodes(const FbxDocument& pDocument);
+
+    /*************************** kept functions ***************************/
+    bool            WriteObjectProperties(FbxObject* pObject);
+    bool            WriteObjectPropertiesAndFlags(FbxObject* pObject);
+
+    bool            WriteContainers(FbxScene& pScene);
+
+    bool            WriteNode(FbxNode& pNode);
+    bool            WriteNodeBegin(FbxNode& pNode);
+    bool            WriteNodeEnd(FbxNode& pNode);
+    bool            WriteNodeParameters(FbxNode& pNode);
+    bool            WriteNodeVersion(FbxNode& pNode);
+    bool            WriteNodeAnimationSettings(FbxNode& pNode);
+    bool            WriteNodeShading(FbxNode& pNode);
+    bool            WriteNodeCullingType(FbxNode& pNode);
+    bool            WriteNodeAttribute(FbxNodeAttribute* pNodeAttribute);
+    bool            WriteNodeProperties(FbxNode& pNode);
+
+    bool            WriteNodeType(FbxNode& pNode);
+    bool            WriteNull(FbxNull* pNull);
+    bool            WriteMarker(FbxNode& pNode);
+    bool            WriteSkeleton(FbxSkeleton& pSkeleton);
+    bool            WriteSkeletonRoot(FbxSkeleton& pSkeleton);
+    bool            WriteSkeletonLimb(FbxSkeleton& pSkeleton);
+    bool            WriteSkeletonLimbNode(FbxSkeleton& pSkeleton);
+    bool            WriteSkeletonEffector(FbxSkeleton& pSkeleton);
+    bool            WriteGenericNodes(FbxScene& pScene);
+
+    bool            WriteGeometry(FbxGeometry& pGeometry);
+    bool            WriteMesh(FbxMesh& pMesh);
+    bool            WriteMeshSmoothness(FbxMesh& pMesh);
+    bool            WriteMeshVertices(FbxMesh& pMesh);
+    bool            WriteMeshPolyVertexIndex(FbxMesh& pMesh);
+    bool            WriteMeshEdges(FbxMesh& pMesh);
+    bool            WriteNurb(FbxNurbs& pNurbs);
+    bool            WriteNurbsSurface(FbxNurbsSurface& pNurbs);
+    bool            WriteNurbsCurve(FbxNurbsCurve& pNurbsCurve);
+    bool            WriteTrimNurbsSurface(FbxTrimNurbsSurface& pNurbs);
+    bool            WriteBoundary(FbxBoundary& pBoundary);
+    bool            WriteSubdiv(FbxSubDiv& pSubdiv);
+
+    bool            WritePatch(FbxPatch& pPatch);
+    bool            WritePatchType(FbxPatch& pPatch, int pType);
+
+    bool            WriteDeformers(FbxScene& pScene);
+    bool            WriteSkin(FbxSkin& pSkin);
+    bool            WriteVertexCacheDeformer(FbxVertexCacheDeformer& pDeformer);
+    bool            WriteCluster(FbxCluster& pCluster);
+    bool            WriteShape(FbxShape& pShape, FbxString pShapeName, FbxGeometry& pGeometry);
+    void            FindShapeValidIndices(FbxArray<FbxVector4>& pGeometryControlPoints, FbxArray<FbxVector4>& pShapeControlPoints, FbxArray<int>& lValidIndices);
+
+    bool            WriteFbxLayerElementNormals(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementBinormals(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementTangents(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementMaterials(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementTextures(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementTexturesChannel(FbxLayerContainer& pLayerContainer, FbxLayerElement::EType pTextureType, FbxMultiMap& pLayerIndexSet);
+    bool            WriteFbxLayerElementUVsChannel(FbxLayerContainer& pLayerContainer, FbxLayerElement::EType pTextureType, FbxMultiMap& pLayerIndexSet);
+
+    bool            WriteFbxLayerElementPolygonGroups(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementVertexColors(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementUVs(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementSmoothing(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementUserData(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementVisibility(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementVertexCrease(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementEdgeCrease(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    bool            WriteFbxLayerElementHole(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+
+    bool            WriteLayers(FbxLayerContainer& pLayerContainer, FbxMultiMap&);
+    int             MapLayeredTextureIndexToConnectionIndex(FbxNode* pNode, void* pLET, int pIndex);
+
+    bool            WriteMaterials(FbxDocument* pDocument);
+    bool            WriteSurfaceMaterial(FbxSurfaceMaterial& pMaterial);
+
+    bool            WritePose(FbxScene& pScene);
+
+    // Write Connections
+    bool            WriteFieldConnection(FbxDocument* pDocument, FbxObject* pSrcObject, FbxDocument* pDstDocument);
+    bool            WriteFieldConnection(FbxDocument* pDocument, FbxObject* pSrc,FbxObject* pDst);
+    bool            WriteFieldConnection(FbxDocument* pDocument, FbxObject* pSrc,FbxProperty& pDst);
+    bool            WriteFieldConnection(FbxDocument* pDocument, FbxProperty& pSrc,FbxObject* pDst);
+    bool            WriteFieldConnection(FbxDocument* pDocument, FbxProperty& pSrc,FbxProperty& pDst);
+    
+    void            WriteObjectConnections(FbxDocument* pDocument, FbxObject* pObject, bool pRecursive);
+
+    bool            WriteCamera(FbxCamera& pCamera);
+    bool            WriteCameraStereo(FbxCameraStereo& pCameraStereo);
+    bool            WriteLight(FbxLight& pLight);
+    bool            WriteCameraSwitcher(FbxScene& pScene);                   
+    bool            WriteCameraSwitcher(FbxCameraSwitcher& pCameraSwitcher);
+
+    bool            WriteTextures(FbxDocument* pDocument);
+    bool            WriteTexture(FbxFileTexture& pTexture);
+
+	bool            WriteTimeWarps(FbxDocument* pDocument, FbxAnimStack* pAnimStack);
+    bool            WriteThumbnails(FbxDocument* pDocument);
+    bool            WriteThumbnail(FbxThumbnail& pThumbnail);
+
+    bool            WriteCaches(FbxDocument* pDocument);
+    bool            WriteCache(FbxCache& pCache);
+
+    bool            WriteBindingTables(FbxDocument* pDocument);
+    bool            WriteBindingTable(FbxBindingTable& pTable);
+
+    bool            WriteBindingOperators(FbxDocument* pDocument);
+    bool            WriteBindingOperator(FbxBindingOperator& pOperator);
+
+    bool            WriteImplementations(FbxDocument* pDocument);
+    bool            WriteImplementation(FbxImplementation& pImplementation);
+
+    bool            WriteCollections(FbxDocument* pDocument);
+    bool            WriteCollection(FbxCollection& pImplementation);
+
+    bool            WriteDocuments(FbxDocument* pDocument);
+    bool            WriteDocument(FbxDocument& pSubDocument);
+
+    bool            WriteLayeredTextures(FbxDocument* pDocument);
+    bool            WriteLayeredTexture(FbxLayeredTexture& pTexture);
+
+    void            WriteGobo(FbxScene& pScene);
+    void            WriteGoboSection(FbxScene& pScene);
+    void            WriteGobo(FbxGobo& pGobo);
+
+    bool            WriteVideos(FbxDocument* pDocument);
+    bool            WriteVideo(FbxVideo& pVideo, FbxString& pFileName, bool pEmbeddedMedia);
+
+    bool            WriteAnimation(FbxDocument* pDocument);
+    bool            WriteAnimation(FbxDocument* pDocument, FbxAnimLayer* pAnimLayer);
+
+    bool            WriteFCurves(FbxObject& pObject, FbxAnimLayer* pAnimLayer, const char* pBlockName, bool pKeepBlockOpen=false, bool pRescaleShininess=false);
+
+    void            WritePose(FbxPose& pPose);
+
+    bool            WriteSelectionNode(FbxScene& pScene);
+    void            WriteSelectionNode(FbxSelectionNode& pSelectionNode);
+
+    bool            WriteSelectionSet(FbxScene& pScene);
+    void            WriteSelectionSet(FbxSelectionSet& pSelectionSet);
+    
+    bool            WriteThumbnail(FbxThumbnail* pThumbnail);
+
+    void            WriteSceneInfo(FbxDocumentInfo*);
+    void            WriteGlobalSettings(FbxGlobalSettings& pGlobalSettings);
+
+    bool            WriteExtensionSection(FbxScene& pScene, int pMediaCount);
+
+    int				FindString(FbxString pString, FbxArray<FbxString*>& pStringArray);
+
+    /****************** Function that write in the v5 section******************/
+    void            WriteGlobalLightSettings(FbxScene& pScene);
+    void            WriteShadowPlane(FbxScene& pScene);
+    void            WriteShadowPlaneSection(FbxScene& pScene);
+    void            WriteAmbientColor(FbxScene& pScene);
+    void            WriteFogOption(FbxScene& pScene);
+
+    void            WriteGlobalCameraSettings(FbxScene& pScene);
+    void            WriteGlobalTimeSettings(FbxScene& pScene);
+    /****************** Function that write in the v5 section******************/
+    
+    void            WritePassword();
+
+	void			WriteLayeredAnimation(FbxScene& pScene);
+
+private:
+    void            WritePropertyTemplate(FbxClassId pClassId, FbxDocument* pDocument, bool& pVisitedNodeClass);
+    void            WriteProperty(FbxProperty& pProperty, bool lSetNodeAttributeFlag);
+	void			ConnectTimeWarp(FbxAnimCurveNode* pCurveNode, KFCurveNode* pFCurveNode);
+
+    FbxWriterFbx6&    operator=(const FbxWriterFbx6&);
+
+    FbxScene*					mScene;
+    FbxIO*						mFileObject;
+    FbxExporter&				mExporter;
+    Fbx6TypeObjectHierarchy*    mDocumentHierarchy;
+    Fbx6TypeWriteReferences*    mDocumentReferences;
+
+	bool						mWriteNonDefaultPropertiesOnly;
+    bool						mWriteEnhancedProperties;
+    EExportMode					mExportMode;
+
+    FbxMultiMap						mTextureAnimatedChannels;
+    FbxMultiMap						mMaterialAnimatedChannels;
+	FbxMultiMap						mTimeWarpsCurveNodes;
+
+    struct TextureAnimatedChannels
+    {
+        bool mTranslation;
+        bool mRotation;
+        bool mScaling;
+        bool mAlpha;
+    };
+
+    struct SurfaceMaterialAnimatedChannels
+    {
+        bool mAmbient;
+        bool mDiffuse;
+        bool mSpecular;
+        bool mEmissive;
+        bool mOpacity;
+        bool mShininess;
+        bool mReflectivity;
+    };
+
+    FbxNode*	mCurrentNode;
+
+    struct ModifiedPropertyInfo { FbxObject* mObj; FbxString mPropName; };
+    FbxArray<ModifiedPropertyInfo*> mModifiedProperties;
+    void ReplaceUnsupportedProperties(FbxScene* pScene, bool pPreprocessPass, int pFormatV);
+	void StoreUnsupportedProperty(FbxObject* pObject, FbxProperty& pProperty);
+    bool IsLeafRoll(const FbxString& pNameWithoutNameSpacePrefix);
+
+    FbxProgress* mProgress;
+    bool mProgressPause;
+};
+
+bool IsNameUnique(FbxScene& pScene, FbxObject* pObject);
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_FBX_WRITER_FBX6_H_ */

+ 72 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbx/fbxwriterfbx7.h

@@ -0,0 +1,72 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2017 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxwriterfbx7.h
+#ifndef _FBXSDK_FILEIO_FBX_WRITER_FBX7_H_
+#define _FBXSDK_FILEIO_FBX_WRITER_FBX7_H_
+
+#include <fbxsdk.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+struct FbxWriterFbx7_Impl;
+
+class FbxWriterFbx7 : public FbxWriter
+{
+public:
+    typedef enum
+    {
+        eASCII,
+        eBINARY,
+        eENCRYPTED
+    } EExportMode;
+
+    FbxWriterFbx7(FbxManager& pManager, FbxExporter& pExporter, int pID, FbxStatus& pStatus);
+    FbxWriterFbx7(FbxManager& pManager, FbxExporter& pExporter, EExportMode pMode, int pID, FbxStatus& pStatus);
+    virtual ~FbxWriterFbx7();
+
+    virtual bool FileCreate(char* pFileName);
+    virtual bool FileCreate(FbxStream* pStream, void* pStreamData);
+    virtual bool FileClose();
+    virtual bool IsFileOpen();
+
+    virtual void GetWriteOptions();
+    virtual bool Write(FbxDocument* pDocument);
+    virtual bool PreprocessScene(FbxScene &pScene);
+    virtual bool PostprocessScene(FbxScene &pScene);
+    virtual bool Write(FbxDocument* pDocument, FbxIO* pFbx);
+	virtual void PluginWriteParameters(FbxObject& pParams);
+    virtual void SetProgressHandler(FbxProgress *pProgress);
+
+    void SetExportMode(EExportMode pMode);
+
+	virtual bool SupportsStreams() const		{ return true; }
+
+private:
+    // Declared, not defined.
+    FbxWriterFbx7(const FbxWriterFbx7&);
+    FbxWriterFbx7& operator=(const FbxWriterFbx7&);
+
+    struct ModifiedPropertyInfo{ FbxObject* mObj; FbxString mPropName; };
+    FbxArray<ModifiedPropertyInfo*> mModifiedProperties;
+	void StoreUnsupportedProperty(FbxObject* pObject, FbxProperty& pProperty);
+
+	void MakeNonSavableAndRemember(FbxObject* pObj);
+	FbxArray<FbxObject*> mSwitchedToNonSavablesObjects;
+	FbxArray<FbxAnimLayer*> mAnimLayerInternallyAdded;
+
+private:
+    FbxWriterFbx7_Impl* mImpl;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_FBX_WRITER_FBX7_H_ */

+ 64 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxbase64coder.h

@@ -0,0 +1,64 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxbase64coder.h
+#ifndef _FBXSDK_FILEIO_BASE64CODER_H_
+#define _FBXSDK_FILEIO_BASE64CODER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** This class decodes Base64 encoded data. */
+class FBXSDK_DLL FbxBase64Decoder
+{
+public:
+	/** Decodes the input buffer.
+	* \param pInBuffer the input buffer containing Base64 data.
+	* \param pInSize the size of the input data in bytes (must be a multiple of 4)
+	* \param pOutBuffer the destination buffer.
+	* \param pOutSize the capacity of the output buffer in bytes.
+	* \return the number of bytes put in the output buffer, or -1 if the output buffer is too small, or contains invalid characters */
+    int Decode(const void* pInBuffer, int pInSize, void* pOutBuffer, int pOutSize);
+
+	/** Decodes the input buffer.
+	* \param pInBuffer the input buffer containing Base64 data; its length is computed using strlen().
+	* \param pOutBuffer the destination buffer.
+	* \param pOutSize the capacity of the output buffer in bytes.
+	* \return the number of bytes put in the output buffer. */
+    int Decode(const char* pInBuffer, void* pOutBuffer, int pOutSize);
+};
+
+/** This class encodes data in the Base64 format. */
+class FBXSDK_DLL FbxBase64Encoder
+{
+public:
+	/** Encodes the input buffer.
+	* \param pInBuffer the input buffer containing data.
+	* \param pInSize the size of the input data in bytes.
+	* \param pOutBuffer the destination buffer, receives data encoded in Base64.
+	* \param pOutSize the capacity of the output buffer in bytes, which should be at least 33% larger than the input buffer size, or 4 bytes whichever is more.
+	* \return the number of bytes put in the output buffer, or -1 if we ran out of room. */
+    int Encode(const void* pInBuffer, int pInSize, void* pOutBuffer, int pOutSize);
+
+	/** Encodes the input buffer.
+	* \param pInBuffer the input buffer containing data.
+	* \param pInSize the size of the input data in bytes.
+	* \param pOutBuffer the destination buffer; data is set, not appended.
+	* \return the number of bytes put in the output buffer. */
+    int Encode(const void* pInBuffer, int pInSize, FbxString& pOutBuffer);
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_BASE64CODER_H_ */

+ 304 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxexporter.h

@@ -0,0 +1,304 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxexporter.h
+#ifndef _FBXSDK_FILEIO_EXPORTER_H_
+#define _FBXSDK_FILEIO_EXPORTER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxevent.h>
+#include <fbxsdk/core/base/fbxstring.h>
+#include <fbxsdk/fileio/fbxiobase.h>
+#include <fbxsdk/fileio/fbxiosettings.h>
+#include <fbxsdk/fileio/fbxprogress.h>
+#include <fbxsdk/utils/fbxrenamingstrategy.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxIO;
+class FbxIOFileHeaderInfo;
+class FbxThread;
+class FbxWriter;
+
+struct FbxExportThreadArg;
+
+/** Class to export SDK objects into an FBX file.
+  * Normally this class is used as is. But for very special needs
+  * a user can override Initialize() for special purpose.
+  *
+  * An exporter will select the appropriate writer to a particular file.
+  * Ex: When an exporter must export an FBX 7 file, 
+  * the exporter will ask for all registered writers if an FBX 7 file writer is available,
+  * then if a writer is found, the exporter will create 
+  * the specialized FBX 7 writer and write the file.
+  * This way, an exporter can "write" many different type of files like FBX 5/6/7, 3DS, Obj, Dxf, Collada, etc.
+  * \see FbxWriter
+  *
+  * Typical workflow for using the FbxExporter class:
+  * -# create a SDKManager
+  * -# create an IOSettings object
+  * -# create an empty scene
+  * -# create an exporter
+  * -# initialize it with a file name
+  * -# set numerous options to control how the exporter will behave.\n
+  *    ex: set IOSettings values to export Materials or Textures.
+  * -# call FbxExporter::Export() with the entity to export.
+  *
+  * \code
+  * // ex:
+  * // create a SdkManager
+  * FbxManager* lSdkManager = FbxManager::Create();
+  *
+  * // create an IOSettings object
+  * FbxIOSettings* ios = FbxIOSettings::Create(lSdkManager, IOSROOT);
+  *
+  * // set some IOSettings options 
+  * ios->SetBoolProp(EXP_FBX_MATERIAL, true);
+  * ios->SetBoolProp(EXP_FBX_TEXTURE,  true);
+  *
+  * // create an empty scene
+  * FbxScene* lScene = FbxScene::Create(lSdkManager, "");
+  *
+  * // create an exporter.
+  * FbxExporter* lExporter = FbxExporter::Create(lSdkManager, "");
+  *
+  * // initialize the exporter by providing a filename and the IOSettings to use
+  * lExporter->Initialize("C:\\myfile.fbx", -1, ios);
+  *
+  * // export the scene.
+  * lExporter->Export(lScene); 
+  *  
+  * // destroy the exporter
+  * lExporter->Destroy();
+  * \endcode
+  *
+  * \remarks According to the file suffix, a specialized writer will be created internally.\n
+  * 		 Ex: for .fbx files a FBX Writer, for .3ds files, a 3ds writer, etc.\n
+  *          Supported files formats: FBX 5/6/7 Binary & ASCII, Collada, DXF, OBJ, 3DS
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxExporter : public FbxIOBase
+{
+	FBXSDK_OBJECT_DECLARE(FbxExporter, FbxIOBase);
+
+public:
+	/** 
+	  * \name Export Functions
+	  */
+	//@{
+		/** Initialize object.
+		  *	\param pFileName     Name of file to access.
+		  * \param pFileFormat   file format identifier User does not need to specify it by default.
+								 if not specified, plugin will detect the file format according to file suffix automatically.
+		  * \param pIOSettings   client IOSettings, if not specified, a default IOSettings will be created
+		  *	\return              \c true on success, \c false otherwise.
+		  * \remarks             To identify the error that occurred, inspect the status object accessed 
+          *                      using the GetStatus() function.
+		  */
+        bool Initialize(const char* pFileName, int pFileFormat = -1, FbxIOSettings* pIOSettings = NULL) override;
+
+	    /** Initialize object.
+	    * \param pStream       stream to access.
+	    * \param pStreamData   user-defined stream data.
+        * \param pFileFormat   file format identifier User does not need to specify it by default.
+                               if not specified, plugin will request the file format from the stream.
+	    * \param pIOSettings   client IOSettings, if not specified, a default IOSettings will be created
+        * \return              \c true on success, \c false otherwise.
+	    * \remarks             To identify the error that occurred, inspect the status object accessed 
+        *                      using the GetStatus() function.
+	    */
+        virtual bool Initialize(FbxStream* pStream, void* pStreamData=NULL, int pFileFormat = -1, FbxIOSettings * pIOSettings = NULL);
+
+		/** Setup file export options settings.
+		  *	\return \c true on success, \c false otherwise.
+		  */	
+		bool GetExportOptions();
+
+        /** Access to a IOSettings object.
+		  * \return The pointer to IOSettings or \c NULL \c if the object has not been allocated.
+		  */
+		FbxIOSettings* GetIOSettings();
+
+		/** Set the IOSettings pointer
+		  * \param pIOSettings  Pointer on a FbxIOSettings object.  
+		  */
+		void SetIOSettings(FbxIOSettings* pIOSettings);
+
+
+		/** Export the document to the currently created file.
+		  * \param pDocument          Document to export.
+		  * \param pNonBlocking       If true, the export process will be executed in a new thread, allowing it to be non-blocking.
+									  To determine if the export finished, refer to the function IsExporting().
+		  *	\return                   \c true on success, \c false otherwise.
+	      * \remarks                  To identify the error that occurred, inspect the status object accessed 
+          *                           using the GetStatus() function.
+		  */
+		bool Export(FbxDocument* pDocument, bool pNonBlocking=false);
+
+	#if !defined(FBXSDK_ENV_WINSTORE) && !defined(FBXSDK_ENV_EMSCRIPTEN)
+		/** Check if the exporter is currently exporting.
+		  * \param pExportResult  This parameter, after the export finished, will contain the result of the export success or failure.
+		  * \return               Return true if the exporter is currently exporting.
+		  * \remarks              This function will always return false if Export() was called with pNonBlocking set to false.
+		  *                       This function should be used only in the context of pNonBlocking set to true.
+		  *                       It is very important to periodically check if the export finished using this function,
+		  *                       since it will also free up the thread's allocations when its done.
+		  */
+		bool IsExporting(bool& pExportResult);
+	#endif /* !FBXSDK_ENV_WINSTORE && ! FBXSDK_ENV_EMSCRIPTEN */
+
+		/** Get the progress status in non-blocking mode.
+		  *	\param pStatus Optional current status string.
+		  *	\return Percentage of the finished workload.
+		  */
+		float GetProgress(FbxString* pStatus=NULL);
+
+		/** Register a callback function for progress reporting in single thread mode.
+		  *	\param pCallback Pointer of the callback function.
+		  * \param pArgs Pointer to the arguments passed to the callback function.
+		  */
+		void SetProgressCallback(FbxProgressCallback pCallback, void* pArgs=NULL);
+	//@}
+
+	/** 
+	  * \name File Format
+	  */
+	//@{
+		/** Get the format of the exported file.
+		  *	\return     File format identifier.
+		  */
+		int GetFileFormat();
+
+		/** Return \c true if the file format is a recognized FBX format.
+		  */
+		bool IsFBX();
+
+		/** Get the list of writable versions for the current file format.
+		  * \return \c NULL or a null terminated array of strings.
+		  * \remarks the strings returned match the writers registered for the current format. 
+          * The array items can be retrieved with the following code:
+          * \code
+          *   char const* const* lWV = lExporter->GetCurrentWritableVersions();
+          *   if (lWV)
+          *   {
+          *       int i = 0;
+          *       while (lWV[i] != NULL)
+          *       {
+          *           printf("fmt = %s\n", lWV[i]);
+          *           i++;
+          *       }
+          *   }
+          * \endcode
+		  * 
+		  */
+		char const* const* GetCurrentWritableVersions();
+
+		/** Set file version for a given file format.
+		  * \param pVersion String description of the file format.
+		  * \param pRenamingMode Renaming mode.
+		  * \return \c true if mode is set correctly
+		  */
+		bool SetFileExportVersion(FbxString pVersion, FbxSceneRenamer::ERenamingMode pRenamingMode=FbxSceneRenamer::eNone);
+
+		/** Set the resampling rate (only used when exporting to FBX 5.3 and lower)
+		  * \param pResamplingRate resampling rate
+		  */
+		inline void SetResamplingRate(double pResamplingRate){ mResamplingRate = pResamplingRate; }
+
+		/** Set the default rendering resolution.
+		  * \param pCamName            name of the camera.
+		  * \param pResolutionMode     resolution mode.
+		  * \param pW                  width.
+		  * \param pH                  height.
+          * \remark These values are ignored when exporting to FBX 7.x and higher. With FBX version 6.x and lower, 
+          *         the HeaderInfo is still accessible for legacy reasons and any other custom writers. For FBX filles,
+          *         these values are used by the FBX QuickTime plug-in (obsolete now) to help it get the window size 
+          *         without loading the whole file. The information contained in the FbxIOFileHeaderInfo is a duplicate
+          *         of AspectRatioMode, AspectWidth and AspectHeight properties defined in the FbxCamera class. 
+          *         Retrieveing the FileHeaderInfo starting from FBX 7.x will always return the uninitialized structure.
+		  */
+		void SetDefaultRenderResolution(FbxString pCamName, FbxString pResolutionMode, double pW, double pH);
+
+		/**	Get the complete file header information.
+		* \return		valid pointer to the complete header information
+		*/
+		FbxIOFileHeaderInfo* GetFileHeaderInfo();
+	//@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	bool GetExportOptions(FbxIO* pFbxObject);
+	bool Export(FbxDocument* pDocument, FbxIO* pFbxObject);
+
+protected:
+	void Construct(const FbxObject* pFrom) override;
+	void Destruct(bool pRecursive) override;
+	virtual void SetOrCreateIOSettings(FbxIOSettings* pIOSettings, bool pAllowNULL);
+
+	void Reset();
+	bool FileCreate();
+	void FileClose();
+
+private:
+	bool ExportProcess(FbxDocument* pDocument);
+
+	int								mFileFormat;
+	FbxWriter*						mWriter;
+#if !defined(FBXSDK_ENV_WINSTORE) && !defined(FBXSDK_ENV_EMSCRIPTEN)
+    FbxThread*						mExportThread;
+    FbxExportThreadArg*				mExportThreadArg;
+    bool							mExportThreadResult;
+    bool							mIsThreadExporting;
+#endif /* !FBXSDK_ENV_WINSTORE && !FBXSDK_ENV_EMSCRIPTEN */
+    FbxProgress						mProgress;
+	FbxStream*                      mStream;
+	void*                           mStreamData;
+	FbxString						mStrFileVersion;
+	double							mResamplingRate;
+	FbxSceneRenamer::ERenamingMode	mRenamingMode;
+	FbxIOFileHeaderInfo*			mHeaderInfo;
+	FbxIOSettings*					mIOSettings;
+	bool							mClientIOSettings;
+
+	friend void ExportThread(void*);
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+//! Event that is emitted to plugins before a file is exported to the FBX format.
+class FBXSDK_DLL FbxEventPreExport : public FbxEvent<FbxEventPreExport>
+{
+	FBXSDK_EVENT_DECLARE(FbxEventPreExport);
+
+public:
+	FbxEventPreExport(FbxDocument* pDocument) : mDocument(pDocument) {};
+
+	//! The document to be exported
+	FbxDocument* mDocument;
+};
+
+//! Event that is emitted to plugins after a file is exported to the FBX format.
+class FBXSDK_DLL FbxEventPostExport : public FbxEvent<FbxEventPostExport>
+{
+	FBXSDK_EVENT_DECLARE(FbxEventPostExport);
+
+public:
+	FbxEventPostExport(FbxDocument* pDocument) : mDocument(pDocument) {};
+
+	//! The document to be exported
+	FbxDocument* mDocument;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_EXPORTER_H_ */

+ 133 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxexternaldocreflistener.h

@@ -0,0 +1,133 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxexternaldocreflistener.h
+#ifndef _FBXSDK_FILEIO_EXTERNAL_DOCREF_LISTENER_H_
+#define _FBXSDK_FILEIO_EXTERNAL_DOCREF_LISTENER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxlistener.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** Contains data about an external document.
+  * The document is a FbxDocument object.
+  */
+struct FBXSDK_DLL FbxExternalDocumentInfo
+{
+    FbxString mDocumentName;      //!< Bare name of external document in document hierarchy.
+    FbxString mClassName;         //!< Class name of the document (FbxDocument, FbxLibrary...).
+    FbxString mParentFullName;    //!< Full name of the parent document in document hierarchy.
+    FbxString mFilePathUrl;       //!< File path of the external document.
+};
+
+/** Event that is emitted on loading document when a referenced document
+  * is encountered while loading external references.
+  */
+class FBXSDK_DLL FbxEventReferencedDocument : public FbxEvent<FbxEventReferencedDocument>, public FbxExternalDocumentInfo
+{
+    FBXSDK_EVENT_DECLARE(FbxEventReferencedDocument);
+public:
+    FbxEventReferencedDocument() {}
+};
+
+
+class FbxExternalDocRefListenerData;
+
+/** Typical handler for the referenced document events.
+* 
+* Register it like so:
+* FbxExternalDocRefListener lRefDocListener( sdkManager, fileName );
+* FbxEventHandler * lHandler = lRefDocListener.Bind(scene,
+*                                                &FbxExternalDocRefListener::HandleEvent);  
+* 
+* And later unregister it like so:
+*     lRefDocListener.Unbind(lHandler);
+*/
+class FBXSDK_DLL FbxExternalDocRefListener : public FbxListener
+{
+public:
+    /** Constructor. 
+      * \param pManager
+      * \param pDocFilePath
+      * \remarks Keep a reference to the SDK and the path of the document
+      * to be able to resolve relative paths. 
+      */
+    FbxExternalDocRefListener( FbxManager & pManager, const FbxString & pDocFilePath );
+    virtual ~FbxExternalDocRefListener();
+
+    /** Set the document file path used to resolve documents. 
+      * \param pDocFilePath
+      * \remarks Allows re-using the same instance for multiple document loadings.
+      */
+    virtual void SetDocumentFilePath( const FbxString & pDocFilePath );
+
+    /** Verify that all documents that were previously loaded in a previous
+      * load session are still valid.
+      * \return \c true if all documents are still valid, \c false otherwise.
+      */
+    virtual bool AreAllExternalDocumentsStillValid() const;
+
+    // 
+    /** Verify that all documents that were referred to didn't change. 
+      * \return \c true if all documents didn't change, \c false otherwise.
+      * \remarks This function should be called if at posteriori check is desired.
+      */
+    virtual bool WereAllExternalDocumentsValid() const;
+
+    /** Unload all documents that were loaded through this event handler. 
+      */
+    virtual void UnloadExternalDocuments();
+
+    // External document reference event handler.
+    //
+    // Operation: calls FindDocument() to find the specified external document
+    //            and if not found calls LoadDocument() either directly,
+    //            if it has not parent, or via ConnectToParentLibrary().
+    //            If its parent cannot be found, it's added to the dangling
+    //            document list (and it is not loaded until it's parent is found).
+    //            After, it tries to resolve dangling documents by calling
+    //            TryConnectingDanglingLibraries().
+    /** External document reference event handler. 
+      * \param pEvent
+      * \remarks    Operation: calls FindDocument() to find the specified external document
+      *             and if not found calls LoadDocument() either directly,
+      *             if it has not parent, or via ConnectToParentLibrary().
+      *             If its parent cannot be found, it's added to the dangling
+      *             document list (and it is not loaded until it's parent is found).
+      *             After, it tries to resolve dangling documents by calling
+      *             TryConnectingDanglingLibraries().
+      */
+    virtual void HandleEvent(const FbxEventReferencedDocument * pEvent);
+
+protected:
+    /**
+     * Turn a relative path to an absolute path using the file path of the original document being loaded.
+     * If the path is already is absolute, it is returned as is.
+     */
+    virtual FbxString MakeFilenameAbsolute(const FbxString & pFilename) const;
+    //! Locate a document by its document path.
+    virtual FbxDocument * FindDocument( const FbxString & pPathToDoc );
+    //! Load a library, potentially under another library.
+    virtual FbxDocument * LoadDocument(FbxObject * pParent, const FbxString & pClassName, const FbxString & pFilename);
+    //! Try to connect a library to its parent given its document path.
+    virtual bool ConnectToParentLibrary(const FbxExternalDocumentInfo &);
+    //! Try to reconnect dangling libraries that didn't find their parent.
+    virtual void TryConnectingDanglingLibraries();
+
+private:
+    FbxExternalDocRefListenerData * mData;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_EXTERNAL_DOCREF_LISTENER_H_ */

+ 1087 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxfiletokens.h

@@ -0,0 +1,1087 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2017 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxfiletokens.h
+#ifndef _FBXSDK_FILEIO_FILE_TOKENS_H_
+#define _FBXSDK_FILEIO_FILE_TOKENS_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+//
+// Summary
+//
+#define FIELD_SUMMARY                               "Summary"
+#define FIELD_SUMMARY_VERSION                       "Version"
+#define FIELD_SUMMARY_TEMPLATE                      "Template"
+#define FIELD_SUMMARY_PASSWORD_PROTECTION           "PasswordProtection"
+#define FIELD_SUMMARY_CONTENT_COUNT                 "ContentCount"
+#define FIELD_SUMMARY_CONTENT_COUNT_MODEL           "Model"
+#define FIELD_SUMMARY_CONTENT_COUNT_DEVICE          "Device"
+#define FIELD_SUMMARY_CONTENT_COUNT_CHARACTER       "Character"
+#define FIELD_SUMMARY_CONTENT_COUNT_ACTOR           "Actor"
+#define FIELD_SUMMARY_CONTENT_COUNT_CONSTRAINT      "Constraint"
+#define FIELD_SUMMARY_CONTENT_COUNT_MEDIA           "Media"
+#define FIELD_SUMMARY_CONTENT_COUNT_COMPONENT       "Component"
+#define FIELD_SUMMARY_TAKES                         "Takes"
+#define FIELD_SUMMARY_TAKES_VERSION                 "Version"
+#define FIELD_SUMMARY_TAKES_CURRENT                 "Current"
+#define FIELD_SUMMARY_TAKES_TAKE                    "Take"
+#define FIELD_SUMMARY_TAKES_TAKE_COMMENT            "Comments"
+#define FIELD_SUMMARY_TAKES_TAKE_LOCAL_TIME         "LocalTime"
+#define FIELD_SUMMARY_TAKES_TAKE_REFERENCE_TIME     "ReferenceTime"
+
+
+//
+// FbxObject references, document ownership
+//
+#define FIELD_KFBXOBJECT_REFERENCE_TO               "ReferenceTo"
+#define FIELD_KFBXOBJECT_DOCUMENT                   "Doc"
+
+// (sic)
+#define FIELD_KFBXOBECT_REFERENCE_TO                FIELD_KFBXOBJECT_REFERENCE_TO
+
+//
+// FbxContainer
+//
+#define FIELD_KFBXCONTAINER_VERSION				"Version"
+#define FIELD_KFBXCONTAINER_CONTAINER			"Container"
+
+
+//
+// Thumbnail
+//
+#define FIELD_THUMBNAIL                             "Thumbnail"
+#define FIELD_THUMBNAIL_VERSION                     "Version"
+#define FIELD_THUMBNAIL_SIZE                        "Size"
+#define FIELD_THUMBNAIL_FORMAT                      "Format"
+#define FIELD_THUMBNAIL_ENCODING                    "ImageEncoding"
+#define FIELD_THUMBNAIL_IMAGE                       "ImageData"
+
+
+//
+// FbxGlobalLightSettings
+//
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_VERSION           "Version"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_SHADOWPLANES      "ShadowPlanes"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_COUNT             "Count"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_PLANE             "Plane"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_USESHADOW         "UseShadow"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_SHADOWINTENSITY   "ShadowIntensity"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_AMBIENTRENDER     "AmbientRenderSettings"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_AMBIENTLIGHTCOLOR "AmbientLightColor"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_FOGOPTIONS        "FogOptions"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_FOGENABLE         "FlogEnable"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_FOGMODE           "FogMode"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_FOGDENSITY        "FogDensity"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_FOGSTART          "FogStart"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_FOGEND            "FogEnd"
+#define FIELD_KFBXGLOBALLIGHTSETTINGS_FOGCOLOR          "FogColor"
+
+
+//
+// FbxGlobalCameraSettings
+//
+#define FIELD_KFBXGLOBALCAMERASETTINGS_RENDERER_SETTINGS "RendererSetting"
+#define FIELD_KFBXGLOBALCAMERASETTINGS_DEFAULT_CAMERA "DefaultCamera"
+#define FIELD_KFBXGLOBALCAMERASETTINGS_DEFAULT_VIEWING_MODE "DefaultViewingMode"
+#define FIELD_KFBXGLOBALCAMERASETTINGS_SETTINGS "Settings"
+#define FIELD_KFBXGLOBALCAMERASETTINGS_CAMERA "Camera"
+
+
+//
+// FbxGlobalTimeSettings
+//
+#define FIELD_KFBXGLOBALTIMESETTINGS_TIME_MODE "TimeMode"
+#define FIELD_KFBXGLOBALTIMESETTINGS_FRAMERATE "FrameRate"
+#define FIELD_KFBXGLOBALTIMESETTINGS_TIME_PROTOCOL "TimeFormat"
+#define FIELD_KFBXGLOBALTIMESETTINGS_SNAP_ON_FRAMES "SnapOnFrames"
+#define FIELD_KFBXGLOBALTIMESETTINGS_REFERENCE_TIME_INDEX "ReferenceTimeIndex"
+#define FIELD_KFBXGLOBALTIMESETTINGS_REFERENCE_TIME_MARKER "TimeMarker"
+#define FIELD_KFBXGLOBALTIMESETTINGS_REFERENCE_TIME "Time"
+#define FIELD_KFBXGLOBALTIMESETTINGS_REFERENCE_LOOP "Loop"
+#define FIELD_KFBXGLOBALTIMESETTINGS_TIMELINE_START_TIME "TimeLineStartTime"
+#define FIELD_KFBXGLOBALTIMESETTINGS_TIMELINE_STOP_TIME "TimeLineStopTime"
+
+
+//
+// Media
+//
+#define FIELD_MEDIA_MEDIA               "Media"
+#define FIELD_MEDIA_AUDIO               "Audio"
+#define FIELD_MEDIA_VIDEO               "Video"
+#define FIELD_MEDIA_TYPE                "Type"
+#define TOKEN_MEDIA_CLIP                "Clip"
+#define FIELD_MEDIA_VERSION             "Version"
+#define FIELD_MEDIA_ORIGINAL_FORMAT     "OriginalFormat"
+#define FIELD_MEDIA_ORIGINAL_FILENAME   "OriginalFilename"
+#define FIELD_MEDIA_FILENAME            "Filename"
+#define FIELD_MEDIA_RELATIVE_FILENAME   "RelativeFilename"
+#define FIELD_MEDIA_CONTENT             "Content"
+
+
+//
+// Properties
+//
+#define FIELD_PROPERTIES                "Properties"
+#define FIELD_PROPERTIES_VERSION        "Version"
+#define FIELD_USERPROPERTIES            "UserProperty"
+#define FIELD_USERPROPERTIES_NAME       "Name"
+#define FIELD_USERPROPERTIES_TYPE       "Type"
+#define FIELD_USERPROPERTIES_LABEL      "Label"
+#define FIELD_USERPROPERTIES_MIN        "Min"
+#define FIELD_USERPROPERTIES_MAX        "Max"
+#define FIELD_USERPROPERTIES_VALUE      "Value"
+
+
+//
+// FbxNode
+//
+#define FIELD_KFBXNODE_VERSION               "Version"
+#define FIELD_KFBXNODE_ANIMATION_MODE        "AnimationMode"
+#define FIELD_KFBXNODE_TYPE                  "Type"
+#define FIELD_KFBXNODE_TYPE_FLAGS            "TypeFlags"
+#define FIELD_KFBXNODE_MODEL                 "Model"
+#define FIELD_KFBXNODE_HIDDEN                "Hidden"
+#define FIELD_KFBXNODE_SHADING               "Shading"
+#define FIELD_KFBXNODE_TRANSFORM             "Transform"
+#define FIELD_KFBXNODE_DEFAULT               "Default"
+#define FIELD_KFBXNODE_TRANSLATION           "T"
+#define FIELD_KFBXNODE_ROTATION              "R"
+#define FIELD_KFBXNODE_SCALING               "S"
+#define FIELD_KFBXNODE_CHILDREN              "Children"
+
+#define FIELD_KFBXNODE_CULLING_TYPE          "Culling"
+#define TOKEN_KFBXNODE_CULLING_OFF           "CullingOff"
+#define TOKEN_KFBXNODE_CULLING_ON_CCW        "CullingOnCCW"
+#define TOKEN_KFBXNODE_CULLING_ON_CW         "CullingOnCW"
+
+#define FIELD_KFBXNODE_LIMITS                "Limits"
+#define FIELD_KFBXNODE_LIMITS_T_AUTO         "TAuto"
+#define FIELD_KFBXNODE_LIMITS_R_AUTO         "RAuto"
+#define FIELD_KFBXNODE_LIMITS_S_AUTO         "SAuto"
+#define FIELD_KFBXNODE_LIMITS_T_ENABLE       "TEnable"
+#define FIELD_KFBXNODE_LIMITS_R_ENABLE       "REnable"
+#define FIELD_KFBXNODE_LIMITS_S_ENABLE       "SEnable"
+#define FIELD_KFBXNODE_LIMITS_T_X_DEFAULT    "TXDefault"
+#define FIELD_KFBXNODE_LIMITS_T_Y_DEFAULT    "TYDefault"
+#define FIELD_KFBXNODE_LIMITS_T_Z_DEFAULT    "TZDefault"
+#define FIELD_KFBXNODE_LIMITS_R_X_DEFAULT    "RXDefault"
+#define FIELD_KFBXNODE_LIMITS_R_Y_DEFAULT    "RYDefault"
+#define FIELD_KFBXNODE_LIMITS_R_Z_DEFAULT    "RZDefault"
+#define FIELD_KFBXNODE_LIMITS_S_X_DEFAULT    "SXDefault"
+#define FIELD_KFBXNODE_LIMITS_S_Y_DEFAULT    "SYDefault"
+#define FIELD_KFBXNODE_LIMITS_S_Z_DEFAULT    "SZDefault"
+#define FIELD_KFBXNODE_LIMITS_T_X_MIN        "TXMin"
+#define FIELD_KFBXNODE_LIMITS_T_Y_MIN        "TYMin"
+#define FIELD_KFBXNODE_LIMITS_T_Z_MIN        "TZMin"
+#define FIELD_KFBXNODE_LIMITS_R_X_MIN        "RXMin"
+#define FIELD_KFBXNODE_LIMITS_R_Y_MIN        "RYMin"
+#define FIELD_KFBXNODE_LIMITS_R_Z_MIN        "RZMin"
+#define FIELD_KFBXNODE_LIMITS_S_X_MIN        "SXMin"
+#define FIELD_KFBXNODE_LIMITS_S_Y_MIN        "SYMin"
+#define FIELD_KFBXNODE_LIMITS_S_Z_MIN        "SZMin"
+#define FIELD_KFBXNODE_LIMITS_T_X_MAX        "TXMax"
+#define FIELD_KFBXNODE_LIMITS_T_Y_MAX        "TYMax"
+#define FIELD_KFBXNODE_LIMITS_T_Z_MAX        "TZMax"
+#define FIELD_KFBXNODE_LIMITS_R_X_MAX        "RXMax"
+#define FIELD_KFBXNODE_LIMITS_R_Y_MAX        "RYMax"
+#define FIELD_KFBXNODE_LIMITS_R_Z_MAX        "RZMax"
+#define FIELD_KFBXNODE_LIMITS_S_X_MAX        "SXMax"
+#define FIELD_KFBXNODE_LIMITS_S_Y_MAX        "SYMax"
+#define FIELD_KFBXNODE_LIMITS_S_Z_MAX        "SZMax"
+#define FIELD_KFBXNODE_LIMITS_R_TYPE         "RType"
+#define FIELD_KFBXNODE_LIMITS_R_CLAMP_TYPE   "RClampType"
+#define FIELD_KFBXNODE_LIMITS_R_X_AXIS       "RXAxis"
+#define FIELD_KFBXNODE_LIMITS_R_Y_AXIS       "RYAxis"
+#define FIELD_KFBXNODE_LIMITS_R_Z_AXIS       "RZAxis"
+#define FIELD_KFBXNODE_LIMITS_AXIS_LENGTH    "AxisLen"
+
+#define FIELD_KFBXNODE_TARGET                "LookAtModel"
+#define FIELD_KFBXNODE_UP_VECTOR_MODEL       "UpVectorModel"
+#define FIELD_KFBXNODE_POST_TARGET_ROTATION  "PostTargetRotation"
+#define FIELD_KFBXNODE_TARGET_UP_VECTOR      "UpTargetRotation"
+
+#define FIELD_KFBXNODE_PIVOTS                "Pivots"
+#define FIELD_KFBXNODE_PACKAGE               "Package"
+#define FIELD_KFBXNODE_FILE                  "File"
+#define FIELD_KFBXNODE_TRANSLATION_OFFSET    "TranslationOffset"
+#define FIELD_KFBXNODE_ROTATION_PIVOT        "RotationPivot"
+#define FIELD_KFBXNODE_PRE_ROTATION          "PreRotation"
+#define FIELD_KFBXNODE_POST_ROTATION         "PostRotation"
+#define FIELD_KFBXNODE_SCALING_PIVOT         "ScalingPivot"
+#define FIELD_KFBXNODE_PIVOT_ENABLED         "PivotEnabled"
+
+//
+// FbxGenericNode
+//
+#define FIELD_KFBXGENERICNODE_VERSION        "Version"
+#define FIELD_KFBXGENERICNODE_GENERICNODE    "GenericNode"
+
+//
+// FbxGeometry
+//
+#define FIELD_KFBXGEOMETRY_MATERIAL              "Material"
+#define FIELD_KFBXGEOMETRY_TEXTURE               "Texture"
+#define FIELD_KFBXGEOMETRY_LINK                  "Link"
+#define FIELD_KFBXGEOMETRY_SHAPE                 "Shape"
+
+//
+// FbxMarker
+//
+#define FIELD_KFBXMARKER_LOOK                    "Look"
+#define FIELD_KFBXMARKER_SIZE                    "Size"
+#define FIELD_KFBXMARKER_COLOR                   "Color"
+#define FIELD_KFBXMARKER_SHOW_LABEL              "ShowLabel"
+#define FIELD_KFBXMARKER_IK_PIVOT                "IKPivot"
+#define FIELD_KFBXMARKER_IK_REACH_TRANSLATION    "IKReachTranslation"
+#define FIELD_KFBXMARKER_IK_REACH_ROTATION       "IKReachRotation"
+#define FIELD_KFBXMARKER_IK_PULL                 "IKPull"
+#define FIELD_KFBXMARKER_IK_PULL_HIPS            "IKPullHips"
+
+//
+// FbxCamera
+//
+#define FIELD_KFBXGEOMETRYCAMERA_VERSION                     "Version"
+#define FIELD_KFBXGEOMETRYCAMERA_GEOMETRY_VERSION            "GeometryVersion"
+#define FIELD_KFBXGEOMETRYCAMERA_NAME                        "Name"
+
+// Camera Position and Orientation
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_POSITION             "Position"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_UP_VECTOR            "Up"
+#define FIELD_KFBXGEOMETRYCAMERA_DEFAULT_CAMERA_INTEREST_POSITION "LookAt"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_ROLL                 "Roll"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_TURNTABLE            "TurnTable"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_PROJECTION_TYPE      "Type"
+
+// Viewing Area Controls
+#define FIELD_KFBXGEOMETRYCAMERA_FORMAT_NAME                 "FormatName"
+#define TOKEN_KFBXGEOMETRYCAMERA_NTSC                        "NTSC"
+#define TOKEN_KFBXGEOMETRYCAMERA_D1_NTSC                     "D1 NTSC"
+#define TOKEN_KFBXGEOMETRYCAMERA_PAL                         "PAL"
+#define TOKEN_KFBXGEOMETRYCAMERA_D1_PAL                      "D1 PAL"
+#define TOKEN_KFBXGEOMETRYCAMERA_HD                          "HD"
+#define TOKEN_KFBXGEOMETRYCAMERA_640x480                     "640x480"
+#define TOKEN_KFBXGEOMETRYCAMERA_320x200                     "320x200"
+#define TOKEN_KFBXGEOMETRYCAMERA_320x240                     "320x240"
+#define TOKEN_KFBXGEOMETRYCAMERA_128x128                     "128x128"
+#define TOKEN_KFBXGEOMETRYCAMERA_FULL_SCREEN                 "Full Screen"
+#define TOKEN_KFBXGEOMETRYCAMERA_CUSTOM_FORMAT               "Custom"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_ASPECT_TYPE          "AspectType"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_ASPECT_WIDTH         "AspectW"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_ASPECT_HEIGHT        "AspectH"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_PIXEL_RATIO          "PixelRatio"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_NEAR_PLANE           "NearPlane"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_FAR_PLANE            "FarPlane"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_LOCK                 "CameraLock"
+
+// Aperture and Film Controls
+#define FIELD_KFBXGEOMETRYCAMERA_APERTURE_FORMAT_NAME        "ApertureFormat"
+#define TOKEN_KFBXGEOMETRYCAMERA_16MM_THEATRICAL             "16mm Theatrical"
+#define TOKEN_KFBXGEOMETRYCAMERA_SUPER_16MM                  "Super 16mm"
+#define TOKEN_KFBXGEOMETRYCAMERA_35MM_ACADEMY                "35mm Academy"
+#define TOKEN_KFBXGEOMETRYCAMERA_35MM_TV_PROJECTION          "35mm TV Projection"
+#define TOKEN_KFBXGEOMETRYCAMERA_35MM_FULL_APERTURE          "35mm Full Aperture"
+#define TOKEN_KFBXGEOMETRYCAMERA_35MM_185_PROJECTION         "35mm 1.85 Projection"
+#define TOKEN_KFBXGEOMETRYCAMERA_35MM_ANAMORPHIC             "35mm Anamorphic"
+#define TOKEN_KFBXGEOMETRYCAMERA_70MM_PROJECTION             "70mm Projection"
+#define TOKEN_KFBXGEOMETRYCAMERA_VISTA_VISION                "VistaVision"
+#define TOKEN_KFBXGEOMETRYCAMERA_DYNAVISION                  "Dynavision"
+#define TOKEN_KFBXGEOMETRYCAMERA_IMAX                        "Imax"
+#define TOKEN_KFBXGEOMETRYCAMERA_CUSTOM_APERTURE_FORMAT      "Custom"
+#define FIELD_KFBXGEOMETRYCAMERA_APERTURE_MODE               "ApertureMode"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_APERTURE_DIMENSION   "CameraAperture"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_SQUEEZERATIO         "SqueezeRatio"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_FOCAL_LENGTH         "FocalLength"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_APERTURE             "Aperture"
+
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_APERTURE_X           "FieldOfViewXProperty"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_APERTURE_Y           "FieldOfViewYProperty"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_OPTICAL_CENTER_X     "OpticalCenterXProperty"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_OPTICAL_CENTER_Y     "OpticalCenterYProperty"
+
+// Background Properties
+#define FIELD_KFBXGEOMETRYCAMERA_BACKGROUND_MEDIA_NAME             "Media"
+#define FIELD_KFBXGEOMETRYCAMERA_BACKGROUND_TEXTURE                "BackgroundTexture"
+#define FIELD_KFBXGEOMETRYCAMERA_BACKGROUND_VIDEO_CLIP_TEXTURE     "VideoClipTexture"
+#define FIELD_KFBXGEOMETRYCAMERA_BACKGROUND_DISPLAY_MODE           "ViewFrustumPlane"
+#define FIELD_KFBXGEOMETRYCAMERA_BACKGROUND_DRAWING_MODE           "BackgroundMode"
+#define FIELD_KFBXGEOMETRYCAMERA_FOREGROUND_MATTE_THRESHOLD_ENABLE "ForegroundTransparent"
+#define FIELD_KFBXGEOMETRYCAMERA_FOREGROUND_MATTE_TRESHOLD         "BackgroundTreshold"
+#define FIELD_KFBXGEOMETRYCAMERA_BACKGROUND_PLACEMENT_OPTIONS      "DisplayMode"
+#define FIELD_KFBXGEOMETRYCAMERA_BACKGROUND_DISTANCE               "ViewFrustumPlaneDistance"
+#define FIELD_KFBXGEOMETRYCAMERA_BACKGROUND_DISTANCE_MODE          "ViewFrustumPlaneDistanceMode"
+
+// Camera View Options
+#define FIELD_KFBXGEOMETRYCAMERA_VIEW_CAMERA_INTEREST        "ViewLookAt"
+#define FIELD_KFBXGEOMETRYCAMERA_VIEW_NEAR_FAR_PLANES        "ViewFrustum"
+#define FIELD_KFBXGEOMETRYCAMERA_SHOW_GRID                   "ShowGrid"
+#define FIELD_KFBXGEOMETRYCAMERA_SHOW_AXIS                   "ShowAzimut"
+#define FIELD_KFBXGEOMETRYCAMERA_SHOW_NAME                   "ShowName"
+#define FIELD_KFBXGEOMETRYCAMERA_SHOW_INFO_ON_MOVING         "ShowInfoOnMoving"
+#define FIELD_KFBXGEOMETRYCAMERA_SHOW_TIME_CODE              "ShowTimeCode"
+#define FIELD_KFBXGEOMETRYCAMERA_DISPLAY_SAFE_AREA           "DisplaySafeArea"
+#define FIELD_KFBXGEOMETRYCAMERA_SAFE_AREA_STYLE             "SafeAreaStyle"
+#define FIELD_KFBXGEOMETRYCAMERA_DISPLAY_SAFE_AREA_ON_RENDER "DisplaySafeAreaOnRender"
+#define FIELD_KFBXGEOMETRYCAMERA_SHOW_AUDIO                  "ShowAudio"
+
+#define FIELD_KFBXGEOMETRYCAMERA_BACKGROUND_COLOR            "BackGroundColor"
+#define FIELD_KFBXGEOMETRYCAMERA_AUDIO_COLOR                 "AudioColor"
+#define FIELD_KFBXGEOMETRYCAMERA_USE_FRAME_COLOR             "UseFrameColor"
+#define FIELD_KFBXGEOMETRYCAMERA_FRAME_COLOR                 "FrameColor"
+#define FIELD_KFBXGEOMETRYCAMERA_ORTHO_ZOOM                  "CameraOrthoZoom"
+
+// Rendering Options
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_LENS                 "CameraAndLens"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_LENS_DEPTH_OF_FIELD  "DepthOfField"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_LENS_ANTIALIASING    "Antialiasing"
+#define FIELD_KFBXGEOMETRYCAMERA_CAMERA_LENS_OVERSAMPLING    "OverSampling"
+#define FIELD_KFBXGEOMETRYCAMERA_RENDER_OPTIONS_USAGE_TIME   "UseOverSamplingTime"
+
+//
+// FbxCameraStereo
+//
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_VERSION                     "Version"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_GEOMETRY_VERSION            "GeometryVersion"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_NAME                        "Name"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_STEREO                      "Stereo"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_INTERAXIAL_SEP              "InteraxialSeparation"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_ZERO_PARALLAX               "ZeroParallax"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_TOE_IN_ADJUST               "ToeInAdjust"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_FILM_OFFSET_RIGHT_CAM       "FilmOffsetRightCam"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_FILM_OFFSET_LEFT_CAM        "FilmOffsetLeftCam"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_PRECOMP_FILE_NAME           "PrecompFileName"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_RELATIVE_PRECOMP_FILE_NAME  "RelativePrecompFileName"
+#define FIELD_KFBXGEOMETRYCAMERA_STEREO_PRECOMP_FILE_CONTENT        "PrecompFileContent"
+
+//
+// FbxCameraSwitcher
+//
+#define FIELD_KFBXGEOMETRYCAMERASWITCHER_SWITCHER            "Switcher"
+#define FIELD_KFBXGEOMETRYCAMERASWITCHER_NAME                "Name"
+#define FIELD_KFBXGEOMETRYCAMERASWITCHER_CAMERA_ID           "CameraId"
+#define FIELD_KFBXGEOMETRYCAMERASWITCHER_CAMERA_NAME         "CameraName"
+#define FIELD_KFBXGEOMETRYCAMERASWITCHER_CAMERA_INDEX_NAME   "CameraIndexName"
+
+
+//
+// FbxLight
+//
+#define FIELD_KFBXGEOMETRYLIGHT_GEOMETRY_VERSION      "GeometryVersion"
+#define FIELD_KFBXGEOMETRYLIGHT_LIGHT_TYPE            "LightType"
+#define FIELD_KFBXGEOMETRYLIGHT_LIGHT_TYPE_VERSION    "LightTypeVersion"
+#define FIELD_KFBXGEOMETRYLIGHT_CAST_LIGHT            "CastLight"
+
+
+//
+// FbxMesh
+//
+#define FIELD_KFBXGEOMETRYMESH_UV_VERSION            "Version"
+#define FIELD_KFBXGEOMETRYMESH_GEOMETRY_VERSION      "GeometryVersion"
+#define FIELD_KFBXGEOMETRYMESH_VERTICES              "Vertices"
+#define FIELD_KFBXGEOMETRYMESH_EDGES                 "Edges"
+#define FIELD_KFBXGEOMETRYMESH_INTERNAL_EDGES        "InternalEdges"
+#define FIELD_KFBXGEOMETRYMESH_NORMALS               "Normals"
+#define FIELD_KFBXGEOMETRYMESH_NORMALS_WCOMPONENT    "NormalsW"
+#define FIELD_KFBXGEOMETRYMESH_BINORMALS             "Binormals"
+#define FIELD_KFBXGEOMETRYMESH_BINORMALS_WCOMPONENT  "BinormalsW"
+#define FIELD_KFBXGEOMETRYMESH_TANGENTS              "Tangents"
+#define FIELD_KFBXGEOMETRYMESH_TANGENTS_WCOMPONENT   "TangentsW"
+#define FIELD_KFBXGEOMETRYMESH_NORMALS_INDEX         "NormalsIndex"
+#define FIELD_KFBXGEOMETRYMESH_BINORMALS_INDEX       "BinormalsIndex"
+#define FIELD_KFBXGEOMETRYMESH_TANGENTS_INDEX        "TangentsIndex"
+#define FIELD_KFBXGEOMETRYMESH_MATERIAL_ASSIGNATION  "MaterialAssignation"
+#define FIELD_KFBXGEOMETRYMESH_TEXTURE_ASSIGNATION   "TextureMode"
+#define FIELD_KFBXGEOMETRYMESH_POLYGON_INDEX         "PolygonVertexIndex"
+#define FIELD_KFBXGEOMETRYMESH_POLYGON_GROUP         "PolygonGroup"
+#define FIELD_KFBXGEOMETRYMESH_MATERIALS_ID          "Materials"
+#define FIELD_KFBXGEOMETRYMESH_TEXTURE_ID            "TextureId"
+#define FIELD_KFBXGEOMETRYMESH_TEXTURE_TYPE          "TextureType"
+#define FIELD_KFBXGEOMETRYMESH_UV_TYPE               "UVType"
+#define FIELD_KFBXGEOMETRYMESH_MAPPING_INFO_TYPE     "MappingInformationType"
+#define FIELD_KFBXGEOMETRYMESH_TEXTURE_UV            "TextureUV"
+#define FIELD_KFBXGEOMETRYMESH_TEXTURE_POLYGON_UV    "TexturePUV"
+#define FIELD_KFBXGEOMETRYMESH_GEOMETRY_UV_INFO      "GeometryUVInfo"
+#define FIELD_KFBXGEOMETRYMESH_TEXTURE_VERTEX_INDEX  "TextureVertexIndex"
+#define FIELD_KFBXGEOMETRYMESH_TEXTURE_UV_INDEX      "TextureUVVerticeIndex"
+#define FIELD_KFBXGEOMETRYMESH_VERTEX_COLOR_INFO        "VertexColorInfo"
+#define FIELD_KFBXGEOMETRYMESH_VERTEX_COLOR_VERSION     "Version"
+#define FIELD_KFBXGEOMETRYMESH_VERTEX_COLOR_ASSIGNATION "MappingInformationType"
+#define FIELD_KFBXGEOMETRYMESH_VERTEX_COLOR_VALUES      "Colors"
+#define FIELD_KFBXGEOMETRYMESH_VERTEX_COLOR_INDEX       "ColorIndex"
+#define FIELD_KFBXGEOMETRYMESH_SMOOTHING             "Smoothing"
+#define FIELD_KFBXGEOMETRYMESH_VERTEX_CREASE         "VertexCrease"
+#define FIELD_KFBXGEOMETRYMESH_EDGE_CREASE           "EdgeCrease"
+#define FIELD_KFBXGEOMETRYMESH_HOLE                  "Hole"
+#define FIELD_KFBXGEOMETRYMESH_USER_DATA             "UserData"
+#define FIELD_KFBXGEOMETRYMESH_USER_DATA_INDEX       "UserDataIndex"
+#define FIELD_KFBXGEOMETRYMESH_USER_DATA_TYPE        "UserDataType"
+#define FIELD_KFBXGEOMETRYMESH_USER_DATA_DIRECT_INDICES "UserDataDirectIndices"// remove me
+#define FIELD_KFBXGEOMETRYMESH_USER_DATA_DIRECT_COUNT   "UserDataDirectCount" //remove me
+#define FIELD_KFBXGEOMETRYMESH_USER_DATA_ID          "UserDataId"
+#define FIELD_KFBXGEOMETRYMESH_USER_DATA_ARRAY       "UserDataArray"
+#define FIELD_KFBXGEOMETRYMESH_USER_DATA_NAME        "UserDataName"
+#define FIELD_KFBXGEOMETRYMESH_VISIBILITY             "Visibility"
+#define FIELD_KFBXGEOMETRYMESH_SMOOTHNESS             "Smoothness"
+#define FIELD_KFBXGEOMETRYMESH_PREVIEW_DIVSION_LEVELS    "PreviewDivisionLevels"
+#define FIELD_KFBXGEOMETRYMESH_RENDER_DIVSION_LEVELS    "RenderDivisionLevels"
+#define FIELD_KFBXGEOMETRYMESH_DISPLAY_SUBDIVISIONS     "DisplaySubdivisions"
+#define FIELD_KFBXGEOMETRYMESH_PRESERVE_BORDERS         "PreserveBorders"
+#define FIELD_KFBXGEOMETRYMESH_PRESERVE_HARD_EDGES      "PreserveHardEdges"
+#define FIELD_KFBXGEOMETRYMESH_PROPAGATE_EDGE_HARDNESS  "PropagateEdgeHardness"
+#define FIELD_KFBXGEOMETRYMESH_BOUNDARY_RULE            "BoundaryRule"
+
+#define FIELD_KFBXGEOMETRYMESH_U_EXTENDED_COUNT      "UExtendedCount"
+#define FIELD_KFBXGEOMETRYMESH_U_CLOSED              "UClosed"
+#define FIELD_KFBXGEOMETRYMESH_U_TOPCAP              "UTopCap"
+#define FIELD_KFBXGEOMETRYMESH_U_STEP                "UStep"
+#define FIELD_KFBXGEOMETRYMESH_U_COUNT               "UCount"
+
+#define FIELD_KFBXGEOMETRYMESH_V_EXTENDED_COUNT      "VExtendedCount"
+#define FIELD_KFBXGEOMETRYMESH_V_CLOSED              "VClosed"
+#define FIELD_KFBXGEOMETRYMESH_V_TOPCAP              "VTopCap"
+#define FIELD_KFBXGEOMETRYMESH_V_STEP                "VStep"
+#define FIELD_KFBXGEOMETRYMESH_V_COUNT               "VCount"
+
+#define TOKEN_KFBXGEOMETRYMESH_NO_MAPPING_INFORMATION "NoMappingInformation"
+#define TOKEN_KFBXGEOMETRYMESH_BY_VERTICE            "ByVertice"
+#define TOKEN_KFBXGEOMETRYMESH_BY_POLYGON            "ByPolygon"
+#define TOKEN_KFBXGEOMETRYMESH_BY_POLYGON_VERTEX     "ByPolygonVertex"
+#define TOKEN_KFBXGEOMETRYMESH_BY_FACE               "ByFace"
+#define TOKEN_KFBXGEOMETRYMESH_BY_EDGE               "ByEdge"
+#define TOKEN_KFBXGEOMETRYMESH_ALL_SAME              "AllSame"
+#define TOKEN_KFBXGEOMETRYMESH_BY_MODEL              "ByModel"
+
+//
+// FbxSubDiv
+//
+#define FIELD_KFBXGEOMETRYSUBDIV_GEOMETRY               "SubdivGeometry"
+#define FIELD_KFBXGEOMETRYSUBDIV_GEOMETRY_VERSION       "GeometryVersion"
+#define FIELD_KFBXGEOMETRYSUBDIV_LEVEL_COUNT            "LevelCount"
+#define FIELD_KFBXGEOMETRYSUBDIV_CURRENT_LEVEL          "CurrentLevel"
+#define FIELD_KFBXGEOMETRYSUBDIV_DISPLAY_SMOOTHNESS     "Smoothness"
+
+//
+// Reference
+//
+#define TOKEN_REFERENCE_DIRECT                      "Direct"
+#define TOKEN_REFERENCE_INDEX                       "Index"
+#define TOKEN_REFERENCE_INDEX_TO_DIRECT             "IndexToDirect"
+
+//
+// FbxNurbs
+//
+#define FIELD_KFBXGEOMETRYNURB_NURB_VERSION          "NurbVersion"
+#define FIELD_KFBXGEOMETRYNURB_NURB_ORDER            "NurbOrder"
+#define FIELD_KFBXGEOMETRYNURB_DIMENSION             "Dimensions"
+#define FIELD_KFBXGEOMETRYNURB_STEP                  "Step"
+#define FIELD_KFBXGEOMETRYNURB_FORM                  "Form"
+#define FIELD_KFBXGEOMETRYNURB_UCAPPED               "UCapped"
+#define FIELD_KFBXGEOMETRYNURB_VCAPPED               "VCapped"
+#define FIELD_KFBXGEOMETRYNURB_POINTS                "Points"
+#define FIELD_KFBXGEOMETRYNURB_MULTIPLICITY_U        "MultiplicityU"
+#define FIELD_KFBXGEOMETRYNURB_MULTIPLICITY_V        "MultiplicityV"
+#define FIELD_KFBXGEOMETRYNURB_KNOTVECTOR_U          "KnotVectorU"
+#define FIELD_KFBXGEOMETRYNURB_KNOTVECTOR_V          "KnotVectorV"
+#define FIELD_KFBXGEOMETRYNURB_MATERIALS             "Materials"
+#define FIELD_KFBXGEOMETRYNURB_SURFACE_DISPLAY       "SurfaceDisplay"
+
+//
+// FbxNurbsSurface
+//
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_NURB_VERSION          "NurbsSurfaceVersion"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_NURB_ORDER            "NurbsSurfaceOrder"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_DIMENSION             "Dimensions"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_STEP                  "Step"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_FORM                  "Form"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_UCAPPED               "UCapped"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_VCAPPED               "VCapped"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_POINTS                "Points"
+//#define FIELD_KFBXGEOMETRYNURBS_SURFACE_MULTIPLICITY_U        "MultiplicityU"
+//#define FIELD_KFBXGEOMETRYNURBS_SURFACE_MULTIPLICITY_V        "MultiplicityV"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_KNOTVECTOR_U          "KnotVectorU"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_KNOTVECTOR_V          "KnotVectorV"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_MATERIALS             "Materials"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_SURFACE_DISPLAY       "SurfaceDisplay"
+#define FIELD_KFBXGEOMETRYNURBS_SURFACE_FLIP_NORMALS          "FlipNormals"
+
+//
+// FbxTrimNurbsSurface
+//
+#define FIELD_KFBXGEOMETRYTRIM_NURBS_SURFACE_VERSION          "TrimmedNurbVersion"
+#define FIELD_KFBXGEOMETRYTRIM_NURBS_SURFACE_FLIP_NORMALS     "FlipNormals"
+//#define FIELD_KFBXGEOMETRYTRIM_NURB_SURFACE          "NurbSurface"
+//#define FIELD_KFBXGEOMETRYTRIM_NURB_BOUNDARY         "TrimBoundary"
+//#define FIELD_KFBXGEOMETRYTRIM_NURB_EDGE             "BoundaryEdge"
+
+//
+// FbxBoundary
+//
+#define FIELD_KFBXGEOMETRYBOUNDARY_VERSION          "BoundaryVersion"
+
+//
+// FbxLine
+//
+#define FIELD_KFBXGEOMETRYLINE_VERSION          "LineVersion"
+#define FIELD_KFBXGEOMETRYLINE_POINTS           "Points"
+#define FIELD_KFBXGEOMETRYLINE_POINTS_INDEX     "PointsIndex"
+
+//
+// FbxSubDiv
+//
+#define FIELD_KFBXGEOMETRYSUBDIVISION_VERSION          "SubdivisionVersion"
+
+//
+// FbxNurbsCurve
+//
+#define FIELD_KFBXGEOMETRYNURBS_CURVE_VERSION          "NurbsCurveVersion"
+#define FIELD_KFBXGEOMETRYNURBS_CURVE_ORDER            "Order"
+#define FIELD_KFBXGEOMETRYNURBS_CURVE_DIMENSION        "Dimension"
+#define FIELD_KFBXGEOMETRYNURBS_CURVE_KNOTVECTOR       "KnotVector"
+#define FIELD_KFBXGEOMETRYNURBS_CURVE_FORM             "Form"
+#define FIELD_KFBXGEOMETRYNURBS_CURVE_POINTS           "Points"
+#define FIELD_KFBXGEOMETRYNURBS_CURVE_RATIONAL         "Rational"
+
+//
+// FbxPatch
+//
+#define FIELD_KFBXGEOMETRYPATCH_PATCH_VERSION         "PatchVersion"
+#define FIELD_KFBXGEOMETRYPATCH_PATCH_TYPE            "PatchType"
+#define FIELD_KFBXGEOMETRYPATCH_DIMENSIONS            "Dimensions"
+#define FIELD_KFBXGEOMETRYPATCH_STEP                  "Step"
+#define FIELD_KFBXGEOMETRYPATCH_CLOSED                "Closed"
+#define FIELD_KFBXGEOMETRYPATCH_UCAPPED               "UCapped"
+#define FIELD_KFBXGEOMETRYPATCH_VCAPPED               "VCapped"
+#define FIELD_KFBXGEOMETRYPATCH_POINTS                "Points"
+#define FIELD_KFBXGEOMETRYPATCH_SURFACE_DISPLAY       "SurfaceDisplay"
+#define FIELD_KFBXGEOMETRYPATCH_MATERIALS             "Materials"
+
+
+//
+// FbxGeometryWeightedMap
+//
+
+#define FIELD_KFBXGEOMETRY_WEIGHTED_MAP_VERSION         "Version"
+#define FIELD_KFBXGEOMETRY_WEIGHTED_MAP_SRC_COUNT       "SourceCount"
+#define FIELD_KFBXGEOMETRY_WEIGHTED_MAP_DST_COUNT       "DestinationCount"
+#define FIELD_KFBXGEOMETRY_WEIGHTED_MAP_INDEX_MAPPING   "IndexMapping"
+
+//
+// FbxSkeleton
+//
+#define FIELD_KFBXGEOMETRYSKELETON_LIMB_LENGTH           "LimbLength"
+#define FIELD_KFBXGEOMETRYSKELETON_LIMB_NODE_SIZE        "Size"
+#define FIELD_KFBXGEOMETRYSKELETON_LIMB_NODE_COLOR       "Color"
+
+//
+// FbxVideo
+//
+#define FIELD_KFBXVIDEO_USEMIPMAP                               "UseMipMap"
+
+//
+// FbxTexture
+//
+#define FIELD_KFBXTEXTURE_TEXTURE                               "Texture"
+#define FIELD_KFBXTEXTURE_TYPE                                  "Type"
+#define FIELD_KFBXTEXTURE_VERSION                               "Version"
+#define FIELD_KFBXTEXTURE_TEXTURE_NAME                          "TextureName"
+#define FIELD_KFBXTEXTURE_MEDIA                                 "Media"
+#define FIELD_KFBXTEXTURE_FILENAME                              "FileName"
+#define FIELD_KFBXTEXTURE_RELATIVE_FILENAME                     "RelativeFilename"
+#define FIELD_KFBXTEXTURE_TRANSLATION                           "Translation"
+#define FIELD_KFBXTEXTURE_SCALING                               "Scaling"
+#define FIELD_KFBXTEXTURE_UV_TRANSLATION                        "ModelUVTranslation"
+#define FIELD_KFBXTEXTURE_UV_SCALING                            "ModelUVScaling"
+#define FIELD_KFBXTEXTURE_ROTATION                              "Rotation"
+#define FIELD_KFBXTEXTURE_TILING                                "Tilling"
+#define FIELD_KFBXTEXTURE_ALPHA_SRC                             "Texture_Alpha_Source"
+#define FIELD_KFBXTEXTURE_CROPPING                              "Cropping"
+#define FIELD_KFBXTEXTURE_MAPPING_TYPE                          "Texture_Mapping_Type"
+#define FIELD_KFBXTEXTURE_PLANAR_NORMAL                         "Texture_Planar_Mapping_Normal"
+#define FIELD_KFBXTEXTURE_SWAPUV                                "SwapUV"
+#define FIELD_KFBXTEXTURE_MATERIAL_USE                          "MaterialMode"
+#define FIELD_KFBXTEXTURE_TEXTURE_USE                           "TextureUse"
+#define TOKEN_KFBXTEXTURE_TEXTURE_USE_STANDARD                  "Standard"
+#define TOKEN_KFBXTEXTURE_TEXTURE_USE_SHADOW_MAP                "ShadowMap"
+#define TOKEN_KFBXTEXTURE_TEXTURE_USE_LIGHT_MAP                 "LightMap"
+#define TOKEN_KFBXTEXTURE_TEXTURE_USE_SPHERICAL_REFLEXION_MAP   "SphericalReflexionMap"
+#define TOKEN_KFBXTEXTURE_TEXTURE_USE_SPHERE_REFLEXION_MAP      "SphereReflexionMap"
+#define TOKEN_KFBXTEXTURE_TEXTURE_USE_BUMP_NORMAL_MAP           "BumpNormalMap"
+#define TOKEN_KFBXTEXTURE_BLEND_TRANSLUCENT                     "Translucent"
+#define TOKEN_KFBXTEXTURE_BLEND_ADD                             "Add"
+#define TOKEN_KFBXTEXTURE_BLEND_MODULATE                        "Modulate"
+#define TOKEN_KFBXTEXTURE_BLEND_MODULATE2                       "Modulate2"
+#define TOKEN_KFBXTEXTURE_BLEND_OVER                            "Over"
+#define TOKEN_KFBXTEXTURE_BLEND_NORMAL                          "Normal"
+#define TOKEN_KFBXTEXTURE_BLEND_DISSOLVE                        "Dissolve"
+#define TOKEN_KFBXTEXTURE_BLEND_DARKEN		                    "Darken"
+#define TOKEN_KFBXTEXTURE_BLEND_COLORBURN                       "Colorburn"
+#define TOKEN_KFBXTEXTURE_BLEND_LINEARBURN 	                    "Linearburn"
+#define TOKEN_KFBXTEXTURE_BLEND_DARKERCOLOR                     "Darkercolor"
+#define TOKEN_KFBXTEXTURE_BLEND_LIGHTEN		                    "Lighten"
+#define TOKEN_KFBXTEXTURE_BLEND_SCREEN		                    "Screen	"
+#define TOKEN_KFBXTEXTURE_BLEND_COLORDODGE                      "Colordodge"
+#define TOKEN_KFBXTEXTURE_BLEND_LINEARDODGE                     "Lineardodge"
+#define TOKEN_KFBXTEXTURE_BLEND_LIGHTERCOLOR                    "Lightercolor"
+#define TOKEN_KFBXTEXTURE_BLEND_SOFTLIGHT		                "Softlight"
+#define TOKEN_KFBXTEXTURE_BLEND_HARDLIGHT		                "Hardlight	"
+#define TOKEN_KFBXTEXTURE_BLEND_VIVIDLIGHT                      "Vividlight"
+#define TOKEN_KFBXTEXTURE_BLEND_LINEARLIGHT                     "Linearlight"
+#define TOKEN_KFBXTEXTURE_BLEND_PINLIGHT 		                "Pinlight"
+#define TOKEN_KFBXTEXTURE_BLEND_HARDMIX		                    "Hardmix"
+#define TOKEN_KFBXTEXTURE_BLEND_DIFFERENCE 	                    "Difference"
+#define TOKEN_KFBXTEXTURE_BLEND_EXCLUSION 	                    "Exclusion"
+#define TOKEN_KFBXTEXTURE_BLEND_SUBTRACT                        "Subtract"
+#define TOKEN_KFBXTEXTURE_BLEND_DIVIDE                          "Divide"
+#define TOKEN_KFBXTEXTURE_BLEND_HUE 			                "Hue"
+#define TOKEN_KFBXTEXTURE_BLEND_SATURATION	                    "Saturation"
+#define TOKEN_KFBXTEXTURE_BLEND_COLOR		                    "Color"
+#define TOKEN_KFBXTEXTURE_BLEND_LUMINOSITY                      "Luminosity"
+#define TOKEN_KFBXTEXTURE_BLEND_OVERLAY                         "Overlay"
+#define TOKEN_KFBXTEXTURE_BLEND_MAXBLEND                        "MaxBlend"
+#define FIELD_KFBXTEXTURE_WRAP_U                                "WrapU"
+#define FIELD_KFBXTEXTURE_WRAP_V                                "WrapV"
+#define FIELD_KFBXTEXTURE_BLEND_MODE                            "BlendMode"
+#define FIELD_KFBXTEXTURE_ALPHA                                 "TextureAlpha"
+
+//
+// FbxSurfaceMaterial
+//
+#define FIELD_KFBXMATERIAL_MATERIAL      "Material"
+#define FIELD_KFBXMATERIAL_VERSION       "Version"
+#define FIELD_KFBXMATERIAL_SHADING_MODEL "ShadingModel"
+#define FIELD_KFBXMATERIAL_AMBIENT       "Ambient"
+#define FIELD_KFBXMATERIAL_DIFFUSE       "Diffuse"
+#define FIELD_KFBXMATERIAL_SPECULAR      "Specular"
+#define FIELD_KFBXMATERIAL_EMISSIVE      "Emissive"
+#define FIELD_KFBXMATERIAL_SHININESS     "Shininess"
+#define FIELD_KFBXMATERIAL_REFLECTIVITY  "Reflectivity"
+#define FIELD_KFBXMATERIAL_ALPHA         "Alpha"
+#define FIELD_KFBXMATERIAL_MULTI_LAYER   "MultiLayer"
+
+//
+// FbxCluster
+//
+#define FIELD_KFBXLINK_LINK              "Link"
+#define FIELD_KFBXLINK_MODE              "Mode"
+#define FIELD_KFBXLINK_USERDATA          "UserData"
+#define FIELD_KFBXLINK_INDEXES           "Indexes"
+#define FIELD_KFBXLINK_WEIGHTS           "Weights"
+#define FIELD_KFBXLINK_TRANSFORM         "Transform"
+#define FIELD_KFBXLINK_TRANSFORM_LINK    "TransformLink"
+#define FIELD_KFBXLINK_ASSOCIATE_MODEL   "AssociateModel"
+#define FIELD_KFBXLINK_TRANSFORM_PARENT  "TransformParent"
+#define TOKEN_KFBXLINK_AVERAGE           "Average"
+#define TOKEN_KFBXLINK_ADDITIVE          "Additive"
+#define TOKEN_KFBXLINK_TOTAL1            "Total1"
+
+//
+// FbxDeformer
+//
+#define FIELD_KFBXDEFORMER_DEFORMER         "Deformer"
+#define FIELD_KFBXDEFORMER_VERSION          "Version"
+#define FIELD_KFBXDEFORMER_TYPE             "Type"
+#define FIELD_KFBXDEFORMER_MULTI_LAYER      "MultiLayer"
+#define FIELD_KFBXDEFORMER_MODE             "Mode"
+#define FIELD_KFBXDEFORMER_USERDATA         "UserData"
+#define FIELD_KFBXDEFORMER_INDEXES          "Indexes"
+#define FIELD_KFBXDEFORMER_WEIGHTS          "Weights"
+#define FIELD_KFBXDEFORMER_TRANSFORM        "Transform"
+#define FIELD_KFBXDEFORMER_TRANSFORM_LINK   "TransformLink"
+#define FIELD_KFBXDEFORMER_ASSOCIATE_MODEL  "AssociateModel"
+#define FIELD_KFBXDEFORMER_TRANSFORM_PARENT "TransformParent"
+#define TOKEN_KFBXDEFORMER_AVERAGE          "Average"
+#define TOKEN_KFBXDEFORMER_ADDITIVE         "Additive"
+#define TOKEN_KFBXDEFORMER_TOTAL1           "Total1"
+
+//
+// FbxSkin
+//
+#define FIELD_KFBXSKIN_VERSION              "Version"
+#define FIELD_KFBXSKIN_DEFORM_ACCURACY      "Link_DeformAcuracy"
+#define FIELD_KFBXSKIN_SKINNINGTYPE         "SkinningType"
+#define TOKEN_KFBXSKIN_LINEAR               "Linear"
+#define TOKEN_KFBXSKIN_DUALQUATERNION       "DualQuaternion"
+#define TOKEN_KFBXSKIN_BLEND                "Blend"
+#define FIELD_KFBXSKIN_INDEXES              "Indexes"
+#define FIELD_KFBXSKIN_BLENDWEIGHTS         "BlendWeights"
+
+//
+// FbxCluster
+//
+#define FIELD_KFBXCLUSTER_VERSION          "Version"
+#define FIELD_KFBXCLUSTER_MODE             "Mode"
+#define FIELD_KFBXCLUSTER_USERDATA         "UserData"
+#define FIELD_KFBXCLUSTER_INDEXES          "Indexes"
+#define FIELD_KFBXCLUSTER_WEIGHTS          "Weights"
+#define FIELD_KFBXCLUSTER_TRANSFORM        "Transform"
+#define FIELD_KFBXCLUSTER_TRANSFORM_LINK   "TransformLink"
+#define FIELD_KFBXCLUSTER_ASSOCIATE_MODEL  "AssociateModel"
+#define FIELD_KFBXCLUSTER_TRANSFORM_PARENT "TransformParent"
+#define TOKEN_KFBXCLUSTER_AVERAGE          "Average"
+#define TOKEN_KFBXCLUSTER_ADDITIVE         "Additive"
+#define TOKEN_KFBXCLUSTER_TOTAL1           "Total1"
+
+//
+// FbxBlendShape
+//
+#define FIELD_KFBXBLENDSHAPE_VERSION        "Version"
+
+//
+// FbxBlendShapeChannel
+//
+#define FIELD_KFBXBLENDSHAPECHANNEL_VERSION                    "Version"
+#define FIELD_KFBXBLENDSHAPECHANNEL_DEFORMPERCENT              "DeformPercent"
+#define FIELD_KFBXBLENDSHAPECHANNEL_FULLWEIGHTS                "FullWeights"
+
+//
+// FbxShape
+//
+#define FIELD_KFBXSHAPE_SHAPE         "Shape"
+#define FIELD_KFBXSHAPE_VERSION       "Version"
+#define FIELD_KFBXSHAPE_INDEXES       "Indexes"
+#define FIELD_KFBXSHAPE_VERTICES      "Vertices"
+#define FIELD_KFBXSHAPE_NORMALS       "Normals"
+
+//
+// FbxVertexCacheDeformer
+//
+#define FILED_KFBXVERTEXCACHEDEFORMER_VERSION           "Version"
+#define FILED_KFBXVERTEXCACHEDEFORMER_CACHE_CHANNEL     "CacheChannel"
+
+//
+// FbxCache
+//
+#define FIELD_KFBXCACHE_VERTEX_CACHE        "Cache"
+#define FIELD_KFBXCACHE_VERSION             "Version"
+#define FIELD_KFBXCACHE_CACHE_PATH          "CachePath"
+
+//
+// FbxBindingTable
+//
+#define FIELD_KFBXBINDINGTABLE_BINDING_TABLE            "BindingTable"
+#define FIELD_KFBXBINDINGTABLE_VERSION                  "Version"
+#define FIELD_KFBXBINDINGTABLE_TARGET                   "Target"
+#define FIELD_KFBXBINDINGTABLE_ENTRY                    "Entry"
+
+//
+// FbxImplementation
+//
+#define FIELD_KFBXIMPLEMENTATION_IMPLEMENTATION         "Implementation"
+#define FIELD_KFBXIMPLEMENTATION_VERSION                "Version"
+
+//
+// FbxBindingOperator
+//
+#define FIELD_KFBXBINDINGOPERATOR_BINDING_OPERATOR      "BindingOperator"
+#define FIELD_KFBXBINDINGOPERATOR_VERSION               "Version"
+#define FIELD_KFBXBINDINGOPERATOR_ENTRY                 "Entry"
+
+//
+// FbxCollection
+//
+#define FIELD_KFBXCOLLECTION_COLLECTION                 "Collection"
+#define FIELD_KFBXCOLLECTION_VERSION                    "Version"
+
+//
+// FbxCollectionExclusive
+//
+#define FIELD_KFBXCOLLECTIONEXCLUSIVE_COLLECTIONEXCLUSIVE "CollectionExclusive"
+#define FIELD_KFBXCOLLECTIONEXCLUSIVE_VERSION             "Version"
+
+//
+// FbxSelectionSet
+//
+#define FIELD_KFBXSELECTIONSET_VERTICE_INDEXARRAY           "VertexIndexArray"
+#define FIELD_KFBXSELECTIONSET_EDGE_INDEXARRAY              "EdgeIndexArray"
+#define FIELD_KFBXSELECTIONSET_POLYGONVERTICES_INDEXARRAY   "PolygonIndexArray"
+
+//
+// FbxDisplayLayer
+//
+#define FIELD_KFBXDISPLAYLAYER_DISPLAYLAYER             "DisplayLayer"
+#define FIELD_KFBXDISPLAYLAYER_VERSION                  "Version"
+
+//
+// FbxDocument
+//
+#define FIELD_KFBXDOCUMENT_DOCUMENT                     "Document"
+#define FIELD_KFBXDOCUMENT_VERSION                      "Version"
+
+//
+// FbxLayeredTexture
+//
+#define FIELD_KFBXLAYEREDTEXTURE_LAYERED_TEXTURE        "LayeredTexture"
+#define FIELD_KFBXLAYEREDTEXTURE_VERSION                "Version"
+#define FIELD_KFBXLAYEREDTEXTURE_BLENDMODES             "BlendModes"
+#define FIELD_KFBXLAYEREDTEXTURE_ALPHAS                 "Alphas"
+
+//
+// FbxGobo
+//
+#define FIELD_KFBXGOBO_GOBOMANAGER       "GoboManager"
+#define FIELD_KFBXGOBO_GOBO              "Gobo"
+#define FIELD_KFBXGOBO_LIGHTGOBO         "LightGobo"
+#define FIELD_KFBXGOBO_VERSION           "Version"
+#define FIELD_KFBXGOBO_GOBONAME          "GoboName"
+#define FIELD_KFBXGOBO_GOBOPATH          "GoboPath"
+#define FIELD_KFBXGOBO_DRAWCOMPONENT     "DrawComponent"
+
+
+//
+// Password
+//
+#define FIELD_PASSWORD          "NodeId"
+#define FIELD_OLD_PASSWORD      "Param2a"
+#define FIELD_XOR_STRING        "?|/?*"
+
+
+// Meanfull names for MB 6.0
+#define FIELD_KFBXLAYER_ELEMENT_UV                  "LayerElementUV"
+#define FIELD_KFBXLAYER_ELEMENT_SMOOTHING           "LayerElementSmoothing"
+#define FIELD_KFBXLAYER_ELEMENT_VERTEX_CREASE       "LayerElementVertexCrease"
+#define FIELD_KFBXLAYER_ELEMENT_EDGE_CREASE         "LayerElementEdgeCrease"
+#define FIELD_KFBXLAYER_ELEMENT_HOLE                "LayerElementHole"
+#define FIELD_KFBXLAYER_ELEMENT_USER_DATA           "LayerElementUserData"
+#define FIELD_KFBXLAYER_ELEMENT_VISIBILITY          "LayerElementVisibility"
+#define FIELD_KFBXLAYER_ELEMENT_NORMAL              "LayerElementNormal"
+#define FIELD_KFBXLAYER_ELEMENT_BINORMAL            "LayerElementBinormal"
+#define FIELD_KFBXLAYER_ELEMENT_TANGENT             "LayerElementTangent"
+#define FIELD_KFBXLAYER_ELEMENT_MATERIAL            "LayerElementMaterial"
+#define FIELD_KFBXLAYER_ELEMENT_TEXTURE             "LayerElementTexture"
+#define FIELD_KFBXLAYER_ELEMENT_COLOR               "LayerElementColor"
+#define FIELD_KFBXLAYER_ELEMENT_POLYGON_GROUP       "LayerElementPolygonGroup"
+#define FIELD_KFBXLAYER_ELEMENT_VERSION             "Version"
+#define FIELD_KFBXLAYER_ELEMENT_NAME                "Name"
+#define FIELD_KFBXLAYER_ELEMENT_TYPED_INDEX         "TypedIndex"
+#define FIELD_KFBXLAYER_ELEMENT_MAPPING_INFO_TYPE   "MappingInformationType"
+#define FIELD_KFBXLAYER_ELEMENT_REFERENCE_INFO_TYPE "ReferenceInformationType"
+#define FIELD_KFBXLAYER                             "Layer"
+#define FIELD_KFBXLAYER_VERSION                     "Version"
+#define FIELD_KFBXLAYER_ELEMENT                     "LayerElement"
+#define FIELD_KFBXLAYER_ELEMENT_TYPE                "Type"
+
+//
+// FbxLayer
+//
+#define FIELD_KFBXLAYER_GEOMETRY_LAYER              "GeometryLayer"
+#define FIELD_KFBXLAYER_LAYER_TEXTURE_INFO          "LayerTextureInfo"
+#define FIELD_KFBXLAYER_TEXTURE_MODE                "TextureMode"
+#define FIELD_KFBXLAYER_TEXTURE_BLEND_MODE          "TextureBlendMode"
+#define FIELD_KFBXLAYER_TEXTURE_ID_COUNT            "TextureIdCount"
+#define FIELD_KFBXLAYER_TEXTURE_ID                  "TextureId"
+#define FIELD_KFBXLAYER_UV_MODE                     "UVMode"
+#define FIELD_KFBXLAYER_UV_COUNT                    "UVCount"
+#define FIELD_KFBXLAYER_UV                          "UV"
+#define FIELD_KFBXLAYER_UV_INDEX                    "UVIndex"
+#define FIELD_KFBXLAYER_UV_ID_COUNT                 "UVIdCount"
+#define FIELD_KFBXLAYER_UV_ID                       "UVId"
+
+//
+// FbxPose
+//
+#define FIELD_KFBXPOSE_VERSION                      "Version"
+#define FIELD_KFBXPOSE_TYPE                         "Type"
+#define FIELD_KFBXPOSE_POSE                         "Pose"
+#define FIELD_KFBXPOSE_BIND_POSE                    "BindPose"
+#define FIELD_KFBXPOSE_REST_POSE                    "RestPose"
+
+
+//
+// KSceneInfo
+//
+#define FIELD_SCENEINFO                     "SceneInfo"
+#define FIELD_SCENEINFO_TYPE                "Type"
+#define FIELD_SCENEINFO_VERSION             "Version"
+#define FIELD_SCENEINFO_METADATA            "MetaData"
+#define FIELD_SCENEINFO_METADATA_VERSION    "Version"
+#define FIELD_SCENEINFO_METADATA_TITLE      "Title"
+#define FIELD_SCENEINFO_METADATA_SUBJECT    "Subject"
+#define FIELD_SCENEINFO_METADATA_AUTHOR     "Author"
+#define FIELD_SCENEINFO_METADATA_KEYWORDS   "Keywords"
+#define FIELD_SCENEINFO_METADATA_REVISION   "Revision"
+#define FIELD_SCENEINFO_METADATA_COMMENT    "Comment"
+
+//
+// Global setting:
+//
+#define FIELD_GLOBAL_SETTINGS                 "GlobalSettings"
+#define FIELD_GLOBAL_SETTINGS_VERSION         "Version"
+
+//
+// FbxSceneReference:
+//
+#define FIELD_KFBXREFERENCE_REFERENCE         "SceneReference"
+#define FIELD_KFBXREFERENCE_VERSION           "Version"
+
+//
+// Constraints
+//
+#define FIELD_CONSTRAINT                                "Constraint"
+#define FIELD_CONSTRAINT_VERSION                        "Version"
+#define FIELD_CONSTRAINT_OFFSET                         "Offset"
+#define TOKEN_KFBXCONSTRAINT_CONSTRAINT                 "Constraint"
+#define TOKEN_KFBXCONSTRAINT_POSITION                   "Position From Positions"
+#define TOKEN_KFBXCONSTRAINT_ROTATION                   "Rotation From Rotations"
+#define TOKEN_KFBXCONSTRAINT_SCALE                      "Scale From Scales"
+#define TOKEN_KFBXCONSTRAINT_PARENT                     "Parent-Child"
+#define TOKEN_KFBXCONSTRAINT_SINGLECHAINIK              "Single Chain IK"
+#define TOKEN_KFBXCONSTRAINT_AIM                        "Aim"
+#define TOKEN_KFBXCONSTRAINT_CHARACTER                  "Character"
+#define TOKEN_KFBXCONSTRAINT_CUSTOM						"Custom"
+
+//
+// Controlset plug
+//
+
+
+//
+// Object definition
+//
+#define FIELD_OBJECT_DESCRIPTION                                        "Document"
+#define FIELD_OBJECT_DESCRIPTION_NAME                                   "Name"
+#define FIELD_OBJECT_REFERENCES                                         "References"
+#define FIELD_OBJECT_REFERENCES_FILE_PATH_URL                           "FilePathUrl"
+#define FIELD_OBJECT_REFERENCES_REFERENCE                               "Reference"
+#define FIELD_OBJECT_DEFINITION                                         "Definitions"
+#define FIELD_OBJECT_PROPERTY_TEMPLATE                                  "PropertyTemplate"
+#define FIELD_OBJECT_DEFINITION_VERSION                                 "Version"
+#define FIELD_OBJECT_DEFINITION_COUNT                                   "Count"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE                             "ObjectType"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_AUDIO                       "Audio"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_AUDIO_LAYER                 "AudioLayer"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_REFERENCE                   "SceneReference"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_CONTAINER                   "Container"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_MODEL                       "Model"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_GEOMETRY                    "Geometry"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_NODE_ATTRIBUTE              "NodeAttribute"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_GEOMETRY_WEIGHTED_MAP       "GeometryWeightedMap"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_MARKETSET                   "MarkerSet"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_MATERIAL                    "Material"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_COLLECTION                  "Collection"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_COLLECTION_EXCLUSIVE        "CollectionExclusive"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_DISPLAY_LAYER               "DisplayLayer"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_TEXTURE                     "Texture"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_THUMBNAIL                   "Thumbnail"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_VIDEO                       "Video"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_DEFORMER                    "Deformer"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_SUBDEFORMER                 "SubDeformer"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_SHAPE                       "Shape"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_BLENDSHAPE                  "BlendShape"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_BLENDSHAPECHANNEL           "BlendShapeChannel"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_CONSTRAINT                  "Constraint"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_CONTROLSET_PLUG             "ControlSetPlug"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_POSE                        "Pose"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_GENERIC_NODE                "GenericNode"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_BOUNDARY                    "Boundary"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_CACHE                       "Cache"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_IMPLEMENTATION              "Implementation"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_BINDINGTABLE                "BindingTable"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_BINDINGOPERATOR             "BindingOperator"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_LAYERED_TEXTURE             "LayeredTexture"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_PROCEDURAL_TEXTURE          "ProceduralTexture"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_SCENEINFO                   FIELD_SCENEINFO
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_SCENE                       "Scene"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_LIBRARY                     "Library"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_DOCUMENT                    "Document"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_FOLDER                      "Folder"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_CLIP                        "Clip"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_TIMELINE                    "TimelineX"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_TIMELINE_TRACK              "TimelineXTrack"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_ENVIRONMENT                 "KFbxEnvironment"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_OBJECTMETADATA              "ObjectMetaData"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_PLUGIN_PARAMS				"PluginParameters"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_ANIM_STACK					"AnimationStack"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_ANIM_LAYER					"AnimationLayer"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_ANIM_CURVENODE              "AnimationCurveNode"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_ANIM_CURVE                  "AnimationCurve"  
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_ANIM_EVALUATOR              "AnimationEvaluator"
+
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_SELECTIONNODE               "SelectionNode"
+
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_MESH                         "Mesh"
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_SUBDIV                       "Subdiv"
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_PATCH                        "Patch"
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_NURB                         "Nurb"
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_NURBS_SURFACE                "NurbsSurface"
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_NURBS_CURVE                  "NurbsCurve"
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_TRIM_NURB_SURFACE            "TrimNurbsSurface"
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_BOUNDARY                     "Boundary"
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_LINE                         "Line"
+#define FIELD_OBJECT_TYPE_GEOMETRY_SUBTYPE_SHAPE                        "Shape"
+#define FIELD_OBJECT_DEFINITION_OBJECT_TYPE_GLOBAL_SETTINGS             FIELD_GLOBAL_SETTINGS
+
+//
+// Object properties
+//
+#define FIELD_OBJECT_PROPERTIES                      "Objects"
+
+
+//
+// Object relations
+//
+#define FIELD_OBJECT_RELATIONS                       "Relations"
+#define FIELD_OBJECT_RELATIONS_TYPE_MODEL            "Model"
+#define FIELD_OBJECT_RELATIONS_TYPE_MATERIAL         "Material"
+#define FIELD_OBJECT_RELATIONS_TYPE_TEXTURE          "Texture"
+#define FIELD_OBJECT_RELATIONS_TYPE_AUDIO            "Audio"
+#define FIELD_OBJECT_RELATIONS_TYPE_VIDEO            "Video"
+#define FIELD_OBJECT_RELATIONS_TYPE_CONSTRAINT       "Constraint"
+#define FIELD_OBJECT_RELATIONS_TYPE_DEFORMER         "Deformer"
+#define FIELD_OBJECT_RELATIONS_TYPE_POSE             "Pose"
+#define FIELD_OBJECT_RELATIONS_TYPE_SCENEINFO        FIELD_SCENEINFO
+#define FIELD_OBJECT_RELATIONS_TYPE_CACHE            "Cache"
+
+//
+// Object connections
+//
+#define FIELD_OBJECT_CONNECTIONS                     "Connections"
+
+
+//
+// Takes
+//
+#define FIELD_TAKES                                  "Takes"
+
+// Embedded files
+#define FIELD_EMBEDDED_FILES                         "Embedding"
+#define FIELD_EMBEDDED_FILE                          "File"
+// Original filename, relative to the fbx
+// It may point to a file not below the fbx.
+#define FIELD_EMBEDDED_ORIGINAL_FILENAME             "Original"
+// Embedded filename, unique to the fbx, always relative to the fbx file;
+// if two original filenames, in separate folders, are embedded in an fbx file,
+// one of them will be renamed by using a folder.
+#define FIELD_EMBEDDED_FILENAME                      "Filename"
+
+// Link back to the objects which use this file.
+#define FIELD_EMBEDDED_CONSUMERS                     "Consumers"
+#define FIELD_EMBEDDED_CONSUMER                      "Consumer"
+
+//
+// Node Attribute
+//
+#define FIELD_NODE_ATTRIBUTE_NAME                   "NodeAttributeName"
+#define FIELD_NODE_ATTRIBUTE_REFTO                  "NodeAttributeRefTo"
+
+//
+// Old sections
+//
+#define FIELD_OLD_SECTION_VERSION5                  "Version5"
+#define FIELD_OLD_SECTION_HIERARCHYVIEW             "HierarchyView"
+
+#define OBJECT_OLD_SECTION_VERSION5                 "OldSection_VersionFive"
+#define OBJECT_OLD_SECTION_HIERARCHYVIEW            "OldSection_HierarchyView"
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_FILE_TOKENS_H_ */

+ 168 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxglobalcamerasettings.h

@@ -0,0 +1,168 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxglobalcamerasettings.h
+#ifndef _FBXSDK_FILEIO_GLOBAL_CAMERA_SETTINGS_H_
+#define _FBXSDK_FILEIO_GLOBAL_CAMERA_SETTINGS_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxStatus;
+class FbxManager;
+class FbxScene;
+class FbxCamera;
+class FbxCameraSwitcher;
+
+#define FBXSDK_CAMERA_PERSPECTIVE	"Producer Perspective"
+#define FBXSDK_CAMERA_TOP			"Producer Top"
+#define FBXSDK_CAMERA_FRONT			"Producer Front"
+#define FBXSDK_CAMERA_BACK			"Producer Back"
+#define FBXSDK_CAMERA_RIGHT			"Producer Right"
+#define FBXSDK_CAMERA_LEFT			"Producer Left"
+#define FBXSDK_CAMERA_BOTTOM		"Producer Bottom"
+#define FBXSDK_CAMERA_SWITCHER		"Camera Switcher"
+
+/** This class contains the global camera settings.
+  * \nosubgrouping
+  * \remarks This class exists for FBX version 6.x and earlier. The new FBX v7.x file format 
+  * that is now the default no longer uses it. The relevant data (a subset of this class) has 
+  * been moved to the FbxGlobalSettings object and should be used instead.
+  */
+class FBXSDK_DLL FbxGlobalCameraSettings
+{
+    FBXSDK_FRIEND_NEW();
+
+public:
+	/** \name Default Camera Settings */
+	//@{
+		/** \enum EViewingMode Viewing modes. */
+		enum EViewingMode
+		{
+			eStandard,	//<! Standard view mode.
+			eXRay,		//<! X ray view mode.
+			eModelsOnly	//<! Model only view mode.
+		};
+
+		/** Sets the default camera.
+		* \param pCameraName Name of the default camera.
+		* \param pStatus The FbxStatus object to hold error codes.
+		* \return \c True if camera name is valid, returns \c false if it is not valid.
+		* \remark A valid camera name must be either one of the defined tokens (FBXSDK_CAMERA_PERSPECTIVE, FBXSDK_CAMERA_TOP, FBXSDK_CAMERA_BOTTOM, FBXSDK_CAMERA_FRONT, FBXSDK_CAMERA_BACK,
+		* FBXSDK_CAMERA_RIGHT, FBXSDK_CAMERA_LEFT and FBXSDK_CAMERA_SWITCHER) or the name of a camera that is inserted in the node tree under the scene's root node. */
+		bool SetDefaultCamera(const char* pCameraName, FbxStatus* pStatus=NULL);
+
+		/** Returns the default camera name.
+		* \return The default camera name, or returns an empty string if no camera name has been specified. */
+		const char* GetDefaultCamera() const;
+
+		//! Restores the default settings.
+		void RestoreDefaultSettings();
+
+		/** Sets the default viewing mode.
+		* \param pViewingMode Viewing mode to set(eStandard, eXRay or eModelsOnly). */
+		void SetDefaultViewingMode(EViewingMode pViewingMode);
+
+		/** Returns the default viewing mode.
+		* \return The currently set Viewing mode. */
+		EViewingMode GetDefaultViewingMode() const;
+	//@}
+
+	/** \name Producer Cameras
+	* Producer cameras are global cameras in MotionBuilder you use to view the scene.
+	* You cannot animate Producer cameras but you can specify their default positions. */
+	//@{
+		/** Creates the default Producer cameras. */
+		void CreateProducerCameras();
+
+		/** Destroys the default Producer cameras. */
+		void DestroyProducerCameras();
+
+		/** Checks if the camera is a Producer camera.
+		* \param pCamera The camera to check.
+		* \return \c True if it is a producer camera, returns \c false if it is not a producer camera. */
+		bool IsProducerCamera(FbxCamera* pCamera) const;
+
+		/** Returns a reference to the Producer perspective camera.
+		* \return The reference to the internal Perspective camera. */
+		FbxCamera* GetCameraProducerPerspective() const;
+
+		/** Returns a reference to the Producer front camera.
+		* \return The reference to the internal Front camera. */
+		FbxCamera* GetCameraProducerFront() const;
+
+		/** Returns a reference to the Producer back camera.
+		* \return The reference to the internal Back camera. */
+		FbxCamera* GetCameraProducerBack() const;
+
+		/** Returns a reference to the Producer left camera.
+		* \return The reference to the internal Left camera. */
+		FbxCamera* GetCameraProducerLeft() const;
+
+		/** Returns a reference to the Producer right camera.
+		* \return The reference to the internal Right camera. */
+		FbxCamera* GetCameraProducerRight() const;
+
+		/** Returns a reference to the Producer top camera.
+		* \return The reference to the internal Top camera. */
+		FbxCamera* GetCameraProducerTop() const;
+
+		/** Returns a reference to the Producer bottom camera.
+		* \return The reference to the internal Bottom camera. */
+		FbxCamera* GetCameraProducerBottom() const;
+
+		/** Returns the Camera Switcher.
+		* \return A pointer to the Camera Switcher.
+		* \remark This node has a \c FbxNodeAttribute::eCameraSwitcher node attribute type. This node is not saved when there is no camera in the scene. Nodes inserted below are never saved.
+		* Camera indices start at 1. Out of range indices are clamped between 1 and the number of cameras in the scene. The index of a camera refers to its order of appearance when searching
+		* the node tree depth first. If a camera is added or removed after camera indices have been set, the camera indices must be updated. It is easier to set camera indices once every camera
+		* have been set. Camera index keys must be set using constant interpolation to ensure that camera switches occur exactly at key time. */
+		FbxCameraSwitcher* GetCameraSwitcher() const;
+
+		/** Sets the Camera Switcher.
+		* \param pSwitcher The Camera Switcher to be set. */
+		void SetCameraSwitcher(FbxCameraSwitcher* pSwitcher);
+	//@}
+
+    /** Assignment operator.
+	* \param pGlobalCameraSettings FbxGlobalCameraSettings object assigned to this one. */
+    const FbxGlobalCameraSettings& operator=(const FbxGlobalCameraSettings& pGlobalCameraSettings);
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    bool CopyProducerCamera(const char* pCameraName, const FbxCamera* pCamera, bool pIncludeConnections = false) const;
+
+private:
+    FbxGlobalCameraSettings(FbxManager& pManager, FbxScene& pScene);
+    ~FbxGlobalCameraSettings();
+
+	FbxScene*			mScene;
+    FbxString			mDefaultCamera;
+    EViewingMode		mDefaultViewingMode;
+    FbxCamera*			mCameraPerspective;
+    FbxCamera*			mCameraFront;
+    FbxCamera*			mCameraBack;
+    FbxCamera*			mCameraLeft;
+    FbxCamera*			mCameraRight;
+    FbxCamera*			mCameraTop;
+    FbxCamera*			mCameraBottom;
+    FbxCameraSwitcher*	mCameraSwitcher;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_GLOBAL_CAMERA_SETTINGS_H_ */

+ 229 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxgloballightsettings.h

@@ -0,0 +1,229 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxgloballightsettings.h
+#ifndef _FBXSDK_FILEIO_GLOBAL_LIGHT_SETTINGS_H_
+#define _FBXSDK_FILEIO_GLOBAL_LIGHT_SETTINGS_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxpropertytypes.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxGlobalLightSettingsProperties;
+
+/** This class contains functions for accessing global light settings.
+  * \nosubgrouping
+  * \remarks This class exists for FBX version 6.x and earlier. The new FBX v7.x file format that is 
+  * now the default no longer uses it. The relevant data (a subset of this class) has been moved to
+  * the FbxGlobalSettings object and should be used instead.
+  */
+class FBXSDK_DLL FbxGlobalLightSettings
+{
+
+public:
+    FBXSDK_FRIEND_NEW();
+    /**
+      * \name Ambient Color
+      */
+    //@{
+
+    /** Sets the ambient color.
+      * \param pAmbientColor            The ambient color to set.
+      * \remarks                        The ambient color only use RGB channels.
+      */
+    void SetAmbientColor(FbxColor pAmbientColor);
+
+    /** Returns the ambient color.
+      * \return                         The ambient color.
+      */
+    FbxColor GetAmbientColor() const;
+
+    //@}
+
+    /**
+      * \name Fog Option
+      */
+    //@{
+
+    /** Activates or disables the fog.
+      * \param pEnable                  Set to \c true to activate the fog option or set to \c false to disable the fog option.
+      */
+    void SetFogEnable(bool pEnable);
+
+    /** Returns the fog option's current state.
+      * \return                         \c True if fog is activated, returns \c false if fog is disabled.
+      */
+    bool GetFogEnable() const;
+
+    /** Sets the fog color.
+      * \param pColor                   The fog color to be set.
+      * \remarks                        The fog color only uses RGB channels.
+      */
+    void SetFogColor(FbxColor pColor);
+
+    /** Returns the fog color.
+      * \return                         The fog color.
+      * \remarks                        The fog color only uses RGB channels.
+      */
+    FbxColor GetFogColor() const;
+
+    /** \enum EFogMode                  Fog types.
+      */
+    enum EFogMode
+    {
+        eLinear,				//! Linear fog mode.
+        eExponential,			//! Exponential fog mode.
+        eExponentialSquareRoot	//! Exponential square root fog mode.
+    };
+
+    /** Sets the fog mode.
+      * \param pMode                    The fog type to be set.
+      */
+    void SetFogMode(EFogMode pMode);
+
+    /** Returns the fog mode.
+      * \return                         The currently set fog mode.
+      */
+    EFogMode GetFogMode() const;
+
+    /** Sets the fog density.
+      * \param pDensity                 The fog density to be set. It can be any double value, however it can
+      *                                 happen that other sections of FBX SDK may clamp values to reasonable values.
+      * \remarks                        This function is only used when the fog mode is set to exponential or square root exponential.
+      */
+    void SetFogDensity(double pDensity);
+
+    /** Returns the fog density.
+      * \return                         The currently set fog density.
+      * \remarks                        This function is only used when the fog mode is set to exponential or square root exponential.
+      */
+    double GetFogDensity() const;
+
+    /** Sets the distance from the view where the fog begins.
+      * \param pStart                   Distance where the fog begins.
+      * \remarks                        This function is only used when the fog mode is set to linear. The new value is clamped to fit inside the interval [0, FogEnd()].
+      */
+    void SetFogStart(double pStart);
+
+    /** Returns the distance from the view where the fog begins.
+      * \return                         The distance from the view where the fog begins.
+      * \remarks                        This function is only used when the fog mode is set to linear.
+      */
+    double GetFogStart() const;
+
+    /** Sets the distance from the view where the fog ends.
+      * \param pEnd                     Distance where the fog ends.
+      * \remarks                        This function is only used when the fog mode is set to linear. The new value is adjusted to fit within the interval [FogStart(), inf).
+      */
+    void SetFogEnd(double pEnd);
+
+    /** Returns the distance from the view where the fog ends.
+      * \return                         The distance from the view where the fog ends.
+      * \remarks                        This function is only used when the fog mode is set to linear.
+      */
+    double GetFogEnd() const;
+
+    //@}
+
+    /**
+      * \name Shadow Planes
+      * The functions in this section are supported only by FiLMBOX version 2.7 and earlier.
+      * FiLMBOX 3.0 supports shadow planes within a specific shader, which is not supported by the FBX SDK.
+      */
+    //@{
+
+    /** Struct used to define the shadow plane.
+      */
+    struct FBXSDK_DLL ShadowPlane
+    {
+        //! Default constructor.
+        ShadowPlane();
+
+        //! Activate flag.
+        bool mEnable;
+
+        //! Origin point.
+        FbxVector4 mOrigin;
+
+        //! Normal vector.
+        FbxVector4 mNormal; 
+    };
+
+    /** Activates or disables the display of shadow planes.
+      * \param pShadowEnable        Set to \c true to display shadow planes in the scene.
+      */
+    void SetShadowEnable(bool pShadowEnable);
+
+    /** Returns the current state of the shadow enable flag.
+      * \return                     \c True if shadow planes are set to be displayed in the scene.
+      */
+    bool GetShadowEnable() const;
+
+    /** Sets the shadow intensity that is applied to all shadow planes.
+      * \param pShadowIntensity     Intensity applied to all the shadow planes.
+      * \remarks                    Ranges from 0 to 300.
+      */
+    void SetShadowIntensity(double pShadowIntensity);
+
+    /** Returns the shadow intensity applied to all shadow planes.
+      * \return                     The intensity applied to all shadow planes in the scene.
+      * \remarks                    Ranges from 0 to 300.
+      */
+    double GetShadowIntensity() const;
+
+    /** Returns the number of shadow planes.
+      * \return                     Number of shadow planes.
+      */
+    int GetShadowPlaneCount() const;
+
+    /** Returns a shadow plane at the specified index.
+      * \param pIndex               Shadow plane index.
+      * \param pStatus              The FbxStatus object to hold error codes.
+      * \return                     Pointer the shadow plane, or \c NULL if the index is out of range.
+      */
+    ShadowPlane* GetShadowPlane(int pIndex, FbxStatus* pStatus=NULL);
+
+    /** Adds a shadow plane.
+      * \param pShadowPlane         The shadow plane to be added.
+      */
+    void AddShadowPlane(ShadowPlane pShadowPlane);
+
+    //! Removes all shadow planes.
+    void RemoveAllShadowPlanes();
+
+    //@}
+
+    //! Restores default settings.
+    void RestoreDefaultSettings();
+
+    /** Assignment operator.
+	  * \param pGlobalLightSettings FbxGlobalLightSettings object assigned to this one.
+	  */
+    const FbxGlobalLightSettings& operator=(const FbxGlobalLightSettings& pGlobalLightSettings);
+
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+    FbxGlobalLightSettings();
+    ~FbxGlobalLightSettings();
+
+    FbxGlobalLightSettingsProperties* mPH;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_GLOBAL_LIGHT_SETTINGS_H_ */

+ 315 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxglobalsettings.h

@@ -0,0 +1,315 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxglobalsettings.h
+#ifndef _FBXSDK_FILEIO_GLOBAL_SETTINGS_H_
+#define _FBXSDK_FILEIO_GLOBAL_SETTINGS_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxobject.h>
+#include <fbxsdk/core/base/fbxstatus.h>
+#include <fbxsdk/scene/fbxaxissystem.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/** \brief This class contains functions for accessing global settings.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxGlobalSettings : public FbxObject
+{
+	FBXSDK_OBJECT_DECLARE(FbxGlobalSettings, FbxObject);
+
+public:
+    /** 
+	  * \name Axis system
+	  */
+	//@{
+    
+	/** Sets the scene's coordinate system.
+	  * \param pAxisSystem              The coordinate system to set.
+	  */
+    void SetAxisSystem(const FbxAxisSystem& pAxisSystem);
+    
+	/** Returns the scene's current coordinate system.
+	  * \return                         The scene's current coordinate system.
+	  */
+    FbxAxisSystem GetAxisSystem();
+    //@}
+
+    /** Sets the coordinate system's original Up Axis when the scene is created.
+      * \param pAxisSystem              The coordinate system whose Up Axis is copied.
+      */
+    void SetOriginalUpAxis(const FbxAxisSystem& pAxisSystem);
+
+    /** Returns the coordinate system's original Up Axis.
+      * \return                         The coordinate system's original Up Axis when the scene is created. 0 is X, 1 is Y, 2 is Z axis.
+      */
+    int GetOriginalUpAxis() const;
+    //@}
+
+    /** 
+	  * \name System Units
+	  */
+	//@{
+
+	/** Sets the unit of measurement used by the system.
+	  * \param pOther                   The system unit to set. 
+	  */
+    void SetSystemUnit(const FbxSystemUnit& pOther);
+    
+	/** Returns the unit of measurement used by the system.
+	  * \return                         The unit of measurement used by the system.     
+	  */
+    FbxSystemUnit GetSystemUnit() const;
+
+    /** Sets the original unit of measurement used by the system.
+      * \param pOther                   The original system unit to set. 
+      */
+    void SetOriginalSystemUnit(const FbxSystemUnit& pOther);
+
+    /** Returns the original unit of measurement used by the system.
+      * \return                         The original unit of measurement used by the system.
+      */
+    FbxSystemUnit GetOriginalSystemUnit() const;
+    //@}
+
+
+    /** 
+	  * \name Light Settings
+	  */
+	//@{
+
+    /** Sets the ambient color.
+      * \param pAmbientColor            The ambient color to set.
+      * \remarks                        The ambient color only uses the RGB channels.
+      */
+    void SetAmbientColor(FbxColor pAmbientColor);
+
+    /** Returns the ambient color.
+      * \return                         The ambient color.
+      */
+    FbxColor GetAmbientColor() const;
+
+    //@}
+
+    /** 
+	  * \name Camera Settings
+	  */
+	//@{
+    /** Sets the default camera.
+      * \param pCameraName              Name of the default camera.
+      * \return                         \c true if camera name is valid, returns \c false if the camera does not have a valid name.
+      * \remarks                        A valid camera name can be either one of the defined tokens (FBXSDK_CAMERA_PERSPECTIVE,
+      *                                 FBXSDK_CAMERA_TOP, FBXSDK_CAMERA_FRONT, FBXSDK_CAMERA_BACK, FBXSDK_CAMERA_RIGHT, FBXSDK_CAMERA_LEFT and FBXSDK_CAMERA_BOTTOM) or the name
+      *                                 of a camera inserted in the node tree under the scene's root node.
+      */
+    bool SetDefaultCamera(const char* pCameraName);
+
+    /** Returns the default camera name.
+      * \return                         The default camera name, or an empty string if no camera name has been set.
+      */
+    FbxString GetDefaultCamera() const;
+    //@}
+
+    /** 
+	  * \name Time Settings
+	  */
+	//@{
+    /** Sets the time mode.
+    * \param pTimeMode                  One of the defined modes in class FbxTime.
+    */
+    void SetTimeMode(FbxTime::EMode pTimeMode);
+
+    /** Returns the time mode.
+    * \return                           The currently set TimeMode.
+    */
+    FbxTime::EMode GetTimeMode() const;
+
+    /** Sets the time protocol.
+      * \param pTimeProtocol        One of the defined protocols in FbxTime class.
+      */
+    void SetTimeProtocol(FbxTime::EProtocol pTimeProtocol);
+
+    /** Returns the time protocol.
+      * \return                     The currently set time protocol (default FbxTime::eFrameCount).
+      */
+    FbxTime::EProtocol GetTimeProtocol() const;
+
+    /** \enum ESnapOnFrameMode      Snap on frame mode.
+      */
+    enum ESnapOnFrameMode
+    {
+        eNoSnap,			//! No snap.
+        eSnapOnFrame,		//! Snap on frame.
+        ePlayOnFrame,		//! Play on frame.
+        eSnapAndPlayOnFrame	//! Snap and play on frame.
+    };
+
+    /** Sets the snap on frame mode.
+      * \param pSnapOnFrameMode     One of the following values: eNoSnap, eSnapOnFrame, ePlayOnFrame, or eSnapAndPlayOnFrame.
+      */
+    void SetSnapOnFrameMode(ESnapOnFrameMode pSnapOnFrameMode);
+
+    /** Returns the snap on frame mode.
+      * \return                     The currently set snap on frame mode (default eNoSnap).
+      */
+    ESnapOnFrameMode GetSnapOnFrameMode() const;
+
+    /** Sets the default time span of the time line.
+    * \param pTimeSpan                  The default time span of the time line.
+    */
+    void SetTimelineDefaultTimeSpan(const FbxTimeSpan& pTimeSpan);
+
+    /** Returns the default time span of the time line.
+    * \param pTimeSpan                  The default time span of the time line.
+    */
+    void GetTimelineDefaultTimeSpan(FbxTimeSpan& pTimeSpan) const;
+
+    /** Set custom frame rate.
+     *  This is meaningless if the time mode is not FbxTime::eCustom.
+     */
+    void SetCustomFrameRate(double pCustomFrameRate);
+
+    /** Return frame rate if the time mode is FbxTime::eCustom.
+     *  If the time mode is not FbxTime::eCustom, return -1.
+     */
+    double GetCustomFrameRate() const; 
+    //@}
+
+    /** 
+	  * \name Time Markers
+	  */
+	//@{
+        struct FBXSDK_DLL TimeMarker
+        {
+            //! Default constructor.
+            TimeMarker();
+
+            /** Copy constructor.
+              * \param pTimeMarker      Another time marker copied to this time marker.
+              */
+            TimeMarker(const TimeMarker& pTimeMarker);
+
+            /** Assignment operator.
+              * \param pTimeMarker      Another time marker assigned to this time marker.
+              */
+            TimeMarker& operator=(const TimeMarker& pTimeMarker);
+
+            //! Marker name.
+            FbxString mName; 
+
+            //! Marker time.
+            FbxTime mTime; 
+
+            //! Loop flag.
+            bool mLoop; 
+        };
+
+    /** Returns the number of time markers.
+      * \return                     The number of time markers.
+      */
+    int GetTimeMarkerCount() const;
+
+    /** Returns the time marker at the given index.
+      * \param pIndex               The time marker index.
+      * \param pStatus              The FbxStatus object to hold error codes.
+      * \return                     A copy of the time marker at the given index, or an empty one if an error occurred.
+      */
+    TimeMarker GetTimeMarker(int pIndex, FbxStatus* pStatus=NULL) const;
+
+    /** Adds a time marker.
+      * \param pTimeMarker          The new time marker to be added.
+      * \param pStatus              The FbxStatus object to hold error codes.
+      */
+    void AddTimeMarker(const TimeMarker& pTimeMarker, FbxStatus* pStatus=NULL);
+
+    /** Replaces the time marker at the specified index with the new one.
+      * \param pIndex               The time marker index.
+      * \param pTimeMarker          The new time marker.
+      * \param pStatus              The FbxStatus object to hold error codes.
+      */
+    void ReplaceTimeMarker(int pIndex, const TimeMarker& pTimeMarker, FbxStatus* pStatus=NULL);
+
+    //! Removes all time markers and sets the current time marker index to -1.
+    void RemoveAllTimeMarkers();
+
+    /** Sets the index of the current time marker.
+      * \param pIndex               The current time marker index.
+      * \param pStatus              The FbxStatus object to hold error codes.
+      * \return                     \c true if successful, or returns \c false if the index is not valid.
+      */
+    bool SetCurrentTimeMarker(int pIndex, FbxStatus* pStatus=NULL);
+
+    /** Returns the current time marker index.
+      * \return                     The current time marker index, or -1 if no current time marker has been set.
+      */
+    int GetCurrentTimeMarker() const;
+    //@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+    FbxObject& Copy(const FbxObject& pObject) override;
+    
+protected:
+	FbxPropertyT<FbxInt>	UpAxis;
+	FbxPropertyT<FbxInt>	UpAxisSign;
+
+	FbxPropertyT<FbxInt>	FrontAxis;
+	FbxPropertyT<FbxInt>	FrontAxisSign;
+
+	FbxPropertyT<FbxInt>	CoordAxis;
+	FbxPropertyT<FbxInt>	CoordAxisSign;
+
+    FbxPropertyT<FbxInt>	OriginalUpAxis;
+    FbxPropertyT<FbxInt>	OriginalUpAxisSign;
+
+	FbxPropertyT<FbxDouble>	UnitScaleFactor;
+    FbxPropertyT<FbxDouble>	OriginalUnitScaleFactor;
+
+    FbxPropertyT<FbxDouble3>    AmbientColor;
+    FbxPropertyT<FbxString>     DefaultCamera;
+    FbxPropertyT<FbxEnum>       TimeMode;
+    FbxPropertyT<FbxEnum>       TimeProtocol;
+    FbxPropertyT<FbxEnum>       SnapOnFrameMode;
+    FbxPropertyT<FbxTime>       TimeSpanStart;
+    FbxPropertyT<FbxTime>       TimeSpanStop;
+    FbxPropertyT<FbxDouble>     CustomFrameRate;
+
+protected:
+	void Construct(const FbxObject* pFrom) override;
+	void ConstructProperties(bool pForceSet) override;
+	
+private:
+    void AxisSystemToProperties();
+    void PropertiesToAxisSystem();
+
+    void Init();
+
+    FbxAxisSystem mAxisSystem;    
+    int mNbTimeMarkers;
+
+    friend class FbxWriterFbx6;
+ 
+    FbxProperty mTimeMarkers;
+    FbxPropertyT<FbxInt> mCurrentTimeMarker;
+    void AddSetTimeMarker(int pIndex, const TimeMarker& pTimeMarker, FbxStatus* pStatus, bool pAdd);
+
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+inline EFbxType FbxTypeOf(const FbxTime::EMode&){ return eFbxEnum; }
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_GLOBAL_SETTINGS_H_ */

+ 48 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxgobo.h

@@ -0,0 +1,48 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxgobo.h
+#ifndef _FBXSDK_FILEIO_GOBO_H_
+#define _FBXSDK_FILEIO_GOBO_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/base/fbxstring.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+/**
+ * \brief A gobo is a filter placed over a spot light to project light patterns through fog on a surface.
+ * You can also use an image file as a gobo, which cause the light to project an image, much like a projector. 
+ */
+class FbxGobo
+{
+public:
+	FbxGobo(char* pName) :
+	  mName(pName)
+	  {
+	  }
+
+	//! Gobo name.
+    FbxString mName;
+    //! path and file name of the image file.
+    FbxString mFileName;
+    //! Flag that if shows the light projected on the ground.
+    bool mDrawGroundProjection;
+    //! Flag that lets you create a volumetric lighting effect by making the light stream visible.
+    bool mVolumetricLightProjection;
+    //! Flag that front facing light occurs when the camera view is looking down or up the light stream of a Spot light, which makes the light stream look three-dimensional.
+    bool mFrontVolumetricLightProjection;
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_GOBO_H_ */

+ 393 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbximporter.h

@@ -0,0 +1,393 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbximporter.h
+#ifndef _FBXSDK_FILEIO_IMPORTER_H_
+#define _FBXSDK_FILEIO_IMPORTER_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxsystemunit.h>
+#include <fbxsdk/core/base/fbxtime.h>
+#include <fbxsdk/fileio/fbxiobase.h>
+#include <fbxsdk/fileio/fbxprogress.h>
+#include <fbxsdk/fileio/fbxiosettings.h>
+#include <fbxsdk/fileio/fbxstatistics.h>
+#include <fbxsdk/scene/fbxaxissystem.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+class FbxIO;
+class FbxIOFileHeaderInfo;
+class FbxDocumentInfo;
+class FbxTakeInfo;
+class FbxReader;
+class FbxThread;
+
+struct FbxImportThreadArg;
+
+/** Class to import an FBX file into SDK objects.
+* Normally this class is used as is. But for very special needs
+* a user can override Initialize() for special purpose.
+*
+* An importer will select the appropriate reader to a particular file.
+* Ex: When an importer must import an FBX 7 file, 
+* the importer will ask for all registered readers if an FBX 7 file reader is available,
+* then if a reader is found, the importer will create 
+* the specialized FBX 7 reader and read the file.
+* This way, an importer can "read" many different type of files like FBX 5/6/7, 3DS, Obj, Dxf, Collada, etc.
+* \see FbxReader
+*
+* Typical workflow for using the FbxImporter class:
+* -# create a SDKManager
+* -# create an IOSettings object
+* -# create an empty scene
+* -# create an importer
+* -# initialize the importer with a file name and IOSettings
+* -# set numerous states, take information, defining how the importer will behave
+* -# call FbxImporter::Import() with an empty scene
+* \code
+* ex:
+* // create a SdkManager
+* FbxManager *lSdkManager = FbxManager::Create();
+*
+* // create an IOSettings object
+* FbxIOSettings * ios = FbxIOSettings::Create(lSdkManager, IOSROOT );
+*
+* // set some IOSettings options 
+* ios->SetBoolProp(IMP_FBX_MATERIAL, true);
+* ios->SetBoolProp(IMP_FBX_TEXTURE,  true);
+*
+* // create an empty scene
+* FbxScene* lScene = FbxScene::Create(lSdkManager,"");
+*
+* // Create an importer.
+* FbxImporter* lImporter = FbxImporter::Create(lSdkManager, "");
+*
+* // Initialize the importer by providing a filename and the IOSettings to use
+* lImporter->Initialize("C:\\myfile.fbx", -1, ios);
+*
+* // Import the scene.
+* lImporter->Import(lScene); 
+*
+* // Destroy the importer.
+* lImporter->Destroy(); 
+* \endcode
+*
+* \remarks According to the file suffix, a specialized reader will be created internally.
+*          Ex: for .fbx files a FBX Reader, for .3ds files, a 3ds reader, etc.
+*          Supported files formats: FBX 5/6/7 Binary & ASCII, Collada, DXF, OBJ, 3DS
+* \nosubgrouping
+*/
+class FBXSDK_DLL FbxImporter : public FbxIOBase
+{
+	FBXSDK_OBJECT_DECLARE(FbxImporter, FbxIOBase);
+
+public:
+	/** 
+	  * \name Import Functions
+	  */
+	//@{
+
+	/** Initialize object.
+	  * \param pFileName          Name of file to access.
+      * \param pFileFormat        file format identifier User does not need to specify it by default.
+                                  if not specified, plugin will detect the file format according to file suffix automatically.
+	  * \param pIOSettings        client IOSettings, if not specified, a default IOSettings will be created
+	  * \return                   \c true on success, \c false otherwise.
+      * \remarks                  To identify the error that occurred, inspect the status object accessed 
+      *                           using the GetStatus() function.
+      * \remarks                  You do not need to give the pFileFormat if the suffix of pFileName is recognized
+	  */
+    bool Initialize(const char* pFileName, int pFileFormat=-1, FbxIOSettings * pIOSettings=NULL) override;
+
+	/** Initialize object.
+	  *	\param pStream            stream to access.
+	  * \param pStreamData        user-defined stream data.
+      * \param pFileFormat        file format identifier User does not need to specify it by default.
+                                  if not specified, plugin will request the file format from the stream automatically.
+	  * \param pIOSettings        client IOSettings, if not specified, a default IOSettings will be created
+      *	\return                   \c true on success, \c false otherwise.
+      * \remarks                  To identify the error that occurred, inspect the status object accessed 
+      *                           using the GetStatus() function.
+      * \remarks                  You do not need to give the pFileFormat if the suffix of pFileName is recognized
+      */
+	virtual bool Initialize(FbxStream* pStream, void* pStreamData=NULL, const int pFileFormat=-1, FbxIOSettings* pIOSettings=NULL);
+
+	/** Get the FBX version number of the FBX file.
+	  * FBX version numbers start at 5.0.0.
+	  * \param pMajor        Version major number.
+	  * \param pMinor        Version minor number.
+	  * \param pRevision     Version revision number.
+	  *	\remarks             This function must be called after FbxImporter::Initialize().	  
+	  */
+	void GetFileVersion(int& pMajor, int& pMinor, int& pRevision);
+
+	/**	Get the default rendering resolution if present in the file header.
+	  * \param pCamName            Returned name of the camera.
+	  * \param pResolutionMode     Returned resolution mode.
+	  * \param pW                  Returned width.
+	  * \param pH                  Returned height.
+	  * \return                    \c true if the default rendering settings are defined in the file, otherwise
+	  *                            returns \c false with empty parameters.
+	  */
+	bool GetDefaultRenderResolution(FbxString& pCamName, FbxString& pResolutionMode, double& pW, double& pH);
+
+	/**	Get the complete file header information.
+	  * \return		valid pointer to the complete header information
+	  */
+	FbxIOFileHeaderInfo* GetFileHeaderInfo();
+
+	/** \enum EStreamOptionsGeneration Stream options identifiers.
+	  * - \e eParseFile			Parse the file
+	  * - \e eDoNotParseFile	Do not parse the file.
+	  */
+	enum EStreamOptionsGeneration
+	{
+		eParseFile,		// Parse the file
+		eDoNotParseFile	// Do not parse the file (fast)
+	};
+
+    /** Read the currently opened file header to retrieve information related to takes.
+	  * \param pStreamOptionsGeneration     Stream options identifier.
+	  *	\return                \c true on success, \c false otherwise.
+	  * \remarks                            Caller gets ownership of the returned structure.
+      */
+ 	  bool GetImportOptions(EStreamOptionsGeneration pStreamOptionsGeneration = eParseFile);	
+
+    /** Read the currently opened file header to retrieve information related to takes.
+	  * \param pFbxObject     Target FBX file.
+	  *	\return                \c true on success, \c false otherwise.
+	  * \remarks              Caller gets ownership of the returned structure.
+      */
+	  bool GetImportOptions(FbxIO* pFbxObject);
+
+    /** Import the currently opened file into a scene. 
+      * \param pDocument          Document to fill with file content.
+	  * \param pNonBlocking       If true, the import process will be executed in a new thread, allowing it to be non-blocking.
+	                              To determine if the import finished, refer to the function IsImporting().
+	  *	\return                   \c true on success, \c false otherwise.
+      * \remarks                  To identify the error that occurred, inspect the status object accessed 
+      *                           using the GetStatus() function.
+	  *                           If the imported file is password protected and the password is not
+	  *                           set or wrong, the FbxStatus object access with GetStatus() will be set with
+	  *                           FbxStatus::ePasswordError.
+      */
+	  bool Import(FbxDocument* pDocument, bool pNonBlocking=false);
+
+#if  !defined(FBXSDK_ENV_WINSTORE) && !defined(FBXSDK_ENV_EMSCRIPTEN) 
+    /** Check if the importer is currently importing.
+	  * \param pImportResult  This parameter, after the import finished, will contain the result of the import success or failure.
+      * \return               Return true if the importer is currently importing.
+	  * \remarks              This function will always return false if Import() was called with pNonBlocking set to false.
+	  *                       This function should be used only in the context of pNonBlocking set to true.
+	  *                       It is very important to periodically check if the import finished using this function,
+      *                       since it will also free up the thread's allocations when its done.
+      */
+	  bool IsImporting(bool& pImportResult);
+#endif /* !FBXSDK_ENV_WINSTORE && !defined(FBXSDK_ENV_EMSCRIPTEN) */
+
+	/** Get the progress status in non-blocking mode.
+	  *	\param pStatus Optional current status string.
+      *	\return Percentage of the finished workload
+	  */
+      float GetProgress(FbxString* pStatus=NULL);
+
+    /** Register a callback function for progress reporting in single thread mode.
+      *	\param pCallback Pointer of the callback function.
+	  * \param pArgs pointer to the arguments passed to the callback function.
+      */
+      void SetProgressCallback(FbxProgressCallback pCallback, void* pArgs=NULL);
+
+    /** Explicitly set the embedding extraction folder. If this is never called, the FBX SDK will determine the best folder to extract embedded files.
+      * \param pExtractFolder The file path name where the embedded files should be extracted.
+      */
+	void SetEmbeddingExtractionFolder(const char* pExtractFolder);
+
+	/** Retrieve the current folder destination where the embedded files will be extracted. This might not be initialized until file I/O is performed.
+	  */
+	const char* GetEmbeddingExtractionFolder();
+
+	/** Access to a IOSettings object.
+      * \return The pointer to IOSettings or \c NULL \c if the object has not been allocated.
+      */
+ 	  FbxIOSettings* GetIOSettings();
+
+	/** Set the IOSettings pointer
+	  * \param pIOSettings Point to a FbxIOSettings object.
+	  */
+	  void SetIOSettings(FbxIOSettings* pIOSettings);
+
+	/** Set the password.
+	  * All subsequently imported files are opened with the given password.
+      * \param pPassword     Password string.
+      */
+      void SetPassword(char* pPassword);
+
+	/** 
+	  * \name Animation Stack Description Access
+	  * \see FbxAnimStack
+	  */
+	//@{
+	
+    /** Get the number of available animation stacks in the file.
+      * \return      Number of animation stacks.
+      *	\remarks     This function must be called after FbxImporter::Initialize().
+      */
+      int GetAnimStackCount();
+
+	/** Get the take information about an available take.
+	  * Use the returned reference to a FbxTakeInfo object to set whether the indexed take is imported.
+	  *	\param pIndex     Index of the requested take.
+	  *	\return           Take information or \c NULL if function failed.
+	  *	\remarks          This function must be called after FbxImporter::Initialize().
+	  */
+	  FbxTakeInfo* GetTakeInfo(int pIndex);
+
+    /** Return the active animation stack name.
+      * \return     Active animation stack name if there is one, otherwise returns an empty string.
+      * \remarks    This function must be called after FbxImporter::Initialize().
+      */
+      FbxString GetActiveAnimStackName();
+
+	//@}
+
+	/** 
+	  * \name Scene Description Access
+	  */
+	//@{
+
+	/** Get the scene info.
+	  * \return     Pointer to the scene info or \c NULL if no scene information
+	  *             is available in the file.
+	  */
+	FbxDocumentInfo* GetSceneInfo();
+
+	//@}
+	/** 
+	  * \name File Format
+	  */
+	//@{
+
+	/** Returns the index of the reader (FbxReader) associated with the file format. 
+	    This index is considered the identifier of the file format. 
+		The array of registered readers can't be retrieved. 
+		\return Index of the registered FbxReader associated with the file format. 
+		        If no reader found return -1.
+		\remarks According to the number of readers registered this value can change 
+		         for the same reader between SDK Manager instantiations.
+	*/
+	int GetFileFormat ();
+
+	/** \return     \c true if the file format is a recognized FBX format.
+	  */
+	bool IsFBX();
+	//@}
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+	FbxFile* GetFile();
+    FbxStream* GetStream();
+    void*      GetStreamData();
+
+	void ParseForGlobalSettings(bool pState);
+    void ParseForStatistics(bool pState);
+	bool GetAxisInfo(FbxAxisSystem* pAxisSystem, FbxSystemUnit* pSystemUnits);
+    bool GetStatistics(FbxStatistics* pStatistics);
+	bool GetFrameRate(FbxTime::EMode &pTimeMode);
+
+protected:
+	void Construct(const FbxObject* pFrom) override;
+	void Destruct(bool pRecursive) override;
+	virtual void SetOrCreateIOSettings(FbxIOSettings* pIOSettings, bool pAllowNULL);
+
+	void Reset();
+    bool FileOpen(FbxFile* pFile = NULL);
+	bool FileOpen(FbxStream* pStream, void* pStreamData);
+	void FileClose();
+
+	void GetImportOptionsInfo();
+    bool IsNativeExtension ();
+
+	//These two internal functions are only used to read old character pose data
+public:
+	bool Initialize(FbxFile* pFile, const int pFileFormat=-1, FbxIOSettings* pIOSettings=NULL);
+	bool Import(FbxDocument* pDocument, FbxIO* pFbxObject);
+
+private:
+	bool ImportProcess(FbxDocument* pDocument);
+
+    int						mFileFormat;
+    FbxReader*				mReader;
+	FbxString				mExtractFolder;
+    bool					mParseForGlobalSettings;
+    FbxAxisSystem			mAxisSystem;
+    FbxSystemUnit			mSystemUnits;
+	FbxTime::EMode			mFrameRate;
+    bool					mParseForStatistics;
+    FbxStatistics			mStatistics;
+#if  !defined(FBXSDK_ENV_WINSTORE) && !defined(FBXSDK_ENV_EMSCRIPTEN) 
+	FbxThread*				mImportThread;
+	FbxImportThreadArg*		mImportThreadArg;
+	bool					mImportThreadResult;
+	bool					mIsThreadImporting;
+#endif /* !FBXSDK_ENV_WINSTORE && !defined(FBXSDK_ENV_EMSCRIPTEN) */
+    FbxProgress				mProgress;
+    FbxFile*				mFile;
+	FbxStream*				mStream;
+	void*					mStreamData;
+	bool					mImportOptionsDone;
+	FbxArray<FbxTakeInfo*>	mTakeInfo;
+	FbxDocumentInfo*		mSceneInfo;
+	FbxString				mActiveAnimStackName;
+	int						mMajorVersion;
+	int						mMinorVersion;
+	int						mRevisionVersion;
+	FbxIOFileHeaderInfo*	mHeaderInfo;
+	FbxIOSettings*			mIOSettings;
+	bool					mClientIOSettings;
+
+	//For Initialize and Import
+	friend class FbxReaderFbx5;
+	friend class FbxReaderFbx6;
+	friend struct FbxReaderFbx7_Impl;
+
+	friend void ImportThread(void*);
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+//! Event that is emitted to plugins before a FBX file has been imported.
+class FBXSDK_DLL FbxEventPreImport : public FbxEvent<FbxEventPreImport>
+{
+    FBXSDK_EVENT_DECLARE(FbxEventPreImport);
+public:
+    inline FbxEventPreImport( FbxDocument* pDocument ) : mDocument(pDocument) {};
+
+    //! The document the FBX file is to be imported into.
+    FbxDocument* mDocument; 
+};
+
+//! Event that is emitted to plugins after a FBX file has been imported.
+class FBXSDK_DLL FbxEventPostImport : public FbxEvent<FbxEventPostImport>
+{
+    FBXSDK_EVENT_DECLARE(FbxEventPostImport);
+public:
+    inline FbxEventPostImport( FbxDocument* pDocument ) : mDocument(pDocument) {};
+
+    //! The imported document
+    FbxDocument* mDocument; 
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_IMPORTER_H_ */

+ 67 - 0
sdk/Darwin/2019.2/include/fbxsdk/fileio/fbxiobase.h

@@ -0,0 +1,67 @@
+/****************************************************************************************
+ 
+   Copyright (C) 2015 Autodesk, Inc.
+   All rights reserved.
+ 
+   Use of this software is subject to the terms of the Autodesk license agreement
+   provided at the time of installation or download, or which otherwise accompanies
+   this software in either electronic or hard copy form.
+ 
+****************************************************************************************/
+
+//! \file fbxiobase.h
+#ifndef _FBXSDK_FILEIO_IO_BASE_H_
+#define _FBXSDK_FILEIO_IO_BASE_H_
+
+#include <fbxsdk/fbxsdk_def.h>
+
+#include <fbxsdk/core/fbxobject.h>
+#include <fbxsdk/core/base/fbxstatus.h>
+
+#include <fbxsdk/fbxsdk_nsbegin.h>
+
+#define FBXSDK_IO_END_NODE_STR "_End"
+
+/** \brief Base class for FBX file importer and exporter.
+  * \nosubgrouping
+  */
+class FBXSDK_DLL FbxIOBase : public FbxObject
+{
+    FBXSDK_OBJECT_DECLARE(FbxIOBase, FbxObject);
+
+public:
+    /** Initializes the object.
+      * \param pFileName     The name of the file to access.
+      * \param pFileFormat   Unused in this class implementation.
+      * \param pIOSettings   Unused in this class implementation.
+      * \return              \c True if successful, returns \c False otherwise.
+      * \remarks             To identify the error, inspect \e mStatus.
+      */
+    virtual bool Initialize(const char *pFileName, int pFileFormat=-1, FbxIOSettings* pIOSettings=NULL);
+
+    /** Returns the file name.
+       * \return     The file name or an empty string if no filename has been set.
+       */
+    virtual FbxString GetFileName();
+
+    //! Get the status object containing the success or failure state.
+    FbxStatus& GetStatus() { return mStatus; }
+
+/*****************************************************************************************************************************
+** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
+*****************************************************************************************************************************/
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+protected:
+	void Construct(const FbxObject* pFrom) override;
+
+    int DetectReaderFileFormat(const char *pFileName);
+    int DetectWriterFileFormat(const char *pFileName);
+    
+    FbxStatus   mStatus;
+    FbxString	mFilename;
+#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
+};
+
+#include <fbxsdk/fbxsdk_nsend.h>
+
+#endif /* _FBXSDK_FILEIO_IO_BASE_H_ */

部分文件因文件數量過多而無法顯示