9 { |
9 { |
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 primitiveOrigin = xform({0, 0}, 0); |
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){ |
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(origin, xform(p1, 0), xform(p2, 0))); |
26 fn(triangle(primitiveOrigin, xform(p1, 0), xform(p2, 0))); |
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){ |