00001
00002
00003
00004
00005
00006 namespace NewGamePhysics.GraphicalElements
00007 {
00008 using System;
00009 using System.Collections.Generic;
00010 using System.Linq;
00011 using System.Text;
00012
00013 using Microsoft.Xna.Framework;
00014 using Microsoft.Xna.Framework.Content;
00015 using Microsoft.Xna.Framework.Graphics;
00016
00017 using NewGamePhysics.StateManager;
00018 using NewGamePhysics.Utilities;
00019 using NewGamePhysics.Mathematics;
00020
00024 public class LaplaceOverlay : GraphicalElementBase
00025 {
00026
00030 private Effect extractEffect;
00031
00035 private Effect laplaceEffect;
00036
00040 private Effect combineEffect;
00041
00045 private ResolveTexture2D resolveTarget;
00046
00050 private RenderTarget2D renderTarget1;
00051
00055 private RenderTarget2D renderTarget2;
00056
00060 EffectParameter offsetsParameter;
00061
00065 Vector2[] tapOffsets;
00066
00071 public LaplaceOverlay(
00072 ScreenManager screenManager)
00073 : base(screenManager)
00074 {
00075 }
00076
00081 public void LoadContent()
00082 {
00083 this.extractEffect =
00084 this.ScreenManager.Game.Content.Load<Effect>("Effects/GreyscaleCutoff");
00085 this.laplaceEffect =
00086 this.ScreenManager.Game.Content.Load<Effect>("Effects/Laplace");
00087 this.combineEffect =
00088 this.ScreenManager.Game.Content.Load<Effect>("Effects/CombineContour");
00089
00090
00091 PresentationParameters presentationParams =
00092 this.ScreenManager.GraphicsDevice.PresentationParameters;
00093 int width = presentationParams.BackBufferWidth;
00094 int height = presentationParams.BackBufferHeight;
00095 SurfaceFormat format = presentationParams.BackBufferFormat;
00096
00097
00098 this.resolveTarget = new ResolveTexture2D(
00099 this.ScreenManager.GraphicsDevice,
00100 width,
00101 height,
00102 1,
00103 format);
00104
00105
00106 width /= 8;
00107 height /= 8;
00108 renderTarget1 = new RenderTarget2D(
00109 this.ScreenManager.GraphicsDevice,
00110 width,
00111 height,
00112 1,
00113 format,
00114 this.ScreenManager.GraphicsDevice.DepthStencilBuffer.MultiSampleType,
00115 this.ScreenManager.GraphicsDevice.PresentationParameters.MultiSampleQuality);
00116 renderTarget2 = new RenderTarget2D(
00117 this.ScreenManager.GraphicsDevice,
00118 width,
00119 height,
00120 1,
00121 format,
00122 this.ScreenManager.GraphicsDevice.DepthStencilBuffer.MultiSampleType,
00123 this.ScreenManager.GraphicsDevice.PresentationParameters.MultiSampleQuality);
00124
00125 this.offsetsParameter = this.laplaceEffect.Parameters["TapOffsets"];
00126
00127
00128 this.tapOffsets = new Vector2[4];
00129 float dx = 1.0f / width;
00130 float dy = 1.0f / height;
00131 this.tapOffsets[0] = new Vector2(0.0f, dy);
00132 this.tapOffsets[1] = new Vector2(0.0f, -dy);
00133 this.tapOffsets[2] = new Vector2( dx, 0.0f);
00134 this.tapOffsets[3] = new Vector2(-dx, 0.0f);
00135 }
00136
00140 public void UnloadContent()
00141 {
00142 resolveTarget.Dispose();
00143 renderTarget1.Dispose();
00144 renderTarget2.Dispose();
00145 }
00146
00152 public void Draw(GameTime gameTime)
00153 {
00154
00155
00156 this.ScreenManager.GraphicsDevice.ResolveBackBuffer(resolveTarget);
00157
00158
00159
00160 this.extractEffect.Parameters["threshold"].SetValue(0.25f);
00161 DrawQuadWithEffect(resolveTarget, renderTarget1, this.extractEffect);
00162
00163
00164 for (int i = 0; i < 12; i++)
00165 {
00166
00167
00168
00169 this.offsetsParameter.SetValue(tapOffsets);
00170 DrawQuadWithEffect(renderTarget1.GetTexture(), renderTarget2, this.laplaceEffect);
00171
00172
00173
00174 this.offsetsParameter.SetValue(tapOffsets);
00175 DrawQuadWithEffect(renderTarget2.GetTexture(), renderTarget1, this.laplaceEffect);
00176 }
00177
00178
00179
00180
00181 this.ScreenManager.GraphicsDevice.Textures[1] = resolveTarget;
00182 this.combineEffect.Parameters["ContourFrequency"].SetValue(128.0f);
00183 Viewport viewport = this.ScreenManager.GraphicsDevice.Viewport;
00184 this.ScreenManager.SpriteBatch.Begin(
00185 SpriteBlendMode.None,
00186 SpriteSortMode.Immediate,
00187 SaveStateMode.None);
00188 this.combineEffect.Begin();
00189 this.combineEffect.CurrentTechnique.Passes[0].Begin();
00190 this.ScreenManager.SpriteBatch.Draw(
00191 renderTarget1.GetTexture(),
00192 new Rectangle(0, 0, viewport.Width, viewport.Height),
00193 Color.White);
00194 this.ScreenManager.SpriteBatch.End();
00195 this.combineEffect.CurrentTechnique.Passes[0].End();
00196 this.combineEffect.End();
00197 }
00198
00205 private void DrawQuadWithEffect(
00206 Texture2D texture,
00207 RenderTarget2D renderTarget,
00208 Effect effect)
00209 {
00210 this.ScreenManager.GraphicsDevice.SetRenderTarget(0, renderTarget);
00211 this.ScreenManager.SpriteBatch.Begin(
00212 SpriteBlendMode.None,
00213 SpriteSortMode.Immediate,
00214 SaveStateMode.None);
00215 effect.Begin();
00216 effect.CurrentTechnique.Passes[0].Begin();
00217 this.ScreenManager.SpriteBatch.Draw(
00218 texture,
00219 new Rectangle(0, 0, renderTarget.Width, renderTarget.Height),
00220 Color.White);
00221 this.ScreenManager.SpriteBatch.End();
00222 effect.CurrentTechnique.Passes[0].End();
00223 effect.End();
00224 this.ScreenManager.GraphicsDevice.SetRenderTarget(0, null);
00225 }
00226 }
00227 }