FbxParser.hx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package arm.format;
  2. import arm.format.FbxLibrary;
  3. @:access(arm.format.FbxLibrary)
  4. @:access(arm.format.Geometry)
  5. class FbxParser {
  6. public var posa: kha.arrays.Int16Array = null;
  7. public var nora: kha.arrays.Int16Array = null;
  8. public var texa: kha.arrays.Int16Array = null;
  9. public var inda: kha.arrays.Uint32Array = null;
  10. public var scalePos = 1.0;
  11. public var scaleTex = 1.0;
  12. public var name = "";
  13. // Transform
  14. public static var parseTransform = false;
  15. public var tx = 0.0;
  16. public var ty = 0.0;
  17. public var tz = 0.0;
  18. public var rx = 0.0;
  19. public var ry = 0.0;
  20. public var rz = 0.0;
  21. public var sx = 1.0;
  22. public var sy = 1.0;
  23. public var sz = 1.0;
  24. var geoms: Array<Geometry>;
  25. var current = 0;
  26. var binary = true;
  27. public function new(blob: kha.Blob) {
  28. var magic = "Kaydara FBX Binary\x20\x20\x00\x1a\x00";
  29. var s = "";
  30. for (i in 0...magic.length) s += String.fromCharCode(blob.readU8(i));
  31. binary = s == magic;
  32. var fbx = binary ? FbxBinaryParser.parse(blob) : Parser.parse(blob.toString());
  33. var lib = new FbxLibrary();
  34. try { lib.load(fbx); }
  35. catch (e: Dynamic) { trace(e); }
  36. geoms = lib.getAllGeometries();
  37. next();
  38. }
  39. public function next(): Bool {
  40. if (current >= geoms.length) return false;
  41. var geom = geoms[current];
  42. var lib = geom.lib;
  43. tx = ty = tz = 0;
  44. rx = ry = rz = 0;
  45. sx = sy = sz = 1;
  46. if (parseTransform) {
  47. var connects = lib.invConnect.get(FbxTools.getId(geom.getRoot()));
  48. for (c in connects) {
  49. var node = lib.ids.get(c);
  50. for (p in FbxTools.getAll(node, "Properties70.P")) {
  51. switch (FbxTools.toString(p.props[0])) {
  52. case "Lcl Translation":
  53. tx = FbxTools.toFloat(p.props[4]) / 100;
  54. ty = FbxTools.toFloat(p.props[5]) / 100;
  55. tz = FbxTools.toFloat(p.props[6]) / 100;
  56. case "Lcl Rotation":
  57. rx = FbxTools.toFloat(p.props[4]) * Math.PI / 180;
  58. ry = FbxTools.toFloat(p.props[5]) * Math.PI / 180;
  59. rz = FbxTools.toFloat(p.props[6]) * Math.PI / 180;
  60. case "Lcl Scaling":
  61. sx = FbxTools.toFloat(p.props[4]) / 100;
  62. sy = FbxTools.toFloat(p.props[5]) / 100;
  63. sz = FbxTools.toFloat(p.props[6]) / 100;
  64. default:
  65. }
  66. }
  67. }
  68. }
  69. var res = geom.getBuffers(binary, this);
  70. scalePos = res.scalePos;
  71. posa = res.posa;
  72. nora = res.nora;
  73. texa = res.texa;
  74. inda = res.inda;
  75. name = FbxTools.getName(geom.getRoot());
  76. if (name.charCodeAt(0) == 0) name = name.substring(1); // null
  77. if (name.charCodeAt(0) == 1) name = name.substring(1); // start of heading
  78. if (name == "Geometry") name = "Object -Geometry";
  79. name = name.substring(0, name.length - 10); // -Geometry
  80. current++;
  81. return true;
  82. }
  83. }