using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Kav { public class SimpleDepthEffect : Effect { EffectParameter modelViewProjectionParam; EffectParameter nearParam; EffectParameter farParam; Matrix model; Matrix view; Matrix projection; EffectDirtyFlags dirtyFlags = EffectDirtyFlags.All; public Matrix Model { get { return model; } set { model = value; 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 float Near { get; set; } public float Far { get; set; } public SimpleDepthEffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.SimpleDepthEffect) { CacheEffectParameters(); } protected override void OnApply() { if ((dirtyFlags & EffectDirtyFlags.WorldViewProj) != 0) { Matrix.Multiply(ref model, ref view, out Matrix modelView); Matrix.Multiply(ref modelView, ref projection, out Matrix worldViewProj); modelViewProjectionParam.SetValue(worldViewProj); dirtyFlags &= ~EffectDirtyFlags.WorldViewProj; } nearParam.SetValue(Near); farParam.SetValue(Far); } private void CacheEffectParameters() { modelViewProjectionParam = Parameters["ModelViewProjection"]; nearParam = Parameters["near"]; farParam = Parameters["far"]; } } }