1 #include "ldrawalgorithm.h" |
1 #include "ldrawalgorithm.h" |
2 #include "linetypes/quadrilateral.h" |
|
3 #include "linetypes/triangle.h" |
|
4 |
2 |
5 void ldraw::invert(ModelEditor& editor, ldraw::id_t id, GetPolygonsContext* context) |
3 std::pair<Triangle, Triangle> splitTriangles( |
|
4 const Quadrilateral& q, |
|
5 ldraw::Diagonal diagonal) |
6 { |
6 { |
7 editor.modifyObject(id, [context](ldraw::Object* object){ |
7 std::pair<Triangle, Triangle> result; |
8 object->invert(context); |
|
9 }); |
|
10 } |
|
11 |
|
12 static std::array<geom::Triangle, 2> splitTriangles(ldraw::Diagonal diagonal, const std::array<glm::vec3, 4>& points) |
|
13 { |
|
14 std::array<geom::Triangle, 2> result; |
|
15 switch (diagonal) |
8 switch (diagonal) |
16 { |
9 { |
17 case ldraw::Diagonal::Diagonal_13: |
10 case ldraw::Diagonal::Diagonal_13: |
18 result = {geom::Triangle{points[0], points[1], points[2]}, {points[0], points[2], points[3]}}; |
11 result = {Triangle{q.p1, q.p2, q.p3}, {q.p1, q.p3, q.p4}}; |
19 break; |
12 break; |
20 case ldraw::Diagonal::Diagonal_24: |
13 case ldraw::Diagonal::Diagonal_24: |
21 result = {geom::Triangle{points[0], points[1], points[3]}, {points[1], points[2], points[3]}}; |
14 result = {Triangle{q.p1, q.p2, q.p3}, {q.p2, q.p3, q.p4}}; |
22 break; |
15 break; |
23 } |
|
24 return result; |
|
25 } |
|
26 |
|
27 auto ldraw::splitQuadrilateral( |
|
28 ModelEditor& editor, |
|
29 ldraw::quadrilateralid_t quadrilateral_id, |
|
30 ldraw::Diagonal splitType |
|
31 ) -> std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> |
|
32 { |
|
33 std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> result; |
|
34 const auto resolved = editor.model().get2(quadrilateral_id); |
|
35 if (resolved.object != nullptr) |
|
36 { |
|
37 const ldraw::Color color = resolved.object->colorIndex; |
|
38 const std::array<geom::Triangle, 2> split = splitTriangles(splitType, resolved.object->points); |
|
39 const int position = resolved.index.row(); |
|
40 editor.remove(position); |
|
41 result = std::make_pair( |
|
42 editor.insert<ldraw::Triangle>(position, split[0].points, color), |
|
43 editor.insert<ldraw::Triangle>(position, split[1].points, color)); |
|
44 } |
16 } |
45 return result; |
17 return result; |
46 } |
18 } |
47 |
19 |
48 /** |
20 /** |
49 * @brief Modifies the !LDRAW_ORG line so that it becomes unofficial |
21 * @brief Modifies the !LDRAW_ORG line so that it becomes unofficial |
50 */ |
22 */ |
|
23 /* |
51 void ldraw::makeUnofficial(ModelEditor& editor) |
24 void ldraw::makeUnofficial(ModelEditor& editor) |
52 { |
25 { |
53 if (editor.model().size() >= 4) |
26 if (editor.model().size() >= 4) |
54 { |
27 { |
55 const ldraw::Object* ldrawOrgLine = editor.model()[3]; |
28 const ldraw::Object* ldrawOrgLine = editor.model()[3]; |
70 editor.setObjectProperty<ldraw::Property::Text>(ldrawOrgLine->id, tokens.join(" ")); |
43 editor.setObjectProperty<ldraw::Property::Text>(ldrawOrgLine->id, tokens.join(" ")); |
71 } |
44 } |
72 } |
45 } |
73 } |
46 } |
74 } |
47 } |
|
48 */ |
|
49 |
|
50 ModelElement inverted(const ModelElement& element) |
|
51 { |
|
52 return std::visit(overloaded{ |
|
53 [](Colored<SubfileReference> ref) -> ModelElement { |
|
54 ref.inverted = not ref.inverted; |
|
55 return ref; |
|
56 }, |
|
57 [](Colored<Triangle> triangle) -> ModelElement { |
|
58 std::swap(triangle.p1, triangle.p2); |
|
59 return triangle; |
|
60 }, |
|
61 [](Colored<Quadrilateral> quad) -> ModelElement { |
|
62 std::swap(quad.p2, quad.p4); |
|
63 return quad; |
|
64 }, |
|
65 [](const ModelElement& x) { return x; } |
|
66 }, element); |
|
67 } |