No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SpritePhysicsShapeModule.cs 3.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Object = UnityEngine.Object;
  5. namespace UnityEditor.U2D.Sprites
  6. {
  7. [RequireSpriteDataProvider(typeof(ISpritePhysicsOutlineDataProvider), typeof(ITextureDataProvider))]
  8. internal class SpritePhysicsShapeModule : SpriteOutlineModule
  9. {
  10. private const float kDefaultPhysicsTessellationDetail = 0.25f;
  11. private const byte kDefaultPhysicsAlphaTolerance = 200;
  12. public SpritePhysicsShapeModule(ISpriteEditor sem, IEventSystem ege, IUndoSystem us, IAssetDatabase ad, IGUIUtility gu, IShapeEditorFactory sef, ITexture2D outlineTexture)
  13. : base(sem, ege, us, ad, gu, sef, outlineTexture)
  14. {
  15. spriteEditorWindow = sem;
  16. }
  17. public override string moduleName
  18. {
  19. get { return "Custom Physics Shape"; }
  20. }
  21. private ISpriteEditor spriteEditorWindow
  22. {
  23. get; set;
  24. }
  25. protected override string alterateLabelText => L10n.Tr("From Outline");
  26. protected override List<Vector2[]> GetAlternateOutlines(GUID spriteID)
  27. {
  28. var alternateOutlineProvider = spriteEditorWindow.GetDataProvider<ISpriteOutlineDataProvider>();
  29. return alternateOutlineProvider.GetOutlines(spriteID);
  30. }
  31. public override bool ApplyRevert(bool apply)
  32. {
  33. if (m_Outline != null)
  34. {
  35. if (apply)
  36. {
  37. var dp = spriteEditorWindow.GetDataProvider<ISpritePhysicsOutlineDataProvider>();
  38. for (int i = 0; i < m_Outline.Count; ++i)
  39. {
  40. dp.SetOutlines(m_Outline[i].spriteID, m_Outline[i].ToListVector());
  41. dp.SetTessellationDetail(m_Outline[i].spriteID, m_Outline[i].tessellationDetail);
  42. }
  43. }
  44. Object.DestroyImmediate(m_Outline);
  45. m_Outline = null;
  46. }
  47. return true;
  48. }
  49. protected override int alphaTolerance
  50. {
  51. get => SpriteOutlineModulePreference.physicsAlphaTolerance;
  52. set => SpriteOutlineModulePreference.physicsAlphaTolerance = value;
  53. }
  54. protected override void LoadOutline()
  55. {
  56. m_Outline = ScriptableObject.CreateInstance<SpriteOutlineModel>();
  57. m_Outline.hideFlags = HideFlags.HideAndDontSave;
  58. var spriteDataProvider = spriteEditorWindow.GetDataProvider<ISpriteEditorDataProvider>();
  59. var outlineDataProvider = spriteEditorWindow.GetDataProvider<ISpritePhysicsOutlineDataProvider>();
  60. foreach (var rect in spriteDataProvider.GetSpriteRects())
  61. {
  62. var outlines = outlineDataProvider.GetOutlines(rect.spriteID);
  63. m_Outline.AddListVector2(rect.spriteID, outlines);
  64. m_Outline[m_Outline.Count - 1].tessellationDetail = outlineDataProvider.GetTessellationDetail(rect.spriteID);
  65. }
  66. }
  67. protected override void SetupShapeEditorOutline(SpriteRect spriteRect)
  68. {
  69. var physicsShape = m_Outline[spriteRect.spriteID];
  70. var physicsShapes = GenerateSpriteRectOutline(spriteRect.rect,
  71. Math.Abs(physicsShape.tessellationDetail - (-1f)) < Mathf.Epsilon ? kDefaultPhysicsTessellationDetail : physicsShape.tessellationDetail,
  72. kDefaultPhysicsAlphaTolerance, m_TextureDataProvider, m_SpriteOutlineToolElement.optimizeOutline);
  73. m_Outline[spriteRect.spriteID].spriteOutlines = physicsShapes;
  74. spriteEditorWindow.SetDataModified();
  75. }
  76. }
  77. }