using System; using System.Collections.Generic; using UnityEngine; using Object = UnityEngine.Object; namespace UnityEditor.U2D.Sprites { [RequireSpriteDataProvider(typeof(ISpritePhysicsOutlineDataProvider), typeof(ITextureDataProvider))] internal class SpritePhysicsShapeModule : SpriteOutlineModule { private const float kDefaultPhysicsTessellationDetail = 0.25f; private const byte kDefaultPhysicsAlphaTolerance = 200; public SpritePhysicsShapeModule(ISpriteEditor sem, IEventSystem ege, IUndoSystem us, IAssetDatabase ad, IGUIUtility gu, IShapeEditorFactory sef, ITexture2D outlineTexture) : base(sem, ege, us, ad, gu, sef, outlineTexture) { spriteEditorWindow = sem; } public override string moduleName { get { return "Custom Physics Shape"; } } private ISpriteEditor spriteEditorWindow { get; set; } protected override string alterateLabelText => L10n.Tr("From Outline"); protected override List GetAlternateOutlines(GUID spriteID) { var alternateOutlineProvider = spriteEditorWindow.GetDataProvider(); return alternateOutlineProvider.GetOutlines(spriteID); } public override bool ApplyRevert(bool apply) { if (m_Outline != null) { if (apply) { var dp = spriteEditorWindow.GetDataProvider(); for (int i = 0; i < m_Outline.Count; ++i) { dp.SetOutlines(m_Outline[i].spriteID, m_Outline[i].ToListVector()); dp.SetTessellationDetail(m_Outline[i].spriteID, m_Outline[i].tessellationDetail); } } Object.DestroyImmediate(m_Outline); m_Outline = null; } return true; } protected override int alphaTolerance { get => SpriteOutlineModulePreference.physicsAlphaTolerance; set => SpriteOutlineModulePreference.physicsAlphaTolerance = value; } protected override void LoadOutline() { m_Outline = ScriptableObject.CreateInstance(); m_Outline.hideFlags = HideFlags.HideAndDontSave; var spriteDataProvider = spriteEditorWindow.GetDataProvider(); var outlineDataProvider = spriteEditorWindow.GetDataProvider(); foreach (var rect in spriteDataProvider.GetSpriteRects()) { var outlines = outlineDataProvider.GetOutlines(rect.spriteID); m_Outline.AddListVector2(rect.spriteID, outlines); m_Outline[m_Outline.Count - 1].tessellationDetail = outlineDataProvider.GetTessellationDetail(rect.spriteID); } } protected override void SetupShapeEditorOutline(SpriteRect spriteRect) { var physicsShape = m_Outline[spriteRect.spriteID]; var physicsShapes = GenerateSpriteRectOutline(spriteRect.rect, Math.Abs(physicsShape.tessellationDetail - (-1f)) < Mathf.Epsilon ? kDefaultPhysicsTessellationDetail : physicsShape.tessellationDetail, kDefaultPhysicsAlphaTolerance, m_TextureDataProvider, m_SpriteOutlineToolElement.optimizeOutline); m_Outline[spriteRect.spriteID].spriteOutlines = physicsShapes; spriteEditorWindow.SetDataModified(); } } }