120 lines
4.0 KiB
C#
120 lines
4.0 KiB
C#
#region Using Statements
|
|
using System;
|
|
using ANX.Framework;
|
|
using ANX.Framework.Graphics;
|
|
|
|
#endregion // Using Statements
|
|
|
|
namespace StencilBuffer
|
|
{
|
|
public class Game1 : Game
|
|
{
|
|
private readonly GraphicsDeviceManager graphics;
|
|
private SpriteBatch spriteBatch;
|
|
private Texture2D crate;
|
|
private Texture2D ground;
|
|
|
|
protected static SamplerState SamplerState = new SamplerState()
|
|
{
|
|
AddressU = TextureAddressMode.Wrap,
|
|
AddressV = TextureAddressMode.Wrap,
|
|
AddressW = TextureAddressMode.Wrap,
|
|
Filter = TextureFilter.Linear,
|
|
};
|
|
|
|
private static readonly DepthStencilState RenderGroundStencilState = new DepthStencilState()
|
|
{
|
|
DepthBufferEnable = false,
|
|
DepthBufferWriteEnable = false,
|
|
StencilEnable = true,
|
|
ReferenceStencil = 1,
|
|
StencilPass = StencilOperation.Replace,
|
|
StencilFunction = CompareFunction.Always,
|
|
};
|
|
|
|
private static readonly DepthStencilState RenderObjectsStencilState = new DepthStencilState()
|
|
{
|
|
DepthBufferEnable = true,
|
|
DepthBufferWriteEnable = true,
|
|
DepthBufferFunction = CompareFunction.Always,
|
|
ReferenceStencil = 1,
|
|
StencilEnable = false,
|
|
StencilPass = StencilOperation.Replace,
|
|
};
|
|
|
|
private static readonly DepthStencilState StencilStateRenderShadows = new DepthStencilState
|
|
{
|
|
DepthBufferEnable = false,
|
|
StencilEnable = true,
|
|
ReferenceStencil = 1,
|
|
StencilPass = StencilOperation.Increment,
|
|
StencilFunction = CompareFunction.LessEqual,
|
|
};
|
|
|
|
public Game1()
|
|
{
|
|
graphics = new GraphicsDeviceManager(this);
|
|
|
|
Content.RootDirectory = "SampleContent";
|
|
}
|
|
|
|
protected override void Initialize()
|
|
{
|
|
graphics.PreferredBackBufferWidth = 480;
|
|
graphics.PreferredBackBufferHeight = 330;
|
|
graphics.PreferredDepthStencilFormat = DepthFormat.Depth24Stencil8;
|
|
graphics.ApplyChanges();
|
|
|
|
base.Initialize();
|
|
}
|
|
|
|
protected override void LoadContent()
|
|
{
|
|
spriteBatch = new SpriteBatch(GraphicsDevice);
|
|
|
|
crate = Content.Load<Texture2D>(@"Textures/chest");
|
|
ground = Content.Load<Texture2D>(@"Textures/stone_tile");
|
|
}
|
|
|
|
private void RenderObjects()
|
|
{
|
|
spriteBatch.Begin(SpriteSortMode.Texture, null, SamplerState, RenderObjectsStencilState, null);
|
|
spriteBatch.Draw(crate, new Vector2(100, 100), Color.White);
|
|
spriteBatch.Draw(crate, new Vector2(-15, -15), Color.White);
|
|
spriteBatch.End();
|
|
}
|
|
|
|
private void RenderGround()
|
|
{
|
|
spriteBatch.Begin(SpriteSortMode.Texture, null, SamplerState, RenderGroundStencilState, null);
|
|
for (int y = 0; y < 2; y++)
|
|
{
|
|
for (int x = 0; x < 4; x++)
|
|
{
|
|
spriteBatch.Draw(ground, new Vector2(x * 255, y * 255), Color.White);
|
|
}
|
|
}
|
|
spriteBatch.End();
|
|
}
|
|
|
|
private void RenderShadows()
|
|
{
|
|
spriteBatch.Begin(SpriteSortMode.Texture, null, SamplerState, StencilStateRenderShadows, null);
|
|
spriteBatch.Draw(crate, new Vector2(125, 125), new Color(0, 0, 0, 0.5f));
|
|
spriteBatch.Draw(crate, new Vector2(10, 10), new Color(0, 0, 0, 0.5f));
|
|
spriteBatch.End();
|
|
}
|
|
|
|
protected override void Draw(GameTime gameTime)
|
|
{
|
|
GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.Stencil, Color.CornflowerBlue, 1.0f, 0);
|
|
|
|
RenderGround();
|
|
RenderShadows();
|
|
RenderObjects();
|
|
|
|
base.Draw(gameTime);
|
|
}
|
|
}
|
|
}
|