UnitySlot.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. namespace DragonBones
  4. {
  5. /**
  6. * @language zh_CN
  7. * Unity 插槽。
  8. * @version DragonBones 3.0
  9. */
  10. public class UnitySlot : Slot
  11. {
  12. private static readonly int[] TRIANGLES = { 0, 1, 2, 0, 2, 3 };
  13. private static Vector3 _helpVector3 = new Vector3();
  14. private static readonly Vector2[] _helpVector2s = { new Vector2(), new Vector2(), new Vector2(), new Vector2() };
  15. private bool _skewed;
  16. private UnityArmatureComponent _proxy;
  17. private GameObject _renderDisplay;
  18. private Mesh _mesh;
  19. private Vector2[] _uvs;
  20. private Vector3[] _vertices;
  21. /**
  22. * @private
  23. */
  24. public UnitySlot()
  25. {
  26. }
  27. /**
  28. * @private
  29. */
  30. override protected void _onClear()
  31. {
  32. base._onClear();
  33. if (_mesh != null)
  34. {
  35. #if UNITY_EDITOR
  36. //Object.DestroyImmediate(_mesh);
  37. #else
  38. Object.Destroy(_mesh);
  39. #endif
  40. }
  41. _skewed = false;
  42. _proxy = null;
  43. _renderDisplay = null;
  44. _mesh = null;
  45. _uvs = null;
  46. _vertices = null;
  47. }
  48. /**
  49. * @private
  50. */
  51. override protected void _initDisplay(object value)
  52. {
  53. }
  54. /**
  55. * @private
  56. */
  57. override protected void _disposeDisplay(object value)
  58. {
  59. var gameObject = value as GameObject;
  60. #if UNITY_EDITOR
  61. Object.DestroyImmediate(gameObject);
  62. #else
  63. Object.Destroy(gameObject);
  64. #endif
  65. }
  66. /**
  67. * @private
  68. */
  69. override protected void _onUpdateDisplay()
  70. {
  71. _renderDisplay = (_display != null ? _display : _rawDisplay) as GameObject;
  72. }
  73. /**
  74. * @private
  75. */
  76. override protected void _addDisplay()
  77. {
  78. _proxy = _armature.eventDispatcher as UnityArmatureComponent;
  79. var container = _armature.display as GameObject;
  80. if (_renderDisplay.transform.parent != container.transform)
  81. {
  82. _renderDisplay.transform.parent = container.transform;
  83. _helpVector3.Set(0.0f, 0.0f, -_zOrder * (_proxy.zSpace + 0.001f));
  84. _renderDisplay.transform.localPosition = _helpVector3;
  85. }
  86. }
  87. /**
  88. * @private
  89. */
  90. override protected void _replaceDisplay(object value)
  91. {
  92. var container = _armature.display as GameObject;
  93. var prevDisplay = value as GameObject;
  94. prevDisplay.hideFlags = HideFlags.HideInHierarchy;
  95. prevDisplay.transform.parent = null;
  96. prevDisplay.SetActive(false);
  97. _renderDisplay.hideFlags = HideFlags.None;
  98. _renderDisplay.transform.parent = container.transform;
  99. _renderDisplay.transform.localPosition = prevDisplay.transform.localPosition;
  100. _renderDisplay.SetActive(true);
  101. }
  102. /**
  103. * @private
  104. */
  105. override protected void _removeDisplay()
  106. {
  107. _renderDisplay.transform.parent = null;
  108. }
  109. /**
  110. * @private
  111. */
  112. override protected void _updateZOrder()
  113. {
  114. // var container = _armature.display as GameObject;
  115. _helpVector3.Set(_renderDisplay.transform.localPosition.x, _renderDisplay.transform.localPosition.y, -_zOrder * (_proxy.zSpace + 0.001f));
  116. _renderDisplay.transform.localPosition = _helpVector3;
  117. }
  118. /**
  119. * @private
  120. */
  121. override internal void _updateVisible()
  122. {
  123. _renderDisplay.SetActive(_parent.visible);
  124. }
  125. /**
  126. * @private
  127. */
  128. override protected void _updateBlendMode()
  129. {
  130. // TODO
  131. switch (_blendMode)
  132. {
  133. case BlendMode.Normal:
  134. break;
  135. case BlendMode.Add:
  136. break;
  137. default:
  138. break;
  139. }
  140. }
  141. /**
  142. * @private
  143. */
  144. override protected void _updateColor()
  145. {
  146. // TODO
  147. /*var renderer = _renderDisplay.GetComponent<SpriteRenderer>();
  148. if (renderer != null)
  149. {
  150. _helpColor.r = _colorTransform.redMultiplier;
  151. _helpColor.g = _colorTransform.greenMultiplier;
  152. _helpColor.b = _colorTransform.blueMultiplier;
  153. _helpColor.a = _colorTransform.alphaMultiplier;
  154. renderer.color = _helpColor;
  155. }*/
  156. var meshFilter = _renderDisplay.GetComponent<MeshFilter>();
  157. if (meshFilter != null)
  158. {
  159. var mesh = meshFilter.sharedMesh;
  160. if (mesh != null)
  161. {
  162. var colors = new List<Color>(mesh.vertices.Length);
  163. for (int i = 0, l = mesh.vertices.Length; i < l; ++i)
  164. {
  165. colors.Add(new Color(
  166. _colorTransform.redMultiplier,
  167. _colorTransform.greenMultiplier,
  168. _colorTransform.blueMultiplier,
  169. _colorTransform.alphaMultiplier
  170. ));
  171. }
  172. mesh.SetColors(colors);
  173. }
  174. }
  175. }
  176. /**
  177. * @private
  178. */
  179. override protected void _updateFrame()
  180. {
  181. var isMeshDisplay = _meshData != null && _display == _meshDisplay;
  182. var currentTextureData = _textureData as UnityTextureData;
  183. var renderer = _renderDisplay.GetComponent<MeshRenderer>();
  184. var meshFilter = _renderDisplay.GetComponent<MeshFilter>();
  185. if (_display != null && _displayIndex >= 0 && currentTextureData != null)
  186. {
  187. var currentTextureAtlasData = currentTextureData.parent as UnityTextureAtlasData;
  188. // Update replaced texture atlas.
  189. if (_armature.replacedTexture != null && _displayData != null && currentTextureAtlasData == _displayData.texture.parent)
  190. {
  191. currentTextureAtlasData = _armature._replaceTextureAtlasData as UnityTextureAtlasData;
  192. if (currentTextureAtlasData == null)
  193. {
  194. currentTextureAtlasData = BaseObject.BorrowObject<UnityTextureAtlasData>();
  195. currentTextureAtlasData.CopyFrom(_textureData.parent);
  196. currentTextureAtlasData.texture = _armature.replacedTexture as Material;
  197. _armature._replaceTextureAtlasData = currentTextureAtlasData;
  198. }
  199. currentTextureData = currentTextureAtlasData.GetTexture(currentTextureData.name) as UnityTextureData;
  200. }
  201. var currentTextureAtlas = currentTextureAtlasData.texture;
  202. if (currentTextureAtlas != null)
  203. {
  204. var textureAtlasWidth = currentTextureAtlasData.width > 0.0f ? currentTextureAtlasData.width : currentTextureAtlas.mainTexture.width;
  205. var textureAtlasHeight = currentTextureAtlasData.height > 0.0f ? currentTextureAtlasData.height : currentTextureAtlas.mainTexture.height;
  206. if (_mesh != null)
  207. {
  208. #if UNITY_EDITOR
  209. //Object.DestroyImmediate(_mesh);
  210. #else
  211. Object.Destroy(_mesh);
  212. #endif
  213. }
  214. _mesh = new Mesh();
  215. if (isMeshDisplay) // Mesh.
  216. {
  217. _uvs = new Vector2[_meshData.uvs.Count / 2];
  218. _vertices = new Vector3[_meshData.vertices.Count / 2];
  219. for (int i = 0, l = _meshData.uvs.Count; i < l; i += 2)
  220. {
  221. var iN = i / 2;
  222. var u = _meshData.uvs[i];
  223. var v = _meshData.uvs[i + 1];
  224. _uvs[iN] = new Vector2(
  225. (currentTextureData.region.x + u * currentTextureData.region.width) / textureAtlasWidth,
  226. 1.0f - (currentTextureData.region.y + v * currentTextureData.region.height) / textureAtlasHeight
  227. );
  228. _vertices[iN] = new Vector3(_meshData.vertices[i], -_meshData.vertices[i + 1], 0.0f);
  229. }
  230. _mesh.vertices = _vertices; // Must set vertices before uvs.
  231. _mesh.uv = _uvs;
  232. _mesh.triangles = _meshData.vertexIndices.ToArray();
  233. }
  234. else // Normal texture.
  235. {
  236. var pivotY = _pivotY - currentTextureData.region.height * _armature.armatureData.scale;
  237. if (_vertices == null || _vertices.Length != 4)
  238. {
  239. _vertices = new Vector3[4];
  240. }
  241. for (int i = 0, l = 4; i < l; ++i)
  242. {
  243. var u = 0.0f;
  244. var v = 0.0f;
  245. switch (i)
  246. {
  247. case 0:
  248. break;
  249. case 1:
  250. u = 1.0f;
  251. break;
  252. case 2:
  253. u = 1.0f;
  254. v = 1.0f;
  255. break;
  256. case 3:
  257. v = 1.0f;
  258. break;
  259. default:
  260. break;
  261. }
  262. _helpVector2s[i].x = (currentTextureData.region.x + u * currentTextureData.region.width) / textureAtlasWidth;
  263. _helpVector2s[i].y = 1.0f - (currentTextureData.region.y + v * currentTextureData.region.height) / textureAtlasHeight;
  264. _vertices[i].x = (u * currentTextureData.region.width) * 0.01f - _pivotX;
  265. _vertices[i].y = (1.0f - v) * currentTextureData.region.height * 0.01f + pivotY;
  266. _vertices[i].z = 0.0f * 0.01f;
  267. }
  268. _mesh.vertices = _vertices; // Must set vertices before uvs.
  269. _mesh.uv = _helpVector2s;
  270. _mesh.triangles = TRIANGLES;
  271. }
  272. _mesh.RecalculateBounds();
  273. meshFilter.sharedMesh = _mesh;
  274. renderer.sharedMaterial = currentTextureAtlas;
  275. _updateVisible();
  276. return;
  277. }
  278. }
  279. _renderDisplay.SetActive(false);
  280. meshFilter.sharedMesh = null;
  281. renderer.sharedMaterial = null;
  282. _helpVector3.x = 0.0f;
  283. _helpVector3.y = 0.0f;
  284. _helpVector3.z = _renderDisplay.transform.localPosition.z;
  285. _renderDisplay.transform.localPosition = _helpVector3;
  286. }
  287. /**
  288. * @private
  289. */
  290. override protected void _updateMesh()
  291. {
  292. if (_mesh == null)
  293. {
  294. return;
  295. }
  296. var hasFFD = _ffdVertices.Count > 0;
  297. if (_meshData.skinned)
  298. {
  299. for (int i = 0, iF = 0, l = _meshData.vertices.Count; i < l; i += 2)
  300. {
  301. int iH = i / 2;
  302. var boneIndices = _meshData.boneIndices[iH];
  303. var boneVertices = _meshData.boneVertices[iH];
  304. var weights = _meshData.weights[iH];
  305. var xG = 0.0f;
  306. var yG = 0.0f;
  307. for (int iB = 0, lB = boneIndices.Length; iB < lB; ++iB)
  308. {
  309. var bone = _meshBones[boneIndices[iB]];
  310. var matrix = bone.globalTransformMatrix;
  311. var weight = weights[iB];
  312. var xL = 0.0f;
  313. var yL = 0.0f;
  314. if (hasFFD)
  315. {
  316. xL = boneVertices[iB * 2] + _ffdVertices[iF];
  317. yL = boneVertices[iB * 2 + 1] + _ffdVertices[iF + 1];
  318. }
  319. else
  320. {
  321. xL = boneVertices[iB * 2];
  322. yL = boneVertices[iB * 2 + 1];
  323. }
  324. xG += (matrix.a * xL + matrix.c * yL + matrix.tx) * weight;
  325. yG += (matrix.b * xL + matrix.d * yL + matrix.ty) * weight;
  326. iF += 2;
  327. }
  328. _vertices[iH].x = xG;
  329. _vertices[iH].y = -yG;
  330. }
  331. _mesh.vertices = _vertices;
  332. _mesh.RecalculateBounds();
  333. }
  334. else if (hasFFD)
  335. {
  336. var vertices = _meshData.vertices;
  337. for (int i = 0, l = _meshData.vertices.Count; i < l; i += 2)
  338. {
  339. int iH = i / 2;
  340. var xG = vertices[i] + _ffdVertices[i];
  341. var yG = vertices[i + 1] + _ffdVertices[i + 1];
  342. _vertices[iH].x = xG;
  343. _vertices[iH].y = -yG;
  344. }
  345. _mesh.vertices = _vertices;
  346. _mesh.RecalculateBounds();
  347. // Modify flip.
  348. _transformDirty = true;
  349. }
  350. }
  351. /**
  352. * @private
  353. */
  354. override protected void _updateTransform(bool isSkinnedMesh)
  355. {
  356. if (isSkinnedMesh) // Identity transform.
  357. {
  358. if (_armature.flipX)
  359. {
  360. _helpVector3.y = 180.0f;
  361. }
  362. else
  363. {
  364. _helpVector3.y = 0.0f;
  365. }
  366. if (_armature.flipY)
  367. {
  368. _helpVector3.x = 180.0f;
  369. }
  370. else
  371. {
  372. _helpVector3.x = 0.0f;
  373. }
  374. _helpVector3.z = 0.0f;
  375. _renderDisplay.transform.localPosition = new Vector3(0.0f, 0.0f, _renderDisplay.transform.localPosition.z);
  376. _renderDisplay.transform.localEulerAngles = _helpVector3;
  377. _renderDisplay.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
  378. }
  379. else
  380. {
  381. var flipX = _armature.flipX;
  382. var flipY = _armature.flipY;
  383. var scaleX = flipX ? -global.scaleX : global.scaleX;
  384. var scaleY = flipY ? -global.scaleY : global.scaleY;
  385. var transform = _renderDisplay.transform;
  386. _helpVector3.x = globalTransformMatrix.tx;
  387. _helpVector3.y = -globalTransformMatrix.ty;
  388. _helpVector3.z = transform.localPosition.z;
  389. if (flipX)
  390. {
  391. _helpVector3.x = -_helpVector3.x;
  392. }
  393. if (flipY)
  394. {
  395. _helpVector3.y = -_helpVector3.y;
  396. }
  397. transform.localPosition = _helpVector3;
  398. if (scaleY >= 0.0f || _childArmature != null)
  399. {
  400. _helpVector3.x = 0.0f;
  401. }
  402. else
  403. {
  404. _helpVector3.x = 180.0f;
  405. }
  406. if (scaleX >= 0.0f || _childArmature != null)
  407. {
  408. _helpVector3.y = 0.0f;
  409. }
  410. else
  411. {
  412. _helpVector3.y = 180.0f;
  413. }
  414. _helpVector3.z = -global.skewY * DragonBones.RADIAN_TO_ANGLE;
  415. if (flipX != flipY && _childArmature != null)
  416. {
  417. _helpVector3.z = -_helpVector3.z;
  418. }
  419. transform.localEulerAngles = _helpVector3;
  420. // Modify mesh skew. // TODO child armature skew.
  421. if ((_display == _rawDisplay || _display == _meshDisplay) && _mesh != null)
  422. {
  423. var dSkew = global.skewX - global.skewY;
  424. var skewed = dSkew < -0.01f || 0.01f < dSkew;
  425. if (_skewed || skewed)
  426. {
  427. _skewed = skewed;
  428. var isPositive = global.scaleX >= 0.0f;
  429. var cos = Mathf.Cos(dSkew);
  430. var sin = Mathf.Sin(dSkew);
  431. var vertices = _mesh.vertices;
  432. for (int i = 0, l = _vertices.Length; i < l; ++i)
  433. {
  434. var x = _vertices[i].x;
  435. var y = _vertices[i].y;
  436. if (isPositive)
  437. {
  438. vertices[i].x = x + y * sin;
  439. }
  440. else
  441. {
  442. vertices[i].x = -x + y * sin;
  443. }
  444. vertices[i].y = y * cos;
  445. }
  446. _mesh.vertices = vertices;
  447. _mesh.RecalculateBounds();
  448. }
  449. }
  450. _helpVector3.x = scaleX >= 0.0f ? scaleX : -scaleX;
  451. _helpVector3.y = scaleY >= 0.0f ? scaleY : -scaleY;
  452. _helpVector3.z = 1.0f;
  453. transform.localScale = _helpVector3;
  454. }
  455. }
  456. }
  457. }