您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

102 行
2.9 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace UnityEditor.Graphs.Material
{
[Title("Input/UV Node")]
public class UVNode : BaseMaterialNode, IGeneratesVertexToFragmentBlock, IGeneratesVertexShaderBlock, IGeneratesBodyCode
{
private const string kOutputSlotName = "UV";
public override bool hasPreview { get { return true; } }
[SerializeField]
private ShaderProperty m_BoundProperty;
public override void Init ()
{
base.Init ();
name = "UV";
AddSlot (new Slot (SlotType.OutputSlot, kOutputSlotName));
}
public static void GenerateVertexToFragmentBlock (ShaderGenerator visitor)
{
visitor.AddShaderChunk("half4 meshUV0;", true);
}
public void GenerateVertexToFragmentBlock(ShaderGenerator visitor, GenerationMode generationMode)
{
GenerateVertexToFragmentBlock (visitor);
}
public static void GenerateVertexShaderBlock(ShaderGenerator visitor)
{
visitor.AddShaderChunk("o.meshUV0 = v.texcoord;", true);
}
public void GenerateVertexShaderBlock(ShaderGenerator visitor, GenerationMode generationMode)
{
GenerateVertexShaderBlock(visitor);
}
public void GenerateNodeCode (ShaderGenerator visitor, GenerationMode generationMode)
{
var outputSlot = FindOutputSlot (kOutputSlotName);
string uvValue = "IN.meshUV0";
if (m_BoundProperty != null && m_BoundProperty is TextureProperty)
uvValue = precision + "4 (TRANSFORM_TEX(IN.meshUV0, " + m_BoundProperty.name + "), 0.0, 0.0)";
visitor.AddShaderChunk(precision + "4 " + GetOutputVariableNameForSlot(outputSlot, generationMode) + " = " + uvValue + ";", true);
}
// UI Shizz
public override void NodeUI(GraphGUI host)
{
base.NodeUI(host);
var configuredTextureProperties = new ShaderProperty[0];
if (graph is IGenerateGraphProperties)
configuredTextureProperties = (graph as IGenerateGraphProperties).GetPropertiesForPropertyType(PropertyType.Texture2D).ToArray ();
var names = new List<string> { "none" };
names.AddRange(configuredTextureProperties.Select(x => x.name));
var currentIndex = names.IndexOf(m_BoundProperty == null ? "none" : m_BoundProperty.name);
EditorGUI.BeginChangeCheck();
currentIndex = EditorGUILayout.Popup("Bound Property", currentIndex, names.ToArray());
if (EditorGUI.EndChangeCheck())
{
m_BoundProperty = null;
if (currentIndex > 0)
m_BoundProperty = configuredTextureProperties[currentIndex - 1];
RegeneratePreviewShaders();
}
}
public virtual void RefreshBoundProperty (ShaderProperty toRefresh, bool rebuildShader)
{
if (m_BoundProperty != null && m_BoundProperty == toRefresh)
{
if (rebuildShader)
RegeneratePreviewShaders();
else
UpdatePreviewProperties();
}
}
public void UnbindProperty (ShaderProperty prop)
{
if (m_BoundProperty != null && m_BoundProperty == prop)
{
m_BoundProperty = null;
RegeneratePreviewShaders();
}
}
}
}