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

109 行
3.2 KiB

using System.Collections.Generic;
using System.Linq;
using UnityEditor.Graphs;
using UnityEngine;
namespace UnityEditor.MaterialGraph
{
public interface IGenerateGraphProperties
{
void GenerateSharedProperties(PropertyGenerator shaderProperties, ShaderGenerator propertyUsages, GenerationMode generationMode);
IEnumerable<ShaderProperty> GetPropertiesForPropertyType(PropertyType propertyType);
}
public abstract class BaseMaterialGraph : Graph
{
private PreviewRenderUtility m_PreviewUtility;
public PreviewRenderUtility previewUtility
{
get
{
if (m_PreviewUtility == null)
{
m_PreviewUtility = new PreviewRenderUtility();
EditorUtility.SetCameraAnimateMaterials(m_PreviewUtility.m_Camera, true);
}
return m_PreviewUtility;
}
}
public bool requiresRepaint
{
get { return isAwake && nodes.Any(x => x is IRequiresTime); }
}
protected abstract void RecacheActiveNodes();
public override void RemoveEdge(Edge e)
{
base.RemoveEdge(e);
var toNode = e.toSlot.node as BaseMaterialNode;
if (toNode == null)
return;
RecacheActiveNodes();
toNode.RegeneratePreviewShaders();
}
public override Edge Connect(Slot fromSlot, Slot toSlot)
{
var edge = base.Connect(fromSlot, toSlot);
var toNode = toSlot.node as BaseMaterialNode;
var fromNode = fromSlot.node as BaseMaterialNode;
if (fromNode == null || toNode == null)
return edge;
RecacheActiveNodes();
toNode.RegeneratePreviewShaders();
fromNode.CollectChildNodesByExecutionOrder().ToList().ForEach(s => s.UpdatePreviewProperties());
return edge;
}
public override void AddNode(Node node)
{
base.AddNode(node);
AssetDatabase.AddObjectToAsset(node, this);
var bmn = node as BaseMaterialNode;
if (bmn != null && bmn.hasPreview)
bmn.UpdatePreviewMaterial();
}
protected void AddMasterNodeNoAddToAsset(Node node)
{
base.AddNode(node);
}
public void GeneratePreviewShaders()
{
MaterialWindow.DebugMaterialGraph("Generating preview shaders on: " + name);
// 2 passes...
// 1 create the shaders
foreach (var node in nodes)
{
var bmn = node as BaseMaterialNode;
if (bmn != null && bmn.hasPreview)
{
bmn.UpdatePreviewMaterial();
}
}
// 2 set the properties
foreach (var node in nodes)
{
var pNode = node as BaseMaterialNode;
if (pNode != null && pNode.hasPreview)
{
MaterialWindow.DebugMaterialGraph("Updating preview Properties on Node: " + pNode);
pNode.UpdatePreviewProperties();
}
}
}
}
}