summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-10-23 13:08:43 +0800
committerchai <chaifix@163.com>2020-10-23 13:08:43 +0800
commitb82da95b5181ac8bbae38efb13e950d5e88a4caa (patch)
tree48a6f3269276484bbc7cfc95f0651f40a2176aa1 /Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs
parent917e9e0b320775634dc2e710f7deac74fd0822f0 (diff)
*移动amplify shader editor到third party目录
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs')
-rw-r--r--Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs284
1 files changed, 284 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs
new file mode 100644
index 00000000..0f2ca737
--- /dev/null
+++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs
@@ -0,0 +1,284 @@
+using UnityEngine;
+using UnityEditor;
+using System.Collections.Generic;
+
+namespace AmplifyShaderEditor
+{
+ public enum DebugScreenShotNodeState
+ {
+ CreateNode,
+ FocusOnNode,
+ TakeScreenshot,
+ WaitFrame,
+ DeleteNode
+ };
+
+ public enum DebugUndoNodeState
+ {
+ CreateNode,
+ FocusOnNode,
+ WaitFrameCreate,
+ DeleteNode,
+ WaitFrameDelete,
+ UndoNode,
+ WaitFrameUndo,
+ PrepareForNext
+ };
+
+
+ public class NodeExporterUtils
+ {
+ //Auto-Screenshot nodes
+ private RenderTexture m_screenshotRT;
+ private Texture2D m_screenshotTex2D;
+ private List<ContextMenuItem> m_screenshotList = new List<ContextMenuItem>();
+ private DebugScreenShotNodeState m_screenShotState;
+ private bool m_takingShots = false;
+
+ private DebugUndoNodeState m_undoState;
+ private bool m_testingUndo = false;
+
+
+ private AmplifyShaderEditorWindow m_window;
+ private ParentNode m_node;
+
+
+ private string m_pathname;
+
+ public NodeExporterUtils( AmplifyShaderEditorWindow window )
+ {
+ m_window = window;
+ Undo.undoRedoPerformed += OnUndoRedoPerformed;
+ }
+
+ public void OnUndoRedoPerformed()
+ {
+ if( m_testingUndo && m_undoState == DebugUndoNodeState.WaitFrameUndo )
+ {
+ m_undoState = DebugUndoNodeState.PrepareForNext;
+ }
+ }
+
+ public void CalculateShaderInstructions( Shader shader )
+ {
+ //Type shaderutilType = Type.GetType( "UnityEditor.ShaderUtil, UnityEditor" );
+ //shaderutilType.InvokeMember( "OpenCompiledShader", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { shader, mode, customPlatformsMask, includeAllVariants } );
+ }
+
+ public void ActivateAutoScreenShot( string pathname, int from, int to )
+ {
+
+ m_pathname = pathname;
+ if( !System.IO.Directory.Exists( m_pathname ) )
+ {
+ System.IO.Directory.CreateDirectory( m_pathname );
+ }
+
+ m_screenshotRT = new RenderTexture( (int)m_window.position.width, (int)m_window.position.height, 0 );
+ m_screenshotTex2D = new Texture2D( (int)m_window.position.width, (int)m_window.position.height, TextureFormat.RGB24, false );
+
+ RenderTexture.active = m_screenshotRT;
+ m_window.CurrentPaletteWindow.FillList( ref m_screenshotList, true );
+ m_window.CurrentGraph.ClearGraph();
+ if( m_window.IsShaderFunctionWindow )
+ {
+ m_window.CurrentGraph.CurrentOutputNode.Vec2Position = new Vector2( 1500, 0 );
+ }
+ else
+ {
+ m_window.CurrentGraph.CurrentMasterNode.Vec2Position = new Vector2( 1500, 0 );
+ }
+ m_window.ResetCameraSettings();
+
+ m_takingShots = true;
+ m_screenShotState = DebugScreenShotNodeState.CreateNode;
+
+ }
+
+ public void ActivateNodesURL( int from , int to )
+ {
+ m_window.CurrentPaletteWindow.FillList( ref m_screenshotList, true );
+
+ if( to < 0 || to > m_screenshotList.Count )
+ to = m_screenshotList.Count;
+
+ if( from >= to )
+ return;
+
+ for( int i = from; i < to; i++ )
+ {
+ if( m_screenshotList[ i ].NodeType != typeof( FunctionNode ) )
+ {
+ Application.OpenURL( m_screenshotList[ i ].NodeAttributes.NodeUrl );
+ }
+ }
+ }
+
+ public void ActivateAutoUndo()
+ {
+ m_window.CurrentPaletteWindow.FillList( ref m_screenshotList, true );
+ m_window.CurrentGraph.ClearGraph();
+ m_window.CurrentGraph.CurrentMasterNode.Vec2Position = new Vector2( 1500, 0 );
+ m_window.ResetCameraSettings();
+
+ m_testingUndo = true;
+ m_undoState = DebugUndoNodeState.CreateNode;
+ }
+
+
+ public void Update()
+ {
+ if( m_testingUndo )
+ {
+ if( Event.current.type == EventType.Repaint )
+ {
+ m_window.Focus();
+ switch( m_undoState )
+ {
+ case DebugUndoNodeState.CreateNode:
+ {
+ m_window.CurrentGraph.DeSelectAll();
+ m_node = m_window.CreateNode( m_screenshotList[ 0 ].NodeType, Vector2.zero, null, true );
+ m_node.RefreshExternalReferences();
+ m_undoState = DebugUndoNodeState.FocusOnNode;
+ Debug.Log( "Created " + m_node.Attributes.Name );
+ }
+ break;
+ case DebugUndoNodeState.FocusOnNode:
+ {
+ m_window.FocusOnPoint( m_node.TruePosition.center, 1, false );
+ m_undoState = DebugUndoNodeState.WaitFrameCreate;
+ Debug.Log( "Focused " + m_node.Attributes.Name );
+ }
+ break;
+ case DebugUndoNodeState.WaitFrameCreate:
+ {
+ m_undoState = DebugUndoNodeState.DeleteNode;
+ Debug.Log( "Waiting on Create" );
+ }
+ break;
+ case DebugUndoNodeState.DeleteNode:
+ {
+ Debug.Log( "Deleting " + m_node.Attributes.Name );
+ m_window.DeleteSelectedNodeWithRepaint();
+ m_undoState = DebugUndoNodeState.WaitFrameDelete;
+ }
+ break;
+ case DebugUndoNodeState.WaitFrameDelete:
+ {
+ m_undoState = DebugUndoNodeState.UndoNode;
+ Debug.Log( "Waiting on Delete" );
+ }
+ break;
+ case DebugUndoNodeState.UndoNode:
+ {
+ Debug.Log( "Performing Undo" );
+ m_undoState = DebugUndoNodeState.WaitFrameUndo;
+ Undo.PerformUndo();
+ }
+ break;
+ case DebugUndoNodeState.WaitFrameUndo: { } break;
+ case DebugUndoNodeState.PrepareForNext:
+ {
+ m_screenshotList.RemoveAt( 0 );
+ Debug.Log( "Undo Performed. Nodes Left " + m_screenshotList.Count );
+ m_testingUndo = m_screenshotList.Count > 0;
+ if( m_testingUndo )
+ {
+ m_undoState = DebugUndoNodeState.CreateNode;
+ Debug.Log( "Going to next node" );
+ }
+ else
+ {
+ Debug.Log( "Finished Undo Test" );
+ }
+ }
+ break;
+
+ }
+ }
+ }
+
+
+ if( m_takingShots )
+ {
+ m_window.Focus();
+ switch( m_screenShotState )
+ {
+ case DebugScreenShotNodeState.CreateNode:
+ {
+ m_node = m_window.CreateNode( m_screenshotList[ 0 ].NodeType, Vector2.zero, null, false );
+ m_node.RefreshExternalReferences();
+ m_screenShotState = DebugScreenShotNodeState.FocusOnNode;
+
+
+ }
+ break;
+ case DebugScreenShotNodeState.FocusOnNode:
+ {
+ //m_window.FocusOnNode( m_node, 1, false );
+ m_window.FocusOnPoint( m_node.TruePosition.center, 1, false );
+ m_screenShotState = DebugScreenShotNodeState.TakeScreenshot;
+ }
+ break;
+ case DebugScreenShotNodeState.TakeScreenshot:
+ {
+ if( m_screenshotRT != null && Event.current.type == EventType.Repaint )
+ {
+ m_screenshotTex2D.ReadPixels( new Rect( 0, 0, m_screenshotRT.width, m_screenshotRT.height ), 0, 0 );
+ m_screenshotTex2D.Apply();
+
+ byte[] bytes = m_screenshotTex2D.EncodeToPNG();
+ string pictureFilename = UIUtils.ReplaceInvalidStrings( m_screenshotList[ 0 ].Name );
+ pictureFilename = UIUtils.RemoveInvalidCharacters( pictureFilename );
+
+ System.IO.File.WriteAllBytes( m_pathname + pictureFilename + ".png", bytes );
+ m_screenShotState = DebugScreenShotNodeState.WaitFrame;
+ }
+ }
+ break;
+ case DebugScreenShotNodeState.WaitFrame: { Debug.Log( "Wait Frame" ); m_screenShotState = DebugScreenShotNodeState.DeleteNode; } break;
+ case DebugScreenShotNodeState.DeleteNode:
+ {
+ m_window.DestroyNode( m_node );
+ m_screenshotList.RemoveAt( 0 );
+ m_takingShots = m_screenshotList.Count > 0;
+ Debug.Log( "Destroy Node " + m_screenshotList.Count );
+
+ if( m_takingShots )
+ {
+ m_screenShotState = DebugScreenShotNodeState.CreateNode;
+ }
+ else
+ {
+ RenderTexture.active = null;
+ m_screenshotRT.Release();
+ UnityEngine.Object.DestroyImmediate( m_screenshotRT );
+ m_screenshotRT = null;
+ UnityEngine.Object.DestroyImmediate( m_screenshotTex2D );
+ m_screenshotTex2D = null;
+ }
+ }
+ break;
+ };
+ }
+ }
+
+ public void Destroy()
+ {
+ m_window = null;
+ if( m_screenshotRT != null )
+ {
+ m_screenshotRT.Release();
+ UnityEngine.Object.DestroyImmediate( m_screenshotRT );
+ m_screenshotRT = null;
+ }
+
+ if( m_screenshotTex2D != null )
+ {
+ UnityEngine.Object.DestroyImmediate( m_screenshotTex2D );
+ m_screenshotTex2D = null;
+ }
+ }
+ }
+}