Kav/Effects/DirectionalLightCollection.cs

72 lines
2.3 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace Kav
{
public class DirectionalLightCollection
{
private readonly Vector3[] directions = new Vector3[6];
private readonly Vector3[] colors = new Vector3[6];
private readonly float[] intensities = new float[6];
private readonly Matrix[] viewMatrices = new Matrix[6];
private readonly Matrix[] projectionMatrices = new Matrix[6];
private readonly Matrix[] viewProjectionMatrices = new Matrix[6];
readonly EffectParameter lightDirectionsParam;
readonly EffectParameter lightColorsParam;
readonly EffectParameter lightSpaceMatricesParam;
public DirectionalLightCollection(
EffectParameter lightDirectionsParam,
EffectParameter lightColorsParam,
EffectParameter lightSpaceMatricesParam
) {
this.lightDirectionsParam = lightDirectionsParam;
this.lightColorsParam = lightColorsParam;
this.lightSpaceMatricesParam = lightSpaceMatricesParam;
}
public void SetMatrices(int index, Matrix view, Matrix projection)
{
viewMatrices[index] = view;
projectionMatrices[index] = projection;
}
public void Apply()
{
for (int i = 0; i < 6; i++)
{
viewProjectionMatrices[i] = viewMatrices[i] * projectionMatrices[i];
}
lightSpaceMatricesParam.SetValue(viewProjectionMatrices);
}
public DirectionalLight this[int i]
{
get
{
var color = colors[i] / intensities[i];
return new DirectionalLight(
directions[i],
new Color(
color.X,
color.Y,
color.Z,
1f
),
intensities[i]
);
}
set
{
directions[i] = value.Direction;
colors[i] = value.Color.ToVector3() * value.Intensity;
intensities[i] = value.Intensity;
lightDirectionsParam.SetValue(directions);
lightColorsParam.SetValue(colors);
}
}
}
}