Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
RenderPass.Extensions.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 using System.IO;
6 using System.Linq;
7 
8 namespace SiliconStudio.Paradox.Effects
9 {
10 
11  /// <summary>
12  /// Delegate used by <see cref="RenderPassExtensions.Foreach"/>.
13  /// </summary>
14  /// <param name="renderPass">The render pass.</param>
15  /// <param name="level">The level reflects the deepness of this renderpass in the renderpass tree. Zero for the top level render pass.</param>
16  public delegate void RenderPassForeach(RenderPass renderPass, int level);
17 
18  /// <summary>
19  /// Extensions for <see cref="RenderPass"/>.
20  /// </summary>
21  public static partial class RenderPassExtensions
22  {
23  /// <summary>
24  /// Gets a specific processor from a pass.
25  /// </summary>
26  /// <typeparam name="T">Type of the processor</typeparam>
27  /// <param name="pass">The pass.</param>
28  /// <returns>An instance of the processor.</returns>
29  public static T GetProcessor<T>(this RenderPass pass) where T : Renderer
30  {
31  return pass.Renderers.OfType<T>().FirstOrDefault();
32  }
33 
34 
35  /// <summary>
36  /// Returns all the descendants from a render pass.
37  /// </summary>
38  /// <param name="renderPass">The render pass.</param>
39  /// <returns>An enumerator on descendants render pass</returns>
40  public static IEnumerable<RenderPass> Descendants(this RenderPass renderPass)
41  {
42  foreach (var subRenderPass in renderPass.Children)
43  {
44  yield return subRenderPass;
45  // Avoid unecessary descendants query
46  // Go to descendants
47  if (subRenderPass.Children.Count > 0)
48  foreach (var subSubRenderPass in subRenderPass.Descendants())
49  yield return subSubRenderPass;
50  }
51  }
52 
53  /// <summary>
54  /// Iterate on all render pass an execute an action
55  /// </summary>
56  /// <param name="renderPass">The render pass.</param>
57  /// <param name="onRenderPass">The fire action.</param>
58  /// <param name="level">The initial level.</param>
59  public static void Foreach(this RenderPass renderPass, RenderPassForeach onRenderPass, int level = 0)
60  {
61  onRenderPass(renderPass, level);
62  level++;
63  if (renderPass.Children.Count > 0)
64  foreach (var subRenderPass in renderPass.Children)
65  subRenderPass.Foreach(onRenderPass, level);
66  }
67 
68  /// <summary>
69  /// Iterate on all Returns all the descendants from a render pass.
70  /// </summary>
71  /// <param name="renderPass">The render pass.</param>
72  /// <param name="writer">The output text writer.</param>
73  /// <param name="printer">The printer is a convenient callback to override the default ToString of a RenderPass.</param>
74  public static void Print(this RenderPass renderPass, TextWriter writer, Func<RenderPass, string> printer = null)
75  {
76  renderPass.Foreach((pass, level) => writer.WriteLine("{0}{1}", String.Concat(Enumerable.Repeat(" ", level)), printer != null ? printer(pass) : pass.ToString()));
77  }
78 
79  /// <summary>
80  /// Finds a descendent render pass by name.
81  /// </summary>
82  /// <param name="renderPass">The render pass.</param>
83  /// <param name="name">The name.</param>
84  /// <returns>An instance matching the name or null if not found</returns>
85  public static RenderPass FindDescendantByName(this RenderPass renderPass, string name)
86  {
87  var passes = renderPass.Children;
88  foreach (var pass in passes)
89  {
90  if (name == pass.Name)
91  return pass;
92  if (pass.Children.Count == 0)
93  continue;
94  var found = pass.FindDescendantByName(name);
95  if (found != null)
96  return found;
97  }
98  return null;
99  }
100 
101  }
102 }
static IEnumerable< RenderPass > Descendants(this RenderPass renderPass)
Returns all the descendants from a render pass.
TrackingCollection< RenderPass > Children
Gets the sub render passes.
Definition: RenderPass.cs:159
Performs render pipeline transformations attached to a specific RenderPass.
Definition: Renderer.cs:13
static void Print(this RenderPass renderPass, TextWriter writer, Func< RenderPass, string > printer=null)
Iterate on all Returns all the descendants from a render pass.
static RenderPass FindDescendantByName(this RenderPass renderPass, string name)
Finds a descendent render pass by name.
delegate void RenderPassForeach(RenderPass renderPass, int level)
Delegate used by RenderPassExtensions.Foreach.
static void Foreach(this RenderPass renderPass, RenderPassForeach onRenderPass, int level=0)
Iterate on all render pass an execute an action
RenderPass is a hierarchy that defines how to collect and render meshes.
Definition: RenderPass.cs:19