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 #include <scene_plugin/api/light_uid.h>
16 
17 #include <meta/ext/concrete_base_object.h>
18 
19 #include "bind_templates.inl"
20 #include "node_impl.h"
21 
22 namespace {
23 class LightImpl
24     : public META_NS::ConcreteBaseMetaObjectFwd<LightImpl, NodeImpl, SCENE_NS::ClassId::Light, SCENE_NS::ILight> {
25     static constexpr BASE_NS::string_view LIGHT_COMPONENT_NAME = "LightComponent";
26     static constexpr size_t LIGHT_COMPONENT_NAME_LEN = LIGHT_COMPONENT_NAME.size() + 1;
27     static constexpr BASE_NS::string_view LIGHT_COLOR = "LightComponent.color";
28     static constexpr BASE_NS::string_view LIGHT_INTENSITY = "LightComponent.intensity";
29     static constexpr BASE_NS::string_view LIGHT_NEARPLANE = "LightComponent.nearPlane";
30     static constexpr BASE_NS::string_view LIGHT_SHADOWENABLED = "LightComponent.shadowEnabled";
31     static constexpr BASE_NS::string_view LIGHT_SHADOWSTRENGTH = "LightComponent.shadowStrength";
32     static constexpr BASE_NS::string_view LIGHT_SHADOWDEPTHBIAS = "LightComponent.shadowDepthBias";
33     static constexpr BASE_NS::string_view LIGHT_SHADOWNORMALBIAS = "LightComponent.shadowNormalBias";
34     static constexpr BASE_NS::string_view LIGHT_SPOTINNERANGLE = "LightComponent.spotInnerAngle";
35     static constexpr BASE_NS::string_view LIGHT_SPOTOUTERANGLE = "LightComponent.spotOuterAngle";
36     static constexpr BASE_NS::string_view LIGHT_TYPE = "LightComponent.type";
37     static constexpr BASE_NS::string_view LIGHT_ADDITIONALFACTOR = "LightComponent.additionalFactor";
38     static constexpr BASE_NS::string_view LIGHT_LAYERMASK = "LightComponent.lightLayerMask";
39     static constexpr BASE_NS::string_view LIGHT_SHADOWLAYERMASK = "LightComponent.shadowLayerMask";
40 
Build(const IMetadata::Ptr & data)41     bool Build(const IMetadata::Ptr& data) override
42     {
43         bool ret = false;
44         if (ret = NodeImpl::Build(data); ret) {
45             PropertyNameMask()[LIGHT_COMPONENT_NAME] = { LIGHT_COLOR.substr(LIGHT_COMPONENT_NAME_LEN),
46                 LIGHT_INTENSITY.substr(LIGHT_COMPONENT_NAME_LEN), LIGHT_NEARPLANE.substr(LIGHT_COMPONENT_NAME_LEN),
47                 LIGHT_SHADOWENABLED.substr(LIGHT_COMPONENT_NAME_LEN),
48                 LIGHT_SHADOWSTRENGTH.substr(LIGHT_COMPONENT_NAME_LEN),
49                 LIGHT_SHADOWDEPTHBIAS.substr(LIGHT_COMPONENT_NAME_LEN),
50                 LIGHT_SHADOWNORMALBIAS.substr(LIGHT_COMPONENT_NAME_LEN),
51                 LIGHT_SPOTINNERANGLE.substr(LIGHT_COMPONENT_NAME_LEN),
52                 LIGHT_SPOTOUTERANGLE.substr(LIGHT_COMPONENT_NAME_LEN), LIGHT_TYPE.substr(LIGHT_COMPONENT_NAME_LEN),
53                 LIGHT_ADDITIONALFACTOR.substr(LIGHT_COMPONENT_NAME_LEN),
54                 LIGHT_LAYERMASK.substr(LIGHT_COMPONENT_NAME_LEN),
55                 LIGHT_SHADOWLAYERMASK.substr(LIGHT_COMPONENT_NAME_LEN) };
56             DisableInputHandling();
57         }
58         return ret;
59     }
60 
META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ILight,SCENE_NS::Color,Color,SCENE_NS::Colors::WHITE)61     META_IMPLEMENT_INTERFACE_PROPERTY(
62         SCENE_NS::ILight, SCENE_NS::Color, Color, SCENE_NS::Colors::WHITE)
63     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ILight, float, Intensity, 1.f)
64     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ILight, float, NearPlane, 0.5f)
65     META_IMPLEMENT_INTERFACE_PROPERTY(
66         SCENE_NS::ILight, bool, ShadowEnabled, true)
67     META_IMPLEMENT_INTERFACE_PROPERTY(
68         SCENE_NS::ILight, float, ShadowStrength, 1.0f)
69     META_IMPLEMENT_INTERFACE_PROPERTY(
70         SCENE_NS::ILight, float, ShadowDepthBias, 0.005f)
71     META_IMPLEMENT_INTERFACE_PROPERTY(
72         SCENE_NS::ILight, float, ShadowNormalBias, 0.025f)
73     META_IMPLEMENT_INTERFACE_PROPERTY(
74         SCENE_NS::ILight, float, SpotInnerAngle, 0.f)
75     META_IMPLEMENT_INTERFACE_PROPERTY(
76         SCENE_NS::ILight, float, SpotOuterAngle, 0.78539816339f)
77     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ILight, uint8_t, Type,
78         SCENE_NS::ILight::SceneLightType::SCENE_LIGHT_DIRECTIONAL)
79     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ILight, BASE_NS::Math::Vec4, AdditionalFactor,
80         BASE_NS::Math::Vec4(0.f, 0.f, 0.f, 0.f))
81     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ILight, uint64_t, LightLayerMask, CORE3D_NS::CORE_LAYER_FLAG_BIT_ALL)
82     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ILight, uint64_t, ShadowLayerMask, CORE3D_NS::CORE_LAYER_FLAG_BIT_ALL)
83 
84     bool CompleteInitialization(const BASE_NS::string& path) override
85     {
86         if (!NodeImpl::CompleteInitialization(path)) {
87             return false;
88         }
89 
90         auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_);
91         BASE_NS::vector<size_t> slots = { 0, 0, 1, 1, 2, 2 };
92         BindSlottedChanges<BASE_NS::Math::Vec3, SCENE_NS::Color>(
93             propHandler_, META_ACCESS_PROPERTY(Color), meta, LIGHT_COLOR, slots);
94         BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(Intensity), meta, LIGHT_INTENSITY);
95         BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(NearPlane), meta, LIGHT_NEARPLANE);
96         BindChanges<bool>(propHandler_, META_ACCESS_PROPERTY(ShadowEnabled), meta, LIGHT_SHADOWENABLED);
97         BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(ShadowStrength), meta, LIGHT_SHADOWSTRENGTH);
98         BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(ShadowDepthBias), meta, LIGHT_SHADOWDEPTHBIAS);
99         BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(ShadowNormalBias), meta, LIGHT_SHADOWNORMALBIAS);
100         BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(SpotInnerAngle), meta, LIGHT_SPOTINNERANGLE);
101         BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(SpotOuterAngle), meta, LIGHT_SPOTOUTERANGLE);
102         BindChanges<uint8_t>(propHandler_, META_ACCESS_PROPERTY(Type), meta, LIGHT_TYPE);
103         BindChanges<BASE_NS::Math::Vec4>(
104             propHandler_, META_ACCESS_PROPERTY(AdditionalFactor), meta, LIGHT_ADDITIONALFACTOR);
105         BindChanges<uint64_t>(propHandler_, META_ACCESS_PROPERTY(LightLayerMask), meta, LIGHT_LAYERMASK);
106         BindChanges<uint64_t>(propHandler_, META_ACCESS_PROPERTY(ShadowLayerMask), meta, LIGHT_SHADOWLAYERMASK);
107 
108         return true;
109     }
110 
~LightImpl()111     virtual ~LightImpl() {}
112 };
113 } // namespace
SCENE_BEGIN_NAMESPACE()114 SCENE_BEGIN_NAMESPACE()
115 void RegisterLightImpl()
116 {
117     META_NS::GetObjectRegistry().RegisterObjectType<LightImpl>();
118 }
UnregisterLightImpl()119 void UnregisterLightImpl()
120 {
121     META_NS::GetObjectRegistry().UnregisterObjectType<LightImpl>();
122 }
123 SCENE_END_NAMESPACE()