浏览代码

When creating nodes by dropping edge, reposition the node after creating it such that the edge stays at the same position

/main
Peter Bay Bastian 7 年前
当前提交
eed09312
共有 4 个文件被更改,包括 59 次插入2 次删除
  1. 11
      MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/SearchWindowProvider.cs
  2. 37
      MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Views/GraphEditorView.cs
  3. 6
      MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Views/ShaderPort.cs
  4. 7
      MaterialGraphProject/Assets/UnityShaderEditor/Editor/Resources/Styles/MaterialGraph.uss

11
MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/SearchWindowProvider.cs


GraphView m_GraphView;
Texture2D m_Icon;
public Port connectedPort { get; set; }
public bool nodeNeedsRepositioning { get; set; }
public SlotReference targetSlotReference { get; private set; }
public Vector2 targetPosition { get; private set; }
public void Initialize(EditorWindow editorWindow, AbstractMaterialGraph graph, GraphView graphView)
{

var node = nodeEntry.node;
var drawState = node.drawState;
var windowMousePosition = context.screenMousePosition - m_EditorWindow.position.position;
var graphMousePosition = m_EditorWindow.GetRootVisualContainer().ChangeCoordinatesTo(m_GraphView.contentViewContainer, windowMousePosition);
var windowMousePosition = m_EditorWindow.GetRootVisualContainer().ChangeCoordinatesTo(m_EditorWindow.GetRootVisualContainer().parent, context.screenMousePosition - m_EditorWindow.position.position);
var graphMousePosition = m_GraphView.contentViewContainer.WorldToLocal(windowMousePosition);
drawState.position = new Rect(graphMousePosition, Vector2.zero);
node.drawState = drawState;

var fromReference = connectedSlot.isOutputSlot ? connectedSlotReference : compatibleSlotReference;
var toReference = connectedSlot.isOutputSlot ? compatibleSlotReference : connectedSlotReference;
m_Graph.Connect(fromReference, toReference);
nodeNeedsRepositioning = true;
targetSlotReference = compatibleSlotReference;
targetPosition = graphMousePosition;
}
return true;

37
MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Views/GraphEditorView.cs


nodeView.Initialize(node as AbstractMaterialNode, m_PreviewManager, m_EdgeConnectorListener);
node.onModified += OnNodeChanged;
nodeView.Dirty(ChangeType.Repaint);
if (m_SearchWindowProvider.nodeNeedsRepositioning && m_SearchWindowProvider.targetSlotReference.nodeGuid.Equals(node.guid))
{
m_SearchWindowProvider.nodeNeedsRepositioning = false;
foreach (var element in nodeView.inputContainer.Union(nodeView.outputContainer))
{
var port = element as ShaderPort;
if (port == null)
continue;
var slot = (MaterialSlot)port.userData;
if (slot.slotReference.Equals(m_SearchWindowProvider.targetSlotReference))
{
port.RegisterCallback<PostLayoutEvent>(RepositionNode);
return;
}
}
}
}
static void RepositionNode(PostLayoutEvent evt)
{
var port = evt.target as ShaderPort;
if (port == null)
return;
port.UnregisterCallback<PostLayoutEvent>(RepositionNode);
var nodeView = port.node as MaterialNodeView;
if (nodeView == null)
return;
var offset = port.connectorBox.parent.ChangeCoordinatesTo(nodeView.mainContainer, port.connectorBox.layout.center);
var position = nodeView.GetPosition();
position.position -= offset;
nodeView.SetPosition(position);
var drawState = nodeView.node.drawState;
drawState.position = nodeView.layout;
nodeView.node.drawState = drawState;
nodeView.Dirty(ChangeType.Repaint);
port.Dirty(ChangeType.Repaint);
}
Edge AddEdge(IEdge edge)

6
MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Views/ShaderPort.cs


using System;
using UnityEditor.Experimental.UIElements.GraphView;
using UnityEngine;
using UnityEngine.Experimental.UIElements;
namespace UnityEditor.ShaderGraph.Drawing

};
port.AddManipulator(port.m_EdgeConnector);
return port;
}
public VisualElement connectorBox
{
get { return m_ConnectorBox; }
}
}
}

7
MaterialGraphProject/Assets/UnityShaderEditor/Editor/Resources/Styles/MaterialGraph.uss


background-color: rgb(20, 21, 21);
}
MaterialNodeView.graphElement.node.MaterialNode {
margin-top: 0;
margin-bottom: 0;
margin-left: 0;
margin-right: 0;
}
MaterialNodeView #previewContainer,
MaterialNodeView #controls {
background-color: rgba(63, 63, 63, 0.8);

正在加载...
取消
保存