Tue, 28 Sep 2021 23:07:23 +0300
Use QSaveFile to save the file more safely
127
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
1 | #include <QHBoxLayout> |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
2 | #include "model.h" |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
3 | #include "modeleditcontext.h" |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
4 | #include "linetypes/object.h" |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
5 | #include "transformtool.h" |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
6 | |
143
7b62c52835a1
Fix memory corruption involving document tools.
Teemu Piippo <teemu@hecknology.net>
parents:
127
diff
changeset
|
7 | TransformTool::TransformTool(Model* model, QWidget* parent) : |
127
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
8 | BaseTool{model, parent}, |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
9 | model{model}, |
143
7b62c52835a1
Fix memory corruption involving document tools.
Teemu Piippo <teemu@hecknology.net>
parents:
127
diff
changeset
|
10 | matrixEditor{new MatrixEditor{parent}}, |
7b62c52835a1
Fix memory corruption involving document tools.
Teemu Piippo <teemu@hecknology.net>
parents:
127
diff
changeset
|
11 | button{new QPushButton{"Apply", parent}}, |
7b62c52835a1
Fix memory corruption involving document tools.
Teemu Piippo <teemu@hecknology.net>
parents:
127
diff
changeset
|
12 | widget{new QWidget{parent}} |
127
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
13 | { |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
14 | widget->setLayout(new QHBoxLayout{widget}); |
143
7b62c52835a1
Fix memory corruption involving document tools.
Teemu Piippo <teemu@hecknology.net>
parents:
127
diff
changeset
|
15 | widget->layout()->addWidget(this->matrixEditor); |
127
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
16 | widget->layout()->addWidget(button); |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
17 | connect(button, &QPushButton::clicked, this, &TransformTool::applyButtonClicked); |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
18 | } |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
19 | |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
20 | QString TransformTool::name() const |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
21 | { |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
22 | return "Transform"; |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
23 | } |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
24 | |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
25 | QString TransformTool::toolTip() const |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
26 | { |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
27 | return "Transforms the selection using a matrix"; |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
28 | } |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
29 | |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
30 | void TransformTool::selectionChanged(const QSet<ldraw::id_t> &newSelection) |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
31 | { |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
32 | this->selection = newSelection; |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
33 | } |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
34 | |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
35 | QWidget* TransformTool::toolWidget() |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
36 | { |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
37 | return this->widget; |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
38 | } |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
39 | |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
40 | void TransformTool::applyButtonClicked() |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
41 | { |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
42 | Model::EditContext editcontext = this->model->edit(); |
143
7b62c52835a1
Fix memory corruption involving document tools.
Teemu Piippo <teemu@hecknology.net>
parents:
127
diff
changeset
|
43 | const glm::mat4 matrix = this->matrixEditor->value(); |
127
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
44 | for (ldraw::id_t id : this->selection) |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
45 | { |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
46 | const ldraw::Object* object = model->get(id); |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
47 | for (int i = 0; i < object->numPoints(); i += 1) |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
48 | { |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
49 | const ldraw::Property property = ldraw::pointProperty(i); |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
50 | const glm::vec3& vec = matrix * glm::vec4{object->getPoint(i), 1}; |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
51 | editcontext.setObjectProperty(id, property, QVariant::fromValue(vec)); |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
52 | } |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
53 | QVariant transformMatrix = object->getProperty(ldraw::Property::Transformation); |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
54 | if (not transformMatrix.isNull()) |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
55 | { |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
56 | editcontext.setObjectProperty( |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
57 | id, |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
58 | ldraw::Property::Transformation, |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
59 | QVariant::fromValue(matrix * transformMatrix.value<glm::mat4>()) |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
60 | ); |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
61 | } |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
62 | } |
f64bfb7f5d26
added a simple matrix transformation tool
Teemu Piippo <teemu@hecknology.net>
parents:
diff
changeset
|
63 | } |