#include <QVector3D>
#include <algorithm>
+#include <cmath>
#include "mesh.h"
+////////////////////////////////////////////////////////////////////////////////
+
+Mesh::Mesh(std::vector<GLfloat> v, std::vector<GLuint> i)
+ : vertices(v), indices(i)
+{
+ // Nothing to do here
+}
+
+float Mesh::min(size_t start) const
+{
+ float v = vertices[start];
+ for (size_t i=start; i < vertices.size(); i += 3)
+ {
+ v = fmin(v, vertices[i]);
+ }
+ return v;
+}
+
+float Mesh::max(size_t start) const
+{
+ float v = vertices[start];
+ for (size_t i=start; i < vertices.size(); i += 3)
+ {
+ v = fmax(v, vertices[i]);
+ }
+ return v;
+}
+////////////////////////////////////////////////////////////////////////////////
+
struct Vec3
{
GLfloat x, y, z;
}
};
+typedef std::pair<Vec3, GLuint> Vec3i;
-Mesh::Mesh(std::vector<GLfloat> v, std::vector<GLuint> i)
- : vertices(v), indices(i)
-{
- // Nothing to do here
-}
+////////////////////////////////////////////////////////////////////////////////
Mesh* Mesh::load_stl(const QString& filename)
{
data >> tri_count;
// Extract vertices into an array of xyz, unsigned pairs
- QVector<std::pair<Vec3, GLuint>> verts(tri_count*3);
+ QVector<Vec3i> verts(tri_count*3);
// Store vertices in the array, processing one triangle at a time.
for (auto v=verts.begin(); v != verts.end(); v += 3)
}
indices[v.second] = vertex_count - 1;
}
+ verts.resize(vertex_count);
- // Finally, pack unique vertices into a flat array.
- std::vector<GLfloat> unique_verts(vertex_count*3);
- for (size_t i=0; i < vertex_count; ++i)
+ std::vector<float> flat_verts;
+ flat_verts.reserve(vertex_count*3);
+ for (auto v : verts)
{
- unique_verts[3*i] = verts[i].first.x;
- unique_verts[3*i + 1] = verts[i].first.y;
- unique_verts[3*i + 2] = verts[i].first.z;
+ flat_verts.push_back(v.first.x);
+ flat_verts.push_back(v.first.y);
+ flat_verts.push_back(v.first.z);
}
- return new Mesh(unique_verts, indices);
+ return new Mesh(flat_verts, indices);
}
public:
Mesh(std::vector<GLfloat> vertices, std::vector<GLuint> indices);
static Mesh* load_stl(const QString& filename);
-/*
- float xmin() const { return vertices.row(0).minCoeff(); }
- float xmax() const { return vertices.row(0).maxCoeff(); }
- float ymin() const { return vertices.row(1).minCoeff(); }
- float ymax() const { return vertices.row(1).maxCoeff(); }
- float zmin() const { return vertices.row(2).minCoeff(); }
- float zmax() const { return vertices.row(2).maxCoeff(); }
-*/
+
+ float min(size_t start) const;
+ float max(size_t start) const;
+
+ float xmin() const { return min(0); }
+ float ymin() const { return min(1); }
+ float zmin() const { return min(2); }
+ float xmax() const { return max(0); }
+ float ymax() const { return max(1); }
+ float zmax() const { return max(2); }
+
private:
std::vector<GLfloat> vertices;
std::vector<GLuint> indices;