using System; using System.Collections.Generic; using UnityEngine; using UnityObject = UnityEngine.Object; namespace UnityEditor.U2D.Sprites { internal partial class SpriteFrameModule : SpriteFrameModuleBase, ISpriteEditorDataProvider, ITextureDataProvider { void CleanUpDataDataProviderOverride() { m_OriginalSpriteDataProvider = null; m_OriginalTextureDataProvider = null; m_SourceOverrideCallback = null; m_MainTexture = null; m_PreviewTexture = null; m_ReadableTexture = null; } #region ISpriteEditor implementation override for SpriteEditorMode support public override void SetPreviewTexture(Texture2D texture, int width, int height) { var targetObject = spriteEditor?.GetDataProvider()?.targetObject; if(targetObject != null && targetObject == m_OriginalSpriteDataProvider?.targetObject) base.SetPreviewTexture(texture, width, height); } #endregion #region ISpriteEditorDataProvider implementation ISpriteEditorDataProvider m_OriginalSpriteDataProvider; ISpriteEditorDataProvider originalSpriteEditorDataProvider { get { if (m_OriginalSpriteDataProvider == null) { m_OriginalSpriteDataProvider = spriteEditor.GetDataProvider(); m_OriginalSpriteDataProvider.InitSpriteEditorDataProvider(); } return m_OriginalSpriteDataProvider; } } event Action m_OnSpriteEditorDataChangeCallback = _ => { }; SpriteImportMode ISpriteEditorDataProvider.spriteImportMode => originalSpriteEditorDataProvider.spriteImportMode; public float pixelsPerUnit => originalSpriteEditorDataProvider.pixelsPerUnit; public UnityObject targetObject => originalSpriteEditorDataProvider.targetObject; public SpriteRect[] GetSpriteRects() { if (m_RectsCache == null) return originalSpriteEditorDataProvider.GetSpriteRects(); return m_RectsCache.GetSpriteRects().ToArray(); } public void SetSpriteRects(SpriteRect[] spriteRects) { m_RectsCache.SetSpriteRects(spriteRects); spriteEditor.spriteRects = new List(spriteRects); NotifyOnSpriteRectChanged(); } public void Apply() { originalSpriteEditorDataProvider.Apply(); } public void InitSpriteEditorDataProvider() { } public override T GetDataProvider() where T : class { if(typeof(T) == typeof(ISpriteEditorDataProvider)) return this as T; else if (typeof(T) == typeof(ITextureDataProvider)) return this as T; return spriteEditor.GetDataProvider(); } public bool HasDataProvider(Type type) { return originalSpriteEditorDataProvider.HasDataProvider(type); } public void RegisterDataChangeCallback(Action action) { m_OnSpriteEditorDataChangeCallback+= action; } public void UnregisterDataChangeCallback(Action action) { m_OnSpriteEditorDataChangeCallback-= action; } protected override void NotifyOnSpriteRectChanged() { PopulateSpriteFrameInspectorField(); m_OnSpriteEditorDataChangeCallback.Invoke(this); } #endregion #region ITextureDataProvider implementation ITextureDataProvider m_OriginalTextureDataProvider; ITextureDataProvider originalTextureDataProvider { get { if (m_OriginalTextureDataProvider == null) { m_OriginalTextureDataProvider = spriteEditor.GetDataProvider(); } return m_OriginalTextureDataProvider; } } Texture2D m_MainTexture; Texture2D m_PreviewTexture; Texture2D m_ReadableTexture; int m_OverrideSourceTextureWidth; int m_OverrideSourceTextureHeight; event Action m_OnTextureDataChangeCallback = _ => { }; Action m_SourceOverrideCallback; public Texture2D texture => m_MainTexture ?? originalTextureDataProvider.texture; public Texture2D previewTexture => m_PreviewTexture ?? originalTextureDataProvider.previewTexture; public void GetTextureActualWidthAndHeight(out int width, out int height) { if(m_MainTexture != null) { width = m_OverrideSourceTextureWidth; height = m_OverrideSourceTextureHeight; } else originalTextureDataProvider.GetTextureActualWidthAndHeight(out width, out height); } public Texture2D GetReadableTexture2D() { if (m_MainTexture != null && m_ReadableTexture == null) { m_ReadableTexture = UnityEditor.SpriteUtility.CreateTemporaryDuplicate(m_MainTexture, m_MainTexture.width, m_MainTexture.height); if (m_ReadableTexture != null) m_ReadableTexture.filterMode = m_MainTexture.filterMode; } return m_ReadableTexture ?? originalTextureDataProvider?.GetReadableTexture2D(); } public bool OverrideTextures(Texture2D mainTexture, Texture2D previewTexture, int width, int height) { m_MainTexture = mainTexture; m_PreviewTexture = previewTexture; m_ReadableTexture = null; m_OverrideSourceTextureWidth = width; m_OverrideSourceTextureHeight = height; m_OnTextureDataChangeCallback.Invoke(this); return true; } /// /// Registers a callback to override the source texture. /// /// Callback that will write to the source texture with the path of the source texture. public void RegisterSourceTextureOverride(Action action) { m_SourceOverrideCallback = action; } public void UnregisterSourceTextureOverride(Action action) { if (m_SourceOverrideCallback == action) m_SourceOverrideCallback = null; } public void RegisterDataChangeCallback(Action action) { m_OnTextureDataChangeCallback += action; } public void UnregisterDataChangeCallback(Action action) { m_OnTextureDataChangeCallback -= action; } #endregion } }