ObjectDataParser.cs 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace DragonBones
  6. {
  7. public class ObjectDataParser : DataParser
  8. {
  9. /**
  10. * @private
  11. */
  12. protected static bool _getBoolean(Dictionary<string, object> rawData, string key, bool defaultValue)
  13. {
  14. if (rawData.ContainsKey(key))
  15. {
  16. var value = rawData[key];
  17. if (value is bool)
  18. {
  19. return (bool)value;
  20. }
  21. else if (value is string)
  22. {
  23. switch (value as string)
  24. {
  25. case "0":
  26. case "NaN":
  27. case "":
  28. case "false":
  29. case "null":
  30. case "undefined":
  31. return false;
  32. default:
  33. return true;
  34. }
  35. }
  36. else
  37. {
  38. return Convert.ToBoolean(value);
  39. }
  40. }
  41. return defaultValue;
  42. }
  43. /**
  44. * @private
  45. */
  46. protected static uint _getNumber(Dictionary<string, object> rawData, string key, uint defaultValue)
  47. {
  48. if (rawData.ContainsKey(key))
  49. {
  50. var value = rawData[key];
  51. if (value == null)
  52. {
  53. return defaultValue;
  54. }
  55. if (value is uint)
  56. {
  57. return (uint)value;
  58. }
  59. return Convert.ToUInt32(value);
  60. }
  61. return defaultValue;
  62. }
  63. /**
  64. * @private
  65. */
  66. protected static int _getNumber(Dictionary<string, object> rawData, string key, int defaultValue)
  67. {
  68. if (rawData.ContainsKey(key))
  69. {
  70. var value = rawData[key];
  71. if (value == null)
  72. {
  73. return defaultValue;
  74. }
  75. if (value is int)
  76. {
  77. return (int)value;
  78. }
  79. return Convert.ToInt32(value);
  80. }
  81. return defaultValue;
  82. }
  83. /**
  84. * @private
  85. */
  86. protected static float _getNumber(Dictionary<string, object> rawData, string key, float defaultValue)
  87. {
  88. if (rawData.ContainsKey(key))
  89. {
  90. var value = rawData[key];
  91. if (value == null)
  92. {
  93. return defaultValue;
  94. }
  95. if (value is float)
  96. {
  97. return (float)value;
  98. }
  99. return Convert.ToSingle(value);
  100. }
  101. return defaultValue;
  102. }
  103. /**
  104. * @private
  105. */
  106. protected static string _getString(Dictionary<string, object> rawData, string key, string defaultValue)
  107. {
  108. if (rawData.ContainsKey(key))
  109. {
  110. var value = rawData[key];
  111. if (value is string)
  112. {
  113. return (string)value;
  114. }
  115. return Convert.ToString(value);
  116. }
  117. return defaultValue;
  118. }
  119. /**
  120. * @private
  121. */
  122. protected static T _getParameter<T>(List<object> rawData, int index, T defaultValue)
  123. {
  124. if (rawData.Count > index)
  125. {
  126. var value = rawData[index];
  127. if (defaultValue is uint)
  128. {
  129. return (T)(object)Convert.ToUInt32(value);
  130. }
  131. else if (defaultValue is int)
  132. {
  133. return (T)(object)Convert.ToInt32(value);
  134. }
  135. else if (defaultValue is float)
  136. {
  137. return (T)(object)Convert.ToSingle(value);
  138. }
  139. return (T)value;
  140. }
  141. return defaultValue;
  142. }
  143. /**
  144. * @private
  145. */
  146. public ObjectDataParser()
  147. {
  148. }
  149. /**
  150. * @private
  151. */
  152. protected ArmatureData _parseArmature(Dictionary<string, object> rawData, float scale)
  153. {
  154. var armature = BaseObject.BorrowObject<ArmatureData>();
  155. armature.name = _getString(rawData, NAME, null);
  156. armature.frameRate = _getNumber(rawData, FRAME_RATE, _data.frameRate);
  157. armature.scale = scale;
  158. if (armature.frameRate == 0)
  159. {
  160. armature.frameRate = 24;
  161. }
  162. if (rawData.ContainsKey(TYPE) && rawData[TYPE] is string)
  163. {
  164. armature.type = _getArmatureType(rawData[TYPE] as string);
  165. }
  166. else
  167. {
  168. armature.type = (ArmatureType)_getNumber(rawData, TYPE, (int)ArmatureType.Armature);
  169. }
  170. _armature = armature;
  171. _rawBones.Clear();
  172. if (rawData.ContainsKey(AABB))
  173. {
  174. var rawAABB = rawData[AABB] as Dictionary<string, object>;
  175. armature.aabb.x = _getNumber(rawAABB, X, 0.0f);
  176. armature.aabb.y = _getNumber(rawAABB, Y, 0.0f);
  177. armature.aabb.width = _getNumber(rawAABB, WIDTH, 0.0f);
  178. armature.aabb.height = _getNumber(rawAABB, HEIGHT, 0.0f);
  179. }
  180. if (rawData.ContainsKey(BONE))
  181. {
  182. var rawBones = rawData[BONE] as List<object>;
  183. foreach (Dictionary<string, object> rawBone in rawBones)
  184. {
  185. var bone = _parseBone(rawBone);
  186. armature.AddBone(bone, _getString(rawBone, PARENT, null));
  187. _rawBones.Add(bone);
  188. }
  189. }
  190. if (rawData.ContainsKey(IK))
  191. {
  192. var rawIKS = rawData[IK] as List<object>;
  193. foreach (Dictionary<string, object> ikObject in rawIKS)
  194. {
  195. _parseIK(ikObject);
  196. }
  197. }
  198. if (rawData.ContainsKey(SLOT))
  199. {
  200. var rawSlots = rawData[SLOT] as List<object>;
  201. var zOrder = 0;
  202. foreach (Dictionary<string, object> rawSlot in rawSlots)
  203. {
  204. armature.AddSlot(_parseSlot(rawSlot, zOrder++));
  205. }
  206. }
  207. if (rawData.ContainsKey(SKIN))
  208. {
  209. var rawSkins = rawData[SKIN] as List<object>;
  210. foreach (Dictionary<string, object> rawSkin in rawSkins)
  211. {
  212. armature.AddSkin(_parseSkin(rawSkin));
  213. }
  214. }
  215. if (rawData.ContainsKey(ANIMATION))
  216. {
  217. var rawAnimations = rawData[ANIMATION] as List<object>;
  218. foreach (Dictionary<string, object> rawAnimation in rawAnimations)
  219. {
  220. armature.AddAnimation(_parseAnimation(rawAnimation));
  221. }
  222. }
  223. if (
  224. rawData.ContainsKey(ACTIONS) ||
  225. rawData.ContainsKey(DEFAULT_ACTIONS)
  226. )
  227. {
  228. _parseActionData(rawData, armature.actions, null, null);
  229. }
  230. if (_isOldData && _isGlobalTransform) // Support 2.x ~ 3.x data.
  231. {
  232. _globalToLocal(armature);
  233. }
  234. _armature = null;
  235. _rawBones.Clear();
  236. return armature;
  237. }
  238. /**
  239. * @private
  240. */
  241. protected BoneData _parseBone(Dictionary<string, object> rawData)
  242. {
  243. var bone = BaseObject.BorrowObject<BoneData>();
  244. bone.inheritTranslation = _getBoolean(rawData, INHERIT_TRANSLATION, true);
  245. bone.inheritRotation = _getBoolean(rawData, INHERIT_ROTATION, true);
  246. bone.inheritScale = _getBoolean(rawData, INHERIT_SCALE, true);
  247. bone.length = _getNumber(rawData, LENGTH, 0.0f) * _armature.scale;
  248. bone.name = _getString(rawData, NAME, null);
  249. if (rawData.ContainsKey(TRANSFORM))
  250. {
  251. _parseTransform(rawData[TRANSFORM] as Dictionary<string, object>, bone.transform);
  252. }
  253. if (_isOldData) // Support 2.x ~ 3.x data.
  254. {
  255. bone.inheritScale = false;
  256. }
  257. return bone;
  258. }
  259. /**
  260. * @private
  261. */
  262. protected void _parseIK(Dictionary<string, object> rawData)
  263. {
  264. var bone = _armature.GetBone(_getString(rawData, rawData.ContainsKey(BONE) ? BONE : NAME, null));
  265. if (bone != null)
  266. {
  267. bone.bendPositive = _getBoolean(rawData, BEND_POSITIVE, true);
  268. bone.chain = _getNumber(rawData, CHAIN, (uint)0);
  269. bone.weight = _getNumber(rawData, WEIGHT, 1.0f);
  270. bone.ik = _armature.GetBone(_getString(rawData, TARGET, null));
  271. if (bone.chain > 0 && bone.parent != null && bone.parent.ik == null)
  272. {
  273. bone.parent.ik = bone.ik;
  274. bone.parent.chainIndex = 0;
  275. bone.parent.chain = 0;
  276. bone.chainIndex = 1;
  277. }
  278. else
  279. {
  280. bone.chain = 0;
  281. bone.chainIndex = 0;
  282. }
  283. }
  284. }
  285. /**
  286. * @private
  287. */
  288. protected SlotData _parseSlot(Dictionary<string, object> rawData, int zOrder)
  289. {
  290. var slot = BaseObject.BorrowObject<SlotData>();
  291. slot.displayIndex = _getNumber(rawData, DISPLAY_INDEX, (int)0);
  292. slot.zOrder = _getNumber(rawData, Z, zOrder); // Support 2.x ~ 3.x data.
  293. slot.name = _getString(rawData, NAME, null);
  294. slot.parent = _armature.GetBone(_getString(rawData, PARENT, null));
  295. if (rawData.ContainsKey(COLOR) || rawData.ContainsKey(COLOR_TRANSFORM))
  296. {
  297. slot.color = SlotData.GenerateColor();
  298. _parseColorTransform((rawData.ContainsKey(COLOR) ? rawData[COLOR] : rawData[COLOR_TRANSFORM]) as Dictionary<string, object>, slot.color);
  299. }
  300. else
  301. {
  302. slot.color = SlotData.DEFAULT_COLOR;
  303. }
  304. if (rawData.ContainsKey(BLEND_MODE) && rawData[BLEND_MODE] is string)
  305. {
  306. slot.blendMode = _getBlendMode(rawData[BLEND_MODE] as string);
  307. }
  308. else
  309. {
  310. slot.blendMode = (BlendMode)_getNumber(rawData, BLEND_MODE, (int)BlendMode.Normal);
  311. }
  312. if (rawData.ContainsKey(ACTIONS) || rawData.ContainsKey(DEFAULT_ACTIONS))
  313. {
  314. _parseActionData(rawData, slot.actions, null, null);
  315. }
  316. if (_isOldData) // Support 2.x ~ 3.x data.
  317. {
  318. if (rawData.ContainsKey(COLOR_TRANSFORM))
  319. {
  320. slot.color = SlotData.GenerateColor();
  321. _parseColorTransform(rawData[COLOR_TRANSFORM] as Dictionary<string, object>, slot.color);
  322. }
  323. else
  324. {
  325. slot.color = SlotData.DEFAULT_COLOR;
  326. }
  327. }
  328. return slot;
  329. }
  330. /**
  331. * @private
  332. */
  333. protected SkinData _parseSkin(Dictionary<string, object> rawData)
  334. {
  335. var skin = BaseObject.BorrowObject<SkinData>();
  336. skin.name = _getString(rawData, NAME, DEFAULT_NAME);
  337. if (string.IsNullOrEmpty(skin.name))
  338. {
  339. skin.name = DEFAULT_NAME;
  340. }
  341. if (rawData.ContainsKey(SLOT))
  342. {
  343. _skin = skin;
  344. var slots = rawData[SLOT] as List<object>;
  345. int zOrder = 0;
  346. foreach (Dictionary<string, object> slot in slots)
  347. {
  348. if (_isOldData) // Support 2.x ~ 3.x data.
  349. {
  350. _armature.AddSlot(_parseSlot(slot, zOrder++));
  351. }
  352. skin.AddSlot(_parseSkinSlotData(slot));
  353. }
  354. _skin = null;
  355. }
  356. return skin;
  357. }
  358. /**
  359. * @private
  360. */
  361. protected SkinSlotData _parseSkinSlotData(Dictionary<string, object> rawData)
  362. {
  363. var skinSlotData = BaseObject.BorrowObject<SkinSlotData>();
  364. skinSlotData.slot = _armature.GetSlot(_getString(rawData, NAME, null));
  365. if (rawData.ContainsKey(DISPLAY))
  366. {
  367. _skinSlotData = skinSlotData;
  368. foreach (Dictionary<string, object> rawDisplay in rawData[DISPLAY] as List<object>)
  369. {
  370. skinSlotData.displays.Add(_parseDisplay(rawDisplay));
  371. }
  372. _skinSlotData = null;
  373. }
  374. return skinSlotData;
  375. }
  376. /**
  377. * @private
  378. */
  379. protected DisplayData _parseDisplay(Dictionary<string, object> rawData)
  380. {
  381. var display = BaseObject.BorrowObject<DisplayData>();
  382. display.inheritAnimation = _getBoolean(rawData, INHERIT_ANIMATION, true);
  383. display.name = _getString(rawData, NAME, null);
  384. display.path = _getString(rawData, PATH, display.name);
  385. if (rawData.ContainsKey(TYPE) && rawData[TYPE] is string)
  386. {
  387. display.type = _getDisplayType(rawData[TYPE] as string);
  388. }
  389. else
  390. {
  391. display.type = (DisplayType)_getNumber(rawData, TYPE, (int)DisplayType.Image);
  392. }
  393. display.isRelativePivot = true;
  394. if (rawData.ContainsKey(PIVOT))
  395. {
  396. var pivotObject = rawData[PIVOT] as Dictionary<string, object>;
  397. display.pivot.x = _getNumber(pivotObject, X, 0.0f);
  398. display.pivot.y = _getNumber(pivotObject, Y, 0.0f);
  399. }
  400. else if (_isOldData) // Support 2.x ~ 3.x data.
  401. {
  402. var transformObject = rawData[TRANSFORM] as Dictionary<string, object>;
  403. display.isRelativePivot = false;
  404. display.pivot.x = _getNumber(transformObject, PIVOT_X, 0.0f) * _armature.scale;
  405. display.pivot.y = _getNumber(transformObject, PIVOT_Y, 0.0f) * _armature.scale;
  406. }
  407. else
  408. {
  409. display.pivot.x = 0.5f;
  410. display.pivot.y = 0.5f;
  411. }
  412. if (rawData.ContainsKey(TRANSFORM))
  413. {
  414. _parseTransform(rawData[TRANSFORM] as Dictionary<string, object>, display.transform);
  415. }
  416. switch (display.type)
  417. {
  418. case DisplayType.Image:
  419. break;
  420. case DisplayType.Armature:
  421. break;
  422. case DisplayType.Mesh:
  423. display.share = _getString(rawData, SHARE, null);
  424. if (string.IsNullOrEmpty(display.share))
  425. {
  426. display.inheritAnimation = _getBoolean(rawData, INHERIT_FFD, true);
  427. display.mesh = _parseMesh(rawData);
  428. _skinSlotData.AddMesh(display.mesh);
  429. }
  430. break;
  431. case DisplayType.BoundingBox:
  432. display.boundingBox = _parseBoundingBox(rawData);
  433. break;
  434. default:
  435. break;
  436. }
  437. return display;
  438. }
  439. /**
  440. * @private
  441. */
  442. protected MeshData _parseMesh(Dictionary<string, object> rawData)
  443. {
  444. var mesh = BaseObject.BorrowObject<MeshData>();
  445. var rawVertices = rawData[VERTICES] as List<object>;
  446. var rawUVs = rawData[UVS] as List<object>;
  447. var rawTriangles = rawData[TRIANGLES] as List<object>;
  448. var numVertices = (int)(rawVertices.Count / 2); // uint
  449. var numTriangles = (int)(rawTriangles.Count / 3); // uint
  450. var inverseBindPose = new List<Matrix>(_armature.sortedBones.Count);
  451. DragonBones.ResizeList(inverseBindPose, _armature.sortedBones.Count, null);
  452. mesh.skinned = rawData.ContainsKey(WEIGHTS) && (rawData[WEIGHTS] as List<object>).Count > 0;
  453. mesh.name = _getString(rawData, NAME, null);
  454. DragonBones.ResizeList(mesh.uvs, numVertices * 2, 0.0f);
  455. DragonBones.ResizeList(mesh.vertices, numVertices * 2, 0.0f);
  456. DragonBones.ResizeList(mesh.vertexIndices, numTriangles * 3, 0);
  457. if (mesh.skinned)
  458. {
  459. DragonBones.ResizeList(mesh.boneIndices, numVertices, null);
  460. DragonBones.ResizeList(mesh.weights, numVertices, null);
  461. DragonBones.ResizeList(mesh.boneVertices, numVertices, null);
  462. if (rawData.ContainsKey(SLOT_POSE))
  463. {
  464. var rawSlotPose = rawData[SLOT_POSE] as List<object>;
  465. mesh.slotPose.a = _getParameter(rawSlotPose, 0, 1.0f);
  466. mesh.slotPose.b = _getParameter(rawSlotPose, 1, 0.0f);
  467. mesh.slotPose.c = _getParameter(rawSlotPose, 2, 0.0f);
  468. mesh.slotPose.d = _getParameter(rawSlotPose, 3, 1.0f);
  469. mesh.slotPose.tx = _getParameter(rawSlotPose, 4, 0.0f) * _armature.scale;
  470. mesh.slotPose.ty = _getParameter(rawSlotPose, 5, 0.0f) * _armature.scale;
  471. }
  472. if (rawData.ContainsKey(BONE_POSE))
  473. {
  474. var rawBonePose = rawData[BONE_POSE] as List<object>;
  475. for (int i = 0, l = rawBonePose.Count; i < l; i += 7)
  476. {
  477. var rawBoneIndex = Convert.ToInt32(rawBonePose[i]); // uint
  478. var boneMatrix = inverseBindPose[rawBoneIndex] = new Matrix();
  479. boneMatrix.a = _getParameter(rawBonePose, i + 1, 1.0f);
  480. boneMatrix.b = _getParameter(rawBonePose, i + 2, 0.0f);
  481. boneMatrix.c = _getParameter(rawBonePose, i + 3, 0.0f);
  482. boneMatrix.d = _getParameter(rawBonePose, i + 4, 1.0f);
  483. boneMatrix.tx = _getParameter(rawBonePose, i + 5, 0.0f) * _armature.scale;
  484. boneMatrix.ty = _getParameter(rawBonePose, i + 6, 0.0f) * _armature.scale;
  485. boneMatrix.Invert();
  486. }
  487. }
  488. }
  489. for (int i = 0, iW = 0, l = rawVertices.Count; i < l; i += 2)
  490. {
  491. var iN = i + 1;
  492. var vertexIndex = i / 2;
  493. var x = mesh.vertices[i] = _getParameter(rawVertices, i, 0.0f) * _armature.scale;
  494. var y = mesh.vertices[iN] = _getParameter(rawVertices, iN, 0.0f) * _armature.scale;
  495. mesh.uvs[i] = _getParameter(rawUVs, i, 0.0f);
  496. mesh.uvs[iN] = _getParameter(rawUVs, iN, 0.0f);
  497. if (mesh.skinned) // If mesh is skinned, transform point by bone bind pose.
  498. {
  499. var rawWeights = rawData[WEIGHTS] as List<object>;
  500. var numBones = _getParameter(rawWeights, iW, 0);
  501. var indices = mesh.boneIndices[vertexIndex] = new int[numBones];
  502. var weights = mesh.weights[vertexIndex] = new float[numBones];
  503. var boneVertices = mesh.boneVertices[vertexIndex] = new float[numBones * 2];
  504. mesh.slotPose.TransformPoint(x, y, _helpPoint);
  505. x = mesh.vertices[i] = _helpPoint.x;
  506. y = mesh.vertices[iN] = _helpPoint.y;
  507. for (int iB = 0; iB < numBones; ++iB)
  508. {
  509. var iI = iW + 1 + iB * 2;
  510. var rawBoneIndex = Convert.ToInt32(rawWeights[iI]); // uint
  511. var boneData = _rawBones[rawBoneIndex];
  512. var boneIndex = mesh.bones.IndexOf(boneData);
  513. if (boneIndex < 0)
  514. {
  515. boneIndex = mesh.bones.Count;
  516. DragonBones.ResizeList(mesh.bones, boneIndex + 1, null);
  517. DragonBones.ResizeList(mesh.inverseBindPose, boneIndex + 1, null);
  518. mesh.bones[boneIndex] = boneData;
  519. mesh.inverseBindPose[boneIndex] = inverseBindPose[rawBoneIndex];
  520. }
  521. mesh.inverseBindPose[boneIndex].TransformPoint(x, y, _helpPoint);
  522. indices[iB] = boneIndex;
  523. weights[iB] = _getParameter(rawWeights, iI + 1, 0.0f);
  524. boneVertices[iB * 2] = _helpPoint.x;
  525. boneVertices[iB * 2 + 1] = _helpPoint.y;
  526. }
  527. iW += numBones * 2 + 1;
  528. }
  529. }
  530. for (int i = 0, l = rawTriangles.Count; i < l; ++i)
  531. {
  532. mesh.vertexIndices[i] = _getParameter(rawTriangles, i, 0);
  533. }
  534. return mesh;
  535. }
  536. /**
  537. * @private
  538. */
  539. protected BoundingBoxData _parseBoundingBox(Dictionary<string, object> rawData)
  540. {
  541. var boundingBox = BaseObject.BorrowObject<BoundingBoxData>();
  542. if (rawData.ContainsKey(SUB_TYPE) && rawData[SUB_TYPE] is string)
  543. {
  544. boundingBox.type = _getBoundingBoxType(rawData[SUB_TYPE] as string);
  545. }
  546. else
  547. {
  548. boundingBox.type = (BoundingBoxType)_getNumber(rawData, SUB_TYPE, (int)BoundingBoxType.Rectangle);
  549. }
  550. boundingBox.color = _getNumber(rawData, COLOR, (uint)0x000000);
  551. switch (boundingBox.type)
  552. {
  553. case BoundingBoxType.Rectangle:
  554. case BoundingBoxType.Ellipse:
  555. boundingBox.width = _getNumber(rawData, WIDTH, 0.0f);
  556. boundingBox.height = _getNumber(rawData, HEIGHT, 0.0f);
  557. break;
  558. case BoundingBoxType.Polygon:
  559. if (rawData.ContainsKey(VERTICES))
  560. {
  561. var rawVertices = rawData[VERTICES] as List<object>;
  562. DragonBones.ResizeList(boundingBox.vertices, rawVertices.Count, 0.0f);
  563. for (int i = 0, l = boundingBox.vertices.Count; i < l; i += 2)
  564. {
  565. var iN = i + 1;
  566. var x = _getParameter(rawVertices, i, 0.0f);
  567. var y = _getParameter(rawVertices, iN, 0.0f);
  568. boundingBox.vertices[i] = x;
  569. boundingBox.vertices[iN] = y;
  570. // AABB.
  571. if (i == 0)
  572. {
  573. boundingBox.x = x;
  574. boundingBox.y = y;
  575. boundingBox.width = x;
  576. boundingBox.height = y;
  577. }
  578. else
  579. {
  580. if (x < boundingBox.x)
  581. {
  582. boundingBox.x = x;
  583. }
  584. else if (x > boundingBox.width)
  585. {
  586. boundingBox.width = x;
  587. }
  588. if (y < boundingBox.y)
  589. {
  590. boundingBox.y = y;
  591. }
  592. else if (y > boundingBox.height)
  593. {
  594. boundingBox.height = y;
  595. }
  596. }
  597. }
  598. }
  599. break;
  600. default:
  601. break;
  602. }
  603. return boundingBox;
  604. }
  605. /**
  606. * @private
  607. */
  608. protected AnimationData _parseAnimation(Dictionary<string, object> rawData)
  609. {
  610. var animation = BaseObject.BorrowObject<AnimationData>();
  611. animation.frameCount = Math.Max(_getNumber(rawData, DURATION, (uint)1), 1);
  612. animation.playTimes = _getNumber(rawData, PLAY_TIMES, (uint)1);
  613. animation.duration = (float)animation.frameCount / _armature.frameRate;
  614. animation.fadeInTime = _getNumber(rawData, FADE_IN_TIME, 0.0f);
  615. animation.name = _getString(rawData, NAME, DEFAULT_NAME);
  616. if (string.IsNullOrEmpty(animation.name))
  617. {
  618. animation.name = DEFAULT_NAME;
  619. }
  620. _animation = animation;
  621. _parseTimeline(rawData, animation, _parseAnimationFrame);
  622. if (rawData.ContainsKey(Z_ORDER))
  623. {
  624. animation.zOrderTimeline = BaseObject.BorrowObject<ZOrderTimelineData>();
  625. _parseTimeline(rawData[Z_ORDER] as Dictionary<string, object>, animation.zOrderTimeline, _parseZOrderFrame);
  626. }
  627. if (rawData.ContainsKey(BONE))
  628. {
  629. var boneTimelines = rawData[BONE] as List<object>;
  630. foreach (Dictionary<string, object> boneTimelineObject in boneTimelines)
  631. {
  632. animation.AddBoneTimeline(_parseBoneTimeline(boneTimelineObject));
  633. }
  634. }
  635. if (rawData.ContainsKey(SLOT))
  636. {
  637. var slotTimelines = rawData[SLOT] as List<object>;
  638. foreach (Dictionary<string, object> slotTimelineObject in slotTimelines)
  639. {
  640. animation.AddSlotTimeline(_parseSlotTimeline(slotTimelineObject));
  641. }
  642. }
  643. if (rawData.ContainsKey(FFD))
  644. {
  645. var ffdTimelines = rawData[FFD] as List<object>;
  646. foreach (Dictionary<string, object> ffdTimelineObject in ffdTimelines)
  647. {
  648. animation.AddFFDTimeline(_parseFFDTimeline(ffdTimelineObject));
  649. }
  650. }
  651. if (_isOldData) // Support 2.x ~ 3.x data.
  652. {
  653. _isAutoTween = _getBoolean(rawData, AUTO_TWEEN, true);
  654. _animationTweenEasing = _getNumber(rawData, TWEEN_EASING, 0.0f);
  655. animation.playTimes = _getNumber(rawData, LOOP, (uint)1);
  656. if (rawData.ContainsKey(TIMELINE))
  657. {
  658. var timelines = rawData[TIMELINE] as List<object>;
  659. foreach (Dictionary<string, object> timelineObjects in timelines)
  660. {
  661. animation.AddBoneTimeline(_parseBoneTimeline(timelineObjects));
  662. animation.AddSlotTimeline(_parseSlotTimeline(timelineObjects));
  663. }
  664. }
  665. }
  666. else
  667. {
  668. _isAutoTween = false;
  669. _animationTweenEasing = 0.0f;
  670. }
  671. foreach (var pair in _armature.bones)
  672. {
  673. var bone = pair.Value;
  674. if (animation.GetBoneTimeline(bone.name) == null) // Add default bone timeline for cache if do not have one.
  675. {
  676. var boneTimeline = BaseObject.BorrowObject<BoneTimelineData>();
  677. var boneFrame = BaseObject.BorrowObject<BoneFrameData>();
  678. boneTimeline.bone = bone;
  679. boneTimeline.frames.Add(boneFrame);
  680. animation.AddBoneTimeline(boneTimeline);
  681. }
  682. }
  683. foreach (var pair in _armature.slots)
  684. {
  685. var slot = pair.Value;
  686. if (animation.GetSlotTimeline(slot.name) == null) // Add default slot timeline for cache if do not have one.
  687. {
  688. var slotTimeline = BaseObject.BorrowObject<SlotTimelineData>();
  689. var slotFrame = BaseObject.BorrowObject<SlotFrameData>();
  690. slotTimeline.slot = slot;
  691. slotFrame.displayIndex = slot.displayIndex;
  692. //slotFrame.zOrder = -2; // TODO zOrder.
  693. if (slot.color == SlotData.DEFAULT_COLOR)
  694. {
  695. slotFrame.color = SlotFrameData.DEFAULT_COLOR;
  696. }
  697. else
  698. {
  699. slotFrame.color = SlotFrameData.GenerateColor();
  700. slotFrame.color.CopyFrom(slot.color);
  701. }
  702. slotTimeline.frames.Add(slotFrame);
  703. animation.AddSlotTimeline(slotTimeline);
  704. if (_isOldData) // Support 2.x ~ 3.x data.
  705. {
  706. slotFrame.displayIndex = -1;
  707. }
  708. }
  709. }
  710. _animation = null;
  711. return animation;
  712. }
  713. /**
  714. * @private
  715. */
  716. protected BoneTimelineData _parseBoneTimeline(Dictionary<string, object> rawData)
  717. {
  718. var timeline = BaseObject.BorrowObject<BoneTimelineData>();
  719. timeline.bone = _armature.GetBone(_getString(rawData, NAME, null));
  720. _parseTimeline(rawData, timeline, _parseBoneFrame);
  721. var originTransform = timeline.originTransform;
  722. BoneFrameData prevFrame = null;
  723. foreach (var frame in timeline.frames) // bone transform pose = origin + animation origin + animation.
  724. {
  725. if (prevFrame == null)
  726. {
  727. originTransform.CopyFrom(frame.transform);
  728. frame.transform.Identity();
  729. if (originTransform.scaleX == 0.0f) // Pose scale and origin scale can not be 0. (poseScale = originScale * animationOriginScale * animationScale)
  730. {
  731. originTransform.scaleX = 0.001f;
  732. //frame.transform.scaleX = 0.0f;
  733. }
  734. if (originTransform.scaleY == 0.0f)
  735. {
  736. originTransform.scaleY = 0.001f;
  737. //frame.transform.scaleY = 0.0f;
  738. }
  739. }
  740. else if (prevFrame != frame)
  741. {
  742. frame.transform.Minus(originTransform);
  743. }
  744. prevFrame = frame;
  745. }
  746. if (_isOldData && (rawData.ContainsKey(PIVOT_X) || rawData.ContainsKey(PIVOT_Y))) // Support 2.x ~ 3.x data.
  747. {
  748. _timelinePivot.x = _getNumber(rawData, PIVOT_X, 0.0f) * _armature.scale;
  749. _timelinePivot.y = _getNumber(rawData, PIVOT_Y, 0.0f) * _armature.scale;
  750. }
  751. else
  752. {
  753. _timelinePivot.Clear();
  754. }
  755. return timeline;
  756. }
  757. /**
  758. * @private
  759. */
  760. protected SlotTimelineData _parseSlotTimeline(Dictionary<string, object> rawData)
  761. {
  762. var timeline = BaseObject.BorrowObject<SlotTimelineData>();
  763. timeline.slot = _armature.GetSlot(_getString(rawData, NAME, null));
  764. _parseTimeline(rawData, timeline, _parseSlotFrame);
  765. return timeline;
  766. }
  767. /**
  768. * @private
  769. */
  770. protected FFDTimelineData _parseFFDTimeline(Dictionary<string, object> rawData)
  771. {
  772. var timeline = BaseObject.BorrowObject<FFDTimelineData>();
  773. timeline.skin = _armature.GetSkin(_getString(rawData, SKIN, null));
  774. timeline.slot = timeline.skin.GetSlot(_getString(rawData, SLOT, null)); // NAME;
  775. var meshName = _getString(rawData, NAME, null);
  776. for (int i = 0, l = timeline.slot.displays.Count; i < l; ++i)
  777. {
  778. var display = timeline.slot.displays[i];
  779. if (display.mesh != null && display.name == meshName)
  780. {
  781. timeline.display = display;
  782. break;
  783. }
  784. }
  785. _parseTimeline(rawData, timeline, _parseFFDFrame);
  786. return timeline;
  787. }
  788. /**
  789. * @private
  790. */
  791. protected AnimationFrameData _parseAnimationFrame(Dictionary<string, object> rawData, uint frameStart, uint frameCount)
  792. {
  793. var frame = BaseObject.BorrowObject<AnimationFrameData>();
  794. _parseFrame(rawData, frame, frameStart, frameCount);
  795. if (rawData.ContainsKey(ACTION) || rawData.ContainsKey(ACTIONS))
  796. {
  797. _parseActionData(rawData, frame.actions, null, null);
  798. }
  799. if (rawData.ContainsKey(EVENTS) || rawData.ContainsKey(EVENT) || rawData.ContainsKey(SOUND))
  800. {
  801. _parseEventData(rawData, frame.events, null, null);
  802. }
  803. return frame;
  804. }
  805. /**
  806. * @private
  807. */
  808. protected ZOrderFrameData _parseZOrderFrame(Dictionary<string, object> rawData, uint frameStart, uint frameCount)
  809. {
  810. var frame = BaseObject.BorrowObject<ZOrderFrameData>();
  811. _parseFrame(rawData, frame, frameStart, frameCount);
  812. if (rawData.ContainsKey(Z_ORDER))
  813. {
  814. var rawZOrder = rawData[Z_ORDER] as List<object>;
  815. if (rawZOrder.Count > 0)
  816. {
  817. var slotCount = _armature.sortedSlots.Count;
  818. var unchanged = new int[slotCount - rawZOrder.Count / 2];
  819. DragonBones.ResizeList(frame.zOrder, slotCount, -1);
  820. for (int i = 0; i < slotCount; ++i)
  821. {
  822. frame.zOrder[i] = -1;
  823. }
  824. var originalIndex = 0;
  825. var unchangedIndex = 0;
  826. for (int i = 0, l = rawZOrder.Count; i < l; i += 2)
  827. {
  828. var slotIndex = _getParameter(rawZOrder, i, 0);
  829. var offset = _getParameter(rawZOrder, i + 1, 0);
  830. while (originalIndex != slotIndex)
  831. {
  832. unchanged[unchangedIndex++] = originalIndex++;
  833. }
  834. frame.zOrder[originalIndex + offset] = originalIndex++;
  835. }
  836. while (originalIndex < slotCount)
  837. {
  838. unchanged[unchangedIndex++] = originalIndex++;
  839. }
  840. var iC = slotCount;
  841. while (iC-- != 0)
  842. {
  843. if (frame.zOrder[iC] == -1)
  844. {
  845. frame.zOrder[iC] = unchanged[--unchangedIndex];
  846. }
  847. }
  848. }
  849. }
  850. return frame;
  851. }
  852. /**
  853. * @private
  854. */
  855. protected BoneFrameData _parseBoneFrame(Dictionary<string, object> rawData, uint frameStart, uint frameCount)
  856. {
  857. var frame = BaseObject.BorrowObject<BoneFrameData>();
  858. frame.tweenRotate = _getNumber(rawData, TWEEN_ROTATE, 0.0f);
  859. frame.tweenScale = _getBoolean(rawData, TWEEN_SCALE, true);
  860. _parseTweenFrame(rawData, frame, frameStart, frameCount);
  861. if (rawData.ContainsKey(TRANSFORM))
  862. {
  863. var transformObject = rawData[TRANSFORM] as Dictionary<string, object>;
  864. _parseTransform(transformObject, frame.transform);
  865. if (_isOldData) // Support 2.x ~ 3.x data.
  866. {
  867. _helpPoint.x = _timelinePivot.x + _getNumber(transformObject, PIVOT_X, 0.0f) * _armature.scale;
  868. _helpPoint.y = _timelinePivot.y + _getNumber(transformObject, PIVOT_Y, 0.0f) * _armature.scale;
  869. frame.transform.ToMatrix(_helpMatrix);
  870. _helpMatrix.TransformPoint(_helpPoint.x, _helpPoint.y, _helpPoint, true);
  871. frame.transform.x += _helpPoint.x;
  872. frame.transform.y += _helpPoint.y;
  873. }
  874. }
  875. var bone = (_timeline as BoneTimelineData).bone;
  876. var actions = new List<ActionData>();
  877. var events = new List<EventData>();
  878. if (rawData.ContainsKey(ACTION) || rawData.ContainsKey(ACTIONS))
  879. {
  880. var slot = _armature.GetSlot(bone.name);
  881. _parseActionData(rawData, actions, bone, slot);
  882. }
  883. if (rawData.ContainsKey(EVENT) || rawData.ContainsKey(SOUND))
  884. {
  885. _parseEventData(rawData, events, bone, null);
  886. }
  887. if (actions.Count > 0 || events.Count > 0)
  888. {
  889. _mergeFrameToAnimationTimeline(frame.position, actions, events); // Merge actions and events to animation timeline.
  890. }
  891. return frame;
  892. }
  893. /**
  894. * @private
  895. */
  896. protected SlotFrameData _parseSlotFrame(Dictionary<string, object> rawData, uint frameStart, uint frameCount)
  897. {
  898. var frame = BaseObject.BorrowObject<SlotFrameData>();
  899. frame.displayIndex = _getNumber(rawData, DISPLAY_INDEX, 0);
  900. _parseTweenFrame(rawData, frame, frameStart, frameCount);
  901. if (rawData.ContainsKey(COLOR) || rawData.ContainsKey(COLOR_TRANSFORM)) // Support 2.x ~ 3.x data. (colorTransform key)
  902. {
  903. frame.color = SlotFrameData.GenerateColor();
  904. _parseColorTransform((rawData.ContainsKey(COLOR) ? rawData[COLOR] : rawData[COLOR_TRANSFORM]) as Dictionary<string, object>, frame.color);
  905. }
  906. else
  907. {
  908. frame.color = SlotFrameData.DEFAULT_COLOR;
  909. }
  910. if (_isOldData) // Support 2.x ~ 3.x data.
  911. {
  912. if (_getBoolean(rawData, HIDE, false))
  913. {
  914. frame.displayIndex = -1;
  915. }
  916. }
  917. else if (rawData.ContainsKey(ACTION) || rawData.ContainsKey(ACTIONS))
  918. {
  919. var slot = (_timeline as SlotTimelineData).slot;
  920. var actions = new List<ActionData>();
  921. _parseActionData(rawData, actions, slot.parent, slot);
  922. _mergeFrameToAnimationTimeline(frame.position, actions, null); // Merge actions and events to animation timeline.
  923. }
  924. return frame;
  925. }
  926. /**
  927. * @private
  928. */
  929. protected ExtensionFrameData _parseFFDFrame(Dictionary<string, object> rawData, uint frameStart, uint frameCount)
  930. {
  931. var ffdTimeline = _timeline as FFDTimelineData;
  932. var mesh = ffdTimeline.display.mesh;
  933. var frame = BaseObject.BorrowObject<ExtensionFrameData>();
  934. _parseTweenFrame(rawData, frame, frameStart, frameCount);
  935. var rawVertices = rawData.ContainsKey(VERTICES) ? rawData[VERTICES] as List<object> : null;
  936. var offset = _getNumber(rawData, OFFSET, 0); // uint
  937. var x = 0.0f;
  938. var y = 0.0f;
  939. for (int i = 0, l = mesh.vertices.Count; i < l; i += 2)
  940. {
  941. if (rawVertices == null || i < offset || i - offset >= rawVertices.Count) // Fill 0.
  942. {
  943. x = 0.0f;
  944. y = 0.0f;
  945. }
  946. else
  947. {
  948. x = _getParameter(rawVertices, i - offset, 0.0f) * _armature.scale;
  949. y = _getParameter(rawVertices, i + 1 - offset, 0.0f) * _armature.scale;
  950. }
  951. if (mesh.skinned) // If mesh is skinned, transform point by bone bind pose.
  952. {
  953. mesh.slotPose.TransformPoint(x, y, _helpPoint, true);
  954. x = _helpPoint.x;
  955. y = _helpPoint.y;
  956. var boneIndices = mesh.boneIndices[i / 2];
  957. foreach (var boneIndex in boneIndices)
  958. {
  959. mesh.inverseBindPose[boneIndex].TransformPoint(x, y, _helpPoint, true);
  960. frame.tweens.Add(_helpPoint.x);
  961. frame.tweens.Add(_helpPoint.y);
  962. }
  963. }
  964. else
  965. {
  966. frame.tweens.Add(x);
  967. frame.tweens.Add(y);
  968. }
  969. }
  970. return frame;
  971. }
  972. /**
  973. * @private
  974. */
  975. protected void _parseTweenFrame<T>(Dictionary<string, object> rawData, T frame, uint frameStart, uint frameCount) where T : TweenFrameData<T>
  976. {
  977. _parseFrame(rawData, frame, frameStart, frameCount);
  978. if (frame.duration > 0.0f)
  979. {
  980. if (rawData.ContainsKey(TWEEN_EASING))
  981. {
  982. frame.tweenEasing = _getNumber(rawData, TWEEN_EASING, DragonBones.NO_TWEEN);
  983. }
  984. else if (_isOldData) // Support 2.x ~ 3.x data.
  985. {
  986. frame.tweenEasing = _isAutoTween ? _animationTweenEasing : DragonBones.NO_TWEEN;
  987. }
  988. else
  989. {
  990. frame.tweenEasing = DragonBones.NO_TWEEN;
  991. }
  992. if (_isOldData && _animation.scale == 1 && (_timeline as TimelineData<T>).scale == 1.0f && frame.duration * _armature.frameRate < 2)
  993. {
  994. frame.tweenEasing = DragonBones.NO_TWEEN;
  995. }
  996. if (rawData.ContainsKey(CURVE))
  997. {
  998. var rawCurve = rawData[CURVE] as List<object>;
  999. var curve = new float[rawCurve.Count];
  1000. for (int i = 0, l = rawCurve.Count; i < l; ++i)
  1001. {
  1002. curve[i] = Convert.ToSingle(rawCurve[i]);
  1003. }
  1004. frame.curve = new float[frameCount * 2 - 1];
  1005. TweenFrameData<T>.SamplingEasingCurve(curve, frame.curve);
  1006. }
  1007. }
  1008. else
  1009. {
  1010. frame.tweenEasing = DragonBones.NO_TWEEN;
  1011. frame.curve = null;
  1012. }
  1013. }
  1014. /**
  1015. * @private
  1016. */
  1017. protected void _parseFrame<T>(Dictionary<string, object> rawData, T frame, uint frameStart, uint frameCount) where T : FrameData<T>
  1018. {
  1019. frame.position = (float)frameStart / _armature.frameRate;
  1020. frame.duration = (float)frameCount / _armature.frameRate;
  1021. }
  1022. /**
  1023. * @private
  1024. */
  1025. protected void _parseTimeline<T>(Dictionary<string, object> rawData, TimelineData<T> timeline, Func<Dictionary<string, object>, uint, uint, T> frameParser) where T : FrameData<T>
  1026. {
  1027. timeline.scale = _getNumber(rawData, SCALE, 1.0f);
  1028. timeline.offset = _getNumber(rawData, OFFSET, 0.0f);
  1029. _timeline = timeline;
  1030. if (rawData.ContainsKey(FRAME))
  1031. {
  1032. var rawFrames = rawData[FRAME] as List<object>;
  1033. if (rawFrames.Count > 0)
  1034. {
  1035. if (rawFrames.Count == 1) // Only one frame.
  1036. {
  1037. DragonBones.ResizeList(timeline.frames, 1, null);
  1038. timeline.frames[0] = frameParser(rawFrames[0] as Dictionary<string, object>, 0, _getNumber(rawFrames[0] as Dictionary<string, object>, DURATION, (uint)1));
  1039. }
  1040. else
  1041. {
  1042. DragonBones.ResizeList(timeline.frames, (int)_animation.frameCount + 1, null);
  1043. uint frameStart = 0;
  1044. uint frameCount = 0;
  1045. T frame = null;
  1046. T prevFrame = null;
  1047. for (int i = 0, iW = 0, l = timeline.frames.Count; i < l; ++i) // Fill frame link.
  1048. {
  1049. if (frameStart + frameCount <= i && iW < rawFrames.Count)
  1050. {
  1051. var frameObject = rawFrames[iW++] as Dictionary<string, object>;
  1052. frameStart = (uint)i;
  1053. frameCount = _getNumber(frameObject, DURATION, (uint)1);
  1054. frame = frameParser(frameObject, frameStart, frameCount);
  1055. if (prevFrame != null)
  1056. {
  1057. prevFrame.next = frame;
  1058. frame.prev = prevFrame;
  1059. if (_isOldData) // Support 2.x ~ 3.x data.
  1060. {
  1061. // TweenFrameData<T> TODO
  1062. if (prevFrame is BoneFrameData && _getNumber(frameObject, DISPLAY_INDEX, 0) == -1)
  1063. {
  1064. (prevFrame as BoneFrameData).tweenEasing = DragonBones.NO_TWEEN;
  1065. }
  1066. }
  1067. }
  1068. prevFrame = frame;
  1069. }
  1070. timeline.frames[i] = frame;
  1071. }
  1072. frame.duration = _animation.duration - frame.position; // Modify last frame duration.
  1073. frame = timeline.frames[0];
  1074. prevFrame.next = frame;
  1075. frame.prev = prevFrame;
  1076. if (_isOldData) // Support 2.x ~ 3.x data.
  1077. {
  1078. // TweenFrameData<T> TODO
  1079. if (prevFrame is BoneFrameData && _getNumber(rawFrames[0] as Dictionary<string, object>, DISPLAY_INDEX, 0) == -1)
  1080. {
  1081. (prevFrame as BoneFrameData).tweenEasing = DragonBones.NO_TWEEN;
  1082. }
  1083. }
  1084. }
  1085. }
  1086. }
  1087. _timeline = null;
  1088. }
  1089. /**
  1090. * @private
  1091. */
  1092. protected void _parseActionData(Dictionary<string, object> rawData, List<ActionData> actions, BoneData bone, SlotData slot)
  1093. {
  1094. var actionsObject = rawData.ContainsKey(ACTION) ? rawData[ACTION] : (rawData.ContainsKey(ACTIONS) ? rawData[ACTIONS] : rawData[DEFAULT_ACTIONS]);
  1095. if (actionsObject is string) // Support string action.
  1096. {
  1097. var actionData = BaseObject.BorrowObject<ActionData>();
  1098. actionData.type = ActionType.Play;
  1099. actionData.bone = bone;
  1100. actionData.slot = slot;
  1101. actionData.animationConfig = BaseObject.BorrowObject<AnimationConfig>();
  1102. actionData.animationConfig.animationName = actionsObject as string;
  1103. actions.Add(actionData);
  1104. }
  1105. else if (actionsObject is IList) // Support [{gotoAndPlay: "animationName"}, ...] or [["gotoAndPlay", "animationName", ...], ...]
  1106. {
  1107. foreach (var actionObject in actionsObject as List<object>)
  1108. {
  1109. var isArray = actionObject is IList;
  1110. var actionData = BaseObject.BorrowObject<ActionData>();
  1111. var animationName = isArray ? _getParameter(actionObject as List<object>, 1, "") : _getString(actionObject as Dictionary<string, object>, "gotoAndPlay", null);
  1112. if (isArray)
  1113. {
  1114. var actionType = (actionObject as List<object>)[0];
  1115. if (actionType is string)
  1116. {
  1117. actionData.type = _getActionType(actionType as string);
  1118. }
  1119. else
  1120. {
  1121. actionData.type = _getParameter(actionObject as List<object>, 0, ActionType.Play);
  1122. }
  1123. }
  1124. else
  1125. {
  1126. actionData.type = ActionType.Play;
  1127. }
  1128. switch (actionData.type)
  1129. {
  1130. case ActionType.Play:
  1131. actionData.animationConfig = BaseObject.BorrowObject<AnimationConfig>();
  1132. actionData.animationConfig.animationName = animationName;
  1133. break;
  1134. default:
  1135. break;
  1136. }
  1137. actionData.bone = bone;
  1138. actionData.slot = slot;
  1139. actions.Add(actionData);
  1140. }
  1141. }
  1142. }
  1143. /**
  1144. * @private
  1145. */
  1146. protected void _parseEventData(Dictionary<string, object> rawData, List<EventData> events, BoneData bone, SlotData slot)
  1147. {
  1148. if (rawData.ContainsKey(SOUND))
  1149. {
  1150. var soundEventData = BaseObject.BorrowObject<EventData>();
  1151. soundEventData.type = EventType.Sound;
  1152. soundEventData.name = _getString(rawData, SOUND, null);
  1153. soundEventData.bone = bone;
  1154. soundEventData.slot = slot;
  1155. events.Add(soundEventData);
  1156. }
  1157. if (rawData.ContainsKey(EVENT))
  1158. {
  1159. var eventData = BaseObject.BorrowObject<EventData>();
  1160. eventData.type = EventType.Frame;
  1161. eventData.name = _getString(rawData, EVENT, null);
  1162. eventData.bone = bone;
  1163. eventData.slot = slot;
  1164. events.Add(eventData);
  1165. }
  1166. if (rawData.ContainsKey(EVENTS))
  1167. {
  1168. var rawEvents = rawData[EVENTS] as List<object>;
  1169. for (int i = 0, l = rawEvents.Count; i < l; ++i)
  1170. {
  1171. var rawEvent = rawEvents[i] as Dictionary<string, object>;
  1172. var boneName = _getString(rawEvent, BONE, null);
  1173. var slotName = _getString(rawEvent, SLOT, null);
  1174. var eventData = BaseObject.BorrowObject<EventData>();
  1175. eventData.type = EventType.Frame;
  1176. eventData.name = _getString(rawEvent, NAME, null);
  1177. eventData.bone = _armature.GetBone(boneName);
  1178. eventData.slot = _armature.GetSlot(slotName);
  1179. if (rawEvent.ContainsKey(INTS))
  1180. {
  1181. if (eventData.data == null)
  1182. {
  1183. eventData.data = BaseObject.BorrowObject<CustomData>();
  1184. }
  1185. var rawInts = rawEvent[INTS] as List<object>;
  1186. for (int j = 0, lJ = rawInts.Count; j < lJ; ++j)
  1187. {
  1188. eventData.data.ints.Add(_getParameter(rawInts, j, (int)0));
  1189. }
  1190. }
  1191. if (rawEvent.ContainsKey(FLOATS))
  1192. {
  1193. if (eventData.data == null)
  1194. {
  1195. eventData.data = BaseObject.BorrowObject<CustomData>();
  1196. }
  1197. var rawFloats = rawEvent[FLOATS] as List<object>;
  1198. for (int j = 0, lJ = rawFloats.Count; j < lJ; ++j)
  1199. {
  1200. eventData.data.floats.Add(_getParameter(rawFloats, i, 0.0f));
  1201. }
  1202. }
  1203. if (rawEvent.ContainsKey(STRINGS))
  1204. {
  1205. if (eventData.data == null)
  1206. {
  1207. eventData.data = BaseObject.BorrowObject<CustomData>();
  1208. }
  1209. var rawStrings = rawEvent[STRINGS] as List<object>;
  1210. for (int j = 0, lJ = rawStrings.Count; j < lJ; ++j)
  1211. {
  1212. eventData.data.strings.Add(_getParameter(rawStrings, i, ""));
  1213. }
  1214. }
  1215. events.Add(eventData);
  1216. }
  1217. }
  1218. }
  1219. /**
  1220. * @private
  1221. */
  1222. protected void _parseTransform(Dictionary<string, object> rawData, Transform transform)
  1223. {
  1224. transform.x = _getNumber(rawData, X, 0.0f) * _armature.scale;
  1225. transform.y = _getNumber(rawData, Y, 0.0f) * _armature.scale;
  1226. transform.skewX = _getNumber(rawData, SKEW_X, 0.0f) * DragonBones.ANGLE_TO_RADIAN;
  1227. transform.skewY = _getNumber(rawData, SKEW_Y, 0.0f) * DragonBones.ANGLE_TO_RADIAN;
  1228. transform.scaleX = _getNumber(rawData, SCALE_X, 1.0f);
  1229. transform.scaleY = _getNumber(rawData, SCALE_Y, 1.0f);
  1230. }
  1231. /**
  1232. * @private
  1233. */
  1234. protected void _parseColorTransform(Dictionary<string, object> rawData, ColorTransform color)
  1235. {
  1236. color.alphaMultiplier = _getNumber(rawData, ALPHA_MULTIPLIER, 100) * 0.01f;
  1237. color.redMultiplier = _getNumber(rawData, RED_MULTIPLIER, 100) * 0.01f;
  1238. color.greenMultiplier = _getNumber(rawData, GREEN_MULTIPLIER, 100) * 0.01f;
  1239. color.blueMultiplier = _getNumber(rawData, BLUE_MULTIPLIER, 100) * 0.01f;
  1240. color.alphaOffset = _getNumber(rawData, ALPHA_OFFSET, (int)0);
  1241. color.redOffset = _getNumber(rawData, RED_OFFSET, (int)0);
  1242. color.greenOffset = _getNumber(rawData, GREEN_OFFSET, (int)0);
  1243. color.blueOffset = _getNumber(rawData, BLUE_OFFSET, (int)0);
  1244. }
  1245. /**
  1246. * @inheritDoc
  1247. */
  1248. override public DragonBonesData ParseDragonBonesData(Dictionary<string, object> rawData, float scale = 1.0f)
  1249. {
  1250. if (rawData != null)
  1251. {
  1252. var version = _getString(rawData, VERSION, null);
  1253. var compatibleVersion = _getString(rawData, COMPATIBLE_VERSION, null);
  1254. _isOldData = version == DATA_VERSION_2_3 || version == DATA_VERSION_3_0;
  1255. if (_isOldData)
  1256. {
  1257. _isGlobalTransform = _getBoolean(rawData, IS_GLOBAL, true);
  1258. }
  1259. else
  1260. {
  1261. _isGlobalTransform = false;
  1262. }
  1263. if (
  1264. DATA_VERSIONS.Contains(version) ||
  1265. DATA_VERSIONS.Contains(compatibleVersion)
  1266. )
  1267. {
  1268. var data = BaseObject.BorrowObject<DragonBonesData>();
  1269. data.name = _getString(rawData, NAME, null);
  1270. data.frameRate = _getNumber(rawData, FRAME_RATE, (uint)24);
  1271. if (data.frameRate == 0)
  1272. {
  1273. data.frameRate = 24;
  1274. }
  1275. if (rawData.ContainsKey(ARMATURE))
  1276. {
  1277. _data = data;
  1278. var armatures = rawData[ARMATURE] as List<object>;
  1279. foreach (Dictionary<string, object> rawArmature in armatures)
  1280. {
  1281. data.AddArmature(_parseArmature(rawArmature, scale));
  1282. }
  1283. _data = null;
  1284. }
  1285. return data;
  1286. }
  1287. else
  1288. {
  1289. DragonBones.Assert(false, "Nonsupport data version.");
  1290. }
  1291. }
  1292. else
  1293. {
  1294. DragonBones.Assert(false, "No data.");
  1295. }
  1296. return null;
  1297. }
  1298. /**
  1299. * @inheritDoc
  1300. */
  1301. public override void ParseTextureAtlasData(Dictionary<string, object> rawData, TextureAtlasData textureAtlasData, float scale = 0.0f)
  1302. {
  1303. if (rawData != null)
  1304. {
  1305. textureAtlasData.name = _getString(rawData, NAME, null);
  1306. textureAtlasData.imagePath = _getString(rawData, IMAGE_PATH, null);
  1307. textureAtlasData.width = _getNumber(rawData, WIDTH, 0.0f);
  1308. textureAtlasData.height = _getNumber(rawData, HEIGHT, 0.0f);
  1309. // Texture format.
  1310. if (scale > 0.0f) // Use params scale.
  1311. {
  1312. textureAtlasData.scale = scale;
  1313. }
  1314. else // Use data scale.
  1315. {
  1316. scale = textureAtlasData.scale = _getNumber(rawData, SCALE, textureAtlasData.scale);
  1317. }
  1318. scale = 1.0f / scale;
  1319. if (rawData.ContainsKey(SUB_TEXTURE))
  1320. {
  1321. var rawTextures = rawData[SUB_TEXTURE] as List<object>;
  1322. foreach (Dictionary<string, object> rawTexture in rawTextures)
  1323. {
  1324. var textureData = textureAtlasData.GenerateTextureData();
  1325. textureData.name = _getString(rawTexture, NAME, null);
  1326. textureData.rotated = _getBoolean(rawTexture, ROTATED, false);
  1327. textureData.region.x = _getNumber(rawTexture, X, 0.0f) * scale;
  1328. textureData.region.y = _getNumber(rawTexture, Y, 0.0f) * scale;
  1329. textureData.region.width = _getNumber(rawTexture, WIDTH, 0.0f) * scale;
  1330. textureData.region.height = _getNumber(rawTexture, HEIGHT, 0.0f) * scale;
  1331. var frameWidth = _getNumber(rawTexture, FRAME_WIDTH, -1.0f);
  1332. var frameHeight = _getNumber(rawTexture, FRAME_HEIGHT, -1.0f);
  1333. if (frameWidth > 0.0f && frameHeight > 0.0f)
  1334. {
  1335. textureData.frame = TextureData.GenerateRectangle();
  1336. textureData.frame.x = _getNumber(rawTexture, FRAME_X, 0.0f) * scale;
  1337. textureData.frame.y = _getNumber(rawTexture, FRAME_Y, 0.0f) * scale;
  1338. textureData.frame.width = frameWidth * scale;
  1339. textureData.frame.height = frameHeight * scale;
  1340. }
  1341. textureAtlasData.AddTexture(textureData);
  1342. }
  1343. }
  1344. }
  1345. else
  1346. {
  1347. DragonBones.Assert(false, "No data.");
  1348. }
  1349. }
  1350. }
  1351. }