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 "BsCorePrerequisites.h"
6#include "Utility/BsModule.h"
7
8namespace bs { namespace ct
9{
10 /** @addtogroup Renderer-Internal
11 * @{
12 */
13
14 /** Helper class that handles generation and processing of textures used for image based lighting. */
15 class BS_CORE_EXPORT IBLUtility : public Module<IBLUtility>
16 {
17 public:
18 /**
19 * Performs filtering on the cubemap, populating its mip-maps with filtered values that can be used for
20 * evaluating specular reflections.
21 *
22 * @param[in, out] cubemap Cubemap to filter. Its mip level 0 will be read, filtered and written into
23 * other mip levels.
24 * @param[in] scratch Temporary cubemap texture to use for the filtering process. Must match the size of
25 * the source cubemap. Provide null to automatically create a scratch cubemap.
26 */
27 virtual void filterCubemapForSpecular(const SPtr<Texture>& cubemap, const SPtr<Texture>& scratch) const = 0;
28
29 /**
30 * Performs filtering on the cubemap, populating the output cubemap with values that can be used for evaluating
31 * irradiance for use in diffuse lighting. Uses order-5 SH (25 coefficients) and outputs the values in the form of
32 * a cubemap.
33 *
34 * @param[in] cubemap Cubemap to filter. Its mip level 0 will be used as source.
35 * @param[in] output Output cubemap to store the irradiance data in.
36 */
37 virtual void filterCubemapForIrradiance(const SPtr<Texture>& cubemap, const SPtr<Texture>& output) const = 0;
38
39 /**
40 * Performs filtering on the cubemap, populating the output texture with values that can be used for evaluating
41 * irradiance for use in diffuse lighting. Uses order-3 SH (9 coefficients) and outputs the values in the form of
42 * SH coefficients.
43 *
44 * @param[in] cubemap Cubemap to filter. Its mip level 0 will be used as source.
45 * @param[in] output Output texture in which to place the results. Must be allocated using
46 * IrradianceReduceMat::createOutputTexture();
47 * @param[in] outputIdx Index in the output buffer at which to write the output coefficients to.
48 */
49 virtual void filterCubemapForIrradiance(const SPtr<Texture>& cubemap, const SPtr<Texture>& output,
50 UINT32 outputIdx) const = 0;
51
52 /**
53 * Scales a cubemap and outputs it in the destination texture, using hardware acceleration. If both textures are the
54 * same size, performs a copy instead.
55 *
56 * @param[in] src Source cubemap to scale.
57 * @param[in] srcMip Determines which mip level of the source texture to scale.
58 * @param[in] dst Desination texture to output the scaled data to. Must be usable as a render target.
59 * @param[in] dstMip Determines which mip level of the destination texture to scale.
60 */
61 virtual void scaleCubemap(const SPtr<Texture>& src, UINT32 srcMip, const SPtr<Texture>& dst, UINT32 dstMip) const = 0;
62
63
64 /** Returns the size of the texture required to store the provided number of SH coefficient sets. */
65 static Vector2I getSHCoeffTextureSize(UINT32 numCoeffSets, UINT32 shOrder);
66
67 /**
68 * Determines the position of a set of coefficients in the coefficient texture, depending on the coefficient index.
69 */
70 static Vector2I getSHCoeffXYFromIdx(UINT32 idx, UINT32 shOrder);
71
72 static const UINT32 REFLECTION_CUBEMAP_SIZE;
73 static const UINT32 IRRADIANCE_CUBEMAP_SIZE;
74 };
75
76 /** Provides easy access to IBLUtility. */
77 BS_CORE_EXPORT const IBLUtility& gIBLUtility();
78
79 /** @} */
80}}
81