Wed, 19 Apr 2023 22:51:56 +0300
Made library_role_e an enum class
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 | } |