146 lines
5.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|