using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Kav { public class LinearDepthEffect : Effect, IHasWorldMatrix { EffectParameter worldParam; EffectParameter worldViewProjectionParam; EffectParameter lightPositionParam; EffectParameter farPlaneParam; EffectDirtyFlags dirtyFlags = EffectDirtyFlags.All; Matrix world; Matrix view; Matrix projection; public Vector3 LightPosition { get; set; } public float FarPlane { get; set; } public Matrix World { get { return world; } set { world = value; dirtyFlags |= EffectDirtyFlags.World; dirtyFlags |= EffectDirtyFlags.WorldViewProj; } } public Matrix View { get { return view; } set { view = value; dirtyFlags |= EffectDirtyFlags.WorldViewProj; } } public Matrix Projection { get { return projection; } set { projection = value; dirtyFlags |= EffectDirtyFlags.WorldViewProj; } } public LinearDepthEffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.LinearDepthEffect) { CacheEffectParameters(); } protected override void OnApply() { if ((dirtyFlags & EffectDirtyFlags.WorldViewProj) != 0) { Matrix.Multiply(ref view, ref projection, out Matrix viewProjection); Matrix.Multiply(ref world, ref viewProjection, out Matrix worldViewProj); worldViewProjectionParam.SetValue(worldViewProj); dirtyFlags &= ~EffectDirtyFlags.WorldViewProj; } if ((dirtyFlags & EffectDirtyFlags.World) != 0) { worldParam.SetValue(world); dirtyFlags &= ~EffectDirtyFlags.World; } lightPositionParam.SetValue(LightPosition); farPlaneParam.SetValue(FarPlane); } private void CacheEffectParameters() { worldParam = Parameters["Model"]; worldViewProjectionParam = Parameters["ModelViewProjection"]; lightPositionParam = Parameters["LightPosition"]; farPlaneParam = Parameters["FarPlane"]; } } }