Matt Dean
7 年前
当前提交
4503a2ce
共有 3 个文件被更改,包括 202 次插入 和 2 次删除
-
4MaterialGraphProject/Assets/UnityShaderEditor/Editor/Data/Nodes/Channel/FlipNode.cs
-
189MaterialGraphProject/Assets/UnityShaderEditor/Editor/Data/Nodes/Artistic/Adjustment/InvertColorsNode.cs
-
11MaterialGraphProject/Assets/UnityShaderEditor/Editor/Data/Nodes/Artistic/Adjustment/InvertColorsNode.cs.meta
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using UnityEditor.Graphing; |
|||
using UnityEditor.ShaderGraph.Drawing.Controls; |
|||
using UnityEngine; |
|||
|
|||
namespace UnityEditor.ShaderGraph |
|||
{ |
|||
[Title("Artistic", "Adjustment", "Invert Colors")] |
|||
public class InvertColorsNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction |
|||
{ |
|||
public InvertColorsNode() |
|||
{ |
|||
name = "Invert Colors"; |
|||
UpdateNodeAfterDeserialization(); |
|||
} |
|||
|
|||
const int InputSlotId = 0; |
|||
const int OutputSlotId = 1; |
|||
const string kInputSlotName = "In"; |
|||
const string kOutputSlotName = "Out"; |
|||
|
|||
public override bool hasPreview |
|||
{ |
|||
get { return true; } |
|||
} |
|||
|
|||
string GetFunctionName() |
|||
{ |
|||
return "Unity_InvertColors_" + NodeUtils.ConvertConcreteSlotValueTypeToString(precision, FindOutputSlot<MaterialSlot>(OutputSlotId).concreteValueType); |
|||
} |
|||
|
|||
public sealed override void UpdateNodeAfterDeserialization() |
|||
{ |
|||
AddSlot(new DynamicVectorMaterialSlot(InputSlotId, kInputSlotName, kInputSlotName, SlotType.Input, Vector4.zero)); |
|||
AddSlot(new DynamicVectorMaterialSlot(OutputSlotId, kOutputSlotName, kOutputSlotName, SlotType.Output, Vector4.zero)); |
|||
RemoveSlotsNameNotMatching(new[] { InputSlotId, OutputSlotId }); |
|||
} |
|||
|
|||
int channelCount { get { return SlotValueHelper.GetChannelCount(FindSlot<MaterialSlot>(InputSlotId).concreteValueType); } } |
|||
|
|||
[SerializeField] |
|||
private bool m_RedChannel; |
|||
|
|||
[ToggleControl("Red")] |
|||
public Toggle redChannel |
|||
{ |
|||
get { return new Toggle(m_RedChannel, channelCount > 0); } |
|||
set |
|||
{ |
|||
if (m_RedChannel == value.isOn) |
|||
return; |
|||
m_RedChannel = value.isOn; |
|||
Dirty(ModificationScope.Node); |
|||
} |
|||
} |
|||
|
|||
[SerializeField] |
|||
private bool m_GreenChannel; |
|||
|
|||
[ToggleControl("Green")] |
|||
public Toggle greenChannel |
|||
{ |
|||
get { return new Toggle(m_GreenChannel, channelCount > 1); } |
|||
set |
|||
{ |
|||
if (m_GreenChannel == value.isOn) |
|||
return; |
|||
m_GreenChannel = value.isOn; |
|||
Dirty(ModificationScope.Node); |
|||
} |
|||
} |
|||
|
|||
[SerializeField] |
|||
private bool m_BlueChannel; |
|||
|
|||
[ToggleControl("Blue")] |
|||
public Toggle blueChannel |
|||
{ |
|||
get { return new Toggle(m_BlueChannel, channelCount > 2); } |
|||
set |
|||
{ |
|||
if (m_BlueChannel == value.isOn) |
|||
return; |
|||
m_BlueChannel = value.isOn; |
|||
Dirty(ModificationScope.Node); |
|||
} |
|||
} |
|||
|
|||
private bool m_AlphaChannel; |
|||
|
|||
[ToggleControl("Alpha")] |
|||
public Toggle alphaChannel |
|||
{ |
|||
get { return new Toggle(m_AlphaChannel, channelCount > 3); } |
|||
set |
|||
{ |
|||
if (m_AlphaChannel == value.isOn) |
|||
return; |
|||
m_AlphaChannel = value.isOn; |
|||
Dirty(ModificationScope.Node); |
|||
} |
|||
} |
|||
|
|||
public void GenerateNodeCode(ShaderGenerator visitor, GenerationMode generationMode) |
|||
{ |
|||
var sb = new ShaderStringBuilder(); |
|||
|
|||
var inputValue = GetSlotValue(InputSlotId, generationMode); |
|||
var outputValue = GetSlotValue(OutputSlotId, generationMode); |
|||
sb.AppendLine("{0} {1};", FindOutputSlot<MaterialSlot>(OutputSlotId).concreteValueType.ToString(precision), GetVariableNameForSlot(OutputSlotId)); |
|||
|
|||
if (!generationMode.IsPreview()) |
|||
{ |
|||
sb.AppendLine("{0} _{1}_InvertColors = {0} ({2}", |
|||
FindOutputSlot<MaterialSlot>(OutputSlotId).concreteValueType.ToString(precision), |
|||
GetVariableNameForNode(), |
|||
Convert.ToInt32(m_RedChannel)); |
|||
if (channelCount > 1) |
|||
sb.Append(", {0}", Convert.ToInt32(m_GreenChannel)); |
|||
if (channelCount > 2) |
|||
sb.Append(", {0}", Convert.ToInt32(m_BlueChannel)); |
|||
if (channelCount > 3) |
|||
sb.Append(", {0}", Convert.ToInt32(m_AlphaChannel)); |
|||
sb.Append(");"); |
|||
} |
|||
|
|||
sb.AppendLine("{0}({1}, _{2}_InvertColors, {3});", GetFunctionName(), inputValue, GetVariableNameForNode(), outputValue); |
|||
|
|||
visitor.AddShaderChunk(sb.ToString(), false); |
|||
} |
|||
|
|||
public override void CollectPreviewMaterialProperties(List<PreviewProperty> properties) |
|||
{ |
|||
base.CollectPreviewMaterialProperties(properties); |
|||
|
|||
properties.Add(new PreviewProperty(PropertyType.Vector4) |
|||
{ |
|||
name = string.Format("_{0}_InvertColors", GetVariableNameForNode()), |
|||
vector4Value = new Vector4(Convert.ToInt32(m_RedChannel), Convert.ToInt32(m_GreenChannel), Convert.ToInt32(m_BlueChannel), Convert.ToInt32(m_AlphaChannel)), |
|||
}); |
|||
} |
|||
|
|||
public override void CollectShaderProperties(PropertyCollector properties, GenerationMode generationMode) |
|||
{ |
|||
if (!generationMode.IsPreview()) |
|||
return; |
|||
|
|||
base.CollectShaderProperties(properties, generationMode); |
|||
|
|||
properties.AddShaderProperty(new Vector4ShaderProperty |
|||
{ |
|||
overrideReferenceName = string.Format("_{0}_InvertColors", GetVariableNameForNode()), |
|||
generatePropertyBlock = false |
|||
}); |
|||
} |
|||
|
|||
public void GenerateNodeFunction(ShaderGenerator visitor, GenerationMode generationMode) |
|||
{ |
|||
var sb = new ShaderStringBuilder(); |
|||
sb.AppendLine("void {0}({1} In, {2} InvertColors, out {3} Out)", |
|||
GetFunctionName(), |
|||
FindInputSlot<MaterialSlot>(InputSlotId).concreteValueType.ToString(precision), |
|||
FindInputSlot<MaterialSlot>(InputSlotId).concreteValueType.ToString(precision), |
|||
FindOutputSlot<MaterialSlot>(OutputSlotId).concreteValueType.ToString(precision)); |
|||
using (sb.BlockScope()) |
|||
{ |
|||
sb.AppendLine("Out = abs(InvertColors - In);"); |
|||
} |
|||
visitor.AddShaderChunk(sb.ToString(), true); |
|||
} |
|||
|
|||
public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode) |
|||
{ |
|||
registry.ProvideFunction(GetFunctionName(), s => |
|||
{ |
|||
s.AppendLine("void {0}({1} In, {2} InvertColors, out {3} Out)", |
|||
GetFunctionName(), |
|||
FindInputSlot<MaterialSlot>(InputSlotId).concreteValueType.ToString(precision), |
|||
FindInputSlot<MaterialSlot>(InputSlotId).concreteValueType.ToString(precision), |
|||
FindOutputSlot<MaterialSlot>(OutputSlotId).concreteValueType.ToString(precision)); |
|||
using (s.BlockScope()) |
|||
{ |
|||
s.AppendLine("Out = abs(InvertColors - In);"); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 3e16bd8daac9e4e42861472225b22405 |
|||
MonoImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
撰写
预览
正在加载...
取消
保存
Reference in new issue