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 #ifndef CORE_UTIL_MESH_UTIL_H
16 #define CORE_UTIL_MESH_UTIL_H
17
18 #include <3d/util/intf_mesh_builder.h>
19 #include <3d/util/intf_mesh_util.h>
20 #include <base/containers/array_view.h>
21 #include <base/containers/string_view.h>
22 #include <core/namespace.h>
23
BASE_BEGIN_NAMESPACE()24 BASE_BEGIN_NAMESPACE()
25 namespace Math {
26 class Vec2;
27 class Vec3;
28 class Vec4;
29 } // namespace Math
30 BASE_END_NAMESPACE()
31
32 CORE_BEGIN_NAMESPACE()
33 class IClassFactory;
34 CORE_END_NAMESPACE()
35
CORE3D_BEGIN_NAMESPACE()36 CORE3D_BEGIN_NAMESPACE()
37 class MeshUtil : public IMeshUtil {
38 public:
39 CORE_NS::Entity GeneratePlaneMesh(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
40 float width, float depth) override;
41 CORE_NS::Entity GenerateSphereMesh(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
42 float radius, uint32_t rings, uint32_t sectors) override;
43 CORE_NS::Entity GenerateConeMesh(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
44 float radius, float length, uint32_t sectors) override;
45 CORE_NS::Entity GenerateTorusMesh(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
46 float majorRadius, float minorRadius, uint32_t majorSectors, uint32_t minorSectors) override;
47 CORE_NS::Entity GenerateCubeMesh(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
48 float width, float height, float depth) override;
49
50 CORE_NS::Entity GenerateEntity(
51 const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity meshEntity) override;
52
53 CORE_NS::Entity GenerateCube(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
54 float width, float height, float depth) override;
55 CORE_NS::Entity GeneratePlane(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
56 float width, float depth) override;
57
58 CORE_NS::Entity GenerateSphere(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
59 float radius, uint32_t rings, uint32_t sectors) override;
60
61 CORE_NS::Entity GenerateCone(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
62 float radius, float length, uint32_t sectors) override;
63
64 CORE_NS::Entity GenerateTorus(const CORE_NS::IEcs& ecs, BASE_NS::string_view name, CORE_NS::Entity material,
65 float majorRadius, float minorRadius, uint32_t majorSectors, uint32_t minorSectors) override;
66
67 explicit MeshUtil(CORE_NS::IClassFactory& factory);
68 ~MeshUtil() override = default;
69
70 static void CalculateTangents(const BASE_NS::array_view<const uint8_t>& indices,
71 const BASE_NS::array_view<const BASE_NS::Math::Vec3>& positions,
72 const BASE_NS::array_view<const BASE_NS::Math::Vec3>& normals,
73 const BASE_NS::array_view<const BASE_NS::Math::Vec2>& uvs,
74 BASE_NS::array_view<BASE_NS::Math::Vec4> outTangents);
75 static void CalculateTangents(const BASE_NS::array_view<const uint16_t>& indices,
76 const BASE_NS::array_view<const BASE_NS::Math::Vec3>& positions,
77 const BASE_NS::array_view<const BASE_NS::Math::Vec3>& normals,
78 const BASE_NS::array_view<const BASE_NS::Math::Vec2>& uvs,
79 BASE_NS::array_view<BASE_NS::Math::Vec4> outTangents);
80 static void CalculateTangents(const BASE_NS::array_view<const uint32_t>& indices,
81 const BASE_NS::array_view<const BASE_NS::Math::Vec3>& positions,
82 const BASE_NS::array_view<const BASE_NS::Math::Vec3>& normals,
83 const BASE_NS::array_view<const BASE_NS::Math::Vec2>& uvs,
84 BASE_NS::array_view<BASE_NS::Math::Vec4> outTangents);
85
86 protected:
87 IMeshBuilder::Ptr InitializeBuilder(const IMeshBuilder::Submesh& submesh) const;
88 CORE_NS::Entity CreateMesh(const CORE_NS::IEcs& ecs, const IMeshBuilder& builder, BASE_NS::string_view name) const;
89
90 CORE_NS::IClassFactory& factory_;
91 };
92
93 CORE3D_END_NAMESPACE()
94 #endif // CORE_UTIL_MESH_UTIL_H
95