Avara3D 0.2.0
C++ API reference
Mesh.h
1//
2// Mesh.h
3// avara3d
4//
5// Created by Morgan Davis on 10/21/16.
6// Copyright © 2026 Morgan K Davis. All rights reserved.
7//
8
9#ifndef AVARA3D_MESH_MESH_H
10#define AVARA3D_MESH_MESH_H
11
12#include <climits>
13#include <filesystem>
14#include <memory>
15#include <optional>
16#include <string>
17#include <vector>
18
19#include "a3d/Id.h"
20#include "a3d/Math.h"
21#include "a3d/mesh/AABB.h"
22#include "a3d/util/Bitmask.h"
23
24namespace a3d {
25
26 class Line;
27 class Material;
28 class MeshElement;
29 class Node;
30 class Renderer;
31 class RenderContext;
32 class RenderItem;
33
42 class Mesh {
43
44 public:
45 // [Public Types]
46
48 enum class ImportOptions : uint16_t {
49 None = 0,
50
51 // note maps to SceneImportOptions
52 ImportMaterials = 1 << 1,
53 ImportAll = UINT16_MAX
54 };
55
56 // [Public Static Member Functions]
57
58 // imports the first mesh in the specified file, with no node transforms applied.
69 static std::shared_ptr<Mesh> FromFile(const std::filesystem::path& path,
71
72 // [Public Lifecycle Functions]
73
79 Mesh(const std::string& name,
80 std::unique_ptr<MeshElement> element,
81 const std::shared_ptr<Material>& material);
82
88 Mesh(std::unique_ptr<MeshElement> element, const std::shared_ptr<Material>& material);
89
95 Mesh(const std::string& name,
96 std::vector<std::unique_ptr<MeshElement>>& elements,
97 const std::vector<std::shared_ptr<Material>>& materials);
98
104 Mesh(std::vector<std::unique_ptr<MeshElement>>& elements,
105 const std::vector<std::shared_ptr<Material>>& materials);
106 virtual ~Mesh();
107
108 Mesh(const Mesh&) = delete;
109 Mesh& operator=(const Mesh&) = delete;
110
111 Mesh(Mesh&&) = delete;
112 Mesh& operator=(Mesh&&) = delete;
113
114 // [Public Member Functions]
115
117 std::optional<std::string> name() const;
118
120 void name(const std::string& name);
121
123 const std::vector<std::unique_ptr<MeshElement>>& elements();
124
126 const std::vector<std::shared_ptr<Material>>& materials();
127
129 std::shared_ptr<Material> firstMaterial() const;
130
132 std::shared_ptr<Material> materialNamed(const std::string& name) const;
133
135 void addMaterial(const std::shared_ptr<Material>& material);
136
142 void insertMaterial(const std::shared_ptr<Material>& material, int index);
143
149 void removeMaterial(int index);
150
156 void replaceMaterial(int index, const std::shared_ptr<Material>& replacement);
157
158 // [Internal Types]
159
160 enum class DirtyMask : uint32_t {
161 None = 0,
162 // AABB?
163 All = UINT_MAX
164 };
165
166 // [Internal Member Functions]
167
168 MeshId id() const noexcept;
169
170 const AABB& localAABB() const;
171 AABB worldAABB(const math::mat4& worldMat, bool vertfit) const;
172 math::vec3 localExtent() const;
173 math::vec3 worldExtent(const math::mat4& worldTransform) const;
174
175 void burnTransform(const math::mat4& transform, bool normals);
176
177 DirtyMask dirtyMask() const;
178 void dirtyMask(DirtyMask mask);
179
180 protected:
181 // [Protected Member Functions]
182
183 void genLocalAABB();
184
185 // [Protected Member Variables]
186
187 std::vector<std::unique_ptr<MeshElement>> _elements;
188 std::vector<std::shared_ptr<Material>> _materials;
189
190 private:
191 // [Private Lifecycle Functions]
192
193 Mesh();
194
195 // [Private Member Variables]
196
197 MeshId _id;
198 std::optional<std::string> _name;
199 AABB _localAABB;
200 DirtyMask _dirtyMask;
201 };
202
203 namespace util::bitmask {
204
205 template<>
206 struct enable_ops<Mesh::ImportOptions> : std::true_type {};
207
208 template<>
209 struct enable_ops<Mesh::DirtyMask> : std::true_type {};
210
211 }
212}
213
214#endif // AVARA3D_MESH_MESH_H
Describes the surface appearance and render state of Mesh geometry.
Definition: Material.h:34
Owns the vertex and optional index data for one mesh primitive.
Definition: MeshElement.h:43
Owns renderable geometry elements and their materials.
Definition: Mesh.h:42
std::shared_ptr< Material > materialNamed(const std::string &name) const
Returns the first material named name, or nullptr if no material matches.
const std::vector< std::shared_ptr< Material > > & materials()
Returns the materials retained by this Mesh.
std::shared_ptr< Material > firstMaterial() const
Returns the first material, or nullptr if the material list is empty.
void name(const std::string &name)
Sets the mesh name.
Mesh(const std::string &name, std::vector< std::unique_ptr< MeshElement > > &elements, const std::vector< std::shared_ptr< Material > > &materials)
Creates a named Mesh by moving the elements in elements into the Mesh.
std::optional< std::string > name() const
Returns the optional mesh name.
void addMaterial(const std::shared_ptr< Material > &material)
Appends material to the material list.
static std::shared_ptr< Mesh > FromFile(const std::filesystem::path &path, ImportOptions options=ImportOptions::ImportMaterials)
Imports the first mesh in a glTF file without applying scene-node transforms.
Mesh(const std::string &name, std::unique_ptr< MeshElement > element, const std::shared_ptr< Material > &material)
Creates a named Mesh and takes ownership of element.
ImportOptions
Selects optional resources imported with Mesh::FromFile().
Definition: Mesh.h:48
@ ImportMaterials
Import materials referenced by the mesh.
void replaceMaterial(int index, const std::shared_ptr< Material > &replacement)
Replaces the material at index with replacement.
const std::vector< std::unique_ptr< MeshElement > > & elements()
Returns the MeshElement instances owned by this Mesh.
Mesh(std::vector< std::unique_ptr< MeshElement > > &elements, const std::vector< std::shared_ptr< Material > > &materials)
Creates a Mesh by moving the elements in elements into the Mesh.
Mesh(std::unique_ptr< MeshElement > element, const std::shared_ptr< Material > &material)
Creates a Mesh and takes ownership of element.
void insertMaterial(const std::shared_ptr< Material > &material, int index)
Inserts material at index.
void removeMaterial(int index)
Removes the material at index.
Axis-aligned bounding box defined by minimum and maximum corners.
Definition: AABB.h:17