UnityGame/Library/PackageCache/com.unity.shadergraph/Editor/Data/Util/GradientUtil.cs
2024-10-27 10:53:47 +03:00

146 lines
5.4 KiB
C#

using UnityEditor.ShaderGraph.Internal;
using UnityEditor.Graphing;
using UnityEngine;
namespace UnityEditor.ShaderGraph
{
static class GradientUtil
{
public static string GetGradientValue(Gradient gradient, string delimiter = ";")
{
string colorKeys = "";
for (int i = 0; i < 8; i++)
{
if (i < gradient.colorKeys.Length)
colorKeys += $"$precision4({NodeUtils.FloatToShaderValue(gradient.colorKeys[i].color.r)}, " +
$"{NodeUtils.FloatToShaderValue(gradient.colorKeys[i].color.g)}, " +
$"{NodeUtils.FloatToShaderValue(gradient.colorKeys[i].color.b)}, " +
$"{NodeUtils.FloatToShaderValue(gradient.colorKeys[i].time)})";
else
colorKeys += "$precision4(0, 0, 0, 0)";
if (i < 7)
colorKeys += ",";
}
string alphaKeys = "";
for (int i = 0; i < 8; i++)
{
if (i < gradient.alphaKeys.Length)
alphaKeys += $"$precision2({NodeUtils.FloatToShaderValue(gradient.alphaKeys[i].alpha)}, {NodeUtils.FloatToShaderValue(gradient.alphaKeys[i].time)})";
else
alphaKeys += "$precision2(0, 0)";
if (i < 7)
alphaKeys += ",";
}
return $"NewGradient({(int)gradient.mode}, {gradient.colorKeys.Length}, {gradient.alphaKeys.Length}, {colorKeys}, {alphaKeys}){delimiter}";
}
public static string GetGradientForPreview(string name)
{
string colorKeys = "";
for (int i = 0; i < 8; i++)
{
colorKeys += $"{name}_ColorKey{i}";
if (i < 7)
colorKeys += ",";
}
string alphaKeys = "";
for (int i = 0; i < 8; i++)
{
alphaKeys += $"{name}_AlphaKey{i}";
if (i < 7)
alphaKeys += ",";
}
return $"NewGradient({name}_Type, {name}_ColorsLength, {name}_AlphasLength, {colorKeys}, {alphaKeys})";
}
public static void GetGradientPropertiesForPreview(PropertyCollector properties, string name, Gradient value)
{
properties.AddShaderProperty(new Vector1ShaderProperty()
{
overrideReferenceName = $"{name}_Type",
value = (int)value.mode,
generatePropertyBlock = false
});
properties.AddShaderProperty(new Vector1ShaderProperty()
{
overrideReferenceName = $"{name}_ColorsLength",
value = value.colorKeys.Length,
generatePropertyBlock = false
});
properties.AddShaderProperty(new Vector1ShaderProperty()
{
overrideReferenceName = $"{name}_AlphasLength",
value = value.alphaKeys.Length,
generatePropertyBlock = false
});
for (int i = 0; i < 8; i++)
{
properties.AddShaderProperty(new Vector4ShaderProperty()
{
overrideReferenceName = $"{name}_ColorKey{i}",
value = i < value.colorKeys.Length ? GradientUtil.ColorKeyToVector(value.colorKeys[i]) : Vector4.zero,
generatePropertyBlock = false
});
}
for (int i = 0; i < 8; i++)
{
properties.AddShaderProperty(new Vector2ShaderProperty()
{
overrideReferenceName = $"{name}_AlphaKey{i}",
value = i < value.alphaKeys.Length ? GradientUtil.AlphaKeyToVector(value.alphaKeys[i]) : Vector2.zero,
generatePropertyBlock = false
});
}
}
public static bool CheckEquivalency(Gradient A, Gradient B)
{
var currentMode = A.mode;
var currentColorKeys = A.colorKeys;
var currentAlphaKeys = A.alphaKeys;
var newMode = B.mode;
var newColorKeys = B.colorKeys;
var newAlphaKeys = B.alphaKeys;
if (currentMode != newMode || currentColorKeys.Length != newColorKeys.Length || currentAlphaKeys.Length != newAlphaKeys.Length)
{
return false;
}
else
{
for (var i = 0; i < currentColorKeys.Length; i++)
{
if (currentColorKeys[i].color != newColorKeys[i].color || Mathf.Abs(currentColorKeys[i].time - newColorKeys[i].time) > 1e-9)
return false;
}
for (var i = 0; i < currentAlphaKeys.Length; i++)
{
if (Mathf.Abs(currentAlphaKeys[i].alpha - newAlphaKeys[i].alpha) > 1e-9 || Mathf.Abs(currentAlphaKeys[i].time - newAlphaKeys[i].time) > 1e-9)
return false;
}
}
return true;
}
public static Vector4 ColorKeyToVector(GradientColorKey key)
{
return new Vector4(key.color.r, key.color.g, key.color.b, key.time);
}
public static Vector2 AlphaKeyToVector(GradientAlphaKey key)
{
return new Vector2(key.alpha, key.time);
}
}
}