Example #1
0
 private static string GetPropertyType(Shader s, int index)
 {
     UnityEditor.ShaderUtil.ShaderPropertyType propertyType = UnityEditor.ShaderUtil.GetPropertyType(s, index);
     if (propertyType == UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv)
     {
         return(CustomShaderInspector.kTextureTypes[( int )UnityEditor.ShaderUtil.GetTexDim(s, index)]);
     }
     return(CustomShaderInspector.kPropertyTypes[( int )propertyType]);
 }
Example #2
0
    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        IOUtils.Init();
        Material mat = materialEditor.target as Material;

        if (mat == null)
        {
            return;
        }

        m_instance = materialEditor;

        if (!m_initialized)
        {
            Init();
            m_initialized           = true;
            Undo.undoRedoPerformed += UndoRedoPerformed;
        }

        if (Event.current.type == EventType.Repaint &&
            mat.HasProperty(IOUtils.DefaultASEDirtyCheckId) &&
            mat.GetInt(IOUtils.DefaultASEDirtyCheckId) == 1)
        {
            mat.SetInt(IOUtils.DefaultASEDirtyCheckId, 0);
            UIUtils.ForceUpdateFromMaterial();
            //Event.current.Use();
        }

        if (materialEditor.isVisible)
        {
            GUILayout.BeginVertical();
            {
                GUILayout.Space(3);
                if (GUILayout.Button("Open in Shader Editor"))
                {
#if UNITY_2018_3_OR_NEWER
                    ASEPackageManagerHelper.SetupLateMaterial(mat);
#else
                    AmplifyShaderEditorWindow.LoadMaterialToASE(mat);
#endif
                }

                GUILayout.BeginHorizontal();
                {
                    if (GUILayout.Button(CopyButtonStr))
                    {
                        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

                        Shader shader        = mat.shader;
                        int    propertyCount = UnityEditor.ShaderUtil.GetPropertyCount(shader);
                        string allProperties = string.Empty;
                        for (int i = 0; i < propertyCount; i++)
                        {
                            UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType(shader, i);
                            string name     = UnityEditor.ShaderUtil.GetPropertyName(shader, i);
                            string valueStr = string.Empty;
                            switch (type)
                            {
                            case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
                            {
                                Color value = mat.GetColor(name);
                                valueStr = value.r.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.g.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.b.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.a.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
                            {
                                Vector4 value = mat.GetVector(name);
                                valueStr = value.x.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.y.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.z.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.w.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
                            {
                                float value = mat.GetFloat(name);
                                valueStr = value.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
                            {
                                float value = mat.GetFloat(name);
                                valueStr = value.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
                            {
                                Texture value = mat.GetTexture(name);
                                valueStr = AssetDatabase.GetAssetPath(value);
                                Vector2 offset = mat.GetTextureOffset(name);
                                Vector2 scale  = mat.GetTextureScale(name);
                                valueStr += IOUtils.VECTOR_SEPARATOR + scale.x.ToString() +
                                            IOUtils.VECTOR_SEPARATOR + scale.y.ToString() +
                                            IOUtils.VECTOR_SEPARATOR + offset.x.ToString() +
                                            IOUtils.VECTOR_SEPARATOR + offset.y.ToString();
                            }
                            break;
                            }

                            allProperties += name + IOUtils.FIELD_SEPARATOR + type + IOUtils.FIELD_SEPARATOR + valueStr;

                            if (i < (propertyCount - 1))
                            {
                                allProperties += IOUtils.LINE_TERMINATOR;
                            }
                        }
                        EditorPrefs.SetString(IOUtils.MAT_CLIPBOARD_ID, allProperties);
                        System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
                    }

                    if (GUILayout.Button(PasteButtonStr))
                    {
                        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
                        string propertiesStr = EditorPrefs.GetString(IOUtils.MAT_CLIPBOARD_ID, string.Empty);
                        if (!string.IsNullOrEmpty(propertiesStr))
                        {
                            string[] propertyArr = propertiesStr.Split(IOUtils.LINE_TERMINATOR);
                            bool     validData   = true;
                            try
                            {
                                for (int i = 0; i < propertyArr.Length; i++)
                                {
                                    string[] valuesArr = propertyArr[i].Split(IOUtils.FIELD_SEPARATOR);
                                    if (valuesArr.Length != 3)
                                    {
                                        Debug.LogWarning("Material clipboard data is corrupted");
                                        validData = false;
                                        break;
                                    }
                                    else if (mat.HasProperty(valuesArr[0]))
                                    {
                                        UnityEditor.ShaderUtil.ShaderPropertyType type = (UnityEditor.ShaderUtil.ShaderPropertyType)Enum.Parse(typeof(UnityEditor.ShaderUtil.ShaderPropertyType), valuesArr[1]);
                                        switch (type)
                                        {
                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
                                        {
                                            string[] colorVals = valuesArr[2].Split(IOUtils.VECTOR_SEPARATOR);
                                            if (colorVals.Length != 4)
                                            {
                                                Debug.LogWarning("Material clipboard data is corrupted");
                                                validData = false;
                                                break;
                                            }
                                            else
                                            {
                                                mat.SetColor(valuesArr[0], new Color(Convert.ToSingle(colorVals[0]),
                                                                                     Convert.ToSingle(colorVals[1]),
                                                                                     Convert.ToSingle(colorVals[2]),
                                                                                     Convert.ToSingle(colorVals[3])));
                                            }
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
                                        {
                                            string[] vectorVals = valuesArr[2].Split(IOUtils.VECTOR_SEPARATOR);
                                            if (vectorVals.Length != 4)
                                            {
                                                Debug.LogWarning("Material clipboard data is corrupted");
                                                validData = false;
                                                break;
                                            }
                                            else
                                            {
                                                mat.SetVector(valuesArr[0], new Vector4(Convert.ToSingle(vectorVals[0]),
                                                                                        Convert.ToSingle(vectorVals[1]),
                                                                                        Convert.ToSingle(vectorVals[2]),
                                                                                        Convert.ToSingle(vectorVals[3])));
                                            }
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
                                        {
                                            mat.SetFloat(valuesArr[0], Convert.ToSingle(valuesArr[2]));
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
                                        {
                                            mat.SetFloat(valuesArr[0], Convert.ToSingle(valuesArr[2]));
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
                                        {
                                            string[] texVals = valuesArr[2].Split(IOUtils.VECTOR_SEPARATOR);
                                            if (texVals.Length != 5)
                                            {
                                                Debug.LogWarning("Material clipboard data is corrupted");
                                                validData = false;
                                                break;
                                            }
                                            else
                                            {
                                                mat.SetTexture(valuesArr[0], AssetDatabase.LoadAssetAtPath <Texture>(texVals[0]));
                                                mat.SetTextureScale(valuesArr[0], new Vector2(Convert.ToSingle(texVals[1]), Convert.ToSingle(texVals[2])));
                                                mat.SetTextureOffset(valuesArr[0], new Vector2(Convert.ToSingle(texVals[3]), Convert.ToSingle(texVals[4])));
                                            }
                                        }
                                        break;
                                        }
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                Debug.LogException(e);
                                validData = false;
                            }


                            if (validData)
                            {
                                materialEditor.PropertiesChanged();
                                UIUtils.CopyValuesFromMaterial(mat);
                            }
                            else
                            {
                                EditorPrefs.SetString(IOUtils.MAT_CLIPBOARD_ID, string.Empty);
                            }
                        }
                        System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
                    }
                }
                GUILayout.EndHorizontal();
                GUILayout.Space(5);
            }
            GUILayout.EndVertical();
        }
        EditorGUI.BeginChangeCheck();
        //base.OnGUI( materialEditor, properties );

        // Draw custom properties instead of calling BASE to use single line texture properties
        materialEditor.SetDefaultGUIWidths();

        if (m_infoField == null)
        {
            m_infoField = typeof(MaterialEditor).GetField("m_InfoMessage", BindingFlags.Instance | BindingFlags.NonPublic);
        }

        string info = m_infoField.GetValue(materialEditor) as string;
        if (!string.IsNullOrEmpty(info))
        {
            EditorGUILayout.HelpBox(info, MessageType.Info);
        }
        else
        {
            GUIUtility.GetControlID("EditorTextField".GetHashCode(), FocusType.Passive, new Rect(0f, 0f, 0f, 0f));
        }

        for (int i = 0; i < properties.Length; i++)
        {
            if ((properties[i].flags & (MaterialProperty.PropFlags.HideInInspector | MaterialProperty.PropFlags.PerRendererData)) == MaterialProperty.PropFlags.None)
            {
                // Removed no scale offset one line texture property for consistency :( sad face
                //if( ( properties[ i ].flags & MaterialProperty.PropFlags.NoScaleOffset ) == MaterialProperty.PropFlags.NoScaleOffset )
                //{
                //	object obj = MaterialPropertyHandlerEx.GetHandler( mat.shader, properties[ i ].name );
                //	if( obj != null )
                //	{
                //		float height = MaterialPropertyHandlerEx.GetPropertyHeight( obj, properties[ i ], properties[ i ].displayName, materialEditor );
                //		//Rect rect = (Rect)materialEditor.GetType().InvokeMember( "GetPropertyRect", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, materialEditor, new object[] { properties[ i ], properties[ i ].displayName, true } );
                //		Rect rect = EditorGUILayout.GetControlRect( true, height, EditorStyles.layerMaskField );
                //		MaterialPropertyHandlerEx.OnGUI( obj, ref rect, properties[ i ], new GUIContent( properties[ i ].displayName ), materialEditor );

                //		if( MaterialPropertyHandlerEx.PropertyDrawer( obj ) != null )
                //			continue;

                //		rect = EditorGUILayout.GetControlRect( true, height, EditorStyles.layerMaskField );
                //		materialEditor.TexturePropertyMiniThumbnail( rect, properties[ i ], properties[ i ].displayName, string.Empty );
                //	}
                //	else
                //	{
                //		materialEditor.TexturePropertySingleLine( new GUIContent( properties[ i ].displayName ), properties[ i ] );
                //	}
                //}
                //else
                //{
                float propertyHeight = materialEditor.GetPropertyHeight(properties[i], properties[i].displayName);
                Rect  controlRect    = EditorGUILayout.GetControlRect(true, propertyHeight, EditorStyles.layerMaskField, new GUILayoutOption[0]);
                materialEditor.ShaderProperty(controlRect, properties[i], properties[i].displayName);
                //}
            }
        }

        EditorGUILayout.Space();
        materialEditor.RenderQueueField();
#if UNITY_5_6_OR_NEWER
        materialEditor.EnableInstancingField();
#endif
#if UNITY_5_6_2 || UNITY_5_6_3 || UNITY_5_6_4 || UNITY_2017_1_OR_NEWER
        materialEditor.DoubleSidedGIField();
#endif
        materialEditor.LightmapEmissionProperty();
        if (m_refreshOnUndo || EditorGUI.EndChangeCheck())
        {
            m_refreshOnUndo = false;

            string isEmissive = mat.GetTag("IsEmissive", false, "false");
            if (isEmissive.Equals("true"))
            {
                mat.globalIlluminationFlags &= (MaterialGlobalIlluminationFlags)3;
            }
            else
            {
                mat.globalIlluminationFlags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack;
            }

            UIUtils.CopyValuesFromMaterial(mat);
        }

        if (materialEditor.RequiresConstantRepaint() && m_lastRenderedTime + 0.032999999821186066 < EditorApplication.timeSinceStartup)
        {
            this.m_lastRenderedTime = EditorApplication.timeSinceStartup;
            materialEditor.Repaint();
        }
    }
    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        IOUtils.Init();
        Material mat = materialEditor.target as Material;

        if (mat == null)
        {
            return;
        }

        m_instance = materialEditor;


        if (Event.current.type == EventType.repaint &&
            mat.HasProperty(IOUtils.DefaultASEDirtyCheckId) &&
            mat.GetInt(IOUtils.DefaultASEDirtyCheckId) == 1)
        {
            mat.SetInt(IOUtils.DefaultASEDirtyCheckId, 0);
            UIUtils.ForceUpdateFromMaterial();
#if !UNITY_5_5_OR_NEWER
            Event.current.Use();
#endif
        }



        if (materialEditor.isVisible)
        {
            GUILayout.BeginVertical();
            {
                GUILayout.Space(3);
                if (GUILayout.Button("Open in Shader Editor"))
                {
                    AmplifyShaderEditorWindow.LoadMaterialToASE(mat);
                }

                GUILayout.BeginHorizontal();
                {
                    if (GUILayout.Button(CopyButtonStr))
                    {
                        Shader shader        = mat.shader;
                        int    propertyCount = UnityEditor.ShaderUtil.GetPropertyCount(shader);
                        string allProperties = string.Empty;
                        for (int i = 0; i < propertyCount; i++)
                        {
                            UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType(shader, i);
                            string name     = UnityEditor.ShaderUtil.GetPropertyName(shader, i);
                            string valueStr = string.Empty;
                            switch (type)
                            {
                            case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
                            {
                                Color value = mat.GetColor(name);
                                valueStr = value.r.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.g.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.b.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.a.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
                            {
                                Vector4 value = mat.GetVector(name);
                                valueStr = value.x.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.y.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.z.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.w.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
                            {
                                float value = mat.GetFloat(name);
                                valueStr = value.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
                            {
                                float value = mat.GetFloat(name);
                                valueStr = value.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
                            {
                                Texture value = mat.GetTexture(name);
                                valueStr = AssetDatabase.GetAssetPath(value);
                            }
                            break;
                            }

                            allProperties += name + IOUtils.FIELD_SEPARATOR + type + IOUtils.FIELD_SEPARATOR + valueStr;

                            if (i < (propertyCount - 1))
                            {
                                allProperties += IOUtils.LINE_TERMINATOR;
                            }
                        }
                        EditorPrefs.SetString(IOUtils.MAT_CLIPBOARD_ID, allProperties);
                    }

                    if (GUILayout.Button(PasteButtonStr))
                    {
                        string propertiesStr = EditorPrefs.GetString(IOUtils.MAT_CLIPBOARD_ID, string.Empty);
                        if (!string.IsNullOrEmpty(propertiesStr))
                        {
                            string[] propertyArr = propertiesStr.Split(IOUtils.LINE_TERMINATOR);
                            bool     validData   = true;
                            try
                            {
                                for (int i = 0; i < propertyArr.Length; i++)
                                {
                                    string[] valuesArr = propertyArr[i].Split(IOUtils.FIELD_SEPARATOR);
                                    if (valuesArr.Length != 3)
                                    {
                                        Debug.LogWarning("Material clipboard data is corrupted");
                                        validData = false;
                                        break;
                                    }
                                    else if (mat.HasProperty(valuesArr[0]))
                                    {
                                        UnityEditor.ShaderUtil.ShaderPropertyType type = (UnityEditor.ShaderUtil.ShaderPropertyType)Enum.Parse(typeof(UnityEditor.ShaderUtil.ShaderPropertyType), valuesArr[1]);
                                        switch (type)
                                        {
                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
                                        {
                                            string[] colorVals = valuesArr[2].Split(IOUtils.VECTOR_SEPARATOR);
                                            if (colorVals.Length != 4)
                                            {
                                                Debug.LogWarning("Material clipboard data is corrupted");
                                                validData = false;
                                                break;
                                            }
                                            else
                                            {
                                                mat.SetColor(valuesArr[0], new Color(Convert.ToSingle(colorVals[0]),
                                                                                     Convert.ToSingle(colorVals[1]),
                                                                                     Convert.ToSingle(colorVals[2]),
                                                                                     Convert.ToSingle(colorVals[3])));
                                            }
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
                                        {
                                            string[] vectorVals = valuesArr[2].Split(IOUtils.VECTOR_SEPARATOR);
                                            if (vectorVals.Length != 4)
                                            {
                                                Debug.LogWarning("Material clipboard data is corrupted");
                                                validData = false;
                                                break;
                                            }
                                            else
                                            {
                                                mat.SetVector(valuesArr[0], new Vector4(Convert.ToSingle(vectorVals[0]),
                                                                                        Convert.ToSingle(vectorVals[1]),
                                                                                        Convert.ToSingle(vectorVals[2]),
                                                                                        Convert.ToSingle(vectorVals[3])));
                                            }
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
                                        {
                                            mat.SetFloat(valuesArr[0], Convert.ToSingle(valuesArr[2]));
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
                                        {
                                            mat.SetFloat(valuesArr[0], Convert.ToSingle(valuesArr[2]));
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
                                        {
                                            mat.SetTexture(valuesArr[0], AssetDatabase.LoadAssetAtPath <Texture>(valuesArr[2]));
                                        }
                                        break;
                                        }
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                Debug.LogError(e);
                                validData = false;
                            }


                            if (validData)
                            {
                                materialEditor.PropertiesChanged();
                                UIUtils.CopyValuesFromMaterial(mat);
                            }
                            else
                            {
                                EditorPrefs.SetString(IOUtils.MAT_CLIPBOARD_ID, string.Empty);
                            }
                        }
                    }
                }
                GUILayout.EndHorizontal();
                GUILayout.Space(5);
            }
            GUILayout.EndVertical();
        }
        EditorGUI.BeginChangeCheck();
        base.OnGUI(materialEditor, properties);
        materialEditor.LightmapEmissionProperty();
        if (EditorGUI.EndChangeCheck())
        {
            //mat.globalIlluminationFlags &= ( MaterialGlobalIlluminationFlags ) 3;
            string isEmissive = mat.GetTag("IsEmissive", false, "false");
            if (isEmissive.Equals("true"))
            {
                mat.globalIlluminationFlags &= ( MaterialGlobalIlluminationFlags )3;
            }
            else
            {
                mat.globalIlluminationFlags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack;
            }

            UIUtils.CopyValuesFromMaterial(mat);
        }
    }
Example #4
0
        public void GetShaderInfoFromShaderAsset(ref string propertiesDecl, ref string propertiesSet)
        {
            bool fetchInitialInfo = false;

            if (m_currentShader == null)
            {
                Material mat = Selection.activeObject as Material;
                if (mat != null)
                {
                    m_currentShader = mat.shader;
                }
                else
                {
                    m_currentShader = Selection.activeObject as Shader;
                }
                fetchInitialInfo = true;
            }

            if (m_currentShader != null)
            {
                if (fetchInitialInfo)
                {
                    GetInitialInfo(m_currentShader);
                }

                if (m_dummyMaterial == null)
                {
                    m_dummyMaterial = new Material(m_currentShader);
                }
                else
                {
                    m_dummyMaterial.shader = m_currentShader;
                }

                int propertyCount = UnityEditor.ShaderUtil.GetPropertyCount(m_currentShader);
                //string allProperties = string.Empty;
                int validIds = 0;
                for (int i = 0; i < propertyCount; i++)
                {
                    UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType(m_currentShader, i);
                    string name = UnityEditor.ShaderUtil.GetPropertyName(m_currentShader, i);
                    //string description = UnityEditor.ShaderUtil.GetPropertyDescription( m_currentShader, i );
                    if (m_excludedProperties.ContainsKey(name))
                    {
                        continue;
                    }

                    string defaultValue     = string.Empty;
                    bool   nullPointerCheck = false;
                    switch (type)
                    {
                    case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
                    {
                        Color value = m_dummyMaterial.GetColor(name);
                        defaultValue = string.Format("value = new Color({0}f,{1}f,{2}f,{3}f)", value.r, value.g, value.b, value.a);
                    }
                    break;

                    case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
                    {
                        Vector4 value = m_dummyMaterial.GetVector(name);
                        defaultValue = string.Format("value = new Vector4({0}f,{1}f,{2}f,{3}f)", value.x, value.y, value.z, value.w);
                    }
                    break;

                    case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
                    {
                        float value = m_dummyMaterial.GetFloat(name);
                        defaultValue = "value = " + value + "f";
                    }
                    break;

                    case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
                    {
                        float value = m_dummyMaterial.GetFloat(name);
                        defaultValue = "value = " + value + "f";
                    }
                    break;

                    case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
                    {
                        nullPointerCheck = true;
                    }
                    break;
                    }

                    propertiesDecl += string.Format(PPSPropertyDecFormat, string.Empty, m_tooltips[validIds].Tooltip, ShaderPropertyToPPSType[type], name, defaultValue);
                    propertiesSet  += string.Format(nullPointerCheck ? PPSPropertySetNullPointerCheckFormat : PPSPropertySetFormat, ShaderPropertyToPPSSet[type], name);
                    validIds++;
                }
            }
        }
Example #5
0
    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        if (!m_initialized)
        {
            m_initialized         = true;
            m_linkStyle           = new GUIStyle(GUIStyle.none);
            m_linkStyle.alignment = TextAnchor.UpperCenter;

            m_lableStyle = new GUIStyle(GUI.skin.label);

            m_lableStyle.wordWrap  = true;
            m_lableStyle.alignment = TextAnchor.MiddleLeft;
            m_defaultImage         = AssetDatabase.LoadAssetAtPath <Texture2D>(AssetDatabase.GUIDToAssetPath("19890ee0a82f7a643b9077407a6da3db"));
            m_imageRatio           = (float)m_defaultImage.height / (float)m_defaultImage.width;
            m_maxheight            = m_defaultImage.height;

            m_textLink = new GUIStyle(GUI.skin.label);
            m_textLink.normal.textColor = Color.white;
            m_textLink.alignment        = TextAnchor.MiddleCenter;
            m_textLink.fontSize         = 9;
        }

        m_materialEditor = materialEditor;
        Material material = materialEditor.target as Material;

        if (m_fetchedImage != null)
        {
            m_button.image = m_fetchedImage;
            m_imageRatio   = (float)m_fetchedImage.height / (float)m_fetchedImage.width;
            m_maxheight    = m_fetchedImage.height;
        }
        else
        {
            m_button.image = m_defaultImage;
            m_imageRatio   = 0.31818f;
            m_maxheight    = 140;

            if (!m_imageLoaded)
            {
                m_imageLoaded = true;

                EditorApplication.update += EditorUpdateFetchInfo;
                coroutine = StartRequest(m_jsonURL);
            }
        }

        EditorGUILayout.BeginVertical("ObjectFieldThumb");
        {
            m_currheight = Mathf.Min(m_maxheight, (EditorGUIUtility.currentViewWidth - 30) * m_imageRatio);
            Rect buttonRect = EditorGUILayout.GetControlRect(false, m_currheight);
            EditorGUIUtility.AddCursorRect(buttonRect, MouseCursor.Link);
            if (GUI.Button(buttonRect, m_button, m_linkStyle))
            {
                Help.BrowseURL(m_info.affiliateLink);
            }
            GUILayout.BeginHorizontal();
            GUILayout.Label(m_info.message, m_lableStyle /*, GUILayout.MinHeight(40)*/);
            GUILayout.FlexibleSpace();
            GUILayout.BeginVertical();
            if (GUILayout.Button("Learn More", GUILayout.Height(25)))
            {
                Help.BrowseURL(m_info.affiliateLink);
            }
            Color cache = GUI.color;
            GUI.color = EditorGUIUtility.isProSkin ? LinkColorInPro : LinkColorInPersonal;
            if (GUILayout.Button("Affiliate Link", m_textLink))
            {
                AboutAffiliate.Init();
            }
            GUI.color = cache;
            GUILayout.EndVertical();
            GUILayout.EndHorizontal();
        }
        EditorGUILayout.EndVertical();

#if AMPLIFY_SHADER_EDITOR
        if (Event.current.type == EventType.Repaint &&
            material.HasProperty(IOUtils.DefaultASEDirtyCheckId) &&
            material.GetInt(IOUtils.DefaultASEDirtyCheckId) == 1)
        {
            material.SetInt(IOUtils.DefaultASEDirtyCheckId, 0);
            UIUtils.ForceUpdateFromMaterial();
#if !UNITY_5_5_OR_NEWER
            Event.current.Use();
#endif
        }

        if (GUILayout.Button("Open in Shader Editor"))
        {
            AmplifyShaderEditorWindow.LoadMaterialToASE(material);
        }

        GUILayout.BeginHorizontal();
        {
            if (GUILayout.Button("Copy Values"))
            {
                Shader shader        = material.shader;
                int    propertyCount = UnityEditor.ShaderUtil.GetPropertyCount(shader);
                string allProperties = string.Empty;
                for (int i = 0; i < propertyCount; i++)
                {
                    UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType(shader, i);
                    string name     = UnityEditor.ShaderUtil.GetPropertyName(shader, i);
                    string valueStr = string.Empty;
                    switch (type)
                    {
                    case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
                    {
                        Color value = material.GetColor(name);
                        valueStr = value.r.ToString() + IOUtils.VECTOR_SEPARATOR +
                                   value.g.ToString() + IOUtils.VECTOR_SEPARATOR +
                                   value.b.ToString() + IOUtils.VECTOR_SEPARATOR +
                                   value.a.ToString();
                    }
                    break;

                    case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
                    {
                        Vector4 value = material.GetVector(name);
                        valueStr = value.x.ToString() + IOUtils.VECTOR_SEPARATOR +
                                   value.y.ToString() + IOUtils.VECTOR_SEPARATOR +
                                   value.z.ToString() + IOUtils.VECTOR_SEPARATOR +
                                   value.w.ToString();
                    }
                    break;

                    case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
                    {
                        float value = material.GetFloat(name);
                        valueStr = value.ToString();
                    }
                    break;

                    case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
                    {
                        float value = material.GetFloat(name);
                        valueStr = value.ToString();
                    }
                    break;

                    case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
                    {
                        Texture value = material.GetTexture(name);
                        valueStr = AssetDatabase.GetAssetPath(value);
                    }
                    break;
                    }

                    allProperties += name + IOUtils.FIELD_SEPARATOR + type + IOUtils.FIELD_SEPARATOR + valueStr;

                    if (i < (propertyCount - 1))
                    {
                        allProperties += IOUtils.LINE_TERMINATOR;
                    }
                }
                EditorPrefs.SetString(IOUtils.MAT_CLIPBOARD_ID, allProperties);
            }

            if (GUILayout.Button("Paste Values"))
            {
                string propertiesStr = EditorPrefs.GetString(IOUtils.MAT_CLIPBOARD_ID, string.Empty);
                if (!string.IsNullOrEmpty(propertiesStr))
                {
                    string[] propertyArr = propertiesStr.Split(IOUtils.LINE_TERMINATOR);
                    bool     validData   = true;
                    try
                    {
                        for (int i = 0; i < propertyArr.Length; i++)
                        {
                            string[] valuesArr = propertyArr[i].Split(IOUtils.FIELD_SEPARATOR);
                            if (valuesArr.Length != 3)
                            {
                                Debug.LogWarning("Material clipboard data is corrupted");
                                validData = false;
                                break;
                            }
                            else if (material.HasProperty(valuesArr[0]))
                            {
                                UnityEditor.ShaderUtil.ShaderPropertyType type = (UnityEditor.ShaderUtil.ShaderPropertyType)Enum.Parse(typeof(UnityEditor.ShaderUtil.ShaderPropertyType), valuesArr[1]);
                                switch (type)
                                {
                                case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
                                {
                                    string[] colorVals = valuesArr[2].Split(IOUtils.VECTOR_SEPARATOR);
                                    if (colorVals.Length != 4)
                                    {
                                        Debug.LogWarning("Material clipboard data is corrupted");
                                        validData = false;
                                        break;
                                    }
                                    else
                                    {
                                        material.SetColor(valuesArr[0], new Color(Convert.ToSingle(colorVals[0]),
                                                                                  Convert.ToSingle(colorVals[1]),
                                                                                  Convert.ToSingle(colorVals[2]),
                                                                                  Convert.ToSingle(colorVals[3])));
                                    }
                                }
                                break;

                                case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
                                {
                                    string[] vectorVals = valuesArr[2].Split(IOUtils.VECTOR_SEPARATOR);
                                    if (vectorVals.Length != 4)
                                    {
                                        Debug.LogWarning("Material clipboard data is corrupted");
                                        validData = false;
                                        break;
                                    }
                                    else
                                    {
                                        material.SetVector(valuesArr[0], new Vector4(Convert.ToSingle(vectorVals[0]),
                                                                                     Convert.ToSingle(vectorVals[1]),
                                                                                     Convert.ToSingle(vectorVals[2]),
                                                                                     Convert.ToSingle(vectorVals[3])));
                                    }
                                }
                                break;

                                case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
                                {
                                    material.SetFloat(valuesArr[0], Convert.ToSingle(valuesArr[2]));
                                }
                                break;

                                case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
                                {
                                    material.SetFloat(valuesArr[0], Convert.ToSingle(valuesArr[2]));
                                }
                                break;

                                case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
                                {
                                    material.SetTexture(valuesArr[0], AssetDatabase.LoadAssetAtPath <Texture>(valuesArr[2]));
                                }
                                break;
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Debug.LogException(e);
                        validData = false;
                    }


                    if (validData)
                    {
                        materialEditor.PropertiesChanged();
                        UIUtils.CopyValuesFromMaterial(material);
                    }
                    else
                    {
                        EditorPrefs.SetString(IOUtils.MAT_CLIPBOARD_ID, string.Empty);
                    }
                }
            }
        }
        GUILayout.EndHorizontal();
        GUILayout.Space(5);
#endif

#if AMPLIFY_SHADER_EDITOR
        EditorGUI.BeginChangeCheck();
        ShaderPropertiesGUI(material, properties);
        if (EditorGUI.EndChangeCheck())
        {
            UIUtils.CopyValuesFromMaterial(material);
        }
#else
        ShaderPropertiesGUI(material, properties);
#endif
    }
Example #6
0
        /// <summary>
        /// Collect all meshes, materials and textures underneath the specified object and serialize them into the DataNode.
        /// </summary>

        static public void SerializeSharedResources(this GameObject go, DataNode node, bool includeInactive = false)
        {
            mFullSerialization = true;

            MeshFilter[]          filters = go.GetComponentsInChildren <MeshFilter>(includeInactive);
            MeshRenderer[]        rens    = go.GetComponentsInChildren <MeshRenderer>(includeInactive);
            SkinnedMeshRenderer[] sks     = go.GetComponentsInChildren <SkinnedMeshRenderer>(includeInactive);

            List <Material> materials = new List <Material>();
            List <Mesh>     meshes    = new List <Mesh>();

            foreach (MeshFilter f in filters)
            {
                Mesh m = f.sharedMesh;
                if (!meshes.Contains(m))
                {
                    meshes.Add(m);
                }
            }

            foreach (SkinnedMeshRenderer sk in sks)
            {
                Mesh m = sk.sharedMesh;
                if (!meshes.Contains(m))
                {
                    meshes.Add(m);
                }

                Material[] mats = sk.sharedMaterials;
                foreach (Material mt in mats)
                {
                    if (!materials.Contains(mt))
                    {
                        materials.Add(mt);
                    }
                }
            }

            foreach (MeshRenderer r in rens)
            {
                Material[] mats = r.sharedMaterials;
                foreach (Material m in mats)
                {
                    if (!materials.Contains(m))
                    {
                        materials.Add(m);
                    }
                }
            }

            if (materials.size == 0 && meshes.size == 0)
            {
                return;
            }

#if UNITY_EDITOR
            List <Texture> textures = new List <Texture>();

            for (int i = 0; i < materials.size; ++i)
            {
                Material mat = materials[i];
                Shader   s   = mat.shader;
                if (s == null)
                {
                    continue;
                }

                string matPath = UnityTools.LocateResource(mat);
                if (!string.IsNullOrEmpty(matPath))
                {
                    continue;
                }

                int props = UnityEditor.ShaderUtil.GetPropertyCount(s);

                for (int b = 0; b < props; ++b)
                {
                    string propName = UnityEditor.ShaderUtil.GetPropertyName(s, b);
                    UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType(s, b);
                    if (type != UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv)
                    {
                        continue;
                    }
                    Texture tex = mat.GetTexture(propName);
                    if (tex != null && !textures.Contains(tex))
                    {
                        textures.Add(tex);
                    }
                }
            }

            for (int i = 0; i < textures.size; ++i)
            {
                Texture tex = textures[i];
                tex.Serialize(node.AddChild("Texture", tex.GetInstanceID()));
            }
#endif

            for (int i = 0; i < materials.size; ++i)
            {
                Material mat = materials[i];
                mat.Serialize(node.AddChild("Material", mat.GetInstanceID()), false);
            }

            for (int i = 0; i < meshes.size; ++i)
            {
                Mesh mesh = meshes[i];
                mesh.Serialize(node.AddChild("Mesh", mesh.GetInstanceID()));
            }
        }
Example #7
0
        /// <summary>
        /// Serialize the specified material into its DataNode format.
        /// </summary>

        static public void Serialize(this Material mat, DataNode node, bool serializeTextures)
        {
            if (!mFullSerialization)
            {
                return;
            }

            node.AddChild("name", mat.name);
            string path = UnityTools.LocateResource(mat);

            if (!string.IsNullOrEmpty(path))
            {
                node.AddChild("path", path);
                return;
            }

            Shader s = mat.shader;

            if (s != null)
            {
                node.AddChild("shader", s.name);
#if UNITY_EDITOR
                int props = UnityEditor.ShaderUtil.GetPropertyCount(s);

                for (int b = 0; b < props; ++b)
                {
                    string propName = UnityEditor.ShaderUtil.GetPropertyName(s, b);
                    UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType(s, b);

                    if (type == UnityEditor.ShaderUtil.ShaderPropertyType.Color)
                    {
                        node.AddChild(propName, mat.GetColor(propName));
                    }
                    else if (type == UnityEditor.ShaderUtil.ShaderPropertyType.Vector)
                    {
                        node.AddChild(propName, mat.GetVector(propName));
                    }
                    else if (type == UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv)
                    {
                        Texture tex = mat.GetTexture(propName);

                        if (tex != null)
                        {
                            DataNode sub = new DataNode(propName, tex.GetInstanceID());
                            if (serializeTextures)
                            {
                                tex.Serialize(sub);
                            }
                            sub.AddChild("offset", mat.GetTextureOffset(propName));
                            sub.AddChild("scale", mat.GetTextureScale(propName));
                            node.children.Add(sub);
                        }
                    }
                    else
                    {
                        node.AddChild(propName, mat.GetFloat(propName));
                    }
                }
#endif
            }
        }
    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        IOUtils.Init();
        Material mat = materialEditor.target as Material;

        if (mat == null)
        {
            return;
        }

        m_instance = materialEditor;


        if (Event.current.type == EventType.Repaint &&
            mat.HasProperty(IOUtils.DefaultASEDirtyCheckId) &&
            mat.GetInt(IOUtils.DefaultASEDirtyCheckId) == 1)
        {
            mat.SetInt(IOUtils.DefaultASEDirtyCheckId, 0);
            UIUtils.ForceUpdateFromMaterial();
#if !UNITY_5_5_OR_NEWER
            Event.current.Use();
#endif
        }



        if (materialEditor.isVisible)
        {
            GUILayout.BeginVertical();
            {
                GUILayout.Space(3);
                if (GUILayout.Button("Open in Shader Editor"))
                {
                    AmplifyShaderEditorWindow.LoadMaterialToASE(mat);
                }

                GUILayout.BeginHorizontal();
                {
                    if (GUILayout.Button(CopyButtonStr))
                    {
                        Shader shader        = mat.shader;
                        int    propertyCount = UnityEditor.ShaderUtil.GetPropertyCount(shader);
                        string allProperties = string.Empty;
                        for (int i = 0; i < propertyCount; i++)
                        {
                            UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType(shader, i);
                            string name     = UnityEditor.ShaderUtil.GetPropertyName(shader, i);
                            string valueStr = string.Empty;
                            switch (type)
                            {
                            case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
                            {
                                Color value = mat.GetColor(name);
                                valueStr = value.r.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.g.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.b.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.a.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
                            {
                                Vector4 value = mat.GetVector(name);
                                valueStr = value.x.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.y.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.z.ToString() + IOUtils.VECTOR_SEPARATOR +
                                           value.w.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
                            {
                                float value = mat.GetFloat(name);
                                valueStr = value.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
                            {
                                float value = mat.GetFloat(name);
                                valueStr = value.ToString();
                            }
                            break;

                            case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
                            {
                                Texture value = mat.GetTexture(name);
                                valueStr = AssetDatabase.GetAssetPath(value);
                            }
                            break;
                            }

                            allProperties += name + IOUtils.FIELD_SEPARATOR + type + IOUtils.FIELD_SEPARATOR + valueStr;

                            if (i < (propertyCount - 1))
                            {
                                allProperties += IOUtils.LINE_TERMINATOR;
                            }
                        }
                        EditorPrefs.SetString(IOUtils.MAT_CLIPBOARD_ID, allProperties);
                    }

                    if (GUILayout.Button(PasteButtonStr))
                    {
                        string propertiesStr = EditorPrefs.GetString(IOUtils.MAT_CLIPBOARD_ID, string.Empty);
                        if (!string.IsNullOrEmpty(propertiesStr))
                        {
                            string[] propertyArr = propertiesStr.Split(IOUtils.LINE_TERMINATOR);
                            bool     validData   = true;
                            try
                            {
                                for (int i = 0; i < propertyArr.Length; i++)
                                {
                                    string[] valuesArr = propertyArr[i].Split(IOUtils.FIELD_SEPARATOR);
                                    if (valuesArr.Length != 3)
                                    {
                                        Debug.LogWarning("Material clipboard data is corrupted");
                                        validData = false;
                                        break;
                                    }
                                    else if (mat.HasProperty(valuesArr[0]))
                                    {
                                        UnityEditor.ShaderUtil.ShaderPropertyType type = (UnityEditor.ShaderUtil.ShaderPropertyType)Enum.Parse(typeof(UnityEditor.ShaderUtil.ShaderPropertyType), valuesArr[1]);
                                        switch (type)
                                        {
                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Color:
                                        {
                                            string[] colorVals = valuesArr[2].Split(IOUtils.VECTOR_SEPARATOR);
                                            if (colorVals.Length != 4)
                                            {
                                                Debug.LogWarning("Material clipboard data is corrupted");
                                                validData = false;
                                                break;
                                            }
                                            else
                                            {
                                                mat.SetColor(valuesArr[0], new Color(Convert.ToSingle(colorVals[0]),
                                                                                     Convert.ToSingle(colorVals[1]),
                                                                                     Convert.ToSingle(colorVals[2]),
                                                                                     Convert.ToSingle(colorVals[3])));
                                            }
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Vector:
                                        {
                                            string[] vectorVals = valuesArr[2].Split(IOUtils.VECTOR_SEPARATOR);
                                            if (vectorVals.Length != 4)
                                            {
                                                Debug.LogWarning("Material clipboard data is corrupted");
                                                validData = false;
                                                break;
                                            }
                                            else
                                            {
                                                mat.SetVector(valuesArr[0], new Vector4(Convert.ToSingle(vectorVals[0]),
                                                                                        Convert.ToSingle(vectorVals[1]),
                                                                                        Convert.ToSingle(vectorVals[2]),
                                                                                        Convert.ToSingle(vectorVals[3])));
                                            }
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Float:
                                        {
                                            mat.SetFloat(valuesArr[0], Convert.ToSingle(valuesArr[2]));
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.Range:
                                        {
                                            mat.SetFloat(valuesArr[0], Convert.ToSingle(valuesArr[2]));
                                        }
                                        break;

                                        case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv:
                                        {
                                            mat.SetTexture(valuesArr[0], AssetDatabase.LoadAssetAtPath <Texture>(valuesArr[2]));
                                        }
                                        break;
                                        }
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                Debug.LogException(e);
                                validData = false;
                            }


                            if (validData)
                            {
                                materialEditor.PropertiesChanged();
                                UIUtils.CopyValuesFromMaterial(mat);
                            }
                            else
                            {
                                EditorPrefs.SetString(IOUtils.MAT_CLIPBOARD_ID, string.Empty);
                            }
                        }
                    }
                }
                GUILayout.EndHorizontal();
                GUILayout.Space(5);
            }
            GUILayout.EndVertical();
        }
        EditorGUI.BeginChangeCheck();
        //base.OnGUI( materialEditor, properties );

        // Draw custom properties instead of calling BASE to use single line texture properties
        materialEditor.SetDefaultGUIWidths();
        FieldInfo field     = typeof(MaterialEditor).GetField("m_InfoMessage", BindingFlags.Instance | BindingFlags.NonPublic);
        string    infoField = field.GetValue(materialEditor) as string;
        if (!string.IsNullOrEmpty(infoField))
        {
            EditorGUILayout.HelpBox(infoField, MessageType.Info);
        }
        else
        {
            GUIUtility.GetControlID("EditorTextField".GetHashCode(), FocusType.Passive, new Rect(0f, 0f, 0f, 0f));
        }
        for (int i = 0; i < properties.Length; i++)
        {
            if ((properties[i].flags & (MaterialProperty.PropFlags.HideInInspector | MaterialProperty.PropFlags.PerRendererData)) == MaterialProperty.PropFlags.None)
            {
                if ((properties[i].flags & MaterialProperty.PropFlags.NoScaleOffset) == MaterialProperty.PropFlags.NoScaleOffset)
                {
                    materialEditor.TexturePropertySingleLine(new GUIContent(properties[i].displayName), properties[i]);
                }
                else
                {
                    float propertyHeight = materialEditor.GetPropertyHeight(properties[i], properties[i].displayName);
                    Rect  controlRect    = EditorGUILayout.GetControlRect(true, propertyHeight, EditorStyles.layerMaskField, new GUILayoutOption[0]);
                    materialEditor.ShaderProperty(controlRect, properties[i], properties[i].displayName);
                }
            }
        }
#if UNITY_5_5_2 || UNITY_5_5_3 || UNITY_5_5_4 || UNITY_5_5_5 || UNITY_5_6_OR_NEWER
        EditorGUILayout.Space();
        EditorGUILayout.Space();
        materialEditor.RenderQueueField();
#endif
#if UNITY_5_6_OR_NEWER
        materialEditor.EnableInstancingField();
#endif
#if UNITY_5_6_2 || UNITY_5_6_3 || UNITY_5_6_4 || UNITY_2017_1_OR_NEWER
        materialEditor.DoubleSidedGIField();
#endif
        materialEditor.LightmapEmissionProperty();
        if (EditorGUI.EndChangeCheck())
        {
            //mat.globalIlluminationFlags &= ( MaterialGlobalIlluminationFlags ) 3;
            string isEmissive = mat.GetTag("IsEmissive", false, "false");
            if (isEmissive.Equals("true"))
            {
                mat.globalIlluminationFlags &= ( MaterialGlobalIlluminationFlags )3;
            }
            else
            {
                mat.globalIlluminationFlags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack;
            }

            UIUtils.CopyValuesFromMaterial(mat);
        }
    }