瀏覽代碼

Resizing material array in Renderable inspector is now possible

BearishSun 10 年之前
父節點
當前提交
91caedafb5
共有 1 個文件被更改,包括 233 次插入229 次删除
  1. 233 229
      MBansheeEditor/Inspectors/RenderableInspector.cs

+ 233 - 229
MBansheeEditor/Inspectors/RenderableInspector.cs

@@ -1,230 +1,234 @@
-using System.Collections;
-using System.Collections.Generic;
-using BansheeEngine;
-
-namespace BansheeEditor
-{
-    /// <summary>
-    /// Renders an inspector for the <see cref="Renderable"/> component.
-    /// </summary>
-    [CustomInspector(typeof (Renderable))]
-    internal class RenderableInspector : Inspector
-    {
-        private GUIResourceField meshField;
-        private GUIListBoxField layersField;
-        private GUIArrayField<Material, MaterialArrayRow> materialsField;
-        private List<MaterialParamGUI[]> materialParams = new List<MaterialParamGUI[]>();
-
-        private ulong layersValue = 0;
-        private InspectableState modifyState;
-
-        private Material[] materials;
-        private GUILayout materialsLayout;
-
-        /// <inheritdoc/>
-        protected internal override void Initialize()
-        {
-            BuildGUI();
-        }
-
-        /// <inheritdoc/>
-        protected internal override InspectableState Refresh()
-        {
-            Renderable renderable = InspectedObject as Renderable;
-            if (renderable == null)
-                return InspectableState.NotModified;
-
-            bool rebuildMaterialsGUI = false;
-
-            Material[] newMaterials = renderable.Materials;
-            if (newMaterials == null)
-                rebuildMaterialsGUI = materials != null;
-            else
-            {
-                if (materials == null)
-                    rebuildMaterialsGUI = true;
-                else
-                {
-                    if (materials.Length != newMaterials.Length)
-                        rebuildMaterialsGUI = true;
-                    else
-                    {
-                        for (int i = 0; i < materials.Length; i++)
-                        {
-                            if (materials[i] != newMaterials[i])
-                            {
-                                rebuildMaterialsGUI = true;
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-
-            if (rebuildMaterialsGUI)
-                BuildMaterialsGUI();
-
-            meshField.Value = renderable.Mesh;
-
-            if (layersValue != renderable.Layers)
-            {
-                bool[] states = new bool[64];
-                for (int i = 0; i < states.Length; i++)
-                    states[i] = (renderable.Layers & Layers.Values[i]) == Layers.Values[i];
-
-                layersField.States = states;
-                layersValue = renderable.Layers;
-            }
-
-            InspectableState materialsModified = materialsField.Refresh();
-            if (materialsModified == InspectableState.Modified)
-                renderable.Materials = materials;
-
-            modifyState |= materialsModified;
-
-            if (materials != null)
-            {
-                for (int i = 0; i < materialParams.Count; i++)
-                {
-                    if (materialParams[i] != null)
-                    {
-                        foreach (var param in materialParams[i])
-                            param.Refresh(materials[i]);
-                    }
-                }
-            }
-
-            InspectableState oldState = modifyState;
-            if (modifyState.HasFlag(InspectableState.Modified))
-                modifyState = InspectableState.NotModified;
-
-            return oldState;
-        }
-
-        /// <summary>
-        /// Recreates all the GUI elements used by this inspector.
-        /// </summary>
-        private void BuildGUI()
-        {
-            Layout.Clear();
-
-            Renderable renderable = InspectedObject as Renderable;
-            if (renderable == null)
-                return;
-
-            meshField = new GUIResourceField(typeof(Mesh), new LocEdString("Mesh"));
-            layersField = new GUIListBoxField(Layers.Names, true, new LocEdString("Layers"));
-
-            Layout.AddElement(meshField);
-            Layout.AddElement(layersField);
-
-            layersValue = 0;
-            materials = renderable.Materials;
-            materialsField = GUIArrayField<Material, MaterialArrayRow>.Create(new LocEdString("Materials"), materials, Layout);
-
-            meshField.OnChanged += x =>
-            {
-                Mesh mesh = Resources.Load<Mesh>(x);
-                renderable.Mesh = mesh;
-
-                MarkAsModified();
-                ConfirmModify();
-            };
-
-            layersField.OnSelectionChanged += x =>
-            {
-                ulong layers = 0;
-                bool[] states = layersField.States;
-                for (int i = 0; i < states.Length; i++)
-                    layers |= states[i] ? Layers.Values[i] : 0;
-
-                layersValue = layers;
-                renderable.Layers = layers;
-
-                MarkAsModified();
-                ConfirmModify();
-            };
-
-            materialsLayout = Layout.AddLayoutY();
-            BuildMaterialsGUI();
-        }
-
-        /// <summary>
-        /// Builds the portion of the GUI that displays details about individual materials.
-        /// </summary>
-        private void BuildMaterialsGUI()
-        {
-            materialsLayout.Clear();
-
-            materialParams.Clear();
-            if (materials != null)
-            {
-                for (int i = 0; i < materials.Length; i++)
-                {
-                    if (materials[i] == null)
-                    {
-                        materialParams.Add(new MaterialParamGUI[0]);
-                        continue;
-                    }
-
-                    materialsLayout.AddSpace(10);
-
-                    MaterialParamGUI[] matParams = MaterialInspector.CreateMaterialGUI(materials[i], materialsLayout);
-                    materialParams.Add(matParams);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Marks the contents of the inspector as modified.
-        /// </summary>
-        protected void MarkAsModified()
-        {
-            modifyState |= InspectableState.ModifyInProgress;
-        }
-
-        /// <summary>
-        /// Confirms any queued modifications.
-        /// </summary>
-        protected void ConfirmModify()
-        {
-            if (modifyState.HasFlag(InspectableState.ModifyInProgress))
-                modifyState |= InspectableState.Modified;
-        }
-
-        /// <summary>
-        /// Row element used for displaying GUI for material array elements.
-        /// </summary>
-        public class MaterialArrayRow : GUIListFieldRow
-        {
-            private GUIResourceField materialField;
-
-            /// <inheritdoc/>
-            protected override GUILayoutX CreateGUI(GUILayoutY layout)
-            {
-                GUILayoutX titleLayout = layout.AddLayoutX();
-                materialField = new GUIResourceField(typeof(Material), new LocEdString(SeqIndex + ". "), 20);
-                titleLayout.AddElement(materialField);
-
-                materialField.OnChanged += x =>
-                {
-                    Material material = Resources.Load<Material>(x);
-
-                    SetValue(material);
-                    MarkAsModified();
-                    ConfirmModify();
-                };
-
-                return titleLayout;
-            }
-
-            /// <inheritdoc/>
-            internal protected override InspectableState Refresh()
-            {
-                materialField.Value = GetValue<Material>();
-
-                return base.Refresh();
-            }
-        }
-    }
+using System.Collections;
+using System.Collections.Generic;
+using BansheeEngine;
+
+namespace BansheeEditor
+{
+    /// <summary>
+    /// Renders an inspector for the <see cref="Renderable"/> component.
+    /// </summary>
+    [CustomInspector(typeof (Renderable))]
+    internal class RenderableInspector : Inspector
+    {
+        private GUIResourceField meshField;
+        private GUIListBoxField layersField;
+        private GUIArrayField<Material, MaterialArrayRow> materialsField;
+        private List<MaterialParamGUI[]> materialParams = new List<MaterialParamGUI[]>();
+
+        private ulong layersValue = 0;
+        private InspectableState modifyState;
+
+        private Material[] materials;
+        private GUILayout materialsLayout;
+
+        /// <inheritdoc/>
+        protected internal override void Initialize()
+        {
+            BuildGUI();
+        }
+
+        /// <inheritdoc/>
+        protected internal override InspectableState Refresh()
+        {
+            Renderable renderable = InspectedObject as Renderable;
+            if (renderable == null)
+                return InspectableState.NotModified;
+
+            bool rebuildMaterialsGUI = false;
+
+            Material[] newMaterials = renderable.Materials;
+            if (newMaterials == null)
+                rebuildMaterialsGUI = materials != null;
+            else
+            {
+                if (materials == null)
+                    rebuildMaterialsGUI = true;
+                else
+                {
+                    if (materials.Length != newMaterials.Length)
+                        rebuildMaterialsGUI = true;
+                    else
+                    {
+                        for (int i = 0; i < materials.Length; i++)
+                        {
+                            if (materials[i] != newMaterials[i])
+                            {
+                                rebuildMaterialsGUI = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (rebuildMaterialsGUI)
+            {
+                materials = renderable.Materials;
+                BuildMaterialsGUI();
+            }
+
+            meshField.Value = renderable.Mesh;
+
+            if (layersValue != renderable.Layers)
+            {
+                bool[] states = new bool[64];
+                for (int i = 0; i < states.Length; i++)
+                    states[i] = (renderable.Layers & Layers.Values[i]) == Layers.Values[i];
+
+                layersField.States = states;
+                layersValue = renderable.Layers;
+            }
+
+            InspectableState materialsModified = materialsField.Refresh();
+            if (materialsModified == InspectableState.Modified)
+                renderable.Materials = materials;
+
+            modifyState |= materialsModified;
+
+            if (materials != null)
+            {
+                for (int i = 0; i < materialParams.Count; i++)
+                {
+                    if (materialParams[i] != null)
+                    {
+                        foreach (var param in materialParams[i])
+                            param.Refresh(materials[i]);
+                    }
+                }
+            }
+
+            InspectableState oldState = modifyState;
+            if (modifyState.HasFlag(InspectableState.Modified))
+                modifyState = InspectableState.NotModified;
+
+            return oldState;
+        }
+
+        /// <summary>
+        /// Recreates all the GUI elements used by this inspector.
+        /// </summary>
+        private void BuildGUI()
+        {
+            Layout.Clear();
+
+            Renderable renderable = InspectedObject as Renderable;
+            if (renderable == null)
+                return;
+
+            meshField = new GUIResourceField(typeof(Mesh), new LocEdString("Mesh"));
+            layersField = new GUIListBoxField(Layers.Names, true, new LocEdString("Layers"));
+
+            Layout.AddElement(meshField);
+            Layout.AddElement(layersField);
+
+            layersValue = 0;
+            materials = renderable.Materials;
+            materialsField = GUIArrayField<Material, MaterialArrayRow>.Create(new LocEdString("Materials"), materials, Layout);
+            materialsField.OnChanged += x => renderable.Materials = x;
+
+            meshField.OnChanged += x =>
+            {
+                Mesh mesh = Resources.Load<Mesh>(x);
+                renderable.Mesh = mesh;
+
+                MarkAsModified();
+                ConfirmModify();
+            };
+
+            layersField.OnSelectionChanged += x =>
+            {
+                ulong layers = 0;
+                bool[] states = layersField.States;
+                for (int i = 0; i < states.Length; i++)
+                    layers |= states[i] ? Layers.Values[i] : 0;
+
+                layersValue = layers;
+                renderable.Layers = layers;
+
+                MarkAsModified();
+                ConfirmModify();
+            };
+
+            materialsLayout = Layout.AddLayoutY();
+            BuildMaterialsGUI();
+        }
+
+        /// <summary>
+        /// Builds the portion of the GUI that displays details about individual materials.
+        /// </summary>
+        private void BuildMaterialsGUI()
+        {
+            materialsLayout.Clear();
+
+            materialParams.Clear();
+            if (materials != null)
+            {
+                for (int i = 0; i < materials.Length; i++)
+                {
+                    if (materials[i] == null)
+                    {
+                        materialParams.Add(new MaterialParamGUI[0]);
+                        continue;
+                    }
+
+                    materialsLayout.AddSpace(10);
+
+                    MaterialParamGUI[] matParams = MaterialInspector.CreateMaterialGUI(materials[i], materialsLayout);
+                    materialParams.Add(matParams);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Marks the contents of the inspector as modified.
+        /// </summary>
+        protected void MarkAsModified()
+        {
+            modifyState |= InspectableState.ModifyInProgress;
+        }
+
+        /// <summary>
+        /// Confirms any queued modifications.
+        /// </summary>
+        protected void ConfirmModify()
+        {
+            if (modifyState.HasFlag(InspectableState.ModifyInProgress))
+                modifyState |= InspectableState.Modified;
+        }
+
+        /// <summary>
+        /// Row element used for displaying GUI for material array elements.
+        /// </summary>
+        public class MaterialArrayRow : GUIListFieldRow
+        {
+            private GUIResourceField materialField;
+
+            /// <inheritdoc/>
+            protected override GUILayoutX CreateGUI(GUILayoutY layout)
+            {
+                GUILayoutX titleLayout = layout.AddLayoutX();
+                materialField = new GUIResourceField(typeof(Material), new LocEdString(SeqIndex + ". "), 20);
+                titleLayout.AddElement(materialField);
+
+                materialField.OnChanged += x =>
+                {
+                    Material material = Resources.Load<Material>(x);
+
+                    SetValue(material);
+                    MarkAsModified();
+                    ConfirmModify();
+                };
+
+                return titleLayout;
+            }
+
+            /// <inheritdoc/>
+            internal protected override InspectableState Refresh()
+            {
+                materialField.Value = GetValue<Material>();
+
+                return base.Refresh();
+            }
+        }
+    }
 }
 }