Files
2025-07-19 01:03:02 +02:00

164 lines
5.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace DreadScripts.TextureUtility
{
[System.Serializable]
public class ChannelTexture
{
public string name;
public Texture2D texture;
public bool invert;
public Color defaultColor;
public ColorMode mode = ColorMode.Red;
public enum ColorMode
{
Red,
Green,
Blue,
Alpha
}
public ChannelTexture(string n, int mode)
{
name = n;
SetMode(mode, true);
if (n == "Alpha")
defaultColor = Color.white;
}
public void SetMode(int i, bool ignoreSave = false)
{
switch (i)
{
case 0:
mode = ColorMode.Red;
break;
case 1:
mode = ColorMode.Green;
break;
case 2:
mode = ColorMode.Blue;
break;
case 3:
mode = ColorMode.Alpha;
break;
}
if (!ignoreSave)
{
EditorPrefs.SetInt("TextureUtilityChannel" + name, i);
}
}
public Texture2D GetChannelColors(int width, int height, out float[] colors, bool unloadTempTexture)
{
Texture2D textureToUse;
if (texture)
textureToUse = texture;
else
{
textureToUse = new Texture2D(1, 1, TextureFormat.RGBA32, false, true);
textureToUse.SetPixel(0, 0, defaultColor);
textureToUse.Apply();
}
Texture2D newTexture = TextureUtility.GetColors(textureToUse, width, height, out Color[] myColors, unloadTempTexture);
colors = myColors.Select(c =>
{
switch (mode)
{
case ColorMode.Red:
return c.r;
case ColorMode.Green:
return c.g;
case ColorMode.Blue:
return c.b;
default:
return c.a;
}
}).ToArray();
if (invert)
{
for (int i = 0; i < colors.Length; i++)
{
colors[i] = 1 - colors[i];
}
}
if (!texture && unloadTempTexture)
Object.DestroyImmediate(textureToUse);
return newTexture;
}
public void DrawGUI()
{
GUIStyle buttonGroupStyle = new GUIStyle(GUI.skin.GetStyle("toolbarbutton")) {padding = new RectOffset(1, 1, 1, 1), margin = new RectOffset(0, 0, 1, 1)};
using (new GUILayout.VerticalScope("box"))
{
using (new GUILayout.HorizontalScope())
{
GUILayout.FlexibleSpace();
GUILayout.Label(name, "boldlabel");
GUILayout.FlexibleSpace();
}
using (new GUILayout.HorizontalScope())
{
GUILayout.FlexibleSpace();
bool dummy;
EditorGUI.BeginChangeCheck();
dummy = GUILayout.Toggle(mode == ColorMode.Red, "R", buttonGroupStyle, GUILayout.Width(16));
if (EditorGUI.EndChangeCheck())
if (dummy)
SetMode(0);
EditorGUI.BeginChangeCheck();
dummy = GUILayout.Toggle(mode == ColorMode.Green, "G", buttonGroupStyle, GUILayout.Width(16));
if (EditorGUI.EndChangeCheck())
if (dummy)
SetMode(1);
EditorGUI.BeginChangeCheck();
dummy = GUILayout.Toggle(mode == ColorMode.Blue, "B", buttonGroupStyle, GUILayout.Width(16));
if (EditorGUI.EndChangeCheck())
if (dummy)
SetMode(2);
EditorGUI.BeginChangeCheck();
dummy = GUILayout.Toggle(mode == ColorMode.Alpha, "A", buttonGroupStyle, GUILayout.Width(16));
if (EditorGUI.EndChangeCheck())
if (dummy)
SetMode(3);
GUILayout.FlexibleSpace();
}
using (new GUILayout.HorizontalScope())
{
GUILayout.FlexibleSpace();
Rect myTextureRect = GUILayoutUtility.GetRect(66, 66);
Rect myColorRect = new Rect(myTextureRect) {x = myTextureRect.x + 1, y = myTextureRect.y + 45, width = 20, height = 20};
if (!texture)
defaultColor = EditorGUI.ColorField(myColorRect, GUIContent.none, defaultColor, false, false, false);
texture = (Texture2D) EditorGUI.ObjectField(myTextureRect, texture, typeof(Texture2D), false);
if (!texture)
defaultColor = EditorGUI.ColorField(myColorRect, GUIContent.none, defaultColor, false, false, false);
GUILayout.FlexibleSpace();
}
invert = GUILayout.Toggle(invert, "Invert", "toolbarbutton");
}
}
}
}