void DrawSpritesRecursive ( GameTime gameTime, StereoEye stereoEye, RenderTargetSurface surface, IEnumerable<SpriteLayer> layers, Matrix parentTransform, Color4 parentColor )
{
int w = surface.Width;
int h = surface.Height;
var ofs = 0f;
var projection = Matrix.OrthoOffCenterRH(ofs, w + ofs, h + ofs, ofs, -9999, 9999);
var orderedLayers = layers.Where( layer0 => layer0!=null ).OrderBy( layer1 => layer1.Order );
foreach ( var layer in orderedLayers ) {
if (!layer.Visible) {
continue;
}
using ( new PixEvent("SpriteLayer") ) {
Matrix absTransform = parentTransform * layer.Transform;
Color4 absColor = parentColor * layer.Color.ToColor4();
constData.Transform = absTransform * projection;
constData.ClipRectangle = new Vector4(0,0,0,0);
constData.MasterColor = absColor;
constBuffer.SetData( constData );
device.VertexShaderConstants[0] = constBuffer;
device.PixelShaderConstants[0] = constBuffer;
PipelineState ps = null;
SamplerState ss = null;
switch ( layer.FilterMode ) {
case SpriteFilterMode.PointClamp : ss = SamplerState.PointClamp; break;
case SpriteFilterMode.PointWrap : ss = SamplerState.PointWrap; break;
case SpriteFilterMode.LinearClamp : ss = SamplerState.LinearClamp; break;
case SpriteFilterMode.LinearWrap : ss = SamplerState.LinearWrap; break;
case SpriteFilterMode.AnisotropicClamp : ss = SamplerState.AnisotropicClamp; break;
case SpriteFilterMode.AnisotropicWrap : ss = SamplerState.AnisotropicWrap; break;
}
switch ( layer.BlendMode ) {
case SpriteBlendMode.Opaque : ps = factory[(int)Flags.OPAQUE ]; break;
case SpriteBlendMode.AlphaBlend : ps = factory[(int)Flags.ALPHA_BLEND ]; break;
case SpriteBlendMode.AlphaBlendPremul : ps = factory[(int)Flags.ALPHA_BLEND_PREMUL]; break;
case SpriteBlendMode.Additive : ps = factory[(int)Flags.ADDITIVE ]; break;
case SpriteBlendMode.Screen : ps = factory[(int)Flags.SCREEN ]; break;
case SpriteBlendMode.Multiply : ps = factory[(int)Flags.MULTIPLY ]; break;
case SpriteBlendMode.NegMultiply : ps = factory[(int)Flags.NEG_MULTIPLY ]; break;
case SpriteBlendMode.AlphaOnly : ps = factory[(int)Flags.ALPHA_ONLY ]; break;
}
device.PipelineState = ps;
device.PixelShaderSamplers[0] = ss;
layer.Draw( gameTime, stereoEye );
DrawSpritesRecursive( gameTime, stereoEye, surface, layer.Layers, absTransform, absColor );
}
}
}
}