Thu, 15 Jun 2023 16:18:03 +0300
Refactor, make selecting elements from the model select the corresponding line from the editor as well
264
76a025db4948
Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
250
diff
changeset
|
1 | #include "src/circularprimitive.h" |
76a025db4948
Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
250
diff
changeset
|
2 | #include "src/documentmanager.h" |
76a025db4948
Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
250
diff
changeset
|
3 | #include "src/invert.h" |
76a025db4948
Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
250
diff
changeset
|
4 | #include "src/polygoncache.h" |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
5 | #include "src/parser.h" |
150
b6cbba6e29a1
extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
6 | |
338 | 7 | QTextDocument* resolve(const QString& name, const ModelId callingModelId, DocumentManager* documents) |
200 | 8 | { |
9 | return documents->findDependencyByName(callingModelId, name); | |
10 | } | |
11 | ||
210
232e7634cc8a
more refactoring, dosn't build yet
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
205
diff
changeset
|
12 | static PolygonElement transformed( |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
13 | PolygonElement coloredElement, |
210
232e7634cc8a
more refactoring, dosn't build yet
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
205
diff
changeset
|
14 | const glm::mat4& transform) |
200 | 15 | { |
211 | 16 | visitPoints([&transform](glm::vec3& p) { |
210
232e7634cc8a
more refactoring, dosn't build yet
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
205
diff
changeset
|
17 | p = transform * glm::vec4{p, 1}; |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
18 | }, coloredElement.element); |
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
19 | return coloredElement; |
210
232e7634cc8a
more refactoring, dosn't build yet
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
205
diff
changeset
|
20 | } |
232e7634cc8a
more refactoring, dosn't build yet
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
205
diff
changeset
|
21 | |
338 | 22 | PolygonCache* findPolygonCacheForModel(QTextDocument* model, DocumentManager* context) |
211 | 23 | { |
24 | std::optional<ModelId> modelId = context->findIdForModel(model); | |
25 | if (modelId.has_value()) { | |
26 | return context->getPolygonCacheForModel(modelId.value()); | |
27 | } | |
28 | else { | |
29 | return nullptr; | |
30 | } | |
31 | } | |
32 | ||
318
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
33 | constexpr bool n_xor(bool a) |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
34 | { |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
35 | return a; |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
36 | } |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
37 | |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
38 | template<typename... Args> |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
39 | constexpr bool n_xor(bool a, Args&&... rest) |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
40 | { |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
41 | return a xor n_xor(rest...); |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
42 | } |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
43 | |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
44 | namespace { |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
45 | struct GetPolygonsContext |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
46 | { |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
47 | bool invertnext = false; |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
48 | ModelId modelId; |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
49 | class DocumentManager* documents; |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
50 | }; |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
51 | } |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
52 | |
318
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
53 | template<typename Fn, typename Fn2> |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
54 | static void inlineSubfileReference( |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
55 | const PolygonCache::vector_type& polygons, |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
56 | const Colored<SubfileReference>& ref, |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
57 | GetPolygonsContext* context, |
318
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
58 | Fn&& add, |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
59 | Fn2&& reserve) |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
60 | { |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
61 | const bool needInverting = 0 |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
62 | ^ (glm::determinant(ref.element.transformation) < 0) |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
63 | ^ (context->invertnext); |
318
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
64 | reserve(polygons.size()); |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
65 | for (const PolygonElement& cacheElement : polygons) { |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
66 | PolygonElement polygon = transformed(cacheElement, ref.element.transformation); |
318
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
67 | if (needInverting) { |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
68 | gl::invert(polygon.element); |
318
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
69 | } |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
70 | if (polygon.color == MAIN_COLOR) { |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
71 | polygon.color = ref.color; |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
72 | } |
358
ef90ed0a5720
Hopefully fixed all problems with determining polygon winding
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
338
diff
changeset
|
73 | add(1, polygon); |
318
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
74 | } |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
75 | } |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
76 | |
338 | 77 | static QTextDocument* findDependency(const SubfileReference& ref, GetPolygonsContext* context) |
318
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
78 | { |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
79 | return context->documents->findDependencyByName(context->modelId, ref.name); |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
80 | } |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
81 | |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
82 | template<typename Fn, typename Fn2> |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
83 | static void collectPolygons( |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
84 | const ParsedLine& element, |
372
b2914aaeec1a
Winding is now an enum class winding_e
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
358
diff
changeset
|
85 | winding_e& winding, |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
86 | GetPolygonsContext* context, |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
87 | Fn&& add, |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
88 | Fn2&& reserve) |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
89 | { |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
90 | bool foundinvertnext = false; |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
91 | std::visit<void>(overloaded{ |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
92 | [&](const LineType0& line0) { |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
93 | const QString text = line0.value.text.simplified(); |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
94 | if (text == QStringLiteral("BFC INVERTNEXT")) { |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
95 | context->invertnext = true; |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
96 | foundinvertnext = true; |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
97 | } |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
98 | else if (text == QStringLiteral("BFC CERTIFY CW")) { |
372
b2914aaeec1a
Winding is now an enum class winding_e
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
358
diff
changeset
|
99 | winding = winding_e::clockwise; |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
100 | } |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
101 | else if (text == QStringLiteral("BFC CERTIFY CCW")) { |
372
b2914aaeec1a
Winding is now an enum class winding_e
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
358
diff
changeset
|
102 | winding = winding_e::anticlockwise; |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
103 | } |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
104 | else if (text == QStringLiteral("BFC NOCERTIFY")) { |
372
b2914aaeec1a
Winding is now an enum class winding_e
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
358
diff
changeset
|
105 | winding = winding_e::none; |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
106 | } |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
107 | }, |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
108 | [&](const LineType2& line2) { |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
109 | add(2, {line2.value.element, line2.value.color}); |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
110 | }, |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
111 | [&](const LineType3& line3) { |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
112 | add(3, {line3.value.element, line3.value.color}); |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
113 | }, |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
114 | [&](const LineType4& line4) { |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
115 | add(4, {line4.value.element, line4.value.color}); |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
116 | }, |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
117 | [&](const LineType5& line5) { |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
118 | add(5, {line5.value.element, line5.value.color}); |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
119 | }, |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
120 | [&add, context, &reserve](const LineType1& line1) { |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
121 | QTextDocument* const dependency = findDependency(line1.value.element, context); |
318
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
122 | if (PolygonCache* cache = (dependency != nullptr) |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
123 | ? findPolygonCacheForModel(dependency, context->documents) |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
124 | : nullptr |
216f02b50b0a
Reduce indent level
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
309
diff
changeset
|
125 | ) { |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
126 | recacheIfNeeded(cache, dependency, context->documents); |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
127 | inlineSubfileReference(cache->polygons, line1.value, context, add, reserve); |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
128 | } |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
129 | }, |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
130 | #if 0 |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
131 | [&add](const Colored<CircularPrimitive>& circ) { |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
132 | rasterize(circ, [&](const PlainPolygonElement& polygon, ColorIndex color){ |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
133 | if (color == MAIN_COLOR) { |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
134 | color = circ.color; |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
135 | } |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
136 | add(PolygonElement{polygon, color}); |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
137 | }); |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
138 | }, |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
139 | #endif |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
140 | }, element); |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
141 | if (not foundinvertnext) { |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
142 | context->invertnext = false; |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
143 | } |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
144 | } |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
145 | |
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
146 | static std::vector<WithId<PolygonElement>> inlinePolygons( |
338 | 147 | const QTextDocument* model, |
210
232e7634cc8a
more refactoring, dosn't build yet
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
205
diff
changeset
|
148 | GetPolygonsContext* context) |
232e7634cc8a
more refactoring, dosn't build yet
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
205
diff
changeset
|
149 | { |
372
b2914aaeec1a
Winding is now an enum class winding_e
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
358
diff
changeset
|
150 | winding_e winding = winding_e::none; |
210
232e7634cc8a
more refactoring, dosn't build yet
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
205
diff
changeset
|
151 | std::vector<WithId<PolygonElement>> result; |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
152 | int i = 0; |
358
ef90ed0a5720
Hopefully fixed all problems with determining polygon winding
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
338
diff
changeset
|
153 | const auto add = [&result, &winding, &i](int lineno, const PolygonElement& poly){ |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
154 | result.push_back({poly, i}); |
372
b2914aaeec1a
Winding is now an enum class winding_e
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
358
diff
changeset
|
155 | if (lineno != 1 and winding == winding_e::clockwise) { |
374
75efc3ba5a56
More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
372
diff
changeset
|
156 | gl::invert(result.back().element); |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
157 | } |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
158 | }; |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
159 | const auto reserve = [&result](std::size_t incomingsize){ |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
160 | reserveMore(result, incomingsize); |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
161 | }; |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
162 | for (const QString& line : model->toPlainText().split("\n")) { |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
163 | const opt<ParsedLine> parsedline = parse(line); |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
164 | if (parsedline.has_value()) { |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
165 | collectPolygons(*parsedline, winding, context, add, reserve); |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
166 | } |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
167 | ++i; |
200 | 168 | } |
169 | return result; | |
170 | } | |
150
b6cbba6e29a1
extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
171 | |
338 | 172 | void recacheIfNeeded(PolygonCache *cache, QTextDocument *model, DocumentManager *documents) |
150
b6cbba6e29a1
extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
173 | { |
193 | 174 | if (cache->needRecache) |
150
b6cbba6e29a1
extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
175 | { |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
176 | cache->polygons.clear(); |
193 | 177 | const std::optional<ModelId> modelId = documents->findIdForModel(model); |
150
b6cbba6e29a1
extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
178 | if (modelId.has_value()) |
b6cbba6e29a1
extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
179 | { |
333
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
180 | GetPolygonsContext context{ |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
181 | .invertnext = false, |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
182 | .modelId = *modelId, |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
183 | .documents = documents, |
07e65a4c6611
Experiment to delete the Model class and rely solely on text documents
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
318
diff
changeset
|
184 | }; |
305
d891da20abca
Add support for BFC CERTIFY statements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
185 | cache->polygons = inlinePolygons(model, &context); |
150
b6cbba6e29a1
extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
186 | } |
193 | 187 | cache->needRecache = false; |
150
b6cbba6e29a1
extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
188 | } |
b6cbba6e29a1
extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
189 | } |