No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DielectricSpecularControl.cs 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using System;
  2. using System.Globalization;
  3. using System.Reflection;
  4. using UnityEngine;
  5. using UnityEngine.UIElements;
  6. namespace UnityEditor.ShaderGraph.Drawing.Controls
  7. {
  8. [AttributeUsage(AttributeTargets.Property)]
  9. class DielectricSpecularControlAttribute : Attribute, IControlAttribute
  10. {
  11. public DielectricSpecularControlAttribute()
  12. {
  13. }
  14. public VisualElement InstantiateControl(AbstractMaterialNode node, PropertyInfo propertyInfo)
  15. {
  16. return new DielectricSpecularControlView(node, propertyInfo);
  17. }
  18. }
  19. class DielectricSpecularControlView : VisualElement
  20. {
  21. AbstractMaterialNode m_Node;
  22. PropertyInfo m_PropertyInfo;
  23. DielectricSpecularNode.DielectricMaterial m_DielectricMaterial;
  24. VisualElement m_RangePanel;
  25. Slider m_RangeSlider;
  26. FloatField m_RangeField;
  27. VisualElement m_IORPanel;
  28. Slider m_IORSlider;
  29. FloatField m_IORField;
  30. public DielectricSpecularControlView(AbstractMaterialNode node, PropertyInfo propertyInfo)
  31. {
  32. m_Node = node;
  33. m_PropertyInfo = propertyInfo;
  34. styleSheets.Add(Resources.Load<StyleSheet>("Styles/Controls/DielectricSpecularControlView"));
  35. m_DielectricMaterial = (DielectricSpecularNode.DielectricMaterial)m_PropertyInfo.GetValue(m_Node, null);
  36. if (propertyInfo.PropertyType != typeof(DielectricSpecularNode.DielectricMaterial))
  37. throw new ArgumentException("Property must be of type DielectricMaterial.", "propertyInfo");
  38. var enumPanel = new VisualElement { name = "enumPanel" };
  39. enumPanel.Add(new Label("Material"));
  40. var enumField = new EnumField(m_DielectricMaterial.type);
  41. enumField.RegisterValueChangedCallback(OnEnumChanged);
  42. enumPanel.Add(enumField);
  43. Add(enumPanel);
  44. m_RangePanel = new VisualElement { name = "sliderPanel" };
  45. m_RangePanel.Add(new Label("Range"));
  46. m_RangeSlider = new Slider(0.01f, 1) { value = m_DielectricMaterial.range };
  47. m_RangeSlider.RegisterValueChangedCallback((evt) => OnChangeRangeSlider(evt.newValue));
  48. m_RangePanel.Add(m_RangeSlider);
  49. m_RangeField = AddField(m_RangePanel, m_RangeSlider, 0, m_DielectricMaterial);
  50. m_RangePanel.SetEnabled(m_DielectricMaterial.type == DielectricMaterialType.Common);
  51. Add(m_RangePanel);
  52. m_IORPanel = new VisualElement { name = "sliderPanel" };
  53. m_IORPanel.Add(new Label("IOR"));
  54. m_IORSlider = new Slider(1, 2.5f) { value = m_DielectricMaterial.indexOfRefraction };
  55. m_IORSlider.RegisterValueChangedCallback((evt) => OnChangeIORSlider(evt.newValue));
  56. m_IORPanel.Add(m_IORSlider);
  57. m_IORField = AddField(m_IORPanel, m_IORSlider, 1, m_DielectricMaterial);
  58. m_IORPanel.SetEnabled(m_DielectricMaterial.type == DielectricMaterialType.Custom);
  59. Add(m_IORPanel);
  60. }
  61. void OnEnumChanged(ChangeEvent<Enum> evt)
  62. {
  63. if (!evt.newValue.Equals(m_DielectricMaterial.type))
  64. {
  65. m_Node.owner.owner.RegisterCompleteObjectUndo("Change " + m_Node.name);
  66. m_DielectricMaterial.type = (DielectricMaterialType)evt.newValue;
  67. m_PropertyInfo.SetValue(m_Node, m_DielectricMaterial, null);
  68. switch (m_DielectricMaterial.type)
  69. {
  70. case DielectricMaterialType.Common:
  71. m_RangePanel.SetEnabled(true);
  72. m_IORPanel.SetEnabled(false);
  73. break;
  74. case DielectricMaterialType.Custom:
  75. m_RangePanel.SetEnabled(false);
  76. m_IORPanel.SetEnabled(true);
  77. break;
  78. default:
  79. m_RangePanel.SetEnabled(false);
  80. m_IORPanel.SetEnabled(false);
  81. break;
  82. }
  83. }
  84. }
  85. void OnChangeRangeSlider(float newValue)
  86. {
  87. m_Node.owner.owner.RegisterCompleteObjectUndo("Slider Change");
  88. m_DielectricMaterial.range = newValue;
  89. m_PropertyInfo.SetValue(m_Node, m_DielectricMaterial, null);
  90. if (m_RangeField != null)
  91. m_RangeField.value = newValue;
  92. this.MarkDirtyRepaint();
  93. }
  94. void OnChangeIORSlider(float newValue)
  95. {
  96. m_Node.owner.owner.RegisterCompleteObjectUndo("Slider Change");
  97. m_DielectricMaterial.indexOfRefraction = newValue;
  98. m_PropertyInfo.SetValue(m_Node, m_DielectricMaterial, null);
  99. if (m_IORField != null)
  100. m_IORField.value = newValue;
  101. this.MarkDirtyRepaint();
  102. }
  103. FloatField AddField(VisualElement panel, Slider slider, int index, DielectricSpecularNode.DielectricMaterial initMaterial)
  104. {
  105. float initValue;
  106. if (index == 1)
  107. initValue = initMaterial.indexOfRefraction;
  108. else
  109. initValue = initMaterial.range;
  110. var field = new FloatField { userData = index, value = initValue };
  111. field.RegisterCallback<MouseDownEvent>(Repaint);
  112. field.RegisterCallback<MouseMoveEvent>(Repaint);
  113. field.RegisterValueChangedCallback(evt =>
  114. {
  115. var fieldValue = (float)evt.newValue;
  116. if (index == 1)
  117. m_DielectricMaterial.indexOfRefraction = fieldValue;
  118. else
  119. m_DielectricMaterial.range = fieldValue;
  120. m_PropertyInfo.SetValue(m_Node, m_DielectricMaterial, null);
  121. this.MarkDirtyRepaint();
  122. });
  123. field.Q("unity-text-input").RegisterCallback<FocusOutEvent>(evt =>
  124. {
  125. if (index == 1)
  126. RedrawIORControls(m_DielectricMaterial.indexOfRefraction);
  127. else
  128. RedrawRangeControls(m_DielectricMaterial.range);
  129. this.MarkDirtyRepaint();
  130. }, TrickleDown.TrickleDown);
  131. panel.Add(field);
  132. return field;
  133. }
  134. void RedrawRangeControls(float value)
  135. {
  136. value = Mathf.Max(Mathf.Min(value, 1), 0.01f);
  137. m_RangePanel.Remove(m_RangeSlider);
  138. m_RangeSlider = new Slider(0.01f, 1) { value = value };
  139. m_RangeSlider.RegisterValueChangedCallback((evt) => OnChangeRangeSlider(evt.newValue));
  140. m_RangePanel.Add(m_RangeSlider);
  141. m_RangePanel.Remove(m_RangeField);
  142. m_RangeField.value = value;
  143. m_RangePanel.Add(m_RangeField);
  144. }
  145. void RedrawIORControls(float value)
  146. {
  147. value = Mathf.Max(Mathf.Min(value, 5), 1);
  148. m_IORPanel.Remove(m_IORSlider);
  149. m_IORSlider = new Slider(1, 2.5f) { value = value };
  150. m_IORSlider.RegisterValueChangedCallback((evt) => OnChangeIORSlider(evt.newValue));
  151. m_IORPanel.Add(m_IORSlider);
  152. m_IORPanel.Remove(m_IORField);
  153. m_IORField.value = value;
  154. m_IORPanel.Add(m_IORField);
  155. }
  156. void Repaint<T>(MouseEventBase<T> evt) where T : MouseEventBase<T>, new()
  157. {
  158. evt.StopPropagation();
  159. this.MarkDirtyRepaint();
  160. }
  161. }
  162. }