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
7
#include "
parametric_shape.hpp
"
8
9
namespace
generator
10
{
11
15
template
<
int
D>
16
class
bezier_shape_t
17
{
18
private
:
19
static_assert
(D > 1,
"D must be > 1."
);
20
21
using
impl_t
=
parametric_shape_t
;
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
},
56
segments
}
57
{
58
}
59
60
public
:
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
76
using
vertices_t
=
typename
impl_t::vertices_t
;
77
78
vertices_t
vertices
() const noexcept
79
{
80
return
parametric_shape_.
vertices
();
81
}
82
};
83
}
// namespace generator
84
85
#endif
generator::bezier_shape_t
Definition
bezier_shape.hpp:17
generator::bezier_shape_t::edges_t
typename impl_t::edges_t edges_t
Definition
bezier_shape.hpp:69
generator::bezier_shape_t::edges
edges_t edges() const noexcept
Definition
bezier_shape.hpp:71
generator::bezier_shape_t::vertices
vertices_t vertices() const noexcept
Definition
bezier_shape.hpp:78
generator::bezier_shape_t::bezier_shape_t
bezier_shape_t(const gml::dvec2(&p)[D], int segments=16)
Definition
bezier_shape.hpp:63
generator::bezier_shape_t::vertices_t
typename impl_t::vertices_t vertices_t
Definition
bezier_shape.hpp:76
generator::parametric_shape_t::edges_t
Definition
parametric_shape.hpp:17
generator::parametric_shape_t::vertices_t
Definition
parametric_shape.hpp:34
generator::parametric_shape_t
A shape with values evaluated using a callback function.
Definition
parametric_shape.hpp:14
generator::parametric_shape_t::edges
edges_t edges() const noexcept
Definition
parametric_shape.cpp:62
generator::parametric_shape_t::vertices
vertices_t vertices() const noexcept
Definition
parametric_shape.cpp:67
generator::shape_vertex_t
Definition
shape_vertex.hpp:12
generator::shape_vertex_t::tex_coord
double tex_coord
Definition
shape_vertex.hpp:20
generator::shape_vertex_t::tangent
gml::dvec2 tangent
Definition
shape_vertex.hpp:18
generator::shape_vertex_t::position
gml::dvec2 position
Definition
shape_vertex.hpp:14
generator
Definition
any_generator.hpp:7
gml::bezierDerivative
glm::tvec2< T > bezierDerivative(const glm::tvec2< T >(&p)[D], T t)
Definition
math.hpp:317
gml::bezier
glm::tvec2< T > bezier(const glm::tvec2< T >(&p)[D], T t)
Definition
math.hpp:243
parametric_shape.hpp
segments
const segment_list * segments
Definition
text_component.cpp:442
UnravelEngine
UnravelEngine
engine
engine
rendering
generator
bezier_shape.hpp
Generated by
1.12.0