src/algorithms/invert.cpp

Mon, 19 Mar 2018 10:57:19 +0200

author
Teemu Piippo <teemu@hecknology.net>
date
Mon, 19 Mar 2018 10:57:19 +0200
changeset 1302
e14d7826373a
parent 1301
4a4e9fb9da76
child 1303
cb9ee14ab4cf
permissions
-rw-r--r--

added license headers

1301
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 /*
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
2 * LDForge: LDraw parts authoring CAD
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
3 * Copyright (C) 2013 - 2017 Teemu Piippo
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
4 *
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
5 * This program is free software: you can redistribute it and/or modify
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
7 * the Free Software Foundation, either version 3 of the License, or
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
8 * (at your option) any later version.
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
9 *
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
13 * GNU General Public License for more details.
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
14 *
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
17 */
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
18
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19 #include "../linetypes/modelobject.h"
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
20 #include "../lddocument.h"
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
21
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
22 /*
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
23 * Returns whether or not the document is flat.
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
24 * If it is flat, the result is stored in *axis.
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
25 */
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
26 bool isflat(Model* model, Axis* axis)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
27 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
28 QVector<Axis> axisSet = {X, Y, Z};
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
29
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
30 for (LDObject* subfileObject : model->objects())
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
31 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
32 for (int i = 0; i < subfileObject->numVertices(); ++i)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
33 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
34 Vertex const& v_i = subfileObject->vertex(i);
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
35
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
36 if (not qFuzzyCompare(v_i.x(), 0.f))
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
37 axisSet.removeOne(X);
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
38
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
39 if (not qFuzzyCompare(v_i.y(), 0.f))
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
40 axisSet.removeOne(Y);
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
41
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
42 if (not qFuzzyCompare(v_i.z(), 0.f))
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
43 axisSet.removeOne(Z);
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
44 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
45
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
46 if (axisSet.isEmpty())
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
47 break;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
48 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
49
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
50 if (axisSet.size() == 1)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
51 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
52 *axis = axisSet[0];
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
53 return true;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
54 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
55 else
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
56 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
57 return false;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
58 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
59 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
60
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
61 /*
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
62 * Returns a matrix that causes a flip on the given axis.
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63 */
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
64 Matrix flipmatrix(Axis axis)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
65 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
66 Matrix result = Matrix::identity;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
67
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
68 switch (axis)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
69 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
70 case X:
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
71 result(0, 0) = -1;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
72 break;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
73
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
74 case Y:
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
75 result(1, 1) = -1;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
76 break;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
77
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
78 case Z:
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
79 result(2, 2) = -1;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
80 break;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
81 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
82
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
83 return result;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
84 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
85
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
86 /*
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
87 * Inverts an LDObject so that its winding is changed.
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
88 */
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
89 void invert(LDObject* obj, DocumentManager* context)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
90 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
91 if (obj->numPolygonVertices() > 0)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
92 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
93 QVector<Vertex> vertices;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
94
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
95 for (int i = 0; i < obj->numPolygonVertices(); i += 1)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
96 vertices.append(obj->vertex(i));
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
97
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
98 for (int i = 0; i < vertices.size(); i += 1)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
99 obj->setVertex(i, vertices[vertices.size() - 1 - i]);
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
100 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
101 else if (obj->type() == LDObjectType::SubfileReference)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
102 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
103 // Check whether subfile is flat. If it is, flip it on the axis on which it is flat.
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
104 Model model {context};
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
105 LDSubfileReference* reference = static_cast<LDSubfileReference*>(obj);
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
106 reference->fileInfo(context)->inlineContents(model, true, false);
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
107 Axis flatAxis;
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
108
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
109 if (isflat(&model, &flatAxis))
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
110 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
111 reference->setTransformationMatrix(
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
112 reference->transformationMatrix() * flipmatrix(flatAxis)
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
113 );
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
114 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
115 else
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
116 {
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
117 // Subfile is not flat. Resort to invertnext.
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
118 reference->setInverted(not reference->isInverted());
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
119 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
120 }
4a4e9fb9da76 moved inverting code into a new file
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
121 }

mercurial