浏览代码

Make maste node preview a separate window

/main
Jens Holm 7 年前
当前提交
9b1d3da9
共有 5 个文件被更改,包括 180 次插入23 次删除
  1. 20
      MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Inspector/GraphInspectorView.cs
  2. 5
      MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Views/GraphEditorView.cs
  3. 54
      MaterialGraphProject/Assets/UnityShaderEditor/Editor/Resources/Styles/MaterialGraph.uss
  4. 113
      MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Inspector/MasterNodeView.cs
  5. 11
      MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Inspector/MasterNodeView.cs.meta

20
MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Inspector/GraphInspectorView.cs


}
Add(topContainer);
var bottomContainer = new VisualElement {name = "bottom"};
{
m_PreviewTextureView = new PreviewTextureView { name = "preview", image = Texture2D.blackTexture };
m_PreviewTextureView.AddManipulator(new Draggable(OnMouseDrag, true));
bottomContainer.Add(m_PreviewTextureView);
m_PreviewScrollPosition = new Vector2(0f, 0f);
m_PreviewMeshPicker = new ObjectField { objectType = typeof(Mesh) };
m_PreviewMeshPicker.OnValueChanged(OnPreviewMeshChanged);
bottomContainer.Add(m_PreviewMeshPicker);
}
Add(bottomContainer);
m_PreviewRenderHandle = previewManager.masterRenderData;
m_PreviewRenderHandle.onPreviewChanged += OnPreviewChanged;
m_PreviewMeshPicker.SetValueAndNotify(m_Graph.previewData.serializedMesh.mesh);
foreach (var property in m_Graph.properties)
m_PropertyItems.Add(new ShaderPropertyView(m_Graph, property));

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


{
MaterialGraphView m_GraphView;
GraphInspectorView m_GraphInspectorView;
MasterNodeView m_MasterNodeView;
AbstractMaterialGraph m_Graph;
PreviewManager m_PreviewManager;

m_GraphInspectorView.AddManipulator(new Draggable(OnMouseDrag, true));
m_GraphView.RegisterCallback<PostLayoutEvent>(OnPostLayout);
m_GraphInspectorView.RegisterCallback<PostLayoutEvent>(OnPostLayout);
m_MasterNodeView = new MasterNodeView(assetName, previewManager, graph) { name = "masterNodePreview" };
m_GraphView.Add(m_MasterNodeView);
m_GraphView.graphViewChanged = GraphViewChanged;
}

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


position-type: absolute;
position-right: 0;
position-top: 0;
width: 600;
height: 800;
width: 400;
}
GraphInspectorView * {

GraphInspectorView > #top > #properties > #items {
padding-bottom: 4;
}
MasterNodeView {
flex-direction: column;
position-type: absolute;
position-right: 0;
position-bottom: 0;
background-color: rgb(79, 79, 79);
justify-content: flex-start;
}
MasterNodeView > #top {
background-color: rgb(64, 64, 64);
}
MasterNodeView > #top > #title {
font-style: bold;
font-size: 11;
}
MasterNodeView > #top {
padding-top: 8;
padding-bottom: 8;
padding-left: 8;
padding-right: 8;
}
MasterNodeView > #middle {
flex-grow: 1;
flex-direction: row;
margin-bottom: 40;
}
MasterNodeView > #middle > #preview {
flex-grow: 1;
}
MasterNodeView > #bottom {
background-color: rgb(79, 79, 79);
position-type: absolute;
position-bottom: 0;
position-left: 0;
position-right: 0;
padding-left: 10;
padding-right: 10;
padding-top: 8;
padding-bottom: 12;
}
MasterNodeView > #bottom > #picker > ObjectFieldDisplay > Label {
font-size: 11;
}
#resizeBorderFrame > .resize {

