FbxParser.hx 2.7 KB

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