src/ldrawalgorithm.cpp

changeset 200
ca23936b455b
parent 183
97b591813c8b
child 248
29986dfd1750
equal deleted inserted replaced
199:6988973515d2 200:ca23936b455b
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 }

mercurial