2012-08-11 22:03:44 +00:00

299 lines
6.2 KiB
C#

using System;
using ANX.Framework.Graphics;
using ANX.Framework.NonXNA;
using SceGraphics = Sce.PlayStation.Core.Graphics;
// 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.PsVita
{
public class PsVitaDepthStencilState : INativeDepthStencilState
{
#region Public
public bool IsBound
{
get;
private set;
}
public bool DepthBufferEnable
{
set;
private get;
}
public CompareFunction DepthBufferFunction
{
set;
private get;
}
public bool DepthBufferWriteEnable
{
set;
private get;
}
public bool StencilEnable
{
set;
private get;
}
public CompareFunction StencilFunction
{
set;
private get;
}
public int StencilMask
{
set;
private get;
}
public StencilOperation StencilDepthBufferFail
{
set;
private get;
}
public StencilOperation StencilFail
{
set;
private get;
}
public StencilOperation StencilPass
{
set;
private get;
}
public StencilOperation CounterClockwiseStencilDepthBufferFail
{
set;
private get;
}
public StencilOperation CounterClockwiseStencilFail
{
set;
private get;
}
public CompareFunction CounterClockwiseStencilFunction
{
set;
private get;
}
public StencilOperation CounterClockwiseStencilPass
{
set;
private get;
}
public bool TwoSidedStencilMode
{
set;
private get;
}
public int ReferenceStencil
{
set;
private get;
}
public int StencilWriteMask
{
set;
private get;
}
#endregion
#region Constructor
internal PsVitaDepthStencilState()
{
IsBound = false;
}
#endregion
#region Apply
public void Apply(GraphicsDevice graphicsDevice)
{
IsBound = true;
var context = PsVitaGraphicsDevice.Current.NativeContext;
#region Depth
if (DepthBufferEnable)
{
context.Enable(SceGraphics.EnableMode.DepthTest);
}
else
{
context.Disable(SceGraphics.EnableMode.DepthTest);
}
context.SetDepthFunc(TranslateDepthFunction(DepthBufferFunction),
DepthBufferWriteEnable);
#endregion
#region Stencil
if (StencilEnable)
{
context.Enable(SceGraphics.EnableMode.StencilTest);
}
else
{
context.Disable(SceGraphics.EnableMode.StencilTest);
}
if (TwoSidedStencilMode)
{
context.SetStencilOpFront(TranslateStencilOp(StencilFail),
TranslateStencilOp(StencilDepthBufferFail),
TranslateStencilOp(StencilPass));
context.SetStencilOpBack(TranslateStencilOp(CounterClockwiseStencilFail),
TranslateStencilOp(CounterClockwiseStencilDepthBufferFail),
TranslateStencilOp(CounterClockwiseStencilPass));
context.SetStencilFuncFront(
TranslateStencilFunction(StencilFunction),
ReferenceStencil, StencilMask, StencilWriteMask);
context.SetStencilFuncBack(
TranslateStencilFunction(CounterClockwiseStencilFunction),
ReferenceStencil, StencilMask, StencilWriteMask);
}
else
{
context.SetStencilOp(TranslateStencilOp(StencilFail),
TranslateStencilOp(StencilDepthBufferFail),
TranslateStencilOp(StencilPass));
context.SetStencilFunc(TranslateStencilFunction(StencilFunction),
ReferenceStencil, StencilMask, StencilWriteMask);
}
#endregion
}
#endregion
#region TranslateStencilOp
private SceGraphics.StencilOpMode TranslateStencilOp(StencilOperation operation)
{
switch (operation)
{
default:
case StencilOperation.Decrement:
return SceGraphics.StencilOpMode.Decr;
case StencilOperation.DecrementSaturation:
return SceGraphics.StencilOpMode.DecrWrap;
case StencilOperation.Increment:
return SceGraphics.StencilOpMode.Incr;
case StencilOperation.IncrementSaturation:
return SceGraphics.StencilOpMode.IncrWrap;
case StencilOperation.Invert:
return SceGraphics.StencilOpMode.Invert;
case StencilOperation.Keep:
return SceGraphics.StencilOpMode.Keep;
case StencilOperation.Replace:
return SceGraphics.StencilOpMode.Replace;
case StencilOperation.Zero:
return SceGraphics.StencilOpMode.Zero;
}
}
#endregion
#region TranslateDepthFunction
private SceGraphics.DepthFuncMode TranslateDepthFunction(CompareFunction func)
{
switch (func)
{
default:
case CompareFunction.Always:
return SceGraphics.DepthFuncMode.Always;
case CompareFunction.Equal:
return SceGraphics.DepthFuncMode.Equal;
case CompareFunction.Greater:
return SceGraphics.DepthFuncMode.Greater;
case CompareFunction.GreaterEqual:
return SceGraphics.DepthFuncMode.GEqual;
case CompareFunction.Less:
return SceGraphics.DepthFuncMode.Less;
case CompareFunction.LessEqual:
return SceGraphics.DepthFuncMode.LEqual;
case CompareFunction.Never:
return SceGraphics.DepthFuncMode.Never;
case CompareFunction.NotEqual:
return SceGraphics.DepthFuncMode.NotEequal;
}
}
#endregion
#region TranslateStencilFunction
private SceGraphics.StencilFuncMode TranslateStencilFunction(CompareFunction func)
{
switch (func)
{
default:
case CompareFunction.Always:
return SceGraphics.StencilFuncMode.Always;
case CompareFunction.Equal:
return SceGraphics.StencilFuncMode.Equal;
case CompareFunction.Greater:
return SceGraphics.StencilFuncMode.Greater;
case CompareFunction.GreaterEqual:
return SceGraphics.StencilFuncMode.GEqual;
case CompareFunction.Less:
return SceGraphics.StencilFuncMode.Less;
case CompareFunction.LessEqual:
return SceGraphics.StencilFuncMode.LEqual;
case CompareFunction.Never:
return SceGraphics.StencilFuncMode.Never;
case CompareFunction.NotEqual:
return SceGraphics.StencilFuncMode.NotEequal;
}
}
#endregion
#region Release
public void Release()
{
IsBound = false;
}
#endregion
#region Dispose
public void Dispose()
{
}
#endregion
}
}