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.

107 lines
3.2 KiB

  1. // Amplify Shader Editor - Visual Shader Editing Tool
  2. // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
  3. using System;
  4. using UnityEngine;
  5. using UnityEditor;
  6. namespace AmplifyShaderEditor
  7. {
  8. [Serializable]
  9. class ColorMaskHelper
  10. {
  11. private GUIContent ColorMaskContent = new GUIContent( "Color Mask", "Sets color channel writing mask, turning all off makes the object completely invisible\nDefault: RGBA" );
  12. private readonly char[] m_colorMaskChar = { 'R', 'G', 'B', 'A' };
  13. private GUIStyle m_leftToggleColorMask;
  14. private GUIStyle m_middleToggleColorMask;
  15. private GUIStyle m_rightToggleColorMask;
  16. [SerializeField]
  17. private bool[] m_colorMask = { true, true, true, true };
  18. [SerializeField]
  19. private InlineProperty m_inlineMask = new InlineProperty();
  20. public void Draw( UndoParentNode owner )
  21. {
  22. m_inlineMask.CustomDrawer( ref owner, DrawColorMaskControls, ColorMaskContent.text );
  23. }
  24. private void DrawColorMaskControls( UndoParentNode owner )
  25. {
  26. if( m_leftToggleColorMask == null || m_leftToggleColorMask.normal.background == null )
  27. {
  28. m_leftToggleColorMask = GUI.skin.GetStyle( "miniButtonLeft" );
  29. }
  30. if( m_middleToggleColorMask == null || m_middleToggleColorMask.normal.background == null )
  31. {
  32. m_middleToggleColorMask = GUI.skin.GetStyle( "miniButtonMid" );
  33. }
  34. if( m_rightToggleColorMask == null || m_rightToggleColorMask.normal.background == null )
  35. {
  36. m_rightToggleColorMask = GUI.skin.GetStyle( "miniButtonRight" );
  37. }
  38. EditorGUILayout.BeginHorizontal();
  39. EditorGUILayout.LabelField( ColorMaskContent, GUILayout.Width( 90 ) );
  40. m_colorMask[ 0 ] = owner.GUILayoutToggle( m_colorMask[ 0 ], "R", m_leftToggleColorMask );
  41. m_colorMask[ 1 ] = owner.GUILayoutToggle( m_colorMask[ 1 ], "G", m_middleToggleColorMask );
  42. m_colorMask[ 2 ] = owner.GUILayoutToggle( m_colorMask[ 2 ], "B", m_middleToggleColorMask );
  43. m_colorMask[ 3 ] = owner.GUILayoutToggle( m_colorMask[ 3 ], "A", m_rightToggleColorMask );
  44. EditorGUILayout.EndHorizontal();
  45. }
  46. public void BuildColorMask( ref string ShaderBody, bool customBlendAvailable )
  47. {
  48. int count = 0;
  49. string colorMask = string.Empty;
  50. for( int i = 0; i < m_colorMask.Length; i++ )
  51. {
  52. if( m_colorMask[ i ] )
  53. {
  54. count++;
  55. colorMask += m_colorMaskChar[ i ];
  56. }
  57. }
  58. if( ( count != m_colorMask.Length && customBlendAvailable ) || m_inlineMask.Active )
  59. {
  60. MasterNode.AddRenderState( ref ShaderBody, "ColorMask", m_inlineMask.GetValueOrProperty( ( ( count == 0 ) ? "0" : colorMask ) ) );
  61. }
  62. }
  63. public void ReadFromString( ref uint index, ref string[] nodeParams )
  64. {
  65. for( int i = 0; i < m_colorMask.Length; i++ )
  66. {
  67. m_colorMask[ i ] = Convert.ToBoolean( nodeParams[ index++ ] );
  68. }
  69. if( UIUtils.CurrentShaderVersion() > 14501 )
  70. m_inlineMask.ReadFromString( ref index, ref nodeParams );
  71. }
  72. public void WriteToString( ref string nodeInfo )
  73. {
  74. for( int i = 0; i < m_colorMask.Length; i++ )
  75. {
  76. IOUtils.AddFieldValueToString( ref nodeInfo, m_colorMask[ i ] );
  77. }
  78. m_inlineMask.WriteToString( ref nodeInfo );
  79. }
  80. public void Destroy()
  81. {
  82. m_leftToggleColorMask = null;
  83. m_middleToggleColorMask = null;
  84. m_rightToggleColorMask = null;
  85. }
  86. }
  87. }