src/triangulate.cpp

Sun, 03 Jul 2022 13:44:11 +0300

author
Teemu Piippo <teemu.s.piippo@gmail.com>
date
Sun, 03 Jul 2022 13:44:11 +0300
changeset 319
9727e545b0bc
child 320
af6633412a6c
permissions
-rw-r--r--

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 }

mercurial