Import FBX.cpp 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /******************************************************************************
  2. When suspecting a bug in importing Scales Animation keyframes for a Skeleton,
  3. please read comments in Animation.cpp file.
  4. /******************************************************************************/
  5. #include "stdafx.h"
  6. #if DEBUG && 0
  7. #define FBX_LINK_TYPE FBX_LINK_LIB
  8. #endif
  9. #include "../../../../ThirdPartyLibs/FBX/FBX Shared.h"
  10. #if FBX_LINK_TYPE==FBX_LINK_LIB
  11. #include "../../../../ThirdPartyLibs/FBX/FBX.cpp"
  12. #endif
  13. namespace EE{
  14. /******************************************************************************/
  15. #if FBX_LINK_TYPE==FBX_LINK_DLL
  16. static Bool Tried=false;
  17. static DLL FbxDll;
  18. static Str FbxDllPath=(X64 ? "Bin/FBX64.dll" : "Bin/FBX32.dll");
  19. static SyncLock Lock;
  20. static void (__cdecl *ImportFBXFree)(CPtr data );
  21. static CPtr (__cdecl *ImportFBXData)(CChar *name, Int &size, UInt mask);
  22. #endif
  23. /******************************************************************************/
  24. void SetFbxDllPath(C Str &dll_32, C Str &dll_64)
  25. {
  26. #if FBX_LINK_TYPE==FBX_LINK_DLL
  27. FbxDllPath=(X64 ? dll_64 : dll_32);
  28. #endif
  29. }
  30. Bool ImportFBX(C Str &name, Mesh *mesh, Skeleton *skeleton, MemPtr<XAnimation> animations, MemPtr<XMaterial> materials, MemPtr<Int> part_material_index, MemPtr<Str> bone_names, Bool all_nodes_as_bones)
  31. {
  32. #if FBX_LINK_TYPE==FBX_LINK_DLL
  33. if(mesh )mesh ->del();
  34. if(skeleton)skeleton->del();
  35. animations .clear();
  36. materials .clear();
  37. part_material_index.clear();
  38. bone_names .clear();
  39. {
  40. SyncLocker locker(Lock);
  41. if(!Tried)
  42. {
  43. Tried=true;
  44. if(FbxDll.createFile(FbxDllPath))
  45. if(Int(__cdecl *ImportFBXVer)()=(Int(__cdecl*)())FbxDll.getFunc("ImportFBXVer"))
  46. if(ImportFBXVer()==0)
  47. if(ImportFBXFree=(void (__cdecl*)(CPtr data ))FbxDll.getFunc("ImportFBXFree"))
  48. ImportFBXData=(CPtr (__cdecl*)(CChar *name, Int &size, UInt mask))FbxDll.getFunc("ImportFBXData");
  49. }
  50. }
  51. if(ImportFBXData)
  52. {
  53. Int size=0;
  54. if(CPtr data=ImportFBXData(name, size, (mesh ? FBX_MESH : 0)|(skeleton ? FBX_SKEL : 0)|(animations ? FBX_ANIM : 0)|(materials ? FBX_MTRL : 0)|(part_material_index ? FBX_PMI : 0)|(bone_names ? FBX_BONE_NAMES : 0)|(all_nodes_as_bones ? FBX_ALL_NODES_AS_BONES : 0)))
  55. {
  56. File f; f.readMem(data, size);
  57. // copy data from the DLL memory
  58. Mesh mesh_temp;
  59. Skeleton skel_temp;
  60. Memc<XAnimation> animations_temp; MemPtr<XAnimation> at=animations_temp;
  61. Memc<XMaterial> materials_temp; MemPtr<XMaterial> mt=materials_temp;
  62. Memc<Int> part_material_index_temp; MemPtr<Int> pt=part_material_index_temp;
  63. Memc<Str> bone_names_temp; MemPtr<Str> bt=bone_names_temp;
  64. Bool ok=LoadFBXData(f, mesh ? *mesh : mesh_temp, skeleton ? *skeleton : skel_temp, animations ? animations : at, materials ? materials : mt, part_material_index ? part_material_index : pt, bone_names ? bone_names : bt);
  65. // free memory allocated by the DLL on the DLL
  66. ImportFBXFree(data);
  67. return ok;
  68. }
  69. }
  70. return false;
  71. #elif FBX_LINK_TYPE==FBX_LINK_LIB
  72. return _ImportFBX(name, mesh, skeleton, animations, materials, part_material_index, bone_names, all_nodes_as_bones, S8);
  73. #endif
  74. return false;
  75. }
  76. /******************************************************************************/
  77. }
  78. /******************************************************************************/