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