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()