17 |
17 |
18 /* |
18 /* |
19 void makeUnofficial(ModelEditor &editor); |
19 void makeUnofficial(ModelEditor &editor); |
20 */ |
20 */ |
21 |
21 |
|
22 constexpr float circleAngle(int divisions, int i) |
|
23 { |
|
24 constexpr float ofs = 0.5 * pi<>; |
|
25 float factor = -2.0f * pi<> / divisions; |
|
26 return i * factor + ofs; |
|
27 } |
|
28 |
|
29 constexpr glm::vec2 rimpoint(int divisions, int i) |
|
30 { |
|
31 const float angle = circleAngle(divisions, i); |
|
32 return glm::vec2{std::sin(angle), std::cos(angle)}; |
|
33 } |
|
34 |
|
35 template<typename Fn> |
|
36 void circleAngles(int segments, int divisions, Fn&& fn) |
|
37 { |
|
38 for (int i = 0; i < segments; i += 1) |
|
39 { |
|
40 const float a1 = circleAngle(divisions, i - 1); |
|
41 const float a2 = circleAngle(divisions, i); |
|
42 const float a3 = circleAngle(divisions, i + 1); |
|
43 fn(a1, a2, a3); |
|
44 } |
|
45 } |
|
46 |
22 template<typename Fn> |
47 template<typename Fn> |
23 void circle(int segments, int divisions, Fn&& fn) |
48 void circle(int segments, int divisions, Fn&& fn) |
24 { |
49 { |
25 float factor = 2.0f * pi<> / divisions; |
50 circleAngles(segments, divisions, [&fn]( |
26 for (int i = 0; i < segments; i += 1) |
51 const float a1, |
27 { |
52 const float a2, |
|
53 const float a3 |
|
54 ){ |
28 fn( |
55 fn( |
29 glm::vec2{std::sin((i - 1) * factor), std::cos((i - 1) * factor)}, |
56 glm::vec2{std::sin(a1), std::cos(a1)}, |
30 glm::vec2{std::sin(i * factor), std::cos(i * factor)}, |
57 glm::vec2{std::sin(a2), std::cos(a2)}, |
31 glm::vec2{std::sin((i + 1) * factor), std::cos((i - 1) * factor)} |
58 glm::vec2{std::sin(a3), std::cos(a3)} |
32 ); |
59 ); |
33 } |
60 }); |
34 } |
61 } |
35 } |
62 } |
36 |
63 |
37 ModelElement inverted(const ModelElement &element); |
64 ModelElement inverted(const ModelElement &element); |