A game about forced loneliness, made by TACStudios
at master 198 lines 7.1 kB view raw
1using UnityEditor.ShaderGraph.Drawing.Controls; 2using UnityEngine; 3using UnityEditor.Graphing; 4using System.Collections.Generic; 5using UnityEditor.ShaderGraph.Internal; 6 7namespace UnityEditor.ShaderGraph 8{ 9 [Title("Input", "Matrix", "Matrix 4x4")] 10 class Matrix4Node : AbstractMaterialNode, IGeneratesBodyCode, IPropertyFromNode 11 { 12 public const int OutputSlotId = 0; 13 const string kOutputSlotName = "Out"; 14 15 [SerializeField] 16 Vector4 m_Row0; 17 18 [SerializeField] 19 Vector4 m_Row1; 20 21 [SerializeField] 22 Vector4 m_Row2; 23 24 [SerializeField] 25 Vector4 m_Row3; 26 27 [MultiFloatControl("", " ", " ", " ", " ")] 28 public Vector4 row0 29 { 30 get { return m_Row0; } 31 set { SetRow(ref m_Row0, value); } 32 } 33 34 [MultiFloatControl("", " ", " ", " ", " ")] 35 public Vector4 row1 36 { 37 get { return m_Row1; } 38 set { SetRow(ref m_Row1, value); } 39 } 40 41 [MultiFloatControl("", " ", " ", " ", " ")] 42 public Vector4 row2 43 { 44 get { return m_Row2; } 45 set { SetRow(ref m_Row2, value); } 46 } 47 48 [MultiFloatControl("", " ", " ", " ", " ")] 49 public Vector4 row3 50 { 51 get { return m_Row3; } 52 set { SetRow(ref m_Row3, value); } 53 } 54 55 void SetRow(ref Vector4 row, Vector4 value) 56 { 57 if (value == row) 58 return; 59 row = value; 60 Dirty(ModificationScope.Node); 61 } 62 63 public Matrix4Node() 64 { 65 name = "Matrix 4x4"; 66 UpdateNodeAfterDeserialization(); 67 } 68 69 public sealed override void UpdateNodeAfterDeserialization() 70 { 71 AddSlot(new Matrix4MaterialSlot(OutputSlotId, kOutputSlotName, kOutputSlotName, SlotType.Output)); 72 RemoveSlotsNameNotMatching(new[] { OutputSlotId }); 73 } 74 75 public override void CollectShaderProperties(PropertyCollector properties, GenerationMode generationMode) 76 { 77 if (!generationMode.IsPreview()) 78 return; 79 80 properties.AddShaderProperty(new Vector4ShaderProperty() 81 { 82 overrideReferenceName = string.Format("_{0}_m0", GetVariableNameForNode()), 83 generatePropertyBlock = false, 84 value = m_Row0 85 }); 86 87 properties.AddShaderProperty(new Vector4ShaderProperty() 88 { 89 overrideReferenceName = string.Format("_{0}_m1", GetVariableNameForNode()), 90 generatePropertyBlock = false, 91 value = m_Row1 92 }); 93 94 properties.AddShaderProperty(new Vector4ShaderProperty() 95 { 96 overrideReferenceName = string.Format("_{0}_m2", GetVariableNameForNode()), 97 generatePropertyBlock = false, 98 value = m_Row2 99 }); 100 101 properties.AddShaderProperty(new Vector4ShaderProperty() 102 { 103 overrideReferenceName = string.Format("_{0}_m3", GetVariableNameForNode()), 104 generatePropertyBlock = false, 105 value = m_Row3 106 }); 107 } 108 109 public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode) 110 { 111 if (!generationMode.IsPreview()) 112 { 113 sb.AppendLine("$precision4 _{0}_m0 = $precision4 ({1}, {2}, {3}, {4});", GetVariableNameForNode(), 114 NodeUtils.FloatToShaderValue(m_Row0.x), 115 NodeUtils.FloatToShaderValue(m_Row0.y), 116 NodeUtils.FloatToShaderValue(m_Row0.z), 117 NodeUtils.FloatToShaderValue(m_Row0.w)); 118 sb.AppendLine("$precision4 _{0}_m1 = $precision4 ({1}, {2}, {3}, {4});", GetVariableNameForNode(), 119 NodeUtils.FloatToShaderValue(m_Row1.x), 120 NodeUtils.FloatToShaderValue(m_Row1.y), 121 NodeUtils.FloatToShaderValue(m_Row1.z), 122 NodeUtils.FloatToShaderValue(m_Row1.w)); 123 sb.AppendLine("$precision4 _{0}_m2 = $precision4 ({1}, {2}, {3}, {4});", GetVariableNameForNode(), 124 NodeUtils.FloatToShaderValue(m_Row2.x), 125 NodeUtils.FloatToShaderValue(m_Row2.y), 126 NodeUtils.FloatToShaderValue(m_Row2.z), 127 NodeUtils.FloatToShaderValue(m_Row2.w)); 128 sb.AppendLine("$precision4 _{0}_m3 = $precision4 ({1}, {2}, {3}, {4});", GetVariableNameForNode(), 129 NodeUtils.FloatToShaderValue(m_Row3.x), 130 NodeUtils.FloatToShaderValue(m_Row3.y), 131 NodeUtils.FloatToShaderValue(m_Row3.z), 132 NodeUtils.FloatToShaderValue(m_Row3.w)); 133 } 134 sb.AppendLine("$precision4x4 {0} = $precision4x4 (_{0}_m0.x, _{0}_m0.y, _{0}_m0.z, _{0}_m0.w, _{0}_m1.x, _{0}_m1.y, _{0}_m1.z, _{0}_m1.w, _{0}_m2.x, _{0}_m2.y, _{0}_m2.z, _{0}_m2.w, _{0}_m3.x, _{0}_m3.y, _{0}_m3.z, _{0}_m3.w);", 135 GetVariableNameForNode()); 136 } 137 138 public override void CollectPreviewMaterialProperties(List<PreviewProperty> properties) 139 { 140 properties.Add(new PreviewProperty(PropertyType.Vector4) 141 { 142 name = string.Format("_{0}_m0", GetVariableNameForNode()), 143 vector4Value = m_Row0 144 }); 145 146 properties.Add(new PreviewProperty(PropertyType.Vector4) 147 { 148 name = string.Format("_{0}_m1", GetVariableNameForNode()), 149 vector4Value = m_Row1 150 }); 151 152 properties.Add(new PreviewProperty(PropertyType.Vector4) 153 { 154 name = string.Format("_{0}_m2", GetVariableNameForNode()), 155 vector4Value = m_Row2 156 }); 157 158 properties.Add(new PreviewProperty(PropertyType.Vector4) 159 { 160 name = string.Format("_{0}_m3", GetVariableNameForNode()), 161 vector4Value = m_Row3 162 }); 163 } 164 165 public override string GetVariableNameForSlot(int slotId) 166 { 167 return GetVariableNameForNode(); 168 } 169 170 public AbstractShaderProperty AsShaderProperty() 171 { 172 return new Matrix4ShaderProperty 173 { 174 value = new Matrix4x4() 175 { 176 m00 = row0.x, 177 m01 = row0.y, 178 m02 = row0.z, 179 m03 = row0.w, 180 m10 = row1.x, 181 m11 = row1.y, 182 m12 = row1.z, 183 m13 = row1.w, 184 m20 = row2.x, 185 m21 = row2.y, 186 m22 = row2.z, 187 m23 = row2.w, 188 m30 = row3.x, 189 m31 = row3.y, 190 m32 = row3.z, 191 m33 = row3.w, 192 } 193 }; 194 } 195 196 public int outputSlotId { get { return OutputSlotId; } } 197 } 198}