src/modeleditcontext.cpp

changeset 77
028798a72591
parent 76
7c4a63a02632
child 86
4bec0525ef1b
equal deleted inserted replaced
76:7c4a63a02632 77:028798a72591
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 }

mercurial