27 else { |
27 else { |
28 return nullptr; |
28 return nullptr; |
29 } |
29 } |
30 } |
30 } |
31 |
31 |
|
32 constexpr bool n_xor(bool a) |
|
33 { |
|
34 return a; |
|
35 } |
|
36 |
|
37 template<typename... Args> |
|
38 constexpr bool n_xor(bool a, Args&&... rest) |
|
39 { |
|
40 return a xor n_xor(rest...); |
|
41 } |
|
42 |
|
43 template<typename Fn, typename Fn2> |
|
44 static void inlineSubfileReference( |
|
45 const PolygonCache::vector_type& polygons, |
|
46 const Colored<SubfileReference>& ref, |
|
47 Fn&& add, |
|
48 Fn2&& reserve) |
|
49 { |
|
50 const bool needInverting = 0 |
|
51 ^ (glm::determinant(ref.transformation) < 0) |
|
52 ^ (ref.inverted); |
|
53 reserve(polygons.size()); |
|
54 for (const PolygonElement& cacheElement : polygons) { |
|
55 PolygonElement polygon = transformed(cacheElement, ref.transformation); |
|
56 if (needInverting) { |
|
57 gl::invert(polygon); |
|
58 } |
|
59 if (polygon.color == MAIN_COLOR) { |
|
60 polygon.color = ref.color; |
|
61 } |
|
62 add(polygon); |
|
63 } |
|
64 } |
|
65 |
|
66 Model* findDependency(const SubfileReference& ref, GetPolygonsContext* context) |
|
67 { |
|
68 return context->documents->findDependencyByName(context->modelId, ref.name); |
|
69 } |
|
70 |
32 template<typename Fn, typename Fn2> |
71 template<typename Fn, typename Fn2> |
33 static void collectPolygons( |
72 static void collectPolygons( |
34 const ModelElement& element, |
73 const ModelElement& element, |
35 Winding& winding, |
74 Winding& winding, |
36 GetPolygonsContext* context, |
75 GetPolygonsContext* context, |
49 }, |
88 }, |
50 [&](const Colored<ConditionalEdge>& cedge) { |
89 [&](const Colored<ConditionalEdge>& cedge) { |
51 add({cedge, cedge.color}); |
90 add({cedge, cedge.color}); |
52 }, |
91 }, |
53 [&add, context, &reserve](const Colored<SubfileReference>& ref) { |
92 [&add, context, &reserve](const Colored<SubfileReference>& ref) { |
54 Model* dependency = context->documents->findDependencyByName(context->modelId, ref.name); |
93 Model* const dependency = findDependency(ref, context); |
55 PolygonCache* cache = nullptr; |
94 if (PolygonCache* cache = (dependency != nullptr) |
56 if (dependency != nullptr) { |
95 ? findPolygonCacheForModel(dependency, context->documents) |
57 cache = findPolygonCacheForModel(dependency, context->documents); |
96 : nullptr |
58 } |
97 ) { |
59 if (cache != nullptr) { |
|
60 const bool needInverting = glm::determinant(ref.transformation) < 0; |
|
61 recacheIfNeeded(cache, dependency, context->documents); |
98 recacheIfNeeded(cache, dependency, context->documents); |
62 reserve(cache->polygons.size()); |
99 inlineSubfileReference(cache->polygons, ref, add, reserve); |
63 for (const PolygonElement& cacheElement : cache->polygons) { |
|
64 PolygonElement polygon = transformed(cacheElement, ref.transformation); |
|
65 if (needInverting != ref.inverted) { |
|
66 gl::invert(polygon); |
|
67 } |
|
68 if (polygon.color == MAIN_COLOR) { |
|
69 polygon.color = ref.color; |
|
70 } |
|
71 add(polygon); |
|
72 } |
|
73 } |
100 } |
74 }, |
101 }, |
75 [&add](const Colored<CircularPrimitive>& circ) { |
102 [&add](const Colored<CircularPrimitive>& circ) { |
76 rasterize(circ, [&](const PlainPolygonElement& polygon, ColorIndex color){ |
103 rasterize(circ, [&](const PlainPolygonElement& polygon, ColorIndex color){ |
77 if (color == MAIN_COLOR) { |
104 if (color == MAIN_COLOR) { |