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 "PropertyTools/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 const array_view<const Property> componentMetaData_ { ComponentMetadata, countof(ComponentMetadata) };
54
55 public:
RenderHandleComponentManager(IEcs & ecs)56 explicit RenderHandleComponentManager(IEcs& ecs)
57 : BaseManager<RenderHandleComponent, IRenderHandleComponentManager>(
58 ecs, CORE_NS::GetName<RenderHandleComponent>())
59 {}
60
61 ~RenderHandleComponentManager() = default;
62
PropertyCount() const63 size_t PropertyCount() const override
64 {
65 return componentMetaData_.size();
66 }
67
MetaData(size_t index) const68 const Property* MetaData(size_t index) const override
69 {
70 if (index < componentMetaData_.size()) {
71 return &componentMetaData_[index];
72 }
73 return nullptr;
74 }
75
MetaData() const76 array_view<const Property> MetaData() const override
77 {
78 return componentMetaData_;
79 }
80
GetRenderHandleReference(const CORE_NS::Entity entity) const81 RenderHandleReference GetRenderHandleReference(const CORE_NS::Entity entity) const override
82 {
83 if (const auto index = GetComponentId(entity); index != IComponentManager::INVALID_COMPONENT_ID) {
84 return components_[index].data_.reference;
85 }
86 return {};
87 }
88
GetRenderHandleReference(const IComponentManager::ComponentId index) const89 RenderHandleReference GetRenderHandleReference(const IComponentManager::ComponentId index) const override
90 {
91 if (index < components_.size()) {
92 return components_[index].data_.reference;
93 }
94 return {};
95 }
96
GetRenderHandle(const CORE_NS::Entity entity) const97 RenderHandle GetRenderHandle(const CORE_NS::Entity entity) const override
98 {
99 if (const auto index = GetComponentId(entity); index != IComponentManager::INVALID_COMPONENT_ID) {
100 return components_[index].data_.reference.GetHandle();
101 }
102 return {};
103 }
104
GetRenderHandle(const IComponentManager::ComponentId index) const105 RenderHandle GetRenderHandle(const IComponentManager::ComponentId index) const override
106 {
107 if (index < components_.size()) {
108 return components_[index].data_.reference.GetHandle();
109 }
110 return {};
111 }
112
GetEntityWithReference(const RenderHandleReference & handle) const113 Entity GetEntityWithReference(const RenderHandleReference& handle) const override
114 {
115 if (const auto pos = std::find_if(components_.begin(), components_.end(),
116 [handle = handle.GetHandle()](
117 const BaseComponentHandle& component) { return component.data_.reference.GetHandle() == handle; });
118 pos != components_.end()) {
119 return pos->entity_;
120 }
121 return {};
122 }
123 };
124
IRenderHandleComponentManagerInstance(IEcs & ecs)125 IComponentManager* IRenderHandleComponentManagerInstance(IEcs& ecs)
126 {
127 return new RenderHandleComponentManager(ecs);
128 }
129
IRenderHandleComponentManagerDestroy(IComponentManager * instance)130 void IRenderHandleComponentManagerDestroy(IComponentManager* instance)
131 {
132 delete static_cast<RenderHandleComponentManager*>(instance);
133 }
134 CORE3D_END_NAMESPACE()