• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()