1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef API_3D_RENDER_IRENDER_DATA_STORE_DEFAULT_LIGHT_H
17 #define API_3D_RENDER_IRENDER_DATA_STORE_DEFAULT_LIGHT_H
18 
19 #include <cstdint>
20 
21 #include <3d/namespace.h>
22 #include <base/containers/array_view.h>
23 #include <base/math/vector.h>
24 #include <base/util/uid.h>
25 #include <core/namespace.h>
26 #include <render/datastore/intf_render_data_store.h>
27 
28 CORE3D_BEGIN_NAMESPACE()
29 struct RenderLight;
30 /** @ingroup group_render_irenderdatastoredefaultlight */
31 /** Interface to add lights to rendering.
32     Not internally syncronized.
33 */
34 class IRenderDataStoreDefaultLight : public RENDER_NS::IRenderDataStore {
35 public:
36     static constexpr BASE_NS::Uid UID { "daa1bcf3-e1b7-4605-8c2a-01a6e6f5dbb6" };
37 
38     ~IRenderDataStoreDefaultLight() override = default;
39 
40     /** Shadow type. Default is PCF.
41      */
42     enum class ShadowType : uint8_t {
43         /* Percentage Closer Filtering */
44         PCF = 0,
45         /* Variance Shadow Maps */
46         VSM = 1,
47     };
48 
49     /** Shadow quality. Default is NORMAL.
50      */
51     enum class ShadowQuality : uint8_t {
52         /* Low quality */
53         LOW = 0,
54         /* Normal quality */
55         NORMAL = 1,
56         /* High quality */
57         HIGH = 2,
58         /* Ultra quality */
59         ULTRA = 3,
60     };
61 
62     /** Shadow smoothness. Default is NORMAL.
63      */
64     enum class ShadowSmoothness : uint8_t {
65         /* Hard shadows */
66         HARD = 0,
67         /* Normal soft shadows */
68         NORMAL = 1,
69         /* Very soft shadows */
70         SOFT = 2,
71     };
72 
73     /** Lighting flags for rendering (and specialization)
74      */
75     enum LightingFlagBits : uint8_t {
76         LIGHTING_SHADOW_TYPE_VSM_BIT = (1 << 0),
77         LIGHTING_POINT_ENABLED_BIT = (1 << 1),
78         LIGHTING_SPOT_ENABLED_BIT = (1 << 2),
79     };
80     using LightingFlags = uint32_t;
81 
82     struct LightCounts {
83         uint32_t directional { 0u };
84         uint32_t point { 0u };
85         uint32_t spot { 0u };
86 
87         uint32_t dirShadow { 0u };
88         uint32_t spotShadow { 0u };
89 
90         uint32_t shadowCount { 0u };
91     };
92 
93     /** Shadow types.
94      */
95     struct ShadowTypes {
96         ShadowType shadowType { ShadowType::PCF };
97         ShadowQuality shadowQuality { ShadowQuality::NORMAL };
98         ShadowSmoothness shadowSmoothness { ShadowSmoothness::NORMAL };
99     };
100 
101     /** Shadow quality resolutions.
102      */
103     struct ShadowQualityResolutions {
104         BASE_NS::Math::UVec2 low { 512u, 512u };
105         BASE_NS::Math::UVec2 normal { 1024u, 1024u };
106         BASE_NS::Math::UVec2 high { 2048u, 2048u };
107         BASE_NS::Math::UVec2 ultra { 4096u, 4096u };
108     };
109 
110     /** Set shadow type for all shadows.
111      * @param shadowTypes Types for all shadows.
112      * @param flags Additional flags reserved for future.
113      */
114     virtual void SetShadowTypes(const ShadowTypes& shadowTypes, const uint32_t flags) = 0;
115 
116     /** Get the type of all shadows.
117      * @return Shadow type.
118      */
119     virtual ShadowTypes GetShadowTypes() const = 0;
120 
121     /** Set shadow quality resolutions for all shadows.
122      * @param resolutions Resolutions for all qualities.
123      * @param flags Additional flags reserved for future.
124      */
125     virtual void SetShadowQualityResolutions(const ShadowQualityResolutions& resolutions, const uint32_t flags) = 0;
126 
127     /** Get current shadow quality resolution.
128      * @param resolutions Resolutions for all qualities.
129      * @return Resolution of current shadows.
130      */
131     virtual BASE_NS::Math::UVec2 GetShadowQualityResolution() const = 0;
132 
133     /** Add light to scene. There can be only DefaultSceneRenderingConstants count of lights.
134      * Lights that exceeds the limits are dropped.
135      * @param light A light.
136      */
137     virtual void AddLight(const RenderLight& light) = 0;
138 
139     /** Get lights.
140      * @return Array view of all lights.
141      */
142     virtual BASE_NS::array_view<const RenderLight> GetLights() const = 0;
143 
144     /** Get light counts.
145      * @return Light count struct.
146      */
147     virtual LightCounts GetLightCounts() const = 0;
148 
149     /** Get lighting flags.
150      * @return lighting flags.
151      */
152     virtual LightingFlags GetLightingFlags() const = 0;
153 
154 protected:
155     IRenderDataStoreDefaultLight() = default;
156 };
157 CORE3D_END_NAMESPACE()
158 
159 #endif // API_3D_RENDER_IRENDER_DATA_STORE_DEFAULT_LIGHT_H
160