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 #include <algorithm>
17
18 #include <3d/ecs/components/render_handle_component.h>
19 #include <core/intf_engine.h>
20 #include <render/device/intf_gpu_resource_manager.h>
21 #include <render/implementation_uids.h>
22 #include <render/intf_render_context.h>
23 #include <render/resource_handle.h>
24
25 #include "ComponentTools/base_manager.h"
26 #include "ComponentTools/base_manager.inl"
27
28 #define IMPLEMENT_MANAGER
29 #include <core/property_tools/property_macros.h>
30
31 CORE_BEGIN_NAMESPACE()
32 DECLARE_PROPERTY_TYPE(RENDER_NS::RenderHandle);
33 DECLARE_PROPERTY_TYPE(RENDER_NS::RenderHandleReference);
34 CORE_END_NAMESPACE()
35
36 CORE3D_BEGIN_NAMESPACE()
37 using BASE_NS::array_view;
38 using BASE_NS::countof;
39
40 using CORE_NS::BaseManager;
41 using CORE_NS::Entity;
42 using CORE_NS::IComponentManager;
43 using CORE_NS::IEcs;
44 using CORE_NS::Property;
45
46 using RENDER_NS::RenderHandle;
47 using RENDER_NS::RenderHandleReference;
48
49 class RenderHandleComponentManager final : public BaseManager<RenderHandleComponent, IRenderHandleComponentManager> {
50 BEGIN_PROPERTY(RenderHandleComponent, componentMetaData_)
51 #include <3d/ecs/components/render_handle_component.h>
52 END_PROPERTY();
53
54 public:
RenderHandleComponentManager(IEcs & ecs)55 explicit RenderHandleComponentManager(IEcs& ecs)
56 : BaseManager<RenderHandleComponent, IRenderHandleComponentManager>(
57 ecs, CORE_NS::GetName<RenderHandleComponent>())
58 {}
59
60 ~RenderHandleComponentManager() = default;
61
PropertyCount() const62 size_t PropertyCount() const override
63 {
64 return BASE_NS::countof(componentMetaData_);
65 }
66
MetaData(size_t index) const67 const Property* MetaData(size_t index) const override
68 {
69 if (index < BASE_NS::countof(componentMetaData_)) {
70 return &componentMetaData_[index];
71 }
72 return nullptr;
73 }
74
MetaData() const75 array_view<const Property> MetaData() const override
76 {
77 return componentMetaData_;
78 }
79
GetRenderHandleReference(const CORE_NS::Entity entity) const80 RenderHandleReference GetRenderHandleReference(const CORE_NS::Entity entity) const override
81 {
82 if (const auto index = GetComponentId(entity); index != IComponentManager::INVALID_COMPONENT_ID) {
83 return components_[index].data_.reference;
84 }
85 return {};
86 }
87
GetRenderHandleReference(const IComponentManager::ComponentId index) const88 RenderHandleReference GetRenderHandleReference(const IComponentManager::ComponentId index) const override
89 {
90 if (index < components_.size()) {
91 return components_[index].data_.reference;
92 }
93 return {};
94 }
95
GetRenderHandle(const CORE_NS::Entity entity) const96 RenderHandle GetRenderHandle(const CORE_NS::Entity entity) const override
97 {
98 if (const auto index = GetComponentId(entity); index != IComponentManager::INVALID_COMPONENT_ID) {
99 return components_[index].data_.reference.GetHandle();
100 }
101 return {};
102 }
103
GetRenderHandle(const IComponentManager::ComponentId index) const104 RenderHandle GetRenderHandle(const IComponentManager::ComponentId index) const override
105 {
106 if (index < components_.size()) {
107 return components_[index].data_.reference.GetHandle();
108 }
109 return {};
110 }
111
GetEntityWithReference(const RenderHandleReference & handle) const112 Entity GetEntityWithReference(const RenderHandleReference& handle) const override
113 {
114 if (const auto pos = std::find_if(components_.begin(), components_.end(),
115 [handle = handle.GetHandle()](
116 const BaseComponentHandle& component) { return component.data_.reference.GetHandle() == handle; });
117 pos != components_.end()) {
118 return pos->entity_;
119 }
120 return {};
121 }
122 };
123
IRenderHandleComponentManagerInstance(IEcs & ecs)124 IComponentManager* IRenderHandleComponentManagerInstance(IEcs& ecs)
125 {
126 return new RenderHandleComponentManager(ecs);
127 }
128
IRenderHandleComponentManagerDestroy(IComponentManager * instance)129 void IRenderHandleComponentManagerDestroy(IComponentManager* instance)
130 {
131 delete static_cast<RenderHandleComponentManager*>(instance);
132 }
133 CORE3D_END_NAMESPACE()