61 Model& Model::EditContext::model() |
61 Model& Model::EditContext::model() |
62 { |
62 { |
63 return this->storedModel; |
63 return this->storedModel; |
64 } |
64 } |
65 |
65 |
66 namespace |
66 static std::array<geom::Triangle, 2> splitTriangles(ldraw::Diagonal diagonal, const glm::vec3(&points)[4]) |
67 { |
67 { |
68 using PropertyTriplet = std::tuple<ldraw::Property, ldraw::Property, ldraw::Property>; |
68 std::array<geom::Triangle, 2> result; |
69 } |
|
70 |
|
71 static std::array<PropertyTriplet, 2> diagonalToPointProperties(ldraw::Diagonal diagonal) |
|
72 { |
|
73 std::array<PropertyTriplet, 2> result; |
|
74 switch (diagonal) |
69 switch (diagonal) |
75 { |
70 { |
76 case ldraw::Diagonal::Diagonal_13: |
71 case ldraw::Diagonal::Diagonal_13: |
77 result = { |
72 result = {geom::Triangle{points[0], points[1], points[2]}, {points[0], points[2], points[3]}}; |
78 std::make_tuple(ldraw::Property::Point1, ldraw::Property::Point2, ldraw::Property::Point3), |
|
79 std::make_tuple(ldraw::Property::Point1, ldraw::Property::Point3, ldraw::Property::Point4) |
|
80 }; |
|
81 break; |
73 break; |
82 case ldraw::Diagonal::Diagonal_24: |
74 case ldraw::Diagonal::Diagonal_24: |
83 result = { |
75 result = {geom::Triangle{points[0], points[1], points[3]}, {points[1], points[2], points[3]}}; |
84 std::make_tuple(ldraw::Property::Point1, ldraw::Property::Point2, ldraw::Property::Point4), |
|
85 std::make_tuple(ldraw::Property::Point2, ldraw::Property::Point3, ldraw::Property::Point4) |
|
86 }; |
|
87 break; |
76 break; |
88 } |
77 } |
89 return result; |
78 return result; |
90 } |
79 } |
91 |
80 |
98 std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> result; |
87 std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> result; |
99 QModelIndex index; |
88 QModelIndex index; |
100 const ldraw::Quadrilateral* quadrilateral = editor.model().get(quadrilateral_id, &index); |
89 const ldraw::Quadrilateral* quadrilateral = editor.model().get(quadrilateral_id, &index); |
101 if (quadrilateral != nullptr) |
90 if (quadrilateral != nullptr) |
102 { |
91 { |
103 Q_ASSERT(index.isValid()); |
92 const ldraw::Color color = quadrilateral->colorIndex; |
104 int position = index.row(); |
93 const std::array<geom::Triangle, 2> split = splitTriangles(splitType, quadrilateral->points); |
|
94 const int position = index.row(); |
105 editor.remove(position); |
95 editor.remove(position); |
106 std::vector<ldraw::triangleid_t> triangles; |
96 result = std::make_pair( |
107 triangles.reserve(2); |
97 editor.insert<ldraw::Triangle>(position, split[0].points, color), |
108 const std::array<PropertyTriplet, 2> split = diagonalToPointProperties(splitType); |
98 editor.insert<ldraw::Triangle>(position, split[1].points, color)); |
109 for (const PropertyTriplet& properties : split) |
|
110 { |
|
111 const ldraw::triangleid_t triangle = editor.insert<ldraw::Triangle>( |
|
112 position, |
|
113 quadrilateral->getProperty(std::get<0>(properties)).value<glm::vec3>(), |
|
114 quadrilateral->getProperty(std::get<1>(properties)).value<glm::vec3>(), |
|
115 quadrilateral->getProperty(std::get<2>(properties)).value<glm::vec3>(), |
|
116 ldraw::Color{quadrilateral->getProperty(ldraw::Property::Color).toInt()}); |
|
117 triangles.push_back(triangle); |
|
118 position += 1; |
|
119 } |
|
120 result = {triangles[0], triangles[1]}; |
|
121 } |
99 } |
122 return result; |
100 return result; |
123 } |
101 } |