using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Kav { public class DirectionalLightCollection { private readonly Vector3[] directions = new Vector3[4]; private readonly Vector3[] colors = new Vector3[4]; private readonly float[] intensities = new float[4]; private readonly Matrix[] lightSpaceMatrices = new Matrix[4]; 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 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; lightSpaceMatrices[i] = value.View * value.Projection; lightDirectionsParam.SetValue(directions); lightColorsParam.SetValue(colors); lightSpaceMatricesParam.SetValue(lightSpaceMatrices); } } } }