using System; using System.Collections.Generic; #if UNITY_2020_2_OR_NEWER using UnityEditor.AssetImporters; #else using UnityEditor.Experimental.AssetImporters; #endif using UnityEditor.Graphing; using UnityEditor.ShaderGraph.Internal; using UnityEditor.ShaderGraph.Serialization; using UnityEngine; namespace UnityEditor.ShaderGraph { [Serializable] struct FunctionPair { public string key; public string value; public FunctionPair(string key, string value) { this.key = key; this.value = value; } } class SubGraphData : JsonObject { public List> inputs = new List>(); public List> keywords = new List>(); public List> nodeProperties = new List>(); public List> outputs = new List>(); public List> unsupportedTargets = new List>(); } class SubGraphAsset : ScriptableObject, ISerializationCallbackReceiver { public bool isValid; public long processedAt; public string functionName; public string inputStructName; public string hlslName; public string assetGuid; public ShaderGraphRequirements requirements; public string path; public List functions = new List(); public List vtFeedbackVariables = new List(); private SubGraphData m_SubGraphData; [SerializeField] private SerializationHelper.JSONSerializedElement m_SerializedSubGraphData; public DataValueEnumerable inputs => m_SubGraphData.inputs.SelectValue(); public DataValueEnumerable keywords => m_SubGraphData.keywords.SelectValue(); public DataValueEnumerable nodeProperties => m_SubGraphData.nodeProperties.SelectValue(); public DataValueEnumerable outputs => m_SubGraphData.outputs.SelectValue(); public DataValueEnumerable unsupportedTargets => m_SubGraphData.unsupportedTargets.SelectValue(); public List children = new List(); // guids of direct USED SUBGRAPH file dependencies public List descendents = new List(); // guids of ALL file dependencies at any level, SHOULD LIST EVEN MISSING DESCENDENTS public ShaderStageCapability effectiveShaderStage; public ConcretePrecision graphPrecision; public ConcretePrecision outputPrecision; public PreviewMode previewMode; public void WriteData(IEnumerable inputs, IEnumerable keywords, IEnumerable nodeProperties, IEnumerable outputs, IEnumerable unsupportedTargets) { if (m_SubGraphData == null) { m_SubGraphData = new SubGraphData(); m_SubGraphData.OverrideObjectId(assetGuid, "_subGraphData"); } m_SubGraphData.inputs.Clear(); m_SubGraphData.keywords.Clear(); m_SubGraphData.nodeProperties.Clear(); m_SubGraphData.outputs.Clear(); m_SubGraphData.unsupportedTargets.Clear(); foreach (var input in inputs) { m_SubGraphData.inputs.Add(input); } foreach (var keyword in keywords) { m_SubGraphData.keywords.Add(keyword); } foreach (var nodeProperty in nodeProperties) { m_SubGraphData.nodeProperties.Add(nodeProperty); } foreach (var output in outputs) { m_SubGraphData.outputs.Add(output); } foreach (var unsupportedTarget in unsupportedTargets) { m_SubGraphData.unsupportedTargets.Add(unsupportedTarget); } var json = MultiJson.Serialize(m_SubGraphData); m_SerializedSubGraphData = new SerializationHelper.JSONSerializedElement() { JSONnodeData = json }; m_SubGraphData = null; } public void OnBeforeSerialize() { } public void OnAfterDeserialize() { } public void LoadGraphData() { m_SubGraphData = new SubGraphData(); if (!String.IsNullOrEmpty(m_SerializedSubGraphData.JSONnodeData)) { MultiJson.Deserialize(m_SubGraphData, m_SerializedSubGraphData.JSONnodeData); } } } }