Overte C++ Documentation
RenderCommonTask.h
1 //
2 // Created by Bradley Austin Davis on 2018/01/09
3 // Copyright 2013-2018 High Fidelity, Inc.
4 //
5 // Distributed under the Apache License, Version 2.0.
6 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7 //
8 
9 #ifndef hifi_RenderCommonTask_h
10 #define hifi_RenderCommonTask_h
11 
12 #include <gpu/Pipeline.h>
13 #include "LightStage.h"
14 #include "HazeStage.h"
15 #include "LightingModel.h"
16 
17 class BeginGPURangeTimer {
18 public:
19  using JobModel = render::Job::ModelO<BeginGPURangeTimer, gpu::RangeTimerPointer>;
20 
21  BeginGPURangeTimer(const std::string& name) : _gpuTimer(std::make_shared<gpu::RangeTimer>(name)) {}
22 
23  void run(const render::RenderContextPointer& renderContext, gpu::RangeTimerPointer& timer);
24 
25 protected:
26  gpu::RangeTimerPointer _gpuTimer;
27 };
28 
29 using GPURangeTimerConfig = render::GPUJobConfig;
30 
31 class EndGPURangeTimer {
32 public:
33  using Config = GPURangeTimerConfig;
34  using JobModel = render::Job::ModelI<EndGPURangeTimer, gpu::RangeTimerPointer, Config>;
35 
36  EndGPURangeTimer() {}
37 
38  void configure(const Config& config) {}
39  void run(const render::RenderContextPointer& renderContext, const gpu::RangeTimerPointer& timer);
40 
41 protected:
42 };
43 
44 class DrawLayered3DConfig : public render::Job::Config {
45  Q_OBJECT
46  Q_PROPERTY(int numDrawn READ getNumDrawn NOTIFY numDrawnChanged)
47  Q_PROPERTY(int maxDrawn MEMBER maxDrawn NOTIFY dirty)
48 public:
49  int getNumDrawn() { return numDrawn; }
50  void setNumDrawn(int num) { numDrawn = num; emit numDrawnChanged(); }
51 
52  int maxDrawn{ -1 };
53 
54 signals:
55  void numDrawnChanged();
56  void dirty();
57 
58 protected:
59  int numDrawn{ 0 };
60 };
61 
62 class DrawLayered3D {
63 public:
64  using Inputs = render::VaryingSet4<render::ItemBounds, LightingModelPointer, HazeStage::FramePointer, glm::vec2>;
65  using Config = DrawLayered3DConfig;
66  using JobModel = render::Job::ModelI<DrawLayered3D, Inputs, Config>;
67 
68  DrawLayered3D(bool opaque);
69 
70  void configure(const Config& config) { _maxDrawn = config.maxDrawn; }
71  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
72 
73 protected:
74  render::ShapePlumberPointer _shapePlumber;
75  int _maxDrawn; // initialized by Config
76  bool _opaquePass { true };
77 };
78 
79 class Blit {
80 public:
81  using JobModel = render::Job::ModelI<Blit, gpu::FramebufferPointer>;
82 
83  void run(const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer);
84 };
85 
86 class NewFramebuffer {
87 public:
88  using Output = gpu::FramebufferPointer;
89  using JobModel = render::Job::ModelO<NewFramebuffer, Output>;
90 
91  NewFramebuffer(gpu::Element pixelFormat = gpu::Element::COLOR_SRGBA_32);
92 
93  void run(const render::RenderContextPointer& renderContext, Output& output);
94 protected:
95  gpu::Element _pixelFormat;
96 private:
97  gpu::FramebufferPointer _outputFramebuffer;
98 };
99 
100 class NewOrDefaultFramebuffer {
101 public:
102  using Input = glm::uvec2;
103  using Output = gpu::FramebufferPointer;
104  using JobModel = render::Job::ModelIO<NewOrDefaultFramebuffer, Input, Output>;
105 
106  void run(const render::RenderContextPointer& renderContext, const Input& input, Output& output);
107 private:
108  gpu::FramebufferPointer _outputFramebuffer;
109 };
110 
111 class ResolveFramebuffer {
112 public:
113  using Inputs = render::VaryingSet2<gpu::FramebufferPointer, gpu::FramebufferPointer>;
114  using Outputs = gpu::FramebufferPointer;
115  using JobModel = render::Job::ModelIO<ResolveFramebuffer, Inputs, Outputs>;
116 
117  void run(const render::RenderContextPointer& renderContext, const Inputs& source, Outputs& dest);
118 };
119 
120 class ExtractFrustums {
121 public:
122 
123  enum Frustum {
124  SHADOW_CASCADE0_FRUSTUM = 0,
125  SHADOW_CASCADE1_FRUSTUM,
126  SHADOW_CASCADE2_FRUSTUM,
127  SHADOW_CASCADE3_FRUSTUM,
128 
129  SHADOW_CASCADE_FRUSTUM_COUNT,
130 
131  VIEW_FRUSTUM = SHADOW_CASCADE_FRUSTUM_COUNT,
132 
133  FRUSTUM_COUNT
134  };
135 
136  using Inputs = LightStage::ShadowFramePointer;
137  using Outputs = render::VaryingArray<ViewFrustumPointer, FRUSTUM_COUNT>;
138  using JobModel = render::Job::ModelIO<ExtractFrustums, Inputs, Outputs>;
139 
140  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& output);
141 };
142 
143 class SetRenderMethod {
144 public:
145  using JobModel = render::Job::Model<SetRenderMethod>;
146 
147  SetRenderMethod(render::Args::RenderMethod method) : _method(method) {}
148 
149  void run(const render::RenderContextPointer& renderContext) { renderContext->args->_renderMethod = _method; }
150 
151 protected:
152  render::Args::RenderMethod _method;
153 };
154 
155 #endif // hifi_RenderDeferredTask_h