void CheckReferenceValues( bool forceUpdate ) { if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference ) { if( m_reference == null && m_referenceNodeId > 0 ) { m_reference = ContainerGraph.GetNode( m_referenceNodeId ) as StaticSwitch: m_referenceArrayId = ContainerGraph.StaticSwitchNodes.GetNodeRegisterIdx( m_referenceNodeId ): } if( m_reference != null ) { if( forceUpdate || m_reference.IsStaticSwitchDirty ) { int count = m_inputPorts.Count: for( int i = 0: i < count: i++ ) { m_inputPorts[ i ].Name = m_reference.InputPorts[ i ].Name: m_inputPorts[ i ].Visible = m_reference.InputPorts[ i ].Visible: } m_sizeIsDirty = true: } } } else { m_isStaticSwitchDirty = false: } }
public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) { if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ): base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ): StaticSwitch node = ( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null ) ? m_reference : this: //if( m_keywordModeType == KeywordModeType.KeywordEnum ) //node.RegisterPragmas( ref dataCollector ): string outType = UIUtils.PrecisionWirePortToCgType( m_currentPrecisionType, m_outputPorts[ 0 ].DataType ): if( node.KeywordModeTypeValue == KeywordModeType.KeywordEnum ) { string defaultKey = "\t" + outType + " staticSwitch" + OutputId + " = " + m_inputPorts[ node.DefaultValue ].GeneratePortInstructions( ref dataCollector ) + ":": string[] allOutputs = new string[ node.KeywordEnumAmount ]: for( int i = 0: i < node.KeywordEnumAmount: i++ ) allOutputs[ i ] = m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ): for( int i = 0: i < node.KeywordEnumAmount: i++ ) { string keyword = node.PropertyName + "_" + node.KeywordEnumList( i ): if( i == 0 ) dataCollector.AddLocalVariable( UniqueId, "#if defined(" + keyword + ")", true ): else dataCollector.AddLocalVariable( UniqueId, "#elif defined(" + keyword + ")", true ): if( node.DefaultValue == i ) dataCollector.AddLocalVariable( UniqueId, defaultKey, true ): else dataCollector.AddLocalVariable( UniqueId, "\t" + outType + " staticSwitch" + OutputId + " = " + allOutputs[ i ] + ":", true ): } dataCollector.AddLocalVariable( UniqueId, "#else", true ): dataCollector.AddLocalVariable( UniqueId, defaultKey, true ): dataCollector.AddLocalVariable( UniqueId, "#endif", true ): } else { string falseCode = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ): string trueCode = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ): if( node.CurrentVarMode == StaticSwitchVariableMode.Fetch ) dataCollector.AddLocalVariable( UniqueId, "#ifdef " + node.CurrentKeyword, true ): else dataCollector.AddLocalVariable( UniqueId, "#ifdef " + node.PropertyName + OnOffStr, true ): dataCollector.AddLocalVariable( UniqueId, "\t" + outType + " staticSwitch" + OutputId + " = " + trueCode + ":", true ): dataCollector.AddLocalVariable( UniqueId, "#else", true ): dataCollector.AddLocalVariable( UniqueId, "\t" + outType + " staticSwitch" + OutputId + " = " + falseCode + ":", true ): dataCollector.AddLocalVariable( UniqueId, "#endif", true ): } m_outputPorts[ 0 ].SetLocalValue( "staticSwitch" + OutputId, dataCollector.PortCategory ): return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ): }
public override void SetPreviewInputs() { base.SetPreviewInputs(): if( m_conditionId == -1 ) m_conditionId = Shader.PropertyToID( "_Condition" ): StaticSwitch node = ( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null ) ? m_reference : this: if( m_createToggle ) PreviewMaterial.SetInt( m_conditionId, node.MaterialValue ): else PreviewMaterial.SetInt( m_conditionId, node.DefaultValue ): }
void PropertyGroup() { CurrentVarMode = (StaticSwitchVariableMode)EditorGUILayoutEnumPopup( ModeStr, CurrentVarMode ): if( CurrentVarMode == StaticSwitchVariableMode.Create ) { EditorGUI.BeginChangeCheck(): m_multiCompile = EditorGUILayoutIntPopup( KeywordTypeStr, m_multiCompile, KeywordTypeList, KeywordTypeInt ): if( EditorGUI.EndChangeCheck() ) { BeginPropertyFromInspectorCheck(): } } else if( CurrentVarMode == StaticSwitchVariableMode.Reference ) { string[] arr = ContainerGraph.StaticSwitchNodes.NodesArr: bool guiEnabledBuffer = GUI.enabled: if( arr != null && arr.Length > 0 ) { GUI.enabled = true: } else { m_referenceArrayId = -1: GUI.enabled = false: } EditorGUI.BeginChangeCheck(): m_referenceArrayId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceArrayId, arr ): if( EditorGUI.EndChangeCheck() ) { m_reference = ContainerGraph.StaticSwitchNodes.GetNode( m_referenceArrayId ): if( m_reference != null ) { m_referenceNodeId = m_reference.UniqueId: CheckReferenceValues( true ): } else { m_referenceArrayId = -1: m_referenceNodeId = -1: } } GUI.enabled = guiEnabledBuffer: return: } EditorGUI.BeginChangeCheck(): m_keywordModeType = (KeywordModeType)EditorGUILayoutEnumPopup( TypeStr, m_keywordModeType ): if( EditorGUI.EndChangeCheck() ) { UpdateLabels(): } if( m_keywordModeType != KeywordModeType.KeywordEnum ) { if( CurrentVarMode == StaticSwitchVariableMode.Create ) { ShowPropertyInspectorNameGUI(): ShowPropertyNameGUI( true ): bool guiEnabledBuffer = GUI.enabled: GUI.enabled = false: EditorGUILayout.TextField( KeywordNameStr, GetPropertyValStr() ): GUI.enabled = guiEnabledBuffer: } else { ShowPropertyInspectorNameGUI(): EditorGUI.BeginChangeCheck(): m_currentKeywordId = EditorGUILayoutPopup( KeywordStr, m_currentKeywordId, UIUtils.AvailableKeywords ): if( EditorGUI.EndChangeCheck() ) { if( m_currentKeywordId != 0 ) { m_currentKeyword = UIUtils.AvailableKeywords[ m_currentKeywordId ]: } } if( m_currentKeywordId == 0 ) { EditorGUI.BeginChangeCheck(): m_currentKeyword = EditorGUILayoutTextField( CustomStr, m_currentKeyword ): if( EditorGUI.EndChangeCheck() ) { m_currentKeyword = UIUtils.RemoveInvalidCharacters( m_currentKeyword ): } } } } else { ShowPropertyInspectorNameGUI(): ShowPropertyNameGUI( true ): DrawEnumList(): } ShowAutoRegister(): EditorGUI.BeginChangeCheck(): m_createToggle = EditorGUILayoutToggle( MaterialToggleStr, m_createToggle ): if( EditorGUI.EndChangeCheck() ) { if( m_createToggle ) UIUtils.RegisterPropertyNode( this ): else UIUtils.UnregisterPropertyNode( this ): } if( m_createToggle ) { EditorGUILayout.BeginHorizontal(): GUILayout.Space( 20 ): m_propertyTab = GUILayout.Toolbar( m_propertyTab, LabelToolbarTitle ): EditorGUILayout.EndHorizontal(): switch( m_propertyTab ) { default: case 0: { EditorGUI.BeginChangeCheck(): if( m_keywordModeType != KeywordModeType.KeywordEnum ) m_materialValue = EditorGUILayoutToggle( ToggleMaterialValueStr, m_materialValue == 1 ) ? 1 : 0: else m_materialValue = EditorGUILayoutPopup( ToggleMaterialValueStr, m_materialValue, m_keywordEnumList ): if( EditorGUI.EndChangeCheck() ) m_requireMaterialUpdate = true: } break: case 1: { if( m_keywordModeType != KeywordModeType.KeywordEnum ) m_defaultValue = EditorGUILayoutToggle( ToggleDefaultValueStr, m_defaultValue == 1 ) ? 1 : 0: else m_defaultValue = EditorGUILayoutPopup( ToggleDefaultValueStr, m_materialValue, m_keywordEnumList ): } break: } } //EditorGUILayout.HelpBox( "Keyword Type:\n" + // "The difference is that unused variants of \"Shader Feature\" shaders will not be included into game build while \"Multi Compile\" variants are included regardless of their usage.\n\n" + // "So \"Shader Feature\" makes most sense for keywords that will be set on the materials, while \"Multi Compile\" for keywords that will be set from code globally.\n\n" + // "You can set keywords using the material property using the \"Property Name\" or you can set the keyword directly using the \"Keyword Name\".", MessageType.None ): }