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

232 lines
5.0 KiB
C#

using System;
using ANX.Framework;
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 PsVitaBlendState : INativeBlendState
{
#region Public
public bool IsBound
{
get;
private set;
}
public BlendFunction AlphaBlendFunction
{
set;
private get;
}
public BlendFunction ColorBlendFunction
{
set;
private get;
}
public Blend AlphaSourceBlend
{
set;
private get;
}
public Blend AlphaDestinationBlend
{
set;
private get;
}
public Blend ColorSourceBlend
{
set;
private get;
}
public Blend ColorDestinationBlend
{
set;
private get;
}
public ColorWriteChannels ColorWriteChannels
{
set;
private get;
}
public ColorWriteChannels ColorWriteChannels1
{
set;
private get;
}
public ColorWriteChannels ColorWriteChannels2
{
set;
private get;
}
public ColorWriteChannels ColorWriteChannels3
{
set;
private get;
}
public Color BlendFactor
{
set;
private get;
}
public int MultiSampleMask
{
set;
private get;
}
#endregion
#region Constructor
internal PsVitaBlendState()
{
IsBound = false;
}
#endregion
#region Apply (TODO)
public void Apply(GraphicsDevice graphicsDevice)
{
IsBound = true;
var context = PsVitaGraphicsDevice.Current.NativeContext;
context.Enable(SceGraphics.EnableMode.Blend);
context.SetBlendFuncRgb(TranslateBlendFunction(ColorBlendFunction),
TranslateBlend(ColorSourceBlend), TranslateBlend(ColorDestinationBlend));
context.SetBlendFuncAlpha(TranslateBlendFunction(AlphaBlendFunction),
TranslateBlend(AlphaSourceBlend), TranslateBlend(AlphaDestinationBlend));
SetColorWriteChannel(context, ColorWriteChannels);
// TODO
//SetColorWriteChannel(context, ColorWriteChannels1);
//SetColorWriteChannel(context, ColorWriteChannels2);
//SetColorWriteChannel(context, ColorWriteChannels3);
//GL.BlendColor(BlendFactor.R * DatatypesMapping.ColorMultiplier,
// BlendFactor.G * DatatypesMapping.ColorMultiplier,
// BlendFactor.B * DatatypesMapping.ColorMultiplier,
// BlendFactor.A * DatatypesMapping.ColorMultiplier);
//ErrorHelper.Check("BlendColor");
// TODO: multi sample mask
}
#endregion
#region Release
public void Release()
{
IsBound = false;
}
#endregion
#region Dispose
public void Dispose()
{
}
#endregion
#region SetColorWriteChannel
private void SetColorWriteChannel(SceGraphics.GraphicsContext context,
ColorWriteChannels channels)
{
var mask = SceGraphics.ColorMask.None;
if((channels & ColorWriteChannels.Red) != 0)
{
mask |= SceGraphics.ColorMask.R;
}
if((channels & ColorWriteChannels.Green) != 0)
{
mask |= SceGraphics.ColorMask.G;
}
if((channels & ColorWriteChannels.Blue) != 0)
{
mask |= SceGraphics.ColorMask.B;
}
if((channels & ColorWriteChannels.Alpha) != 0)
{
mask |= SceGraphics.ColorMask.A;
}
context.SetColorMask(mask);
}
#endregion
#region TranslateBlend
private SceGraphics.BlendFuncFactor TranslateBlend(Blend blending)
{
switch (blending)
{
case Blend.SourceAlpha:
return SceGraphics.BlendFuncFactor.SrcAlpha;
case Blend.DestinationAlpha:
return SceGraphics.BlendFuncFactor.DstAlpha;
case Blend.DestinationColor:
return SceGraphics.BlendFuncFactor.DstColor;
case Blend.InverseDestinationAlpha:
return SceGraphics.BlendFuncFactor.OneMinusDstAlpha;
case Blend.InverseDestinationColor:
return SceGraphics.BlendFuncFactor.OneMinusDstColor;
case Blend.InverseSourceAlpha:
return SceGraphics.BlendFuncFactor.OneMinusSrcAlpha;
case Blend.One:
return SceGraphics.BlendFuncFactor.One;
case Blend.SourceAlphaSaturation:
return SceGraphics.BlendFuncFactor.SrcAlphaSaturate;
case Blend.Zero:
return SceGraphics.BlendFuncFactor.Zero;
default:
throw new ArgumentException("Unable to translate SourceBlend '" +
blending + "' to PsVita BlendFuncFactor.");
}
}
#endregion
#region TranslateBlendFunction
private SceGraphics.BlendFuncMode TranslateBlendFunction(BlendFunction func)
{
switch (func)
{
case BlendFunction.Add:
return SceGraphics.BlendFuncMode.Add;
case BlendFunction.Subtract:
return SceGraphics.BlendFuncMode.Subtract;
case BlendFunction.ReverseSubtract:
return SceGraphics.BlendFuncMode.ReverseSubtract;
}
throw new ArgumentException("Unable to translate BlendFunction '" +
func + "' to PsVita BlendFuncMode.");
}
#endregion
}
}