1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#pragma once
4
5#include "BsRenderBeastPrerequisites.h"
6#include "Renderer/BsRendererMaterial.h"
7#include "Renderer/BsParamBlocks.h"
8
9namespace bs { namespace ct
10{
11 class VisibleReflProbeData;
12 class VisibleLightData;
13
14 /** @addtogroup RenderBeast
15 * @{
16 */
17
18 BS_PARAM_BLOCK_BEGIN(LightGridParamDef)
19 BS_PARAM_BLOCK_ENTRY(Vector4I, gLightCounts)
20 BS_PARAM_BLOCK_ENTRY(Vector2I, gLightStrides)
21 BS_PARAM_BLOCK_ENTRY(INT32, gNumReflProbes)
22 BS_PARAM_BLOCK_ENTRY(INT32, gNumCells)
23 BS_PARAM_BLOCK_ENTRY(Vector3I, gGridSize)
24 BS_PARAM_BLOCK_ENTRY(INT32, gMaxNumLightsPerCell)
25 BS_PARAM_BLOCK_ENTRY(Vector2I, gGridPixelSize)
26 BS_PARAM_BLOCK_END
27
28 extern LightGridParamDef gLightGridParamDefDef;
29
30 /** A set of buffers containing outputs from LightGrid. */
31 struct LightGridOutputs
32 {
33 /** Parameter block of LightGridParamDef. */
34 SPtr<GpuParamBlockBuffer> gridParams;
35
36 /**
37 * Flattened array of grid cells, where each entry contains the number of lights affecting that cell, and a index
38 * into the @p gridLightIndices buffer.
39 */
40 SPtr<GpuBuffer> gridLightOffsetsAndSize;
41
42 /**
43 * A list of light indices. Each cell's indices start at specific position and are placed sequentially one after
44 * another. Lookup into this array is done through offset & size provided by @p gridLightOffsetsAndSize.
45 */
46 SPtr<GpuBuffer> gridLightIndices;
47
48 /**
49 * Flattened array of grid cells, where each entry contains the number of reflection probes affecting that cell,
50 * and a index into the @p gridProbeIndices buffer.
51 */
52 SPtr<GpuBuffer> gridProbeOffsetsAndSize;
53
54 /**
55 * A list of reflection probe indices. Each cell's indices start at specific position and are placed sequentially
56 * one after another. Lookup into this array is done through offset & size provided by @p gridProbeOffsetsAndSize.
57 */
58 SPtr<GpuBuffer> gridProbeIndices;
59 };
60
61 /**
62 * Shader that creates a linked list for each light grid cell, containing which lights and reflection probes affects
63 * each cell.
64 */
65 class LightGridLLCreationMat : public RendererMaterial<LightGridLLCreationMat>
66 {
67 RMAT_DEF_CUSTOMIZED("LightGridLLCreation.bsl");
68
69 public:
70 LightGridLLCreationMat();
71
72 /** Binds parameter buffers and prepares any internal buffers. Must be called before execute(). */
73 void setParams(const Vector3I& gridSize, const SPtr<GpuParamBlockBuffer>& gridParams,
74 const SPtr<GpuBuffer>& lightsBuffer, const SPtr<GpuBuffer>& probesBuffer);
75
76 /** Binds the material for rendering, sets up per-camera parameters and executes it. */
77 void execute(const RendererView& view);
78
79 /** Returns the buffers generated by execute(). */
80 void getOutputs(SPtr<GpuBuffer>& lightsLLHeads, SPtr<GpuBuffer>& lightsLL, SPtr<GpuBuffer>& probesLLHeads,
81 SPtr<GpuBuffer>& probesLL) const;
82 private:
83 GpuParamBuffer mLightBufferParam;
84 GpuParamBuffer mLightsCounterParam;
85 GpuParamBuffer mLightsLLHeadsParam;
86 GpuParamBuffer mLightsLLParam;
87
88 GpuParamBuffer mProbesBufferParam;
89 GpuParamBuffer mProbesCounterParam;
90 GpuParamBuffer mProbesLLHeadsParam;
91 GpuParamBuffer mProbesLLParam;
92
93 SPtr<GpuBuffer> mLightsCounter;
94 SPtr<GpuBuffer> mLightsLLHeads;
95 SPtr<GpuBuffer> mLightsLL;
96
97 SPtr<GpuBuffer> mProbesCounter;
98 SPtr<GpuBuffer> mProbesLLHeads;
99 SPtr<GpuBuffer> mProbesLL;
100
101 UINT32 mBufferNumCells = 0;
102 Vector3I mGridSize;
103 };
104
105 /** Shader that reduces the linked list created by LightGridLLCreationMat into a sequential array. */
106 class LightGridLLReductionMat : public RendererMaterial<LightGridLLReductionMat>
107 {
108 RMAT_DEF_CUSTOMIZED("LightGridLLReduction.bsl");
109
110 public:
111 LightGridLLReductionMat();
112
113 /** Binds parameter buffers and prepares any internal buffers. Must be called before execute(). */
114 void setParams(const Vector3I& gridSize, const SPtr<GpuParamBlockBuffer>& gridParams,
115 const SPtr<GpuBuffer>& lightLLHeads, const SPtr<GpuBuffer>& lightLL,
116 const SPtr<GpuBuffer>& probeLLHeads, const SPtr<GpuBuffer>& probeLL);
117
118 /** Binds the material for renderingand executes it. */
119 void execute(const RendererView& view);
120
121 /** Returns the buffers generated by execute(). */
122 void getOutputs(SPtr<GpuBuffer>& gridLightOffsetsAndSize, SPtr<GpuBuffer>& gridLightIndices,
123 SPtr<GpuBuffer>& gridProbeOffsetsAndSize, SPtr<GpuBuffer>& gridProbeIndices) const;
124 private:
125 GpuParamBuffer mLightsLLHeadsParam;
126 GpuParamBuffer mLightsLLParam;
127
128 GpuParamBuffer mProbesLLHeadsParam;
129 GpuParamBuffer mProbesLLParam;
130
131 GpuParamBuffer mGridDataCounterParam;
132
133 GpuParamBuffer mGridLightOffsetAndSizeParam;
134 GpuParamBuffer mGridLightIndicesParam;
135
136 GpuParamBuffer mGridProbeOffsetAndSizeParam;
137 GpuParamBuffer mGridProbeIndicesParam;
138
139 SPtr<GpuBuffer> mGridDataCounter;
140
141 SPtr<GpuBuffer> mGridLightOffsetAndSize;
142 SPtr<GpuBuffer> mGridLightIndices;
143
144 SPtr<GpuBuffer> mGridProbeOffsetAndSize;
145 SPtr<GpuBuffer> mGridProbeIndices;
146
147 UINT32 mBufferNumCells;
148 Vector3I mGridSize;
149 };
150
151 /**
152 * Helper class that is used for generating a grid in view space, whose cells contain information about lights
153 * affecting them. Used for forward rendering.
154 */
155 class LightGrid
156 {
157 public:
158 LightGrid();
159
160 /** Updates the light grid from the provided view. */
161 void updateGrid(const RendererView& view, const VisibleLightData& lightData, const VisibleReflProbeData& probeData,
162 bool noLighting);
163
164 /**
165 * Returns the buffers containing light indices per grid cell and global grid parameters. This data gets Updated on
166 * every call to updateGrid().
167 */
168 LightGridOutputs getOutputs() const;
169
170 private:
171 SPtr<GpuParamBlockBuffer> mGridParamBuffer;
172 };
173
174 /** @} */
175}}
176