您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
188 行
6.3 KiB
188 行
6.3 KiB
using System;
|
|
using System.Text;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor.ShaderGraph.Drawing.Controls;
|
|
using UnityEngine;
|
|
using UnityEditor.Graphing;
|
|
|
|
namespace UnityEditor.ShaderGraph
|
|
{
|
|
public static class GradientUtils
|
|
{
|
|
public static void GetGradientDeclaration(Gradient gradient, ref ShaderStringBuilder s)
|
|
{
|
|
string[] colors = new string[8];
|
|
for(int i = 0; i < colors.Length; i++)
|
|
colors[i] = string.Format("g.colors[{0}] = float4(0, 0, 0, 0);", i.ToString());
|
|
for(int i = 0; i < gradient.colorKeys.Length; i++)
|
|
colors[i] = GetColorKey(i, gradient.colorKeys[i].color, gradient.colorKeys[i].time);
|
|
|
|
string[] alphas = new string[8];
|
|
for(int i = 0; i < colors.Length; i++)
|
|
alphas[i] = string.Format("g.alphas[{0}] = float2(0, 0);", i.ToString());
|
|
for(int i = 0; i < gradient.alphaKeys.Length; i++)
|
|
alphas[i] = GetAlphaKey(i, gradient.alphaKeys[i].alpha, gradient.alphaKeys[i].time);
|
|
|
|
s.AppendLine("Gradient g;");
|
|
s.AppendLine("g.type = {0};",
|
|
(int)gradient.mode);
|
|
s.AppendLine("g.colorsLength = {0};",
|
|
gradient.colorKeys.Length);
|
|
s.AppendLine("g.alphasLength = {0};",
|
|
gradient.alphaKeys.Length);
|
|
|
|
for(int i = 0; i < colors.Length; i++)
|
|
s.AppendLine(colors[i]);
|
|
|
|
for(int i = 0; i < alphas.Length; i++)
|
|
s.AppendLine(alphas[i]);
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
private static string GetColorKey(int index, Color color, float time)
|
|
{
|
|
return string.Format("g.colors[{0}] = float4({1}, {2}, {3}, {4});", index, color.r, color.g, color.b, time);
|
|
}
|
|
|
|
private static string GetAlphaKey(int index, float alpha, float time)
|
|
{
|
|
return string.Format("g.alphas[{0}] = float2({1}, {2});", index, alpha, time);
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class GradientShaderProperty : AbstractShaderProperty<Gradient>
|
|
{
|
|
public GradientShaderProperty()
|
|
{
|
|
displayName = "Gradient";
|
|
value = new Gradient();
|
|
}
|
|
|
|
private bool m_OverrideMembers = false;
|
|
|
|
private string m_OverrideSlotName;
|
|
|
|
public override PropertyType propertyType
|
|
{
|
|
get { return PropertyType.Gradient; }
|
|
}
|
|
|
|
public override Vector4 defaultValue
|
|
{
|
|
get { return new Vector4(); }
|
|
}
|
|
|
|
public override string GetPropertyBlockString()
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
public void OverrideMembers(string slotName)
|
|
{
|
|
m_OverrideMembers = true;
|
|
m_OverrideSlotName = slotName;
|
|
}
|
|
|
|
public override string GetPropertyDeclarationString(string delimiter = ";")
|
|
{
|
|
if(m_OverrideMembers)
|
|
{
|
|
ShaderStringBuilder s = new ShaderStringBuilder();
|
|
s.AppendLine("Gradient Unity{0} ()",
|
|
referenceName);
|
|
using (s.BlockScope())
|
|
{
|
|
s.AppendLine("Gradient g;");
|
|
s.AppendLine("g.type = {0}_Type;", m_OverrideSlotName);
|
|
s.AppendLine("g.colorsLength = {0}_ColorsLength;", m_OverrideSlotName);
|
|
s.AppendLine("g.alphasLength = {0}_AlphasLength;", m_OverrideSlotName);
|
|
for(int i = 0; i < 8; i++)
|
|
{
|
|
s.AppendLine("g.colors[{0}] = {1}_ColorKey{0};", i, m_OverrideSlotName);
|
|
}
|
|
for(int i = 0; i < 8; i++)
|
|
{
|
|
s.AppendLine("g.alphas[{0}] = {1}_AlphaKey{0};", i, m_OverrideSlotName);
|
|
}
|
|
s.AppendLine("return g;", true);
|
|
}
|
|
return s.ToString();
|
|
}
|
|
else
|
|
{
|
|
ShaderStringBuilder s = new ShaderStringBuilder();
|
|
s.AppendLine("Gradient Unity{0} ()", referenceName);
|
|
using (s.BlockScope())
|
|
{
|
|
GradientUtils.GetGradientDeclaration(value, ref s);
|
|
s.AppendLine("return g;", true);
|
|
}
|
|
return s.ToString();
|
|
}
|
|
}
|
|
|
|
public override PreviewProperty GetPreviewMaterialProperty()
|
|
{
|
|
return new PreviewProperty(PropertyType.Gradient)
|
|
{
|
|
name = referenceName,
|
|
gradientValue = value
|
|
};
|
|
}
|
|
|
|
public override INode ToConcreteNode()
|
|
{
|
|
return new GradientNode { gradient = value };
|
|
}
|
|
|
|
public override IShaderProperty Copy()
|
|
{
|
|
return new GradientShaderProperty
|
|
{
|
|
value = value
|
|
};
|
|
}
|
|
}
|
|
}
|