Bladeren bron

Feature: Added a way for the user to change material variation from the inspector

BearishSun 6 jaren geleden
bovenliggende
commit
162e096618

+ 56 - 0
Source/EditorManaged/Inspectors/MaterialInspector.cs

@@ -18,6 +18,7 @@ namespace bs.Editor
     internal class MaterialInspector : Inspector
     internal class MaterialInspector : Inspector
     {
     {
         private MaterialParamGUI[] guiParams;
         private MaterialParamGUI[] guiParams;
+        private MaterialVariationGUI guiVariations;
         private GUIResourceField shaderField;
         private GUIResourceField shaderField;
         private GUIEnumField builtinShaderField;
         private GUIEnumField builtinShaderField;
         private Material material;
         private Material material;
@@ -107,12 +108,17 @@ namespace bs.Editor
                 guiParams = null;
                 guiParams = null;
             }
             }
 
 
+            guiVariations = null;
+
             Layout.Clear();
             Layout.Clear();
             Layout.AddElement(builtinShaderField);
             Layout.AddElement(builtinShaderField);
             Layout.AddElement(shaderField);
             Layout.AddElement(shaderField);
 
 
             if (material != null && material.Shader != null)
             if (material != null && material.Shader != null)
+            {
+                guiVariations = new MaterialVariationGUI(material, Layout);
                 guiParams = CreateMaterialGUI(material, "", null, Layout);
                 guiParams = CreateMaterialGUI(material, "", null, Layout);
+            }
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -201,6 +207,56 @@ namespace bs.Editor
         }
         }
     }
     }
 
 
+    /// <summary>
+    /// Draws GUI that allows the user to change the active shader variation for a material.
+    /// </summary>
+    internal class MaterialVariationGUI
+    {
+        private Material material;
+        private ShaderVariation variation;
+
+        /// <summary>
+        /// Creates necessary GUI elements for selecting a material variation.
+        /// </summary>
+        /// <param name="material">Material for which to provide variation selection.</param>
+        /// <param name="layout">GUI layout to which to append GUI elements.</param>
+        internal MaterialVariationGUI(Material material, GUILayout layout)
+        {
+            this.material = material;
+            variation = material.Variation;
+
+            Shader shader = material.Shader.Value;
+            if (shader == null)
+                return;
+
+            ShaderVariationParamInfo[] variationParams = shader.VariationParams;
+            foreach (var param in variationParams)
+            {
+                if (param.isInternal)
+                    continue;
+
+                LocString[] names = new LocString[param.values.Length];
+                int[] values = new int[names.Length];
+                for (int i = 0; i < names.Length; i++)
+                {
+                    names[i] = new LocEdString(param.values[i].name);
+                    values[i] = param.values[i].value;
+                }
+
+                GUIListBoxField listBox = new GUIListBoxField(names, new LocEdString(param.name));
+                listBox.OnSelectionChanged += idx =>
+                {
+                    int value = values[idx];
+                    variation.SetInt(param.identifier, value);
+
+                    material.Variation = variation;
+                };
+
+                layout.AddElement(listBox);
+            }
+        }
+    }
+
     /// <summary>
     /// <summary>
     /// Contains GUI element(s) for a single parameter in a <see cref="Material"/>.
     /// Contains GUI element(s) for a single parameter in a <see cref="Material"/>.
     /// </summary>
     /// </summary>

+ 5 - 0
Source/EditorManaged/Inspectors/RenderableInspector.cs

@@ -17,6 +17,7 @@ namespace bs.Editor
     internal class RenderableInspector : Inspector
     internal class RenderableInspector : Inspector
     {
     {
         private List<MaterialParamGUI[]> materialParams = new List<MaterialParamGUI[]>();
         private List<MaterialParamGUI[]> materialParams = new List<MaterialParamGUI[]>();
+        private List<MaterialVariationGUI> materialVariations = new List<MaterialVariationGUI>();
 
 
         private RRef<Material>[] materials;
         private RRef<Material>[] materials;
         private GUILayout materialsLayout;
         private GUILayout materialsLayout;
@@ -140,6 +141,7 @@ namespace bs.Editor
             materialsLayout.Clear();
             materialsLayout.Clear();
 
 
             materialParams.Clear();
             materialParams.Clear();
+            materialVariations.Clear();
             if (materials != null && materials.Length > 0)
             if (materials != null && materials.Length > 0)
             {
             {
                 for (int i = 0; i < materials.Length; i++)
                 for (int i = 0; i < materials.Length; i++)
@@ -170,6 +172,9 @@ namespace bs.Editor
                         continue;
                         continue;
                     }
                     }
 
 
+                    MaterialVariationGUI variationGUI = new MaterialVariationGUI(material, materialLayout);
+                    materialVariations.Add(variationGUI);
+
                     MaterialParamGUI[] matParams = MaterialInspector.CreateMaterialGUI(material,
                     MaterialParamGUI[] matParams = MaterialInspector.CreateMaterialGUI(material,
                         "materialParams[" + i + "]", null, materialLayout);
                         "materialParams[" + i + "]", null, materialLayout);
                     materialParams.Add(matParams);
                     materialParams.Add(matParams);

+ 1 - 1
Source/bsf

@@ -1 +1 @@
-Subproject commit 8511971782f1efae351e61782f9653ee377baaf1
+Subproject commit 5059c2b9287eed5fe1aee2e17c34f1b626bb7520