144 lines
3.0 KiB
C#

using System;
using ANX.Framework.Graphics;
using ANX.Framework.NonXNA;
using Dx11 = SharpDX.Direct3D11;
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license
namespace ANX.RenderSystem.Windows.Metro
{
public class SamplerState_Metro : BaseStateObject, INativeSamplerState
{
#region Private
private Dx11.SamplerStateDescription description;
private Dx11.SamplerState nativeSamplerState;
#endregion
#region Public
public TextureAddressMode AddressU
{
set
{
Dx11.TextureAddressMode mode = FormatConverter.Translate(value);
SetValueIfDifferentAndMarkDirty(
ref description.AddressU, ref mode);
}
}
public TextureAddressMode AddressV
{
set
{
Dx11.TextureAddressMode mode = FormatConverter.Translate(value);
SetValueIfDifferentAndMarkDirty(
ref description.AddressV, ref mode);
}
}
public TextureAddressMode AddressW
{
set
{
Dx11.TextureAddressMode mode = FormatConverter.Translate(value);
SetValueIfDifferentAndMarkDirty(
ref description.AddressW, ref mode);
}
}
public TextureFilter Filter
{
set
{
Dx11.Filter filter = FormatConverter.Translate(value);
SetValueIfDifferentAndMarkDirty(
ref description.Filter, ref filter);
}
}
public int MaxAnisotropy
{
set
{
SetValueIfDifferentAndMarkDirty(
ref description.MaximumAnisotropy, ref value);
}
}
public int MaxMipLevel
{
set
{
if (description.MaximumLod != value)
{
description.MaximumLod = value;
isDirty = true;
}
}
}
public float MipMapLevelOfDetailBias
{
set
{
SetValueIfDifferentAndMarkDirty(
ref description.MipLodBias, ref value);
}
}
#endregion
#region Constructor
public SamplerState_Metro()
: base()
{
description = new Dx11.SamplerStateDescription();
}
#endregion
#region Apply (TODO)
public void Apply(GraphicsDevice graphicsDevice, int index)
{
UpdateNativeSamplerState();
bound = true;
NativeDxDevice.Current.NativeContext.PixelShader.SetSampler(
index, this.nativeSamplerState);
}
#endregion
#region Dispose
public void Dispose()
{
if (nativeSamplerState != null)
{
nativeSamplerState.Dispose();
nativeSamplerState = null;
}
}
#endregion
#region UpdateNativeSamplerState
private void UpdateNativeSamplerState()
{
if (isDirty == true || nativeSamplerState == null)
{
if (nativeSamplerState != null)
{
nativeSamplerState.Dispose();
nativeSamplerState = null;
}
// TODO: otherwise crashes for now
description.MaximumLod = float.MaxValue;
nativeSamplerState = new Dx11.SamplerState(
NativeDxDevice.Current.NativeDevice, ref description);
isDirty = false;
}
}
#endregion
}
}