A game about forced loneliness, made by TACStudios
at master 187 lines 7.0 kB view raw
1using System; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityObject = UnityEngine.Object; 5 6namespace UnityEditor.U2D.Sprites 7{ 8 internal partial class SpriteFrameModule : SpriteFrameModuleBase, ISpriteEditorDataProvider, ITextureDataProvider 9 { 10 void CleanUpDataDataProviderOverride() 11 { 12 m_OriginalSpriteDataProvider = null; 13 m_OriginalTextureDataProvider = null; 14 m_SourceOverrideCallback = null; 15 m_MainTexture = null; 16 m_PreviewTexture = null; 17 m_ReadableTexture = null; 18 } 19 20 #region ISpriteEditor implementation override for SpriteEditorMode support 21 public override void SetPreviewTexture(Texture2D texture, int width, int height) 22 { 23 var targetObject = spriteEditor?.GetDataProvider<ISpriteEditorDataProvider>()?.targetObject; 24 if(targetObject != null && targetObject == m_OriginalSpriteDataProvider?.targetObject) 25 base.SetPreviewTexture(texture, width, height); 26 } 27 #endregion 28 29 #region ISpriteEditorDataProvider implementation 30 ISpriteEditorDataProvider m_OriginalSpriteDataProvider; 31 32 ISpriteEditorDataProvider originalSpriteEditorDataProvider 33 { 34 get 35 { 36 if (m_OriginalSpriteDataProvider == null) 37 { 38 m_OriginalSpriteDataProvider = spriteEditor.GetDataProvider<ISpriteEditorDataProvider>(); 39 m_OriginalSpriteDataProvider.InitSpriteEditorDataProvider(); 40 } 41 return m_OriginalSpriteDataProvider; 42 } 43 } 44 event Action<ISpriteEditorDataProvider> m_OnSpriteEditorDataChangeCallback = _ => { }; 45 public SpriteImportMode spriteImportMode => originalSpriteEditorDataProvider.spriteImportMode; 46 public float pixelsPerUnit => originalSpriteEditorDataProvider.pixelsPerUnit; 47 public UnityObject targetObject => originalSpriteEditorDataProvider.targetObject; 48 49 public SpriteRect[] GetSpriteRects() 50 { 51 if (m_RectsCache == null) 52 return originalSpriteEditorDataProvider.GetSpriteRects(); 53 54 return m_RectsCache.GetSpriteRects().ToArray(); 55 } 56 57 public void SetSpriteRects(SpriteRect[] spriteRects) 58 { 59 m_RectsCache.SetSpriteRects(spriteRects); 60 spriteEditor.spriteRects = new List<SpriteRect>(spriteRects); 61 NotifyOnSpriteRectChanged(); 62 } 63 64 public void Apply() 65 { 66 originalSpriteEditorDataProvider.Apply(); 67 } 68 69 public void InitSpriteEditorDataProvider() 70 { } 71 72 public override T GetDataProvider<T>() where T : class 73 { 74 if(typeof(T) == typeof(ISpriteEditorDataProvider)) 75 return this as T; 76 else if (typeof(T) == typeof(ITextureDataProvider)) 77 return this as T; 78 return spriteEditor.GetDataProvider<T>(); 79 } 80 81 public bool HasDataProvider(Type type) 82 { 83 return originalSpriteEditorDataProvider.HasDataProvider(type); 84 } 85 86 public void RegisterDataChangeCallback(Action<ISpriteEditorDataProvider> action) 87 { 88 m_OnSpriteEditorDataChangeCallback+= action; 89 } 90 91 public void UnregisterDataChangeCallback(Action<ISpriteEditorDataProvider> action) 92 { 93 m_OnSpriteEditorDataChangeCallback-= action; 94 } 95 96 protected override void NotifyOnSpriteRectChanged() 97 { 98 PopulateSpriteFrameInspectorField(); 99 m_OnSpriteEditorDataChangeCallback.Invoke(this); 100 } 101 #endregion 102 103 #region ITextureDataProvider implementation 104 105 ITextureDataProvider m_OriginalTextureDataProvider; 106 107 ITextureDataProvider originalTextureDataProvider 108 { 109 get 110 { 111 if (m_OriginalTextureDataProvider == null) 112 { 113 m_OriginalTextureDataProvider = spriteEditor.GetDataProvider<ITextureDataProvider>(); 114 } 115 return m_OriginalTextureDataProvider; 116 } 117 } 118 119 Texture2D m_MainTexture; 120 Texture2D m_PreviewTexture; 121 Texture2D m_ReadableTexture; 122 int m_OverrideSourceTextureWidth; 123 int m_OverrideSourceTextureHeight; 124 event Action<ITextureDataProvider> m_OnTextureDataChangeCallback = _ => { }; 125 Action<string> m_SourceOverrideCallback; 126 public Texture2D texture => m_MainTexture ?? originalTextureDataProvider.texture; 127 public Texture2D previewTexture => m_PreviewTexture ?? originalTextureDataProvider.previewTexture; 128 public void GetTextureActualWidthAndHeight(out int width, out int height) 129 { 130 if(m_MainTexture != null) 131 { 132 width = m_OverrideSourceTextureWidth; 133 height = m_OverrideSourceTextureHeight; 134 } 135 else 136 originalTextureDataProvider.GetTextureActualWidthAndHeight(out width, out height); 137 } 138 139 public Texture2D GetReadableTexture2D() 140 { 141 if (m_MainTexture != null && m_ReadableTexture == null) 142 { 143 m_ReadableTexture = UnityEditor.SpriteUtility.CreateTemporaryDuplicate(m_MainTexture, m_MainTexture.width, m_MainTexture.height); 144 if (m_ReadableTexture != null) 145 m_ReadableTexture.filterMode = m_MainTexture.filterMode; 146 } 147 return m_ReadableTexture ?? originalTextureDataProvider?.GetReadableTexture2D(); 148 } 149 150 public bool OverrideTextures(Texture2D mainTexture, Texture2D previewTexture, int width, int height) 151 { 152 m_MainTexture = mainTexture; 153 m_PreviewTexture = previewTexture; 154 m_ReadableTexture = null; 155 m_OverrideSourceTextureWidth = width; 156 m_OverrideSourceTextureHeight = height; 157 m_OnTextureDataChangeCallback.Invoke(this); 158 return true; 159 } 160 161 /// <summary> 162 /// Registers a callback to override the source texture. 163 /// </summary> 164 /// <param name="action">Callback that will write to the source texture with the path of the source texture.</param> 165 public void RegisterSourceTextureOverride(Action<string> action) 166 { 167 m_SourceOverrideCallback = action; 168 } 169 170 public void UnregisterSourceTextureOverride(Action<string> action) 171 { 172 if (m_SourceOverrideCallback == action) 173 m_SourceOverrideCallback = null; 174 } 175 176 public void RegisterDataChangeCallback(Action<ITextureDataProvider> action) 177 { 178 m_OnTextureDataChangeCallback += action; 179 } 180 181 public void UnregisterDataChangeCallback(Action<ITextureDataProvider> action) 182 { 183 m_OnTextureDataChangeCallback -= action; 184 } 185 #endregion 186 } 187}