Files
2026-02-23 22:01:07 +07:00

131 lines
5.3 KiB
C#

using System.IO;
using UnityEditor;
using UnityEngine;
namespace AllIn13DShader
{
public class RGBAPackerDrawer
{
private const float LABEL_WIDTH = 70f;
private const float TEXTURE_FIELD_WIDTH = 200f;
private const float SPACING_BETWEEN_FIELDS = 20f;
private const float BOOLEAN_LABEL_WIDTH = 100f;
private const float SETTINGS_FIELD_WIDTH = 200f;
private RGBAPackerTool rgbaPackerTool;
public RGBAPackerValues ToolValues => rgbaPackerTool.values;
private CommonStyles commonStyles;
public RGBAPackerDrawer(RGBAPackerTool rgbaPackerTool, CommonStyles commonStyles)
{
this.rgbaPackerTool = rgbaPackerTool;
this.commonStyles = commonStyles;
}
public void Draw()
{
GUILayout.Label("RGBA Channel Packer", commonStyles.bigLabel);
GUILayout.Space(20);
GUILayout.Label("Pack red channels from 4 textures into RGBA channels", EditorStyles.boldLabel);
GUILayout.Space(10);
// Channel texture slots
EditorGUILayout.BeginVertical();
{
EditorGUILayout.BeginHorizontal();
{
GUILayout.Label("R Channel", GUILayout.Width(LABEL_WIDTH));
ToolValues.rChannelTexture = (Texture2D)EditorGUILayout.ObjectField(ToolValues.rChannelTexture, typeof(Texture2D), false, GUILayout.Width(TEXTURE_FIELD_WIDTH));
GUILayout.Space(SPACING_BETWEEN_FIELDS);
GUILayout.Label("Default Is White?", GUILayout.Width(BOOLEAN_LABEL_WIDTH));
ToolValues.rChannelDefaultWhite = EditorGUILayout.Toggle(ToolValues.rChannelDefaultWhite);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
{
GUILayout.Label("G Channel", GUILayout.Width(LABEL_WIDTH));
ToolValues.gChannelTexture = (Texture2D)EditorGUILayout.ObjectField(ToolValues.gChannelTexture, typeof(Texture2D), false, GUILayout.Width(TEXTURE_FIELD_WIDTH));
GUILayout.Space(SPACING_BETWEEN_FIELDS);
GUILayout.Label("Default Is White?", GUILayout.Width(BOOLEAN_LABEL_WIDTH));
ToolValues.gChannelDefaultWhite = EditorGUILayout.Toggle(ToolValues.gChannelDefaultWhite);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
{
GUILayout.Label("B Channel", GUILayout.Width(LABEL_WIDTH));
ToolValues.bChannelTexture = (Texture2D)EditorGUILayout.ObjectField(ToolValues.bChannelTexture, typeof(Texture2D), false, GUILayout.Width(TEXTURE_FIELD_WIDTH));
GUILayout.Space(SPACING_BETWEEN_FIELDS);
GUILayout.Label("Default Is White?", GUILayout.Width(BOOLEAN_LABEL_WIDTH));
ToolValues.bChannelDefaultWhite = EditorGUILayout.Toggle(ToolValues.bChannelDefaultWhite);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
{
GUILayout.Label("A Channel", GUILayout.Width(LABEL_WIDTH));
ToolValues.aChannelTexture = (Texture2D)EditorGUILayout.ObjectField(ToolValues.aChannelTexture, typeof(Texture2D), false, GUILayout.Width(TEXTURE_FIELD_WIDTH));
GUILayout.Space(SPACING_BETWEEN_FIELDS);
GUILayout.Label("Default Is White?", GUILayout.Width(BOOLEAN_LABEL_WIDTH));
ToolValues.aChannelDefaultWhite = EditorGUILayout.Toggle(ToolValues.aChannelDefaultWhite);
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.EndVertical();
GUILayout.Space(15);
// Texture settings
EditorGUILayout.BeginHorizontal();
{
GUILayout.Label("Texture Size:", GUILayout.MaxWidth(100));
ToolValues.textureSizes = (TextureSizes)EditorGUILayout.EnumPopup(ToolValues.textureSizes, GUILayout.MaxWidth(SETTINGS_FIELD_WIDTH));
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
{
GUILayout.Label("Filtering:", GUILayout.MaxWidth(100));
ToolValues.filtering = (FilterMode)EditorGUILayout.EnumPopup(ToolValues.filtering, GUILayout.MaxWidth(SETTINGS_FIELD_WIDTH));
}
EditorGUILayout.EndHorizontal();
GUILayout.Space(10);
// Info about input channels
int channelCount = 0;
if(ToolValues.rChannelTexture != null) channelCount++;
if(ToolValues.gChannelTexture != null) channelCount++;
if(ToolValues.bChannelTexture != null) channelCount++;
if(ToolValues.aChannelTexture != null) channelCount++;
int textureSize = (int)ToolValues.textureSizes;
GUILayout.Label($"Output will be a {textureSize}x{textureSize} RGBA texture with {channelCount}/4 channels assigned", EditorStyles.boldLabel);
if(channelCount == 0)
{
GUILayout.Label("*No input textures assigned - output will use default values", EditorStyles.boldLabel);
}
else if(channelCount < 4)
{
GUILayout.Label($"*{4 - channelCount} channels will use default values (black or white based on toggles)", EditorStyles.boldLabel);
}
GUILayout.Space(20);
GUILayout.Label("Select the folder where RGBA textures will be saved", EditorStyles.boldLabel);
GlobalConfiguration.instance.AtlasesSavePath = EditorUtils.DrawSelectorFolder(GlobalConfiguration.instance.AtlasesSavePath, "RGBA");
if(Directory.Exists(GlobalConfiguration.instance.AtlasesSavePath))
{
if(GUILayout.Button("Create And Save RGBA Texture", GUILayout.MaxWidth(CommonStyles.BUTTON_WIDTH)))
{
rgbaPackerTool.CreateRGBATexture();
EditorUtils.SaveTextureAsPNG(GlobalConfiguration.instance.AtlasesSavePath, "RGBA_Packed", "RGBA Channel Packed Texture", ToolValues.createdRGBATexture, ToolValues.filtering, TextureImporterType.Default, TextureWrapMode.Clamp);
}
}
}
}
}