Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
SamplerState.cs
Go to the documentation of this file.
1using System;
5
7
9{
11
13
15
17
18 internal int cachedMaxAnisotropy;
19
20 internal int cachedMaxMipLevel;
21
23
24 public static readonly SamplerState PointWrap = new SamplerState(TextureFilter.Point, TextureAddressMode.Wrap, "SamplerState.PointWrap");
25
26 public static readonly SamplerState PointClamp = new SamplerState(TextureFilter.Point, TextureAddressMode.Clamp, "SamplerState.PointClamp");
27
28 public static readonly SamplerState LinearWrap = new SamplerState(TextureFilter.Linear, TextureAddressMode.Wrap, "SamplerState.LinearWrap");
29
30 public static readonly SamplerState LinearClamp = new SamplerState(TextureFilter.Linear, TextureAddressMode.Clamp, "SamplerState.LinearClamp");
31
32 public static readonly SamplerState AnisotropicWrap = new SamplerState(TextureFilter.Anisotropic, TextureAddressMode.Wrap, "SamplerState.AnisotropicWrap");
33
34 public static readonly SamplerState AnisotropicClamp = new SamplerState(TextureFilter.Anisotropic, TextureAddressMode.Clamp, "SamplerState.AnisotropicClamp");
35
36 internal bool isBound;
37
38 internal _D3DTEXTUREFILTERTYPE minFilter;
39
40 internal _D3DTEXTUREFILTERTYPE magFilter;
41
42 internal _D3DTEXTUREFILTERTYPE mipFilter;
43
44 internal _D3DTEXTUREADDRESS d3dAddressU;
45
46 internal _D3DTEXTUREADDRESS d3dAddressV;
47
48 internal _D3DTEXTUREADDRESS d3dAddressW;
49
50 internal uint filterMinFlag;
51
52 internal uint filterMagFlag;
53
54 internal uint filterMipFlag;
55
56 internal uint nonClampAddressUFlag;
57
58 internal uint nonClampAddressVFlag;
59
61 {
62 get
63 {
65 }
66 set
67 {
70 }
71 }
72
73 public int MaxMipLevel
74 {
75 get
76 {
77 return cachedMaxMipLevel;
78 }
79 set
80 {
83 }
84 }
85
86 public int MaxAnisotropy
87 {
88 get
89 {
91 }
92 set
93 {
96 }
97 }
98
100 {
101 get
102 {
103 return cachedAddressW;
104 }
105 set
106 {
107 ThrowIfBound();
109 }
110 }
111
113 {
114 get
115 {
116 return cachedAddressV;
117 }
118 set
119 {
120 ThrowIfBound();
122 }
123 }
124
126 {
127 get
128 {
129 return cachedAddressU;
130 }
131 set
132 {
133 ThrowIfBound();
135 }
136 }
137
139 {
140 get
141 {
142 return cachedFilter;
143 }
144 set
145 {
146 ThrowIfBound();
148 }
149 }
150
168
170 {
171 try
172 {
173 SetDefaults();
174 isBound = false;
175 return;
176 }
177 catch
178 {
179 //try-fault
180 base.Dispose(true);
181 throw;
182 }
183 }
184
185 private SamplerState(TextureFilter filter, TextureAddressMode address, string name)
186 {
187 try
188 {
189 SetDefaults();
190 ThrowIfBound();
191 cachedFilter = filter;
192 ThrowIfBound();
193 cachedAddressU = address;
194 ThrowIfBound();
195 cachedAddressV = address;
196 ThrowIfBound();
197 cachedAddressW = address;
198 base.Name = name;
199 isBound = true;
200 return;
201 }
202 catch
203 {
204 //try-fault
205 base.Dispose(true);
206 throw;
207 }
208 }
209
210 private void _007ESamplerState()
211 {
212 }
213
214 internal unsafe void Apply(GraphicsDevice device, int samplerIndex)
215 {
216 if (isDisposed)
217 {
218 throw new ObjectDisposedException(typeof(SamplerState).Name);
219 }
220 if (_parent != device)
221 {
222 _parent = device;
223 isBound = true;
224 uint num = *(uint*)((byte*)device.d3dCaps.t + 64);
225 switch (cachedFilter)
226 {
227 default:
228 minFilter = (_D3DTEXTUREFILTERTYPE)2;
229 magFilter = (_D3DTEXTUREFILTERTYPE)2;
230 mipFilter = (_D3DTEXTUREFILTERTYPE)2;
231 break;
232 case TextureFilter.Point:
233 minFilter = (_D3DTEXTUREFILTERTYPE)1;
234 magFilter = (_D3DTEXTUREFILTERTYPE)1;
235 mipFilter = (_D3DTEXTUREFILTERTYPE)1;
236 break;
237 case TextureFilter.Anisotropic:
238 {
239 _D3DTEXTUREFILTERTYPE d3DTEXTUREFILTERTYPE = (_D3DTEXTUREFILTERTYPE)(((num & 0x400) | 0x800) >> 10);
240 minFilter = d3DTEXTUREFILTERTYPE;
241 _D3DTEXTUREFILTERTYPE d3DTEXTUREFILTERTYPE2 = (_D3DTEXTUREFILTERTYPE)(((num & 0x4000000) | 0x8000000) >> 26);
242 magFilter = d3DTEXTUREFILTERTYPE2;
243 mipFilter = (_D3DTEXTUREFILTERTYPE)2;
244 break;
245 }
246 case TextureFilter.LinearMipPoint:
247 minFilter = (_D3DTEXTUREFILTERTYPE)2;
248 magFilter = (_D3DTEXTUREFILTERTYPE)2;
249 mipFilter = (_D3DTEXTUREFILTERTYPE)1;
250 break;
251 case TextureFilter.PointMipLinear:
252 minFilter = (_D3DTEXTUREFILTERTYPE)1;
253 magFilter = (_D3DTEXTUREFILTERTYPE)1;
254 mipFilter = (_D3DTEXTUREFILTERTYPE)2;
255 break;
256 case TextureFilter.MinLinearMagPointMipLinear:
257 minFilter = (_D3DTEXTUREFILTERTYPE)2;
258 magFilter = (_D3DTEXTUREFILTERTYPE)1;
259 mipFilter = (_D3DTEXTUREFILTERTYPE)2;
260 break;
261 case TextureFilter.MinLinearMagPointMipPoint:
262 minFilter = (_D3DTEXTUREFILTERTYPE)2;
263 magFilter = (_D3DTEXTUREFILTERTYPE)1;
264 mipFilter = (_D3DTEXTUREFILTERTYPE)1;
265 break;
266 case TextureFilter.MinPointMagLinearMipLinear:
267 minFilter = (_D3DTEXTUREFILTERTYPE)1;
268 magFilter = (_D3DTEXTUREFILTERTYPE)2;
269 mipFilter = (_D3DTEXTUREFILTERTYPE)2;
270 break;
271 case TextureFilter.MinPointMagLinearMipPoint:
272 minFilter = (_D3DTEXTUREFILTERTYPE)1;
273 magFilter = (_D3DTEXTUREFILTERTYPE)2;
274 mipFilter = (_D3DTEXTUREFILTERTYPE)1;
275 break;
276 }
277 d3dAddressU = _003CModule_003E.ConvertXnaAddressModeToDx(cachedAddressU);
278 d3dAddressV = _003CModule_003E.ConvertXnaAddressModeToDx(cachedAddressV);
279 d3dAddressW = _003CModule_003E.ConvertXnaAddressModeToDx(cachedAddressW);
280 int num2 = ((minFilter != (_D3DTEXTUREFILTERTYPE)1) ? 1 : 0);
281 filterMinFlag = (uint)num2;
282 int num3 = ((magFilter != (_D3DTEXTUREFILTERTYPE)1) ? 1 : 0);
283 filterMagFlag = (uint)num3;
284 int num4 = ((mipFilter != (_D3DTEXTUREFILTERTYPE)1) ? 1 : 0);
285 filterMipFlag = (uint)num4;
286 int num5 = ((d3dAddressU != (_D3DTEXTUREADDRESS)3) ? 1 : 0);
287 nonClampAddressUFlag = (uint)num5;
288 int num6 = ((d3dAddressV != (_D3DTEXTUREADDRESS)3) ? 1 : 0);
289 nonClampAddressVFlag = (uint)num6;
290 }
291 IntPtr pComPtr = (IntPtr)device.pComPtr;
292 Helpers.CheckDisposed(device, pComPtr);
293 int num7 = ((samplerIndex < 257) ? samplerIndex : (samplerIndex - 241));
294 EffectPass activePass = device.activePass;
295 if (activePass != null && ((uint)activePass._stateFlags & (uint)(8 << num7)) != 0)
296 {
297 activePass.EndPass();
298 device.activePass = null;
299 }
300 IDirect3DDevice9* pComPtr2 = device.pComPtr;
301 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, _D3DSAMPLERSTATETYPE, uint, int>)(int)(*(uint*)(*(int*)pComPtr2 + 276)))((nint)pComPtr2, (uint)samplerIndex, (_D3DSAMPLERSTATETYPE)6, (uint)minFilter);
302 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, _D3DSAMPLERSTATETYPE, uint, int>)(int)(*(uint*)(*(int*)pComPtr2 + 276)))((nint)pComPtr2, (uint)samplerIndex, (_D3DSAMPLERSTATETYPE)5, (uint)magFilter);
303 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, _D3DSAMPLERSTATETYPE, uint, int>)(int)(*(uint*)(*(int*)pComPtr2 + 276)))((nint)pComPtr2, (uint)samplerIndex, (_D3DSAMPLERSTATETYPE)7, (uint)mipFilter);
304 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, _D3DSAMPLERSTATETYPE, uint, int>)(int)(*(uint*)(*(int*)pComPtr2 + 276)))((nint)pComPtr2, (uint)samplerIndex, (_D3DSAMPLERSTATETYPE)1, (uint)d3dAddressU);
305 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, _D3DSAMPLERSTATETYPE, uint, int>)(int)(*(uint*)(*(int*)pComPtr2 + 276)))((nint)pComPtr2, (uint)samplerIndex, (_D3DSAMPLERSTATETYPE)2, (uint)d3dAddressV);
306 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, _D3DSAMPLERSTATETYPE, uint, int>)(int)(*(uint*)(*(int*)pComPtr2 + 276)))((nint)pComPtr2, (uint)samplerIndex, (_D3DSAMPLERSTATETYPE)3, (uint)d3dAddressW);
307 uint num8 = *(uint*)((byte*)device.d3dCaps.t + 108);
308 int num9 = cachedMaxAnisotropy;
309 uint num10 = (((uint)num9 >= num8) ? num8 : ((uint)num9));
310 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, _D3DSAMPLERSTATETYPE, uint, int>)(int)(*(uint*)(*(int*)pComPtr2 + 276)))((nint)pComPtr2, (uint)samplerIndex, (_D3DSAMPLERSTATETYPE)10, num10);
311 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, _D3DSAMPLERSTATETYPE, uint, int>)(int)(*(uint*)(*(int*)pComPtr2 + 276)))((nint)pComPtr2, (uint)samplerIndex, (_D3DSAMPLERSTATETYPE)9, (uint)cachedMaxMipLevel);
312 float num11 = cachedMipMapLevelOfDetailBias;
313 ((delegate* unmanaged[Stdcall, Stdcall]<IntPtr, uint, _D3DSAMPLERSTATETYPE, uint, int>)(int)(*(uint*)(*(int*)pComPtr2 + 276)))((nint)pComPtr2, (uint)samplerIndex, (_D3DSAMPLERSTATETYPE)8, *(uint*)(&num11));
314 StateTrackerDevice* pStateTracker = device.pStateTracker;
315 uint num12 = (uint)(~(1 << num7));
316 *(int*)((byte*)pStateTracker + 116) = (int)(filterMinFlag << num7) | (*(int*)((byte*)pStateTracker + 116) & (int)num12);
317 *(int*)((byte*)pStateTracker + 120) = (int)(filterMagFlag << num7) | ((int)num12 & *(int*)((byte*)pStateTracker + 120));
318 *(int*)((byte*)pStateTracker + 124) = (int)(filterMipFlag << num7) | (*(int*)((byte*)pStateTracker + 124) & (int)num12);
319 *(int*)((byte*)pStateTracker + 128) = (int)(nonClampAddressUFlag << num7) | (*(int*)((byte*)pStateTracker + 128) & (int)num12);
320 *(int*)((byte*)pStateTracker + 132) = (int)(nonClampAddressVFlag << num7) | (*(int*)((byte*)pStateTracker + 132) & (int)num12);
321 }
322
323 internal void ThrowIfBound()
324 {
325 if (isBound)
326 {
327 throw new InvalidOperationException(string.Format(args: new object[1] { typeof(SamplerState).Name }, provider: CultureInfo.CurrentCulture, format: FrameworkResources.BoundStateObject));
328 }
329 }
330
331 [HandleProcessCorruptedStateExceptions]
332 protected override void Dispose([MarshalAs(UnmanagedType.U1)] bool P_0)
333 {
334 if (P_0)
335 {
336 try
337 {
339 return;
340 }
341 finally
342 {
343 base.Dispose(true);
344 }
345 }
346 base.Dispose(false);
347 }
348}
unsafe void Apply(GraphicsDevice device, int samplerIndex)
SamplerState(TextureFilter filter, TextureAddressMode address, string name)
static readonly SamplerState LinearWrap
static readonly SamplerState AnisotropicWrap
static readonly SamplerState PointWrap
static readonly SamplerState AnisotropicClamp
static readonly SamplerState PointClamp
override void Dispose([MarshalAs(UnmanagedType.U1)] bool P_0)
static readonly SamplerState LinearClamp
static void CheckDisposed(object obj, IntPtr pComPtr)
Definition Helpers.cs:188
static CultureInfo CurrentCulture