Sun, 03 Jul 2022 13:44:11 +0300
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
319
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
1 | #include "src/triangulate.h" |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
2 | #include "thirdparty/earcut.h" |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
3 | #include "src/invert.h" |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
4 | |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
5 | // Make mapbox::earcut work with glm::vec3 |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
6 | template<> struct mapbox::util::nth<0, glm::vec3> |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
7 | { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
8 | static constexpr float get(const glm::vec3& t) { return t.x; } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
9 | }; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
10 | |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
11 | template<> struct mapbox::util::nth<1, glm::vec3> |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
12 | { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
13 | static constexpr float get(const glm::vec3& t) { return t.y; } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
14 | }; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
15 | |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
16 | using indextype = std::uint16_t; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
17 | using indexpair = std::pair<indextype, indextype>; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
18 | struct boundaryinfo |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
19 | { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
20 | indextype third; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
21 | std::size_t triangleid; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
22 | }; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
23 | using boundarymap_t = std::map<indexpair, boundaryinfo>; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
24 | |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
25 | struct MergedTriangles |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
26 | { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
27 | std::vector<Quadrilateral> quadrilaterals; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
28 | std::set<std::size_t> cutTriangles; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
29 | }; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
30 | |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
31 | static bool findQuadsToMerge( |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
32 | const boundarymap_t& boundaries, |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
33 | auto&& iscut, |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
34 | auto&& addMergedQuad |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
35 | ) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
36 | bool foundQuads = false; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
37 | // Go through triangle boundaries |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
38 | for (boundarymap_t::const_iterator it1 = boundaries.begin(); it1 != boundaries.end(); ++it1) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
39 | const indexpair& pair1 = it1->first; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
40 | const boundaryinfo& boundary1 = it1->second; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
41 | // .. the ones we haven't already been merged... |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
42 | if (not iscut(boundary1.triangleid)) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
43 | // Look for its inverse boundary to find the touching triangle |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
44 | const indexpair inverse_boundary_key = std::make_pair(pair1.second, pair1.first); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
45 | const boundarymap_t::const_iterator it2 = boundaries.find(inverse_boundary_key); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
46 | // Also if that hasn't been cut |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
47 | if (it2 != boundaries.end() and not iscut(it2->second.triangleid)) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
48 | // Continue until no more new quads are found |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
49 | foundQuads |= addMergedQuad(it1, it2); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
50 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
51 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
52 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
53 | return foundQuads; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
54 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
55 | |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
56 | static MergedTriangles mergeTriangles( |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
57 | const std::vector<std::uint16_t>& indices, |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
58 | std::vector<glm::vec3>::const_iterator polyBegin) |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
59 | { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
60 | MergedTriangles result; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
61 | const auto iscut = [&result](const std::size_t i){ |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
62 | return result.cutTriangles.find(i) != result.cutTriangles.end(); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
63 | }; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
64 | const auto addMergedQuad = [&result, polyBegin]( |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
65 | boundarymap_t::const_iterator it1, |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
66 | boundarymap_t::const_iterator it2 |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
67 | ) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
68 | const indexpair& common_indices = it1->first; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
69 | const boundaryinfo& boundary_1 = it1->second; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
70 | const boundaryinfo& boundary_2 = it2->second; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
71 | const Quadrilateral quad{ |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
72 | *(polyBegin + common_indices.first), |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
73 | *(polyBegin + boundary_2.third), |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
74 | *(polyBegin + common_indices.second), |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
75 | *(polyBegin + boundary_1.third), |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
76 | }; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
77 | if (isConvex(quad)) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
78 | result.quadrilaterals.push_back(quad); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
79 | result.cutTriangles.insert(boundary_1.triangleid); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
80 | result.cutTriangles.insert(boundary_2.triangleid); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
81 | return true; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
82 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
83 | else { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
84 | return false; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
85 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
86 | }; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
87 | boundarymap_t boundaries; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
88 | for (std::size_t i = 0; i < indices.size(); i += 3) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
89 | const auto add = [&](const std::size_t o1, const std::size_t o2, const std::size_t o3){ |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
90 | const auto key = std::make_pair(indices[i + o1], indices[i + o2]); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
91 | boundaries[key] = {indices[i + o3], i}; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
92 | }; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
93 | add(0, 1, 2); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
94 | add(1, 2, 0); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
95 | add(2, 0, 1); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
96 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
97 | bool repeat = true; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
98 | while (repeat) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
99 | repeat = findQuadsToMerge(boundaries, iscut, addMergedQuad); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
100 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
101 | return result; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
102 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
103 | |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
104 | std::vector<PlainPolygonElement> polygonize( |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
105 | std::vector<glm::vec3>::const_iterator begin, |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
106 | std::vector<glm::vec3>::const_iterator end, |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
107 | const glm::mat4& planeMatrix) |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
108 | { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
109 | std::vector<PlainPolygonElement> result; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
110 | const glm::mat4 inverseGrid = glm::inverse(planeMatrix); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
111 | // mapbox::earcut will always produce a CCW polygon, so if we're drawing |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
112 | // a CW polygon, we should invert the result afterwards |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
113 | const float shouldInvert = glm::dot( |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
114 | glm::vec3{inverseGrid[2]}, |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
115 | glm::cross(*begin - *(begin + 1), *(begin + 2) - *(begin + 1))); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
116 | std::vector<std::vector<glm::vec3>> polygons{1}; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
117 | std::vector<glm::vec3>& polygon2d = polygons.back(); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
118 | polygon2d.reserve(static_cast<std::size_t>(end - begin)); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
119 | for (std::vector<glm::vec3>::const_iterator it = begin; it != end; ++it) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
120 | polygon2d.push_back(inverseGrid * glm::vec4{*it, 1}); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
121 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
122 | const std::vector<indextype> indices = mapbox::earcut<std::uint16_t>(polygons); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
123 | MergedTriangles mergedTriangles = mergeTriangles(indices, begin); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
124 | for (Quadrilateral& quad : mergedTriangles.quadrilaterals) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
125 | if (shouldInvert < 0) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
126 | invert(quad); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
127 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
128 | result.push_back(quad); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
129 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
130 | for (std::size_t i = 0; i < indices.size(); i += 3) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
131 | if (mergedTriangles.cutTriangles.find(i) == mergedTriangles.cutTriangles.end()) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
132 | Triangle tri = triangle( |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
133 | *(begin + indices[i]), |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
134 | *(begin + indices[i + 1]), |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
135 | *(begin + indices[i + 2])); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
136 | if (shouldInvert < 0) { |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
137 | invert(tri); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
138 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
139 | result.push_back(tri); |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
140 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
141 | } |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
142 | return result; |
9727e545b0bc
Extract the triangulation and triangle merging code into a new source file and clean it up somewhat
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff
changeset
|
143 | } |