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/namespace.h>
16 #include <meta/base/namespace.h>
17 #include <meta/ext/any_builder.h>
18 #include <meta/ext/engine/internal_access.h>
19 #include <meta/interface/engine/intf_engine_data.h>
20 #include <meta/interface/intf_object_registry.h>
21 #include <scene_plugin/interface/intf_environment.h>
22
23 #include <3d/ecs/components/material_component.h>
24 #include <3d/ecs/components/environment_component.h>
25 #include <3d/ecs/components/light_component.h>
26 #include <3d/ecs/components/post_process_component.h>
27 #include <3d/ecs/components/mesh_component.h>
28 #include <3d/ecs/components/animation_component.h>
29 #include <3d/ecs/components/animation_state_component.h>
30 #include <3d/ecs/components/camera_component.h>
31
32 using CORE3D_NS::MaterialComponent;
33 using CORE3D_NS::EnvironmentComponent;
34 using CORE3D_NS::LightComponent;
35 using CORE3D_NS::MeshComponent;
36 using TonemapConfiguration = RENDER_NS::TonemapConfiguration;
37 using Submesh = MeshComponent::Submesh;
38 using BASE_NS::vector;
39 using CORE3D_NS::AnimationComponent;
40 using CORE3D_NS::AnimationStateComponent;
41 using CORE3D_NS::CameraComponent;
42
43 CORE_BEGIN_NAMESPACE()
44 DECLARE_PROPERTY_TYPE(CORE3D_NS::EnvironmentComponent::Background);
45 DECLARE_PROPERTY_TYPE(CORE3D_NS::LightComponent::Type);
46 DECLARE_PROPERTY_TYPE(MaterialComponent::Type);
47 DECLARE_PROPERTY_TYPE(MaterialComponent::TextureInfo);
48 DECLARE_PROPERTY_TYPE(MaterialComponent::TextureTransform);
49 DECLARE_PROPERTY_TYPE(MaterialComponent::Shader);
50 DECLARE_PROPERTY_TYPE(TonemapConfiguration);
51 DECLARE_PROPERTY_TYPE(TonemapConfiguration::TonemapType);
52 DECLARE_PROPERTY_TYPE(vector<MeshComponent::Submesh>);
53 DECLARE_PROPERTY_TYPE(AnimationComponent::PlaybackState);
54 DECLARE_PROPERTY_TYPE(BASE_NS::vector<AnimationStateComponent::TrackState>);
55 DECLARE_PROPERTY_TYPE(CameraComponent::RenderingPipeline);
56 DECLARE_PROPERTY_TYPE(CameraComponent::Culling);
57 DECLARE_PROPERTY_TYPE(CameraComponent::Projection);
58 CORE_END_NAMESPACE()
59
60 META_BEGIN_NAMESPACE()
61 META_TYPE(CORE3D_NS::EnvironmentComponent::Background);
62 META_TYPE(CORE3D_NS::LightComponent::Type);
63 META_TYPE(MaterialComponent::Type)
64 META_TYPE(MaterialComponent::Shader)
65 META_TYPE(MaterialComponent::TextureInfo)
66 META_TYPE(MaterialComponent::TextureTransform)
67 META_TYPE(TonemapConfiguration);
68 META_TYPE(TonemapConfiguration::TonemapType);
69 META_TYPE(Submesh)
70 META_TYPE(AnimationComponent::PlaybackState);
71 META_TYPE(AnimationStateComponent::TrackState);
72 META_TYPE(CameraComponent::RenderingPipeline);
73 META_TYPE(CameraComponent::Culling);
74 META_TYPE(CameraComponent::Projection);
75 META_END_NAMESPACE()
76
SCENE_BEGIN_NAMESPACE()77 SCENE_BEGIN_NAMESPACE()
78
79 template<typename Prop>
80 void RegisterEngineAccessImpl()
81 {
82 static_assert(CORE_NS::PropertySystem::is_defined<Prop>().value);
83 META_NS::GetObjectRegistry().GetEngineData().RegisterInternalValueAccess(
84 META_NS::MetaType<Prop>::coreType, CreateShared<META_NS::EngineInternalValueAccess<Prop>>());
85 }
86
87 template<typename Prop>
RegisterEngineArrayAccessImpl()88 void RegisterEngineArrayAccessImpl()
89 {
90 static_assert(CORE_NS::PropertySystem::is_defined<Prop>().value);
91 META_NS::GetObjectRegistry().GetEngineData().RegisterInternalValueAccess(
92 META_NS::MetaType<Prop[]>::coreType, CreateShared<META_NS::EngineInternalArrayValueAccess<Prop>>());
93 }
94
95 template<typename Prop>
RegisterEngineAccessImplAndAny()96 void RegisterEngineAccessImplAndAny()
97 {
98 META_NS::GetObjectRegistry().GetPropertyRegister().RegisterAny(CreateShared<META_NS::DefaultAnyBuilder<META_NS::Any<Prop>>>());
99 RegisterEngineAccessImpl<Prop>();
100 }
101
102 template<typename Prop, typename AccessType>
RegisterMapEngineAccessImpl()103 void RegisterMapEngineAccessImpl()
104 {
105 static_assert(CORE_NS::PropertySystem::is_defined<Prop>().value);
106
107 auto& r = META_NS::GetObjectRegistry();
108 r.GetEngineData().RegisterInternalValueAccess(META_NS::MetaType<Prop>::coreType,
109 CreateShared < META_NS::EngineInternalValueAccessImpl<Prop, META_NS::Any<AccessType>, AccessType>> ());
110 }
111
112 template<typename Prop>
UnregisterEngineAccessImpl()113 void UnregisterEngineAccessImpl()
114 {
115 META_NS::GetObjectRegistry().GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<Prop>::coreType);
116 }
117
118 template<typename Prop>
UnregisterEngineArrayAccessImpl()119 void UnregisterEngineArrayAccessImpl()
120 {
121 META_NS::GetObjectRegistry().GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<Prop[]>::coreType);
122 }
123
124 template<typename Prop>
UnregisterEngineAccessImplAndAny()125 void UnregisterEngineAccessImplAndAny()
126 {
127 UnregisterEngineAccessImpl<Prop>();
128 META_NS::GetObjectRegistry().GetPropertyRegister().UnregisterAny(META_NS::Any<Prop>::StaticGetClassId());
129 }
130
RegisterEngineAccess()131 void RegisterEngineAccess()
132 {
133 static_assert(CORE_NS::PropertySystem::is_defined<EnvironmentComponent::Background>().value);
134
135 RegisterMapEngineAccessImpl<CameraComponent::Projection, uint8_t>();
136 RegisterMapEngineAccessImpl<CameraComponent::Culling, uint8_t>();
137 RegisterMapEngineAccessImpl<CameraComponent::RenderingPipeline, uint8_t>();
138 RegisterMapEngineAccessImpl<AnimationComponent::PlaybackState, uint8_t>();
139 RegisterMapEngineAccessImpl<EnvironmentComponent::Background, uint8_t>();
140 RegisterMapEngineAccessImpl<LightComponent::Type, uint8_t>();
141 RegisterMapEngineAccessImpl<MaterialComponent::Type, uint8_t>();
142 RegisterMapEngineAccessImpl<TonemapConfiguration::TonemapType, uint32_t>();
143
144 RegisterEngineAccessImplAndAny<MaterialComponent::TextureInfo>();
145 RegisterEngineAccessImplAndAny<MaterialComponent::TextureTransform>();
146 RegisterEngineAccessImplAndAny<MaterialComponent::Shader>();
147 RegisterEngineAccessImpl<TonemapConfiguration>();
148 RegisterEngineAccessImpl<BASE_NS::vector<Submesh>>();
149 RegisterEngineAccessImpl<BASE_NS::vector<AnimationStateComponent::TrackState>>();
150 RegisterEngineArrayAccessImpl<MaterialComponent::TextureInfo>();
151 }
UnregisterEngineAccess()152 void UnregisterEngineAccess()
153 {
154 UnregisterEngineArrayAccessImpl<MaterialComponent::TextureInfo>();
155 UnregisterEngineAccessImpl<BASE_NS::vector<AnimationStateComponent::TrackState>>();
156 UnregisterEngineAccessImpl<BASE_NS::vector<Submesh>>();
157 UnregisterEngineAccessImpl<TonemapConfiguration>();
158 UnregisterEngineAccessImplAndAny<MaterialComponent::Shader>();
159 UnregisterEngineAccessImplAndAny<MaterialComponent::TextureTransform>();
160 UnregisterEngineAccessImplAndAny<MaterialComponent::TextureInfo>();
161
162 auto& r = META_NS::GetObjectRegistry();
163 r.GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<TonemapConfiguration::TonemapType>::coreType);
164 r.GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<MaterialComponent::Type>::coreType);
165 r.GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<LightComponent::Type>::coreType);
166 r.GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<EnvironmentComponent::Background>::coreType);
167 r.GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<AnimationComponent::PlaybackState>::coreType);
168 r.GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<CameraComponent::RenderingPipeline>::coreType);
169 r.GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<CameraComponent::Culling>::coreType);
170 r.GetEngineData().UnregisterInternalValueAccess(META_NS::MetaType<CameraComponent::Projection>::coreType);
171 }
172
173 SCENE_END_NAMESPACE()
174