Unravel Engine C++ Reference
Loading...
Searching...
No Matches
transform_mesh.hpp
Go to the documentation of this file.
1#ifndef GENERATOR_TRANSLATOR_HPP
2#define GENERATOR_TRANSLATOR_HPP
3
4#include <functional>
5
6#include "mesh_vertex.hpp"
7#include "utils.hpp"
8
9namespace generator
10{
11
13template<typename mesh_t>
15{
16private:
17 using impl_t = mesh_t;
18 impl_t mesh_;
19
20public:
22 {
23 public:
25 {
26 auto vertex = vertices_.generate();
27 mesh_->mutate_(vertex);
28 return vertex;
29 }
30
31 bool done() const noexcept
32 {
33 return vertices_.done();
34 }
35
36 void next()
37 {
38 vertices_.next();
39 }
40
41 private:
42 const transform_mesh_t* mesh_;
43
44 typename vertex_generator_type<mesh_t>::type vertices_;
45
46 explicit vertices_t(const transform_mesh_t& mesh) : mesh_{&mesh}, vertices_{mesh.mesh_.vertices()}
47 {
48 }
49
50 friend class transform_mesh_t;
51 };
52
55 explicit transform_mesh_t(mesh_t mesh, const std::function<void(mesh_vertex_t&)>& mutate)
56 : mesh_{std::move(mesh)}
57 , mutate_{std::move(mutate)}
58 {
59 }
60
61 using triangles_t = typename impl_t::triangles_t;
62
63 triangles_t triangles() const noexcept
64 {
65 return mesh_.triangles();
66 }
67
68 vertices_t vertices() const noexcept
69 {
70 return vertices_t{*this};
71 }
72
73private:
74 std::function<void(mesh_vertex_t&)> mutate_;
75};
76
77template<typename mesh_t>
78transform_mesh_t<mesh_t> transform_mesh(mesh_t mesh, std::function<void(mesh_vertex_t&)> mutate)
79{
80 return transform_mesh_t<mesh_t>{std::move(mesh), std::move(mutate)};
81}
82} // namespace generator
83
84#endif
Apply a mutator function to each vertex.
vertices_t vertices() const noexcept
typename impl_t::triangles_t triangles_t
transform_mesh_t(mesh_t mesh, const std::function< void(mesh_vertex_t &)> &mutate)
triangles_t triangles() const noexcept
transform_mesh_t< mesh_t > transform_mesh(mesh_t mesh, std::function< void(mesh_vertex_t &)> mutate)