diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs | 2839 |
1 files changed, 2839 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs new file mode 100644 index 00000000..a525fd7c --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs @@ -0,0 +1,2839 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.IO; + +using System.Globalization; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + public enum ASEColorSpace + { + Auto, + Gamma, + Linear + } + + public enum SurfaceInputs + { + DEPTH = 0, + UV_COORDS, + UV2_COORDS, + VIEW_DIR, + COLOR, + SCREEN_POS, + WORLD_POS, + WORLD_REFL, + WORLD_NORMAL, + VFACE, + INTERNALDATA + } + + public enum CustomStyle + { + NodeWindowOff = 0, + NodeWindowOn, + NodeTitle, + NodeHeader, + CommentaryHeader, + ShaderLibraryTitle, + ShaderLibraryAddToList, + ShaderLibraryRemoveFromList, + ShaderLibraryOpenListed, + ShaderLibrarySelectionAsTemplate, + ShaderLibraryItem, + CommentaryTitle, + PortEmptyIcon, + PortFullIcon, + InputPortlabel, + OutputPortLabel, + CommentaryResizeButton, + CommentaryResizeButtonInv, + CommentaryBackground, + MinimizeButton, + MaximizeButton, + NodePropertiesTitle, + ShaderModeTitle, + MaterialModeTitle, + ShaderNoMaterialModeTitle, + PropertyValuesTitle, + ShaderModeNoShader, + MainCanvasTitle, + ShaderBorder, + MaterialBorder, + SamplerTextureRef, + SamplerTextureIcon, + CustomExpressionAddItem, + CustomExpressionRemoveItem, + CustomExpressionSmallAddItem, + CustomExpressionSmallRemoveItem, + ResetToDefaultInspectorButton, + SliderStyle, + ObjectPicker, + NodePropertyPicker, + NodePreviewExpander, + NodePreviewCollapser, + SamplerButton, + SamplerFrame, + CommentarySuperTitle, + MiniButtonTopLeft, + MiniButtonTopMid, + MiniButtonTopRight, + ShaderFunctionBorder, + ShaderFunctionMode, + RightShaderMode, + FlatBackground, + DocumentationLink, + GraphButtonIcon, + GraphButton, + NodeWindowOffSquare, + NodeHeaderSquare, + NodeWindowOnSquare, + ConsoleLogMessage, + ConsoleLogCircle + } + + public enum MasterNodePortCategory + { + Vertex = 1 << 0, + Fragment = 1 << 1, + Tessellation = 1 << 2, + Debug = 1 << 3 + } + + public enum PortGenType + { + NonCustomLighting, + //Normal = 1 << 1, + //Emission = 1 << 2, + //Metallic = 1 << 3, + //Specular = 1 << 4, + CustomLighting + } + + public struct NodeData + { + public MasterNodePortCategory Category; + public int OrderIndex; + public int GraphDepth; + public NodeData( MasterNodePortCategory category ) + { + Category = category; + OrderIndex = 0; + GraphDepth = -1; + } + } + + public struct NodeCastInfo + { + public int NodeId; + public int PortId; + public NodeCastInfo( int nodeId, int portId ) + { + NodeId = nodeId; + PortId = portId; + } + public override string ToString() + { + return NodeId.ToString() + PortId.ToString(); + } + }; + + public struct ButtonClickId + { + public const int LeftMouseButton = 0; + public const int RightMouseButton = 1; + public const int MiddleMouseButton = 2; + } + + public enum ASESelectionMode + { + Shader = 0, + Material, + ShaderFunction + } + + public enum DrawOrder + { + Background, + Default + } + + public enum NodeConnectionStatus + { + Not_Connected = 0, + Connected, + Error, + Island + } + + public enum InteractionMode + { + Target, + Other, + Both + } + + public enum FunctionNodeCategories + { + Custom, + CameraAndScreen, + ConstantsAndProperties, + Functions, + ImageEffects, + Light, + LogicalOperators, + MathOperators, + MatrixOperators, + Miscellaneous, + ObjectTransform, + SurfaceData, + Textures, + Time, + TrigonometryOperators, + UVCoordinates, + VectorOperators, + VertexData + } + + public enum TransformSpaceFrom + { + Object = 0, + World, + View, + Tangent + } + + public enum TransformSpaceTo + { + Object = 0, + World, + View, + Tangent, + Clip + } + + public class UIUtils + { + public static string NewTemplateGUID; + public static int SerializeHelperCounter = 0; + public static bool IgnoreDeselectAll = false; + + public static bool DirtyMask = true; + public static bool Initialized = false; + public static float HeaderMaxHeight; + public static float CurrentHeaderHeight; + public static GUISkin MainSkin = null; + public static GUIStyle PlusStyle; + public static GUIStyle MinusStyle; + public static GUIStyle RangedFloatSliderStyle; + public static GUIStyle RangedFloatSliderThumbStyle; + public static GUIStyle SwitchNodePopUp; + public static GUIStyle PropertyPopUp; + public static GUIStyle ObjectField; + public static GUIStyle PreviewExpander; + public static GUIStyle PreviewCollapser; + public static GUIStyle ObjectFieldThumb; + public static GUIStyle ObjectFieldThumbOverlay; + public static GUIStyle InspectorPopdropdownStyle; + public static GUIStyle InspectorPopdropdownFallback; + public static GUIStyle BoldErrorStyle; + public static GUIStyle BoldWarningStyle; + public static GUIStyle BoldInfoStyle; + public static GUIStyle Separator; + public static GUIStyle ToolbarMainTitle; + public static GUIStyle ToolbarSearchTextfield; + public static GUIStyle ToolbarSearchCancelButton; + public static GUIStyle MiniButtonTopLeft; + public static GUIStyle MiniButtonTopMid; + public static GUIStyle MiniButtonTopRight; + + public static GUIStyle CommentaryTitle; + public static GUIStyle InputPortLabel; + public static GUIStyle OutputPortLabel; + + public static GUIStyle MiniObjectFieldThumbOverlay; + public static GUIStyle MiniSamplerButton; + + public static GUIStyle NodeWindowOffSquare; + public static GUIStyle NodeHeaderSquare; + public static GUIStyle NodeWindowOnSquare; + public static GUIStyle InternalDataOnPort; + public static GUIStyle InternalDataBackground; + + public static GUIStyle GraphButtonIcon; + public static GUIStyle GraphButton; + public static GUIStyle GraphDropDown; + + public static GUIStyle EmptyStyle = new GUIStyle(); + + public static GUIStyle ConsoleLogLabel; + public static GUIStyle ConsoleLogMessage; + public static GUIStyle ConsoleLogCircle; + + public static GUIStyle TooltipBox; + public static GUIStyle Box; + public static GUIStyle Button; + public static GUIStyle TextArea; + public static GUIStyle Label; + public static GUIStyle Toggle; + public static GUIStyle Textfield; + + public static GUIStyle UnZoomedNodeTitleStyle; + public static GUIStyle UnZoomedPropertyValuesTitleStyle; + public static GUIStyle UnZoomedInputPortStyle; + public static GUIStyle UnZoomedOutputPortPortStyle; + + // Node Property Menu items + public static GUIStyle MenuItemToggleStyle; + public static GUIStyle MenuItemEnableStyle; + public static GUIStyle MenuItemBackgroundStyle; + public static GUIStyle MenuItemToolbarStyle; + public static GUIStyle MenuItemInspectorDropdownStyle; + + public static GUIStyle FloatIntPickerONOFF; + + public static bool UsingProSkin = false; + + public static Texture ShaderIcon { get { return EditorGUIUtility.IconContent( "Shader Icon" ).image; } } + public static Texture MaterialIcon { get { return EditorGUIUtility.IconContent( "Material Icon" ).image; } } + + //50be8291f9514914aa55c66c49da67cf + public static Texture ShaderFunctionIcon { get { return AssetDatabase.LoadAssetAtPath<Texture>( AssetDatabase.GUIDToAssetPath( "50be8291f9514914aa55c66c49da67cf" ) ); } } + + public static Texture2D WireNodeSelection = null; + public static Texture2D SliderButton = null; + + public static Texture2D SmallErrorIcon = null; + public static Texture2D SmallWarningIcon = null; + public static Texture2D SmallInfoIcon = null; + + public static Texture2D CheckmarkIcon = null; + public static Texture2D PopupIcon = null; + + public static Texture2D MasterNodeOnTexture = null; + public static Texture2D MasterNodeOffTexture = null; + + public static Texture2D GPUInstancedOnTexture = null; + public static Texture2D GPUInstancedOffTexture = null; + + public static GUIContent LockIconOpen = null; + public static GUIContent LockIconClosed = null; + + public static GUIContent FloatIntIconON = null; + public static GUIContent FloatIntIconOFF = null; + + public static bool ShowContextOnPick = true; + + private static AmplifyShaderEditorWindow m_currentWindow = null; + public static AmplifyShaderEditorWindow CurrentWindow + { + get + { + if( m_currentWindow == null ) + { + for( int i = 0; i < IOUtils.AllOpenedWindows.Count; i++ ) + { + if( IOUtils.AllOpenedWindows[ i ] != null ) + { + m_currentWindow = IOUtils.AllOpenedWindows[ i ]; + } + else + { + //Debug.Log("No Window Found!"); + } + } + } + return m_currentWindow; + } + set { m_currentWindow = value; } + } + + public static Vector2 PortsSize; + public static Vector3 PortsDelta; + public static Vector3 ScaledPortsDelta; + + public static RectOffset RectOffsetZero; + public static RectOffset RectOffsetOne; + public static RectOffset RectOffsetTwo; + public static RectOffset RectOffsetThree; + public static RectOffset RectOffsetFour; + public static RectOffset RectOffsetFive; + public static RectOffset RectOffsetSix; + + public static Material LinearMaterial = null; + public static Shader IntShader = null; + public static Shader FloatShader = null; + public static Shader Vector2Shader = null; + public static Shader Vector3Shader = null; + public static Shader Vector4Shader = null; + public static Shader ColorShader = null; + public static Shader Texture2DShader = null; + public static Shader MaskingShader = null; + + public static bool InhibitMessages = false; + + + private static int m_shaderIndentLevel = 0; + private static string m_shaderIndentTabs = string.Empty; + + //Label Vars + + private static TextAnchor m_alignment; + private static TextClipping m_clipping; + private static bool m_wordWrap; + private static int m_fontSize; + private static Color m_fontColor; + private static FontStyle m_fontStyle; + + + private static string NumericNamePattern = @"^\d"; + private static System.Globalization.TextInfo m_textInfo; + private static string m_latestOpenedFolder = string.Empty; + private static Dictionary<int, UndoParentNode> m_undoHelper = new Dictionary<int, UndoParentNode>(); + + private static Dictionary<string, int> AvailableKeywordsDict = new Dictionary<string, int>(); + public static readonly string[] AvailableKeywords = + { + "Custom", + "ETC1_EXTERNAL_ALPHA", + "PIXELSNAP_ON", + "UNITY_PASS_FORWARDBASE", + "UNITY_PASS_FORWARDADD", + "UNITY_PASS_DEFERRED", + "UNITY_PASS_SHADOWCASTER", + "UNITY_INSTANCING_ENABLED", + "DIRECTIONAL_COOKIE" + + }; + + public static readonly string[] CategoryPresets = + { + "<Custom>", + "Camera And Screen", + "Constants And Properties", + "Functions", + "Image Effects", + "Light", + "Logical Operators", + "Math Operators", + "Matrix Operators", + "Miscellaneous", + "Object Transform", + "Surface Data", + "Textures", + "Time", + "Trigonometry Operators", + "UV Coordinates", + "Vector Operators", + "Vertex Data" + }; + + private static Dictionary<MasterNodePortCategory, int> m_portCategoryToArrayIdx = new Dictionary<MasterNodePortCategory, int> + { + { MasterNodePortCategory.Vertex,0}, + { MasterNodePortCategory.Tessellation,0}, + { MasterNodePortCategory.Fragment,1}, + { MasterNodePortCategory.Debug,1} + }; + + private static Dictionary<string, string> m_reservedPropertyNames = new Dictionary<string, string> + { + { "UNITY_MATRIX_MVP", string.Empty}, + { "UNITY_MATRIX_MV", string.Empty}, + { "UNITY_MATRIX_V", string.Empty}, + { "UNITY_MATRIX_P", string.Empty}, + { "UNITY_MATRIX_VP", string.Empty}, + { "UNITY_MATRIX_T_MV", string.Empty}, + { "UNITY_MATRIX_IT_MV", string.Empty}, + { "UNITY_MATRIX_TEXTURE0", string.Empty}, + { "UNITY_MATRIX_TEXTURE1", string.Empty}, + { "UNITY_MATRIX_TEXTURE2", string.Empty}, + { "UNITY_MATRIX_TEXTURE3", string.Empty}, + { "_Object2World", string.Empty}, + { "_WorldSpaceCameraPos", string.Empty}, + { "unity_Scale", string.Empty}, + { "_ModelLightColor", string.Empty}, + { "_SpecularLightColor", string.Empty}, + { "_ObjectSpaceLightPos", string.Empty}, + { "_Light2World", string.Empty}, + { "_World2Light", string.Empty}, + { "_Object2Light", string.Empty}, + { "_Time", string.Empty}, + { "_SinTime", string.Empty}, + { "_CosTime", string.Empty}, + { "unity_DeltaTime", string.Empty}, + { "_ProjectionParams", string.Empty}, + { "_ScreenParams", string.Empty} + }; + + private static Dictionary<string, string> m_exampleMaterialIDs = new Dictionary<string, string>() + { + //Community + {"2Sided", "8ebbbf2c99a544ca780a2573ef1450fc" }, + {"DissolveBurn", "f144f2d7ff3daf349a2b7f0fd81ec8ac" }, + {"MourEnvironmentGradient", "b64adae401bc073408ac7bff0993c107" }, + {"ForceShield", "0119aa6226e2a4cfdb6c9a5ba9df7820" }, + {"HighlightAnimated", "3d232e7526f6e426cab994cbec1fc287" }, + {"Hologram", "b422c600f1c3941b8bc7e95db33476ad" }, + {"LowPolyWater", "0557703d3791a4286a62f8ee709d5bef"}, + //Official + {"AnimatedFire", "63ea5eae6d954a14292033589d0d4275" }, + {"AnimatedFire-ShaderFunction", "9c6c9fcb82afe874a825a9e680e694b2" }, + {"BurnEffect", "0b019675a8064414b97862a02f644166" }, + {"CubemapReflections", "2c299f827334e9c459a60931aea62260" }, + {"DitheringFade", "610507217b7dcad4d97e6e03e9844171" }, + {"DoubleLayerCustomSurface", "846aec4914103104d99e9e31a217b548" }, + {"NormalExtrusion", "70a5800fbba039f46b438a2055bc6c71" }, + {"MatcapSample", "da8aaaf01fe8f2b46b2fbcb803bd7af4" }, + {"ParallaxMappingIterations", "a0cea9c3f318ac74d89cd09134aad000" }, + {"SandPOM", "905481dc696211145b88dc4bac2545f3" }, + {"ParallaxWindow", "63ad0e7afb1717b4e95adda8904ab0c3" }, + {"LocalPosCutoff", "fed8c9d33a691084c801573feeed5a62" }, + {"ImprovedReadFromAtlasTiled", "941b31b251ea8e74f9198d788a604c9b" }, + {"ReadFromAtlasTiled", "2d5537aa702f24645a1446dc3be92bbf" }, + {"ReflectRefractSoapBubble", "a844987c9f2e7334abaa34f12feda3b9" }, + {"RimLight", "e2d3a4d723cf1dc4eab1d919f3324dbc" }, + {"RefractedShadows", "11818aa28edbeb04098f3b395a5bfc1d" }, + {"TextureArray", "0f572993ab788a346aea45f2f797b7fa" }, + {"ObjectNormalRefraction", "f1a0a645876302547b608ce881c94e6d" }, + {"ShaderBallInterior", "e47ee174f55b6144b9c1a942bb23d82a" }, + {"ScreenSpaceCurvature", "2e794cb9b3900b043a37ba28cdc2f907" }, + {"ScreenSpaceDetail", "3a0163d12fede4d47a1f818a66a115de" }, + {"SimpleNoise", "cc167bc6c2063a14f84a5a77be541194" }, + {"SimpleBlur", "1d283ff911af20e429180bb15d023661" }, + {"SimpleGPUInstancing", "9d609a7c8d00c7c4c9bdcdcdba154b81" }, + {"SimpleLambert", "54b29030f7d7ffe4b84f2f215dede5ac" }, + {"SimpleRefraction", "58c94d2f48acdc049a53b4ca53d6d98a" }, + {"SimpleTexture", "9661085a7d249a54c95078ac8e7ff004" }, + {"SnowAccum", "e3bd639f50ae1a247823079047a8dc01" }, + {"StencilDiffuse01", "9f47f529fdeddd948a2d2722f73e6ac4" }, + {"StencilMask01", "6f870834077d59b44ac421c36f619d59" }, + {"StencilDiffuse02", "11cdb862d5ba68c4eae526765099305b" }, + {"StencilMask02", "344696733b065c646b18c1aa2eacfdb7" }, + {"StencilDiffuse03", "75e851f6c686a5f42ab900222b29355b" }, + {"StencilMask03", "c7b3018ad495c6b479f2e3f8564aa6dc" }, + {"SubstanceExample", "a515e243b476d7e4bb37eb9f82c87a12" }, + {"AnimatedRefraction", "e414af1524d258047bb6b82b8860062c" }, + {"Tessellation", "efb669a245f17384c88824d769d0087c" }, + {"Translucency", "842ba3dcdd461ea48bdcfcea316cbcc4" }, + {"Transmission", "1b21506b7afef734facfc42c596caa7b" }, + {"Transparency", "e323a62068140c2408d5601877e8de2c" }, + {"TriplanarProjection", "663d512de06d4e24db5205c679f394cb" }, + {"TwoSideWithFace", "c953c4b601ba78e4f870d24d038b67f6" }, + {"Ground", "48df9bdf7b922d94bb3167e6db39c943" }, + {"WaterSample", "288137d67ce790e41903020c572ab4d7" }, + {"WorldPosSlices", "013cc03f77f3d034692f902db8928787" } + }; + + private static Dictionary<TextureType, string> m_textureTypeToCgType = new Dictionary<TextureType, string>() + { + {TextureType.Texture1D, "sampler1D" }, + {TextureType.Texture2D, "sampler2D" }, + {TextureType.Texture3D, "sampler3D" }, + {TextureType.Cube , "samplerCUBE"}, + {TextureType.Texture2DArray, "sampler2D" }, + {TextureType.ProceduralTexture, "sampler2D" } + }; + + + private static Dictionary<string, Color> m_nodeCategoryToColor = new Dictionary<string, Color>() + { + { "Master", new Color( 0.6f, 0.52f, 0.43f, 1.0f )}, + { "Default", new Color( 0.26f, 0.35f, 0.44f, 1.0f )}, + { "Vertex Data", new Color( 0.8f, 0.07f, 0.18f, 1.0f)},//new Color( 0.75f, 0.10f, 0.30f, 1.0f )}, + { "Math Operators", new Color( 0.26f, 0.35f, 0.44f, 1.0f )},//new Color( 0.10f, 0.27f, 0.45f, 1.0f) }, + { "Logical Operators", new Color( 0.0f, 0.55f, 0.45f, 1.0f)},//new Color( 0.11f, 0.28f, 0.47f, 1.0f) }, + { "Trigonometry Operators", new Color( 0.1f, 0.20f, 0.35f, 1.0f)},//new Color( 0.8f, 0.07f, 0.18f, 1.0f)}, + { "Image Effects", new Color( 0.5f, 0.2f, 0.90f, 1.0f)},//new Color( 0.12f, 0.47f, 0.88f, 1.0f)}, + { "Miscellaneous", new Color( 0.49f, 0.32f, 0.60f, 1.0f)}, + { "Camera And Screen", new Color( 0.75f, 0.10f, 0.30f, 1.0f )},//new Color( 0.17f, 0.22f, 0.07f, 1.0f) }, + { "Constants And Properties", new Color( 0.42f, 0.70f, 0.22f, 1.0f) }, + { "Surface Data", new Color( 0.92f, 0.73f, 0.03f, 1.0f)}, + { "Matrix Transform", new Color( 0.09f, 0.43f, 0.2f, 1.0f) }, + { "Time", new Color( 0.25f, 0.25f, 0.25f, 1.0f)},//new Color( 0.89f, 0.59f, 0.0f, 1.0f) }, + { "Functions", new Color( 1.00f, 0.4f, 0.0f, 1.0f) }, + { "Vector Operators", new Color( 0.22f, 0.20f, 0.45f, 1.0f)}, + { "Matrix Operators", new Color( 0.45f, 0.9f, 0.20f, 1.0f) }, + { "Light", new Color( 1.0f, 0.9f, 0.0f, 1.0f) }, + { "Textures", new Color( 0.15f, 0.40f, 0.8f, 1.0f)}, + { "Commentary", new Color( 0.7f, 0.7f, 0.7f, 1.0f)}, + { "UV Coordinates", new Color( 0.89f, 0.59f, 0.0f, 1.0f) }, + { "Object Transform", new Color( 0.15f, 0.4f, 0.49f, 1.0f)}, + { "Vertex Transform", new Color( 0.15f, 0.4f, 0.49f, 1.0f)} + }; + + private static Dictionary<ToolButtonType, List<string>> m_toolButtonTooltips = new Dictionary<ToolButtonType, List<string>> + { + { ToolButtonType.New, new List<string>() { "Create new shader." } }, + { ToolButtonType.Open, new List<string>() { "Open existing shader." } }, + { ToolButtonType.Save, new List<string>() { "No changes to save.", "Save current changes." } }, + { ToolButtonType.Library, new List<string>() { "Lists custom shader selection." } }, + { ToolButtonType.Options, new List<string>() { "Open Options menu." } }, + { ToolButtonType.Update, new List<string>() { "Open or create a new shader first.", "Click to enable to update current shader.", "Shader up-to-date." } }, + { ToolButtonType.Live, new List<string>() { "Open or create a new shader first.", "Click to enable live shader preview", "Click to enable live shader and material preview." , "Live preview active, click to disable." } }, + { ToolButtonType.TakeScreenshot, new List<string>() { "Take screenshot", "Take screenshot" }}, + { ToolButtonType.Share, new List<string>() { "Share selection", "Share selection" }}, + { ToolButtonType.CleanUnusedNodes, new List<string>() { "No unconnected nodes to clean.", "Remove all nodes not connected( directly or indirectly) to the master node." }}, + { ToolButtonType.Help, new List<string>() { "Show help window." } }, + { ToolButtonType.FocusOnMasterNode,new List<string>() { "Focus on active master node." } }, + { ToolButtonType.FocusOnSelection, new List<string>() { "Focus on selection fit to screen ( if none selected )." } } + }; + + private static Color[] m_dataTypeToColorMonoMode = { new Color( 0.5f, 0.5f, 0.5f, 1.0f ), Color.white }; + private static Dictionary<WirePortDataType, Color> m_dataTypeToColor = new Dictionary<WirePortDataType, Color>( new WirePortDataTypeComparer() ) + { + { WirePortDataType.OBJECT, Color.white}, + { WirePortDataType.FLOAT, Color.gray}, + { WirePortDataType.FLOAT2, new Color(1f,1f,0f,1f)}, + { WirePortDataType.FLOAT3, new Color(0.5f,0.5f,1f,1f)}, + { WirePortDataType.FLOAT4, new Color(1f,0,1f,1f)}, + { WirePortDataType.FLOAT3x3, new Color(0.5f,1f,0.5f,1f)}, + { WirePortDataType.FLOAT4x4, new Color(0.5f,1f,0.5f,1f)}, + { WirePortDataType.COLOR, new Color(1f,0,1f,1f)}, + { WirePortDataType.INT, Color.white}, + { WirePortDataType.SAMPLER1D, new Color(1f,0.5f,0f,1f)}, + { WirePortDataType.SAMPLER2D, new Color(1f,0.5f,0f,1f)}, + { WirePortDataType.SAMPLER3D, new Color(1f,0.5f,0f,1f)}, + { WirePortDataType.SAMPLERCUBE, new Color(1f,0.5f,0f,1f)} + }; + + private static Dictionary<WirePortDataType, string> m_dataTypeToName = new Dictionary<WirePortDataType, string>() + { + { WirePortDataType.OBJECT, "Generic Object"}, + { WirePortDataType.FLOAT, "Float"}, + { WirePortDataType.FLOAT2, "Vector2"}, + { WirePortDataType.FLOAT3, "Vector3"}, + { WirePortDataType.FLOAT4, "Vector4"}, + { WirePortDataType.FLOAT3x3, "3x3 Matrix"}, + { WirePortDataType.FLOAT4x4, "4x4 Matrix"}, + { WirePortDataType.COLOR, "Color"}, + { WirePortDataType.INT, "Int"}, + { WirePortDataType.SAMPLER1D, "Sampler1D"}, + { WirePortDataType.SAMPLER2D, "Sampler2D"}, + { WirePortDataType.SAMPLER3D, "Sampler3D"}, + { WirePortDataType.SAMPLERCUBE, "SamplerCUBE"} + }; + + private static Dictionary<SurfaceInputs, string> m_inputTypeDeclaration = new Dictionary<SurfaceInputs, string>() + { + { SurfaceInputs.DEPTH, "{0} Depth : SV_Depth"}, + { SurfaceInputs.UV_COORDS, "{0}2 uv"},// texture uv must have uv or uv2 followed by the texture name + { SurfaceInputs.UV2_COORDS, "{0}2 uv2"}, + { SurfaceInputs.VIEW_DIR, "{0}3 viewDir"}, + { SurfaceInputs.COLOR, Constants.ColorInput}, + { SurfaceInputs.SCREEN_POS, "{0}4 screenPos"}, + { SurfaceInputs.WORLD_POS, "{0}3 worldPos"}, + { SurfaceInputs.WORLD_REFL, "{0}3 worldRefl"}, + { SurfaceInputs.WORLD_NORMAL,"{0}3 worldNormal"}, + { SurfaceInputs.VFACE, Constants.VFaceInput}, + { SurfaceInputs.INTERNALDATA, Constants.InternalData} + }; + + private static Dictionary<SurfaceInputs, string> m_inputTypeName = new Dictionary<SurfaceInputs, string>() + { + { SurfaceInputs.DEPTH, "Depth"}, + { SurfaceInputs.UV_COORDS, "uv"},// texture uv must have uv or uv2 followed by the texture name + { SurfaceInputs.UV2_COORDS, "uv2"}, + { SurfaceInputs.VIEW_DIR, "viewDir"}, + { SurfaceInputs.COLOR, Constants.ColorVariable}, + { SurfaceInputs.SCREEN_POS, "screenPos"}, + { SurfaceInputs.WORLD_POS, "worldPos"}, + { SurfaceInputs.WORLD_REFL, "worldRefl"}, + { SurfaceInputs.WORLD_NORMAL, "worldNormal"}, + { SurfaceInputs.VFACE, Constants.VFaceVariable}, + }; + + private static Dictionary<PrecisionType, string> m_precisionTypeToCg = new Dictionary<PrecisionType, string>() + { + {PrecisionType.Float, "float"}, + {PrecisionType.Half, "half"}, + {PrecisionType.Inherit, "float"} + }; + + private static Dictionary<VariableQualifiers, string> m_qualifierToCg = new Dictionary<VariableQualifiers, string>() + { + { VariableQualifiers.In, string.Empty}, + {VariableQualifiers.Out, "out"}, + {VariableQualifiers.InOut, "inout"} + }; + + private static Dictionary<WirePortDataType, string> m_precisionWirePortToCgType = new Dictionary<WirePortDataType, string>() + { + {WirePortDataType.FLOAT, "{0}"}, + {WirePortDataType.FLOAT2, "{0}2"}, + {WirePortDataType.FLOAT3, "{0}3"}, + {WirePortDataType.FLOAT4, "{0}4"}, + {WirePortDataType.FLOAT3x3, "{0}3x3"}, + {WirePortDataType.FLOAT4x4, "{0}4x4"}, + {WirePortDataType.COLOR, "{0}4"}, + {WirePortDataType.INT, "int"}, + {WirePortDataType.SAMPLER1D, "sampler1D"}, + {WirePortDataType.SAMPLER2D, "sampler2D"}, + {WirePortDataType.SAMPLER3D, "sampler3D"}, + {WirePortDataType.SAMPLERCUBE, "samplerCUBE"} + }; + + private static Dictionary<WirePortDataType, string> m_wirePortToCgType = new Dictionary<WirePortDataType, string>() + { + { WirePortDataType.FLOAT, "float"}, + {WirePortDataType.FLOAT2, "float2"}, + {WirePortDataType.FLOAT3, "float3"}, + {WirePortDataType.FLOAT4, "float4"}, + {WirePortDataType.FLOAT3x3, "float3x3"}, + {WirePortDataType.FLOAT4x4, "float4x4"}, + {WirePortDataType.COLOR, "float4"}, + {WirePortDataType.INT, "int"}, + {WirePortDataType.SAMPLER1D, "sampler1D"}, + {WirePortDataType.SAMPLER2D, "sampler2D"}, + {WirePortDataType.SAMPLER3D, "sampler3D"}, + {WirePortDataType.SAMPLERCUBE, "samplerCUBE"}, + {WirePortDataType.UINT, "uint"} + }; + + private static Dictionary<KeyCode, string> m_keycodeToString = new Dictionary<KeyCode, string>() + { + {KeyCode.Alpha0,"0" }, + {KeyCode.Alpha1,"1" }, + {KeyCode.Alpha2,"2" }, + {KeyCode.Alpha3,"3" }, + {KeyCode.Alpha4,"4" }, + {KeyCode.Alpha5,"5" }, + {KeyCode.Alpha6,"6" }, + {KeyCode.Alpha7,"7" }, + {KeyCode.Alpha8,"8" }, + {KeyCode.Alpha9,"9" } + }; + + private static Dictionary<WireStatus, Color> m_wireStatusToColor = new Dictionary<WireStatus, Color>() + { + { WireStatus.Default,new Color(0.7f,0.7f,0.7f,1.0f) }, + {WireStatus.Highlighted,Color.yellow }, + {WireStatus.Selected,Color.white} + }; + + private static Dictionary<WirePortDataType, string> m_autoSwizzle = new Dictionary<WirePortDataType, string>() + { + {WirePortDataType.FLOAT, ".x"}, + {WirePortDataType.FLOAT2, ".xy"}, + {WirePortDataType.FLOAT3, ".xyz"}, + {WirePortDataType.FLOAT4, ".xyzw"} + }; + + private static Dictionary<string, bool> m_unityNativeShaderPaths = new Dictionary<string, bool> + { + { "Resources/unity_builtin_extra", true }, + { "Library/unity default resources", true } + }; + + private static Dictionary<WirePortDataType, int> m_portPriority = new Dictionary<WirePortDataType, int>() + { + { WirePortDataType.OBJECT, 0}, + {WirePortDataType.SAMPLER1D, 0}, + {WirePortDataType.SAMPLER2D, 0}, + {WirePortDataType.SAMPLER3D, 0}, + {WirePortDataType.SAMPLERCUBE, 0}, + {WirePortDataType.FLOAT3x3, 1}, + {WirePortDataType.FLOAT4x4, 2}, + {WirePortDataType.INT, 3}, + {WirePortDataType.FLOAT, 4}, + {WirePortDataType.FLOAT2, 5}, + {WirePortDataType.FLOAT3, 6}, + {WirePortDataType.FLOAT4, 7}, + {WirePortDataType.COLOR, 7} + }; + + private static readonly string IncorrectInputConnectionErrorMsg = "Input Port {0} from node {1} has type {2}\nwhich is incompatible with connection of type {3} from port {4} on node {5}"; + private static readonly string IncorrectOutputConnectionErrorMsg = "Output Port {0} from node {1} has type {2}\nwhich is incompatible with connection of type {3} from port {4} on node {5}"; + private static readonly string NoVertexModeNodeWarning = "{0} is unable to generate code in vertex function"; + + private static float SwitchFixedHeight; + private static float SwitchFontSize; + private static RectOffset SwitchNodeBorder; + private static RectOffset SwitchNodeMargin; + private static RectOffset SwitchNodeOverflow; + private static RectOffset SwitchNodePadding; + + public static void ForceExampleShaderCompilation() + { + CurrentWindow.ForceMaterialsToUpdate( ref m_exampleMaterialIDs ); + + } + + public static void Destroy() + { + if( IOUtils.AllOpenedWindows != null && IOUtils.AllOpenedWindows.Count > 0 ) + { + return; + } + else + { + IOUtils.AllOpenedWindows.Clear(); + } + + Initialized = false; + PlusStyle = null; + MinusStyle = null; + m_textInfo = null; + RangedFloatSliderStyle = null; + RangedFloatSliderThumbStyle = null; + PropertyPopUp = null; + ObjectField = null; + PreviewExpander = null; + PreviewCollapser = null; + MenuItemToggleStyle = null; + MenuItemEnableStyle = null; + MenuItemBackgroundStyle = null; + MenuItemToolbarStyle = null; + MenuItemInspectorDropdownStyle = null; + ObjectFieldThumb = null; + ObjectFieldThumbOverlay = null; + InspectorPopdropdownStyle = null; + InspectorPopdropdownFallback = null; + TooltipBox = null; + UnZoomedNodeTitleStyle = null; + UnZoomedPropertyValuesTitleStyle = null; + UnZoomedInputPortStyle = null; + UnZoomedOutputPortPortStyle = null; + ToolbarSearchTextfield = null; + ToolbarSearchCancelButton = null; + FloatIntPickerONOFF = null; + Box = null; + Button = null; + TextArea = null; + Label = null; + Toggle = null; + Textfield = null; + + CommentaryTitle = null; + InputPortLabel = null; + OutputPortLabel = null; + + IntShader = null; + FloatShader = null; + Vector2Shader = null; + Vector3Shader = null; + Vector4Shader = null; + ColorShader = null; + Texture2DShader = null; + + MaskingShader = null; + + BoldErrorStyle = null; + BoldWarningStyle = null; + BoldInfoStyle = null; + Separator = null; + ToolbarMainTitle = null; + + GraphButtonIcon = null; + GraphButton = null; + GraphDropDown = null; + + ConsoleLogLabel = null; + ConsoleLogMessage = null; + ConsoleLogCircle = null; + + MiniButtonTopLeft = null; + MiniButtonTopMid = null; + MiniButtonTopRight = null; + + NodeWindowOffSquare = null; + NodeHeaderSquare = null; + NodeWindowOnSquare = null; + InternalDataOnPort = null; + InternalDataBackground = null; + + MiniObjectFieldThumbOverlay = null; + MiniSamplerButton = null; + + Resources.UnloadAsset( SmallErrorIcon ); + SmallErrorIcon = null; + + Resources.UnloadAsset( SmallWarningIcon ); + SmallWarningIcon = null; + + Resources.UnloadAsset( SmallInfoIcon ); + SmallInfoIcon = null; + + LockIconOpen = null; + LockIconClosed = null; + + FloatIntIconON = null; + FloatIntIconOFF = null; + + Resources.UnloadAsset( CheckmarkIcon ); + CheckmarkIcon = null; + + Resources.UnloadAsset( PopupIcon ); + PopupIcon = null; + + Resources.UnloadAsset( MasterNodeOnTexture ); + MasterNodeOnTexture = null; + + Resources.UnloadAsset( MasterNodeOffTexture ); + MasterNodeOffTexture = null; + + Resources.UnloadAsset( GPUInstancedOnTexture ); + GPUInstancedOnTexture = null; + + Resources.UnloadAsset( GPUInstancedOffTexture ); + GPUInstancedOffTexture = null; + + MainSkin = null; + + if( LinearMaterial != null ) + GameObject.DestroyImmediate( LinearMaterial ); + + LinearMaterial = null; + + if( m_undoHelper == null ) + { + m_undoHelper.Clear(); + m_undoHelper = null; + } + ASEMaterialInspector.Instance = null; + } + + public static void ResetMainSkin() + { + if( (object)MainSkin != null ) + { + CurrentHeaderHeight = HeaderMaxHeight; + ScaledPortsDelta = PortsDelta; + MainSkin.textField.fontSize = (int)( Constants.TextFieldFontSize ); + MainSkin.label.fontSize = (int)( Constants.DefaultFontSize ); + MainSkin.customStyles[ (int)CustomStyle.NodeTitle ].fontSize = (int)( Constants.DefaultTitleFontSize ); + + InputPortLabel.fontSize = (int)( Constants.DefaultFontSize ); + OutputPortLabel.fontSize = (int)( Constants.DefaultFontSize ); + CommentaryTitle.fontSize = (int)( Constants.DefaultFontSize ); + } + } + + public static void InitMainSkin() + { + MainSkin = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IOUtils.MainSkinGUID ), typeof( GUISkin ) ) as GUISkin; + Initialized = true; + Texture2D portTex = GetCustomStyle( CustomStyle.PortEmptyIcon ).normal.background; + PortsSize = new Vector2( portTex.width, portTex.height ); + PortsDelta = new Vector3( 0.5f * PortsSize.x, 0.5f * PortsSize.y ); + HeaderMaxHeight = MainSkin.customStyles[ (int)CustomStyle.NodeHeader ].normal.background.height; + + RectOffsetZero = new RectOffset( 0, 0, 0, 0 ); + RectOffsetOne = new RectOffset( 1, 1, 1, 1 ); + RectOffsetTwo = new RectOffset( 2, 2, 2, 2 ); + RectOffsetThree = new RectOffset( 3, 3, 3, 3 ); + RectOffsetFour = new RectOffset( 4, 4, 4, 4 ); + RectOffsetFive = new RectOffset( 5, 5, 5, 5 ); + RectOffsetSix = new RectOffset( 6, 6, 6, 6 ); + + PropertyPopUp = GetCustomStyle( CustomStyle.NodePropertyPicker ); + ObjectField = new GUIStyle( (GUIStyle)"ObjectField" ); + PreviewExpander = GetCustomStyle( CustomStyle.NodePreviewExpander ); + PreviewCollapser = GetCustomStyle( CustomStyle.NodePreviewCollapser ); + + WireNodeSelection = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "bfe0b03d5d60cea4f9d4b2d1d121e592" ), typeof( Texture2D ) ) as Texture2D; + SliderButton = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "dd563e33152bb6443b099b4139ceecb9" ), typeof( Texture2D ) ) as Texture2D; + + SmallErrorIcon = EditorGUIUtility.Load( "icons/d_console.erroricon.sml.png" ) as Texture2D; + SmallWarningIcon = EditorGUIUtility.Load( "icons/d_console.warnicon.sml.png" ) as Texture2D; + SmallInfoIcon = EditorGUIUtility.Load( "icons/d_console.infoicon.sml.png" ) as Texture2D; + + LockIconOpen = new GUIContent( EditorGUIUtility.IconContent( "LockIcon-On" ) ); + LockIconOpen.tooltip = "Click to unlock and customize the variable name"; + LockIconClosed = new GUIContent( EditorGUIUtility.IconContent( "LockIcon" ) ); + LockIconClosed.tooltip = "Click to lock and auto-generate the variable name"; + + if( UsingProSkin ) + { + FloatIntIconON = new GUIContent( EditorGUIUtility.IconContent( "CircularToggle_ON" ) ); + FloatIntIconOFF = new GUIContent( EditorGUIUtility.IconContent( "CircularToggle_OFF" ) ); + } + else + { + FloatIntIconON = new GUIContent( ( AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "ac0860a6a77e29d4091ba790a17daa0f" ), typeof( Texture2D ) ) as Texture2D ) ); + FloatIntIconOFF = new GUIContent( ( AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "1aaca50d084b0bb43854f075ce2f302b" ), typeof( Texture2D ) ) as Texture2D ) ); + } + + CommentaryTitle = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.CommentaryTitle ] ); + InputPortLabel = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.InputPortlabel ] ); + OutputPortLabel = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.OutputPortLabel ] ); + + CheckmarkIcon = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "e9c4642eaa083a54ab91406d8449e6ac" ), typeof( Texture2D ) ) as Texture2D; + PopupIcon = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "d2384a227b4ac4943b73c8151393e502" ), typeof( Texture2D ) ) as Texture2D; + + BoldErrorStyle = new GUIStyle( (GUIStyle)"BoldLabel" ); + BoldErrorStyle.normal.textColor = Color.red; + BoldErrorStyle.alignment = TextAnchor.MiddleCenter; + BoldWarningStyle = new GUIStyle( (GUIStyle)"BoldLabel" ); + BoldWarningStyle.normal.textColor = Color.yellow; + BoldWarningStyle.alignment = TextAnchor.MiddleCenter; + BoldInfoStyle = new GUIStyle( (GUIStyle)"BoldLabel" ); + BoldInfoStyle.normal.textColor = Color.white; + BoldInfoStyle.alignment = TextAnchor.MiddleCenter; + + ToolbarMainTitle = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.MainCanvasTitle ] ); + Separator = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.FlatBackground ] ); + MiniButtonTopLeft = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.MiniButtonTopLeft ] ); + MiniButtonTopMid = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.MiniButtonTopMid ] ); + MiniButtonTopRight = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.MiniButtonTopRight ] ); + + InternalDataOnPort = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.NodeTitle ] ); + InternalDataOnPort.fontSize = 8; + InternalDataOnPort.fontStyle = FontStyle.BoldAndItalic; + InternalDataBackground = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.NodeWindowOffSquare ] ); + InternalDataBackground.normal.background = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "330fd0c8f074a3c4f8042114a61a73d9" ), typeof( Texture2D ) ) as Texture2D; + InternalDataBackground.overflow = RectOffsetOne; + + MiniObjectFieldThumbOverlay = new GUIStyle( (GUIStyle)"ObjectFieldThumbOverlay" ); + MiniSamplerButton = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.SamplerButton ] ); + + m_textInfo = new System.Globalization.CultureInfo( "en-US", false ).TextInfo; + RangedFloatSliderStyle = new GUIStyle( GUI.skin.horizontalSlider ); + RangedFloatSliderThumbStyle = new GUIStyle( GUI.skin.horizontalSliderThumb ); + RangedFloatSliderThumbStyle.normal.background = SliderButton; + RangedFloatSliderThumbStyle.active.background = null; + RangedFloatSliderThumbStyle.hover.background = null; + RangedFloatSliderThumbStyle.focused.background = null; + RangedFloatSliderThumbStyle.overflow = new RectOffset( 1, 1, -4, 4 ); + RangedFloatSliderThumbStyle.margin = RectOffsetZero; + + SwitchNodePopUp = new GUIStyle( (GUIStyle)"Popup" ); + // RectOffset cannot be initiliazed on constructor + SwitchNodeBorder = new RectOffset( 4, 15, 3, 3 ); + SwitchNodeMargin = new RectOffset( 4, 4, 3, 3 ); + SwitchNodeOverflow = new RectOffset( 0, 0, -1, 2 ); + SwitchNodePadding = new RectOffset( 6, 14, 2, 3 ); + SwitchFixedHeight = 18; + SwitchFontSize = 10; + + GraphButtonIcon = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.GraphButtonIcon ] ); + GraphButton = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.GraphButton ] ); + GraphDropDown = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.GraphButton ] ); + GraphDropDown.padding.right = 20; + + Box = new GUIStyle( MainSkin.box ); + Button = new GUIStyle( GUI.skin.button ); + TextArea = new GUIStyle( GUI.skin.textArea ); + Label = new GUIStyle( GUI.skin.label ); + Toggle = new GUIStyle( GUI.skin.toggle ); + Textfield = new GUIStyle( GUI.skin.textField ); + //ShaderIcon = EditorGUIUtility.IconContent( "Shader Icon" ).image; + //MaterialIcon = EditorGUIUtility.IconContent( "Material Icon" ).image; + + ConsoleLogLabel = new GUIStyle( GUI.skin.label ); + ConsoleLogMessage = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.ConsoleLogMessage ] ); + ConsoleLogCircle = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.ConsoleLogCircle ] ); + + NodeWindowOffSquare = GetCustomStyle( CustomStyle.NodeWindowOffSquare ); + NodeHeaderSquare = GetCustomStyle( CustomStyle.NodeHeaderSquare ); + NodeWindowOnSquare = GetCustomStyle( CustomStyle.NodeWindowOnSquare ); + + UnZoomedNodeTitleStyle = new GUIStyle( GetCustomStyle( CustomStyle.NodeTitle ) ); + UnZoomedNodeTitleStyle.fontSize = 13; + + UnZoomedPropertyValuesTitleStyle = new GUIStyle( GetCustomStyle( CustomStyle.PropertyValuesTitle ) ); + UnZoomedPropertyValuesTitleStyle.fontSize = 11; + + UnZoomedInputPortStyle = new GUIStyle( InputPortLabel ); + UnZoomedInputPortStyle.fontSize = (int)Constants.DefaultFontSize; + + UnZoomedOutputPortPortStyle = new GUIStyle( OutputPortLabel ); + UnZoomedOutputPortPortStyle.fontSize = (int)Constants.DefaultFontSize; + + ObjectFieldThumb = new GUIStyle( (GUIStyle)"ObjectFieldThumb" ); + ObjectFieldThumbOverlay = new GUIStyle( (GUIStyle)"ObjectFieldThumbOverlay" ); + + FloatIntPickerONOFF = new GUIStyle( "metimelabel" ); + FloatIntPickerONOFF.padding.left = -2; + FloatIntPickerONOFF.margin = new RectOffset(0,2,2,2); + + TooltipBox = new GUIStyle( (GUIStyle)"Tooltip" ); + TooltipBox.richText = true; + + MasterNodeOnTexture = AssetDatabase.LoadAssetAtPath<Texture2D>( AssetDatabase.GUIDToAssetPath( IOUtils.MasterNodeOnTextureGUID ) ); + MasterNodeOffTexture = AssetDatabase.LoadAssetAtPath<Texture2D>( AssetDatabase.GUIDToAssetPath( IOUtils.MasterNodeOnTextureGUID ) ); + + GPUInstancedOnTexture = AssetDatabase.LoadAssetAtPath<Texture2D>( AssetDatabase.GUIDToAssetPath( IOUtils.GPUInstancedOnTextureGUID ) ); + GPUInstancedOffTexture = AssetDatabase.LoadAssetAtPath<Texture2D>( AssetDatabase.GUIDToAssetPath( IOUtils.GPUInstancedOffTextureGUID ) ); + + CheckNullMaterials(); + + UsingProSkin = EditorGUIUtility.isProSkin; + FetchMenuItemStyles(); + } + + public static bool IsLoading + { + get { return CurrentWindow.OutsideGraph.IsLoading; } + } + + public static void CheckNullMaterials() + { + if( LinearMaterial == null ) + { + Shader linearShader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "e90ef6ea05743b84baf9549874c52e47" ) ); //linear previews + LinearMaterial = new Material( linearShader ); + } + + if( IntShader == null ) + IntShader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "0f64d695b6ffacc469f2dd31432a232a" ) ); //int + if( FloatShader == null ) + FloatShader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "d9ca47581ac157145bff6f72ac5dd73e" ) ); //ranged float + if( Vector2Shader == null ) + Vector2Shader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "88b4191eb06084d4da85d1dd2f984085" ) ); //vector2 + if( Vector3Shader == null ) + Vector3Shader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "8a44d38f06246bf48944b3f314bc7920" ) ); //vector3 + if( Vector4Shader == null ) + Vector4Shader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "aac241d0e47a5a84fbd2edcd640788dc" ) ); //vector4 + if( ColorShader == null ) + ColorShader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "6cf365ccc7ae776488ae8960d6d134c3" ) ); //color node + if( MaskingShader == null ) + MaskingShader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "9c34f18ebe2be3e48b201b748c73dec0" ) ); //masking shader + if( Texture2DShader == null ) + Texture2DShader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( "13bd295c44d04e1419f20f792d331e33" ) ); //texture2d shader + } + + private static void FetchMenuItemStyles() + { + ObjectFieldThumb = new GUIStyle( (GUIStyle)"ObjectFieldThumb" ); + ObjectFieldThumbOverlay = new GUIStyle( (GUIStyle)"ObjectFieldThumbOverlay" ); + MenuItemToggleStyle = new GUIStyle( (GUIStyle)"foldout" ); + MenuItemEnableStyle = UsingProSkin ? new GUIStyle( (GUIStyle)"OL ToggleWhite" ) : new GUIStyle( (GUIStyle)"OL Toggle" ); + MenuItemBackgroundStyle = new GUIStyle( (GUIStyle)"TE NodeBackground" ); + MenuItemToolbarStyle = new GUIStyle( (GUIStyle)"toolbarbutton" ) { fixedHeight = 20 }; + MenuItemInspectorDropdownStyle = new GUIStyle( (GUIStyle)"toolbardropdown" ) { fixedHeight = 20 }; + MenuItemInspectorDropdownStyle.margin.bottom = 2; + + + InspectorPopdropdownStyle = new GUIStyle( GUI.skin.GetStyle( "PopupCurveDropdown" ) ); + InspectorPopdropdownStyle.alignment = TextAnchor.MiddleRight; + InspectorPopdropdownStyle.border.bottom = 16; + + InspectorPopdropdownFallback = new GUIStyle( InspectorPopdropdownStyle ); + InspectorPopdropdownFallback.overflow = new RectOffset( 0, -5, 0, 0 ); + + PlusStyle = ( EditorGUIUtility.isProSkin ) ? new GUIStyle( GetCustomStyle( CustomStyle.CustomExpressionAddItem ) ) : new GUIStyle( (GUIStyle)"OL Plus" ); + PlusStyle.imagePosition = ImagePosition.ImageOnly; + PlusStyle.overflow = new RectOffset( -2, 0, -4, 0 ); + + MinusStyle = ( EditorGUIUtility.isProSkin ) ? new GUIStyle( GetCustomStyle( CustomStyle.CustomExpressionRemoveItem ) ) : new GUIStyle( (GUIStyle)"OL Minus" ); + MinusStyle.contentOffset = Vector2.zero; + MinusStyle.imagePosition = ImagePosition.ImageOnly; + MinusStyle.overflow = new RectOffset( -2, 0, -4, 0 ); + + ToolbarSearchTextfield = new GUIStyle( (GUIStyle)"ToolbarSeachTextField" ); + ToolbarSearchCancelButton = new GUIStyle( (GUIStyle)"ToolbarSeachCancelButton" ); + } + + public static void UpdateMainSkin( DrawInfo drawInfo ) + { + CurrentHeaderHeight = HeaderMaxHeight * drawInfo.InvertedZoom; + ScaledPortsDelta = drawInfo.InvertedZoom * PortsDelta; + MainSkin.textField.fontSize = (int)( Constants.TextFieldFontSize * drawInfo.InvertedZoom ); + MainSkin.label.fontSize = (int)( Constants.DefaultFontSize * drawInfo.InvertedZoom ); + + MainSkin.customStyles[ (int)CustomStyle.NodeTitle ].fontSize = (int)( Constants.DefaultTitleFontSize * drawInfo.InvertedZoom ); + MainSkin.customStyles[ (int)CustomStyle.PropertyValuesTitle ].fontSize = (int)( Constants.PropertiesTitleFontSize * drawInfo.InvertedZoom ); + + InputPortLabel.fontSize = (int)( Constants.DefaultFontSize * drawInfo.InvertedZoom ); + OutputPortLabel.fontSize = (int)( Constants.DefaultFontSize * drawInfo.InvertedZoom ); + CommentaryTitle.fontSize = (int)( Constants.DefaultFontSize * drawInfo.InvertedZoom ); + + RangedFloatSliderStyle.fixedHeight = 18 * drawInfo.InvertedZoom; + RangedFloatSliderThumbStyle.fixedHeight = 12 * drawInfo.InvertedZoom; + RangedFloatSliderThumbStyle.fixedWidth = 10 * drawInfo.InvertedZoom; + RangedFloatSliderThumbStyle.overflow.left = (int)( 1 * drawInfo.InvertedZoom ); + RangedFloatSliderThumbStyle.overflow.right = (int)( 1 * drawInfo.InvertedZoom ); + RangedFloatSliderThumbStyle.overflow.top = (int)( -4 * drawInfo.InvertedZoom ); + RangedFloatSliderThumbStyle.overflow.bottom = (int)( 4 * drawInfo.InvertedZoom ); + + SwitchNodePopUp.fixedHeight = SwitchFixedHeight * drawInfo.InvertedZoom; + + SwitchNodePopUp.border.left = (int)( SwitchNodeBorder.left * drawInfo.InvertedZoom ); + SwitchNodePopUp.border.right = (int)( SwitchNodeBorder.right * drawInfo.InvertedZoom ); + SwitchNodePopUp.border.top = (int)( SwitchNodeBorder.top * drawInfo.InvertedZoom ); + SwitchNodePopUp.border.bottom = (int)( SwitchNodeBorder.bottom * drawInfo.InvertedZoom ); + + SwitchNodePopUp.margin.left = (int)( SwitchNodeMargin.left * drawInfo.InvertedZoom ); + SwitchNodePopUp.margin.right = (int)( SwitchNodeMargin.right * drawInfo.InvertedZoom ); + SwitchNodePopUp.margin.top = (int)( SwitchNodeMargin.top * drawInfo.InvertedZoom ); + SwitchNodePopUp.margin.bottom = (int)( SwitchNodeMargin.bottom * drawInfo.InvertedZoom ); + + SwitchNodePopUp.overflow.left = (int)( SwitchNodeOverflow.left * drawInfo.InvertedZoom ); + SwitchNodePopUp.overflow.right = (int)( SwitchNodeOverflow.right * drawInfo.InvertedZoom ); + SwitchNodePopUp.overflow.top = (int)( SwitchNodeOverflow.top * drawInfo.InvertedZoom ); + SwitchNodePopUp.overflow.bottom = (int)( SwitchNodeOverflow.bottom * drawInfo.InvertedZoom ); + + SwitchNodePopUp.padding.left = (int)( SwitchNodePadding.left * drawInfo.InvertedZoom ); + SwitchNodePopUp.padding.right = (int)( SwitchNodePadding.right * drawInfo.InvertedZoom ); + SwitchNodePopUp.padding.top = (int)( SwitchNodePadding.top * drawInfo.InvertedZoom ); + SwitchNodePopUp.padding.bottom = (int)( SwitchNodePadding.bottom * drawInfo.InvertedZoom ); + + SwitchNodePopUp.fontSize = (int)( SwitchFontSize * drawInfo.InvertedZoom ); + + BoldErrorStyle.fontSize = (int)( 12 * drawInfo.InvertedZoom ); + BoldWarningStyle.fontSize = (int)( 12 * drawInfo.InvertedZoom ); + BoldInfoStyle.fontSize = (int)( 12 * drawInfo.InvertedZoom ); + + PropertyPopUp.fixedHeight = Constants.PropertyPickerHeight * drawInfo.InvertedZoom; + PropertyPopUp.fixedWidth = Constants.PropertyPickerWidth * drawInfo.InvertedZoom; + if( UsingProSkin != EditorGUIUtility.isProSkin ) + { + UsingProSkin = EditorGUIUtility.isProSkin; + FetchMenuItemStyles(); + } + + GraphDropDown.padding.left = (int)( 2 * drawInfo.InvertedZoom + 2 ); + GraphDropDown.padding.right = (int)( 20 * drawInfo.InvertedZoom ); + GraphDropDown.fontSize = (int)( 10 * drawInfo.InvertedZoom ); + + PreviewExpander.fixedHeight = Constants.PreviewExpanderHeight * drawInfo.InvertedZoom; + PreviewExpander.fixedWidth = Constants.PreviewExpanderWidth * drawInfo.InvertedZoom; + + PreviewCollapser.fixedHeight = Constants.PreviewExpanderHeight * drawInfo.InvertedZoom; + PreviewCollapser.fixedWidth = Constants.PreviewExpanderWidth * drawInfo.InvertedZoom; + + MainSkin.customStyles[ (int)CustomStyle.SamplerButton ].fontSize = (int)( 9 * drawInfo.InvertedZoom ); + ObjectFieldThumbOverlay.fontSize = (int)( 9 * drawInfo.InvertedZoom ); + MiniButtonTopLeft.fontSize = (int)( 9 * drawInfo.InvertedZoom ); + MiniButtonTopMid.fontSize = (int)( 9 * drawInfo.InvertedZoom ); + MiniButtonTopRight.fontSize = (int)( 9 * drawInfo.InvertedZoom ); + + MiniObjectFieldThumbOverlay.fontSize = (int)( 7 * drawInfo.InvertedZoom ); + MiniSamplerButton.fontSize = (int)( 8 * drawInfo.InvertedZoom ); + + InternalDataOnPort.fontSize = (int)( 8 * drawInfo.InvertedZoom ); + ToolbarMainTitle.padding.left = 0; + ToolbarMainTitle.padding.right = 0; + + CheckNullMaterials(); + } + + public static void CacheLabelVars() + { + m_alignment = GUI.skin.label.alignment; + m_clipping = GUI.skin.label.clipping; + m_wordWrap = GUI.skin.label.wordWrap; + m_fontSize = GUI.skin.label.fontSize; + m_fontStyle = GUI.skin.label.fontStyle; + m_fontColor = GUI.skin.label.normal.textColor; + } + + public static void RestoreLabelVars() + { + GUI.skin.label.alignment = m_alignment; + GUI.skin.label.clipping = m_clipping; + GUI.skin.label.wordWrap = m_wordWrap; + GUI.skin.label.fontSize = m_fontSize; + GUI.skin.label.fontStyle = m_fontStyle; + GUI.skin.label.normal.textColor = m_fontColor; + } + + public static string GetTooltipForToolButton( ToolButtonType toolButtonType, int state ) { return m_toolButtonTooltips[ toolButtonType ][ state ]; } + + public static string KeyCodeToString( KeyCode keyCode ) + { + if( m_keycodeToString.ContainsKey( keyCode ) ) + return m_keycodeToString[ keyCode ]; + + return keyCode.ToString(); + } + + public static string TextureTypeToCgType( TextureType type ) { return m_textureTypeToCgType[ type ]; } + + public static string QualifierToCg( VariableQualifiers qualifier ) + { + return m_qualifierToCg[ qualifier ]; + } + + public static string WirePortToCgType( WirePortDataType type ) + { + if( type == WirePortDataType.OBJECT ) + return string.Empty; + + return m_wirePortToCgType[ type ]; + } + + public static string FinalPrecisionWirePortToCgType( PrecisionType precisionType, WirePortDataType type ) + { + return PrecisionWirePortToCgType( precisionType, type ); + } + + public static string PrecisionWirePortToCgType( PrecisionType precisionType, WirePortDataType type ) + { + if( type == WirePortDataType.OBJECT ) + return string.Empty; + + if( type == WirePortDataType.INT ) + return m_wirePortToCgType[ type ]; + + if( type == WirePortDataType.UINT ) + return m_wirePortToCgType[ type ]; + + return string.Format( m_precisionWirePortToCgType[ type ], m_precisionTypeToCg[ precisionType ] ); + } + + public static string GetAutoSwizzle( WirePortDataType type ) + { + return m_autoSwizzle[ type ]; + } + + public static Color GetColorForDataType( WirePortDataType dataType, bool monochromeMode = true, bool isInput = true ) + { + if( monochromeMode ) + { + return isInput ? m_dataTypeToColorMonoMode[ 0 ] : m_dataTypeToColorMonoMode[ 1 ]; + } + else + { + if ( m_dataTypeToColor.ContainsKey( dataType ) ) + return m_dataTypeToColor[ dataType ]; + } + return m_dataTypeToColor[ WirePortDataType.OBJECT ]; + } + + public static bool IsValidType( WirePortDataType type ) + { + switch ( type ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + case WirePortDataType.COLOR: + case WirePortDataType.INT: + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + return true; + } + return false; + } + public static string GetNameForDataType( WirePortDataType dataType ) { return m_dataTypeToName[ dataType ]; } + + public static string GetInputDeclarationFromType( PrecisionType precision, SurfaceInputs inputType ) + { + string precisionStr = m_precisionTypeToCg[ precision ]; + return string.Format( m_inputTypeDeclaration[ inputType ], precisionStr ); + } + + public static string GetInputValueFromType( SurfaceInputs inputType ) { return m_inputTypeName[ inputType ]; } + private static string CreateLocalValueName( PrecisionType precision, WirePortDataType dataType, string localOutputValue, string value ) { return string.Format( Constants.LocalValueDecWithoutIdent, PrecisionWirePortToCgType( precision, dataType ), localOutputValue, value ); } + + public static string CastPortType( ref MasterNodeDataCollector dataCollector, PrecisionType nodePrecision, NodeCastInfo castInfo, object value, WirePortDataType oldType, WirePortDataType newType, string parameterName = null ) + { + if( oldType == newType || newType == WirePortDataType.OBJECT ) + { + return ( parameterName != null ) ? parameterName : value.ToString(); + } + + PrecisionType currentPrecision = nodePrecision; + string precisionStr = m_precisionTypeToCg[ currentPrecision ]; + string newTypeStr = m_wirePortToCgType[ newType ]; + newTypeStr = m_textInfo.ToTitleCase( newTypeStr ); + int castId = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) ? dataCollector.AvailableVertexTempId : dataCollector.AvailableFragTempId; + string localVarName = "temp_cast_" + castId;//m_wirePortToCgType[ oldType ] + "To" + newTypeStr + "_" + castInfo.ToString(); + string result = string.Empty; + bool useRealValue = ( parameterName == null ); + + switch( oldType ) + { + case WirePortDataType.FLOAT: + { + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? value.ToString() : parameterName; break; + case WirePortDataType.FLOAT2: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, string.Format( Constants.CastHelper, ( ( useRealValue ) ? value.ToString() : parameterName ), "xx" ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT3: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, string.Format( Constants.CastHelper, ( ( useRealValue ) ? value.ToString() : parameterName ), "xxx" ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.COLOR: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, string.Format( Constants.CastHelper, ( ( useRealValue ) ? value.ToString() : parameterName ), "xxxx" ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT4: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, string.Format( Constants.CastHelper, ( ( useRealValue ) ? value.ToString() : parameterName ), "xxxx" ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT3x3: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT4x4: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.INT: + { + result = ( useRealValue ) ? ( (int)value ).ToString() : "(int)" + parameterName; + } + break; + } + } + break; + case WirePortDataType.FLOAT2: + { + Vector2 vecVal = useRealValue ? (Vector2)value : Vector2.zero; + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? precisionStr + "2( " + vecVal.x + " , " + vecVal.y + " )" : parameterName; break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? vecVal.x.ToString() : parameterName + ".x"; + } + break; + case WirePortDataType.FLOAT3: + { + result = ( useRealValue ) ? precisionStr + "3( " + vecVal.x + " , " + vecVal.y + " , " + " 0.0 )" : precisionStr + "3( " + parameterName + " , 0.0 )"; + } + break; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + { + result = ( useRealValue ) ? precisionStr + "4( " + vecVal.x + " , " + vecVal.y + " , " + " 0.0 , 0.0 )" : precisionStr + "4( " + parameterName + ", 0.0 , 0.0 )"; + } + break; + } + } + break; + case WirePortDataType.FLOAT3: + { + Vector3 vecVal = useRealValue ? (Vector3)value : Vector3.zero; + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? precisionStr + "3( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " )" : parameterName; break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? vecVal.x.ToString() : parameterName + ".x"; + } + break; + case WirePortDataType.FLOAT2: + { + result = ( useRealValue ) ? precisionStr + "2( " + vecVal.x + " , " + vecVal.y + " )" : parameterName + ".xy"; + } + break; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + { + result = ( useRealValue ) ? precisionStr + "4( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , 0.0 )" : precisionStr + "4( " + parameterName + " , 0.0 )"; + } + break; + //case WirePortDataType.FLOAT3x3: + //{ + // if ( useRealValue ) + // { + // result = precisionStr + "3x3( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , " + + // vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , " + + // vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " )"; + // } + // else + // { + // string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, parameterName ); + // CurrentDataCollector.AddToLocalVariables( portCategory, -1, localVal ); + // result = precisionStr + "3x3( " + localVarName + ".x , " + localVarName + ".y , " + localVarName + ".x , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".y , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z )"; + // } + //} + //break; + //case WirePortDataType.FLOAT4x4: + //{ + // if ( useRealValue ) + // { + // result = precisionStr + "4x4( " + vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , 0 , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , 0 , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , 0 , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , 0 )"; + // } + // else + // { + // string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, parameterName ); + // CurrentDataCollector.AddToLocalVariables( portCategory, -1, localVal ); + // result = precisionStr + "4x4( " + localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , 0 , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , 0 , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , 0 , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , 0 )"; + // } + //} + //break; + } + } + break; + case WirePortDataType.FLOAT4: + { + Vector4 vecVal = useRealValue ? (Vector4)value : Vector4.zero; + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? precisionStr + "4( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , " + vecVal.w + " )" : parameterName; break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? vecVal.x.ToString() : parameterName + ".x"; + } + break; + case WirePortDataType.FLOAT2: + { + result = ( useRealValue ) ? precisionStr + "2( " + vecVal.x + " , " + vecVal.y + " )" : parameterName + ".xy"; + } + break; + case WirePortDataType.FLOAT3: + { + result = ( useRealValue ) ? precisionStr + "3( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " )" : parameterName + ".xyz"; + } + break; + //case WirePortDataType.FLOAT4x4: + //{ + // if ( useRealValue ) + // { + // result = precisionStr + "4x4( " + vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , " + vecVal + ".w , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , " + vecVal + ".w , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , " + vecVal + ".w , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , " + vecVal + ".w )"; + // } + // else + // { + // string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, parameterName ); + // CurrentDataCollector.AddToLocalVariables( portCategory, -1, localVal ); + // result = precisionStr + "4x4( " + localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w )"; + // } + //} + //break; + case WirePortDataType.COLOR: + { + result = useRealValue ? precisionStr + "4( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , " + vecVal.w + " )" : parameterName; + } + break; + } + } + break; + case WirePortDataType.FLOAT3x3: + { + //Matrix4x4 matrixVal = useRealValue ? ( Matrix4x4 ) value : Matrix4x4.identity; + //switch ( newType ) + //{ + // case WirePortDataType.OBJECT: + // case WirePortDataType.FLOAT4x4: + // { + // result = ( useRealValue ) ? precisionStr + "4x4(" + matrixVal.m00 + " , " + matrixVal.m01 + " , " + matrixVal.m02 + " , " + matrixVal.m03 + " , " + + // matrixVal.m10 + " , " + matrixVal.m11 + " , " + matrixVal.m12 + " , " + matrixVal.m10 + " , " + + // matrixVal.m20 + " , " + matrixVal.m21 + " , " + matrixVal.m22 + " , " + matrixVal.m20 + " , " + + // matrixVal.m30 + " , " + matrixVal.m31 + " , " + matrixVal.m32 + " , " + matrixVal.m30 + " )" : precisionStr + "4x4(" + parameterName + ")"; + // } + // break; + //} + } + break; + case WirePortDataType.FLOAT4x4: + { + Matrix4x4 matrixVal = useRealValue ? (Matrix4x4)value : Matrix4x4.identity; + switch( newType ) + { + case WirePortDataType.OBJECT: + { + result = ( useRealValue ) ? precisionStr + "4x4(" + matrixVal.m00 + " , " + matrixVal.m01 + " , " + matrixVal.m02 + " , " + matrixVal.m03 + " , " + + matrixVal.m10 + " , " + matrixVal.m11 + " , " + matrixVal.m12 + " , " + matrixVal.m10 + " , " + + matrixVal.m20 + " , " + matrixVal.m21 + " , " + matrixVal.m22 + " , " + matrixVal.m20 + " , " + + matrixVal.m30 + " , " + matrixVal.m31 + " , " + matrixVal.m32 + " , " + matrixVal.m30 + " )" : parameterName; + } + break; + } + } + break; + case WirePortDataType.COLOR: + { + Color colorValue = ( useRealValue ) ? (Color)value : Color.black; + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? precisionStr + "4( " + colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " )" : parameterName; break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? colorValue.r.ToString() : parameterName + ".r"; + } + break; + case WirePortDataType.FLOAT2: + { + result = ( useRealValue ) ? precisionStr + "2( " + colorValue.r + " , " + colorValue.g + " )" : parameterName + ".rg"; + } + break; + case WirePortDataType.FLOAT3: + { + result = ( useRealValue ) ? precisionStr + "3( " + colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " )" : parameterName + ".rgb"; + } + break; + case WirePortDataType.FLOAT4: + { + result = useRealValue ? precisionStr + "4( " + colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " )" : parameterName; + } + break; + //case WirePortDataType.FLOAT4x4: + //{ + // if ( useRealValue ) + // { + // result = precisionStr + "4x4( " + colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " , " + + // colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " , " + + // colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " , " + + // colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " )"; + // } + // else + // { + // string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, parameterName ); + // CurrentDataCollector.AddToLocalVariables( portCategory, -1, localVal ); + + // result = precisionStr + "4x4( " + localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w )"; + // } + //} + //break; + } + } + break; + case WirePortDataType.INT: + { + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? value.ToString() : parameterName; break; + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT3x3: + { + string localVal = CreateLocalValueName( currentPrecision, oldType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT4x4: + { + string localVal = CreateLocalValueName( currentPrecision, oldType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? ( (int)value ).ToString() : "(float)" + parameterName; + } + break; + } + } + break; + + } + if( result.Equals( string.Empty ) ) + { + result = "0"; + string warningStr = string.Format( "Unable to cast from {0} to {1}. Generating dummy data ( {2} )", oldType, newType, result ); + + if( oldType == WirePortDataType.SAMPLER1D || oldType == WirePortDataType.SAMPLER2D || oldType == WirePortDataType.SAMPLER3D || oldType == WirePortDataType.SAMPLERCUBE ) + { + warningStr = string.Format( "Unable to cast from {0} to {1}. You might want to use a Texture Sample node and connect it to the 'Tex' port. Generating dummy data ( {2} )", oldType, newType, result ); + } + ShowMessage( warningStr, MessageSeverity.Warning ); + } + return result; + } + + public static bool CanCast( WirePortDataType from, WirePortDataType to ) + { + if( from == WirePortDataType.OBJECT || to == WirePortDataType.OBJECT || from == to ) + return true; + + switch( from ) + { + case WirePortDataType.FLOAT: + { + if( to == WirePortDataType.INT ) + return true; + } + break; + case WirePortDataType.FLOAT2: + { + return false; + } + case WirePortDataType.FLOAT3: + { + if( to == WirePortDataType.COLOR || + to == WirePortDataType.FLOAT4 ) + return true; + } + break; + case WirePortDataType.FLOAT4: + { + if( to == WirePortDataType.FLOAT3 || + to == WirePortDataType.COLOR ) + return true; + } + break; + case WirePortDataType.FLOAT3x3: + { + if( to == WirePortDataType.FLOAT4x4 ) + return true; + } + break; + case WirePortDataType.FLOAT4x4: + { + if( to == WirePortDataType.FLOAT3x3 ) + return true; + } + break; + case WirePortDataType.COLOR: + { + if( to == WirePortDataType.FLOAT3 || + to == WirePortDataType.FLOAT4 ) + return true; + + } + break; + case WirePortDataType.INT: + { + if( to == WirePortDataType.FLOAT ) + return true; + } + break; + } + + return false; + } + + public static int GetChannelsAmount( WirePortDataType type ) + { + switch( type ) + { + case WirePortDataType.OBJECT: return 0; + case WirePortDataType.FLOAT: return 1; + case WirePortDataType.FLOAT2: return 2; + case WirePortDataType.FLOAT3: return 3; + case WirePortDataType.FLOAT4: return 4; + case WirePortDataType.FLOAT3x3: return 9; + case WirePortDataType.FLOAT4x4: return 16; + case WirePortDataType.COLOR: return 4; + case WirePortDataType.INT: return 1; + case WirePortDataType.UINT: return 1; + } + return 0; + } + + public static WirePortDataType GetWireTypeForChannelAmount( int channelAmount ) + { + switch( channelAmount ) + { + case 1: return WirePortDataType.FLOAT; + case 2: return WirePortDataType.FLOAT2; + case 3: return WirePortDataType.FLOAT3; + case 4: return WirePortDataType.FLOAT4; + case 9: return WirePortDataType.FLOAT3x3; + case 16: return WirePortDataType.FLOAT4x4; + } + return WirePortDataType.FLOAT; + } + + public static string GenerateUniformName( bool excludeUniformKeyword, WirePortDataType dataType, string dataName ) + { + return GenerateUniformName( excludeUniformKeyword, WirePortToCgType( dataType ), dataName ); + } + + public static string GenerateUniformName( bool excludeUniformKeyword, string dataType, string dataName ) + { + int index = excludeUniformKeyword ? 1 : 0; + return string.Format( Constants.UniformDec[index], dataType, dataName ); + } + + public static string GeneratePropertyName( string name, PropertyType propertyType, bool forceUnderscore = false ) + { + if( string.IsNullOrEmpty( name ) ) + return name; + + name = RemoveInvalidCharacters( name ); + if( propertyType != PropertyType.Global || forceUnderscore ) + { + if( name[ 0 ] != '_' ) + { + name = '_' + name; + } + } + + return name; + } + + public static string UrlReplaceInvalidStrings( string originalString ) + { + for( int i = 0; i < Constants.UrlReplacementStringValuesLen; i++ ) + { + originalString = originalString.Replace( Constants.UrlReplacementStringValues[i,0], Constants.UrlReplacementStringValues[i,1] ); + } + return originalString; + } + + public static string ReplaceInvalidStrings( string originalString ) + { + for(int i = 0; i< Constants.ReplacementStringValuesLen;i++ ) + { + originalString = originalString.Replace( Constants.ReplacementStringValues[i,0], Constants.ReplacementStringValues[ i, 1 ] ); + } + return originalString; + } + + public static string RemoveWikiInvalidCharacters( string originalString ) + { + for( int i = 0; i < Constants.WikiInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.WikiInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static string RemoveInvalidEnumCharacters( string originalString ) + { + for( int i = 0; i < Constants.EnumInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.EnumInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static string RemoveInvalidAttrCharacters( string originalString ) + { + for( int i = 0; i < Constants.AttrInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.AttrInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static string RemoveInvalidCharacters( string originalString ) + { + for( int i = 0; i < Constants.OverallInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.OverallInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static string RemoveShaderInvalidCharacters( string originalString ) + { + originalString = originalString.Replace( '\\', '/' ); + for( int i = 0; i < Constants.ShaderInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.ShaderInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static bool IsUnityNativeShader( Shader shader ) + { + string pathName = AssetDatabase.GetAssetPath( shader ); + + if( pathName.Contains( "unity_builtin_extra") || + pathName.Contains( "unity default resources" )) + return true; + + return false; + } + public static bool IsUnityNativeShader( string path ) { return m_unityNativeShaderPaths.ContainsKey( path ); } + + public static string GetComponentForPosition( int pos, WirePortDataType type, bool addDot = false ) + { + string result = addDot ? "." : string.Empty; + switch( pos ) + { + case 0: + { + return ( ( type == WirePortDataType.COLOR ) ? ( result + "r" ) : ( result + "x" ) ); + } + case 1: + { + return ( ( type == WirePortDataType.COLOR ) ? ( result + "g" ) : ( result + "y" ) ); + } + case 2: + { + return ( ( type == WirePortDataType.COLOR ) ? ( result + "b" ) : ( result + "z" ) ); + } + case 3: + { + return ( ( type == WirePortDataType.COLOR ) ? ( result + "a" ) : ( result + "w" ) ); + } + } + return string.Empty; + } + + public static string InvalidParameter( ParentNode node ) + { + ShowMessage( node.UniqueId, "Invalid entrance type on node" + node, MessageSeverity.Error ); + return "0"; + } + + public static string NoConnection( ParentNode node ) + { + ShowMessage( node.UniqueId, "No Input connection on node" + node, MessageSeverity.Error ); + return "0"; + } + + public static string UnknownError( ParentNode node ) + { + ShowMessage( node.UniqueId, "Unknown error on node" + node, MessageSeverity.Error ); + return "0"; + } + + public static string GetTex2DProperty( string name, TexturePropertyValues defaultValue ) { return name + "(\"" + name + "\", 2D) = \"" + defaultValue + "\" {}"; } + public static string AddBrackets( string value ) { return "( " + value + " )"; } + public static Color GetColorFromWireStatus( WireStatus status ) { return m_wireStatusToColor[ status ]; } + public static bool HasColorCategory( string category ) { return m_nodeCategoryToColor.ContainsKey( category ); } + public static void AddColorCategory( string category, Color color ) + { + m_nodeCategoryToColor.Add( category, color ); + } + + public static Color AddColorCategory( string category, string hexColor ) + { + try + { + Color color = new Color(); + ColorUtility.TryParseHtmlString( hexColor, out color ); + m_nodeCategoryToColor.Add( category, color ); + return color; + } + catch( System.Exception e ) + { + Debug.LogException( e ); + } + return m_nodeCategoryToColor[ "Default" ]; + } + + public static Color GetColorFromCategory( string category ) + { + if( m_nodeCategoryToColor.ContainsKey( category ) ) + return m_nodeCategoryToColor[ category ]; + + + if(DebugConsoleWindow.DeveloperMode) + Debug.LogWarning( category + " category does not contain an associated color" ); + + return m_nodeCategoryToColor[ "Default" ]; + } + + public static string LatestOpenedFolder + { + get { return m_latestOpenedFolder; } + set { m_latestOpenedFolder = value; } + } + + public static Shader CreateNewUnlit() + { + if( CurrentWindow == null ) + return null; + + string shaderName; + string pathName; + Shader newShader = null; + IOUtils.GetShaderName( out shaderName, out pathName, "MyUnlitShader", m_latestOpenedFolder ); + if( !System.String.IsNullOrEmpty( shaderName ) && !System.String.IsNullOrEmpty( pathName ) ) + { + CurrentWindow.CreateNewGraph( shaderName ); + CurrentWindow.PreMadeShadersInstance.FlatColorSequence.Execute(); + + CurrentWindow.CurrentGraph.CurrentMasterNode.SetName( shaderName ); + newShader = CurrentWindow.CurrentGraph.FireMasterNode( pathName, true ); + AssetDatabase.Refresh(); + } + return newShader; + } + + public static Shader CreateNewEmpty( string customPath = null , string customShaderName = null ) + { + if( CurrentWindow == null ) + return null; + + string shaderName; + string pathName; + Shader newShader = null; + + + string path = AssetDatabase.GetAssetPath( Selection.activeObject ); + if( path == "" ) + { + path = "Assets"; + } + else if( System.IO.Path.GetExtension( path ) != "" ) + { + path = path.Replace( System.IO.Path.GetFileName( AssetDatabase.GetAssetPath( Selection.activeObject ) ), "" ); + } + + + if( string.IsNullOrEmpty( customPath ) ) + { + IOUtils.GetShaderName( out shaderName, out pathName, Constants.DefaultShaderName, m_latestOpenedFolder ); + } + else + { + pathName = customPath; + if( string.IsNullOrEmpty( customShaderName ) ) + { + shaderName = Constants.DefaultShaderName; + int indexOfAssets = pathName.IndexOf( "Assets" ); + string uniquePath = ( indexOfAssets > 0 ) ? pathName.Remove( 0, indexOfAssets ) : pathName; + string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath( uniquePath + shaderName + ".shader" ); + pathName = assetPathAndName; + shaderName = assetPathAndName.Remove( 0, assetPathAndName.IndexOf( shaderName ) ); + } + else + { + shaderName = customShaderName; + } + shaderName = shaderName.Remove( shaderName.Length - 7 ); + } + if( !System.String.IsNullOrEmpty( shaderName ) && !System.String.IsNullOrEmpty( pathName ) ) + { + m_latestOpenedFolder = pathName; + + CurrentWindow.titleContent.text = AmplifyShaderEditorWindow.GenerateTabTitle( shaderName ); + CurrentWindow.titleContent.image = ShaderIcon; + CurrentWindow.CreateNewGraph( shaderName ); + CurrentWindow.LastOpenedLocation = pathName; + CurrentWindow.CurrentGraph.CurrentMasterNode.SetName( shaderName ); + newShader = CurrentWindow.CurrentGraph.FireMasterNode( pathName, true ); + AssetDatabase.Refresh(); + } + + return newShader; + } + + + public static Shader CreateNewEmptyTemplate( string templateGUID, string customPath = null, string customShaderName = null ) + { + if( CurrentWindow == null ) + return null; + + string shaderName; + string pathName; + Shader newShader = null; + + + string path = AssetDatabase.GetAssetPath( Selection.activeObject ); + if( path == "" ) + { + path = "Assets"; + } + else if( System.IO.Path.GetExtension( path ) != "" ) + { + path = path.Replace( System.IO.Path.GetFileName( AssetDatabase.GetAssetPath( Selection.activeObject ) ), "" ); + } + + + if( string.IsNullOrEmpty( customPath ) ) + { + IOUtils.GetShaderName( out shaderName, out pathName, Constants.DefaultShaderName, m_latestOpenedFolder ); + } + else + { + pathName = customPath; + if( string.IsNullOrEmpty( customShaderName ) ) + { + shaderName = Constants.DefaultShaderName; + int indexOfAssets = pathName.IndexOf( "Assets" ); + string uniquePath = ( indexOfAssets > 0 ) ? pathName.Remove( 0, indexOfAssets ) : pathName; + string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath( uniquePath + shaderName + ".shader" ); + pathName = assetPathAndName; + shaderName = assetPathAndName.Remove( 0, assetPathAndName.IndexOf( shaderName ) ); + } + else + { + shaderName = customShaderName; + } + shaderName = shaderName.Remove( shaderName.Length - 7 ); + } + if( !System.String.IsNullOrEmpty( shaderName ) && !System.String.IsNullOrEmpty( pathName ) ) + { + m_latestOpenedFolder = pathName; + + CurrentWindow.titleContent.text = AmplifyShaderEditorWindow.GenerateTabTitle( shaderName ); + CurrentWindow.titleContent.image = UIUtils.ShaderIcon; + CurrentWindow.CreateNewTemplateGraph( templateGUID ); + CurrentWindow.CurrentGraph.CurrentMasterNode.SetName( shaderName ); + newShader = CurrentWindow.CurrentGraph.FireMasterNode( pathName, true ); + AssetDatabase.Refresh(); + } + + return newShader; + } + + + public static void SetDelayedMaterialMode( Material material ) + { + if( CurrentWindow == null ) + return; + CurrentWindow.SetDelayedMaterialMode( material ); + } + + public static void CreateEmptyFromInvalid( Shader shader ) + { + if( CurrentWindow == null ) + return; + + CurrentWindow.CreateNewGraph( shader ); + CurrentWindow.ForceRepaint(); + } + + public static void CreateEmptyFunction( AmplifyShaderFunction shaderFunction ) + { + if( CurrentWindow == null ) + return; + + CurrentWindow.CreateNewFunctionGraph( shaderFunction ); + CurrentWindow.SaveToDisk( false ); + CurrentWindow.ForceRepaint(); + } + + public static void DrawFloat( UndoParentNode owner, ref Rect propertyDrawPos, ref float value, float newLabelWidth = 8 ) + { + float labelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = newLabelWidth; + value = owner.EditorGUIFloatField( propertyDrawPos, " ", value, UIUtils.MainSkin.textField ); + EditorGUIUtility.labelWidth = labelWidth; + } + + public static GUIStyle GetCustomStyle( CustomStyle style ) + { + return ( Initialized ) ? MainSkin.customStyles[ (int)style ] : null; + } + + public static void SetCustomStyle( CustomStyle style, GUIStyle guiStyle ) + { + if( MainSkin != null ) + MainSkin.customStyles[ (int)style ] = new GUIStyle( guiStyle ); + } + + public static void OpenFile() + { + if( CurrentWindow == null ) + return; + string newShader = EditorUtility.OpenFilePanel( "Select Shader to open", m_latestOpenedFolder, "shader" ); + if( !System.String.IsNullOrEmpty( newShader ) ) + { + m_latestOpenedFolder = newShader.Substring( 0, newShader.LastIndexOf( '/' ) + 1 ); + int relFilenameId = newShader.IndexOf( Application.dataPath ); + if( relFilenameId > -1 ) + { + string relFilename = newShader.Substring( relFilenameId + Application.dataPath.Length - 6 );// -6 need to also copy the assets/ part + CurrentWindow.LoadFromDisk( relFilename ); + } + else + { + ShowMessage( "Can only load shaders\nfrom inside the projects folder", MessageSeverity.Error ); + } + } + } + + public static bool DetectNodeLoopsFrom( ParentNode node, Dictionary<int, int> currentNodes ) + { + for( int i = 0; i < node.InputPorts.Count; i++ ) + { + if( node.InputPorts[ i ].IsConnected ) + { + ParentNode newNode = node.InputPorts[ i ].GetOutputNode(); + if( !currentNodes.ContainsKey( newNode.UniqueId ) ) + RecursiveNodeFill( newNode, currentNodes ); + } + } + + bool found = currentNodes.ContainsKey( node.UniqueId ); + currentNodes.Clear(); + currentNodes = null; + + return found; + } + + private static void RecursiveNodeFill( ParentNode node, Dictionary<int, int> currentNodes ) + { + if( !currentNodes.ContainsKey( node.UniqueId ) ) + currentNodes.Add( node.UniqueId, 1 ); + + for( int i = 0; i < node.InputPorts.Count; i++ ) + { + if( node.InputPorts[ i ].IsConnected ) + { + ParentNode newNode = node.InputPorts[ i ].GetOutputNode(); + if( !currentNodes.ContainsKey( newNode.UniqueId ) ) + RecursiveNodeFill( newNode, currentNodes ); + } + } + } + + public static ParentNode CreateNode( System.Type type, bool registerUndo, Vector2 pos, int nodeId = -1, bool addLast = true ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.CreateNode( type, registerUndo, pos, nodeId, addLast ); + } + return null; + } + + public static void DestroyNode( int nodeId ) + { + if( CurrentWindow != null ) + { + CurrentWindow.CurrentGraph.DestroyNode( nodeId ); + } + } + + public static void ShowMessage( int ownerId, string message, MessageSeverity severity = MessageSeverity.Normal, bool registerTimestamp = true ) + { + if( CurrentWindow != null ) + { + CurrentWindow.ShowMessage( ownerId, message, severity, registerTimestamp ); + } + } + + public static void ShowMessage( string message, MessageSeverity severity = MessageSeverity.Normal, bool registerTimestamp = true ) + { + if( CurrentWindow != null ) + { + CurrentWindow.ShowMessage( message, severity, registerTimestamp ); + } + } + + public static ParentNode GetNode( int nodeId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.GetNode( nodeId ); + } + return null; + } + + public static PropertyNode GetInternalTemplateNode( int nodeId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.GetInternalTemplateNode( nodeId ); + } + return null; + } + + public static PropertyNode GetInternalTemplateNode( string propertyName ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.GetInternalTemplateNode( propertyName ); + } + return null; + } + + + public static void DeleteConnection( bool isInput, int nodeId, int portId, bool registerOnLog, bool propagateCallback ) + { + if( CurrentWindow != null ) + { + CurrentWindow.DeleteConnection( isInput, nodeId, portId, registerOnLog, propagateCallback ); + } + } + + public static void ConnectInputToOutput( int inNodeId, int inPortId, int outNodeId, int outPortId ) + { + if( CurrentWindow != null ) + { + CurrentWindow.ConnectInputToOutput( inNodeId, inPortId, outNodeId, outPortId ); + } + } + + public static Shader CreateNewGraph( string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CreateNewGraph( name ); + } + return null; + } + public static void SetConnection( int InNodeId, int InPortId, int OutNodeId, int OutPortId ) + { + if( CurrentWindow != null ) + { + CurrentWindow.CurrentGraph.SetConnection( InNodeId, InPortId, OutNodeId, OutPortId ); + } + } + + public static bool IsChannelAvailable( int channelId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.IsChannelAvailable( channelId ); + } + return false; + } + + public static bool ReleaseUVChannel( int nodeId, int channelId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.ReleaseUVChannel( nodeId, channelId ); + } + return false; + } + + public static bool RegisterUVChannel( int nodeId, int channelId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.RegisterUVChannel( nodeId, channelId, name ); + } + return false; + } + + public static void GetFirstAvailableName( int nodeId, WirePortDataType type, out string outProperty, out string outInspector, bool useCustomPrefix = false, string customPrefix = null ) + { + outProperty = string.Empty; + outInspector = string.Empty; + if( CurrentWindow != null ) + { + CurrentWindow.DuplicatePrevBufferInstance.GetFirstAvailableName( nodeId, type, out outProperty, out outInspector, useCustomPrefix, customPrefix ); + } + } + + + public static bool IsNumericName( string name ) + { + Match match = Regex.Match( name, NumericNamePattern ); + if( match != null && match.Success ) + return true; + return false; + } + + public static bool CheckInvalidUniformName( string name ) + { + if( m_reservedPropertyNames.ContainsKey( name ) ) + { + ShowMessage( string.Format( Constants.ReservedPropertyNameStr, name ) ); + return true; + } + + if( IsNumericName( name )) + { + ShowMessage( string.Format( Constants.NumericPropertyNameStr, name ) ); + return true; + } + + return false; + } + + public static bool RegisterUniformName( int nodeId, string name ) + { + if( CheckInvalidUniformName( name ) ) + { + return false; + } + + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.RegisterUniformName( nodeId, name ); + } + return false; + } + + public static bool ReleaseUniformName( int nodeId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.ReleaseUniformName( nodeId, name ); + } + return false; + } + + public static bool IsUniformNameAvailable( string name ) + { + if( CheckInvalidUniformName( name ) ) + { + return false; + } + + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.IsUniformNameAvailable( name ); + } + return false; + } + + public static int CheckUniformNameOwner( string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.CheckUniformNameOwner( name ); + } + return -1; + } + + public static string GetUniqueUniformName( string name ) + { + int num = 0; + Regex reg = new Regex( @"([0-9]+)$" ); + Match match = reg.Match( name ); + if( match.Success ) + { + string s = match.Groups[ 1 ].Captures[ 0 ].Value; + num = int.Parse( s ); + name = name.Replace( s, "" ); + } + + for( int i = num + 1; i < 1000; i++ ) + { + string testName = name + i; + + if( CheckInvalidUniformName( testName ) ) + { + continue; + } + + if( CurrentWindow != null ) + { + if( CurrentWindow.DuplicatePrevBufferInstance.IsUniformNameAvailable( testName ) ) + { + return testName; + } + } + } + return name; + } + + public static bool RegisterLocalVariableName( int nodeId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.RegisterLocalVariableName( nodeId, name ); + } + return false; + } + + public static bool ReleaseLocalVariableName( int nodeId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.ReleaseLocalVariableName( nodeId, name ); + } + return false; + } + + public static bool IsLocalvariableNameAvailable( string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.IsLocalvariableNameAvailable( name ); + } + return false; + } + + public static string GetChannelName( int channelId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.GetChannelName( channelId ); + } + return string.Empty; + } + + public static void SetChannelName( int channelId, string name ) + { + if( CurrentWindow != null ) + { + CurrentWindow.DuplicatePrevBufferInstance.SetChannelName( channelId, name ); + } + } + + public static int RegisterFirstAvailableChannel( int nodeId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.RegisterFirstAvailableChannel( nodeId, name ); + } + return -1; + } + + public static int PortCategorytoAttayIdx( MasterNodePortCategory category ) + { + if( m_portCategoryToArrayIdx.ContainsKey( category )) + return m_portCategoryToArrayIdx[category]; + + return m_portCategoryToArrayIdx[ MasterNodePortCategory.Fragment ]; + } + + public static bool DisplayDialog( string shaderPath ) + { + string value = System.String.Format( "Save changes to the shader {0} before closing?", shaderPath ); + return EditorUtility.DisplayDialog( "Load selected", value, "Yes", "No" ); + } + + public static void ForceUpdateFromMaterial() + { + if( CurrentWindow != null ) + { + // CurrentWindow.Focus(); + CurrentWindow.ForceUpdateFromMaterial(); + } + } + + public static void MarkToRepaint() { if( CurrentWindow != null ) CurrentWindow.MarkToRepaint(); } + public static void RequestSave() { if( CurrentWindow != null ) CurrentWindow.RequestSave(); } + public static string FloatToString( float value ) + { + string floatStr = value.ToString(); + if( value % 1 == 0 ) + { + floatStr += ".0"; + } + return floatStr; + } + + public static int CurrentShaderVersion() + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.LoadedShaderVersion; + } + return -1; + } + + public static bool IsProperty( PropertyType type ) { return ( type == PropertyType.Property || type == PropertyType.InstancedProperty ); } + + public static MasterNode CurrentMasterNode() + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.CurrentMasterNode; + } + return null; + } + + public static void AddVirtualTextureCount() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.AddVirtualTextureCount(); } } + + public static bool HasVirtualTexture() + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.HasVirtualTexture; + } + return false; + } + + public static void RemoveVirtualTextureCount() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.RemoveVirtualTextureCount(); } } + + //public static void AddInstancePropertyCount() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.AddInstancePropertyCount(); } } + + public static bool IsInstancedShader() + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.IsInstancedShader; + } + return false; + } + + //public static void RemoveInstancePropertyCount() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.RemoveInstancePropertyCount(); } } + //public static void AddNormalDependentCount() { if ( CurrentWindow != null ) { CurrentWindow.CurrentGraph.AddNormalDependentCount(); } } + //public static void RemoveNormalDependentCount() { if ( CurrentWindow != null ) { CurrentWindow.CurrentGraph.RemoveNormalDependentCount(); } } + //public static bool IsNormalDependent() + //{ + // if ( CurrentWindow != null ) + // { + // return CurrentWindow.CurrentGraph.IsNormalDependent; + // } + // return false; + //} + + public static void CopyValuesFromMaterial( Material mat ) + { + if( CurrentWindow != null && CurrentWindow.CurrentMaterial == mat ) + { + CurrentWindow.CurrentGraph.CopyValuesFromMaterial( mat ); + } + else + { + int aseWindowCount = IOUtils.AllOpenedWindows.Count; + for( int i = 0; i < aseWindowCount; i++ ) + { + if( IOUtils.AllOpenedWindows[ i ] != m_currentWindow && IOUtils.AllOpenedWindows[ i ].CurrentMaterial == mat ) + { + IOUtils.AllOpenedWindows[ i ].CurrentGraph.CopyValuesFromMaterial( mat ); + break; + } + } + } + } + + // Sampler Node + public static void RegisterSamplerNode( SamplerNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.SamplerNodes.AddNode( node ); } } + public static void UnregisterSamplerNode( SamplerNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.SamplerNodes.RemoveNode( node ); } } + public static string[] SamplerNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.SamplerNodes.NodesArr; } return null; } + public static SamplerNode GetSamplerNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.SamplerNodes.GetNode( idx ); } return null; } + public static void UpdateSamplerDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.SamplerNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetSamplerNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.SamplerNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static int GetSamplerNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.SamplerNodes.NodesList.Count; } return -1; } + + // Float Node + public static void RegisterFloatIntNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FloatIntNodes.AddNode( node ); } } + public static void UnregisterFloatIntNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FloatIntNodes.RemoveNode( node ); } } + public static string[] FloatIntNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.NodesArr; } return null; } + public static int[] FloatIntNodeIds() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.NodeIds; } return null; } + public static PropertyNode GetFloatIntNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.GetNode( idx ); } return null; } + public static void UpdateFloatIntDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FloatIntNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetFloatIntNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static int GetNodeIdByName( string name ) + { + if( CurrentWindow != null ) + { + UsageListFloatIntNodes list = CurrentWindow.CurrentGraph.FloatIntNodes; + int count = list.Count; + for( int i = 0; i < count; i++ ) + { + if( list.NodesList[ i ].PropertyName.Equals( name ) ) + return list.NodesList[ i ].UniqueId; + } + } + return -1; + } + public static PropertyNode GetFloatIntNodeByUniqueId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.GetNodeByUniqueId( uniqueId ); } return null; } + //public static int GetFloatNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatNodes.NodesList.Count; } return -1; } + + // Texture Property + public static void RegisterTexturePropertyNode( TexturePropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TexturePropertyNodes.AddNode( node ); } } + public static void UnregisterTexturePropertyNode( TexturePropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TexturePropertyNodes.RemoveNode( node ); } } + public static string[] TexturePropertyNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TexturePropertyNodes.NodesArr; } return null; } + public static TexturePropertyNode GetTexturePropertyNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TexturePropertyNodes.GetNode( idx ); } return null; } + public static void UpdateTexturePropertyDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TexturePropertyNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetTexturePropertyNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TexturePropertyNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static int GetTexturePropertyNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TexturePropertyNodes.NodesList.Count; } return -1; } + + // Texture Array + public static void RegisterTextureArrayNode( TextureArrayNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TextureArrayNodes.AddNode( node ); } } + public static void UnregisterTextureArrayNode( TextureArrayNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TextureArrayNodes.RemoveNode( node ); } } + public static string[] TextureArrayNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TextureArrayNodes.NodesArr; } return null; } + public static TextureArrayNode GetTextureArrayNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TextureArrayNodes.GetNode( idx ); } return null; } + public static void UpdateTextureArrayDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TextureArrayNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetTextureArrayNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TextureArrayNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static int GetTextureArrayNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TextureArrayNodes.NodesList.Count; } return -1; } + + // Raw Property Node + public static void RegisterRawPropertyNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.OutsideGraph.RawPropertyNodes.AddNode( node ); } } + public static void UnregisterRawPropertyNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.OutsideGraph.RawPropertyNodes.RemoveNode( node ); } } + + // Property Node + public static void RegisterPropertyNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.PropertyNodes.AddNode( node ); } } + public static void UnregisterPropertyNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.PropertyNodes.RemoveNode( node ); } } + public static string[] PropertyNodeNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.NodesArr; } return null; } + public static PropertyNode GetPropertyNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.GetNode( idx ); } return null; } + public static PropertyNode GetPropertyNodeByUniqueId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.GetNodeByUniqueId( uniqueId ); } return null; } + public static void UpdatePropertyDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.PropertyNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetPropertyNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static List<PropertyNode> PropertyNodesList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.NodesList; } return null; } + public static int GetPropertyNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.NodesList.Count; } return -1; } + + // Function Inputs + public static void RegisterFunctionInputNode( FunctionInput node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionInputNodes.AddNode( node ); } } + public static void UnregisterFunctionInputNode( FunctionInput node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionInputNodes.RemoveNode( node ); } } + public static void UpdateFunctionInputData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionInputNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List<FunctionInput> FunctionInputList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionInputNodes.NodesList; } return null; } + + // Function Nodes + public static void RegisterFunctionNode( FunctionNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionNodes.AddNode( node ); } } + public static void UnregisterFunctionNode( FunctionNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionNodes.RemoveNode( node ); } } + public static void UpdateFunctionData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List<FunctionNode> FunctionList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionNodes.NodesList; } return null; } + + // Function Outputs + public static void RegisterFunctionOutputNode( FunctionOutput node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionOutputNodes.AddNode( node ); } } + public static void UnregisterFunctionOutputNode( FunctionOutput node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionOutputNodes.RemoveNode( node ); } } + public static void UpdateFunctionOutputData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionOutputNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List<FunctionOutput> FunctionOutputList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionOutputNodes.NodesList; } return null; } + + // Function Switches Copy + public static void RegisterFunctionSwitchCopyNode( FunctionSwitch node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchCopyNodes.AddNode( node ); } } + public static void UnregisterFunctionSwitchCopyNode( FunctionSwitch node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchCopyNodes.RemoveNode( node ); } } + public static void UpdateFunctionSwitchCopyData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchCopyNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List<FunctionSwitch> FunctionSwitchCopyList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchCopyNodes.NodesList; } return null; } + + // Function Switches + public static void RegisterFunctionSwitchNode( FunctionSwitch node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchNodes.AddNode( node ); } } + public static void UnregisterFunctionSwitchNode( FunctionSwitch node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchNodes.RemoveNode( node ); } } + public static void UpdateFunctionSwitchData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List<FunctionSwitch> FunctionSwitchList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchNodes.NodesList; } return null; } + public static void UpdateFunctionSwitchArr() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchNodes.UpdateNodeArr(); } } + public static string[] FunctionSwitchesNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchNodes.NodesArr; } return null; } + public static FunctionSwitch GetFunctionSwitchNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchNodes.GetNode( idx ); } return null; } + public static int GetFunctionSwitchNodeIndex( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + + // Screen Color Node + public static void RegisterScreenColorNode( ScreenColorNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.ScreenColorNodes.AddNode( node ); } } + public static void UnregisterScreenColorNode( ScreenColorNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.ScreenColorNodes.RemoveNode( node ); } } + public static string[] ScreenColorNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.ScreenColorNodes.NodesArr; } return null; } + public static ScreenColorNode GetScreenColorNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.ScreenColorNodes.GetNode( idx ); } return null; } + public static int GetScreenColorNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.ScreenColorNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static void UpdateScreenColorDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.ScreenColorNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetScreenColorNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.ScreenColorNodes.NodesList.Count; } return -1; } + + // Local Var Node + public static int RegisterLocalVarNode( RegisterLocalVarNode node ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.AddNode( node ); } return -1; } + public static void UnregisterLocalVarNode( RegisterLocalVarNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.LocalVarNodes.RemoveNode( node ); } } + public static string[] LocalVarNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.NodesArr; } return null; } + public static int LocalVarNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.NodesList.Count; } return 0; } + public static int GetLocalVarNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static RegisterLocalVarNode GetLocalVarNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.GetNode( idx ); } return null; } + public static void UpdateLocalVarDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.LocalVarNodes.UpdateDataOnNode( uniqueId, data ); } } + + //Global Array + public static void RegisterGlobalArrayNode( GlobalArrayNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.GlobalArrayNodes.AddNode( node ); } } + public static void UnregisterGlobalArrayNode( GlobalArrayNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.GlobalArrayNodes.RemoveNode( node ); } } + public static string[] GlobalArrayNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.GlobalArrayNodes.NodesArr; } return null; } + public static GlobalArrayNode GetGlobalArrayNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.GlobalArrayNodes.GetNode( idx ); } return null; } + public static int GetGlobalArrayNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.GlobalArrayNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static void UpdateGlobalArrayDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.GlobalArrayNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetGlobalArrayNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.GlobalArrayNodes.NodesList.Count; } return -1; } + + + public static void FocusOnNode( ParentNode node, float zoom, bool selectNode ) { if( CurrentWindow != null ) { CurrentWindow.FocusOnNode( node, zoom, selectNode ); } } + public static PrecisionType CurrentPrecision() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.CurrentPrecision; } return PrecisionType.Float; } + public static string CurrentPrecisionCg() { if( CurrentWindow != null ) { return m_precisionTypeToCg[ CurrentWindow.CurrentGraph.CurrentPrecision ]; } return m_precisionTypeToCg[ PrecisionType.Float ]; } + + public static PrecisionType GetFinalPrecision( PrecisionType precision ) + { + if( CurrentWindow != null && CurrentWindow.CurrentGraph != null ) + { + PrecisionType mainPrecision = CurrentWindow.CurrentGraph.CurrentPrecision; + if( (int)mainPrecision > (int)precision ) + return mainPrecision; + } + return precision; + } + + public static bool GetNodeAvailabilityInBitArray( int bitArray, NodeAvailability availability ) { return ( bitArray & (int)availability ) != 0; } + public static bool GetCategoryInBitArray( int bitArray, MasterNodePortCategory category ) { return ( bitArray & (int)category ) != 0; } + public static void SetCategoryInBitArray( ref int bitArray, MasterNodePortCategory category ) { bitArray = bitArray | (int)category; } + + public static int GetPriority( WirePortDataType type ) { return m_portPriority[ type ]; } + + public static void ShowIncompatiblePortMessage( bool fromInput, ParentNode inNode, WirePort inPort, ParentNode outNode, WirePort outPort ) + { + string inPortName = inPort.Name.Equals( Constants.EmptyPortValue ) ? inPort.PortId.ToString() : inPort.Name; + string outPortName = outPort.Name.Equals( Constants.EmptyPortValue ) ? outPort.PortId.ToString() : outPort.Name; + ShowMessage( outNode.UniqueId, string.Format( ( fromInput ? IncorrectInputConnectionErrorMsg : IncorrectOutputConnectionErrorMsg ), inPortName, inNode.Attributes.Name, inPort.DataType, outPort.DataType, outPortName, outNode.Attributes.Name ) ); + } + + public static void ShowNoVertexModeNodeMessage( ParentNode node ) + { + ShowMessage( node.UniqueId, string.Format( NoVertexModeNodeWarning, node.Attributes.Name ), MessageSeverity.Warning ); + } + + public static int TotalExampleMaterials { get { return m_exampleMaterialIDs.Count; } } + + public static int ShaderIndentLevel + { + get { return m_shaderIndentLevel; } + set + { + m_shaderIndentLevel = Mathf.Max( value, 0 ); + m_shaderIndentTabs = string.Empty; + for( int i = 0; i < m_shaderIndentLevel; i++ ) { m_shaderIndentTabs += "\t"; } + } + } + + public static string ShaderIndentTabs { get { return m_shaderIndentTabs; } } + public static void AddLineToShaderBody( ref string ShaderBody, string line ) { ShaderBody += m_shaderIndentTabs + line; } + public static void AddMultiLineToShaderBody( ref string ShaderBody, string[] lines ) + { + for( int i = 0; i < lines.Length; i++ ) + { + ShaderBody += m_shaderIndentTabs + lines[ i ]; + } + } + + public static void ClearUndoHelper() + { + m_undoHelper.Clear(); + } + + public static bool CheckUndoNode( ParentNode node ) + { + if( node == null ) + return false; + if( m_undoHelper.ContainsKey( node.UniqueId ) ) + { + return false; + } + + m_undoHelper.Add( node.UniqueId, node ); + EditorUtility.SetDirty( node ); + return true; + } + + public static void MarkUndoAction() + { + SerializeHelperCounter = 2; + } + + public static bool SerializeFromUndo() + { + if( SerializeHelperCounter > 0 ) + { + SerializeHelperCounter--; + return true; + } + return false; + } + + public static int GetKeywordId( string keyword ) + { + if( AvailableKeywordsDict.Count != AvailableKeywords.Length ) + { + AvailableKeywordsDict.Clear(); + for( int i = 1; i < AvailableKeywords.Length; i++ ) + { + AvailableKeywordsDict.Add( AvailableKeywords[ i ], i ); + } + } + + if( AvailableKeywordsDict.ContainsKey( keyword ) ) + { + return AvailableKeywordsDict[ keyword ]; + } + + return 0; + } + } +} |