Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
HeatShimmerPlugin.cs
Go to the documentation of this file.
1 // Copyright (c) 2011 Silicon Studio
2 
3 using System;
4 using System.Collections.Generic;
5 
6 using SiliconStudio.Paradox.DataModel;
7 using SiliconStudio.Paradox.Effects.Data;
8 using SiliconStudio.Paradox.Effects.Modules;
9 using SiliconStudio.Paradox.Games;
10 using SiliconStudio.Paradox.Graphics;
11 using SiliconStudio.Core;
12 using SiliconStudio.Core.Mathematics;
13 using SiliconStudio.Paradox.Shaders;
14 
15 namespace SiliconStudio.Paradox.Effects
16 {
17  /// <summary>
18  /// Light Shaft plugin.
19  /// </summary>
21  {
22  private RenderPass boundingBoxPass, heatShimmerPass, heatShimmerComposePass;
23  private List<EffectMesh> effectMeshes = new List<EffectMesh>();
24 
25  /// <summary>
26  /// Initializes a new instance of class <see cref="LightShaftsPlugin"/>.
27  /// </summary>
28  public HeatShimmerPlugin() : this(null)
29  {
30  }
31 
32  /// <summary>
33  /// Initializes a new instance of class <see cref="LightShaftsPlugin"/>.
34  /// </summary>
35  public HeatShimmerPlugin(string name)
36  : base(name)
37  {
38  BoundingBoxes = new List<Mesh>();
39  PreferredFormat = PixelFormat.R16G16B16A16_Float;
40  }
41 
42  public ParameterCollection ViewParameters { get; set; }
43 
44  public PixelFormat PreferredFormat { get; set; }
45 
46  public Texture2D RenderSource
47  {
48  get;
49  set;
50  }
51 
53  {
54  get;
55  set;
56  }
57 
58  public DepthStencilBuffer DepthStencil { get; set; }
59 
60  public NoisePlugin NoisePlugin { get; set; }
61 
62  public List<Mesh> BoundingBoxes { get; private set; }
63 
64  public override void Initialize()
65  {
66  base.Initialize();
67 
68  boundingBoxPass = new RenderPass("BoundingBoxPass").KeepAliveBy(this);
69  heatShimmerPass = new RenderPass("HeatShimmerPass").KeepAliveBy(this);
70  heatShimmerComposePass = new RenderPass("HeatShimmerComposePass").KeepAliveBy(this);
71  }
72 
73  public override void Load()
74  {
75  base.Load();
76 
77  RenderPass.AddPass(boundingBoxPass, heatShimmerPass, heatShimmerComposePass);
78 
79  // Use MinMax Plugin
80  var bbRenderTargetPlugin = new RenderTargetsPlugin("BoundingBoxRenderTargetPlugin")
81  {
82  EnableSetTargets = true,
83  EnableClearTarget = true,
84  RenderTarget = null,
85  RenderPass = boundingBoxPass,
86  Services = Services
87  };
88  bbRenderTargetPlugin.Apply();
89 
90  Parameters.AddSources(ViewParameters);
91  Parameters.SetDefault(RenderTargetKeys.DepthStencilSource);
92  Parameters.SetDefault(TexturingKeys.Sampler);
93  bbRenderTargetPlugin.Parameters.AddSources(Parameters);
94 
95  EffectOld minMaxEffect = this.EffectSystemOld.BuildEffect("MinMax")
96  .Using(new MinMaxShaderPlugin("MinMaxShaderPlugin") { RenderPassPlugin = bbRenderTargetPlugin })
97  .Using(new BasicShaderPlugin("TransformationWVP") { RenderPassPlugin = bbRenderTargetPlugin })
98  .KeepAliveBy(ActiveObjects)
99  .InstantiatePermutation()
100  .KeepAliveBy(ActiveObjects);
101 
102  heatShimmerPass.Parameters = new ParameterCollection();
103  heatShimmerPass.Parameters.AddSources(Parameters);
104  heatShimmerPass.Parameters.AddSources(NoisePlugin.Parameters);
105 
106  EffectOld heatShimmerEffect = this.EffectSystemOld.BuildEffect("HeatShimmer")
107  .Using(new PostEffectSeparateShaderPlugin() { RenderPass = heatShimmerPass })
108  .Using(
109  new BasicShaderPlugin(
110  new ShaderMixinSource()
111  {
112  Mixins = new List<ShaderClassSource>()
113  {
114  // TODO add support for IsZReverse
115  //new ShaderClassSource("PostEffectHeatShimmer", Debug ? 1 : 0, effectSystemOld.IsZReverse ? 1 : 0, 3),
116  new ShaderClassSource("PostEffectHeatShimmer", Debug ? 1 : 0, false ? 1 : 0, 3)},
117  Compositions = new Dictionary<string, ShaderSource>() {
118  {"NoiseSource", new ShaderClassSource("SimplexNoise")}},
119 
120  }
121  ) { RenderPass = heatShimmerPass })
122  .KeepAliveBy(ActiveObjects)
123  .InstantiatePermutation()
124  .KeepAliveBy(ActiveObjects);
125 
126  EffectOld heatShimmerDisplayEffect = this.EffectSystemOld.BuildEffect("HeatShimmer")
127  .Using(new PostEffectSeparateShaderPlugin() { RenderPass = heatShimmerComposePass })
128  .Using(new BasicShaderPlugin(new ShaderClassSource("PostEffectHeatShimmerDisplay", Debug ? 1 : 0)) { RenderPass = heatShimmerComposePass })
129  .KeepAliveBy(ActiveObjects)
130  .InstantiatePermutation()
131  .KeepAliveBy(ActiveObjects);
132 
133  if (OfflineCompilation)
134  return;
135 
136  Parameters.Set(RenderTargetKeys.DepthStencilSource, DepthStencil.Texture);
137  Parameters.Set(TexturingKeys.Sampler, GraphicsDevice.SamplerStates.PointClamp);
138 
139  // ------------------------------------------
140  // BoundingBox prepass
141  // ------------------------------------------
142  var renderTargetDesc = RenderSource.Description;
143  var bbRenderTarget = Texture2D.New(GraphicsDevice, renderTargetDesc.Width, renderTargetDesc.Height, PixelFormat.R32G32_Float, TextureFlags.ShaderResource | TextureFlags.RenderTarget).KeepAliveBy(ActiveObjects);
144 
145  bbRenderTargetPlugin.RenderTarget = bbRenderTarget.ToRenderTarget();
146 
147  // Add meshes
148  foreach (var bbMeshData in BoundingBoxes)
149  {
150  // Mesh for MinPass
151  var bbMesh = new EffectMesh(minMaxEffect, bbMeshData).KeepAliveBy(ActiveObjects);
152  // Add mesh
153  // boundingBoxPass.AddPass(bbMesh.EffectMeshPasses[0].EffectPass);
154  effectMeshes.Add(bbMesh);
155  RenderSystem.GlobalMeshes.AddMesh(bbMesh);
156  }
157 
158  // ------------------------------------------
159  // Heat Compute
160  // ------------------------------------------
161  var shimmerTexture = Texture2D.New(GraphicsDevice, renderTargetDesc.Width, renderTargetDesc.Height, PixelFormat.R8_UNorm, TextureFlags.ShaderResource | TextureFlags.RenderTarget);
162  var shimmerRenderTarget = shimmerTexture.ToRenderTarget();
163  heatShimmerPass.StartPass += context => context.GraphicsDevice.Clear(shimmerRenderTarget, Color.Black);
164 
165  var quadMesh = new EffectMesh(heatShimmerEffect).KeepAliveBy(ActiveObjects);
166  quadMesh.Parameters.Set(TexturingKeys.Texture1, bbRenderTarget);
167  quadMesh.Parameters.Set(RenderTargetKeys.RenderTarget, shimmerRenderTarget);
168 
169  effectMeshes.Add(quadMesh);
170  RenderSystem.GlobalMeshes.AddMesh(quadMesh);
171 
172  // ------------------------------------------
173  // Heat display
174  // ------------------------------------------
175  quadMesh = new EffectMesh(heatShimmerDisplayEffect).KeepAliveBy(ActiveObjects);
176  quadMesh.Parameters.Set(TexturingKeys.Texture0, RenderSource);
177  quadMesh.Parameters.Set(TexturingKeys.Texture1, shimmerTexture);
178  quadMesh.Parameters.Set(RenderTargetKeys.RenderTarget, RenderTarget);
179 
180  effectMeshes.Add(quadMesh);
181  RenderSystem.GlobalMeshes.AddMesh(quadMesh);
182  }
183 
184  public override void Unload()
185  {
186  if (!OfflineCompilation)
187  {
188  foreach (var effectMesh in effectMeshes)
189  RenderSystem.GlobalMeshes.RemoveMesh(effectMesh);
190  effectMeshes.Clear();
191  }
192 
193  RenderPass.RemovePass(boundingBoxPass);
194  RenderPass.RemovePass(heatShimmerPass);
195  RenderPass.RemovePass(heatShimmerComposePass);
196 
197  base.Unload();
198  }
199  }
200 }
TODO: Update summary.
A mixin performing a combination of ShaderClassSource and other mixins.
Plugin used to render to a GBuffer from a MainPlugin.
Definition: NoisePlugin.cs:19
Performs primitive-based rendering, creates resources, handles system-level variables, adjusts gamma ramp levels, and creates shaders. See The+GraphicsDevice+class to learn more about the class.
HeatShimmerPlugin()
Initializes a new instance of class LightShaftsPlugin.
HeatShimmerPlugin(string name)
Initializes a new instance of class LightShaftsPlugin.
A Texture 2D frontend to SharpDX.Direct3D11.Texture2D.
Definition: Texture2D.cs:37
Level10 render pass using a depth buffer and a render target.
RenderPass is a hierarchy that defines how to collect and render meshes.
Definition: RenderPass.cs:19
PixelFormat
Defines various types of pixel formats.
Definition: PixelFormat.cs:32
A container to handle a hierarchical collection of effect variables.