ArmatureData.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. /**
  2. * The MIT License (MIT)
  3. *
  4. * Copyright (c) 2012-2017 DragonBones team and other contributors
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  7. * this software and associated documentation files (the "Software"), to deal in
  8. * the Software without restriction, including without limitation the rights to
  9. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  10. * the Software, and to permit persons to whom the Software is furnished to do so,
  11. * subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in all
  14. * copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  18. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  19. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  20. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. using System;
  24. using System.Collections.Generic;
  25. namespace DragonBones
  26. {
  27. /// <summary>
  28. /// - The armature data.
  29. /// </summary>
  30. /// <version>DragonBones 3.0</version>
  31. /// <language>en_US</language>
  32. /// <summary>
  33. /// - 骨架数据。
  34. /// </summary>
  35. /// <version>DragonBones 3.0</version>
  36. /// <language>zh_CN</language>
  37. public class ArmatureData : BaseObject
  38. {
  39. /// <private/>
  40. public ArmatureType type;
  41. /// <summary>
  42. /// - The animation frame rate.
  43. /// </summary>
  44. /// <version>DragonBones 3.0</version>
  45. /// <language>en_US</language>
  46. /// <summary>
  47. /// - 动画帧率。
  48. /// </summary>
  49. /// <version>DragonBones 3.0</version>
  50. /// <language>zh_CN</language>
  51. public uint frameRate;
  52. /// <private/>
  53. public uint cacheFrameRate;
  54. /// <private/>
  55. public float scale;
  56. /// <summary>
  57. /// - The armature name.
  58. /// </summary>
  59. /// <version>DragonBones 3.0</version>
  60. /// <language>en_US</language>
  61. /// <summary>
  62. /// - 骨架名称。
  63. /// </summary>
  64. /// <version>DragonBones 3.0</version>
  65. /// <language>zh_CN</language>
  66. public string name;
  67. /// <private/>
  68. public readonly Rectangle aabb = new Rectangle();
  69. /// <summary>
  70. /// - The names of all the animation data.
  71. /// </summary>
  72. /// <version>DragonBones 3.0</version>
  73. /// <language>en_US</language>
  74. /// <summary>
  75. /// - 所有的动画数据名称。
  76. /// </summary>
  77. /// <version>DragonBones 3.0</version>
  78. /// <language>zh_CN</language>
  79. public readonly List<string> animationNames = new List<string>();
  80. /// <private/>
  81. public readonly List<BoneData> sortedBones = new List<BoneData>();
  82. /// <private/>
  83. public readonly List<SlotData> sortedSlots = new List<SlotData>();
  84. /// <private/>
  85. public readonly List<ActionData> defaultActions = new List<ActionData>();
  86. /// <private/>
  87. public readonly List<ActionData> actions = new List<ActionData>();
  88. /// <private/>
  89. public readonly Dictionary<string, BoneData> bones = new Dictionary<string, BoneData>();
  90. /// <private/>
  91. public readonly Dictionary<string, SlotData> slots = new Dictionary<string, SlotData>();
  92. /// <private/>
  93. public readonly Dictionary<string, ConstraintData> constraints = new Dictionary<string, ConstraintData>();
  94. /// <private/>
  95. public readonly Dictionary<string, SkinData> skins = new Dictionary<string, SkinData>();
  96. /// <private/>
  97. public readonly Dictionary<string, AnimationData> animations = new Dictionary<string, AnimationData>();
  98. /// <summary>
  99. /// - The default skin data.
  100. /// </summary>
  101. /// <version>DragonBones 4.5</version>
  102. /// <language>en_US</language>
  103. /// <summary>
  104. /// - 默认插槽数据。
  105. /// </summary>
  106. /// <version>DragonBones 4.5</version>
  107. /// <language>zh_CN</language>
  108. public SkinData defaultSkin = null;
  109. /// <summary>
  110. /// - The default animation data.
  111. /// </summary>
  112. /// <version>DragonBones 4.5</version>
  113. /// <language>en_US</language>
  114. /// <summary>
  115. /// - 默认动画数据。
  116. /// </summary>
  117. /// <version>DragonBones 4.5</version>
  118. /// <language>zh_CN</language>
  119. public AnimationData defaultAnimation = null;
  120. /// <private/>
  121. public CanvasData canvas = null; // Initial value.
  122. /// <private/>
  123. public UserData userData = null; // Initial value.
  124. /// <private/>
  125. public DragonBonesData parent;
  126. /// <inheritDoc/>
  127. protected override void _OnClear()
  128. {
  129. foreach (var action in this.defaultActions)
  130. {
  131. action.ReturnToPool();
  132. }
  133. foreach (var action in this.actions)
  134. {
  135. action.ReturnToPool();
  136. }
  137. foreach (var k in this.bones.Keys)
  138. {
  139. this.bones[k].ReturnToPool();
  140. }
  141. foreach (var k in this.slots.Keys)
  142. {
  143. this.slots[k].ReturnToPool();
  144. }
  145. foreach (var k in this.constraints.Keys)
  146. {
  147. this.constraints[k].ReturnToPool();
  148. }
  149. foreach (var k in this.skins.Keys)
  150. {
  151. this.skins[k].ReturnToPool();
  152. }
  153. foreach (var k in this.animations.Keys)
  154. {
  155. this.animations[k].ReturnToPool();
  156. }
  157. if (this.canvas != null)
  158. {
  159. this.canvas.ReturnToPool();
  160. }
  161. if (this.userData != null)
  162. {
  163. this.userData.ReturnToPool();
  164. }
  165. this.type = ArmatureType.Armature;
  166. this.frameRate = 0;
  167. this.cacheFrameRate = 0;
  168. this.scale = 1.0f;
  169. this.name = "";
  170. this.aabb.Clear();
  171. this.animationNames.Clear();
  172. this.sortedBones.Clear();
  173. this.sortedSlots.Clear();
  174. this.defaultActions.Clear();
  175. this.actions.Clear();
  176. this.bones.Clear();
  177. this.slots.Clear();
  178. this.constraints.Clear();
  179. this.skins.Clear();
  180. this.animations.Clear();
  181. this.defaultSkin = null;
  182. this.defaultAnimation = null;
  183. this.canvas = null;
  184. this.userData = null;
  185. this.parent = null; //
  186. }
  187. /// <internal/>
  188. /// <private/>
  189. public void SortBones()
  190. {
  191. var total = this.sortedBones.Count;
  192. if (total <= 0)
  193. {
  194. return;
  195. }
  196. var sortHelper = this.sortedBones.ToArray();
  197. var index = 0;
  198. var count = 0;
  199. this.sortedBones.Clear();
  200. while (count < total)
  201. {
  202. var bone = sortHelper[index++];
  203. if (index >= total)
  204. {
  205. index = 0;
  206. }
  207. if (this.sortedBones.Contains(bone))
  208. {
  209. continue;
  210. }
  211. var flag = false;
  212. foreach (var constraint in this.constraints.Values)
  213. {
  214. // Wait constraint.
  215. if (constraint.root == bone && !this.sortedBones.Contains(constraint.target))
  216. {
  217. flag = true;
  218. break;
  219. }
  220. }
  221. if (flag)
  222. {
  223. continue;
  224. }
  225. if (bone.parent != null && !this.sortedBones.Contains(bone.parent))
  226. {
  227. // Wait parent.
  228. continue;
  229. }
  230. this.sortedBones.Add(bone);
  231. count++;
  232. }
  233. }
  234. /// <internal/>
  235. /// <private/>
  236. public void CacheFrames(uint frameRate)
  237. {
  238. if (this.cacheFrameRate > 0)
  239. {
  240. // TODO clear cache.
  241. return;
  242. }
  243. this.cacheFrameRate = frameRate;
  244. foreach (var k in this.animations.Keys)
  245. {
  246. this.animations[k].CacheFrames(this.cacheFrameRate);
  247. }
  248. }
  249. /// <internal/>
  250. /// <private/>
  251. public int SetCacheFrame(Matrix globalTransformMatrix, TransformDB transform)
  252. {
  253. var dataArray = this.parent.cachedFrames;
  254. var arrayOffset = dataArray.Count;
  255. dataArray.ResizeList(arrayOffset + 10, 0.0f);
  256. dataArray[arrayOffset] = globalTransformMatrix.a;
  257. dataArray[arrayOffset + 1] = globalTransformMatrix.b;
  258. dataArray[arrayOffset + 2] = globalTransformMatrix.c;
  259. dataArray[arrayOffset + 3] = globalTransformMatrix.d;
  260. dataArray[arrayOffset + 4] = globalTransformMatrix.tx;
  261. dataArray[arrayOffset + 5] = globalTransformMatrix.ty;
  262. dataArray[arrayOffset + 6] = transform.rotation;
  263. dataArray[arrayOffset + 7] = transform.skew;
  264. dataArray[arrayOffset + 8] = transform.scaleX;
  265. dataArray[arrayOffset + 9] = transform.scaleY;
  266. return arrayOffset;
  267. }
  268. /// <internal/>
  269. /// <private/>
  270. public void GetCacheFrame(Matrix globalTransformMatrix, TransformDB transform, int arrayOffset)
  271. {
  272. var dataArray = this.parent.cachedFrames;
  273. globalTransformMatrix.a = dataArray[arrayOffset];
  274. globalTransformMatrix.b = dataArray[arrayOffset + 1];
  275. globalTransformMatrix.c = dataArray[arrayOffset + 2];
  276. globalTransformMatrix.d = dataArray[arrayOffset + 3];
  277. globalTransformMatrix.tx = dataArray[arrayOffset + 4];
  278. globalTransformMatrix.ty = dataArray[arrayOffset + 5];
  279. transform.rotation = dataArray[arrayOffset + 6];
  280. transform.skew = dataArray[arrayOffset + 7];
  281. transform.scaleX = dataArray[arrayOffset + 8];
  282. transform.scaleY = dataArray[arrayOffset + 9];
  283. transform.x = globalTransformMatrix.tx;
  284. transform.y = globalTransformMatrix.ty;
  285. }
  286. /// <internal/>
  287. /// <private/>
  288. public void AddBone(BoneData value)
  289. {
  290. if (value != null && !string.IsNullOrEmpty(value.name))
  291. {
  292. if (this.bones.ContainsKey(value.name))
  293. {
  294. Helper.Assert(false, "Same bone: " + value.name);
  295. this.bones[value.name].ReturnToPool();
  296. }
  297. this.bones[value.name] = value;
  298. this.sortedBones.Add(value);
  299. }
  300. }
  301. /// <internal/>
  302. /// <private/>
  303. public void AddSlot(SlotData value)
  304. {
  305. if (value != null && !string.IsNullOrEmpty(value.name))
  306. {
  307. if (this.slots.ContainsKey(value.name))
  308. {
  309. Helper.Assert(false, "Same slot: " + value.name);
  310. this.slots[value.name].ReturnToPool();
  311. }
  312. this.slots[value.name] = value;
  313. this.sortedSlots.Add(value);
  314. }
  315. }
  316. /// <internal/>
  317. /// <private/>
  318. public void AddConstraint(ConstraintData value)
  319. {
  320. if (value != null && !string.IsNullOrEmpty(value.name))
  321. {
  322. if (this.constraints.ContainsKey(value.name))
  323. {
  324. Helper.Assert(false, "Same constraint: " + value.name);
  325. this.slots[value.name].ReturnToPool();
  326. }
  327. this.constraints[value.name] = value;
  328. }
  329. }
  330. /// <internal/>
  331. /// <private/>
  332. public void AddSkin(SkinData value)
  333. {
  334. if (value != null && !string.IsNullOrEmpty(value.name))
  335. {
  336. if (this.skins.ContainsKey(value.name))
  337. {
  338. Helper.Assert(false, "Same slot: " + value.name);
  339. this.skins[value.name].ReturnToPool();
  340. }
  341. value.parent = this;
  342. this.skins[value.name] = value;
  343. if (this.defaultSkin == null)
  344. {
  345. this.defaultSkin = value;
  346. }
  347. if (value.name == "default")
  348. {
  349. this.defaultSkin = value;
  350. }
  351. }
  352. }
  353. /// <internal/>
  354. /// <private/>
  355. public void AddAnimation(AnimationData value)
  356. {
  357. if (value != null && !string.IsNullOrEmpty(value.name))
  358. {
  359. if (this.animations.ContainsKey(value.name))
  360. {
  361. Helper.Assert(false, "Same animation: " + value.name);
  362. this.animations[value.name].ReturnToPool();
  363. }
  364. value.parent = this;
  365. this.animations[value.name] = value;
  366. this.animationNames.Add(value.name);
  367. if (this.defaultAnimation == null)
  368. {
  369. this.defaultAnimation = value;
  370. }
  371. }
  372. }
  373. /// <internal/>
  374. /// <private/>
  375. internal void AddAction(ActionData value, bool isDefault)
  376. {
  377. if (isDefault)
  378. {
  379. this.defaultActions.Add(value);
  380. }
  381. else
  382. {
  383. this.actions.Add(value);
  384. }
  385. }
  386. /// <summary>
  387. /// - Get a specific done data.
  388. /// </summary>
  389. /// <param name="boneName">- The bone name.</param>
  390. /// <version>DragonBones 3.0</version>
  391. /// <language>en_US</language>
  392. /// <summary>
  393. /// - 获取特定的骨骼数据。
  394. /// </summary>
  395. /// <param name="boneName">- 骨骼名称。</param>
  396. /// <version>DragonBones 3.0</version>
  397. /// <language>zh_CN</language>
  398. public BoneData GetBone(string boneName)
  399. {
  400. return (!string.IsNullOrEmpty(boneName) && bones.ContainsKey(boneName)) ? bones[boneName] : null;
  401. }
  402. /// <summary>
  403. /// - Get a specific slot data.
  404. /// </summary>
  405. /// <param name="slotName">- The slot name.</param>
  406. /// <version>DragonBones 3.0</version>
  407. /// <language>en_US</language>
  408. /// <summary>
  409. /// - 获取特定的插槽数据。
  410. /// </summary>
  411. /// <param name="slotName">- 插槽名称。</param>
  412. /// <version>DragonBones 3.0</version>
  413. /// <language>zh_CN</language>
  414. public SlotData GetSlot(string slotName)
  415. {
  416. return (!string.IsNullOrEmpty(slotName) && slots.ContainsKey(slotName)) ? slots[slotName] : null;
  417. }
  418. /// <private/>
  419. public ConstraintData GetConstraint(string constraintName)
  420. {
  421. return this.constraints.ContainsKey(constraintName) ? this.constraints[constraintName] : null;
  422. }
  423. /// <summary>
  424. /// - Get a specific skin data.
  425. /// </summary>
  426. /// <param name="skinName">- The skin name.</param>
  427. /// <version>DragonBones 3.0</version>
  428. /// <language>en_US</language>
  429. /// <summary>
  430. /// - 获取特定皮肤数据。
  431. /// </summary>
  432. /// <param name="skinName">- 皮肤名称。</param>
  433. /// <version>DragonBones 3.0</version>
  434. /// <language>zh_CN</language>
  435. public SkinData GetSkin(string skinName)
  436. {
  437. return !string.IsNullOrEmpty(skinName) ? (skins.ContainsKey(skinName) ? skins[skinName] : null) : defaultSkin;
  438. }
  439. /// <private/>
  440. public MeshDisplayData GetMesh(string skinName, string slotName, string meshName)
  441. {
  442. var skin = this.GetSkin(skinName);
  443. if (skin == null)
  444. {
  445. return null;
  446. }
  447. return skin.GetDisplay(slotName, meshName) as MeshDisplayData;
  448. }
  449. /// <summary>
  450. /// - Get a specific animation data.
  451. /// </summary>
  452. /// <param name="animationName">- The animation animationName.</param>
  453. /// <version>DragonBones 3.0</version>
  454. /// <language>en_US</language>
  455. /// <summary>
  456. /// - 获取特定的动画数据。
  457. /// </summary>
  458. /// <param name="animationName">- 动画名称。</param>
  459. /// <version>DragonBones 3.0</version>
  460. /// <language>zh_CN</language>
  461. public AnimationData GetAnimation(string animationName)
  462. {
  463. return !string.IsNullOrEmpty(animationName) ? (animations.ContainsKey(animationName) ? animations[animationName] : null) : defaultAnimation;
  464. }
  465. }
  466. /// <summary>
  467. /// - The bone data.
  468. /// </summary>
  469. /// <version>DragonBones 3.0</version>
  470. /// <language>en_US</language>
  471. /// <summary>
  472. /// - 骨骼数据。
  473. /// </summary>
  474. /// <version>DragonBones 3.0</version>
  475. /// <language>zh_CN</language>
  476. public class BoneData : BaseObject
  477. {
  478. /// <private/>
  479. public bool inheritTranslation;
  480. /// <private/>
  481. public bool inheritRotation;
  482. /// <private/>
  483. public bool inheritScale;
  484. /// <private/>
  485. public bool inheritReflection;
  486. /// <summary>
  487. /// - The bone length.
  488. /// </summary>
  489. /// <version>DragonBones 3.0</version>
  490. /// <language>en_US</language>
  491. /// <summary>
  492. /// - 骨骼长度。
  493. /// </summary>
  494. /// <version>DragonBones 3.0</version>
  495. /// <language>zh_CN</language>
  496. public float length;
  497. /// <summary>
  498. /// - The bone name.
  499. /// </summary>
  500. /// <version>DragonBones 3.0</version>
  501. /// <language>en_US</language>
  502. /// <summary>
  503. /// - 骨骼名称。
  504. /// </summary>
  505. /// <version>DragonBones 3.0</version>
  506. /// <language>zh_CN</language>
  507. public string name;
  508. /// <private/>
  509. public readonly TransformDB transform = new TransformDB();
  510. /// <private/>
  511. public UserData userData = null; // Initial value.
  512. /// <summary>
  513. /// - The parent bone data.
  514. /// </summary>
  515. /// <version>DragonBones 3.0</version>
  516. /// <language>en_US</language>
  517. /// <summary>
  518. /// - 父骨骼数据。
  519. /// </summary>
  520. /// <version>DragonBones 3.0</version>
  521. /// <language>zh_CN</language>
  522. public BoneData parent = null;
  523. /// <inheritDoc/>
  524. protected override void _OnClear()
  525. {
  526. if (this.userData != null)
  527. {
  528. this.userData.ReturnToPool();
  529. }
  530. this.inheritTranslation = false;
  531. this.inheritRotation = false;
  532. this.inheritScale = false;
  533. this.inheritReflection = false;
  534. this.length = 0.0f;
  535. this.name = "";
  536. this.transform.Identity();
  537. this.userData = null;
  538. this.parent = null;
  539. }
  540. }
  541. /// <internal/>
  542. /// <private/>
  543. public class SurfaceData : BoneData
  544. {
  545. public float vertexCountX;
  546. public float vertexCountY;
  547. public readonly List<float> vertices = new List<float>();
  548. /// <inheritDoc/>
  549. protected override void _OnClear()
  550. {
  551. base._OnClear();
  552. this.vertexCountX = 0;
  553. this.vertexCountY = 0;
  554. this.vertices.Clear();
  555. }
  556. }
  557. /// <summary>
  558. /// - The slot data.
  559. /// </summary>
  560. /// <version>DragonBones 3.0</version>
  561. /// <language>en_US</language>
  562. /// <summary>
  563. /// - 插槽数据。
  564. /// </summary>
  565. /// <version>DragonBones 3.0</version>
  566. /// <language>zh_CN</language>
  567. public class SlotData : BaseObject
  568. {
  569. /// <internal/>
  570. /// <private/>
  571. public static readonly ColorTransform DEFAULT_COLOR = new ColorTransform();
  572. /// <internal/>
  573. /// <private/>
  574. public static ColorTransform CreateColor()
  575. {
  576. return new ColorTransform();
  577. }
  578. /// <private/>
  579. public BlendMode blendMode;
  580. /// <private/>
  581. public int displayIndex;
  582. /// <private/>
  583. public int zOrder;
  584. /// <summary>
  585. /// - The slot name.
  586. /// </summary>
  587. /// <version>DragonBones 3.0</version>
  588. /// <language>en_US</language>
  589. /// <summary>
  590. /// - 插槽名称。
  591. /// </summary>
  592. /// <version>DragonBones 3.0</version>
  593. /// <language>zh_CN</language>
  594. public string name;
  595. /// <private/>
  596. public ColorTransform color = null; // Initial value.
  597. /// <private/>
  598. public UserData userData = null; // Initial value.
  599. /// <summary>
  600. /// - The parent bone data.
  601. /// </summary>
  602. /// <version>DragonBones 3.0</version>
  603. /// <language>en_US</language>
  604. /// <summary>
  605. /// - 父骨骼数据。
  606. /// </summary>
  607. /// <version>DragonBones 3.0</version>
  608. /// <language>zh_CN</language>
  609. public BoneData parent;
  610. /// <inheritDoc/>
  611. protected override void _OnClear()
  612. {
  613. if (this.userData != null)
  614. {
  615. this.userData.ReturnToPool();
  616. }
  617. this.blendMode = BlendMode.Normal;
  618. this.displayIndex = 0;
  619. this.zOrder = 0;
  620. this.name = "";
  621. this.color = null; //
  622. this.userData = null;
  623. this.parent = null; //
  624. }
  625. }
  626. }