SceneDebugViewer/Editor/ReplacementShaderSetupScriptableObject.cs
max 42100c5332 Update SceneDebugViewerWindow and GlobalShaderProperty.
Compact and normal mode.
More types in global shader property.
Updated global shader property drawer.
SortingOrder for setups.
2021-04-20 03:54:55 +02:00

161 lines
3.6 KiB
C#

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace TAO.SceneDebugViewer.Editor
{
#if UNITY_EDITOR
[CreateAssetMenu(menuName = "ReplacementShaderSetup", order = 99999)]
public class ReplacementShaderSetupScriptableObject : ScriptableObject
{
[Header("GUI")]
[SerializeField]
private GContent content = new GContent();
public GContent Content => content;
[Header("Shader")]
public Shader shader = null;
public string replacementTag = "";
public List<GlobalShaderParameter> parameters = new List<GlobalShaderParameter>();
public virtual void Replace()
{
SetupShaderParameters();
foreach (SceneView s in SceneView.sceneViews)
{
s.SetSceneViewShaderReplace(shader, replacementTag);
s.Repaint();
}
}
protected void SetupShaderParameters()
{
foreach (var p in parameters)
{
p.Set();
}
}
private void OnValidate()
{
content.compact.text = null;
content.compact.image = content.icon;
content.compact.tooltip = content.tooltip;
content.normal.text = string.Format(" {0}", name);
content.normal.image = content.icon;
content.normal.tooltip = content.tooltip;
}
[System.Serializable]
public struct GlobalShaderParameter
{
public string m_name;
public ParameterType m_parameterType;
public Texture2D m_texture;
public Vector4 m_vector;
public Vector4[] m_vectorArray;
public Color m_color;
public Color[] m_colorArray;
public float m_float;
public float[] m_floatArray;
public int m_int;
public Matrix4x4 m_matrix;
public Matrix4x4[] m_matrixArray;
public void Set()
{
switch (m_parameterType)
{
case ParameterType.m_texture:
Shader.SetGlobalTexture(m_name, m_texture);
break;
case ParameterType.m_vector:
Shader.SetGlobalVector(m_name, m_vector);
break;
case ParameterType.m_vectorArray:
Shader.SetGlobalVectorArray(m_name, m_vectorArray);
break;
case ParameterType.m_color:
Shader.SetGlobalColor(m_name, m_color);
break;
case ParameterType.m_colorArray:
Shader.SetGlobalVectorArray(m_name, ColorArrayToVector4Array(m_colorArray));
break;
case ParameterType.m_float:
Shader.SetGlobalFloat(m_name, m_float);
break;
case ParameterType.m_floatArray:
Shader.SetGlobalFloatArray(m_name, m_floatArray);
break;
case ParameterType.m_int:
Shader.SetGlobalInt(m_name, m_int);
break;
case ParameterType.m_matrix:
Shader.SetGlobalMatrix(m_name, m_matrix);
break;
case ParameterType.m_matrixArray:
Shader.SetGlobalMatrixArray(m_name, m_matrixArray);
break;
default:
break;
}
}
}
public enum ParameterType
{
m_texture,
m_vector,
m_vectorArray,
m_color,
m_colorArray,
m_float,
m_floatArray,
m_int,
m_matrix,
m_matrixArray
}
private static Vector4[] ColorArrayToVector4Array(Color[] c)
{
Vector4[] v = new Vector4[c.Length];
for (int i = 0; i < v.Length; i++)
{
v[i] = c[i];
}
return v;
}
[System.Serializable]
public struct GContent
{
public Texture2D icon;
public string tooltip;
public int sortingOrder;
[HideInInspector]
public GUIContent compact;
[HideInInspector]
public GUIContent normal;
}
}
public class RSSOComparer : IComparer<ReplacementShaderSetupScriptableObject>
{
public int Compare(ReplacementShaderSetupScriptableObject x, ReplacementShaderSetupScriptableObject y)
{
if (x == null || y == null)
{
return 0;
}
return x.Content.sortingOrder.CompareTo(y.Content.sortingOrder);
}
}
#endif
}