summaryrefslogtreecommitdiff
path: root/import.cc
diff options
context:
space:
mode:
Diffstat (limited to 'import.cc')
-rw-r--r--import.cc88
1 files changed, 56 insertions, 32 deletions
diff --git a/import.cc b/import.cc
index c3af27e..3ec7056 100644
--- a/import.cc
+++ b/import.cc
@@ -75,45 +75,69 @@ PolySet *ImportNode::render_polyset(render_mode_e) const
PolySet *p = new PolySet();
p->convexity = convexity;
- QFile f(filename);
- if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) {
- PRINTF("WARNING: Can't open import file `%s'.", filename.toAscii().data());
- return p;
- }
-
if (type == TYPE_STL)
{
- int i = 0;
- double vdata[3][3];
- QRegExp splitre = QRegExp("\\s*(vertex)?\\s+");
- while (!f.atEnd())
+ QFile f(filename);
+ if (!f.open(QIODevice::ReadOnly)) {
+ PRINTF("WARNING: Can't open import file `%s'.", filename.toAscii().data());
+ return p;
+ }
+
+ QByteArray data = f.read(5);
+ if (data.size() == 5 && QString(data) == QString("solid"))
{
- QString line = QString(f.readLine()).remove("\n");
- if (line.contains("solid") || line.contains("facet") || line.contains("endloop"))
- continue;
- if (line.contains("outer loop")) {
- i = 0;
- continue;
- }
- if (line.contains("vertex")) {
- QStringList tokens = line.split(splitre);
- bool ok[3] = { false, false, false };
- if (tokens.size() == 4) {
- vdata[i][0] = tokens[1].toDouble(&ok[0]);
- vdata[i][1] = tokens[2].toDouble(&ok[1]);
- vdata[i][2] = tokens[3].toDouble(&ok[2]);
+ int i = 0;
+ double vdata[3][3];
+ QRegExp splitre = QRegExp("\\s*(vertex)?\\s+");
+ f.readLine();
+ while (!f.atEnd())
+ {
+ QString line = QString(f.readLine()).remove("\n").remove("\r");
+ if (line.contains("solid") || line.contains("facet") || line.contains("endloop"))
+ continue;
+ if (line.contains("outer loop")) {
+ i = 0;
+ continue;
}
- if (!ok[0] || !ok[1] || !ok[2]) {
- PRINTF("WARNING: Can't parse vertex line `%s'.", line.toAscii().data());
- i = 10;
- } else if (++i == 3) {
- p->append_poly();
- p->append_vertex(vdata[0][0], vdata[0][1], vdata[0][2]);
- p->append_vertex(vdata[1][0], vdata[1][1], vdata[1][2]);
- p->append_vertex(vdata[2][0], vdata[2][1], vdata[2][2]);
+ if (line.contains("vertex")) {
+ QStringList tokens = line.split(splitre);
+ bool ok[3] = { false, false, false };
+ if (tokens.size() == 4) {
+ vdata[i][0] = tokens[1].toDouble(&ok[0]);
+ vdata[i][1] = tokens[2].toDouble(&ok[1]);
+ vdata[i][2] = tokens[3].toDouble(&ok[2]);
+ }
+ if (!ok[0] || !ok[1] || !ok[2]) {
+ PRINTF("WARNING: Can't parse vertex line `%s'.", line.toAscii().data());
+ i = 10;
+ } else if (++i == 3) {
+ p->append_poly();
+ p->append_vertex(vdata[0][0], vdata[0][1], vdata[0][2]);
+ p->append_vertex(vdata[1][0], vdata[1][1], vdata[1][2]);
+ p->append_vertex(vdata[2][0], vdata[2][1], vdata[2][2]);
+ }
}
}
}
+ else
+ {
+ f.read(80-4+4);
+ while (1) {
+ struct {
+ float i, j, k;
+ float x1, y1, z1;
+ float x2, y2, z2;
+ float x3, y3, z3;
+ unsigned short acount;
+ } __attribute__ ((packed)) data;
+ if (f.read((char*)&data, sizeof(data)) != sizeof(data))
+ break;
+ p->append_poly();
+ p->append_vertex(data.x1, data.y1, data.z1);
+ p->append_vertex(data.x2, data.y2, data.z2);
+ p->append_vertex(data.x3, data.y3, data.z3);
+ }
+ }
}
if (type == TYPE_OFF)
contact: Jan Huwald // Impressum