232 lines
5.0 KiB
C#
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
|
|
}
|
|
}
|