Net-Game/Library/PackageCache/com.unity.2d.sprite@072d7bd355e5/Editor/SpriteEditorModule/SpriteFrameModule/SpriteFameModuleDataProviderOverride.cs
2025-03-28 08:33:16 -04:00

188 lines
6.9 KiB
C#

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<ISpriteEditorDataProvider>()?.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<ISpriteEditorDataProvider>();
m_OriginalSpriteDataProvider.InitSpriteEditorDataProvider();
}
return m_OriginalSpriteDataProvider;
}
}
event Action<ISpriteEditorDataProvider> 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<SpriteRect>(spriteRects);
NotifyOnSpriteRectChanged();
}
public void Apply()
{
originalSpriteEditorDataProvider.Apply();
}
public void InitSpriteEditorDataProvider()
{ }
public override T GetDataProvider<T>() 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<T>();
}
public bool HasDataProvider(Type type)
{
return originalSpriteEditorDataProvider.HasDataProvider(type);
}
public void RegisterDataChangeCallback(Action<ISpriteEditorDataProvider> action)
{
m_OnSpriteEditorDataChangeCallback+= action;
}
public void UnregisterDataChangeCallback(Action<ISpriteEditorDataProvider> 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<ITextureDataProvider>();
}
return m_OriginalTextureDataProvider;
}
}
Texture2D m_MainTexture;
Texture2D m_PreviewTexture;
Texture2D m_ReadableTexture;
int m_OverrideSourceTextureWidth;
int m_OverrideSourceTextureHeight;
event Action<ITextureDataProvider> m_OnTextureDataChangeCallback = _ => { };
Action<string> 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;
}
/// <summary>
/// Registers a callback to override the source texture.
/// </summary>
/// <param name="action">Callback that will write to the source texture with the path of the source texture.</param>
public void RegisterSourceTextureOverride(Action<string> action)
{
m_SourceOverrideCallback = action;
}
public void UnregisterSourceTextureOverride(Action<string> action)
{
if (m_SourceOverrideCallback == action)
m_SourceOverrideCallback = null;
}
public void RegisterDataChangeCallback(Action<ITextureDataProvider> action)
{
m_OnTextureDataChangeCallback += action;
}
public void UnregisterDataChangeCallback(Action<ITextureDataProvider> action)
{
m_OnTextureDataChangeCallback -= action;
}
#endregion
}
}