Files
LuaCsForBarotraumaEP/Libraries/MonoGame.Framework/Src/MonoGame.Framework/Graphics/SamplerStateCollection.cs
T
2020-06-04 16:41:07 +03:00

110 lines
3.9 KiB
C#

// MonoGame - Copyright (C) The MonoGame Team
// This file is subject to the terms and conditions defined in
// file 'LICENSE.txt', which is part of this source code package.
//
// Author: Kenneth James Pouncey
using System;
namespace Microsoft.Xna.Framework.Graphics
{
public sealed partial class SamplerStateCollection
{
private readonly GraphicsDevice _graphicsDevice;
private readonly SamplerState _samplerStateAnisotropicClamp;
private readonly SamplerState _samplerStateAnisotropicWrap;
private readonly SamplerState _samplerStateLinearClamp;
private readonly SamplerState _samplerStateLinearWrap;
private readonly SamplerState _samplerStatePointClamp;
private readonly SamplerState _samplerStatePointWrap;
private readonly SamplerState[] _samplers;
private readonly SamplerState[] _actualSamplers;
private readonly bool _applyToVertexStage;
partial void CalculateMaxDirty();
internal SamplerStateCollection(GraphicsDevice device, int maxSamplers, bool applyToVertexStage)
{
_graphicsDevice = device;
_samplerStateAnisotropicClamp = SamplerState.AnisotropicClamp.Clone();
_samplerStateAnisotropicWrap = SamplerState.AnisotropicWrap.Clone();
_samplerStateLinearClamp = SamplerState.LinearClamp.Clone();
_samplerStateLinearWrap = SamplerState.LinearWrap.Clone();
_samplerStatePointClamp = SamplerState.PointClamp.Clone();
_samplerStatePointWrap = SamplerState.PointWrap.Clone();
_samplers = new SamplerState[maxSamplers];
_actualSamplers = new SamplerState[maxSamplers];
_applyToVertexStage = applyToVertexStage;
CalculateMaxDirty();
Clear();
}
public SamplerState this [int index]
{
get
{
return _samplers[index];
}
set
{
if (value == null)
throw new ArgumentNullException("value");
if (_samplers[index] == value)
return;
_samplers[index] = value;
// Static state properties never actually get bound;
// instead we use our GraphicsDevice-specific version of them.
var newSamplerState = value;
if (ReferenceEquals(value, SamplerState.AnisotropicClamp))
newSamplerState = _samplerStateAnisotropicClamp;
else if (ReferenceEquals(value, SamplerState.AnisotropicWrap))
newSamplerState = _samplerStateAnisotropicWrap;
else if (ReferenceEquals(value, SamplerState.LinearClamp))
newSamplerState = _samplerStateLinearClamp;
else if (ReferenceEquals(value, SamplerState.LinearWrap))
newSamplerState = _samplerStateLinearWrap;
else if (ReferenceEquals(value, SamplerState.PointClamp))
newSamplerState = _samplerStatePointClamp;
else if (ReferenceEquals(value, SamplerState.PointWrap))
newSamplerState = _samplerStatePointWrap;
newSamplerState.BindToGraphicsDevice(_graphicsDevice);
_actualSamplers[index] = newSamplerState;
PlatformSetSamplerState(index);
}
}
internal void Clear()
{
for (var i = 0; i < _samplers.Length; i++)
{
_samplers[i] = SamplerState.LinearWrap;
_samplerStateLinearWrap.BindToGraphicsDevice(_graphicsDevice);
_actualSamplers[i] = _samplerStateLinearWrap;
}
PlatformClear();
}
/// <summary>
/// Mark all the sampler slots as dirty.
/// </summary>
internal void Dirty()
{
PlatformDirty();
}
}
}