您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
128 行
4.2 KiB
128 行
4.2 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor.Graphing.Drawing;
|
|
using UnityEditor.Graphing.Util;
|
|
using UnityEngine;
|
|
using UnityEngine.Graphing;
|
|
using UnityEngine.MaterialGraph;
|
|
|
|
namespace UnityEditor.MaterialGraph.Drawing
|
|
{
|
|
public abstract class AbstractMaterialGraphInspector : AbstractGraphInspector
|
|
{
|
|
private bool m_RequiresTime;
|
|
|
|
protected GUIContent m_Title = new GUIContent();
|
|
|
|
private NodePreviewPresenter m_NodePreviewPresenter;
|
|
|
|
private AbstractMaterialNode m_PreviewNode;
|
|
|
|
protected AbstractMaterialNode previewNode
|
|
{
|
|
get { return m_PreviewNode; }
|
|
set
|
|
{
|
|
if (value == m_PreviewNode)
|
|
return;
|
|
// ReSharper disable once DelegateSubtraction
|
|
// This is only an issue when subtracting a list of callbacks
|
|
// (which will subtract that specific subset, i.e. `{A B C} - {A B} = {C}`, but `{A B C} - {A C} -> {A B C}`)
|
|
ForEachChild(m_PreviewNode, (node) => node.onModified -= OnPreviewNodeModified);
|
|
m_PreviewNode = value;
|
|
m_NodePreviewPresenter.Initialize(value);
|
|
m_Title.text = m_PreviewNode.name;
|
|
m_RequiresTime = false;
|
|
ForEachChild(m_PreviewNode,
|
|
(node) =>
|
|
{
|
|
node.onModified += OnPreviewNodeModified;
|
|
m_RequiresTime |= node is IRequiresTime;
|
|
});
|
|
}
|
|
}
|
|
|
|
protected AbstractMaterialGraphInspector() : base(typeMappings)
|
|
{
|
|
}
|
|
|
|
private static IEnumerable<TypeMapping> typeMappings
|
|
{
|
|
get
|
|
{
|
|
yield return new TypeMapping(typeof(AbstractSurfaceMasterNode), typeof(SurfaceMasterNodeInspector));
|
|
yield return new TypeMapping(typeof(SubGraphInputNode), typeof(SubgraphInputNodeInspector));
|
|
yield return new TypeMapping(typeof(SubGraphOutputNode), typeof(SubgraphOutputNodeInspector));
|
|
}
|
|
}
|
|
|
|
private void OnPreviewNodeModified(INode node, ModificationScope scope)
|
|
{
|
|
m_NodePreviewPresenter.modificationScope = scope;
|
|
Repaint();
|
|
}
|
|
|
|
public override void OnEnable()
|
|
{
|
|
m_NodePreviewPresenter = CreateInstance<NodePreviewPresenter>();
|
|
base.OnEnable();
|
|
previewNode = null;
|
|
}
|
|
|
|
public override bool HasPreviewGUI()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override void OnPreviewGUI(Rect r, GUIStyle background)
|
|
{
|
|
if (Event.current.type == EventType.Repaint)
|
|
{
|
|
if (m_PreviewNode != null)
|
|
{
|
|
var size = Mathf.Min(r.width, r.height);
|
|
var image = m_NodePreviewPresenter.Render(new Vector2(size, size));
|
|
GUI.DrawTexture(r, image, ScaleMode.ScaleToFit);
|
|
m_NodePreviewPresenter.modificationScope = ModificationScope.Node;
|
|
}
|
|
else
|
|
{
|
|
EditorGUI.DropShadowLabel(r, "No node pinned");
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void OnPreviewSettings()
|
|
{
|
|
GUI.enabled = selectedNodes.Count() <= 1 && selectedNodes.FirstOrDefault() != previewNode;
|
|
if (GUILayout.Button("Pin selected", "preButton"))
|
|
previewNode = selectedNodes.FirstOrDefault() as AbstractMaterialNode;
|
|
GUI.enabled = true;
|
|
}
|
|
|
|
public override bool RequiresConstantRepaint()
|
|
{
|
|
return m_RequiresTime;
|
|
}
|
|
|
|
public override GUIContent GetPreviewTitle()
|
|
{
|
|
return m_Title;
|
|
}
|
|
|
|
private void ForEachChild(INode node, Action<INode> action)
|
|
{
|
|
if (node == null)
|
|
return;
|
|
using (var childNodes = ListPool<INode>.GetDisposable())
|
|
{
|
|
NodeUtils.DepthFirstCollectNodesFromNode(childNodes.value, node);
|
|
foreach (var childNode in childNodes.value)
|
|
{
|
|
action(childNode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|