10 std::vector<ModelElement> result; |
10 std::vector<ModelElement> result; |
11 const auto xform = [&circ](const glm::vec2& p, float y){ |
11 const auto xform = [&circ](const glm::vec2& p, float y){ |
12 return glm::vec3{circ.transformation * glm::vec4{p.x, y, p.y, 1}}; |
12 return glm::vec3{circ.transformation * glm::vec4{p.x, y, p.y, 1}}; |
13 }; |
13 }; |
14 const glm::vec3 origin = xform({0, 0}, 0); |
14 const glm::vec3 origin = xform({0, 0}, 0); |
|
15 const bool invertedMatrix = (glm::determinant(circ.transformation) < 0) != circ.inverted; |
15 switch(circ.type) { |
16 switch(circ.type) { |
16 case CircularPrimitive::Circle: |
17 case CircularPrimitive::Circle: |
17 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
18 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
18 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
19 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
19 fn(edge(xform(p1, 0), xform(p2, 0))); |
20 fn(edge(xform(p1, 0), xform(p2, 0))); |
26 }); |
27 }); |
27 break; |
28 break; |
28 case CircularPrimitive::Cylinder: |
29 case CircularPrimitive::Cylinder: |
29 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
30 ldraw::circle(circ.fraction.segments, circ.fraction.divisions, [&] |
30 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
31 (const glm::vec2&, const glm::vec2& p1, const glm::vec2& p2){ |
31 fn(quadrilateral(xform(p1, 1), xform(p2, 1), xform(p2, 0), xform(p1, 0))); |
32 Colored<Quadrilateral> quad = quadrilateral(xform(p1, 1), xform(p2, 1), xform(p2, 0), xform(p1, 0)); |
|
33 if (invertedMatrix) { |
|
34 std::swap(quad.p2, quad.p4); |
|
35 } |
|
36 fn(quad); |
32 }); |
37 }); |
33 break; |
38 break; |
34 case CircularPrimitive::CylinderOpen: |
39 case CircularPrimitive::CylinderOpen: |
35 rasterize(CircularPrimitive{ |
40 rasterize(CircularPrimitive{ |
36 .type = CircularPrimitive::Cylinder, |
41 .type = CircularPrimitive::Cylinder, |