Overte C++ Documentation
DebugDeferredBuffer.h
1 //
2 // DebugDeferredBuffer.h
3 // libraries/render-utils/src
4 //
5 // Created by Clement on 12/3/15.
6 // Copyright 2015 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_DebugDeferredBuffer_h
14 #define hifi_DebugDeferredBuffer_h
15 
16 #include <QFileInfo>
17 
18 #include <render/DrawTask.h>
19 #include "DeferredFrameTransform.h"
20 #include "DeferredFramebuffer.h"
21 #include "SurfaceGeometryPass.h"
22 #include "AmbientOcclusionEffect.h"
23 
24 #include "LightStage.h"
25 
26 class DebugDeferredBufferConfig : public render::Job::Config {
27  Q_OBJECT
28  Q_PROPERTY(int mode MEMBER mode WRITE setMode)
29  Q_PROPERTY(glm::vec4 size MEMBER size NOTIFY dirty)
30 public:
31  DebugDeferredBufferConfig() : render::Job::Config(false) {}
32 
33  void setMode(int newMode);
34 
35  int mode{ 0 };
36  glm::vec4 size{ 0.0f, -1.0f, 1.0f, 1.0f };
37 signals:
38  void dirty();
39 };
40 
41 class DebugDeferredBuffer {
42 public:
43  using Inputs = render::VaryingSet7<DeferredFramebufferPointer,
44  LinearDepthFramebufferPointer,
45  SurfaceGeometryFramebufferPointer,
46  AmbientOcclusionFramebufferPointer,
47  DeferredFrameTransformPointer,
48  LightStage::ShadowFramePointer,
49  gpu::TexturePointer>;
50  using Config = DebugDeferredBufferConfig;
51  using JobModel = render::Job::ModelI<DebugDeferredBuffer, Inputs, Config>;
52 
53  DebugDeferredBuffer(uint transformSlot);
54  ~DebugDeferredBuffer();
55 
56  void configure(const Config& config);
57  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
58 
59 protected:
60  friend class DebugDeferredBufferConfig;
61 
62  enum Mode : uint8_t
63  {
64  // Use Mode suffix to avoid collisions
65  Off = 0,
66  DepthMode,
67  AlbedoMode,
68  NormalMode,
69  RoughnessMode,
70  MetallicMode,
71  EmissiveMode,
72  UnlitMode,
73  OcclusionMode,
74  LightmapMode,
75  ScatteringMode,
76  MToonMode,
77  LightingMode,
78  ShadowCascade0Mode,
79  ShadowCascade1Mode,
80  ShadowCascade2Mode,
81  ShadowCascade3Mode,
82  ShadowCascadeIndicesMode,
83  LinearDepthMode,
84  HalfLinearDepthMode,
85  HalfNormalMode,
86  CurvatureMode,
87  NormalCurvatureMode,
88  DiffusedCurvatureMode,
89  DiffusedNormalCurvatureMode,
90  CurvatureOcclusionMode,
91  ScatteringDebugMode,
92  AmbientOcclusionMode,
93  AmbientOcclusionBlurredMode,
94  AmbientOcclusionNormalMode,
95  VelocityMode,
96  AntialiasingIntensityMode,
97  CustomMode, // Needs to stay last
98 
99  NumModes,
100  };
101 
102 private:
103  Mode _mode{ Off };
104  glm::vec4 _size;
105  uint _transformSlot;
106 
107 #include "debug_deferred_buffer_shared.slh"
108 
109  using ParametersBuffer = gpu::StructBuffer<DebugParameters>;
110 
111  struct CustomPipeline {
112  gpu::PipelinePointer pipeline;
113  QFileInfo info;
114  };
115  using StandardPipelines = std::array<gpu::PipelinePointer, NumModes>;
116  using CustomPipelines = std::unordered_map<std::string, CustomPipeline>;
117 
118  static bool pipelineNeedsUpdate(Mode mode, const std::string& customFile = std::string());
119  static gpu::PipelinePointer& getPipeline(Mode mode, const std::string& customFile = std::string());
120  static std::string getShaderSourceCode(Mode mode, const std::string& customFile = std::string());
121 
122  ParametersBuffer _parameters;
123  static StandardPipelines _pipelines;
124  static CustomPipelines _customPipelines;
125  int _geometryId{ 0 };
126 };
127 
128 #endif // hifi_DebugDeferredBuffer_h