SND\AstrorEnales_cp ca0d730bbb - Working on Metro Platform and Rendering
- Further implementations in the PsVita RenderSystem
2012-08-12 20:00:19 +00:00

165 lines
3.6 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 RasterizerState_Metro : INativeRasterizerState
{
#region Private Members
private Dx11.RasterizerStateDescription description;
private Dx11.RasterizerState nativeRasterizerState;
private bool nativeRasterizerStateDirty;
private bool bound;
private const int intMaxOver16 = int.MaxValue / 16;
#endregion // Private Members
public RasterizerState_Metro()
{
this.description = new Dx11.RasterizerStateDescription();
this.description.IsAntialiasedLineEnabled = false;
this.nativeRasterizerStateDirty = true;
}
public void Apply(ANX.Framework.Graphics.GraphicsDevice graphicsDevice)
{
GraphicsDeviceWindowsMetro gdMetro = graphicsDevice.NativeDevice as GraphicsDeviceWindowsMetro;
var device = gdMetro.NativeDevice.NativeDevice;
var context = gdMetro.NativeDevice.NativeContext;
UpdateNativeRasterizerState(device);
this.bound = true;
context.Rasterizer.State = this.nativeRasterizerState;
}
public void Release()
{
this.bound = false;
}
public void Dispose()
{
if (this.nativeRasterizerState != null)
{
this.nativeRasterizerState.Dispose();
this.nativeRasterizerState = null;
}
}
public bool IsBound
{
get
{
return this.bound;
}
}
public ANX.Framework.Graphics.CullMode CullMode
{
set
{
Dx11.CullMode cullMode = FormatConverter.Translate(value);
if (description.CullMode != cullMode)
{
nativeRasterizerStateDirty = true;
description.CullMode = cullMode;
}
}
}
public float DepthBias
{
set
{
// XNA uses a float value in the range of 0f..16f as value
// DirectX 10 uses a INT value
int depthBiasValue = (int)(value * intMaxOver16);
if (description.DepthBias != depthBiasValue)
{
nativeRasterizerStateDirty = true;
description.DepthBias = depthBiasValue;
}
}
}
public ANX.Framework.Graphics.FillMode FillMode
{
set
{
Dx11.FillMode fillMode = FormatConverter.Translate(value);
if (description.FillMode != fillMode)
{
nativeRasterizerStateDirty = true;
description.FillMode = fillMode;
}
}
}
public bool MultiSampleAntiAlias
{
set
{
if (description.IsMultisampleEnabled != value)
{
nativeRasterizerStateDirty = true;
description.IsMultisampleEnabled = value;
}
}
}
public bool ScissorTestEnable
{
set
{
if (description.IsScissorEnabled != value)
{
nativeRasterizerStateDirty = true;
description.IsScissorEnabled = value;
}
}
}
public float SlopeScaleDepthBias
{
set
{
if (description.SlopeScaledDepthBias != value)
{
nativeRasterizerStateDirty = true;
description.SlopeScaledDepthBias = value;
}
}
}
private void UpdateNativeRasterizerState(Dx11.Device1 device)
{
if (this.nativeRasterizerStateDirty == true || this.nativeRasterizerState == null)
{
if (this.nativeRasterizerState != null)
{
this.nativeRasterizerState.Dispose();
this.nativeRasterizerState = null;
}
this.nativeRasterizerState = new Dx11.RasterizerState(device, ref this.description);
this.nativeRasterizerStateDirty = false;
}
}
}
}