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); } } } }