2020-12-08 05:36:16 +00:00
|
|
|
using Microsoft.Xna.Framework;
|
|
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
|
|
|
|
|
|
namespace Kav
|
|
|
|
{
|
|
|
|
public class DirectionalShadowMapData
|
|
|
|
{
|
|
|
|
public static readonly int MAX_SHADOW_CASCADES = 4;
|
|
|
|
|
|
|
|
public RenderTarget2D[] ShadowMaps { get; }
|
|
|
|
|
2020-12-08 11:07:41 +00:00
|
|
|
public Matrix[] LightSpaceViews { get; }
|
|
|
|
public Matrix[] LightSpaceProjections { get; }
|
2020-12-08 05:36:16 +00:00
|
|
|
|
|
|
|
public float[] CascadeFarPlanes { get; }
|
|
|
|
|
|
|
|
public int ShadowMapSize { get; }
|
|
|
|
public int NumShadowCascades { get; }
|
|
|
|
|
|
|
|
internal DirectionalShadowMapData(
|
|
|
|
GraphicsDevice graphicsDevice,
|
|
|
|
int shadowMapSize,
|
|
|
|
int numCascades
|
|
|
|
) {
|
|
|
|
ShadowMapSize = shadowMapSize;
|
|
|
|
NumShadowCascades = (int)MathHelper.Clamp(numCascades, 1, MAX_SHADOW_CASCADES);
|
|
|
|
|
2020-12-08 11:07:41 +00:00
|
|
|
LightSpaceViews = new Matrix[4];
|
|
|
|
LightSpaceProjections = new Matrix[4];
|
|
|
|
|
2020-12-08 05:36:16 +00:00
|
|
|
ShadowMaps = new RenderTarget2D[NumShadowCascades];
|
|
|
|
|
|
|
|
for (var i = 0; i < NumShadowCascades; i++)
|
|
|
|
{
|
|
|
|
ShadowMaps[i] = new RenderTarget2D(
|
|
|
|
graphicsDevice,
|
|
|
|
shadowMapSize,
|
|
|
|
shadowMapSize,
|
|
|
|
false,
|
|
|
|
SurfaceFormat.Single,
|
|
|
|
DepthFormat.Depth24,
|
|
|
|
0,
|
|
|
|
RenderTargetUsage.PreserveContents
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
CascadeFarPlanes = new float[MAX_SHADOW_CASCADES];
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Clear(GraphicsDevice graphicsDevice)
|
|
|
|
{
|
|
|
|
foreach (var shadowMap in ShadowMaps)
|
|
|
|
{
|
|
|
|
graphicsDevice.SetRenderTarget(shadowMap);
|
|
|
|
graphicsDevice.Clear(Color.White);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|