Files
YachtDice/Assets/Plugins/AllIn13DShader/Editor/Tools/GradientCreatorTool.cs
T
2026-02-23 22:01:07 +07:00

150 lines
4.2 KiB
C#

using System.IO;
using UnityEditor;
using UnityEngine;
namespace AllIn13DShader
{
public class GradientCreatorTool
{
public const int HEIGHT_GRADIENT = 16;
public Texture2D gradientTex;
public TextureSizes gradientSizes;
public FilterMode gradientFiltering;
public Gradient gradient;
public GradientCreatorTool()
{
gradientSizes = TextureSizes._128;
gradientFiltering = FilterMode.Bilinear;
gradient = new Gradient();
int size = (int)gradientSizes;
gradientTex = new Texture2D(size, size);
}
public Texture2D CreateGradientTexture(TextureSizes gradientSizes, FilterMode gradientFiltering, Gradient gradient)
{
this.gradientSizes = gradientSizes;
this.gradientFiltering = gradientFiltering;
this.gradient = gradient;
return CreateGradientTexture();
}
public Texture2D CreateGradientTexture(Gradient gradient)
{
this.gradientSizes = TextureSizes._256;
this.gradientFiltering = FilterMode.Bilinear;
this.gradient = gradient;
return CreateGradientTexture();
}
public Texture2D CreateGradientTexture()
{
int textureSize = (int)gradientSizes;
this.gradientTex = new Texture2D(textureSize, HEIGHT_GRADIENT, TextureFormat.RGBA32, false);
this.gradientTex.wrapMode = TextureWrapMode.Clamp;
for (int i = 0; i < textureSize; i++)
{
Color col = gradient.Evaluate((float)i / (float)textureSize);
for (int j = 0; j < HEIGHT_GRADIENT; j++)
{
gradientTex.SetPixel(i, j, gradient.Evaluate((float)i / (float)textureSize));
}
}
gradientTex.Apply();
return gradientTex;
}
public Texture SaveGradientTexture(GradientTexture gradientTextureAsset, bool createNewSO)
{
string texName = "RampTexture";
if(gradientTextureAsset != null)
{
texName = gradientTextureAsset.texture.name;
}
string directoryPath = GlobalConfiguration.instance.GradientSavePath;
if (gradientTextureAsset != null && AssetDatabase.IsMainAsset(gradientTextureAsset.texture) && !createNewSO)
{
string assetPath = AssetDatabase.GetAssetPath(gradientTextureAsset.texture);
directoryPath = Path.GetDirectoryName(assetPath);
}
Texture tex = EditorUtils.SaveTextureAsPNG(directoryPath, texName, "Ramp Texture", gradientTex,
FilterMode.Bilinear, TextureImporterType.Default, TextureWrapMode.Clamp, false, createNewSO);
if (createNewSO)
{
GradientTexture gradientTexture = ScriptableObject.CreateInstance<GradientTexture>();
gradientTexture.texture = tex;
gradientTexture.gradient = new Gradient();
CopyGradient(gradient, gradientTexture.gradient);
string gradientTextureAssetPath = Path.Combine(GlobalConfiguration.instance.GradientSavePath, $"GradientAsset_{tex.name}.asset");
gradientTextureAssetPath = AssetDatabase.GenerateUniqueAssetPath(gradientTextureAssetPath);
AssetDatabase.CreateAsset(gradientTexture, gradientTextureAssetPath);
AssetDatabase.Refresh();
}
else
{
gradientTextureAsset.texture = tex;
gradientTextureAsset.gradient = new Gradient();
CopyGradient(gradient, gradientTextureAsset.gradient);
EditorUtility.SetDirty(gradientTextureAsset);
}
return tex;
}
public static void CopyGradient(Gradient from, Gradient to)
{
GradientColorKey[] newColorKeys = new GradientColorKey[from.colorKeys.Length];
GradientAlphaKey[] newAlphaKeys = new GradientAlphaKey[from.alphaKeys.Length];
for (int i = 0; i < from.colorKeys.Length; i++)
{
newColorKeys[i] = from.colorKeys[i];
}
for (int i = 0; i < from.alphaKeys.Length; i++)
{
newAlphaKeys[i] = from.alphaKeys[i];
}
to.colorKeys = newColorKeys;
to.alphaKeys = newAlphaKeys;
to.mode = from.mode;
}
public static GradientTexture FindGradientTexureByTex(Texture selectedTex)
{
GradientTexture res = null;
string[] guids = AssetDatabase.FindAssets("t:GradientTexture");
for (int i = 0; i < guids.Length; i++)
{
string path = AssetDatabase.GUIDToAssetPath(guids[i]);
GradientTexture gradientTexture = AssetDatabase.LoadAssetAtPath<GradientTexture>(path);
if (gradientTexture.name.StartsWith("GradientAsset_"))
{
if (gradientTexture.texture == selectedTex)
{
res = gradientTexture;
break;
}
}
}
return res;
}
}
}