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