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#include "RenderAPI/BsGpuPipelineParamInfo.h"
9#include "BsRendererLight.h"
10
11namespace bs { namespace ct
12{
13 struct SkyInfo;
14 struct SceneInfo;
15 class RendererViewGroup;
16
17 /** @addtogroup RenderBeast
18 * @{
19 */
20
21 /** Maximum number of refl. probes that can influence an object when basic forward rendering is used. */
22 static constexpr UINT32 STANDARD_FORWARD_MAX_NUM_PROBES = 8;
23
24 /** Information about a single reflection probe, as seen by the lighting shader. */
25 struct ReflProbeData
26 {
27 Vector3 position;
28 float radius;
29 Vector3 boxExtents;
30 float transitionDistance;
31 Matrix4 invBoxTransform;
32 UINT32 cubemapIdx;
33 UINT32 type; // 0 - Sphere, 1 - Box
34 Vector2 padding;
35 };
36
37 /** Contains GPU buffers used by the renderer to manipulate reflection probes. */
38 class VisibleReflProbeData
39 {
40 public:
41 VisibleReflProbeData() = default;
42
43 /**
44 * Updates the internal buffers with a new set of refl. probes. Before calling make sure that probe visibility has
45 * been calculated for the provided view group.
46 */
47 void update(const SceneInfo& sceneInfo, const RendererViewGroup& viewGroup);
48
49 /** Returns a GPU bindable buffer containing information about every reflection probe. */
50 SPtr<GpuBuffer> getProbeBuffer() const { return mProbeBuffer; }
51
52 /** Returns the number of reflection probes in the probe buffer. */
53 UINT32 getNumProbes() const { return mNumProbes; }
54
55 /** Returns information about a probe at the specified index. */
56 const ReflProbeData& getProbeData(UINT32 idx) const { return mReflProbeData[idx]; }
57
58 private:
59 Vector<ReflProbeData> mReflProbeData;
60 SPtr<GpuBuffer> mProbeBuffer;
61 UINT32 mNumProbes = 0;
62 };
63
64 BS_PARAM_BLOCK_BEGIN(ReflProbeParamsParamDef)
65 BS_PARAM_BLOCK_ENTRY(INT32, gReflCubemapNumMips)
66 BS_PARAM_BLOCK_ENTRY(INT32, gNumProbes)
67 BS_PARAM_BLOCK_ENTRY(INT32, gSkyCubemapAvailable)
68 BS_PARAM_BLOCK_ENTRY(INT32, gUseReflectionMaps)
69 BS_PARAM_BLOCK_ENTRY(INT32, gSkyCubemapNumMips)
70 BS_PARAM_BLOCK_ENTRY(float, gSkyBrightness)
71 BS_PARAM_BLOCK_END
72
73 extern ReflProbeParamsParamDef gReflProbeParamsParamDef;
74
75 /** Renderer information specific to a single reflection probe. */
76 class RendererReflectionProbe
77 {
78 public:
79 RendererReflectionProbe(ReflectionProbe* probe);
80
81 /** Populates the structure with reflection probe parameters. */
82 void getParameters(ReflProbeData& output) const;
83
84 ReflectionProbe* probe;
85 UINT32 arrayIdx;
86 bool arrayDirty : 1;
87 mutable bool errorFlagged : 1;
88 };
89
90 /** Helper struct containing all parameters for binding image lighting related data to the GPU programs using them .*/
91 struct ImageBasedLightingParams
92 {
93 /**
94 * Initializes the parameters from the provided parameters.
95 *
96 * @param[in] params GPU parameters object to look for the parameters in.
97 * @param[in] programType Type of the GPU program to look up the parameters for.
98 * @param[in] optional If true no warnings will be thrown if some or all of the parameters will be found.
99 * @param[in] gridIndices Set to true if grid indices (used by light grid) parameter is required.
100 * @param[in] probeArray True if the refl. probe data is to be provided in a structured buffer.
101 */
102 void populate(const SPtr<GpuParams>& params, GpuProgramType programType, bool optional, bool gridIndices,
103 bool probeArray);
104
105 GpuParamTexture skyReflectionsTexParam;
106 GpuParamTexture ambientOcclusionTexParam;
107 GpuParamTexture ssrTexParam;
108 GpuParamTexture reflectionProbeCubemapsTexParam;
109
110 GpuParamTexture preintegratedEnvBRDFParam;
111 GpuParamBuffer reflectionProbesParam;
112
113 GpuParamBuffer reflectionProbeIndicesParam;
114 GpuParamBinding reflProbeParamBindings;
115
116 // Only utilized when standard forward rendering is used
117 GpuParamBinding reflProbesBinding;
118 };
119
120 /** Parameter buffer containing information about reflection probes. */
121 struct ReflProbeParamBuffer
122 {
123 ReflProbeParamBuffer();
124
125 /** Updates the parameter buffer contents with required refl. probe data. */
126 void populate(const Skybox* sky, UINT32 numProbes, const SPtr<Texture>& reflectionCubemaps,
127 bool capturingReflections);
128
129 SPtr<GpuParamBlockBuffer> buffer;
130 };
131
132 BS_PARAM_BLOCK_BEGIN(ReflProbesParamDef)
133 BS_PARAM_BLOCK_ENTRY_ARRAY(ReflProbeData, gReflectionProbes, STANDARD_FORWARD_MAX_NUM_PROBES)
134 BS_PARAM_BLOCK_END
135
136 extern ReflProbesParamDef gReflProbesParamDef;
137
138 /** @} */
139}}
140