TimelineState.cs 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114
  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. /// <internal/>
  28. /// <private/>
  29. internal class ActionTimelineState : TimelineState
  30. {
  31. private void _OnCrossFrame(int frameIndex)
  32. {
  33. var eventDispatcher = this._armature.proxy;
  34. if (this._animationState.actionEnabled)
  35. {
  36. var frameOffset = this._animationData.frameOffset + this._timelineArray[(this._timelineData as TimelineData).offset + (int)BinaryOffset.TimelineFrameOffset + frameIndex];
  37. var actionCount = this._frameArray[frameOffset + 1];
  38. var actions = this._animationData.parent.actions; // May be the animaton data not belong to this armature data.
  39. for (var i = 0; i < actionCount; ++i)
  40. {
  41. var actionIndex = this._frameArray[frameOffset + 2 + i];
  42. var action = actions[actionIndex];
  43. if (action.type == ActionType.Play)
  44. {
  45. var eventObject = BaseObject.BorrowObject<EventObject>();
  46. // eventObject.time = this._frameArray[frameOffset] * this._frameRateR; // Precision problem
  47. eventObject.time = this._frameArray[frameOffset] / this._frameRate;
  48. eventObject.animationState = this._animationState;
  49. EventObject.ActionDataToInstance(action, eventObject, this._armature);
  50. this._armature._BufferAction(eventObject, true);
  51. }
  52. else
  53. {
  54. var eventType = action.type == ActionType.Frame ? EventObject.FRAME_EVENT : EventObject.SOUND_EVENT;
  55. if (action.type == ActionType.Sound || eventDispatcher.HasDBEventListener(eventType))
  56. {
  57. var eventObject = BaseObject.BorrowObject<EventObject>();
  58. // eventObject.time = this._frameArray[frameOffset] * this._frameRateR; // Precision problem
  59. eventObject.time = (float)this._frameArray[frameOffset] / (float)this._frameRate;
  60. eventObject.animationState = this._animationState;
  61. EventObject.ActionDataToInstance(action, eventObject, this._armature);
  62. this._armature._dragonBones.BufferEvent(eventObject);
  63. }
  64. }
  65. }
  66. }
  67. }
  68. protected override void _OnArriveAtFrame() { }
  69. protected override void _OnUpdateFrame() { }
  70. public override void Update(float passedTime)
  71. {
  72. var prevState = this.playState;
  73. var prevPlayTimes = this.currentPlayTimes;
  74. var prevTime = this.currentTime;
  75. if (this._SetCurrentTime(passedTime))
  76. {
  77. var eventDispatcher = this._armature.proxy;
  78. if (prevState < 0)
  79. {
  80. if (this.playState != prevState)
  81. {
  82. if (this._animationState.displayControl && this._animationState.resetToPose)
  83. {
  84. // Reset zorder to pose.
  85. this._armature._SortZOrder(null, 0);
  86. }
  87. prevPlayTimes = this.currentPlayTimes;
  88. if (eventDispatcher.HasDBEventListener(EventObject.START))
  89. {
  90. var eventObject = BaseObject.BorrowObject<EventObject>();
  91. eventObject.type = EventObject.START;
  92. eventObject.armature = this._armature;
  93. eventObject.animationState = this._animationState;
  94. this._armature._dragonBones.BufferEvent(eventObject);
  95. }
  96. }
  97. else
  98. {
  99. return;
  100. }
  101. }
  102. var isReverse = this._animationState.timeScale < 0.0f;
  103. EventObject loopCompleteEvent = null;
  104. EventObject completeEvent = null;
  105. if (this.currentPlayTimes != prevPlayTimes)
  106. {
  107. if (eventDispatcher.HasDBEventListener(EventObject.LOOP_COMPLETE))
  108. {
  109. loopCompleteEvent = BaseObject.BorrowObject<EventObject>();
  110. loopCompleteEvent.type = EventObject.LOOP_COMPLETE;
  111. loopCompleteEvent.armature = this._armature;
  112. loopCompleteEvent.animationState = this._animationState;
  113. }
  114. if (this.playState > 0)
  115. {
  116. if (eventDispatcher.HasDBEventListener(EventObject.COMPLETE))
  117. {
  118. completeEvent = BaseObject.BorrowObject<EventObject>();
  119. completeEvent.type = EventObject.COMPLETE;
  120. completeEvent.armature = this._armature;
  121. completeEvent.animationState = this._animationState;
  122. }
  123. }
  124. }
  125. if (this._frameCount > 1)
  126. {
  127. var timelineData = this._timelineData as TimelineData;
  128. var timelineFrameIndex = (int)(this.currentTime * this._frameRate); // uint
  129. var frameIndex = (int)this._frameIndices[timelineData.frameIndicesOffset + timelineFrameIndex];
  130. if (this._frameIndex != frameIndex)
  131. {
  132. // Arrive at frame.
  133. var crossedFrameIndex = this._frameIndex;
  134. this._frameIndex = frameIndex;
  135. if (this._timelineArray != null)
  136. {
  137. this._frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + (int)BinaryOffset.TimelineFrameOffset + this._frameIndex];
  138. if (isReverse)
  139. {
  140. if (crossedFrameIndex < 0)
  141. {
  142. var prevFrameIndex = (int)(prevTime * this._frameRate);
  143. crossedFrameIndex = (int)this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex];
  144. if (this.currentPlayTimes == prevPlayTimes)
  145. {
  146. // Start.
  147. if (crossedFrameIndex == frameIndex)
  148. { // Uncrossed.
  149. crossedFrameIndex = -1;
  150. }
  151. }
  152. }
  153. while (crossedFrameIndex >= 0)
  154. {
  155. var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + (int)BinaryOffset.TimelineFrameOffset + crossedFrameIndex];
  156. // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem
  157. var framePosition = (float)this._frameArray[frameOffset] / (float)this._frameRate;
  158. if (this._position <= framePosition && framePosition <= this._position + this._duration)
  159. {
  160. // Support interval play.
  161. this._OnCrossFrame(crossedFrameIndex);
  162. }
  163. if (loopCompleteEvent != null && crossedFrameIndex == 0)
  164. {
  165. // Add loop complete event after first frame.
  166. this._armature._dragonBones.BufferEvent(loopCompleteEvent);
  167. loopCompleteEvent = null;
  168. }
  169. if (crossedFrameIndex > 0)
  170. {
  171. crossedFrameIndex--;
  172. }
  173. else
  174. {
  175. crossedFrameIndex = (int)this._frameCount - 1;
  176. }
  177. if (crossedFrameIndex == frameIndex)
  178. {
  179. break;
  180. }
  181. }
  182. }
  183. else
  184. {
  185. if (crossedFrameIndex < 0)
  186. {
  187. var prevFrameIndex = (int)(prevTime * this._frameRate);
  188. crossedFrameIndex = (int)this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex];
  189. var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + (int)BinaryOffset.TimelineFrameOffset + crossedFrameIndex];
  190. // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem
  191. var framePosition = (float)this._frameArray[frameOffset] / (float)this._frameRate;
  192. if (this.currentPlayTimes == prevPlayTimes)
  193. {
  194. // Start.
  195. if (prevTime <= framePosition)
  196. {
  197. // Crossed.
  198. if (crossedFrameIndex > 0)
  199. {
  200. crossedFrameIndex--;
  201. }
  202. else
  203. {
  204. crossedFrameIndex = (int)this._frameCount - 1;
  205. }
  206. }
  207. else if (crossedFrameIndex == frameIndex)
  208. {
  209. // Uncrossed.
  210. crossedFrameIndex = -1;
  211. }
  212. }
  213. }
  214. while (crossedFrameIndex >= 0)
  215. {
  216. if (crossedFrameIndex < this._frameCount - 1)
  217. {
  218. crossedFrameIndex++;
  219. }
  220. else
  221. {
  222. crossedFrameIndex = 0;
  223. }
  224. var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + (int)BinaryOffset.TimelineFrameOffset + crossedFrameIndex];
  225. // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem
  226. var framePosition = (float)this._frameArray[frameOffset] / (float)this._frameRate;
  227. if (this._position <= framePosition && framePosition <= this._position + this._duration)
  228. {
  229. // Support interval play.
  230. this._OnCrossFrame(crossedFrameIndex);
  231. }
  232. if (loopCompleteEvent != null && crossedFrameIndex == 0)
  233. {
  234. // Add loop complete event before first frame.
  235. this._armature._dragonBones.BufferEvent(loopCompleteEvent);
  236. loopCompleteEvent = null;
  237. }
  238. if (crossedFrameIndex == frameIndex)
  239. {
  240. break;
  241. }
  242. }
  243. }
  244. }
  245. }
  246. }
  247. else if (this._frameIndex < 0)
  248. {
  249. this._frameIndex = 0;
  250. if (this._timelineData != null)
  251. {
  252. this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + (int)BinaryOffset.TimelineFrameOffset];
  253. // Arrive at frame.
  254. var framePosition = (float)this._frameArray[this._frameOffset] / (float)this._frameRate;
  255. if (this.currentPlayTimes == prevPlayTimes)
  256. {
  257. // Start.
  258. if (prevTime <= framePosition)
  259. {
  260. this._OnCrossFrame(this._frameIndex);
  261. }
  262. }
  263. else if (this._position <= framePosition)
  264. {
  265. // Loop complete.
  266. if (!isReverse && loopCompleteEvent != null)
  267. {
  268. // Add loop complete event before first frame.
  269. this._armature._dragonBones.BufferEvent(loopCompleteEvent);
  270. loopCompleteEvent = null;
  271. }
  272. this._OnCrossFrame(this._frameIndex);
  273. }
  274. }
  275. }
  276. if (loopCompleteEvent != null)
  277. {
  278. this._armature._dragonBones.BufferEvent(loopCompleteEvent);
  279. }
  280. if (completeEvent != null)
  281. {
  282. this._armature._dragonBones.BufferEvent(completeEvent);
  283. }
  284. }
  285. }
  286. public void SetCurrentTime(float value)
  287. {
  288. this._SetCurrentTime(value);
  289. this._frameIndex = -1;
  290. }
  291. }
  292. /// <internal/>
  293. /// <private/>
  294. internal class ZOrderTimelineState : TimelineState
  295. {
  296. protected override void _OnArriveAtFrame()
  297. {
  298. if (this.playState >= 0)
  299. {
  300. var count = this._frameArray[this._frameOffset + 1];
  301. if (count > 0)
  302. {
  303. this._armature._SortZOrder(this._frameArray, (int)this._frameOffset + 2);
  304. }
  305. else
  306. {
  307. this._armature._SortZOrder(null, 0);
  308. }
  309. }
  310. }
  311. protected override void _OnUpdateFrame() { }
  312. }
  313. /// <internal/>
  314. /// <private/>
  315. internal class BoneAllTimelineState : BoneTimelineState
  316. {
  317. protected override void _OnArriveAtFrame()
  318. {
  319. base._OnArriveAtFrame();
  320. if (this._timelineData != null)
  321. {
  322. var valueOffset = (int)this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 6; // ...(timeline value offset)|xxxxxx|xxxxxx|(Value offset)xxxxx|(Next offset)xxxxx|xxxxxx|xxxxxx|...
  323. var scale = this._armature._armatureData.scale;
  324. var frameFloatArray = this._dragonBonesData.frameFloatArray;
  325. var current = this.bonePose.current;
  326. var delta = this.bonePose.delta;
  327. current.x = frameFloatArray[valueOffset++] * scale;
  328. current.y = frameFloatArray[valueOffset++] * scale;
  329. current.rotation = frameFloatArray[valueOffset++];
  330. current.skew = frameFloatArray[valueOffset++];
  331. current.scaleX = frameFloatArray[valueOffset++];
  332. current.scaleY = frameFloatArray[valueOffset++];
  333. if (this._tweenState == TweenState.Always)
  334. {
  335. if (this._frameIndex == this._frameCount - 1)
  336. {
  337. valueOffset = (int)this._animationData.frameFloatOffset + this._frameValueOffset;
  338. }
  339. delta.x = frameFloatArray[valueOffset++] * scale - current.x;
  340. delta.y = frameFloatArray[valueOffset++] * scale - current.y;
  341. delta.rotation = frameFloatArray[valueOffset++] - current.rotation;
  342. delta.skew = frameFloatArray[valueOffset++] - current.skew;
  343. delta.scaleX = frameFloatArray[valueOffset++] - current.scaleX;
  344. delta.scaleY = frameFloatArray[valueOffset++] - current.scaleY;
  345. }
  346. else
  347. {
  348. delta.x = 0.0f;
  349. delta.y = 0.0f;
  350. delta.rotation = 0.0f;
  351. delta.skew = 0.0f;
  352. delta.scaleX = 0.0f;
  353. delta.scaleY = 0.0f;
  354. }
  355. }
  356. else
  357. {
  358. // Pose.
  359. var current = this.bonePose.current;
  360. var delta = this.bonePose.delta;
  361. current.x = 0.0f;
  362. current.y = 0.0f;
  363. current.rotation = 0.0f;
  364. current.skew = 0.0f;
  365. current.scaleX = 1.0f;
  366. current.scaleY = 1.0f;
  367. delta.x = 0.0f;
  368. delta.y = 0.0f;
  369. delta.rotation = 0.0f;
  370. delta.skew = 0.0f;
  371. delta.scaleX = 0.0f;
  372. delta.scaleY = 0.0f;
  373. }
  374. }
  375. protected override void _OnUpdateFrame()
  376. {
  377. base._OnUpdateFrame();
  378. var current = this.bonePose.current;
  379. var delta = this.bonePose.delta;
  380. var result = this.bonePose.result;
  381. this.bone._transformDirty = true;
  382. if (this._tweenState != TweenState.Always)
  383. {
  384. this._tweenState = TweenState.None;
  385. }
  386. result.x = current.x + delta.x * this._tweenProgress;
  387. result.y = current.y + delta.y * this._tweenProgress;
  388. result.rotation = current.rotation + delta.rotation * this._tweenProgress;
  389. result.skew = current.skew + delta.skew * this._tweenProgress;
  390. result.scaleX = current.scaleX + delta.scaleX * this._tweenProgress;
  391. result.scaleY = current.scaleY + delta.scaleY * this._tweenProgress;
  392. }
  393. public override void FadeOut()
  394. {
  395. var result = this.bonePose.result;
  396. result.rotation = TransformDB.NormalizeRadian(result.rotation);
  397. result.skew = TransformDB.NormalizeRadian(result.skew);
  398. }
  399. }
  400. /// <internal/>
  401. /// <private/>
  402. internal class BoneTranslateTimelineState : BoneTimelineState
  403. {
  404. protected override void _OnArriveAtFrame()
  405. {
  406. base._OnArriveAtFrame();
  407. if (this._timelineData != null)
  408. {
  409. var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 2;
  410. var scale = this._armature._armatureData.scale;
  411. var frameFloatArray = this._dragonBonesData.frameFloatArray;
  412. var current = this.bonePose.current;
  413. var delta = this.bonePose.delta;
  414. current.x = frameFloatArray[valueOffset++] * scale;
  415. current.y = frameFloatArray[valueOffset++] * scale;
  416. if (this._tweenState == TweenState.Always)
  417. {
  418. if (this._frameIndex == this._frameCount - 1)
  419. {
  420. valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset;
  421. }
  422. delta.x = frameFloatArray[valueOffset++] * scale - current.x;
  423. delta.y = frameFloatArray[valueOffset++] * scale - current.y;
  424. }
  425. else
  426. {
  427. delta.x = 0.0f;
  428. delta.y = 0.0f;
  429. }
  430. }
  431. else
  432. {
  433. // Pose.
  434. var current = this.bonePose.current;
  435. var delta = this.bonePose.delta;
  436. current.x = 0.0f;
  437. current.y = 0.0f;
  438. delta.x = 0.0f;
  439. delta.y = 0.0f;
  440. }
  441. }
  442. protected override void _OnUpdateFrame()
  443. {
  444. base._OnUpdateFrame();
  445. var current = this.bonePose.current;
  446. var delta = this.bonePose.delta;
  447. var result = this.bonePose.result;
  448. this.bone._transformDirty = true;
  449. if (this._tweenState != TweenState.Always)
  450. {
  451. this._tweenState = TweenState.None;
  452. }
  453. result.x = current.x + delta.x * this._tweenProgress;
  454. result.y = current.y + delta.y * this._tweenProgress;
  455. }
  456. }
  457. /// <internal/>
  458. /// <private/>
  459. internal class BoneRotateTimelineState : BoneTimelineState
  460. {
  461. protected override void _OnArriveAtFrame()
  462. {
  463. base._OnArriveAtFrame();
  464. if (this._timelineData != null)
  465. {
  466. var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 2;
  467. var frameFloatArray = this._dragonBonesData.frameFloatArray;
  468. var current = this.bonePose.current;
  469. var delta = this.bonePose.delta;
  470. current.rotation = frameFloatArray[valueOffset++];
  471. current.skew = frameFloatArray[valueOffset++];
  472. if (this._tweenState == TweenState.Always)
  473. {
  474. if (this._frameIndex == this._frameCount - 1)
  475. {
  476. valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset;
  477. delta.rotation = TransformDB.NormalizeRadian(frameFloatArray[valueOffset++] - current.rotation);
  478. }
  479. else
  480. {
  481. delta.rotation = frameFloatArray[valueOffset++] - current.rotation;
  482. }
  483. delta.skew = frameFloatArray[valueOffset++] - current.skew;
  484. }
  485. else
  486. {
  487. delta.rotation = 0.0f;
  488. delta.skew = 0.0f;
  489. }
  490. }
  491. else
  492. {
  493. // Pose.
  494. var current = this.bonePose.current;
  495. var delta = this.bonePose.delta;
  496. current.rotation = 0.0f;
  497. current.skew = 0.0f;
  498. delta.rotation = 0.0f;
  499. delta.skew = 0.0f;
  500. }
  501. }
  502. protected override void _OnUpdateFrame()
  503. {
  504. base._OnUpdateFrame();
  505. var current = this.bonePose.current;
  506. var delta = this.bonePose.delta;
  507. var result = this.bonePose.result;
  508. this.bone._transformDirty = true;
  509. if (this._tweenState != TweenState.Always)
  510. {
  511. this._tweenState = TweenState.None;
  512. }
  513. result.rotation = current.rotation + delta.rotation * this._tweenProgress;
  514. result.skew = current.skew + delta.skew * this._tweenProgress;
  515. }
  516. public override void FadeOut()
  517. {
  518. var result = this.bonePose.result;
  519. result.rotation = TransformDB.NormalizeRadian(result.rotation);
  520. result.skew = TransformDB.NormalizeRadian(result.skew);
  521. }
  522. }
  523. /// <internal/>
  524. /// <private/>
  525. internal class BoneScaleTimelineState : BoneTimelineState
  526. {
  527. protected override void _OnArriveAtFrame()
  528. {
  529. base._OnArriveAtFrame();
  530. if (this._timelineData != null)
  531. {
  532. var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 2;
  533. var frameFloatArray = this._dragonBonesData.frameFloatArray;
  534. var current = this.bonePose.current;
  535. var delta = this.bonePose.delta;
  536. current.scaleX = frameFloatArray[valueOffset++];
  537. current.scaleY = frameFloatArray[valueOffset++];
  538. if (this._tweenState == TweenState.Always)
  539. {
  540. if (this._frameIndex == this._frameCount - 1)
  541. {
  542. valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset;
  543. }
  544. delta.scaleX = frameFloatArray[valueOffset++] - current.scaleX;
  545. delta.scaleY = frameFloatArray[valueOffset++] - current.scaleY;
  546. }
  547. else
  548. {
  549. delta.scaleX = 0.0f;
  550. delta.scaleY = 0.0f;
  551. }
  552. }
  553. else
  554. {
  555. // Pose.
  556. var current = this.bonePose.current;
  557. var delta = this.bonePose.delta;
  558. current.scaleX = 1.0f;
  559. current.scaleY = 1.0f;
  560. delta.scaleX = 0.0f;
  561. delta.scaleY = 0.0f;
  562. }
  563. }
  564. protected override void _OnUpdateFrame()
  565. {
  566. base._OnUpdateFrame();
  567. var current = this.bonePose.current;
  568. var delta = this.bonePose.delta;
  569. var result = this.bonePose.result;
  570. this.bone._transformDirty = true;
  571. if (this._tweenState != TweenState.Always)
  572. {
  573. this._tweenState = TweenState.None;
  574. }
  575. result.scaleX = current.scaleX + delta.scaleX * this._tweenProgress;
  576. result.scaleY = current.scaleY + delta.scaleY * this._tweenProgress;
  577. }
  578. }
  579. /// <internal/>
  580. /// <private/>
  581. internal class SlotDislayTimelineState : SlotTimelineState
  582. {
  583. protected override void _OnArriveAtFrame()
  584. {
  585. if (this.playState >= 0)
  586. {
  587. var displayIndex = this._timelineData != null ? this._frameArray[this._frameOffset + 1] : this.slot.slotData.displayIndex;
  588. if (this.slot.displayIndex != displayIndex)
  589. {
  590. this.slot._SetDisplayIndex(displayIndex, true);
  591. }
  592. }
  593. }
  594. }
  595. /// <internal/>
  596. /// <private/>
  597. internal class SlotColorTimelineState : SlotTimelineState
  598. {
  599. private bool _dirty;
  600. private readonly int[] _current = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
  601. private readonly int[] _delta = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
  602. private readonly float[] _result = new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
  603. protected override void _OnClear()
  604. {
  605. base._OnClear();
  606. this._dirty = false;
  607. }
  608. protected override void _OnArriveAtFrame()
  609. {
  610. base._OnArriveAtFrame();
  611. if (this._timelineData != null)
  612. {
  613. var intArray = this._dragonBonesData.intArray;
  614. var frameIntArray = this._dragonBonesData.frameIntArray;
  615. var valueOffset = this._animationData.frameIntOffset + this._frameValueOffset + this._frameIndex * 1; // ...(timeline value offset)|x|x|(Value offset)|(Next offset)|x|x|...
  616. int colorOffset = frameIntArray[valueOffset];
  617. if (colorOffset < 0)
  618. {
  619. colorOffset += 65536;// Fixed out of bouds bug.
  620. }
  621. this._current[0] = intArray[colorOffset++];
  622. this._current[1] = intArray[colorOffset++];
  623. this._current[2] = intArray[colorOffset++];
  624. this._current[3] = intArray[colorOffset++];
  625. this._current[4] = intArray[colorOffset++];
  626. this._current[5] = intArray[colorOffset++];
  627. this._current[6] = intArray[colorOffset++];
  628. this._current[7] = intArray[colorOffset++];
  629. if (this._tweenState == TweenState.Always)
  630. {
  631. if (this._frameIndex == this._frameCount - 1)
  632. {
  633. colorOffset = frameIntArray[this._animationData.frameIntOffset + this._frameValueOffset];
  634. }
  635. else
  636. {
  637. colorOffset = frameIntArray[valueOffset + 1 * 1];
  638. }
  639. if (colorOffset < 0)
  640. {
  641. colorOffset += 65536;
  642. }
  643. this._delta[0] = intArray[colorOffset++] - this._current[0];
  644. this._delta[1] = intArray[colorOffset++] - this._current[1];
  645. this._delta[2] = intArray[colorOffset++] - this._current[2];
  646. this._delta[3] = intArray[colorOffset++] - this._current[3];
  647. this._delta[4] = intArray[colorOffset++] - this._current[4];
  648. this._delta[5] = intArray[colorOffset++] - this._current[5];
  649. this._delta[6] = intArray[colorOffset++] - this._current[6];
  650. this._delta[7] = intArray[colorOffset++] - this._current[7];
  651. }
  652. }
  653. else
  654. {
  655. // Pose.
  656. var color = this.slot._slotData.color;
  657. this._current[0] = (int)(color.alphaMultiplier * 100.0f);
  658. this._current[1] = (int)(color.redMultiplier * 100.0f);
  659. this._current[2] = (int)(color.greenMultiplier * 100.0f);
  660. this._current[3] = (int)(color.blueMultiplier * 100.0f);
  661. this._current[4] = color.alphaOffset;
  662. this._current[5] = color.redOffset;
  663. this._current[6] = color.greenOffset;
  664. this._current[7] = color.blueOffset;
  665. }
  666. }
  667. protected override void _OnUpdateFrame()
  668. {
  669. base._OnUpdateFrame();
  670. this._dirty = true;
  671. if (this._tweenState != TweenState.Always)
  672. {
  673. this._tweenState = TweenState.None;
  674. }
  675. this._result[0] = (this._current[0] + this._delta[0] * this._tweenProgress) * 0.01f;
  676. this._result[1] = (this._current[1] + this._delta[1] * this._tweenProgress) * 0.01f;
  677. this._result[2] = (this._current[2] + this._delta[2] * this._tweenProgress) * 0.01f;
  678. this._result[3] = (this._current[3] + this._delta[3] * this._tweenProgress) * 0.01f;
  679. this._result[4] = this._current[4] + this._delta[4] * this._tweenProgress;
  680. this._result[5] = this._current[5] + this._delta[5] * this._tweenProgress;
  681. this._result[6] = this._current[6] + this._delta[6] * this._tweenProgress;
  682. this._result[7] = this._current[7] + this._delta[7] * this._tweenProgress;
  683. }
  684. public override void FadeOut()
  685. {
  686. this._tweenState = TweenState.None;
  687. this._dirty = false;
  688. }
  689. public override void Update(float passedTime)
  690. {
  691. base.Update(passedTime);
  692. // Fade animation.
  693. if (this._tweenState != TweenState.None || this._dirty)
  694. {
  695. var result = this.slot._colorTransform;
  696. if (this._animationState._fadeState != 0 || this._animationState._subFadeState != 0)
  697. {
  698. if (result.alphaMultiplier != this._result[0] ||
  699. result.redMultiplier != this._result[1] ||
  700. result.greenMultiplier != this._result[2] ||
  701. result.blueMultiplier != this._result[3] ||
  702. result.alphaOffset != this._result[4] ||
  703. result.redOffset != this._result[5] ||
  704. result.greenOffset != this._result[6] ||
  705. result.blueOffset != this._result[7])
  706. {
  707. var fadeProgress = (float)Math.Pow(this._animationState._fadeProgress, 4);
  708. result.alphaMultiplier += (this._result[0] - result.alphaMultiplier) * fadeProgress;
  709. result.redMultiplier += (this._result[1] - result.redMultiplier) * fadeProgress;
  710. result.greenMultiplier += (this._result[2] - result.greenMultiplier) * fadeProgress;
  711. result.blueMultiplier += (this._result[3] - result.blueMultiplier) * fadeProgress;
  712. result.alphaOffset += (int)((this._result[4] - result.alphaOffset) * fadeProgress);
  713. result.redOffset += (int)((this._result[5] - result.redOffset) * fadeProgress);
  714. result.greenOffset += (int)((this._result[6] - result.greenOffset) * fadeProgress);
  715. result.blueOffset += (int)((this._result[7] - result.blueOffset) * fadeProgress);
  716. this.slot._colorDirty = true;
  717. }
  718. }
  719. else if (this._dirty)
  720. {
  721. this._dirty = false;
  722. if (result.alphaMultiplier != this._result[0] ||
  723. result.redMultiplier != this._result[1] ||
  724. result.greenMultiplier != this._result[2] ||
  725. result.blueMultiplier != this._result[3] ||
  726. result.alphaOffset != (int)this._result[4] ||
  727. result.redOffset != (int)this._result[5] ||
  728. result.greenOffset != (int)this._result[6] ||
  729. result.blueOffset != (int)this._result[7])
  730. {
  731. result.alphaMultiplier = this._result[0];
  732. result.redMultiplier = this._result[1];
  733. result.greenMultiplier = this._result[2];
  734. result.blueMultiplier = this._result[3];
  735. result.alphaOffset = (int)this._result[4];
  736. result.redOffset = (int)this._result[5];
  737. result.greenOffset = (int)this._result[6];
  738. result.blueOffset = (int)this._result[7];
  739. this.slot._colorDirty = true;
  740. }
  741. }
  742. }
  743. }
  744. }
  745. /// <internal/>
  746. /// <private/>
  747. internal class DeformTimelineState : SlotTimelineState
  748. {
  749. public int vertexOffset;
  750. private bool _dirty;
  751. private int _frameFloatOffset;
  752. private int _valueCount;
  753. private int _deformCount;
  754. private int _valueOffset;
  755. private readonly List<float> _current = new List<float>();
  756. private readonly List<float> _delta = new List<float>();
  757. private readonly List<float> _result = new List<float>();
  758. //QQ
  759. public bool test = false;
  760. protected override void _OnClear()
  761. {
  762. base._OnClear();
  763. this.vertexOffset = 0;
  764. this._dirty = false;
  765. this._frameFloatOffset = 0;
  766. this._valueCount = 0;
  767. this._deformCount = 0;
  768. this._valueOffset = 0;
  769. this._current.Clear();
  770. this._delta.Clear();
  771. this._result.Clear();
  772. }
  773. protected override void _OnArriveAtFrame()
  774. {
  775. base._OnArriveAtFrame();
  776. if (this._timelineData != null)
  777. {
  778. var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * this._valueCount;
  779. var scale = this._armature._armatureData.scale;
  780. var frameFloatArray = this._dragonBonesData.frameFloatArray;
  781. if (this._tweenState == TweenState.Always)
  782. {
  783. var nextValueOffset = valueOffset + this._valueCount;
  784. if (this._frameIndex == this._frameCount - 1)
  785. {
  786. nextValueOffset = this._animationData.frameFloatOffset + this._frameValueOffset;
  787. }
  788. for (var i = 0; i < this._valueCount; ++i)
  789. {
  790. this._delta[i] = frameFloatArray[nextValueOffset + i] * scale - (this._current[i] = frameFloatArray[valueOffset + i] * scale);
  791. }
  792. }
  793. else
  794. {
  795. for (var i = 0; i < this._valueCount; ++i)
  796. {
  797. this._current[i] = frameFloatArray[valueOffset + i] * scale;
  798. }
  799. }
  800. }
  801. else
  802. {
  803. for (var i = 0; i < this._valueCount; ++i)
  804. {
  805. this._current[i] = 0.0f;
  806. }
  807. }
  808. }
  809. protected override void _OnUpdateFrame()
  810. {
  811. base._OnUpdateFrame();
  812. this._dirty = true;
  813. if (this._tweenState != TweenState.Always)
  814. {
  815. this._tweenState = TweenState.None;
  816. }
  817. for (var i = 0; i < this._valueCount; ++i)
  818. {
  819. this._result[i] = this._current[i] + this._delta[i] * this._tweenProgress;
  820. }
  821. }
  822. public override void Init(Armature armature, AnimationState animationState, TimelineData timelineData)
  823. {
  824. base.Init(armature, animationState, timelineData);
  825. if (this._timelineData != null)
  826. {
  827. var frameIntOffset = this._animationData.frameIntOffset + this._timelineArray[this._timelineData.offset + (int)BinaryOffset.TimelineFrameValueCount];
  828. this.vertexOffset = this._frameIntArray[frameIntOffset + (int)BinaryOffset.DeformVertexOffset];
  829. if (this.vertexOffset < 0)
  830. {
  831. this.vertexOffset += 65536; // Fixed out of bouds bug.
  832. }
  833. this._deformCount = this._frameIntArray[frameIntOffset + (int)BinaryOffset.DeformCount];
  834. this._valueCount = this._frameIntArray[frameIntOffset + (int)BinaryOffset.DeformValueCount];
  835. this._valueOffset = this._frameIntArray[frameIntOffset + (int)BinaryOffset.DeformValueOffset];
  836. this._frameFloatOffset = this._frameIntArray[frameIntOffset + (int)BinaryOffset.DeformFloatOffset] + (int)this._animationData.frameFloatOffset;
  837. }
  838. else
  839. {
  840. this._deformCount = this.slot._deformVertices != null ? this.slot._deformVertices.vertices.Count : 0;
  841. this._valueCount = this._deformCount;
  842. this._valueOffset = 0;
  843. this._frameFloatOffset = 0;
  844. }
  845. this._current.ResizeList(this._valueCount);
  846. this._delta.ResizeList(this._valueCount);
  847. this._result.ResizeList(this._valueCount);
  848. for (var i = 0; i < this._valueCount; ++i)
  849. {
  850. this._delta[i] = 0.0f;
  851. }
  852. }
  853. public override void FadeOut()
  854. {
  855. this._tweenState = TweenState.None;
  856. this._dirty = false;
  857. }
  858. public override void Update(float passedTime)
  859. {
  860. var deformVertices = this.slot._deformVertices;
  861. if (deformVertices == null || deformVertices.verticesData == null || deformVertices.verticesData.offset != this.vertexOffset)
  862. {
  863. return;
  864. }
  865. else if(this._timelineData != null && this._dragonBonesData != deformVertices.verticesData.data)
  866. {
  867. return;
  868. }
  869. base.Update(passedTime);
  870. // Fade animation.
  871. if (this._tweenState != TweenState.None || this._dirty)
  872. {
  873. var result = deformVertices.vertices;
  874. if (this._animationState._fadeState != 0 || this._animationState._subFadeState != 0)
  875. {
  876. var fadeProgress = (float)Math.Pow(this._animationState._fadeProgress, 2);
  877. if (this._timelineData != null)
  878. {
  879. for (var i = 0; i < this._deformCount; ++i)
  880. {
  881. if (i < this._valueOffset)
  882. {
  883. result[i] += (this._frameFloatArray[this._frameFloatOffset + i] - result[i]) * fadeProgress;
  884. }
  885. else if (i < this._valueOffset + this._valueCount)
  886. {
  887. result[i] += (this._result[i - this._valueOffset] - result[i]) * fadeProgress;
  888. }
  889. else
  890. {
  891. result[i] += (this._frameFloatArray[this._frameFloatOffset + i - this._valueCount] - result[i]) * fadeProgress;
  892. }
  893. }
  894. }
  895. else
  896. {
  897. this._deformCount = result.Count;
  898. for (var i = 0; i < this._deformCount; i++)
  899. {
  900. result[i] += (0.0f - result[i]) * fadeProgress;
  901. }
  902. }
  903. deformVertices.verticesDirty = true;
  904. }
  905. else if (this._dirty)
  906. {
  907. this._dirty = false;
  908. if (this._timelineData != null)
  909. {
  910. for (var i = 0; i < this._deformCount; ++i)
  911. {
  912. if (i < this._valueOffset)
  913. {
  914. result[i] = this._frameFloatArray[this._frameFloatOffset + i];
  915. }
  916. else if (i < this._valueOffset + this._valueCount)
  917. {
  918. result[i] = this._result[i - this._valueOffset];
  919. }
  920. else
  921. {
  922. result[i] = this._frameFloatArray[this._frameFloatOffset + i - this._valueCount];
  923. }
  924. }
  925. }
  926. else
  927. {
  928. this._deformCount = result.Count;
  929. for (var i = 0; i < this._deformCount; i++)
  930. {
  931. result[i] = 0.0f;
  932. }
  933. }
  934. deformVertices.verticesDirty = true;
  935. }
  936. }
  937. }
  938. }
  939. /// <internal/>
  940. /// <private/>
  941. internal class IKConstraintTimelineState : ConstraintTimelineState
  942. {
  943. private float _current;
  944. private float _delta;
  945. protected override void _OnClear()
  946. {
  947. base._OnClear();
  948. this._current = 0.0f;
  949. this._delta = 0.0f;
  950. }
  951. protected override void _OnArriveAtFrame()
  952. {
  953. base._OnArriveAtFrame();
  954. var ikConstraint = this.constraint as IKConstraint;
  955. if (this._timelineData != null)
  956. {
  957. var valueOffset = this._animationData.frameIntOffset + this._frameValueOffset + this._frameIndex * 2;
  958. var frameIntArray = this._frameIntArray;
  959. var bendPositive = frameIntArray[valueOffset++] != 0;
  960. this._current = frameIntArray[valueOffset++] * 0.01f;
  961. if (this._tweenState == TweenState.Always)
  962. {
  963. if (this._frameIndex == this._frameCount - 1)
  964. {
  965. valueOffset = this._animationData.frameIntOffset + this._frameValueOffset; // + 0 * 2
  966. }
  967. this._delta = frameIntArray[valueOffset + 1] * 0.01f - this._current;
  968. }
  969. else
  970. {
  971. this._delta = 0.0f;
  972. }
  973. ikConstraint._bendPositive = bendPositive;
  974. }
  975. else
  976. {
  977. var ikConstraintData = ikConstraint._constraintData as IKConstraintData;
  978. this._current = ikConstraintData.weight;
  979. this._delta = 0.0f;
  980. ikConstraint._bendPositive = ikConstraintData.bendPositive;
  981. }
  982. ikConstraint.InvalidUpdate();
  983. }
  984. protected override void _OnUpdateFrame()
  985. {
  986. base._OnUpdateFrame();
  987. if (this._tweenState != TweenState.Always)
  988. {
  989. this._tweenState = TweenState.None;
  990. }
  991. var ikConstraint = this.constraint as IKConstraint;
  992. ikConstraint._weight = this._current + this._delta * this._tweenProgress;
  993. ikConstraint.InvalidUpdate();
  994. }
  995. }
  996. }