Unravel Engine C++ Reference
Loading...
Searching...
No Matches
bezier_shape.hpp
Go to the documentation of this file.
1#ifndef GENERATOR_BEZIER_SHAPE_HPP
2#define GENERATOR_BEZIER_SHAPE_HPP
3
4#include <algorithm>
5#include <limits>
6
8
9namespace generator
10{
11
15template<int D>
17{
18private:
19 static_assert(D > 1, "D must be > 1.");
20
22 impl_t parametric_shape_;
23
24 struct array_wrapper
25 {
26 gml::dvec2 data[D];
27
28 explicit array_wrapper(const gml::dvec2 (&p)[D])
29 {
30 std::copy(&p[0], &p[0] + D, &data[0]);
31 }
32 };
33
34 explicit bezier_shape_t(const array_wrapper& p, int segments)
35 : parametric_shape_{[p](double t)
36 {
37 shape_vertex_t vertex;
38
39 vertex.position = gml::bezier(p.data, t);
40
41 vertex.tangent = gml::bezierDerivative<1>(p.data, t);
42
43 // If tangent is zero try again near by.
44 const double e = std::numeric_limits<double>::epsilon();
45 if(gml::dot(vertex.tangent, vertex.tangent) < e)
46 {
47 vertex.tangent = gml::bezierDerivative<1>(p.data, t + 10.0 * e);
48 }
49
50 vertex.tangent = gml::normalize(vertex.tangent);
51
52 vertex.tex_coord = t;
53
54 return vertex;
55 },
57 {
58 }
59
60public:
63 explicit bezier_shape_t(const gml::dvec2 (&p)[D], int segments = 16)
64 : // Work around a msvc lambda capture bug by wrapping the array.
65 bezier_shape_t{array_wrapper{p}, segments}
66 {
67 }
68
69 using edges_t = typename impl_t::edges_t;
70
71 edges_t edges() const noexcept
72 {
73 return parametric_shape_.edges();
74 }
75
77
78 vertices_t vertices() const noexcept
79 {
80 return parametric_shape_.vertices();
81 }
82};
83} // namespace generator
84
85#endif
typename impl_t::edges_t edges_t
edges_t edges() const noexcept
vertices_t vertices() const noexcept
bezier_shape_t(const gml::dvec2(&p)[D], int segments=16)
typename impl_t::vertices_t vertices_t
A shape with values evaluated using a callback function.
edges_t edges() const noexcept
vertices_t vertices() const noexcept
glm::tvec2< T > bezierDerivative(const glm::tvec2< T >(&p)[D], T t)
Definition math.hpp:317
glm::tvec2< T > bezier(const glm::tvec2< T >(&p)[D], T t)
Definition math.hpp:243
const segment_list * segments