105 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
| using Microsoft.Xna.Framework;
 | |
| using Microsoft.Xna.Framework.Graphics;
 | |
| 
 | |
| namespace Kav
 | |
| {
 | |
|     public class SimpleDepthEffect : Effect, IHasWorldMatrix
 | |
|     {
 | |
|         EffectParameter worldParam;
 | |
|         EffectParameter viewProjectionParam;
 | |
|         EffectParameter vertexShaderIndexParam;
 | |
| 
 | |
|         Matrix world;
 | |
|         Matrix view;
 | |
|         Matrix projection;
 | |
|         bool hardwareInstancingEnabled = false;
 | |
| 
 | |
|         EffectDirtyFlags dirtyFlags = EffectDirtyFlags.All;
 | |
| 
 | |
|         public Matrix World
 | |
|         {
 | |
|             get { return world; }
 | |
|             set
 | |
|             {
 | |
|                 world = value;
 | |
|                 dirtyFlags |= EffectDirtyFlags.World;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public Matrix View
 | |
|         {
 | |
|             get { return view; }
 | |
|             set
 | |
|             {
 | |
|                 view = value;
 | |
|                 dirtyFlags |= EffectDirtyFlags.ViewProj;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public Matrix Projection
 | |
|         {
 | |
|             get { return projection; }
 | |
|             set
 | |
|             {
 | |
|                 projection = value;
 | |
|                 dirtyFlags |= EffectDirtyFlags.ViewProj;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool HardwareInstancingEnabled
 | |
|         {
 | |
|             get { return hardwareInstancingEnabled; }
 | |
|             set
 | |
|             {
 | |
|                 if (value != hardwareInstancingEnabled)
 | |
|                 {
 | |
|                     hardwareInstancingEnabled = value;
 | |
|                     dirtyFlags |= EffectDirtyFlags.VertexShaderIndex;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public SimpleDepthEffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.SimpleDepthEffect)
 | |
|         {
 | |
|             CacheEffectParameters();
 | |
|         }
 | |
| 
 | |
|         protected override void OnApply()
 | |
|         {
 | |
|             if ((dirtyFlags & EffectDirtyFlags.World) != 0)
 | |
|             {
 | |
|                 worldParam.SetValue(world);
 | |
| 
 | |
|                 dirtyFlags &= ~EffectDirtyFlags.World;
 | |
|             }
 | |
| 
 | |
|             if ((dirtyFlags & EffectDirtyFlags.ViewProj) != 0)
 | |
|             {
 | |
|                 Matrix.Multiply(ref view, ref projection, out Matrix viewProjection);
 | |
|                 viewProjectionParam.SetValue(viewProjection);
 | |
| 
 | |
|                 dirtyFlags &= ~EffectDirtyFlags.ViewProj;
 | |
|             }
 | |
| 
 | |
|             if ((dirtyFlags & EffectDirtyFlags.VertexShaderIndex) != 0)
 | |
|             {
 | |
|                 int vertexShaderIndex = 0;
 | |
| 
 | |
|                 if (hardwareInstancingEnabled)
 | |
|                 {
 | |
|                     vertexShaderIndex = 1;
 | |
|                 }
 | |
| 
 | |
|                 vertexShaderIndexParam.SetValue(vertexShaderIndex);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void CacheEffectParameters()
 | |
|         {
 | |
|             worldParam = Parameters["World"];
 | |
|             viewProjectionParam = Parameters["ViewProjection"];
 | |
|             vertexShaderIndexParam = Parameters["VertexShaderIndex"];
 | |
|         }
 | |
|     }
 | |
| }
 |