RenderableInspector.cs 5.8 KB

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