summaryrefslogtreecommitdiff
path: root/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs')
-rw-r--r--Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs238
1 files changed, 238 insertions, 0 deletions
diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs
new file mode 100644
index 00000000..c049d6d7
--- /dev/null
+++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs
@@ -0,0 +1,238 @@
+// Amplify Shader Editor - Visual Shader Editing Tool
+// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
+
+using System;
+using UnityEditor;
+using UnityEngine;
+using System.Collections.Generic;
+
+namespace AmplifyShaderEditor
+{
+ [Serializable]
+ public class RenderPlatformInfo
+ {
+ public string Label;
+ public RenderPlatforms Value;
+ }
+
+ [Serializable]
+ public class RenderingPlatformOpHelper
+ {
+ private const string RenderingPlatformsStr = " Rendering Platforms";
+ private readonly RenderPlatformInfo[] RenderingPlatformsInfo =
+ {
+ new RenderPlatformInfo(){Label = " Direct3D 9", Value = RenderPlatforms.d3d9},
+ new RenderPlatformInfo(){Label = " Direct3D 11 9.x", Value = RenderPlatforms.d3d11_9x},
+ new RenderPlatformInfo(){Label = " Direct3D 11/12", Value = RenderPlatforms.d3d11},
+ new RenderPlatformInfo(){Label = " OpenGL 3.x/4.x", Value = RenderPlatforms.glcore},
+ new RenderPlatformInfo(){Label = " OpenGL ES 2.0", Value = RenderPlatforms.gles},
+ new RenderPlatformInfo(){Label = " OpenGL ES 3.x", Value = RenderPlatforms.gles3},
+ new RenderPlatformInfo(){Label = " iOS/Mac Metal", Value = RenderPlatforms.metal},
+ new RenderPlatformInfo(){Label = " Vulkan", Value = RenderPlatforms.vulkan},
+ new RenderPlatformInfo(){Label = " Xbox 360", Value = RenderPlatforms.xbox360},
+ new RenderPlatformInfo(){Label = " Xbox One", Value = RenderPlatforms.xboxone},
+ new RenderPlatformInfo(){Label = " PlayStation 4", Value = RenderPlatforms.ps4},
+ new RenderPlatformInfo(){Label = " PlayStation Vita", Value = RenderPlatforms.psp2},
+ new RenderPlatformInfo(){Label = " Nintendo 3DS", Value = RenderPlatforms.n3ds},
+ new RenderPlatformInfo(){Label = " Nintendo Wii U", Value = RenderPlatforms.wiiu}
+ };
+
+ // Values from this dictionary must be the indices corresponding from the list above
+ private readonly Dictionary<RenderPlatforms, int> PlatformToIndex = new Dictionary<RenderPlatforms, int>()
+ {
+ {RenderPlatforms.d3d9, 0},
+ {RenderPlatforms.d3d11_9x, 1},
+ {RenderPlatforms.d3d11, 2},
+ {RenderPlatforms.glcore, 3},
+ {RenderPlatforms.gles, 4},
+ {RenderPlatforms.gles3, 5},
+ {RenderPlatforms.metal, 6},
+ {RenderPlatforms.vulkan, 7},
+ {RenderPlatforms.xbox360, 8},
+ {RenderPlatforms.xboxone, 9},
+ {RenderPlatforms.ps4, 10},
+ {RenderPlatforms.psp2, 11},
+ {RenderPlatforms.n3ds, 12},
+ {RenderPlatforms.wiiu, 13}
+ };
+
+
+ private readonly List<RenderPlatforms> LegacyIndexToPlatform = new List<RenderPlatforms>()
+ {
+ RenderPlatforms.d3d9,
+ RenderPlatforms.d3d11,
+ RenderPlatforms.glcore,
+ RenderPlatforms.gles,
+ RenderPlatforms.gles3,
+ RenderPlatforms.metal,
+ RenderPlatforms.d3d11_9x,
+ RenderPlatforms.xbox360,
+ RenderPlatforms.xboxone,
+ RenderPlatforms.ps4,
+ RenderPlatforms.psp2,
+ RenderPlatforms.n3ds,
+ RenderPlatforms.wiiu
+ };
+
+ [SerializeField]
+ private bool[] m_renderingPlatformValues;
+
+ public RenderingPlatformOpHelper()
+ {
+ m_renderingPlatformValues = new bool[ RenderingPlatformsInfo.Length ];
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ m_renderingPlatformValues[ i ] = true;
+ }
+ }
+
+
+ public void Draw( ParentNode owner )
+ {
+ bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedRenderingPlatforms;
+ NodeUtils.DrawPropertyGroup( ref value, RenderingPlatformsStr, () =>
+ {
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ m_renderingPlatformValues[ i ] = owner.EditorGUILayoutToggleLeft( RenderingPlatformsInfo[ i ].Label, m_renderingPlatformValues[ i ] );
+ }
+ } );
+ owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedRenderingPlatforms = value;
+ }
+
+ public void SetRenderingPlatforms( ref string ShaderBody )
+ {
+ int checkedPlatforms = 0;
+ int uncheckedPlatforms = 0;
+
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ if( m_renderingPlatformValues[ i ] )
+ {
+ checkedPlatforms += 1;
+ }
+ else
+ {
+ uncheckedPlatforms += 1;
+ }
+ }
+
+ if( checkedPlatforms > 0 && checkedPlatforms < m_renderingPlatformValues.Length )
+ {
+ string result = string.Empty;
+ if( checkedPlatforms < uncheckedPlatforms )
+ {
+ result = "only_renderers ";
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ if( m_renderingPlatformValues[ i ] )
+ {
+ result += (RenderPlatforms)RenderingPlatformsInfo[i].Value + " ";
+ }
+ }
+ }
+ else
+ {
+ result = "exclude_renderers ";
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ if( !m_renderingPlatformValues[ i ] )
+ {
+ result += (RenderPlatforms)RenderingPlatformsInfo[ i ].Value + " ";
+ }
+ }
+ }
+ MasterNode.AddShaderPragma( ref ShaderBody, result );
+ }
+ }
+
+ public void ReadFromString( ref uint index, ref string[] nodeParams )
+ {
+ if( UIUtils.CurrentShaderVersion() < 17006 )
+ {
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ m_renderingPlatformValues[ i ] = false;
+ }
+
+ int count = LegacyIndexToPlatform.Count;
+ int activeCount = 0;
+ for( int i = 0; i < count; i++ )
+ {
+ RenderPlatforms platform = LegacyIndexToPlatform[ i ];
+ int newIndex = PlatformToIndex[ platform ];
+ bool value = Convert.ToBoolean( nodeParams[ index++ ] );
+ if( value )
+ {
+ m_renderingPlatformValues[ newIndex ] = true;
+ activeCount += 1;
+ }
+ else
+ {
+ m_renderingPlatformValues[ newIndex ] = false;
+ }
+ }
+
+ if( activeCount == count )
+ {
+ m_renderingPlatformValues[ PlatformToIndex[ RenderPlatforms.vulkan ] ] = true;
+ }
+ }
+ else
+ {
+ int count = Convert.ToInt32( nodeParams[ index++ ] );
+ if( count > 0 )
+ {
+ RenderPlatforms firstPlatform = (RenderPlatforms)Enum.Parse( typeof(RenderPlatforms), nodeParams[ index++ ] );
+ if( firstPlatform == RenderPlatforms.all )
+ {
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ m_renderingPlatformValues[ i ] = true;
+ }
+ }
+ else
+ {
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ m_renderingPlatformValues[ i ] = false;
+ }
+
+ m_renderingPlatformValues[ PlatformToIndex[ firstPlatform ]] = true;
+ for( int i = 1; i < count; i++ )
+ {
+ RenderPlatforms currPlatform = (RenderPlatforms)Enum.Parse( typeof( RenderPlatforms ), nodeParams[ index++ ] );
+ m_renderingPlatformValues[ PlatformToIndex[ currPlatform ] ] = true;
+ }
+ }
+ }
+ }
+ }
+
+ public void WriteToString( ref string nodeInfo )
+ {
+ int active = 0;
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ if( m_renderingPlatformValues[ i ] )
+ active += 1;
+ }
+ IOUtils.AddFieldValueToString( ref nodeInfo, active );
+ if( active == m_renderingPlatformValues.Length )
+ {
+ IOUtils.AddFieldValueToString( ref nodeInfo, RenderPlatforms.all );
+ }
+ else
+ {
+ for( int i = 0; i < m_renderingPlatformValues.Length; i++ )
+ {
+ if( m_renderingPlatformValues[ i ] )
+ {
+ IOUtils.AddFieldValueToString( ref nodeInfo, RenderingPlatformsInfo[i].Value );
+ }
+ }
+ }
+
+ }
+ }
+}