Esempio n. 1
0
        public override void ReadFromString(ref string[] nodeParams)
        {
            // This node is, by default, created with one input port
            base.ReadFromString(ref nodeParams);
            m_code          = GetCurrentParam(ref nodeParams);
            m_code          = m_code.Replace(LineFeedSeparator, '\n');
            m_code          = m_code.Replace(SemiColonSeparator, ';');
            m_outputTypeIdx = Convert.ToInt32(GetCurrentParam(ref nodeParams));
            if (m_outputTypeIdx >= AvailableWireTypes.Length)
            {
                UIUtils.ShowMessage("Sampler types were removed as a valid output custom expression type");
                m_outputTypeIdx = 1;
            }
            UpdateVoidMode();
            m_outputPorts[0].ChangeType(AvailableWireTypes[m_outputTypeIdx], false);

            if (UIUtils.CurrentShaderVersion() > 12001)
            {
                bool mode = Convert.ToBoolean(GetCurrentParam(ref nodeParams));
                m_mode = mode ? CustomExpressionMode.Call : CustomExpressionMode.Create;
                if (m_mode == CustomExpressionMode.Call || m_voidMode)
                {
                    m_firstAvailablePort = 1;
                    AddInputPortAt(0, WirePortDataType.FLOAT, false, DefaultInputName);
                }
            }

            int count = Convert.ToInt32(GetCurrentParam(ref nodeParams));

            if (count == 0)
            {
                DeleteInputPortByArrayIdx(0);
                m_foldoutValuesLabels.Clear();
                m_variableQualifiers.Clear();
            }
            else
            {
                for (int i = 0; i < count; i++)
                {
                    bool               foldoutValue = Convert.ToBoolean(GetCurrentParam(ref nodeParams));
                    string             name         = GetCurrentParam(ref nodeParams);
                    WirePortDataType   type         = (WirePortDataType)Enum.Parse(typeof(WirePortDataType), GetCurrentParam(ref nodeParams));
                    string             internalData = GetCurrentParam(ref nodeParams);
                    VariableQualifiers qualifier    = VariableQualifiers.In;
                    if (UIUtils.CurrentShaderVersion() > 12001)
                    {
                        qualifier = (VariableQualifiers)Enum.Parse(typeof(VariableQualifiers), GetCurrentParam(ref nodeParams));
                    }

                    int portIdx = i + m_firstAvailablePort;
                    if (i == 0)
                    {
                        m_inputPorts[portIdx].ChangeProperties(name, type, false);
                        m_variableQualifiers[0] = qualifier;
                        m_foldoutValuesFlags[0] = foldoutValue;
                    }
                    else
                    {
                        m_foldoutValuesLabels.Add("[" + i + "]");
                        m_variableQualifiers.Add(qualifier);
                        m_foldoutValuesFlags.Add(foldoutValue);
                        AddInputPort(type, false, name);
                    }
                    m_inputPorts[i].InternalData = internalData;
                }
            }

            if (UIUtils.CurrentShaderVersion() > 7205)
            {
                m_customExpressionName = GetCurrentParam(ref nodeParams);
                SetTitleText(m_customExpressionName);
            }

            if (UIUtils.CurrentShaderVersion() > 14401)
            {
                m_generateUniqueName = Convert.ToBoolean(GetCurrentParam(ref nodeParams));
            }

            if (UIUtils.CurrentShaderVersion() > 15102)
            {
                m_autoRegisterMode = Convert.ToBoolean(GetCurrentParam(ref nodeParams));
            }

            if (m_autoRegisterMode)
            {
                m_containerGraph.CustomExpressionOnFunctionMode.AddNode(this);
            }
            UpdateOutputPorts();

            m_repopulateNameDictionary = true;
            m_functionMode             = m_code.Contains(ReturnHelper);
            CheckCallMode();
        }
