src/primitives.cpp

Tue, 30 Jul 2013 07:38:08 +0300

author
Santeri Piippo <crimsondusk64@gmail.com>
date
Tue, 30 Jul 2013 07:38:08 +0300
changeset 402
ec95fc95e5f3
parent 398
7f278b48079a
child 407
c6530cdcd622
permissions
-rw-r--r--

Renamed vector to List, changed it to wrap around std::deque.

297
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
1 /*
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
2 * LDForge: LDraw parts authoring CAD
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
3 * Copyright (C) 2013 Santeri Piippo
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
4 *
297
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
5 * This program is free software: you can redistribute it and/or modify
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
6 * it under the terms of the GNU General Public License as published by
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
7 * the Free Software Foundation, either version 3 of the License, or
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
8 * (at your option) any later version.
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
9 *
297
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
10 * This program is distributed in the hope that it will be useful,
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
13 * GNU General Public License for more details.
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
14 *
297
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
15 * You should have received a copy of the GNU General Public License
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
17 */
2cbd8ac8293b Added license header to primitives.cpp
Santeri Piippo <crimsondusk64@gmail.com>
parents: 294
diff changeset
18
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
19 #include <QDir>
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
20 #include <QThread>
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
21 #include <QRegExp>
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
22 #include <QFileDialog>
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
23 #include "file.h"
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
24 #include "gui.h"
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
25 #include "primitives.h"
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
26 #include "ui_makeprim.h"
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
27 #include "misc.h"
381
241f65769a57 restructure; removed g_BBox
Santeri Piippo <crimsondusk64@gmail.com>
parents: 377
diff changeset
28 #include "colors.h"
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29
402
ec95fc95e5f3 Renamed vector to List, changed it to wrap around std::deque.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 398
diff changeset
30 List<PrimitiveCategory> g_PrimitiveCategories;
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
31 static PrimitiveLister* g_activePrimLister = null;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
32 static bool g_primListerMutex = false;
402
ec95fc95e5f3 Renamed vector to List, changed it to wrap around std::deque.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 398
diff changeset
33 List<Primitive> g_primitives;
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
34
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
35 static const str g_Other = QObject::tr ("Other");
321
48e429bfd58c Apply tr() for possible future translations
Santeri Piippo <crimsondusk64@gmail.com>
parents: 319
diff changeset
36
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
37 static void populateCategories();
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
38 static void loadPrimitiveCatgories();
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
39
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
40 // =============================================================================
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
41 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
42 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
43 void loadPrimitives() {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
44 print ("Loading primitives...\n");
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
45 loadPrimitiveCatgories();
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
46
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
47 // Try to load prims.cfg
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
48 File conf (config::dirpath() + "prims.cfg", File::Read);
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
49
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
50 if (!conf) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
51 // No prims.cfg, build it
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
52 PrimitiveLister::start();
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
53 } else {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
54 // Read primitives from prims.cfg
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
55 for (str line : conf) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
56 int space = line.indexOf (" ");
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
57
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
58 if (space == -1)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
59 continue;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
60
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
61 Primitive info;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
62 info.name = line.left (space);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
63 info.title = line.mid (space + 1);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
64 g_primitives << info;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
65 }
306
fef00a6cbff0 minor improvements to primitive handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 297
diff changeset
66
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
67 populateCategories();
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
68 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
69 }
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
71 // =============================================================================
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
72 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
73 // =============================================================================
402
ec95fc95e5f3 Renamed vector to List, changed it to wrap around std::deque.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 398
diff changeset
74 static void recursiveGetFilenames (QDir dir, List<str>& fnames) {
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
75 QFileInfoList flist = dir.entryInfoList();
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
76
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
77 for (const QFileInfo & info : flist) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
78 if (info.fileName() == "." || info.fileName() == "..")
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
79 continue; // skip . and ..
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
80
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
81 if (info.isDir())
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
82 recursiveGetFilenames (QDir (info.absoluteFilePath()), fnames);
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
83 else
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
84 fnames << info.absoluteFilePath();
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
85 }
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
86 }
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
87
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
88 // =============================================================================
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
89 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
90 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
91 void PrimitiveLister::work() {
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
92 g_activePrimLister = this;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
93 m_prims.clear();
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
94
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
95 QDir dir (LDPaths::prims());
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
96 ulong baselen = dir.absolutePath().length();
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
97 ulong i = 0;
402
ec95fc95e5f3 Renamed vector to List, changed it to wrap around std::deque.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 398
diff changeset
98 List<str> fnames;
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
99
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
100 assert (dir.exists());
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
101 recursiveGetFilenames (dir, fnames);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
102 emit starting (fnames.size());
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
103
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
104 for (str fname : fnames) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
105 File f (fname, File::Read);
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
106
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
107 Primitive info;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
108 info.name = fname.mid (baselen + 1); // make full path relative
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
109 info.name.replace ('/', '\\'); // use DOS backslashes, they're expected
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
110 info.cat = null;
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
111
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
112 if (!f.readLine (info.title))
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
113 info.title = "";
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
114
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
115 info.title = info.title.simplified();
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
116
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
117 if (info.title[0] == '0') {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
118 info.title.remove (0, 1); // remove 0
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
119 info.title = info.title.simplified();
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
120 }
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
121
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
122 m_prims << info;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
123 emit update (++i);
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
124 }
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
126 // Save to a config file
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
127 File conf (config::dirpath() + "prims.cfg", File::Write);
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
128
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
129 for (Primitive & info : m_prims)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
130 fprint (conf, "%1 %2\n", info.name, info.title);
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
131
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
132 conf.close();
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
133
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
134 g_primListerMutex = true;
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
135 g_primitives = m_prims;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
136 populateCategories();
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
137 g_primListerMutex = false;
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138 g_activePrimLister = null;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
139 emit workDone();
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
140 }
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
141
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
142 // =============================================================================
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
143 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
144 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
145 void PrimitiveLister::start() {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
146 if (g_activePrimLister)
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
147 return;
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
148
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
149 PrimitiveLister* lister = new PrimitiveLister;
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
150 QThread* listerThread = new QThread;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
151 lister->moveToThread (listerThread);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
152 connect (lister, SIGNAL (starting (ulong)), g_win, SLOT (primitiveLoaderStart (ulong)));
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
153 connect (lister, SIGNAL (update (ulong)), g_win, SLOT (primitiveLoaderUpdate (ulong)));
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
154 connect (lister, SIGNAL (workDone()), g_win, SLOT (primitiveLoaderEnd()));
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
155 connect (listerThread, SIGNAL (started()), lister, SLOT (work()));
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
156 connect (listerThread, SIGNAL (finished()), lister, SLOT (deleteLater()));
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
157 listerThread->start();
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
158 }
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
159
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
160 static PrimitiveCategory* findCategory (str name) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
161 for (PrimitiveCategory& cat : g_PrimitiveCategories)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
162 if (cat.name() == name)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
163 return &cat;
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
164
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
165 return null;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
166 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
167
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
168 // =============================================================================
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
169 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
170 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
171 static void populateCategories() {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
172 for (PrimitiveCategory& cat : g_PrimitiveCategories)
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
173 cat.prims.clear();
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
174
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
175 PrimitiveCategory* unmatched = findCategory (g_Other);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
176
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
177 if (!unmatched) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
178 // Shouldn't happen.. but catch it anyway.
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
179 PrimitiveCategory cat;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
180 cat.setName (g_Other);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
181 unmatched = & (g_PrimitiveCategories << cat);
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
182 }
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
183
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
184 for (Primitive& prim : g_primitives) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
185 bool matched = false;
402
ec95fc95e5f3 Renamed vector to List, changed it to wrap around std::deque.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 398
diff changeset
186 prim.cat = null;
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
187
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
188 // Go over the categories and their regexes, if and when there's a match,
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
189 // the primitive's category is set to the category the regex beloings to.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
190 for (PrimitiveCategory& cat : g_PrimitiveCategories) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
191 for (PrimitiveCategory::RegexEntry& entry : cat.regexes) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
192 switch (entry.type) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
193 case PrimitiveCategory::Filename:
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
194 // f-regex, check against filename
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
195 matched = entry.regex.exactMatch (prim.name);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
196 break;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
197
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
198 case PrimitiveCategory::Title:
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
199 // t-regex, check against title
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
200 matched = entry.regex.exactMatch (prim.title);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
201 break;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
202 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
203
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
204 if (matched) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
205 prim.cat = &cat;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
206 break;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
207 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
208 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
209
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
210 // Drop out if a category was decided on.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
211 if (prim.cat)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
212 break;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
213 }
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
214
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
215 // If there was a match, add the primitive to the category.
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
216 // Otherwise, add it to the list of unmatched primitives.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
217 if (prim.cat)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
218 prim.cat->prims << prim;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
219 else
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
220 unmatched->prims << prim;
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
221 }
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
222 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
223
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
224 // =============================================================================
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
225 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
226 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
227 static void loadPrimitiveCatgories() {
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
228 g_PrimitiveCategories.clear();
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
229 File f (config::dirpath() + "primregexps.cfg", File::Read);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
230
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
231 if (!f)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
232 f.open (":/data/primitive-categories.cfg", File::Read);
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
233
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
234 if (!f)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
235 critical (QObject::tr ("Failed to open primitive categories!"));
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
236
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
237 if (f) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
238 PrimitiveCategory cat;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
239
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
240 for (str line : f) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
241 int colon;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
242
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
243 if (line.length() == 0 || line[0] == '#')
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
244 continue;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
245
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
246 if ((colon = line.indexOf (":")) == -1) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
247 if (cat.regexes.size() > 0)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
248 g_PrimitiveCategories << cat;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
249
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
250 cat.regexes.clear();
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
251 cat.prims.clear();
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
252 cat.setName (line);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
253 } else {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
254 str cmd = line.left (colon);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
255 PrimitiveCategory::Type type = PrimitiveCategory::Filename;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
256
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
257 if (cmd == "f")
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
258 type = PrimitiveCategory::Filename;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
259 elif (cmd == "t")
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
260 type = PrimitiveCategory::Title;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
261 else
294
2892deee4c1b Better categorized Technic primitives
Santeri Piippo <crimsondusk64@gmail.com>
parents: 293
diff changeset
262 continue;
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
263
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
264 QRegExp regex (line.mid (colon + 1));
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
265 PrimitiveCategory::RegexEntry entry = { regex, type };
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
266 cat.regexes << entry;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
267 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
268 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
269
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
270 if (cat.regexes.size() > 0)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
271 g_PrimitiveCategories << cat;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
272 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
273
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
274 // Add a category for unmatched primitives
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
275 PrimitiveCategory cat;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
276 cat.setName (g_Other);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
277 g_PrimitiveCategories << cat;
306
fef00a6cbff0 minor improvements to primitive handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 297
diff changeset
278 }
fef00a6cbff0 minor improvements to primitive handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 297
diff changeset
279
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
280 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
281 bool primitiveLoaderBusy() {
306
fef00a6cbff0 minor improvements to primitive handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 297
diff changeset
282 return g_primListerMutex;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
283 }
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
284
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
285 // =============================================================================
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
286 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
287 // =============================================================================
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
288 static double radialPoint (int i, int divs, double (*func) (double)) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
289 return (*func) ( (i * 2 * pi) / divs);
363
75583c9f289d primitive generator: add conditional lines to cylinders; improved bad color handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 358
diff changeset
290 }
75583c9f289d primitive generator: add conditional lines to cylinders; improved bad color handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 358
diff changeset
291
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
292 // =============================================================================
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
293 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
294 // =============================================================================
402
ec95fc95e5f3 Renamed vector to List, changed it to wrap around std::deque.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 398
diff changeset
295 List<LDObject*> makePrimitive (PrimitiveType type, int segs, int divs, int num) {
ec95fc95e5f3 Renamed vector to List, changed it to wrap around std::deque.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 398
diff changeset
296 List<LDObject*> objs;
ec95fc95e5f3 Renamed vector to List, changed it to wrap around std::deque.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 398
diff changeset
297 List<int> condLineSegs;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
298
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
299 for (int i = 0; i < segs; ++i) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
300 double x0 = radialPoint (i, divs, cos),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
301 x1 = radialPoint (i + 1, divs, cos),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
302 z0 = radialPoint (i, divs, sin),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
303 z1 = radialPoint (i + 1, divs, sin);
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
304
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
305 switch (type) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
306 case Circle: {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
307 vertex v0 (x0, 0.0f, z0),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
308 v1 (x1, 0.0f, z1);
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
309
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
310 LDLineObject* line = new LDLineObject;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
311 line->setVertex (0, v0);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
312 line->setVertex (1, v1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
313 line->setColor (edgecolor);
363
75583c9f289d primitive generator: add conditional lines to cylinders; improved bad color handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 358
diff changeset
314 objs << line;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
315 }
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
316 break;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
317
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
318 case Cylinder:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
319 case Ring:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
320 case Cone:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
321 {
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
322 double x2, x3, z2, z3;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
323 double y0, y1, y2, y3;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
324
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
325 if (type == Cylinder) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
326 x2 = x1;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
327 x3 = x0;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
328 z2 = z1;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
329 z3 = z0;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
330
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
331 y0 = y1 = 0.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
332 y2 = y3 = 1.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
333 } else {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
334 x2 = x1 * (num + 1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
335 x3 = x0 * (num + 1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
336 z2 = z1 * (num + 1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
337 z3 = z0 * (num + 1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
338
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
339 x0 *= num;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
340 x1 *= num;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
341 z0 *= num;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
342 z1 *= num;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
343
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
344 if (type == Ring)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
345 y0 = y1 = y2 = y3 = 0.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
346 else {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
347 y0 = y1 = 1.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
348 y2 = y3 = 0.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
349 }
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
350 }
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
351
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
352 vertex v0 (x0, y0, z0),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
353 v1 (x1, y1, z1),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
354 v2 (x2, y2, z2),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
355 v3 (x3, y3, z3);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
356
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
357 LDQuadObject* quad = new LDQuadObject;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
358 quad->setColor (maincolor);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
359 quad->setVertex (0, v0);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
360 quad->setVertex (1, v1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
361 quad->setVertex (2, v2);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
362 quad->setVertex (3, v3);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
363
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
364 if (type == Cylinder)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
365 quad->invert();
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
366
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
367 objs << quad;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
368
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
369 if (type == Cylinder || type == Cone)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
370 condLineSegs << i;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
371 }
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
372 break;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
373
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
374 case Disc:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
375 case DiscNeg:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
376 {
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
377 double x2, z2;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
378
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
379 if (type == Disc)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
380 x2 = z2 = 0.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
381 else {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
382 x2 = (x0 >= 0.0f) ? 1.0f : -1.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
383 z2 = (z0 >= 0.0f) ? 1.0f : -1.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
384 }
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
385
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
386 vertex v0 (x0, 0.0f, z0),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
387 v1 (x1, 0.0f, z1),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
388 v2 (x2, 0.0f, z2);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
389
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
390 // Disc negatives need to go the other way around, otherwise
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
391 // they'll end up upside-down.
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
392 LDTriangleObject* seg = new LDTriangleObject;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
393 seg->setColor (maincolor);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
394 seg->setVertex (type == Disc ? 0 : 2, v0);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
395 seg->setVertex (1, v1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
396 seg->setVertex (type == Disc ? 2 : 0, v2);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
397 objs << seg;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
398 }
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
399 break;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
400
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
401 default:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
402 break;
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
403 }
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
404 }
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
405
365
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
406 // If this is not a full circle, we need a conditional line at the other
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
407 // end, too.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
408 if (segs < divs && condLineSegs.size() != 0)
365
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
409 condLineSegs << segs;
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
410
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
411 for (int i : condLineSegs) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
412 vertex v0 (radialPoint (i, divs, cos), 0.0f, radialPoint (i, divs, sin)),
365
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
413 v1,
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
414 v2 (radialPoint (i + 1, divs, cos), 0.0f, radialPoint (i + 1, divs, sin)),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
415 v3 (radialPoint (i - 1, divs, cos), 0.0f, radialPoint (i - 1, divs, sin));
365
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
416
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
417 if (type == Cylinder)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
418 v1 = vertex (v0[X], 1.0f, v0[Z]);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
419 elif (type == Cone) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
420 v1 = vertex (v0[X] * (num + 1), 0.0f, v0[Z] * (num + 1));
365
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
421 v0[X] *= num;
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
422 v0[Y] = 1.0f;
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
423 v0[Z] *= num;
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
424 }
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
425
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
426 LDCondLineObject* line = new LDCondLineObject;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
427 line->setColor (edgecolor);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
428 line->setVertex (0, v0);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
429 line->setVertex (1, v1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
430 line->setVertex (2, v2);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
431 line->setVertex (3, v3);
365
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
432 objs << line;
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
433 }
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
434
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
435 return objs;
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
436 }
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
437
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
438 // =============================================================================
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
439 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
440 // =============================================================================
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
441 static str primitiveTypeName (PrimitiveType type) {
321
48e429bfd58c Apply tr() for possible future translations
Santeri Piippo <crimsondusk64@gmail.com>
parents: 319
diff changeset
442 // Not translated as primitives are in English.
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
443 return type == Circle ? "Circle" :
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
444 type == Cylinder ? "Cylinder" :
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
445 type == Disc ? "Disc" :
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
446 type == DiscNeg ? "Disc Negative" :
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
447 type == Ring ? "Ring" : "Cone";
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
448 }
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
449
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
450 static const str g_radialNameRoots[] = {
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
451 "edge",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
452 "cyli",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
453 "disc",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
454 "ndis",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
455 "ring",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
456 "con"
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
457 };
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
458
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
459 // =============================================================================
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
460 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
461 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
462 str radialFileName (PrimitiveType type, int segs, int divs, int num) {
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
463 short numer = segs,
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
464 denom = divs;
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
465
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
466 // Simplify the fractional part, but the denominator must be at least 4.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
467 simplify (numer, denom);
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
468
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
469 if (denom < 4) {
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
470 const short factor = 4 / denom;
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
471
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
472 numer *= factor;
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
473 denom *= factor;
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
474 }
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
475
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
476 // Compose some general information: prefix, fraction, root, ring number
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
477 str prefix = (divs == lores) ? "" : fmt ("%1/", divs);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
478 str frac = fmt ("%1-%2", numer, denom);
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
479 str root = g_radialNameRoots[type];
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
480 str numstr = (type == Ring || type == Cone) ? fmt ("%1", num) : "";
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
481
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
482 // Truncate the root if necessary (7-16rin4.dat for instance).
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
483 // However, always keep the root at least 2 characters.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
484 int extra = (frac.length() + numstr.length() + root.length()) - 8;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
485 root.chop (min<short> (max<short> (extra, 0), 2));
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
486
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
487 // Stick them all together and return the result.
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
488 return prefix + frac + root + numstr + ".dat";
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
489 }
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
490
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
491 // =============================================================================
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
492 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
493 // =============================================================================
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
494 void generatePrimitive() {
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
495 QDialog* dlg = new QDialog (g_win);
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
496 Ui::MakePrimUI ui;
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
497 ui.setupUi (dlg);
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
498
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
499 if (!dlg->exec())
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
500 return;
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
501
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
502 int segs = ui.sb_segs->value();
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
503 int divs = ui.cb_hires->isChecked() ? hires : lores;
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
504 int num = ui.sb_ringnum->value();
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
505 PrimitiveType type =
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
506 ui.rb_circle->isChecked() ? Circle :
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
507 ui.rb_cylinder->isChecked() ? Cylinder :
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
508 ui.rb_disc->isChecked() ? Disc :
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
509 ui.rb_ndisc->isChecked() ? DiscNeg :
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
510 ui.rb_ring->isChecked() ? Ring : Cone;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
511
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
512 // Make the description
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
513 str frac = ftoa ( ( (float) segs) / divs);
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
514 str name = radialFileName (type, segs, divs, num);
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
515 str descr;
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
516
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
517 // Ensure that there's decimals, even if they're 0.
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
518 if (frac.indexOf (".") == -1)
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
519 frac += ".0";
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
520
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
521 if (type == Ring || type == Cone)
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
522 descr = fmt ("%1 %2 x %3", primitiveTypeName (type), num, frac);
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
523 else
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
524 descr = fmt ("%1 %2", primitiveTypeName (type), frac);
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
525
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
526 LDOpenFile* f = new LDOpenFile;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
527 f->setName (QFileDialog::getSaveFileName (null, QObject::tr ("Save Primitive"), name));
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
528
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
529 *f << new LDCommentObject (descr);
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
530 *f << new LDCommentObject (fmt ("Name: %1", name));
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
531 *f << new LDCommentObject (fmt ("Author: LDForge"));
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
532 *f << new LDCommentObject (fmt ("!LDRAW_ORG Unofficial_%1Primitive", divs == hires ? "48_" : ""));
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
533 *f << new LDCommentObject (CALicense);
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
534 *f << new LDEmptyObject;
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
535 *f << new LDBFCObject (LDBFCObject::CertifyCCW);
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
536 *f << new LDEmptyObject;
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
537 *f << makePrimitive (type, segs, divs, num);
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
538
377
271d1da66b7e Appended 'Object' to the names of all LDObject derivatives so even though the LD prefix isn't reserved for just LDObjects anymore, these classes remain distinct
Santeri Piippo <crimsondusk64@gmail.com>
parents: 365
diff changeset
539 g_win->save (f, false);
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
540 delete f;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
541 }

mercurial