3 #include "../interfaces/boundable.h"
4 #include "../generic/property.h"
5 #include "../generic/managed.h"
6 #include "../interfaces/nameable.h"
15 enum MaterialSlot : uint8_t {
37 typedef std::vector<VertexRange> VertexRangeList;
47 const std::string& name,
49 std::shared_ptr<IndexData>& index_data,
50 MeshArrangement arrangement = MESH_ARRANGEMENT_TRIANGLES
55 const std::string& name,
57 MeshArrangement arrangement = MESH_ARRANGEMENT_TRIANGLES
62 SubmeshType type()
const;
74 return &vertex_ranges_[0];
77 std::size_t vertex_range_count()
const {
78 return vertex_ranges_.size();
81 void remove_all_vertex_ranges();
83 void set_material(
const MaterialPtr &material);
84 void set_material_at_slot(MaterialSlot var,
const MaterialPtr& material);
86 MaterialPtr material()
const;
87 MaterialPtr material_at_slot(MaterialSlot var,
bool fallback=
false)
const;
89 MeshArrangement arrangement()
const {
return arrangement_; }
91 bool reverse_winding();
97 void set_diffuse(
const Colour &colour);
103 void set_contributes_to_edge_list(
bool v=
true) {
104 contributes_to_edge_list_ = v;
107 bool contributes_to_edge_list()
const {
108 return contributes_to_edge_list_;
115 void each_triangle(std::function<
void (uint32_t, uint32_t, uint32_t)> cb);
125 return signal_material_changed_;
137 std::array<MaterialPtr, MATERIAL_SLOT_MAX> materials_;
139 MeshArrangement arrangement_;
141 std::shared_ptr<IndexData> index_data_;
142 VertexRangeList vertex_ranges_;
144 void _recalc_bounds(
AABB& bounds);
145 void _recalc_bounds_indexed(
AABB& bounds);
146 void _recalc_bounds_ranged(
AABB& bounds);
148 void _each_triangle_indexed(std::function<
void (uint32_t, uint32_t, uint32_t)> cb);
149 void _each_triangle_ranged(std::function<
void (uint32_t, uint32_t, uint32_t)> cb);
153 bool contributes_to_edge_list_ =
true;
160 S_DEFINE_PROPERTY(mesh, &SubMesh::parent_);
161 S_DEFINE_PROPERTY(index_data, &SubMesh::index_data_);