src/circularprimitive.h

changeset 247
07ad61423c3c
parent 232
8efa3a33172e
child 250
2837b549e616
equal deleted inserted replaced
246:86a35ce38773 247:07ad61423c3c
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,

mercurial