CopyTool.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEditor.U2D.Layout;
  6. using UnityEngine.U2D;
  7. namespace UnityEditor.U2D.Animation
  8. {
  9. internal interface ICopyToolStringStore
  10. {
  11. string stringStore
  12. {
  13. get;
  14. set;
  15. }
  16. }
  17. internal class SystemCopyBufferStringStore : ICopyToolStringStore
  18. {
  19. public string stringStore
  20. {
  21. get { return EditorGUIUtility.systemCopyBuffer; }
  22. set { EditorGUIUtility.systemCopyBuffer = value; }
  23. }
  24. }
  25. internal class CopyTool : MeshToolWrapper
  26. {
  27. public class NewBonesStore
  28. {
  29. public BoneCache[] newBones;
  30. public Dictionary<string, string> newBoneNameDict;
  31. public NewBonesStore()
  32. {
  33. newBones = null;
  34. newBoneNameDict = new Dictionary<string, string>();
  35. }
  36. public void MapAllExistingBones()
  37. {
  38. foreach (var bone in newBones)
  39. newBoneNameDict.Add(bone.name, bone.name);
  40. }
  41. }
  42. private ICopyToolStringStore m_CopyToolStringStore;
  43. private CopyToolView m_CopyToolView;
  44. public float pixelsPerUnit
  45. {
  46. private get;
  47. set;
  48. }
  49. public ICopyToolStringStore copyToolStringStore
  50. {
  51. set { m_CopyToolStringStore = value; }
  52. }
  53. internal override void OnCreate()
  54. {
  55. m_CopyToolView = new CopyToolView();
  56. m_CopyToolView.onPasteActivated += OnPasteActivated;
  57. m_CopyToolStringStore = new SystemCopyBufferStringStore();
  58. disableMeshEditor = true;
  59. }
  60. public override void Initialize(LayoutOverlay layout)
  61. {
  62. m_CopyToolView.Initialize(layout);
  63. }
  64. protected override void OnActivate()
  65. {
  66. base.OnActivate();
  67. m_CopyToolView.Show();
  68. }
  69. protected override void OnDeactivate()
  70. {
  71. base.OnDeactivate();
  72. m_CopyToolView.Hide();
  73. }
  74. private void CopyMeshFromSpriteCache(SpriteCache sprite, SkinningCopySpriteData skinningSpriteData)
  75. {
  76. if (meshTool == null)
  77. return;
  78. meshTool.SetupSprite(sprite);
  79. skinningSpriteData.vertices = meshTool.mesh.vertices;
  80. skinningSpriteData.indices = meshTool.mesh.indices;
  81. skinningSpriteData.edges = meshTool.mesh.edges;
  82. skinningSpriteData.boneWeightNames = new List<string>();
  83. foreach (var bone in meshTool.mesh.bones)
  84. {
  85. skinningSpriteData.boneWeightNames.Add(bone.name);
  86. }
  87. }
  88. public void OnCopyActivated()
  89. {
  90. SkinningCopyData skinningCopyData;
  91. var selectedSprite = skinningCache.selectedSprite;
  92. if (selectedSprite == null)
  93. {
  94. skinningCopyData = CopyAll();
  95. }
  96. else
  97. {
  98. skinningCopyData = CopySingle(selectedSprite);
  99. }
  100. if (skinningCopyData != null)
  101. m_CopyToolStringStore.stringStore = SkinningCopyUtility.SerializeSkinningCopyDataToString(skinningCopyData);
  102. skinningCache.events.copy.Invoke();
  103. }
  104. public SkinningCopyData CopyAll()
  105. {
  106. var skinningCopyData = new SkinningCopyData();
  107. skinningCopyData.pixelsPerUnit = pixelsPerUnit;
  108. var sprites = skinningCache.GetSprites();
  109. foreach (var sprite in sprites)
  110. {
  111. var skinningSpriteData = new SkinningCopySpriteData();
  112. skinningSpriteData.spriteName = sprite.name;
  113. var skeleton = skinningCache.GetEffectiveSkeleton(sprite);
  114. if (skeleton != null && skeleton.BoneCount > 0)
  115. {
  116. if (skinningCache.hasCharacter)
  117. {
  118. // Order doesn't matter for character bones
  119. skinningSpriteData.spriteBones = skeleton.bones.ToSpriteBone(Matrix4x4.identity).Select(x => new SpriteBoneCopyData()
  120. {
  121. spriteBone = x,
  122. order = -1
  123. }).ToList();
  124. }
  125. else
  126. {
  127. skinningSpriteData.spriteBones = new List<SpriteBoneCopyData>();
  128. var bones = skeleton.bones.FindRoots();
  129. foreach (var bone in bones)
  130. GetSpriteBoneDataRecursively(skinningSpriteData.spriteBones, bone, skeleton.bones.ToList());
  131. }
  132. }
  133. if (meshTool != null)
  134. {
  135. CopyMeshFromSpriteCache(sprite, skinningSpriteData);
  136. }
  137. skinningCopyData.copyData.Add(skinningSpriteData);
  138. }
  139. if (meshTool != null)
  140. {
  141. meshTool.SetupSprite(null);
  142. }
  143. return skinningCopyData;
  144. }
  145. public SkinningCopyData CopySingle(SpriteCache sprite)
  146. {
  147. var skinningCopyData = new SkinningCopyData();
  148. skinningCopyData.pixelsPerUnit = pixelsPerUnit;
  149. // Mesh
  150. var skinningSpriteData = new SkinningCopySpriteData();
  151. skinningCopyData.copyData.Add(skinningSpriteData);
  152. CopyMeshFromSpriteCache(sprite, skinningSpriteData);
  153. // Bones
  154. var rootBones = new List<BoneCache>();
  155. BoneCache[] boneCache = null;
  156. if (skinningCache.hasCharacter)
  157. {
  158. var characterPart = skinningCache.GetCharacterPart(sprite);
  159. if (characterPart != null && characterPart.bones != null)
  160. {
  161. boneCache = characterPart.bones;
  162. var bones = characterPart.bones.FindRoots();
  163. foreach (var bone in bones)
  164. rootBones.Add(bone);
  165. }
  166. }
  167. else
  168. {
  169. var skeleton = skinningCache.GetEffectiveSkeleton(sprite);
  170. if (skeleton != null && skeleton.BoneCount > 0)
  171. {
  172. boneCache = skeleton.bones;
  173. var bones = boneCache.FindRoots();
  174. foreach (var bone in bones)
  175. rootBones.Add(bone);
  176. }
  177. }
  178. if (rootBones.Count > 0)
  179. {
  180. skinningSpriteData.spriteBones = new List<SpriteBoneCopyData>();
  181. foreach (var rootBone in rootBones)
  182. {
  183. var rootBoneIndex = skinningSpriteData.spriteBones.Count;
  184. GetSpriteBoneDataRecursively(skinningSpriteData.spriteBones, rootBone, boneCache.ToList());
  185. if (skinningCache.hasCharacter)
  186. {
  187. // Offset the bones based on the currently selected Sprite in Character mode
  188. var characterPart = sprite.GetCharacterPart();
  189. if (characterPart != null)
  190. {
  191. var offset = characterPart.position;
  192. var rootSpriteBone = skinningSpriteData.spriteBones[rootBoneIndex];
  193. rootSpriteBone.spriteBone.position = rootSpriteBone.spriteBone.position - offset;
  194. skinningSpriteData.spriteBones[rootBoneIndex] = rootSpriteBone;
  195. }
  196. }
  197. }
  198. }
  199. return skinningCopyData;
  200. }
  201. private void GetSpriteBoneDataRecursively(List<SpriteBoneCopyData> bones, BoneCache rootBone, List<BoneCache> boneCache)
  202. {
  203. AppendSpriteBoneDataRecursively(bones, rootBone, -1, boneCache);
  204. }
  205. private void AppendSpriteBoneDataRecursively(List<SpriteBoneCopyData> spriteBones, BoneCache bone, int parentIndex, List<BoneCache> boneCache)
  206. {
  207. int currentParentIndex = spriteBones.Count;
  208. var boneCopyData = new SpriteBoneCopyData()
  209. {
  210. spriteBone = new SpriteBone()
  211. {
  212. name = bone.name,
  213. parentId = parentIndex
  214. },
  215. order = boneCache.FindIndex(x => x == bone)
  216. };
  217. if (boneCopyData.order < 0)
  218. {
  219. boneCopyData.order = boneCache.Count;
  220. boneCache.Add(bone);
  221. }
  222. if (parentIndex == -1 && bone.parentBone != null)
  223. {
  224. boneCopyData.spriteBone.position = bone.position;
  225. boneCopyData.spriteBone.rotation = bone.rotation;
  226. }
  227. else
  228. {
  229. boneCopyData.spriteBone.position = bone.localPosition;
  230. boneCopyData.spriteBone.rotation = bone.localRotation;
  231. }
  232. boneCopyData.spriteBone.position = new Vector3(boneCopyData.spriteBone.position.x, boneCopyData.spriteBone.position.y, bone.depth);
  233. boneCopyData.spriteBone.length = bone.localLength;
  234. spriteBones.Add(boneCopyData);
  235. foreach (var child in bone)
  236. {
  237. var childBone = child as BoneCache;
  238. if (childBone != null)
  239. AppendSpriteBoneDataRecursively(spriteBones, childBone, currentParentIndex, boneCache);
  240. }
  241. }
  242. public void OnPasteActivated(bool bone, bool mesh, bool flipX, bool flipY)
  243. {
  244. var copyBuffer = m_CopyToolStringStore.stringStore;
  245. if (!SkinningCopyUtility.CanDeserializeStringToSkinningCopyData(copyBuffer))
  246. {
  247. Debug.LogError(TextContent.copyError1);
  248. return;
  249. }
  250. var skinningCopyData = SkinningCopyUtility.DeserializeStringToSkinningCopyData(copyBuffer);
  251. if (skinningCopyData == null || skinningCopyData.copyData.Count == 0)
  252. {
  253. Debug.LogError(TextContent.copyError2);
  254. return;
  255. }
  256. var scale = 1f;
  257. if (skinningCopyData.pixelsPerUnit > 0f)
  258. scale = pixelsPerUnit / skinningCopyData.pixelsPerUnit;
  259. var sprites = skinningCache.GetSprites();
  260. var copyMultiple = skinningCopyData.copyData.Count > 1;
  261. if (copyMultiple && skinningCopyData.copyData.Count != sprites.Length && mesh)
  262. {
  263. Debug.LogError(String.Format(TextContent.copyError3, sprites.Length, skinningCopyData.copyData.Count));
  264. return;
  265. }
  266. using (skinningCache.UndoScope(TextContent.pasteData))
  267. {
  268. NewBonesStore newBonesStore = null;
  269. if (bone && copyMultiple && skinningCache.hasCharacter)
  270. {
  271. newBonesStore = new NewBonesStore();
  272. var skinningSpriteData = skinningCopyData.copyData[0];
  273. newBonesStore.newBones = skinningCache.CreateBoneCacheFromSpriteBones(skinningSpriteData.spriteBones.Select(y => y.spriteBone).ToArray(), scale);
  274. if (flipX || flipY)
  275. {
  276. var characterRect = new Rect(Vector2.zero, skinningCache.character.dimension);
  277. var newPositions = new Vector3[newBonesStore.newBones.Length];
  278. var newRotations = new Quaternion[newBonesStore.newBones.Length];
  279. for (var i = 0; i < newBonesStore.newBones.Length; ++i)
  280. {
  281. newPositions[i] = GetFlippedBonePosition(newBonesStore.newBones[i], Vector2.zero, characterRect, flipX, flipY);
  282. newRotations[i] = GetFlippedBoneRotation(newBonesStore.newBones[i], flipX, flipY);
  283. }
  284. for (var i = 0; i < newBonesStore.newBones.Length; ++i)
  285. {
  286. newBonesStore.newBones[i].position = newPositions[i];
  287. newBonesStore.newBones[i].rotation = newRotations[i];
  288. }
  289. }
  290. newBonesStore.MapAllExistingBones();
  291. var skeleton = skinningCache.character.skeleton;
  292. skeleton.SetBones(newBonesStore.newBones);
  293. skinningCache.events.skeletonTopologyChanged.Invoke(skeleton);
  294. }
  295. foreach (var skinningSpriteData in skinningCopyData.copyData)
  296. {
  297. SpriteCache sprite = null;
  298. if (!String.IsNullOrEmpty(skinningSpriteData.spriteName))
  299. {
  300. sprite = sprites.FirstOrDefault(x => x.name == skinningSpriteData.spriteName);
  301. }
  302. if (sprite == null && (skinningCopyData.copyData.Count == 1 || String.IsNullOrEmpty(skinningSpriteData.spriteName)))
  303. {
  304. sprite = skinningCache.selectedSprite;
  305. }
  306. if (sprite == null)
  307. continue;
  308. if (bone && (!skinningCache.hasCharacter || !copyMultiple))
  309. {
  310. var spriteBones = new SpriteBone[skinningSpriteData.spriteBones.Count];
  311. for (int i = 0; i < skinningSpriteData.spriteBones.Count; ++i)
  312. {
  313. var order = skinningSpriteData.spriteBones[i].order;
  314. spriteBones[order] = skinningSpriteData.spriteBones[i].spriteBone;
  315. var parentId = spriteBones[order].parentId;
  316. if (parentId >= 0)
  317. {
  318. spriteBones[order].parentId = skinningSpriteData.spriteBones[parentId].order;
  319. }
  320. }
  321. newBonesStore = PasteSkeletonBones(sprite, spriteBones.ToList(), flipX, flipY, scale);
  322. }
  323. if (mesh && meshTool != null)
  324. {
  325. PasteMesh(sprite, skinningSpriteData, flipX, flipY, scale, newBonesStore);
  326. }
  327. }
  328. if (newBonesStore != null && newBonesStore.newBones != null)
  329. {
  330. skinningCache.skeletonSelection.elements = newBonesStore.newBones;
  331. skinningCache.events.boneSelectionChanged.Invoke();
  332. }
  333. }
  334. skinningCache.events.paste.Invoke(bone, mesh, flipX, flipY);
  335. }
  336. private Vector3 GetFlippedBonePosition(BoneCache bone, Vector2 startPosition, Rect spriteRect
  337. , bool flipX, bool flipY)
  338. {
  339. Vector3 position = startPosition;
  340. if (flipX)
  341. {
  342. position.x += spriteRect.width - bone.position.x;
  343. }
  344. else
  345. {
  346. position.x += bone.position.x;
  347. }
  348. if (flipY)
  349. {
  350. position.y += spriteRect.height - bone.position.y;
  351. }
  352. else
  353. {
  354. position.y += bone.position.y;
  355. }
  356. position.z = bone.position.z;
  357. return position;
  358. }
  359. private Quaternion GetFlippedBoneRotation(BoneCache bone, bool flipX, bool flipY)
  360. {
  361. var euler = bone.rotation.eulerAngles;
  362. if (flipX)
  363. {
  364. if (euler.z <= 180)
  365. {
  366. euler.z = 180 - euler.z;
  367. }
  368. else
  369. {
  370. euler.z = 540 - euler.z;
  371. }
  372. }
  373. if (flipY)
  374. {
  375. euler.z = 360 - euler.z;
  376. }
  377. return Quaternion.Euler(euler);
  378. }
  379. void SetBonePositionAndRotation(BoneCache[] boneCache, TransformCache bone, Vector3[] position, Quaternion[] rotation)
  380. {
  381. var index = Array.FindIndex(boneCache, x => x == bone);
  382. if (index >= 0)
  383. {
  384. bone.position = position[index];
  385. bone.rotation = rotation[index];
  386. }
  387. foreach (var child in bone.children)
  388. {
  389. SetBonePositionAndRotation(boneCache, child, position, rotation);
  390. }
  391. }
  392. public NewBonesStore PasteSkeletonBones(SpriteCache sprite, List<SpriteBone> spriteBones, bool flipX, bool flipY, float scale = 1.0f)
  393. {
  394. NewBonesStore newBonesStore = new NewBonesStore();
  395. newBonesStore.newBones = skinningCache.CreateBoneCacheFromSpriteBones(spriteBones.ToArray(), scale);
  396. if (newBonesStore.newBones.Length == 0)
  397. return null;
  398. if (sprite == null || (skinningCache.mode == SkinningMode.SpriteSheet && skinningCache.hasCharacter))
  399. return null;
  400. var spriteRect = sprite.textureRect;
  401. var skeleton = skinningCache.GetEffectiveSkeleton(sprite);
  402. var rectPosition = spriteRect.position;
  403. if (skinningCache.mode == SkinningMode.Character)
  404. {
  405. var characterPart = sprite.GetCharacterPart();
  406. if (characterPart == null)
  407. return null;
  408. rectPosition = characterPart.position;
  409. }
  410. var newPositions = new Vector3[newBonesStore.newBones.Length];
  411. var newRotations = new Quaternion[newBonesStore.newBones.Length];
  412. for (var i = 0; i < newBonesStore.newBones.Length; ++i)
  413. {
  414. newPositions[i] = GetFlippedBonePosition(newBonesStore.newBones[i], rectPosition, spriteRect, flipX, flipY);
  415. newRotations[i] = GetFlippedBoneRotation(newBonesStore.newBones[i], flipX, flipY);
  416. }
  417. for (var i = 0; i < newBonesStore.newBones.Length; ++i)
  418. {
  419. if(newBonesStore.newBones[i].parent == null)
  420. SetBonePositionAndRotation(newBonesStore.newBones, newBonesStore.newBones[i], newPositions, newRotations);
  421. }
  422. if (skinningCache.mode == SkinningMode.SpriteSheet)
  423. {
  424. newBonesStore.MapAllExistingBones();
  425. skeleton.SetBones(newBonesStore.newBones);
  426. }
  427. else
  428. {
  429. var existingBoneNames = skeleton.bones.Select(x => x.name).ToList();
  430. skeleton.AddBones(newBonesStore.newBones);
  431. var bones = skeleton.bones;
  432. // Update names of all newly pasted bones
  433. foreach (var bone in newBonesStore.newBones)
  434. {
  435. if (existingBoneNames.Contains(bone.name))
  436. {
  437. var oldBoneName = bone.name;
  438. bone.name = SkeletonController.AutoBoneName(bone.parentBone, bones);
  439. existingBoneNames.Add(bone.name);
  440. newBonesStore.newBoneNameDict.Add(oldBoneName, bone.name);
  441. }
  442. else
  443. {
  444. newBonesStore.newBoneNameDict.Add(bone.name, bone.name);
  445. }
  446. }
  447. skeleton.SetDefaultPose();
  448. }
  449. skinningCache.events.skeletonTopologyChanged.Invoke(skeleton);
  450. return newBonesStore;
  451. }
  452. public void PasteMesh(SpriteCache sprite, SkinningCopySpriteData skinningSpriteData, bool flipX, bool flipY, float scale, NewBonesStore newBonesStore)
  453. {
  454. if (sprite == null)
  455. return;
  456. meshTool.SetupSprite(sprite);
  457. meshTool.mesh.vertices = skinningSpriteData.vertices;
  458. if (!Mathf.Approximately(scale, 1f) || flipX || flipY)
  459. {
  460. var spriteRect = sprite.textureRect;
  461. foreach (var vertex in meshTool.mesh.vertices)
  462. {
  463. var position = vertex.position;
  464. if (!Mathf.Approximately(scale, 1f))
  465. position = position * scale;
  466. if (flipX)
  467. position.x = spriteRect.width - vertex.position.x;
  468. if (flipY)
  469. position.y = spriteRect.height - vertex.position.y;
  470. vertex.position = position;
  471. }
  472. }
  473. meshTool.mesh.indices = skinningSpriteData.indices;
  474. meshTool.mesh.edges = skinningSpriteData.edges;
  475. int[] copyBoneToNewBones = new int[skinningSpriteData.boneWeightNames.Count];
  476. BoneCache[] setBones = null;
  477. if (newBonesStore != null && newBonesStore.newBones != null)
  478. {
  479. // Update bone weights with new bone indices
  480. var setBonesList = new List<BoneCache>();
  481. copyBoneToNewBones = new int[skinningSpriteData.boneWeightNames.Count];
  482. int index = 0;
  483. for (int i = 0; i < skinningSpriteData.boneWeightNames.Count; ++i)
  484. {
  485. string oldBoneName = skinningSpriteData.boneWeightNames[i];
  486. string newBoneName;
  487. newBonesStore.newBoneNameDict.TryGetValue(oldBoneName, out newBoneName);
  488. var newBone = newBonesStore.newBones.FirstOrDefault(bone => bone.name == newBoneName);
  489. copyBoneToNewBones[i] = -1;
  490. if (newBone == null)
  491. continue;
  492. for (int j = 0; j < skinningSpriteData.spriteBones.Count; ++j)
  493. {
  494. if (skinningSpriteData.spriteBones[j].spriteBone.name == oldBoneName)
  495. {
  496. copyBoneToNewBones[i] = index++;
  497. setBonesList.Add(newBone);
  498. break;
  499. }
  500. }
  501. }
  502. setBones = setBonesList.ToArray();
  503. }
  504. else
  505. {
  506. // Attempt to link weights based on existing bone names
  507. var skeleton = skinningCache.GetEffectiveSkeleton(sprite);
  508. var characterBones = new List<BoneCache>();
  509. for (int i = 0; i < skinningSpriteData.boneWeightNames.Count; ++i)
  510. {
  511. copyBoneToNewBones[i] = -1;
  512. var boneName = skinningSpriteData.boneWeightNames[i];
  513. for (int j = 0; j < skeleton.bones.Length; ++j)
  514. {
  515. if (skeleton.bones[j].name == boneName)
  516. {
  517. copyBoneToNewBones[i] = characterBones.Count;
  518. characterBones.Add(skeleton.bones[j]);
  519. break;
  520. }
  521. }
  522. }
  523. setBones = characterBones.ToArray();
  524. }
  525. // Remap new bone indexes from copied bone indexes
  526. foreach (var vertex in meshTool.mesh.vertices)
  527. {
  528. var editableBoneWeight = vertex.editableBoneWeight;
  529. for (var i = 0; i < editableBoneWeight.Count; ++i)
  530. {
  531. if (!editableBoneWeight[i].enabled)
  532. continue;
  533. if (copyBoneToNewBones.Length > editableBoneWeight[i].boneIndex)
  534. {
  535. var boneIndex = copyBoneToNewBones[editableBoneWeight[i].boneIndex];
  536. if (boneIndex != -1)
  537. editableBoneWeight[i].boneIndex = boneIndex;
  538. }
  539. }
  540. }
  541. // Update associated bones for mesh
  542. meshTool.mesh.SetCompatibleBoneSet(setBones);
  543. meshTool.mesh.bones = setBones; // Fixes weights for bones that do not exist
  544. // Update associated bones for character
  545. if (skinningCache.hasCharacter)
  546. {
  547. var characterPart = sprite.GetCharacterPart();
  548. if (characterPart != null)
  549. {
  550. characterPart.bones = setBones;
  551. skinningCache.events.characterPartChanged.Invoke(characterPart);
  552. }
  553. }
  554. meshTool.UpdateMesh();
  555. }
  556. }
  557. internal class CopyToolView
  558. {
  559. private PastePanel m_PastePanel;
  560. public event Action<bool, bool, bool, bool> onPasteActivated = (bone, mesh, flipX, flipY) => {};
  561. public void Show()
  562. {
  563. m_PastePanel.SetHiddenFromLayout(false);
  564. }
  565. public void Hide()
  566. {
  567. m_PastePanel.SetHiddenFromLayout(true);
  568. }
  569. public void Initialize(LayoutOverlay layoutOverlay)
  570. {
  571. m_PastePanel = PastePanel.GenerateFromUXML();
  572. BindElements();
  573. layoutOverlay.rightOverlay.Add(m_PastePanel);
  574. m_PastePanel.SetHiddenFromLayout(true);
  575. }
  576. void BindElements()
  577. {
  578. m_PastePanel.onPasteActivated += OnPasteActivated;
  579. }
  580. void OnPasteActivated(bool bone, bool mesh, bool flipX, bool flipY)
  581. {
  582. onPasteActivated(bone, mesh, flipX, flipY);
  583. }
  584. }
  585. }