A game about forced loneliness, made by TACStudios
1using UnityEngine;
2using UnityEditor.Graphing;
3using UnityEditor.ShaderGraph.Drawing.Controls;
4using UnityEditor.ShaderGraph.Internal;
5
6namespace UnityEditor.ShaderGraph
7{
8 internal enum Texture2DMipSamplingMode
9 {
10 Standard,
11 LOD,
12 Gradient,
13 Bias
14 }
15
16 internal enum Texture3DMipSamplingMode
17 {
18 Standard,
19 LOD
20 }
21
22 internal struct Mip2DSamplingInputs
23 {
24 public int biasInput;
25 public int lodInput;
26 public int ddxInput;
27 public int ddyInput;
28 public MaterialSlot bias;
29 public MaterialSlot lod;
30 public MaterialSlot ddx;
31 public MaterialSlot ddy;
32
33 public static Mip2DSamplingInputs NewDefault()
34 {
35 return new Mip2DSamplingInputs()
36 {
37 bias = null,
38 lod = null,
39 ddx = null,
40 ddy = null
41 };
42 }
43 }
44
45 internal struct Mip3DSamplingInputs
46 {
47 public int lodInput;
48 public MaterialSlot lod;
49
50 public static Mip3DSamplingInputs NewDefault()
51 {
52 return new Mip3DSamplingInputs()
53 {
54 lod = null
55 };
56 }
57 }
58
59 internal static class MipSamplingModesUtils
60 {
61 private static string kLodName = "LOD";
62 private static string kBiasName = "Bias";
63 private static string kDdxName = "DDX";
64 private static string kDdyName = "DDY";
65
66 public static string Get2DTextureSamplingMacro(Texture2DMipSamplingMode mode, bool usePlatformMacros, bool isArray)
67 {
68 if (isArray)
69 {
70 if (usePlatformMacros)
71 {
72 switch (mode)
73 {
74 case Texture2DMipSamplingMode.Standard:
75 return "PLATFORM_SAMPLE_TEXTURE2D_ARRAY";
76 case Texture2DMipSamplingMode.LOD:
77 return "PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD";
78 case Texture2DMipSamplingMode.Bias:
79 return "PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS";
80 case Texture2DMipSamplingMode.Gradient:
81 return "PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD";
82 }
83 }
84 else
85 {
86 switch (mode)
87 {
88 case Texture2DMipSamplingMode.Standard:
89 return "SAMPLE_TEXTURE2D_ARRAY";
90 case Texture2DMipSamplingMode.LOD:
91 return "SAMPLE_TEXTURE2D_ARRAY_LOD";
92 case Texture2DMipSamplingMode.Bias:
93 return "SAMPLE_TEXTURE2D_ARRAY_BIAS";
94 case Texture2DMipSamplingMode.Gradient:
95 return "SAMPLE_TEXTURE2D_ARRAY_GRAD";
96 }
97 }
98 }
99 else
100 {
101 if (usePlatformMacros)
102 {
103 switch (mode)
104 {
105 case Texture2DMipSamplingMode.Standard:
106 return "PLATFORM_SAMPLE_TEXTURE2D";
107 case Texture2DMipSamplingMode.LOD:
108 return "PLATFORM_SAMPLE_TEXTURE2D_LOD";
109 case Texture2DMipSamplingMode.Bias:
110 return "PLATFORM_SAMPLE_TEXTURE2D_BIAS";
111 case Texture2DMipSamplingMode.Gradient:
112 return "PLATFORM_SAMPLE_TEXTURE2D_GRAD";
113 }
114 }
115 else
116 {
117 switch (mode)
118 {
119 case Texture2DMipSamplingMode.Standard:
120 return "SAMPLE_TEXTURE2D";
121 case Texture2DMipSamplingMode.LOD:
122 return "SAMPLE_TEXTURE2D_LOD";
123 case Texture2DMipSamplingMode.Bias:
124 return "SAMPLE_TEXTURE2D_BIAS";
125 case Texture2DMipSamplingMode.Gradient:
126 return "SAMPLE_TEXTURE2D_GRAD";
127 }
128 }
129 }
130
131 return "";
132 }
133
134 public static string Get3DTextureSamplingMacro(Texture3DMipSamplingMode mode, bool usePlatformMacros)
135 {
136 if (usePlatformMacros)
137 {
138 switch (mode)
139 {
140 case Texture3DMipSamplingMode.Standard:
141 return "PLATFORM_SAMPLE_TEXTURE3D";
142 case Texture3DMipSamplingMode.LOD:
143 return "PLATFORM_SAMPLE_TEXTURE2D_LOD";
144 }
145 }
146 else
147 {
148 switch (mode)
149 {
150 case Texture3DMipSamplingMode.Standard:
151 return "SAMPLE_TEXTURE3D";
152 case Texture3DMipSamplingMode.LOD:
153 return "SAMPLE_TEXTURE3D_LOD";
154 }
155 }
156
157 return "";
158 }
159
160 public static Mip2DSamplingInputs CreateMip2DSamplingInputs(
161 AbstractMaterialNode node, Texture2DMipSamplingMode mode, Mip2DSamplingInputs previousInputs,
162 int biasInputId, int lodInputId, int ddxInputId, int ddyInputId)
163 {
164 if (previousInputs.bias != null)
165 node.RemoveSlot(previousInputs.bias.id);
166 if (previousInputs.lod != null)
167 node.RemoveSlot(previousInputs.lod.id);
168 if (previousInputs.ddx != null)
169 node.RemoveSlot(previousInputs.ddx.id);
170 if (previousInputs.ddy != null)
171 node.RemoveSlot(previousInputs.ddy.id);
172
173 Mip2DSamplingInputs inputs = Mip2DSamplingInputs.NewDefault();
174 inputs.biasInput = biasInputId;
175 inputs.lodInput = lodInputId;
176 inputs.ddxInput = ddxInputId;
177 inputs.ddyInput = ddyInputId;
178 switch (mode)
179 {
180 case Texture2DMipSamplingMode.LOD:
181 inputs.lod = node.AddSlot(new Vector1MaterialSlot(lodInputId, kLodName, kLodName, SlotType.Input, 0.0f));
182 break;
183 case Texture2DMipSamplingMode.Bias:
184 inputs.bias = node.AddSlot(new Vector1MaterialSlot(biasInputId, kBiasName, kBiasName, SlotType.Input, 0.0f));
185 break;
186 case Texture2DMipSamplingMode.Gradient:
187 inputs.ddx = node.AddSlot(new Vector2MaterialSlot(ddxInputId, kDdxName, kDdxName, SlotType.Input, new Vector2(0.0f, 0.0f)));
188 inputs.ddy = node.AddSlot(new Vector2MaterialSlot(ddyInputId, kDdyName, kDdyName, SlotType.Input, new Vector2(0.0f, 0.0f)));
189 break;
190 }
191
192 return inputs;
193 }
194
195 public static Mip3DSamplingInputs CreateMip3DSamplingInputs(
196 AbstractMaterialNode node, Texture3DMipSamplingMode mode, Mip3DSamplingInputs previousInputs,
197 int lodInputId)
198 {
199 if (previousInputs.lod != null)
200 node.RemoveSlot(previousInputs.lod.id);
201
202 Mip3DSamplingInputs inputs = Mip3DSamplingInputs.NewDefault();
203 inputs.lodInput = lodInputId;
204 switch (mode)
205 {
206 case Texture3DMipSamplingMode.LOD:
207 inputs.lod = node.AddSlot(new Vector1MaterialSlot(lodInputId, kLodName, kLodName, SlotType.Input, 0.0f));
208 break;
209 }
210
211 return inputs;
212 }
213
214 public static string GetSamplerMipArgs(
215 AbstractMaterialNode node, Texture2DMipSamplingMode mode, Mip2DSamplingInputs inputs, GenerationMode generationMode)
216 {
217 switch (mode)
218 {
219 case Texture2DMipSamplingMode.LOD:
220 return string.Format(", {0}", node.GetSlotValue(inputs.lodInput, generationMode));
221 case Texture2DMipSamplingMode.Bias:
222 return string.Format(", {0}", node.GetSlotValue(inputs.biasInput, generationMode));
223 case Texture2DMipSamplingMode.Gradient:
224 return string.Format(", {0}, {1}", node.GetSlotValue(inputs.ddxInput, generationMode), node.GetSlotValue(inputs.ddyInput, generationMode));
225 }
226
227 return "";
228 }
229
230 public static string GetSamplerMipArgs(
231 AbstractMaterialNode node, Texture3DMipSamplingMode mode, Mip3DSamplingInputs inputs, GenerationMode generationMode)
232 {
233 switch (mode)
234 {
235 case Texture3DMipSamplingMode.LOD:
236 return string.Format(", {0}", node.GetSlotValue(inputs.lodInput, generationMode));
237 }
238
239 return "";
240 }
241 }
242}