| 24 #include "../mainwindow.h" |
24 #include "../mainwindow.h" |
| 25 #include "../editHistory.h" |
25 #include "../editHistory.h" |
| 26 #include "../canvas.h" |
26 #include "../canvas.h" |
| 27 #include "../colors.h" |
27 #include "../colors.h" |
| 28 #include "../glcompiler.h" |
28 #include "../glcompiler.h" |
| |
29 #include "../algorithms/invert.h" |
| 29 #include "edgeline.h" |
30 #include "edgeline.h" |
| 30 #include "triangle.h" |
31 #include "triangle.h" |
| 31 #include "quadrilateral.h" |
32 #include "quadrilateral.h" |
| 32 #include "conditionaledge.h" |
33 #include "conditionaledge.h" |
| 33 #include "comment.h" |
34 #include "comment.h" |
| 152 |
153 |
| 153 if (obj->color() == MainColor) |
154 if (obj->color() == MainColor) |
| 154 obj->setColor (parentcolor); |
155 obj->setColor (parentcolor); |
| 155 } |
156 } |
| 156 |
157 |
| |
158 bool shouldInvert(LDSubfileReference* reference, Winding winding, DocumentManager* context) |
| |
159 { |
| |
160 bool result = false; |
| |
161 result ^= (reference->isInverted()); |
| |
162 result ^= (reference->transformationMatrix().determinant() < 0); |
| |
163 result ^= (reference->fileInfo(context)->header.winding != winding); |
| |
164 return result; |
| |
165 } |
| |
166 |
| 157 // ============================================================================= |
167 // ============================================================================= |
| 158 // ----------------------------------------------------------------------------- |
168 // ----------------------------------------------------------------------------- |
| 159 void LDSubfileReference::inlineContents(DocumentManager* context, Model& model, bool deep, bool render) |
169 void LDSubfileReference::inlineContents( |
| 160 { |
170 DocumentManager* context, |
| |
171 Winding parentWinding, |
| |
172 Model& model, |
| |
173 bool deep, |
| |
174 bool render |
| |
175 ) { |
| 161 Model inlined {context}; |
176 Model inlined {context}; |
| 162 fileInfo(context)->inlineContents(inlined, deep, render); |
177 fileInfo(context)->inlineContents(inlined, deep, render); |
| 163 |
178 |
| 164 // Transform the objects |
179 // Transform the objects |
| 165 for (LDObject* object : inlined) |
180 for (LDObject* object : inlined) |
| |
181 { |
| |
182 if (::shouldInvert(this, parentWinding, context)) |
| |
183 ::invert(object, context); |
| |
184 |
| 166 TransformObject(object, transformationMatrix(), position(), color()); |
185 TransformObject(object, transformationMatrix(), position(), color()); |
| |
186 } |
| 167 |
187 |
| 168 model.merge(inlined); |
188 model.merge(inlined); |
| 169 } |
189 } |
| 170 |
190 |
| 171 // ============================================================================= |
191 // ============================================================================= |
| 224 |
244 |
| 225 for (LDPolygon& entry : data) |
245 for (LDPolygon& entry : data) |
| 226 { |
246 { |
| 227 for (int i = 0; i < entry.numVertices(); ++i) |
247 for (int i = 0; i < entry.numVertices(); ++i) |
| 228 entry.vertices[i].transform (transformationMatrix(), position()); |
248 entry.vertices[i].transform (transformationMatrix(), position()); |
| |
249 |
| |
250 if (::shouldInvert(this, parentWinding, context)) |
| |
251 ::invertPolygon(entry); |
| 229 } |
252 } |
| 230 |
253 |
| 231 return data; |
254 return data; |
| 232 } |
255 } |
| 233 else |
256 else |