您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
155 行
4.2 KiB
155 行
4.2 KiB
using System;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace UnityEditor.Graphs.Material
|
|
{
|
|
public enum PreviewState
|
|
{
|
|
Full = 0,
|
|
Selected = 1,
|
|
Off = 2
|
|
}
|
|
|
|
public class MaterialProperties : ScriptableObject, IGenerateGraphProperties
|
|
{
|
|
private Vector2 m_ScrollPos;
|
|
|
|
[SerializeField]
|
|
List<ShaderProperty> m_ShaderProperties = new List<ShaderProperty> ();
|
|
|
|
[SerializeField]
|
|
public int previewState;
|
|
|
|
//static GUIContent[] previewOptions;
|
|
|
|
public event EventHandler OnChangePreviewState;
|
|
|
|
/*static MaterialProperties ()
|
|
{
|
|
previewOptions = Enum.GetNames (typeof (PreviewState)).Select (x => new GUIContent (x)).ToArray ();
|
|
}*/
|
|
|
|
public void OnEnable ()
|
|
{
|
|
if (OnChangePreviewState != null)
|
|
OnChangePreviewState ((PreviewState)previewState, null);
|
|
}
|
|
|
|
public void DoGUI (List<Node> nodes)
|
|
{
|
|
//m_ScrollPos1 = BeginArea ("Options", m_ScrollPos1);
|
|
|
|
/*GUILayout.BeginHorizontal ();
|
|
GUILayout.Label ("Preview", EditorStyles.largeLabel);
|
|
EditorGUI.BeginChangeCheck ();
|
|
previewState = EditorGUILayout.CycleButton (previewState, previewOptions, EditorStyles.miniButton);
|
|
if (EditorGUI.EndChangeCheck () && OnChangePreviewState != null)
|
|
OnChangePreviewState ((PreviewState)previewState, null);
|
|
GUILayout.EndHorizontal ();*/
|
|
|
|
//EndArea ();
|
|
|
|
m_ScrollPos = BeginArea ("Exposed Properties", m_ScrollPos);
|
|
|
|
if (GUILayout.Button ("Add Property"))
|
|
AddProperty ();
|
|
|
|
var propsToRemove = new List<ShaderProperty> ();
|
|
foreach (var property in m_ShaderProperties)
|
|
{
|
|
// property changed
|
|
bool nameChanged;
|
|
bool valuesChanged;
|
|
property.PropertyOnGUI (out nameChanged, out valuesChanged);
|
|
if (nameChanged || valuesChanged)
|
|
{
|
|
foreach (var node in nodes.Where(x => x is PropertyNode).Cast<PropertyNode>())
|
|
{
|
|
node.RefreshBoundProperty (property, nameChanged);
|
|
}
|
|
foreach (var node in nodes.Where(x => x is UVNode).Cast<UVNode>())
|
|
{
|
|
node.RefreshBoundProperty (property, nameChanged);
|
|
}
|
|
}
|
|
if (GUILayout.Button ("Remove"))
|
|
{
|
|
propsToRemove.Add (property);
|
|
}
|
|
EditorGUILayout.Separator ();
|
|
}
|
|
EndArea ();
|
|
|
|
foreach (var prop in propsToRemove)
|
|
{
|
|
foreach (var node in nodes.Where(x => x is PropertyNode).Cast<PropertyNode>())
|
|
{
|
|
node.UnbindProperty (prop);
|
|
}
|
|
foreach (var node in nodes.Where(x => x is UVNode).Cast<UVNode>())
|
|
{
|
|
node.UnbindProperty (prop);
|
|
}
|
|
|
|
m_ShaderProperties.Remove (prop);
|
|
}
|
|
}
|
|
|
|
private void AddProperty()
|
|
{
|
|
var menu = new GenericMenu ();
|
|
menu.AddItem (new GUIContent ("Texture"), false, CreateProperty<TextureProperty>);
|
|
menu.AddItem (new GUIContent ("Color"), false, CreateProperty<ColorProperty>);
|
|
menu.AddItem (new GUIContent ("Vector"), false, CreateProperty<VectorProperty>);
|
|
menu.ShowAsContext ();
|
|
}
|
|
|
|
private void CreateProperty <T> () where T : ShaderProperty
|
|
{
|
|
var createdProperty = CreateInstance<T> ();
|
|
createdProperty.name = typeof(T).Name;
|
|
createdProperty.hideFlags = HideFlags.HideInHierarchy;
|
|
m_ShaderProperties.Add (createdProperty);
|
|
AssetDatabase.AddObjectToAsset (createdProperty, this);
|
|
}
|
|
|
|
static Vector2 BeginArea (string title, Vector2 scrollPos)
|
|
{
|
|
DoHeader (title);
|
|
scrollPos = GUILayout.BeginScrollView (scrollPos);
|
|
GUILayout.BeginVertical ();
|
|
return scrollPos;
|
|
}
|
|
|
|
static void EndArea ()
|
|
{
|
|
GUILayout.EndVertical ();
|
|
GUILayout.EndScrollView();
|
|
}
|
|
|
|
static void DoHeader (string title)
|
|
{
|
|
GUILayout.BeginHorizontal (EditorStyles.inspectorBig);
|
|
GUILayout.BeginVertical ();
|
|
GUILayout.Label (title, EditorStyles.largeLabel);
|
|
GUILayout.EndVertical ();
|
|
GUILayout.EndHorizontal ();
|
|
}
|
|
|
|
public IEnumerable<ShaderProperty> GetPropertiesForPropertyType(PropertyType propertyType)
|
|
{
|
|
return m_ShaderProperties.Where(x => x.propertyType == propertyType);
|
|
}
|
|
|
|
public void GenerateSharedProperties (PropertyGenerator shaderProperties, ShaderGenerator propertyUsages, GenerationMode generationMode)
|
|
{
|
|
foreach (var property in m_ShaderProperties)
|
|
{
|
|
property.GeneratePropertyBlock (shaderProperties, generationMode);
|
|
property.GeneratePropertyUsages (propertyUsages, generationMode);
|
|
}
|
|
}
|
|
}
|
|
}
|