15 const bool invertedMatrix = (glm::determinant(circ.transformation) < 0) != circ.inverted; |
15 const bool invertedMatrix = (glm::determinant(circ.transformation) < 0) != circ.inverted; |
16 switch(circ.type) { |
16 switch(circ.type) { |
17 case CircularPrimitive::Circle: |
17 case CircularPrimitive::Circle: |
18 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
18 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
19 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
19 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
20 fn(edge(xform(p1, 0), xform(p2, 0))); |
20 fn(LineSegment{xform(p1, 0), xform(p2, 0)}, EDGE_COLOR); |
21 }); |
21 }); |
22 break; |
22 break; |
23 case CircularPrimitive::Disc: |
23 case CircularPrimitive::Disc: |
24 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
24 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
25 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
25 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
26 fn(triangle(primitiveOrigin, xform(p1, 0), xform(p2, 0))); |
26 fn(Triangle{primitiveOrigin, xform(p1, 0), xform(p2, 0)}, MAIN_COLOR); |
27 }); |
27 }); |
28 break; |
28 break; |
29 case CircularPrimitive::Cylinder: |
29 case CircularPrimitive::Cylinder: |
30 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
30 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
31 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
31 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
32 Colored<Quadrilateral> quad = quadrilateral(xform(p1, 1), xform(p2, 1), xform(p2, 0), xform(p1, 0)); |
32 Quadrilateral quad{xform(p1, 1), xform(p2, 1), xform(p2, 0), xform(p1, 0)}; |
33 if (invertedMatrix) { |
33 if (invertedMatrix) { |
34 std::swap(quad.p2, quad.p4); |
34 std::swap(quad.p2, quad.p4); |
35 } |
35 } |
36 fn(quad); |
36 fn(quad, MAIN_COLOR); |
37 }); |
37 }); |
38 break; |
38 break; |
39 case CircularPrimitive::CylinderOpen: |
39 case CircularPrimitive::CylinderOpen: |
40 rasterize(CircularPrimitive{ |
40 rasterize(CircularPrimitive{ |
41 .type = CircularPrimitive::Cylinder, |
41 .type = CircularPrimitive::Cylinder, |
75 {-1, +1}, |
75 {-1, +1}, |
76 {-1, -1}, |
76 {-1, -1}, |
77 {+1, -1}, |
77 {+1, -1}, |
78 }; |
78 }; |
79 const glm::vec2& corner = corners[i * 4 / circ.fraction.divisions]; |
79 const glm::vec2& corner = corners[i * 4 / circ.fraction.divisions]; |
80 fn(triangle(xform(p2, 0), xform(p1, 0), xform(corner, 0))); |
80 fn(Triangle{xform(p2, 0), xform(p1, 0), xform(corner, 0)}, MAIN_COLOR); |
81 ++i; |
81 ++i; |
82 }); |
82 }); |
83 } |
83 } |
84 break; |
84 break; |
85 case CircularPrimitive::Chord: |
85 case CircularPrimitive::Chord: |
86 for (unsigned int i = 1; i < circ.fraction.segments; ++i) { |
86 for (unsigned int i = 1; i < circ.fraction.segments; ++i) { |
87 const glm::vec2& p1 = ldraw::rimpoint(circ.fraction.divisions, i); |
87 const glm::vec2& p1 = ldraw::rimpoint(circ.fraction.divisions, i); |
88 const glm::vec2& p2 = ldraw::rimpoint(circ.fraction.divisions, i + 1); |
88 const glm::vec2& p2 = ldraw::rimpoint(circ.fraction.divisions, i + 1); |
89 fn(triangle(xform(p2, 0), xform(p1, 0), xform({1, 0}, 0))); |
89 fn(Triangle{xform(p2, 0), xform(p1, 0), xform({1, 0}, 0)}, MAIN_COLOR); |
90 } |
90 } |
91 break; |
91 break; |
92 } |
92 } |
93 } |
93 } |