src/polygoncache.cpp

changeset 318
216f02b50b0a
parent 309
d862721d19a3
child 333
07e65a4c6611
equal deleted inserted replaced
317:852021f38b66 318:216f02b50b0a
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) {

mercurial