Overte C++ Documentation
RenderDeferredTask.h
1 //
2 // RenderDeferredTask.h
3 // render-utils/src/
4 //
5 // Created by Sam Gateau on 5/29/15.
6 // Copyright 20154 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_RenderDeferredTask_h
13 #define hifi_RenderDeferredTask_h
14 
15 #include <gpu/Pipeline.h>
16 #include <render/RenderFetchCullSortTask.h>
17 #include "AssembleLightingStageTask.h"
18 #include "LightingModel.h"
19 #include "LightClusters.h"
20 #include "RenderShadowTask.h"
21 
22 class RenderTransparentDeferredConfig : public render::Job::Config {
23  Q_OBJECT
24  Q_PROPERTY(int numDrawn READ getNumDrawn NOTIFY newStats)
25  Q_PROPERTY(int maxDrawn MEMBER maxDrawn NOTIFY dirty)
26 
27 public:
28  int getNumDrawn() { return _numDrawn; }
29  void setNumDrawn(int numDrawn) {
30  _numDrawn = numDrawn;
31  emit newStats();
32  }
33 
34  int maxDrawn{ -1 };
35 
36 signals:
37  void newStats();
38  void dirty();
39 
40 protected:
41  int _numDrawn{ 0 };
42 };
43 
44 class RenderTransparentDeferred {
45 public:
46  using Inputs = render::VaryingSet7<render::ItemBounds, HazeStage::FramePointer, LightStage::FramePointer, LightingModelPointer, LightClustersPointer, LightStage::ShadowFramePointer, glm::vec2>;
47  using Config = RenderTransparentDeferredConfig;
48  using JobModel = render::Job::ModelI<RenderTransparentDeferred, Inputs, Config>;
49 
50  RenderTransparentDeferred(render::ShapePlumberPointer shapePlumber)
51  : _shapePlumber{ shapePlumber } {}
52 
53  void configure(const Config& config) { _maxDrawn = config.maxDrawn; }
54  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
55 
56 protected:
57  render::ShapePlumberPointer _shapePlumber;
58  int _maxDrawn; // initialized by Config
59 };
60 
61 class DrawStateSortConfig : public render::Job::Config {
62  Q_OBJECT
63  Q_PROPERTY(int numDrawn READ getNumDrawn NOTIFY numDrawnChanged)
64  Q_PROPERTY(int maxDrawn MEMBER maxDrawn NOTIFY dirty)
65  Q_PROPERTY(bool stateSort MEMBER stateSort NOTIFY dirty)
66 public:
67  int getNumDrawn() { return numDrawn; }
68  void setNumDrawn(int num) {
69  numDrawn = num;
70  emit numDrawnChanged();
71  }
72 
73  int maxDrawn{ -1 };
74  bool stateSort{ true };
75 
76 signals:
77  void numDrawnChanged();
78  void dirty();
79 
80 protected:
81  int numDrawn{ 0 };
82 };
83 
84 class DrawStateSortDeferred {
85 public:
86  using Inputs = render::VaryingSet3<render::ItemBounds, LightingModelPointer, glm::vec2>;
87 
88  using Config = DrawStateSortConfig;
89  using JobModel = render::Job::ModelI<DrawStateSortDeferred, Inputs, Config>;
90 
91  DrawStateSortDeferred(render::ShapePlumberPointer shapePlumber)
92  : _shapePlumber{ shapePlumber } {
93  }
94 
95  void configure(const Config& config) {
96  _maxDrawn = config.maxDrawn;
97  _stateSort = config.stateSort;
98  }
99  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
100 
101 protected:
102  render::ShapePlumberPointer _shapePlumber;
103  int _maxDrawn; // initialized by Config
104  bool _stateSort;
105 };
106 
107 class SetSeparateDeferredDepthBuffer {
108 public:
109  using Inputs = DeferredFramebufferPointer;
110  using JobModel = render::Job::ModelI<SetSeparateDeferredDepthBuffer, Inputs>;
111 
112  SetSeparateDeferredDepthBuffer() = default;
113 
114  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
115 
116 protected:
117  gpu::FramebufferPointer _framebuffer;
118 };
119 
120 class RenderDeferredTaskConfig : public render::Task::Config {
121  Q_OBJECT
122  Q_PROPERTY(float fadeScale MEMBER fadeScale NOTIFY dirty)
123  Q_PROPERTY(float fadeDuration MEMBER fadeDuration NOTIFY dirty)
124  Q_PROPERTY(float resolutionScale MEMBER resolutionScale NOTIFY dirty)
125  Q_PROPERTY(bool debugFade MEMBER debugFade NOTIFY dirty)
126  Q_PROPERTY(float debugFadePercent MEMBER debugFadePercent NOTIFY dirty)
127 public:
128  float fadeScale{ 0.5f };
129  float fadeDuration{ 3.0f };
130  float resolutionScale{ 1.f };
131  float debugFadePercent{ 0.f };
132  bool debugFade{ false };
133 
134 signals:
135  void dirty();
136 };
137 
138 class RenderDeferredTask {
139 public:
140  using Input = render::VaryingSet4<RenderFetchCullSortTask::Output, LightingModelPointer, AssembleLightingStageTask::Output, RenderShadowTask::Output>;
141  using Config = RenderDeferredTaskConfig;
142  using JobModel = render::Task::ModelI<RenderDeferredTask, Input, Config>;
143 
144  RenderDeferredTask();
145 
146  void configure(const Config& config);
147  void build(JobModel& task, const render::Varying& input, render::Varying& output);
148 
149 private:
150 };
151 
152 
153 class PreparePrimaryFramebufferConfig : public render::Job::Config {
154  Q_OBJECT
155  Q_PROPERTY(float resolutionScale WRITE setResolutionScale READ getResolutionScale)
156 public:
157  float getResolutionScale() const { return resolutionScale; }
158  void setResolutionScale(float scale) {
159  const float SCALE_RANGE_MIN = 0.1f;
160  const float SCALE_RANGE_MAX = 2.0f;
161  resolutionScale = std::max(SCALE_RANGE_MIN, std::min(SCALE_RANGE_MAX, scale));
162  }
163 
164 signals:
165  void dirty();
166 
167 protected:
168  float resolutionScale{ 1.0f };
169 };
170 
171 class PreparePrimaryFramebuffer {
172 public:
173 
174  using Output = gpu::FramebufferPointer;
175  using Config = PreparePrimaryFramebufferConfig;
176  using JobModel = render::Job::ModelO<PreparePrimaryFramebuffer, Output, Config>;
177 
178  PreparePrimaryFramebuffer(float resolutionScale = 1.0f) : _resolutionScale{ resolutionScale } {}
179  void configure(const Config& config);
180  void run(const render::RenderContextPointer& renderContext, Output& primaryFramebuffer);
181 
182  gpu::FramebufferPointer _primaryFramebuffer;
183  float _resolutionScale{ 1.0f };
184 
185 private:
186 
187  static gpu::FramebufferPointer createFramebuffer(const char* name, const glm::uvec2& size);
188 };
189 
190 #endif // hifi_RenderDeferredTask_h