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