A game about forced loneliness, made by TACStudios
1using System;
2using System.Text;
3using System.Collections.Generic;
4using System.Linq;
5using UnityEditor.ShaderGraph.Drawing.Controls;
6using UnityEngine;
7using UnityEditor.Graphing;
8using UnityEditor.ShaderGraph.Internal;
9
10namespace UnityEditor.ShaderGraph
11{
12 [Serializable]
13 [BlackboardInputInfo(30)]
14 class GradientShaderProperty : AbstractShaderProperty<Gradient>
15 {
16 public GradientShaderProperty()
17 {
18 displayName = "Gradient";
19 value = new Gradient();
20 }
21
22 public override PropertyType propertyType => PropertyType.Gradient;
23
24 internal override bool isExposable => false;
25 internal override bool isRenamable => true;
26
27 internal override bool AllowHLSLDeclaration(HLSLDeclaration decl) => false; // disable UI, nothing to choose
28
29 internal override void ForeachHLSLProperty(Action<HLSLProperty> action)
30 {
31 Action<ShaderStringBuilder> customDecl = (builder) =>
32 {
33 StringBuilder colors = new("{");
34 StringBuilder alphas = new("{");
35 for (int i = 0; i < 8; ++i)
36 {
37 if (i < value.colorKeys.Length)
38 colors.AppendFormat("{0}4({1},{2},{3},{4})"
39 , concretePrecision.ToShaderString()
40 , NodeUtils.FloatToShaderValue(value.colorKeys[i].color.r)
41 , NodeUtils.FloatToShaderValue(value.colorKeys[i].color.g)
42 , NodeUtils.FloatToShaderValue(value.colorKeys[i].color.b)
43 , NodeUtils.FloatToShaderValue(value.colorKeys[i].time));
44 else colors.AppendFormat("{0}4(0,0,0,0)", concretePrecision.ToShaderString());
45
46 if (i < value.alphaKeys.Length)
47 alphas.AppendFormat("{0}2({1},{2})"
48 , concretePrecision.ToShaderString()
49 , NodeUtils.FloatToShaderValue(value.alphaKeys[i].alpha)
50 , NodeUtils.FloatToShaderValue(value.alphaKeys[i].time));
51 else alphas.AppendFormat("{0}2(0,0)", concretePrecision.ToShaderString());
52
53 if (i < 7)
54 {
55 colors.Append(",");
56 alphas.Append(",");
57 }
58 else
59 {
60 colors.Append("}");
61 alphas.Append("}");
62 }
63 }
64
65 builder.AppendLine("static Gradient {0} = {{{1},{2},{3},{4},{5}}};"
66 , referenceName
67 , (int)value.mode
68 , value.colorKeys.Length
69 , value.alphaKeys.Length
70 , colors.ToString()
71 , alphas.ToString());
72 };
73
74 action(
75 new HLSLProperty(HLSLType._CUSTOM, referenceName, HLSLDeclaration.Global, concretePrecision)
76 {
77 customDeclaration = customDecl
78 });
79 }
80
81 internal override string GetPropertyAsArgumentString(string precisionString)
82 {
83 return "Gradient " + referenceName;
84 }
85
86 internal override AbstractMaterialNode ToConcreteNode()
87 {
88 return new GradientNode { gradient = value };
89 }
90
91 internal override PreviewProperty GetPreviewMaterialProperty()
92 {
93 return new PreviewProperty(propertyType)
94 {
95 name = referenceName,
96 gradientValue = value
97 };
98 }
99
100 internal override ShaderInput Copy()
101 {
102 return new GradientShaderProperty
103 {
104 displayName = displayName,
105 value = value,
106 };
107 }
108 }
109}