using Editor.NodeEditor; using System.Text.Json.Serialization; namespace Editor.ShaderGraph; public enum BlendMode { [Icon( "circle" )] Opaque, [Icon( "radio_button_unchecked" )] Masked, [Icon( "blur_on" )] Translucent, } public enum ShadingModel { [Icon( "tungsten" )] Lit, [Icon( "brightness_3" )] Unlit, } public enum ShaderDomain { [Icon( "view_in_ar" )] Surface, [Icon( "desktop_windows" )] PostProcess, } public class PreviewSettings { public bool RenderBackfaces { get; set; } = false; public bool EnableShadows { get; set; } = true; public bool ShowGround { get; set; } = false; public bool ShowSkybox { get; set; } = true; public Color BackgroundColor { get; set; } = Color.Black; public Color Tint { get; set; } = Color.White; } public sealed partial class ShaderGraph : IGraph { [Hide, JsonIgnore] public IEnumerable Nodes => _nodes.Values; [Hide, JsonIgnore] private readonly Dictionary _nodes = new(); [Hide, JsonIgnore] IEnumerable IGraph.Nodes => Nodes; [Hide] public bool IsSubgraph { get; set; } [Hide] public string Path { get; set; } [Hide] public string Model { get; set; } /// /// The name of the Node when used in ShaderGraph /// [ShowIf( nameof( IsSubgraph ), true )] public string Title { get; set; } public string Description { get; set; } /// /// The category of the Node when browsing the Node Library (optional) /// [ShowIf( nameof( AddToNodeLibrary ), true )] public string Category { get; set; } [IconName, ShowIf( nameof( IsSubgraph ), true )] public string Icon { get; set; } /// /// Whether or not this Node should appear when browsing the Node Library. /// Otherwise can only be referenced by dragging the Subgraph asset into the graph. /// [ShowIf( nameof( IsSubgraph ), true )] public bool AddToNodeLibrary { get; set; } public BlendMode BlendMode { get; set; } [ShowIf( nameof( ShowShadingModel ), true )] public ShadingModel ShadingModel { get; set; } [Hide] private bool ShowShadingModel => Domain != ShaderDomain.PostProcess; public ShaderDomain Domain { get; set; } [Hide] public PreviewSettings PreviewSettings { get; set; } = new(); [Hide] public int Version { get; set; } = 1; public ShaderGraph() { } public void AddNode( BaseNode node ) { node.Graph = this; _nodes.Add( node.Identifier, node ); } public void RemoveNode( BaseNode node ) { if ( node.Graph != this ) return; _nodes.Remove( node.Identifier ); } public BaseNode FindNode( string name ) { _nodes.TryGetValue( name, out var node ); return node; } public void ClearNodes() { _nodes.Clear(); } string IGraph.SerializeNodes( IEnumerable nodes ) { return SerializeNodes( nodes.Cast() ); } IEnumerable IGraph.DeserializeNodes( string serialized ) { return DeserializeNodes( serialized ); } void IGraph.AddNode( INode node ) { AddNode( (BaseNode)node ); } void IGraph.RemoveNode( INode node ) { RemoveNode( (BaseNode)node ); } }