Mon, 25 Mar 2013 17:04:18 +0200
Phased out FOREACH macro in favor of C++11-style for iteration.
30
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
1 | /* |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
2 | * LDForge: LDraw parts authoring CAD |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
3 | * Copyright (C) 2013 Santeri `arezey` Piippo |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
4 | * |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
5 | * This program is free software: you can redistribute it and/or modify |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
6 | * it under the terms of the GNU General Public License as published by |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
7 | * the Free Software Foundation, either version 3 of the License, or |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
8 | * (at your option) any later version. |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
9 | * |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
10 | * This program is distributed in the hope that it will be useful, |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
13 | * GNU General Public License for more details. |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
14 | * |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
15 | * You should have received a copy of the GNU General Public License |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
17 | */ |
31ff9aabd506
Licensed LDForge GPL3, added some more icons
Santeri Piippo <crimsondusk64@gmail.com>
parents:
29
diff
changeset
|
18 | |
0 | 19 | #ifndef __LDTYPES_H__ |
20 | #define __LDTYPES_H__ | |
21 | ||
22 | #include "common.h" | |
64
ada4679d5bce
Considerably improved sub-file inlining. Use a matrix class instead of double[9], educated myself on what matrix multiplication actually is and fixed the algorithm up. Aside from I/O problems, 32551.dat is correctly rendered now.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
63
diff
changeset
|
23 | #include "types.h" |
0 | 24 | |
25 | #define IMPLEMENT_LDTYPE(N) \ | |
26 | LD##N (); \ | |
24
d2d4d0154338
added dummy action for future inlining command. Also GCC says that deleting instances of classes with virtual members but no virtual destructors is bad.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
23
diff
changeset
|
27 | virtual ~LD##N (); \ |
0 | 28 | virtual LDObjectType_e getType () const { \ |
29 | return OBJ_##N; \ | |
14
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
30 | } \ |
55
b08f10e668e5
Added clipboard, added delete action
Santeri Piippo <crimsondusk64@gmail.com>
parents:
50
diff
changeset
|
31 | virtual str getContents (); \ |
b08f10e668e5
Added clipboard, added delete action
Santeri Piippo <crimsondusk64@gmail.com>
parents:
50
diff
changeset
|
32 | virtual LD##N* makeClone () { \ |
b08f10e668e5
Added clipboard, added delete action
Santeri Piippo <crimsondusk64@gmail.com>
parents:
50
diff
changeset
|
33 | return new LD##N (*this); \ |
b08f10e668e5
Added clipboard, added delete action
Santeri Piippo <crimsondusk64@gmail.com>
parents:
50
diff
changeset
|
34 | } |
14
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
35 | |
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
36 | class QTreeWidgetItem; |
0 | 37 | |
38 | // ============================================================================= | |
39 | // LDObjectType_e | |
40 | // | |
41 | // Object type codes | |
42 | // ============================================================================= | |
43 | enum LDObjectType_e { | |
25
c74bb88f537d
Deleted scanner.cpp (don't need it), merged model.cpp into io.cpp. Renamed LDForgeWindow to just ForgeWindow since I want the LD* prefix only be given to LDObject derivatives.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
24
diff
changeset
|
44 | OBJ_Unidentified, // Object is an uninitialized (LDObject) (SHOULD NEVER HAPPEN) |
c74bb88f537d
Deleted scanner.cpp (don't need it), merged model.cpp into io.cpp. Renamed LDForgeWindow to just ForgeWindow since I want the LD* prefix only be given to LDObject derivatives.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
24
diff
changeset
|
45 | OBJ_Gibberish, // Object is the result of failed parsing (LDGibberish) |
0 | 46 | OBJ_Empty, // Object represents an empty line (LDEmpty) |
47 | OBJ_Comment, // Object represents a comment (LDComment, code: 0) | |
48 | OBJ_Subfile, // Object represents a sub-file reference (LDSubfile, code: 1) | |
49 | OBJ_Line, // Object represents a line (LDLine, code: 2) | |
50 | OBJ_Triangle, // Object represents a triangle (LDTriangle, code: 3) | |
51 | OBJ_Quad, // Object represents a quadrilateral (LDQuad, code: 4) | |
52 | OBJ_CondLine, // Object represents a conditional line (LDCondLine, code: 5) | |
53 | OBJ_Vertex // Object is a vertex, LDForge extension object (LDVertex) | |
54 | }; | |
55 | ||
56 | // ============================================================================= | |
57 | // LDObject | |
58 | // | |
59 | // Base class object for all LD* types. Each LDObject represents a single line | |
60 | // in the LDraw code file. The virtual method getType returns an enumerator | |
61 | // which is a token of the object's type. The object can be casted into | |
62 | // sub-classes based on this enumerator. | |
63 | // ============================================================================= | |
64 | class LDObject { | |
65 | public: | |
66 | LDObject (); | |
24
d2d4d0154338
added dummy action for future inlining command. Also GCC says that deleting instances of classes with virtual members but no virtual destructors is bad.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
23
diff
changeset
|
67 | virtual ~LDObject (); |
0 | 68 | |
13
3955ff2a7d72
Added logf function to write to message log. Write warnings of unparsable files into the message log.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
11
diff
changeset
|
69 | // Index (i.e. line number) of this object |
66
12aca5d5a51e
Restructured inlining to use a proper caching.. one cache per sub-file reference? What was I thinking? *whacks self with a 55295.dat*
Santeri Piippo <crimsondusk64@gmail.com>
parents:
64
diff
changeset
|
70 | long getIndex (OpenFile* pFile); |
13
3955ff2a7d72
Added logf function to write to message log. Write warnings of unparsable files into the message log.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
11
diff
changeset
|
71 | |
50
7fd213c6b844
Turned the test palette action into a set color action for mass object coloring.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
43
diff
changeset
|
72 | // Color used by this object. Comments, gibberish and empty entries |
7fd213c6b844
Turned the test palette action into a set color action for mass object coloring.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
43
diff
changeset
|
73 | // do not use this field. |
7fd213c6b844
Turned the test palette action into a set color action for mass object coloring.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
43
diff
changeset
|
74 | short dColor; |
7fd213c6b844
Turned the test palette action into a set color action for mass object coloring.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
43
diff
changeset
|
75 | |
13
3955ff2a7d72
Added logf function to write to message log. Write warnings of unparsable files into the message log.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
11
diff
changeset
|
76 | // Type enumerator of this object |
0 | 77 | virtual LDObjectType_e getType () const { |
78 | return OBJ_Unidentified; | |
79 | }; | |
14
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
80 | |
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
81 | // A string that represents this line |
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
82 | virtual str getContents () { |
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
83 | return ""; |
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
84 | } |
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
85 | |
55
b08f10e668e5
Added clipboard, added delete action
Santeri Piippo <crimsondusk64@gmail.com>
parents:
50
diff
changeset
|
86 | virtual LDObject* makeClone () { |
b08f10e668e5
Added clipboard, added delete action
Santeri Piippo <crimsondusk64@gmail.com>
parents:
50
diff
changeset
|
87 | return new LDObject (*this); |
b08f10e668e5
Added clipboard, added delete action
Santeri Piippo <crimsondusk64@gmail.com>
parents:
50
diff
changeset
|
88 | } |
b08f10e668e5
Added clipboard, added delete action
Santeri Piippo <crimsondusk64@gmail.com>
parents:
50
diff
changeset
|
89 | |
14
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
90 | void commonInit (); |
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
91 | |
29
55406ce7446e
Added LDraw path setting dialog
Santeri Piippo <crimsondusk64@gmail.com>
parents:
25
diff
changeset
|
92 | // Replace this LDObject with another LDObject. This method deletes the |
55406ce7446e
Added LDraw path setting dialog
Santeri Piippo <crimsondusk64@gmail.com>
parents:
25
diff
changeset
|
93 | // object and any pointers to it become invalid. |
55406ce7446e
Added LDraw path setting dialog
Santeri Piippo <crimsondusk64@gmail.com>
parents:
25
diff
changeset
|
94 | void replace (LDObject* replacement); |
55406ce7446e
Added LDraw path setting dialog
Santeri Piippo <crimsondusk64@gmail.com>
parents:
25
diff
changeset
|
95 | |
14
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
96 | QTreeWidgetItem* qObjListEntry; |
0 | 97 | }; |
98 | ||
99 | // ============================================================================= | |
100 | // LDGibberish | |
101 | // | |
102 | // Represents a line in the LDraw file that could not be properly parsed. It is | |
103 | // represented by a (!) ERROR in the code view. It exists for the purpose of | |
104 | // allowing garbage lines be debugged and corrected within LDForge. The member | |
105 | // zContent contains the contents of the unparsable line. | |
106 | // ============================================================================= | |
107 | class LDGibberish : public LDObject { | |
108 | public: | |
109 | IMPLEMENT_LDTYPE (Gibberish) | |
110 | ||
11
323390a03294
Color gibberish red. Check for line code length for gibberish (must be 1 to be valid)
Santeri Piippo <crimsondusk64@gmail.com>
parents:
0
diff
changeset
|
111 | LDGibberish (str _zContent, str _zReason); |
323390a03294
Color gibberish red. Check for line code length for gibberish (must be 1 to be valid)
Santeri Piippo <crimsondusk64@gmail.com>
parents:
0
diff
changeset
|
112 | |
0 | 113 | // Content of this unknown line |
14
6d9d8efae2f8
this thing got its own reinterpret_cast now. :P Added SetContents action for altering an object by contents and reinterpreting it.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
13
diff
changeset
|
114 | str zContents; |
11
323390a03294
Color gibberish red. Check for line code length for gibberish (must be 1 to be valid)
Santeri Piippo <crimsondusk64@gmail.com>
parents:
0
diff
changeset
|
115 | |
323390a03294
Color gibberish red. Check for line code length for gibberish (must be 1 to be valid)
Santeri Piippo <crimsondusk64@gmail.com>
parents:
0
diff
changeset
|
116 | // Why is this gibberish? |
323390a03294
Color gibberish red. Check for line code length for gibberish (must be 1 to be valid)
Santeri Piippo <crimsondusk64@gmail.com>
parents:
0
diff
changeset
|
117 | str zReason; |
0 | 118 | }; |
119 | ||
120 | // ============================================================================= | |
121 | // LDEmptyLine | |
122 | // | |
123 | // Represents an empty line in the LDraw code file. | |
124 | // ============================================================================= | |
125 | class LDEmpty : public LDObject { | |
126 | public: | |
127 | IMPLEMENT_LDTYPE (Empty) | |
128 | }; | |
129 | ||
130 | // ============================================================================= | |
131 | // LDComment | |
132 | // | |
133 | // Represents a code-0 comment in the LDraw code file. Member zText contains | |
134 | // the text of the comment. | |
135 | // ============================================================================= | |
136 | class LDComment : public LDObject { | |
137 | public: | |
138 | IMPLEMENT_LDTYPE (Comment) | |
139 | ||
140 | str zText; // The text of this comment | |
141 | }; | |
142 | ||
143 | // ============================================================================= | |
144 | // LDSubfile | |
145 | // | |
146 | // Represents a single code-1 subfile reference. | |
147 | // ============================================================================= | |
148 | class LDSubfile : public LDObject { | |
149 | public: | |
150 | IMPLEMENT_LDTYPE (Subfile) | |
151 | ||
152 | vertex vPosition; // Position of the subpart | |
64
ada4679d5bce
Considerably improved sub-file inlining. Use a matrix class instead of double[9], educated myself on what matrix multiplication actually is and fixed the algorithm up. Aside from I/O problems, 32551.dat is correctly rendered now.
Santeri Piippo <crimsondusk64@gmail.com>
parents:
63
diff
changeset
|
153 | matrix mMatrix; // Transformation matrix for the subpart |
0 | 154 | str zFileName; // Filename of the subpart |
23
69a91c1ff583
begin work on subfile caching
Santeri Piippo <crimsondusk64@gmail.com>
parents:
21
diff
changeset
|
155 | OpenFile* pFile; // Pointer to opened file for this subfile. nullptr if unopened. |
62
915fc477cb6a
Got inlining working. 3002.dat renders properly now! Now just to iron out the bugs and hone the behavior..
Santeri Piippo <crimsondusk64@gmail.com>
parents:
57
diff
changeset
|
156 | |
915fc477cb6a
Got inlining working. 3002.dat renders properly now! Now just to iron out the bugs and hone the behavior..
Santeri Piippo <crimsondusk64@gmail.com>
parents:
57
diff
changeset
|
157 | // Gets the inlined contents of this subfile. |
66
12aca5d5a51e
Restructured inlining to use a proper caching.. one cache per sub-file reference? What was I thinking? *whacks self with a 55295.dat*
Santeri Piippo <crimsondusk64@gmail.com>
parents:
64
diff
changeset
|
158 | std::vector<LDObject*> inlineContents (bool bDeepInline, bool bCache); |
0 | 159 | }; |
160 | ||
161 | // ============================================================================= | |
162 | // LDLine | |
163 | // | |
164 | // Represents a single code-2 line in the LDraw code file. v0 and v1 are the end | |
165 | // points of the line. The line is colored with dColor unless uncolored mode is | |
166 | // set. | |
167 | // ============================================================================= | |
168 | class LDLine : public LDObject { | |
169 | public: | |
170 | IMPLEMENT_LDTYPE (Line) | |
57
6e89589f1fe8
Added polygon bordering function
Santeri Piippo <crimsondusk64@gmail.com>
parents:
55
diff
changeset
|
171 | LDLine (vertex v1, vertex v2); |
0 | 172 | |
173 | vertex vaCoords[2]; // End points of this line | |
174 | }; | |
175 | ||
176 | // ============================================================================= | |
177 | // LDCondLine | |
178 | // | |
179 | // Represents a single code-5 conditional line. The end-points v0 and v1 are | |
180 | // inherited from LDLine, c0 and c1 are the control points of this line. | |
181 | // ============================================================================= | |
182 | class LDCondLine : public LDLine { | |
183 | public: | |
184 | IMPLEMENT_LDTYPE (CondLine) | |
185 | ||
40
215b9f8f0cd7
Added triangle, quad and condline to the add object dialog
Santeri Piippo <crimsondusk64@gmail.com>
parents:
39
diff
changeset
|
186 | vertex vaCoords[4]; // End points + control points of this line |
0 | 187 | }; |
188 | ||
189 | // ============================================================================= | |
190 | // LDTriangle | |
191 | // | |
192 | // Represents a single code-3 triangle in the LDraw code file. Vertices v0, v1 | |
193 | // and v2 contain the end-points of this triangle. dColor is the color the | |
194 | // triangle is colored with. | |
195 | // ============================================================================= | |
196 | class LDTriangle : public LDObject { | |
197 | public: | |
198 | IMPLEMENT_LDTYPE (Triangle) | |
199 | ||
200 | vertex vaCoords[3]; | |
201 | ||
202 | LDTriangle (vertex _v0, vertex _v1, vertex _v2) { | |
203 | vaCoords[0] = _v0; | |
204 | vaCoords[1] = _v1; | |
205 | vaCoords[2] = _v2; | |
206 | } | |
207 | }; | |
208 | ||
209 | // ============================================================================= | |
210 | // LDQuad | |
211 | // | |
212 | // Represents a single code-4 quadrilateral. v0, v1, v2 and v3 are the end points | |
213 | // of the quad, dColor is the color used for the quad. | |
214 | // ============================================================================= | |
215 | class LDQuad : public LDObject { | |
216 | public: | |
217 | IMPLEMENT_LDTYPE (Quad) | |
218 | ||
219 | vertex vaCoords[4]; | |
21
9aebaaafa5da
Added split-quads-to-triangles function
Santeri Piippo <crimsondusk64@gmail.com>
parents:
19
diff
changeset
|
220 | |
9aebaaafa5da
Added split-quads-to-triangles function
Santeri Piippo <crimsondusk64@gmail.com>
parents:
19
diff
changeset
|
221 | // Split this quad into two triangles |
9aebaaafa5da
Added split-quads-to-triangles function
Santeri Piippo <crimsondusk64@gmail.com>
parents:
19
diff
changeset
|
222 | void splitToTriangles (); |
0 | 223 | }; |
224 | ||
225 | // ============================================================================= | |
226 | // LDVertex | |
227 | // | |
228 | // The vertex is another LDForce-specific extension. It represents a single | |
229 | // vertex which can be used as a parameter to tools or to store coordinates | |
230 | // with. Vertices are a part authoring tool and they should not appear in | |
231 | // finished parts. | |
232 | // ============================================================================= | |
233 | class LDVertex : public LDObject { | |
234 | public: | |
235 | IMPLEMENT_LDTYPE (Vertex) | |
236 | ||
237 | vertex vPosition; | |
238 | }; | |
239 | ||
240 | // ============================================================================= | |
241 | // Object type names. Pass the return value of getType as the index to get a | |
242 | // string representation of the object's type. | |
243 | extern const char* g_saObjTypeNames[]; | |
244 | ||
39
110669124caf
Begin work on dialogs for adding objects. Comments functional!
Santeri Piippo <crimsondusk64@gmail.com>
parents:
30
diff
changeset
|
245 | // Icons for these types |
110669124caf
Begin work on dialogs for adding objects. Comments functional!
Santeri Piippo <crimsondusk64@gmail.com>
parents:
30
diff
changeset
|
246 | extern const char* g_saObjTypeIcons[]; |
110669124caf
Begin work on dialogs for adding objects. Comments functional!
Santeri Piippo <crimsondusk64@gmail.com>
parents:
30
diff
changeset
|
247 | |
0 | 248 | #endif |