Overte C++ Documentation
RenderForwardTask.h
1 //
2 // RenderForwardTask.h
3 // render-utils/src/
4 //
5 // Created by Zach Pomerantz on 12/13/2016.
6 // Copyright 2016 High Fidelity, Inc.
7 // Copyright 2024 Overte e.V.
8 //
9 // Distributed under the Apache License, Version 2.0.
10 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
11 //
12 
13 #ifndef hifi_RenderForwardTask_h
14 #define hifi_RenderForwardTask_h
15 
16 #include <gpu/Pipeline.h>
17 #include <render/RenderFetchCullSortTask.h>
18 #include "AssembleLightingStageTask.h"
19 #include "DeferredFrameTransform.h"
20 #include "LightClusters.h"
21 #include "LightingModel.h"
22 
23 class RenderForwardTaskConfig : public render::Task::Config {
24  Q_OBJECT
25  Q_PROPERTY(float resolutionScale MEMBER resolutionScale NOTIFY dirty)
26 public:
27  float resolutionScale{ 1.f };
28 
29 signals:
30  void dirty();
31 };
32 
33 class RenderForwardTask {
34 public:
35  using Input = render::VaryingSet3<RenderFetchCullSortTask::Output, LightingModelPointer, AssembleLightingStageTask::Output>;
36  using Config = RenderForwardTaskConfig;
37  using JobModel = render::Task::ModelI<RenderForwardTask, Input, Config>;
38 
39  RenderForwardTask() {}
40 
41  void configure(const Config& config);
42  void build(JobModel& task, const render::Varying& input, render::Varying& output, render::CullFunctor cullFunctor, uint transformOffset, size_t depth);
43 };
44 
45 
46 class PreparePrimaryFramebufferMSAAConfig : public render::Job::Config {
47  Q_OBJECT
48  Q_PROPERTY(float resolutionScale WRITE setResolutionScale READ getResolutionScale NOTIFY dirty)
49  Q_PROPERTY(int numSamples WRITE setNumSamples READ getNumSamples NOTIFY dirty)
50 public:
51  float getResolutionScale() const { return resolutionScale; }
52  void setResolutionScale(float scale);
53 
54  int getNumSamples() const { return numSamples; }
55  void setNumSamples(int num);
56 
57 signals:
58  void dirty();
59 
60 protected:
61  float resolutionScale{ 1.0f };
62  int numSamples{ 4 };
63 };
64 
65 class PreparePrimaryFramebufferMSAA {
66 public:
67  using Output = gpu::FramebufferPointer;
68  using Config = PreparePrimaryFramebufferMSAAConfig;
69  using JobModel = render::Job::ModelO<PreparePrimaryFramebufferMSAA, Output, Config>;
70 
71  void configure(const Config& config);
72  void run(const render::RenderContextPointer& renderContext,
73  gpu::FramebufferPointer& framebuffer);
74 
75 private:
76  gpu::FramebufferPointer _framebuffer;
77  float _resolutionScale{ 1.0f };
78  int _numSamples;
79 
80  static gpu::FramebufferPointer createFramebuffer(const char* name, const glm::uvec2& frameSize, int numSamples);
81 };
82 
83 class PrepareForward {
84 public:
85  using Inputs = render::VaryingSet2 <gpu::FramebufferPointer, LightStage::FramePointer>;
86  using JobModel = render::Job::ModelI<PrepareForward, Inputs>;
87 
88  void run(const render::RenderContextPointer& renderContext,
89  const Inputs& inputs);
90 
91 private:
92 };
93 
94 class DrawForward{
95 public:
96  using Inputs = render::VaryingSet5<render::ItemBounds, LightingModelPointer, HazeStage::FramePointer, LightClustersPointer, DeferredFrameTransformPointer>;
97  using JobModel = render::Job::ModelI<DrawForward, Inputs>;
98 
99  DrawForward(const render::ShapePlumberPointer& shapePlumber, bool opaquePass, uint transformSlot) :
100  _shapePlumber(shapePlumber), _opaquePass(opaquePass), _transformSlot(transformSlot) {}
101  void run(const render::RenderContextPointer& renderContext,
102  const Inputs& inputs);
103 
104 private:
105  render::ShapePlumberPointer _shapePlumber;
106  bool _opaquePass;
107  uint _transformSlot;
108 };
109 
110 #endif // hifi_RenderForwardTask_h