RenderableInspector.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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> materialsField = new GUIArrayField<Material>();
  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 void Refresh()
  25. {
  26. Renderable renderable = referencedObject as Renderable;
  27. if (renderable == null)
  28. return;
  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. meshField.Value = renderable.Mesh;
  57. if (layersValue != renderable.Layers)
  58. {
  59. bool[] states = new bool[64];
  60. for (int i = 0; i < states.Length; i++)
  61. states[i] = (renderable.Layers & Layers.Values[i]) == Layers.Values[i];
  62. layersField.States = states;
  63. layersValue = renderable.Layers;
  64. }
  65. if (materials != null)
  66. {
  67. for (int i = 0; i < materialParams.Count; i++)
  68. {
  69. if (materialParams[i] != null)
  70. {
  71. foreach (var param in materialParams[i])
  72. param.Refresh(materials[i]);
  73. }
  74. }
  75. }
  76. }
  77. /// <summary>
  78. /// Recreates all the GUI elements used by this inspector.
  79. /// </summary>
  80. private void BuildGUI()
  81. {
  82. layout.Clear();
  83. Renderable renderable = referencedObject as Renderable;
  84. if (renderable == null)
  85. return;
  86. meshField = new GUIResourceField(typeof(Mesh), new LocEdString("Mesh"));
  87. layersField = new GUIListBoxField(Layers.Names, true, new LocEdString("Layers"));
  88. layout.AddElement(meshField);
  89. layout.AddElement(layersField);
  90. layersValue = 0;
  91. materials = renderable.Materials;
  92. materialsField.Update<MaterialArrayRow>(new LocEdString("Materials"), materials, layout);
  93. materialsField.OnChanged += x =>
  94. {
  95. renderable.Materials = (Material[])x;
  96. BuildGUI();
  97. Refresh();
  98. };
  99. meshField.OnChanged += x => renderable.Mesh = x as Mesh;
  100. layersField.OnSelectionChanged += x =>
  101. {
  102. ulong layers = 0;
  103. bool[] states = layersField.States;
  104. for (int i = 0; i < states.Length; i++)
  105. layers |= states[i] ? Layers.Values[i] : 0;
  106. layersValue = layers;
  107. renderable.Layers = layers;
  108. };
  109. materialParams.Clear();
  110. if (materials != null)
  111. {
  112. for (int i = 0; i < materials.Length; i++)
  113. {
  114. if (materials[i] == null)
  115. {
  116. materialParams.Add(new MaterialParamGUI[0]);
  117. continue;
  118. }
  119. layout.AddSpace(10);
  120. MaterialParamGUI[] matParams = MaterialInspector.CreateMaterialGUI(materials[i], layout);
  121. materialParams.Add(matParams);
  122. }
  123. }
  124. }
  125. /// <summary>
  126. /// Row element used for displaying GUI for material array elements.
  127. /// </summary>
  128. public class MaterialArrayRow : GUIListFieldRow
  129. {
  130. private GUIResourceField materialField;
  131. /// <inheritdoc/>
  132. protected override GUILayoutX CreateGUI(GUILayoutY layout)
  133. {
  134. GUILayoutX titleLayout = layout.AddLayoutX();
  135. materialField = new GUIResourceField(typeof(Material), new LocEdString(seqIndex + ". "));
  136. titleLayout.AddElement(materialField);
  137. materialField.OnChanged += SetValue;
  138. return titleLayout;
  139. }
  140. /// <inheritdoc/>
  141. internal protected override bool Refresh(out bool rebuildGUI)
  142. {
  143. rebuildGUI = false;
  144. Material newValue = GetValue<Material>();
  145. if (materialField.Value != newValue)
  146. {
  147. materialField.Value = newValue;
  148. return true;
  149. }
  150. return false;
  151. }
  152. }
  153. }
  154. }