Esempio n. 2
0
        void DrawInputs()
        {
            int count = m_inputPorts.Count - m_firstAvailablePort;

            for (int i = 0; i < count; i++)
            {
                int portIdx = i + m_firstAvailablePort;
                m_foldoutValuesFlags[i] = EditorGUILayoutFoldout(m_foldoutValuesFlags[i], m_foldoutValuesLabels[i] + " - " + m_inputPorts[portIdx].Name);

                if (m_foldoutValuesFlags[i])
                {
                    EditorGUI.indentLevel += 1;

                    //Qualifier
                    // bool guiEnabled = GUI.enabled;
                    // GUI.enabled = m_functionMode;

                    VariableQualifiers newQualifier = (VariableQualifiers)EditorGUILayoutPopup(InputQualifierStr, (int)m_variableQualifiers[i], QualifiersStr);
                    if (newQualifier != m_variableQualifiers[i])
                    {
                        VariableQualifiers oldQualifier = m_variableQualifiers[i];
                        m_variableQualifiers[i] = newQualifier;
                        if (newQualifier == VariableQualifiers.In)
                        {
                            RemoveOutputPort(CreateOutputId(m_inputPorts[portIdx].PortId), false);
                        }
                        else if (oldQualifier == VariableQualifiers.In)
                        {
                            AddOutputPort(m_inputPorts[portIdx].DataType, m_inputPorts[portIdx].Name, CreateOutputId(m_inputPorts[portIdx].PortId));
                        }
                        RecalculateInOutOutputPorts();
                    }

                    //GUI.enabled = guiEnabled;

                    // Type
                    int typeIdx = WireToIdx[m_inputPorts[portIdx].DataType];
                    EditorGUI.BeginChangeCheck();
                    {
                        typeIdx = EditorGUILayoutPopup(InputTypeStr, typeIdx, AvailableWireTypesStr);
                    }

                    if (EditorGUI.EndChangeCheck())
                    {
                        m_inputPorts[portIdx].ChangeType(AvailableWireTypes[typeIdx], false);
                        if (m_variableQualifiers[i] != VariableQualifiers.In)
                        {
                            OutputPort currOutPort = GetOutputPortByUniqueId(CreateOutputId(m_inputPorts[portIdx].PortId));
                            currOutPort.ChangeType(AvailableWireTypes[typeIdx], false);
                        }
                    }

                    //Name
                    EditorGUI.BeginChangeCheck();
                    {
                        m_inputPorts[portIdx].Name = EditorGUILayoutTextField(InputNameStr, m_inputPorts[portIdx].Name);
                    }
                    if (EditorGUI.EndChangeCheck())
                    {
                        m_nameModified             = true;
                        m_lastTimeNameModified     = EditorApplication.timeSinceStartup;
                        m_inputPorts[portIdx].Name = UIUtils.RemoveInvalidCharacters(m_inputPorts[portIdx].Name);
                        if (string.IsNullOrEmpty(m_inputPorts[portIdx].Name))
                        {
                            m_inputPorts[portIdx].Name = DefaultInputName + i;
                        }
                    }

                    // Port Data
                    if (!m_inputPorts[portIdx].IsConnected)
                    {
                        m_inputPorts[portIdx].ShowInternalData(this, true, InputValueStr);
                    }

                    EditorGUILayout.BeginHorizontal();
                    {
                        GUILayout.Label(" ");
                        // Add new port
                        if (GUILayoutButton(string.Empty, UIUtils.PlusStyle, GUILayout.Width(ButtonLayoutWidth)))
                        {
                            AddPortAt(portIdx);
                            EditorGUI.FocusTextInControl(null);
                        }

                        //Remove port
                        if (GUILayoutButton(string.Empty, UIUtils.MinusStyle, GUILayout.Width(ButtonLayoutWidth)))
                        {
                            m_markedToDelete = portIdx;
                        }
                    }
                    EditorGUILayout.EndHorizontal();

                    EditorGUI.indentLevel -= 1;
                }
            }

            if (m_markedToDelete > -1)
            {
                RemovePortAt(m_markedToDelete);
                m_markedToDelete = -1;
                EditorGUI.FocusTextInControl(null);
            }
        }