RenderableInspector.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using BansheeEngine;
  4. namespace BansheeEditor
  5. {
  6. /// <summary>
  7. /// Renders an inspector for the <see cref="Renderable"/> component.
  8. /// </summary>
  9. [CustomInspector(typeof (Renderable))]
  10. internal class RenderableInspector : Inspector
  11. {
  12. private GUIResourceField meshField;
  13. private GUIListBoxField layersField;
  14. private GUIArrayField materialsField = new GUIArrayField();
  15. private List<MaterialParamGUI[]> materialParams = new List<MaterialParamGUI[]>();
  16. private ulong layersValue = 0;
  17. private Material[] materials;
  18. /// <inheritdoc/>
  19. protected internal override void Initialize()
  20. {
  21. BuildGUI();
  22. }
  23. /// <inheritdoc/>
  24. protected internal override bool Refresh()
  25. {
  26. Renderable renderable = referencedObject as Renderable;
  27. if (renderable == null)
  28. return false;
  29. bool rebuildGUI = false;
  30. Material[] newMaterials = renderable.Materials;
  31. if (newMaterials == null)
  32. rebuildGUI = materials != null;
  33. else
  34. {
  35. if (materials == null)
  36. rebuildGUI = true;
  37. else
  38. {
  39. if (materials.Length != newMaterials.Length)
  40. rebuildGUI = true;
  41. else
  42. {
  43. for (int i = 0; i < materials.Length; i++)
  44. {
  45. if (materials[i] != newMaterials[i])
  46. {
  47. rebuildGUI = true;
  48. break;
  49. }
  50. }
  51. }
  52. }
  53. }
  54. if (rebuildGUI)
  55. BuildGUI();
  56. bool anythingModified = materialsField.Refresh();
  57. if (meshField.Value != renderable.Mesh)
  58. {
  59. meshField.Value = renderable.Mesh;
  60. anythingModified = true;
  61. }
  62. if (layersValue != renderable.Layers)
  63. {
  64. bool[] states = new bool[64];
  65. for (int i = 0; i < states.Length; i++)
  66. states[i] = (renderable.Layers & Layers.Values[i]) == Layers.Values[i];
  67. layersField.States = states;
  68. layersValue = renderable.Layers;
  69. anythingModified = true;
  70. }
  71. if (materials != null)
  72. {
  73. for (int i = 0; i < materialParams.Count; i++)
  74. {
  75. if (materialParams[i] != null)
  76. {
  77. foreach (var param in materialParams[i])
  78. anythingModified |= param.Refresh(materials[i]);
  79. }
  80. }
  81. }
  82. return anythingModified;
  83. }
  84. /// <summary>
  85. /// Recreates all the GUI elements used by this inspector.
  86. /// </summary>
  87. private void BuildGUI()
  88. {
  89. layout.Clear();
  90. Renderable renderable = referencedObject as Renderable;
  91. if (renderable == null)
  92. return;
  93. meshField = new GUIResourceField(typeof(Mesh), new LocEdString("Mesh"));
  94. layersField = new GUIListBoxField(Layers.Names, true, new LocEdString("Layers"));
  95. layout.AddElement(meshField);
  96. layout.AddElement(layersField);
  97. layersValue = 0;
  98. materials = renderable.Materials;
  99. materialsField.Update<MaterialArrayRow, Material>(new LocEdString("Materials"), materials, layout);
  100. materialsField.OnChanged += x =>
  101. {
  102. renderable.Materials = (Material[])x;
  103. BuildGUI();
  104. Refresh();
  105. };
  106. meshField.OnChanged += x => renderable.Mesh = x as Mesh;
  107. layersField.OnSelectionChanged += x =>
  108. {
  109. ulong layers = 0;
  110. bool[] states = layersField.States;
  111. for (int i = 0; i < states.Length; i++)
  112. layers |= states[i] ? Layers.Values[i] : 0;
  113. layersValue = layers;
  114. renderable.Layers = layers;
  115. };
  116. materialParams.Clear();
  117. if (materials != null)
  118. {
  119. for (int i = 0; i < materials.Length; i++)
  120. {
  121. if (materials[i] == null)
  122. {
  123. materialParams.Add(new MaterialParamGUI[0]);
  124. continue;
  125. }
  126. layout.AddSpace(10);
  127. MaterialParamGUI[] matParams = MaterialInspector.CreateMaterialGUI(materials[i], layout);
  128. materialParams.Add(matParams);
  129. }
  130. }
  131. }
  132. /// <summary>
  133. /// Row element used for displaying GUI for material array elements.
  134. /// </summary>
  135. public class MaterialArrayRow : GUIListFieldRow
  136. {
  137. private GUIResourceField materialField;
  138. /// <inheritdoc/>
  139. protected override GUILayoutX CreateGUI(GUILayoutY layout)
  140. {
  141. GUILayoutX titleLayout = layout.AddLayoutX();
  142. materialField = new GUIResourceField(typeof(Material), new LocEdString(seqIndex + ". "));
  143. titleLayout.AddElement(materialField);
  144. materialField.OnChanged += SetValue;
  145. return titleLayout;
  146. }
  147. /// <inheritdoc/>
  148. internal protected override bool Refresh(out bool rebuildGUI)
  149. {
  150. rebuildGUI = false;
  151. Material newValue = GetValue<Material>();
  152. if (materialField.Value != newValue)
  153. {
  154. materialField.Value = newValue;
  155. return true;
  156. }
  157. return false;
  158. }
  159. }
  160. }
  161. }