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