src/primitives.cpp

Thu, 18 Jul 2013 13:13:26 +0300

author
Santeri Piippo <crimsondusk64@gmail.com>
date
Thu, 18 Jul 2013 13:13:26 +0300
changeset 399
13d24c6eb423
parent 398
7f278b48079a
child 402
ec95fc95e5f3
permissions
-rw-r--r--

stuff

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
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
30 vector<PrimitiveCategory> g_PrimitiveCategories;
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;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
33 vector<Primitive> g_primitives;
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 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
74 static void recursiveGetFilenames (QDir dir, vector<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;
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
98 vector<str> fnames;
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;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
186
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
187 // 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
188 // 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
189 for (PrimitiveCategory& cat : g_PrimitiveCategories) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
190 for (PrimitiveCategory::RegexEntry& entry : cat.regexes) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
191 switch (entry.type) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
192 case PrimitiveCategory::Filename:
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
193 // f-regex, check against filename
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
194 matched = entry.regex.exactMatch (prim.name);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
195 break;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
196
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
197 case PrimitiveCategory::Title:
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
198 // t-regex, check against title
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
199 matched = entry.regex.exactMatch (prim.title);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
200 break;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
201 }
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
202
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
203 if (matched) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
204 prim.cat = &cat;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
205 break;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
206 }
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 // Drop out if a category was decided on.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
210 if (prim.cat)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
211 break;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
212 }
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
213
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
214 // 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
215 // Otherwise, add it to the list of unmatched primitives.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
216 if (prim.cat)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
217 prim.cat->prims << prim;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
218 else
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
219 unmatched->prims << prim;
292
4779ca562d5e Moved primitive handling to new code files
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
220 }
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
221 }
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 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
226 static void loadPrimitiveCatgories() {
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
227 g_PrimitiveCategories.clear();
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
228 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
229
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
230 if (!f)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
231 f.open (":/data/primitive-categories.cfg", File::Read);
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
232
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
233 if (!f)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
234 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
235
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
236 if (f) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
237 PrimitiveCategory cat;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
238
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
239 for (str line : f) {
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
240 int colon;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
241
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
242 if (line.length() == 0 || line[0] == '#')
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
243 continue;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
244
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
245 if ((colon = line.indexOf (":")) == -1) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
246 if (cat.regexes.size() > 0)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
247 g_PrimitiveCategories << cat;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
248
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
249 cat.regexes.clear();
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
250 cat.prims.clear();
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
251 cat.setName (line);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
252 } else {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
253 str cmd = line.left (colon);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
254 PrimitiveCategory::Type type = PrimitiveCategory::Filename;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
255
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
256 if (cmd == "f")
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
257 type = PrimitiveCategory::Filename;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
258 elif (cmd == "t")
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
259 type = PrimitiveCategory::Title;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
260 else
294
2892deee4c1b Better categorized Technic primitives
Santeri Piippo <crimsondusk64@gmail.com>
parents: 293
diff changeset
261 continue;
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
262
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
263 QRegExp regex (line.mid (colon + 1));
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
264 PrimitiveCategory::RegexEntry entry = { regex, type };
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
265 cat.regexes << entry;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
266 }
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
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
269 if (cat.regexes.size() > 0)
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
270 g_PrimitiveCategories << cat;
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
271 }
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 // Add a category for unmatched primitives
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
274 PrimitiveCategory cat;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
275 cat.setName (g_Other);
293
a0ed563e14b2 Added support for regex-based primitive categorization
Santeri Piippo <crimsondusk64@gmail.com>
parents: 292
diff changeset
276 g_PrimitiveCategories << cat;
306
fef00a6cbff0 minor improvements to primitive handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 297
diff changeset
277 }
fef00a6cbff0 minor improvements to primitive handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 297
diff changeset
278
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
279 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
280 bool primitiveLoaderBusy() {
306
fef00a6cbff0 minor improvements to primitive handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 297
diff changeset
281 return g_primListerMutex;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
282 }
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
283
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
284 // =============================================================================
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 static double radialPoint (int i, int divs, double (*func) (double)) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
288 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
289 }
75583c9f289d primitive generator: add conditional lines to cylinders; improved bad color handling
Santeri Piippo <crimsondusk64@gmail.com>
parents: 358
diff changeset
290
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
291 // =============================================================================
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 vector<LDObject*> makePrimitive (PrimitiveType type, int segs, int divs, int num) {
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
295 vector<LDObject*> objs;
365
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
296 vector<int> condLineSegs;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
297
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
298 for (int i = 0; i < segs; ++i) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
299 double x0 = radialPoint (i, divs, cos),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
300 x1 = radialPoint (i + 1, divs, cos),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
301 z0 = radialPoint (i, divs, sin),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
302 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
303
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
304 switch (type) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
305 case Circle: {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
306 vertex v0 (x0, 0.0f, z0),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
307 v1 (x1, 0.0f, z1);
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
308
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
309 LDLineObject* line = new LDLineObject;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
310 line->setVertex (0, v0);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
311 line->setVertex (1, v1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
312 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
313 objs << line;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
314 }
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
315 break;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
316
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
317 case Cylinder:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
318 case Ring:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
319 case Cone:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
320 {
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
321 double x2, x3, z2, z3;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
322 double y0, y1, y2, y3;
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
323
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
324 if (type == Cylinder) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
325 x2 = x1;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
326 x3 = x0;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
327 z2 = z1;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
328 z3 = z0;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
329
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
330 y0 = y1 = 0.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
331 y2 = y3 = 1.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
332 } else {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
333 x2 = x1 * (num + 1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
334 x3 = x0 * (num + 1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
335 z2 = z1 * (num + 1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
336 z3 = z0 * (num + 1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
337
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
338 x0 *= num;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
339 x1 *= num;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
340 z0 *= num;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
341 z1 *= num;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
342
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
343 if (type == Ring)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
344 y0 = y1 = y2 = y3 = 0.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
345 else {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
346 y0 = y1 = 1.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
347 y2 = y3 = 0.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
348 }
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
349 }
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
350
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
351 vertex v0 (x0, y0, z0),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
352 v1 (x1, y1, z1),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
353 v2 (x2, y2, z2),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
354 v3 (x3, y3, z3);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
355
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
356 LDQuadObject* quad = new LDQuadObject;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
357 quad->setColor (maincolor);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
358 quad->setVertex (0, v0);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
359 quad->setVertex (1, v1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
360 quad->setVertex (2, v2);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
361 quad->setVertex (3, v3);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
362
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
363 if (type == Cylinder)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
364 quad->invert();
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
365
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
366 objs << quad;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
367
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
368 if (type == Cylinder || type == Cone)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
369 condLineSegs << i;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
370 }
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
371 break;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
372
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
373 case Disc:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
374 case DiscNeg:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
375 {
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
376 double x2, z2;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
377
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
378 if (type == Disc)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
379 x2 = z2 = 0.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
380 else {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
381 x2 = (x0 >= 0.0f) ? 1.0f : -1.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
382 z2 = (z0 >= 0.0f) ? 1.0f : -1.0f;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
383 }
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
384
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
385 vertex v0 (x0, 0.0f, z0),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
386 v1 (x1, 0.0f, z1),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
387 v2 (x2, 0.0f, z2);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
388
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
389 // Disc negatives need to go the other way around, otherwise
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
390 // they'll end up upside-down.
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
391 LDTriangleObject* seg = new LDTriangleObject;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
392 seg->setColor (maincolor);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
393 seg->setVertex (type == Disc ? 0 : 2, v0);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
394 seg->setVertex (1, v1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
395 seg->setVertex (type == Disc ? 2 : 0, v2);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
396 objs << seg;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
397 }
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
398 break;
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
399
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
400 default:
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
401 break;
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
402 }
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
365
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
405 // 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
406 // end, too.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
407 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
408 condLineSegs << segs;
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
409
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
410 for (int i : condLineSegs) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
411 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
412 v1,
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
413 v2 (radialPoint (i + 1, divs, cos), 0.0f, radialPoint (i + 1, divs, sin)),
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
414 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
415
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
416 if (type == Cylinder)
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
417 v1 = vertex (v0[X], 1.0f, v0[Z]);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
418 elif (type == Cone) {
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
419 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
420 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
421 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
422 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
423 }
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
424
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
425 LDCondLineObject* line = new LDCondLineObject;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
426 line->setColor (edgecolor);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
427 line->setVertex (0, v0);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
428 line->setVertex (1, v1);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
429 line->setVertex (2, v2);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
430 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
431 objs << line;
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
432 }
b3f6c93db2e4 further work on primitive cond-lines. I think I got it now.
Santeri Piippo <crimsondusk64@gmail.com>
parents: 363
diff changeset
433
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
434 return objs;
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
435 }
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
436
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
437 // =============================================================================
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 static str primitiveTypeName (PrimitiveType type) {
321
48e429bfd58c Apply tr() for possible future translations
Santeri Piippo <crimsondusk64@gmail.com>
parents: 319
diff changeset
441 // 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
442 return type == Circle ? "Circle" :
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
443 type == Cylinder ? "Cylinder" :
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
444 type == Disc ? "Disc" :
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
445 type == DiscNeg ? "Disc Negative" :
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
446 type == Ring ? "Ring" : "Cone";
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
447 }
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
448
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
449 static const str g_radialNameRoots[] = {
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
450 "edge",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
451 "cyli",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
452 "disc",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
453 "ndis",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
454 "ring",
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
455 "con"
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
456 };
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 // =============================================================================
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
461 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
462 short numer = segs,
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
463 denom = divs;
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
464
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
465 // Simplify the fractional part, but the denominator must be at least 4.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
466 simplify (numer, denom);
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
467
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
468 if (denom < 4) {
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
469 const short factor = 4 / denom;
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
470
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
471 numer *= factor;
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
472 denom *= factor;
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
473 }
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 // Compose some general information: prefix, fraction, root, ring number
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
476 str prefix = (divs == lores) ? "" : fmt ("%1/", divs);
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
477 str frac = fmt ("%1-%2", numer, denom);
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
478 str root = g_radialNameRoots[type];
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
479 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
480
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
481 // 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
482 // However, always keep the root at least 2 characters.
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
483 int extra = (frac.length() + numstr.length() + root.length()) - 8;
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
484 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
485
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
486 // Stick them all together and return the result.
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
487 return prefix + frac + root + numstr + ".dat";
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
488 }
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
489
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
490 // =============================================================================
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 // =============================================================================
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
493 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
494 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
495 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
496 ui.setupUi (dlg);
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
497
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
498 if (!dlg->exec())
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
499 return;
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
500
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
501 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
502 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
503 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
504 PrimitiveType type =
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
505 ui.rb_circle->isChecked() ? Circle :
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
506 ui.rb_cylinder->isChecked() ? Cylinder :
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
507 ui.rb_disc->isChecked() ? Disc :
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
508 ui.rb_ndisc->isChecked() ? DiscNeg :
358
7885fa5b09c5 restyle..
Santeri Piippo <crimsondusk64@gmail.com>
parents: 321
diff changeset
509 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
510
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
511 // Make the description
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
512 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
513 str name = radialFileName (type, segs, divs, num);
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
514 str descr;
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
515
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
516 // 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
517 if (frac.indexOf (".") == -1)
311
c6e38e5e4f33 Further work on the primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 310
diff changeset
518 frac += ".0";
310
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
519
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
520 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
521 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
522 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
523 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
524
c62edce5668c Begin converting the radial type into a primitive generator
Santeri Piippo <crimsondusk64@gmail.com>
parents: 306
diff changeset
525 LDOpenFile* f = new LDOpenFile;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
526 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
527
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
528 *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
529 *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
530 *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
531 *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
532 *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
533 *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
534 *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
535 *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
536 *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
537
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
538 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
539 delete f;
398
7f278b48079a restyle
Santeri Piippo <crimsondusk64@gmail.com>
parents: 381
diff changeset
540 }

mercurial