anx.framework/ANX.Framework/Graphics/DepthStencilState.cs
Konstantin Koch 85322e2363 Migrated Primitives, RecordingSample, RenderTarget and SimpleSprite. Also implemented DynamicBuffers and fixed many Dispose functions
increased the amount of shared code between vertex and index buffers
fixed GraphicsDevice.Reset() which didn't save the provided presentation
parameters and the backbuffer was still bound after the recent changes
about the rendertargets
Vertex and IndexBuffers that get dynamically generated for the UserDraw
methods dispose the buffers now
Added DebugNames to Index and VertexBuffers and their Dynamic version.
2015-10-04 21:30:00 +02:00

329 lines
10 KiB
C#

#region Using Statements
using System;
using ANX.Framework.NonXNA;
using System.Runtime.InteropServices;
using ANX.Framework.NonXNA.Development;
#endregion // Using Statements
// 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.Framework.Graphics
{
[PercentageComplete(100)]
[Developer("Glatzemann")]
[TestState(TestStateAttribute.TestState.Untested)]
public class DepthStencilState : GraphicsResource
{
#region Private Members
private INativeDepthStencilState nativeDepthStencilState;
private StencilOperation counterClockwiseStencilDepthBufferFail;
private StencilOperation counterClockwiseStencilFail;
private CompareFunction counterClockwiseStencilFunction;
private StencilOperation counterClockwiseStencilPass;
private bool depthBufferEnable;
private CompareFunction depthBufferFunction;
private bool depthBufferWriteEnable;
private int referenceStencil;
private StencilOperation stencilDepthBufferFail;
private bool stencilEnable;
private StencilOperation stencilFail;
private CompareFunction stencilFunction;
private int stencilMask;
private StencilOperation stencilPass;
private int stencilWriteMask;
private bool twoSidedStencilMode;
#endregion
public static readonly DepthStencilState Default;
public static readonly DepthStencilState DepthRead;
public static readonly DepthStencilState None;
public DepthStencilState()
{
nativeDepthStencilState = AddInSystemFactory.Instance.GetDefaultCreator<IRenderSystemCreator>().CreateDepthStencilState();
// BackFace
CounterClockwiseStencilDepthBufferFail = StencilOperation.Keep;
CounterClockwiseStencilFail = StencilOperation.Keep;
CounterClockwiseStencilFunction = CompareFunction.Always;
CounterClockwiseStencilPass = StencilOperation.Keep;
// FrontFace
StencilDepthBufferFail = StencilOperation.Keep;
StencilFail = StencilOperation.Keep;
StencilFunction = CompareFunction.Always;
StencilPass = StencilOperation.Keep;
DepthBufferEnable = true;
DepthBufferFunction = CompareFunction.LessEqual;
DepthBufferWriteEnable = true;
ReferenceStencil = 0;
StencilEnable = false;
StencilMask = int.MaxValue;
StencilWriteMask = int.MaxValue;
TwoSidedStencilMode = false;
}
private DepthStencilState(bool depthBufferEnabled, bool depthBufferWriteEnabled, string name)
{
nativeDepthStencilState = AddInSystemFactory.Instance.GetDefaultCreator<IRenderSystemCreator>().CreateDepthStencilState();
// BackFace
CounterClockwiseStencilDepthBufferFail = StencilOperation.Keep;
CounterClockwiseStencilFail = StencilOperation.Keep;
CounterClockwiseStencilFunction = CompareFunction.Always;
CounterClockwiseStencilPass = StencilOperation.Keep;
// FrontFace
StencilDepthBufferFail = StencilOperation.Keep;
StencilFail = StencilOperation.Keep;
StencilFunction = CompareFunction.Always;
StencilPass = StencilOperation.Keep;
DepthBufferEnable = depthBufferEnabled;
DepthBufferFunction = CompareFunction.LessEqual;
DepthBufferWriteEnable = depthBufferWriteEnabled;
ReferenceStencil = 0;
StencilEnable = false;
StencilMask = int.MaxValue;
StencilWriteMask = int.MaxValue;
TwoSidedStencilMode = false;
Name = name;
}
static DepthStencilState()
{
None = new DepthStencilState(false, false, "DepthStencilState.None");
Default = new DepthStencilState(true, true, "DepthStencilState.Default");
DepthRead = new DepthStencilState(true, false, "DepthStencilState.DepthRead");
}
internal INativeDepthStencilState NativeDepthStencilState
{
get
{
return this.nativeDepthStencilState;
}
}
public StencilOperation CounterClockwiseStencilDepthBufferFail
{
get { return this.counterClockwiseStencilDepthBufferFail; }
set
{
ThrowIfBound();
this.counterClockwiseStencilDepthBufferFail = value;
this.nativeDepthStencilState.CounterClockwiseStencilDepthBufferFail = value;
}
}
public StencilOperation CounterClockwiseStencilFail
{
get { return this.counterClockwiseStencilFail; }
set
{
ThrowIfBound();
this.counterClockwiseStencilFail = value;
this.nativeDepthStencilState.CounterClockwiseStencilFail = value;
}
}
public CompareFunction CounterClockwiseStencilFunction
{
get { return this.counterClockwiseStencilFunction; }
set
{
ThrowIfBound();
this.counterClockwiseStencilFunction = value;
this.nativeDepthStencilState.CounterClockwiseStencilFunction = value;
}
}
public StencilOperation CounterClockwiseStencilPass
{
get { return this.counterClockwiseStencilPass; }
set
{
ThrowIfBound();
this.counterClockwiseStencilPass = value;
this.nativeDepthStencilState.CounterClockwiseStencilPass = value;
}
}
public bool DepthBufferEnable
{
get { return this.depthBufferEnable; }
set
{
ThrowIfBound();
this.depthBufferEnable = value;
this.nativeDepthStencilState.DepthBufferEnable = value;
}
}
public CompareFunction DepthBufferFunction
{
get { return this.depthBufferFunction; }
set
{
ThrowIfBound();
this.depthBufferFunction = value;
this.nativeDepthStencilState.DepthBufferFunction = value;
}
}
public bool DepthBufferWriteEnable
{
get { return this.depthBufferWriteEnable; }
set
{
ThrowIfBound();
this.depthBufferWriteEnable = value;
this.nativeDepthStencilState.DepthBufferWriteEnable = value;
}
}
public int ReferenceStencil
{
get { return this.referenceStencil; }
set
{
ThrowIfBound();
this.referenceStencil = value;
this.nativeDepthStencilState.ReferenceStencil = value;
}
}
public StencilOperation StencilDepthBufferFail
{
get { return this.stencilDepthBufferFail; }
set
{
ThrowIfBound();
this.stencilDepthBufferFail = value;
this.nativeDepthStencilState.StencilDepthBufferFail = value;
}
}
public bool StencilEnable
{
get { return this.stencilEnable; }
set
{
ThrowIfBound();
this.stencilEnable = value;
this.nativeDepthStencilState.StencilEnable = value;
}
}
public StencilOperation StencilFail
{
get { return this.stencilFail; }
set
{
ThrowIfBound();
this.stencilFail = value;
this.nativeDepthStencilState.StencilFail = value;
}
}
public CompareFunction StencilFunction
{
get { return this.stencilFunction; }
set
{
ThrowIfBound();
this.stencilFunction = value;
this.nativeDepthStencilState.StencilFunction = value;
}
}
public int StencilMask
{
get { return this.stencilMask; }
set
{
ThrowIfBound();
this.stencilMask = value;
this.nativeDepthStencilState.StencilMask = value;
}
}
public StencilOperation StencilPass
{
get { return this.stencilPass; }
set
{
ThrowIfBound();
this.stencilPass = value;
this.nativeDepthStencilState.StencilPass = value;
}
}
public int StencilWriteMask
{
get { return this.stencilWriteMask; }
set
{
ThrowIfBound();
this.stencilWriteMask = value;
this.nativeDepthStencilState.StencilWriteMask = value;
}
}
public bool TwoSidedStencilMode
{
get { return this.twoSidedStencilMode; }
set
{
ThrowIfBound();
this.twoSidedStencilMode = value;
this.nativeDepthStencilState.TwoSidedStencilMode = value;
}
}
private void ThrowIfBound()
{
if (nativeDepthStencilState.IsBound)
throw new InvalidOperationException(
"You are not allowed to change DepthStencilState properties while it is bound to the GraphicsDevice.");
}
protected override void Dispose(bool disposeManaged)
{
if (disposeManaged)
{
if (this.nativeDepthStencilState != null)
{
this.nativeDepthStencilState.Dispose();
this.nativeDepthStencilState = null;
}
}
base.Dispose(disposeManaged);
}
}
}