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 <3d/ecs/components/mesh_component.h>
17 #include <core/ecs/intf_ecs.h>
18 #include <core/plugin/intf_class_factory.h>
19
20 #include "ComponentTools/base_manager.h"
21 #include "ComponentTools/base_manager.inl"
22
23 #define IMPLEMENT_MANAGER
24 #include "PropertyTools/property_macros.h"
25
26 CORE_BEGIN_NAMESPACE()
27 using BASE_NS::vector;
28 using CORE3D_NS::MeshComponent;
29
30 DECLARE_PROPERTY_TYPE(MeshComponent::Submesh);
31 DECLARE_PROPERTY_TYPE(MeshComponent::Submesh::BufferAccess);
32 DECLARE_PROPERTY_TYPE(MeshComponent::Submesh::IndexBufferAccess);
33 DECLARE_PROPERTY_TYPE(vector<MeshComponent::Submesh>);
34
35 DECLARE_PROPERTY_TYPE(RENDER_NS::IndexType);
36 BEGIN_ENUM(IndexTypeMetaData, RENDER_NS::IndexType)
37 DECL_ENUM(RENDER_NS::IndexType, CORE_INDEX_TYPE_UINT16, "16 Bit")
38 DECL_ENUM(RENDER_NS::IndexType, CORE_INDEX_TYPE_UINT32, "32 Bit")
39 END_ENUM(IndexTypeMetaData, RENDER_NS::IndexType)
40
41 BEGIN_ENUM(SubmeshFlagBitsMetaData, MeshComponent::Submesh::FlagBits)
42 DECL_ENUM(MeshComponent::Submesh::FlagBits, TANGENTS_BIT, "Tangents")
43 DECL_ENUM(MeshComponent::Submesh::FlagBits, VERTEX_COLORS_BIT, "Vertex Colors")
44 DECL_ENUM(MeshComponent::Submesh::FlagBits, SKIN_BIT, "Skin")
45 DECL_ENUM(MeshComponent::Submesh::FlagBits, SECOND_TEXCOORD_BIT, "Second Texcoord")
46 END_ENUM(SubmeshFlagBitsMetaData, MeshComponent::Submesh::FlagBits)
47
48 BEGIN_METADATA(BAMetaData, MeshComponent::Submesh::BufferAccess)
49 DECL_PROPERTY2(MeshComponent::Submesh::BufferAccess, buffer, "Handle", 0)
50 DECL_PROPERTY2(MeshComponent::Submesh::BufferAccess, offset, "Offset", 0)
51 DECL_PROPERTY2(MeshComponent::Submesh::BufferAccess, byteSize, "Size In Bytes", 0)
52 END_METADATA(BAMetaData, MeshComponent::Submesh::BufferAccess)
53
54 BEGIN_METADATA(IBAMetaData, MeshComponent::Submesh::IndexBufferAccess)
55 DECL_PROPERTY2(MeshComponent::Submesh::IndexBufferAccess, buffer, "Handle", 0)
56 DECL_PROPERTY2(MeshComponent::Submesh::IndexBufferAccess, offset, "Offset", 0)
57 DECL_PROPERTY2(MeshComponent::Submesh::IndexBufferAccess, byteSize, "Size In Bytes", 0)
58 DECL_PROPERTY2(MeshComponent::Submesh::IndexBufferAccess, indexType, "Index Type", 0)
59 END_METADATA(IBAMetaData, MeshComponent::Submesh::IndexBufferAccess)
60
61 BEGIN_METADATA(SMDMetaData, MeshComponent::Submesh)
62 /* Expose more properties? */
63 DECL_PROPERTY2(MeshComponent::Submesh, instanceCount, "Instance Count", 0)
64 DECL_PROPERTY2(MeshComponent::Submesh, bufferAccess, "", 0)
65 DECL_PROPERTY2(MeshComponent::Submesh, indexBuffer, "Index Buffer", 0)
66 DECL_PROPERTY2(MeshComponent::Submesh, indirectArgsBuffer, "Indirect Buffer", 0)
67 DECL_PROPERTY2(MeshComponent::Submesh, morphTargetBuffer, "Morph Target Buffer", 0)
68 DECL_PROPERTY2(MeshComponent::Submesh, vertexCount, "Vertex Count", 0)
69 DECL_PROPERTY2(MeshComponent::Submesh, indexCount, "Index Count", 0)
70 DECL_PROPERTY2(MeshComponent::Submesh, morphTargetCount, "Morph Target Count", 0)
71
72 DECL_PROPERTY2(MeshComponent::Submesh, aabbMin, "Min AABB", 0)
73 DECL_PROPERTY2(MeshComponent::Submesh, aabbMax, "Max AABB", 0)
74 DECL_PROPERTY2(MeshComponent::Submesh, material, "Material", 0)
75 DECL_PROPERTY2(MeshComponent::Submesh, additionalMaterials, "Additional Materials", 0)
76 DECL_BITFIELD_PROPERTY(
77 MeshComponent::Submesh, flags, "Options", PropertyFlags::IS_BITFIELD, MeshComponent::Submesh::FlagBits)
78 DECL_PROPERTY2(MeshComponent::Submesh, renderSortLayer, "Sort Layer", 0)
79 DECL_PROPERTY2(MeshComponent::Submesh, renderSortLayerOrder, "Sort Layer Order", 0)
80 END_METADATA(SMDMetaData, MeshComponent::Submesh)
81
82 DECLARE_CONTAINER_API(MPD, MeshComponent::Submesh);
83 CORE_END_NAMESPACE()
84
85 CORE3D_BEGIN_NAMESPACE()
86 using BASE_NS::array_view;
87 using BASE_NS::countof;
88
89 using CORE_NS::BaseManager;
90 using CORE_NS::IComponentManager;
91 using CORE_NS::IEcs;
92 using CORE_NS::Property;
93
94 class MeshComponentManager final : public BaseManager<MeshComponent, IMeshComponentManager> {
95 BEGIN_PROPERTY(MeshComponent, ComponentMetadata)
96 #include <3d/ecs/components/mesh_component.h>
97 END_PROPERTY();
98 const array_view<const Property> componentMetaData_ { ComponentMetadata, countof(ComponentMetadata) };
99
100 public:
MeshComponentManager(IEcs & ecs)101 explicit MeshComponentManager(IEcs& ecs)
102 : BaseManager<MeshComponent, IMeshComponentManager>(ecs, CORE_NS::GetName<MeshComponent>())
103 {}
104
105 ~MeshComponentManager() = default;
106
PropertyCount() const107 size_t PropertyCount() const override
108 {
109 return componentMetaData_.size();
110 }
111
MetaData(size_t index) const112 const Property* MetaData(size_t index) const override
113 {
114 if (index < componentMetaData_.size()) {
115 return &componentMetaData_[index];
116 }
117 return nullptr;
118 }
119
MetaData() const120 array_view<const Property> MetaData() const override
121 {
122 return componentMetaData_;
123 }
124 };
125
IMeshComponentManagerInstance(IEcs & ecs)126 IComponentManager* IMeshComponentManagerInstance(IEcs& ecs)
127 {
128 return new MeshComponentManager(ecs);
129 }
130
IMeshComponentManagerDestroy(IComponentManager * instance)131 void IMeshComponentManagerDestroy(IComponentManager* instance)
132 {
133 delete static_cast<MeshComponentManager*>(instance);
134 }
135 CORE_END_NAMESPACE()
136