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;
75 return vertex_range_count() ? &vertex_ranges_[0] :
nullptr;
78 std::size_t vertex_range_count()
const {
79 return vertex_ranges_.size();
82 void remove_all_vertex_ranges();
84 void set_material(
const MaterialPtr &material);
85 void set_material_at_slot(MaterialSlot var,
const MaterialPtr& material);
87 const MaterialPtr& material()
const;
88 const MaterialPtr& material_at_slot(MaterialSlot var,
bool fallback=
false)
const;
90 MeshArrangement arrangement()
const {
return arrangement_; }
92 bool reverse_winding();
98 void set_diffuse(
const Color &color);
104 void set_contributes_to_edge_list(
bool v=
true) {
105 contributes_to_edge_list_ = v;
108 bool contributes_to_edge_list()
const {
109 return contributes_to_edge_list_;
116 void each_triangle(std::function<
void (uint32_t, uint32_t, uint32_t)> cb);
126 return signal_material_changed_;
138 std::array<MaterialPtr, MATERIAL_SLOT_MAX> materials_;
140 MeshArrangement arrangement_;
142 std::shared_ptr<IndexData> index_data_;
143 VertexRangeList vertex_ranges_;
145 void _recalc_bounds(
AABB& bounds);
146 void _recalc_bounds_indexed(
AABB& bounds);
147 void _recalc_bounds_ranged(
AABB& bounds);
149 void _each_triangle_indexed(std::function<
void (uint32_t, uint32_t, uint32_t)> cb);
150 void _each_triangle_ranged(std::function<
void (uint32_t, uint32_t, uint32_t)> cb);
154 bool contributes_to_edge_list_ =
true;
161 S_DEFINE_PROPERTY(mesh, &SubMesh::parent_);
162 S_DEFINE_PROPERTY(index_data, &SubMesh::index_data_);