113
MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Inspector/MasterNodeView.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.Experimental.UIElements;
using UnityEngine.Experimental.UIElements;
using UnityEditor.Graphing;
namespace UnityEditor.ShaderGraph.Drawing.Inspector
{
public class MasterNodeView : VisualElement
{
AbstractMaterialGraph m_Graph;
PreviewRenderData m_PreviewRenderHandle;
PreviewTextureView m_PreviewTextureView;
Vector2 m_PreviewScrollPosition;
ObjectField m_PreviewMeshPicker;
MasterNode m_MasterNode;
public MasterNodeView(string assetName, PreviewManager previewManager, AbstractMaterialGraph graph)
{
m_Graph = graph;
AddStyleSheetPath("Styles/MaterialGraph");
m_PreviewRenderHandle = previewManager.masterRenderData;
m_PreviewRenderHandle.onPreviewChanged += OnPreviewChanged;
this.AddManipulator(new Draggable(OnMouseDrag, true));
var topContainer = new VisualElement() { name = "top" };
{
var title = new Label(assetName + " master node preview") { name = "title" };
topContainer.Add(title);
}
Add(topContainer);
var middleContainer = new VisualElement {name = "middle"};
{
m_PreviewTextureView = new PreviewTextureView { name = "preview", image = Texture2D.blackTexture };
m_PreviewTextureView.AddManipulator(new Draggable(OnMouseDragPreviwMesh, true));
middleContainer.Add(m_PreviewTextureView);
m_PreviewScrollPosition = new Vector2(0f, 0f);
middleContainer.Add(m_PreviewTextureView);
}
Add(middleContainer);
var bottomContainer = new VisualElement() { name = "bottom" };
{
m_PreviewMeshPicker = new ObjectField { name = "picker", objectType = typeof(Mesh) };
m_PreviewMeshPicker.OnValueChanged(OnPreviewMeshChanged);
bottomContainer.Add(m_PreviewMeshPicker);
}
Add(bottomContainer);
Add(new ResizeBorderFrame(this) { name = "resizeBorderFrame"});
}
MasterNode masterNode
{
get { return m_PreviewRenderHandle.shaderData.node as MasterNode; }
}
void OnPreviewChanged()
{
m_PreviewTextureView.image = m_PreviewRenderHandle.texture ?? Texture2D.blackTexture;
m_PreviewTextureView.Dirty(ChangeType.Repaint);
}
void OnPreviewMeshChanged(ChangeEvent<Object> changeEvent)
{
Mesh changedMesh = changeEvent.newValue as Mesh;
masterNode.Dirty(ModificationScope.Node);
if (m_Graph.previewData.serializedMesh.mesh != changedMesh)
{
m_Graph.previewData.rotation = Quaternion.identity;
}
m_Graph.previewData.serializedMesh.mesh = changedMesh;
}
void OnMouseDragPreviwMesh(Vector2 deltaMouse)
{
Vector2 previewSize = m_PreviewTextureView.contentRect.size;
m_PreviewScrollPosition -= deltaMouse * (Event.current.shift ? 3f : 1f) / Mathf.Min(previewSize.x, previewSize.y) * 140f;
m_PreviewScrollPosition.y = Mathf.Clamp(m_PreviewScrollPosition.y, -90f, 90f);
Quaternion previewRotation = Quaternion.Euler(m_PreviewScrollPosition.y, 0, 0) * Quaternion.Euler(0, m_PreviewScrollPosition.x, 0);
m_Graph.previewData.rotation = previewRotation;
masterNode.Dirty(ModificationScope.Node);
}
void OnMouseDrag(Vector2 mouseDelta)
{
Vector2 normalizedDelta = mouseDelta / 2f;
Rect inspectorWindowRect = layout;
inspectorWindowRect.x += normalizedDelta.x;
inspectorWindowRect.y += normalizedDelta.y;
layout = inspectorWindowRect;
}
}
}

11
MaterialGraphProject/Assets/UnityShaderEditor/Editor/Drawing/Inspector/MasterNodeView.cs.meta


fileFormatVersion: 2
guid: 546947d46a85b284a971a3f056495735
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
正在加载...
取消
保存