143 lines
5.2 KiB
C#
143 lines
5.2 KiB
C#
using System;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace HeurekaGames
|
|
{
|
|
public class Heureka_EditorData : ScriptableObject
|
|
{
|
|
public delegate void EditorDataRefreshDelegate();
|
|
public static event EditorDataRefreshDelegate OnEditorDataRefresh;
|
|
|
|
private static Heureka_EditorData m_instance;
|
|
public static Heureka_EditorData Instance
|
|
{
|
|
get
|
|
{
|
|
if (!m_instance)
|
|
{
|
|
m_instance = loadData();
|
|
}
|
|
|
|
return m_instance;
|
|
}
|
|
}
|
|
|
|
private static Heureka_EditorData loadData()
|
|
{
|
|
//LOGO ON WINDOW
|
|
string[] configData = AssetDatabase.FindAssets("EditorData t:" + typeof(Heureka_EditorData).ToString(), null);
|
|
if (configData.Length >= 1)
|
|
{
|
|
return AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(configData[0]), typeof(Heureka_EditorData)) as Heureka_EditorData;
|
|
}
|
|
|
|
Debug.LogError("Failed to find config data");
|
|
return null;
|
|
}
|
|
|
|
internal void RefreshData()
|
|
{
|
|
if (OnEditorDataRefresh != null)
|
|
OnEditorDataRefresh();
|
|
}
|
|
|
|
public GUIStyle HeadlineStyle;
|
|
}
|
|
|
|
[System.Serializable]
|
|
public class ConfigurableIcon
|
|
{
|
|
[SerializeField] private bool isUsingDarkSkin = false;
|
|
|
|
[SerializeField] string buildInIconName = "";
|
|
[SerializeField] private Texture iconCached = null;
|
|
|
|
[SerializeField] Texture m_iconNormalOverride = null;
|
|
[SerializeField] Texture m_iconProSkinOverride = null;
|
|
|
|
public ConfigurableIcon()
|
|
{
|
|
Heureka_EditorData.OnEditorDataRefresh += onEditorDataRefresh;
|
|
}
|
|
|
|
private void onEditorDataRefresh()
|
|
{
|
|
iconCached = null;
|
|
}
|
|
|
|
public Texture Icon
|
|
{
|
|
get
|
|
{
|
|
//TODO A way to make sure we update, if the user have changed skin
|
|
if (isUsingDarkSkin != EditorGUIUtility.isProSkin)
|
|
{
|
|
iconCached = null;
|
|
isUsingDarkSkin = EditorGUIUtility.isProSkin;
|
|
}
|
|
return (iconCached != null) ? iconCached : (iconCached = GetInvertedForProSkin());
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
bool m_darkSkinInvert = false;
|
|
|
|
protected Texture GetInvertedForProSkin()
|
|
{
|
|
Texture imageToUse = (EditorGUIUtility.isProSkin) ? m_iconProSkinOverride : m_iconNormalOverride;
|
|
|
|
//If we want to use default unity icons and nothing has been setup to override
|
|
if (imageToUse == null && !string.IsNullOrEmpty(buildInIconName))
|
|
if (EditorGUIUtility.IconContent(buildInIconName) != null)
|
|
imageToUse = EditorGUIUtility.IconContent(buildInIconName).image;
|
|
|
|
//Return current image if we dont have proskin, or dont want to invert
|
|
if (!EditorGUIUtility.isProSkin || (EditorGUIUtility.isProSkin && !m_darkSkinInvert))
|
|
return imageToUse;
|
|
|
|
Texture2D readableTexture = getReadableTexture(imageToUse);
|
|
Texture2D inverted = new Texture2D(readableTexture.width, readableTexture.height, TextureFormat.ARGB32, false);
|
|
for (int x = 0; x < readableTexture.width; x++)
|
|
{
|
|
for (int y = 0; y < readableTexture.height; y++)
|
|
{
|
|
Color origColor = readableTexture.GetPixel(x, y);
|
|
Color invertedColor = new Color(1 - origColor.r, 1 - origColor.g, 1 - origColor.b, origColor.a);
|
|
inverted.SetPixel(x, y, (origColor.a > 0) ? invertedColor : origColor);
|
|
}
|
|
}
|
|
inverted.Apply();
|
|
return inverted;
|
|
}
|
|
|
|
private Texture2D getReadableTexture(Texture imageToUse)
|
|
{
|
|
// Create a temporary RenderTexture of the same size as the texture
|
|
RenderTexture tmp = RenderTexture.GetTemporary(
|
|
imageToUse.width,
|
|
imageToUse.height,
|
|
0,
|
|
RenderTextureFormat.Default,
|
|
RenderTextureReadWrite.Linear);
|
|
|
|
// Blit the pixels on texture to the RenderTexture
|
|
Graphics.Blit(imageToUse, tmp);
|
|
// Backup the currently set RenderTexture
|
|
RenderTexture previous = RenderTexture.active;
|
|
// Set the current RenderTexture to the temporary one we created
|
|
RenderTexture.active = tmp;
|
|
// Create a new readable Texture2D to copy the pixels to it
|
|
Texture2D myTexture2D = new Texture2D(imageToUse.width, imageToUse.height);
|
|
// Copy the pixels from the RenderTexture to the new Texture
|
|
myTexture2D.ReadPixels(new Rect(0, 0, tmp.width, tmp.height), 0, 0);
|
|
myTexture2D.Apply();
|
|
// Reset the active RenderTexture
|
|
RenderTexture.active = previous;
|
|
// Release the temporary RenderTexture
|
|
RenderTexture.ReleaseTemporary(tmp);
|
|
|
|
return myTexture2D;
|
|
}
|
|
}
|
|
} |