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 #if !defined(API_3D_ECS_COMPONENTS_ENVIRONMENT_COMPONENT_H) || defined(IMPLEMENT_MANAGER)
17 #define API_3D_ECS_COMPONENTS_ENVIRONMENT_COMPONENT_H
18 
19 #if !defined(IMPLEMENT_MANAGER)
20 #include <3d/namespace.h>
21 #include <base/math/quaternion.h>
22 #include <base/math/vector.h>
23 #include <core/ecs/component_struct_macros.h>
24 #include <core/ecs/entity_reference.h>
25 #include <core/ecs/intf_component_manager.h>
26 #include <core/namespace.h>
27 
28 CORE3D_BEGIN_NAMESPACE()
29 #endif
30 
31 /** Environment component can be used to configure per camera environment lighting.
32  * With full customization one can use custom resources property
33  */
34 BEGIN_COMPONENT(IEnvironmentComponentManager, EnvironmentComponent)
35 #if !defined(IMPLEMENT_MANAGER)
36     enum class Background : uint8_t {
37         /** Background none */
38         NONE = 0,
39         /** Background image */
40         IMAGE = 1,
41         /** Background cubemap */
42         CUBEMAP = 2,
43         /** Background equirectangular */
44         EQUIRECTANGULAR = 3,
45     };
46 #endif
47     /** The type of the background fill when rendering.
48      */
49     DEFINE_PROPERTY(Background, background, "Background", 0, VALUE(Background::NONE))
50 
51     /** Indirect diffuse factor with intensity in alpha.
52      */
53     DEFINE_PROPERTY(
54         BASE_NS::Math::Vec4, indirectDiffuseFactor, "Indirect Diffuse Factor", 0, ARRAY_VALUE(1.0f, 1.0f, 1.0f, 1.0f))
55 
56     /** Indirect specular factor with intensity in alpha.
57      */
58     DEFINE_PROPERTY(
59         BASE_NS::Math::Vec4, indirectSpecularFactor, "Indirect Specular Factor", 0, ARRAY_VALUE(1.0f, 1.0f, 1.0f, 1.0f))
60 
61     /** Environment map factor with intensity in alpha.
62      */
63     DEFINE_PROPERTY(BASE_NS::Math::Vec4, envMapFactor, "Environment Map Factor", 0, ARRAY_VALUE(1.0f, 1.0f, 1.0f, 1.0f))
64 
65     /** Radiance cubemap.
66      */
67     DEFINE_PROPERTY(CORE_NS::EntityReference, radianceCubemap, "Radiance Cubemap", 0,)
68 
69     /** Number of mip map levels in radiance cubemap, zero value indicates that full mip chain is available.
70      */
71     DEFINE_PROPERTY(uint32_t, radianceCubemapMipCount, "Radiance Cubemap Mip Count", 0, VALUE(0))
72 
73     /** Environment map. (Cubemap, Equirect, Image)
74      */
75     DEFINE_PROPERTY(CORE_NS::EntityReference, envMap, "Environment Map", 0,)
76 
77     /** Mip lod level for env map sampling, allows to have blurred / gradient background for the scene.
78      */
79     DEFINE_PROPERTY(float, envMapLodLevel, "Envmap Lod Level", 0, VALUE(0.0f))
80 
81     /** Irradiance lighting coefficients.
82      * Values are expected to be prescaled with 1.0 / PI for Lambertian diffuse
83      */
84     DEFINE_ARRAY_PROPERTY(BASE_NS::Math::Vec3, 9, irradianceCoefficients, "Irradiance Coefficients", 0, ARRAY_VALUE())
85 
86     /** IBL environment rotation.
87      */
88     DEFINE_PROPERTY(
89         BASE_NS::Math::Quat, environmentRotation, "IBL Environment Rotation", 0, ARRAY_VALUE(0.f, 0.f, 0.f, 1.f))
90 
91     /** Additional blend factor for multiple environments.
92      */
93     DEFINE_PROPERTY(BASE_NS::Math::Vec4, blendFactor, "Additional Blend Factor for Multiple Environments", 0,
94         ARRAY_VALUE(1.0f, 1.0f, 1.0f, 1.0f))
95 
96     /** Shader. Prefer using automatic selection if no custom shaders.
97      * Needs to match default material env layouts and specializations (api/3d/shaders/common).
98      */
99     DEFINE_PROPERTY(CORE_NS::EntityReference, shader, "Custom Environment Shader", 0,)
100 
101     /** Custom material extension resources. Deprecates and prevents MaterialExtensionComponent usage.
102      * Are automatically bound to custom shader, custom pipeline layout custom descriptor set if they are in order.
103      */
104     DEFINE_PROPERTY(
105         BASE_NS::vector<CORE_NS::EntityReference>, customResources, "Custom Material Extension Resources", 0, )
106 
107 END_COMPONENT(IEnvironmentComponentManager, EnvironmentComponent, "a603b2e8-27f0-4c03-9538-70eaef88e3d3")
108 #if !defined(IMPLEMENT_MANAGER)
109 CORE3D_END_NAMESPACE()
110 #endif
111 #endif
112