Mon, 19 Mar 2018 10:57:19 +0200
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 | } |